diff --git a/.gitattributes b/.gitattributes index d39ea83f0..ed8b01bc4 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,2 @@ src/Makefile export-subst +* -text diff --git a/BUILD.md b/BUILD.md index 333b8ec81..b552f48bc 100644 --- a/BUILD.md +++ b/BUILD.md @@ -3,7 +3,7 @@ hashcat build documentation ### Revision ### -* 1.5 +* 1.6 ### Author ### @@ -61,6 +61,10 @@ Otherwise: - Cached kernels go to: $HOME/.cache/hashcat - Potfiles go to: $HOME/.local/share/hashcat/ +### Building hashcat for Windows (using macOS) ### + +Refer to [BUILD_macOS.md](BUILD_macOS.md) + ### Building hashcat for Windows (using Windows Subsystem for Linux) ### Refer to [BUILD_WSL.md](BUILD_WSL.md) diff --git a/BUILD_macOS.md b/BUILD_macOS.md new file mode 100644 index 000000000..67d09a6bf --- /dev/null +++ b/BUILD_macOS.md @@ -0,0 +1,27 @@ +# Compiling hashcat for Windows with macOS. + +Tested on macOS 12.6.6 M1. + +Make sure to have the HomeBrew upgraded. + +### Installation ### + +``` +brew install mingw-w64 +git clone https://github.com/hashcat/hashcat +git clone https://github.com/win-iconv/win-iconv +cd win-iconv/ +patch < ../hashcat/tools/win-iconv-64.diff +sudo make install +cd ../ +``` + +### Building ### + +You've already cloned the latest master revision of hashcat repository above, so switch to the folder and type "make win" to start compiling hashcat +``` +cd hashcat/ +make win +``` + +The process may take a while, please be patient. diff --git a/OpenCL/inc_bignum_operations.cl b/OpenCL/inc_bignum_operations.cl index 8fedb292a..c10f17c76 100644 --- a/OpenCL/inc_bignum_operations.cl +++ b/OpenCL/inc_bignum_operations.cl @@ -1187,7 +1187,7 @@ DECLSPEC void mul_mod128 (PRIVATE_AS u32 *x, PRIVATE_AS const u32 *y, PRIVATE_AS t[62] += t[61] < p[125]; t[63] += t[62] < p[126]; - // VERY IMPORTANT: if we have an overflow at the highest u32, we need to do the substraction + // VERY IMPORTANT: if we have an overflow at the highest u32, we need to do the subtraction const u32 c = t[63] < p[127]; // carry / overflow diff --git a/OpenCL/inc_cipher_aes-gcm.cl b/OpenCL/inc_cipher_aes-gcm.cl index b882095c8..b330f02a8 100644 --- a/OpenCL/inc_cipher_aes-gcm.cl +++ b/OpenCL/inc_cipher_aes-gcm.cl @@ -304,8 +304,11 @@ DECLSPEC void AES_GCM_GHASH_GLOBAL (PRIVATE_AS const u32 *subkey, PRIVATE_AS con AES_GCM_ghash (subkey, len_buf, 16, out); } -void AES_GCM_decrypt (PRIVATE_AS u32 *key, PRIVATE_AS u32 *J0, PRIVATE_AS const u32 *in, int in_len, PRIVATE_AS u32 *out, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) +DECLSPEC void AES_GCM_decrypt (PRIVATE_AS u32 *key, PRIVATE_AS u32 *J0, PRIVATE_AS const u32 *in, int in_len, PRIVATE_AS u32 *out, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) { - AES_GCM_inc32(J0); // the first ctr is used to compute the tag, only the second is used for decryption: https://en.wikipedia.org/wiki/Galois/Counter_Mode#/media/File:GCM-Galois_Counter_Mode_with_IV.svg - AES_GCM_GCTR (key, J0, in, in_len, out, s_te0, s_te1, s_te2, s_te3, s_te4); // decrypt the first block of ciphertext -} \ No newline at end of file + // the first ctr is used to compute the tag, only the second is used for decryption: https://en.wikipedia.org/wiki/Galois/Counter_Mode#/media/File:GCM-Galois_Counter_Mode_with_IV.svg + AES_GCM_inc32 (J0); + + // decrypt the first block of ciphertext + AES_GCM_GCTR (key, J0, in, in_len, out, s_te0, s_te1, s_te2, s_te3, s_te4); +} diff --git a/OpenCL/inc_cipher_aes.cl b/OpenCL/inc_cipher_aes.cl index c1a10e09d..b959c3697 100644 --- a/OpenCL/inc_cipher_aes.cl +++ b/OpenCL/inc_cipher_aes.cl @@ -691,7 +691,7 @@ CONSTANT_VK u32a td4[256] = // 128 bit key -DECLSPEC void aes128_ExpandKey (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3) +DECLSPEC void aes128_ExpandKey (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 *ukey, SHM_TYPE const u32 *s_te0, SHM_TYPE const u32 *s_te1, SHM_TYPE const u32 *s_te2, SHM_TYPE const u32 *s_te3) { ks[ 0] = ukey[0]; ks[ 1] = ukey[1]; @@ -779,7 +779,7 @@ DECLSPEC void aes128_ExpandKey (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 *ukey, ks[43] = ks[39] ^ ks[42]; } -DECLSPEC void aes128_InvertKey (PRIVATE_AS u32 *ks, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3) +DECLSPEC void aes128_InvertKey (PRIVATE_AS u32 *ks, SHM_TYPE const u32 *s_te1, SHM_TYPE const u32 *s_td0, SHM_TYPE const u32 *s_td1, SHM_TYPE const u32 *s_td2, SHM_TYPE const u32 *s_td3) { u32 temp; @@ -868,7 +868,7 @@ DECLSPEC void aes128_set_decrypt_key (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 * aes128_InvertKey (ks, s_te1, s_td0, s_td1, s_td2, s_td3); } -DECLSPEC void aes128_encrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) +DECLSPEC void aes128_encrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE const u32 *s_te0, SHM_TYPE const u32 *s_te1, SHM_TYPE const u32 *s_te2, SHM_TYPE const u32 *s_te3, SHM_TYPE const u32 *s_te4) { u32 in_s[4]; @@ -954,7 +954,7 @@ DECLSPEC void aes128_encrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in out[3] = hc_swap32_S (out[3]); } -DECLSPEC void aes128_decrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) +DECLSPEC void aes128_decrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE const u32 *s_td0, SHM_TYPE const u32 *s_td1, SHM_TYPE const u32 *s_td2, SHM_TYPE const u32 *s_td3, SHM_TYPE const u32 *s_td4) { u32 in_s[4]; @@ -1042,7 +1042,7 @@ DECLSPEC void aes128_decrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in // 192 bit key -DECLSPEC void aes192_ExpandKey (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3) +DECLSPEC void aes192_ExpandKey (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 *ukey, SHM_TYPE const u32 *s_te0, SHM_TYPE const u32 *s_te1, SHM_TYPE const u32 *s_te2, SHM_TYPE const u32 *s_te3) { ks[ 0] = ukey[0]; ks[ 1] = ukey[1]; @@ -1130,7 +1130,7 @@ DECLSPEC void aes192_ExpandKey (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 *ukey, ks[51] = ks[45] ^ ks[50]; } -DECLSPEC void aes192_InvertKey (PRIVATE_AS u32 *ks, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3) +DECLSPEC void aes192_InvertKey (PRIVATE_AS u32 *ks, SHM_TYPE const u32 *s_te1, SHM_TYPE const u32 *s_td0, SHM_TYPE const u32 *s_td1, SHM_TYPE const u32 *s_td2, SHM_TYPE const u32 *s_td3) { u32 temp; @@ -1235,7 +1235,7 @@ DECLSPEC void aes192_set_decrypt_key (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 * aes192_InvertKey (ks, s_te1, s_td0, s_td1, s_td2, s_td3); } -DECLSPEC void aes192_encrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) +DECLSPEC void aes192_encrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE const u32 *s_te0, SHM_TYPE const u32 *s_te1, SHM_TYPE const u32 *s_te2, SHM_TYPE const u32 *s_te3, SHM_TYPE const u32 *s_te4) { u32 in_s[4]; @@ -1329,7 +1329,7 @@ DECLSPEC void aes192_encrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in out[3] = hc_swap32_S (out[3]); } -DECLSPEC void aes192_decrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) +DECLSPEC void aes192_decrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE const u32 *s_td0, SHM_TYPE const u32 *s_td1, SHM_TYPE const u32 *s_td2, SHM_TYPE const u32 *s_td3, SHM_TYPE const u32 *s_td4) { u32 in_s[4]; @@ -1425,7 +1425,7 @@ DECLSPEC void aes192_decrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in // 256 bit key -DECLSPEC void aes256_ExpandKey (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3) +DECLSPEC void aes256_ExpandKey (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 *ukey, SHM_TYPE const u32 *s_te0, SHM_TYPE const u32 *s_te1, SHM_TYPE const u32 *s_te2, SHM_TYPE const u32 *s_te3) { ks[ 0] = ukey[0]; ks[ 1] = ukey[1]; @@ -1541,7 +1541,7 @@ DECLSPEC void aes256_ExpandKey (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 *ukey, ks[59] = ks[51] ^ ks[58]; } -DECLSPEC void aes256_InvertKey (PRIVATE_AS u32 *ks, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3) +DECLSPEC void aes256_InvertKey (PRIVATE_AS u32 *ks, SHM_TYPE const u32 *s_te1, SHM_TYPE const u32 *s_td0, SHM_TYPE const u32 *s_td1, SHM_TYPE const u32 *s_td2, SHM_TYPE const u32 *s_td3) { u32 temp; @@ -1662,7 +1662,7 @@ DECLSPEC void aes256_set_decrypt_key (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 * aes256_InvertKey (ks, s_te1, s_td0, s_td1, s_td2, s_td3); } -DECLSPEC void aes256_encrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) +DECLSPEC void aes256_encrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE const u32 *s_te0, SHM_TYPE const u32 *s_te1, SHM_TYPE const u32 *s_te2, SHM_TYPE const u32 *s_te3, SHM_TYPE const u32 *s_te4) { u32 in_s[4]; @@ -1764,7 +1764,7 @@ DECLSPEC void aes256_encrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in out[3] = hc_swap32_S (out[3]); } -DECLSPEC void aes256_decrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) +DECLSPEC void aes256_decrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE const u32 *s_td0, SHM_TYPE const u32 *s_td1, SHM_TYPE const u32 *s_td2, SHM_TYPE const u32 *s_td3, SHM_TYPE const u32 *s_td4) { u32 in_s[4]; diff --git a/OpenCL/inc_cipher_aes.h b/OpenCL/inc_cipher_aes.h index 5d42e58f9..416d0d899 100644 --- a/OpenCL/inc_cipher_aes.h +++ b/OpenCL/inc_cipher_aes.h @@ -6,24 +6,24 @@ #ifndef INC_CIPHER_AES_H #define INC_CIPHER_AES_H -DECLSPEC void aes128_ExpandKey (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3); -DECLSPEC void aes128_InvertKey (PRIVATE_AS u32 *ks, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3); +DECLSPEC void aes128_ExpandKey (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 *ukey, SHM_TYPE const u32 *s_te0, SHM_TYPE const u32 *s_te1, SHM_TYPE const u32 *s_te2, SHM_TYPE const u32 *s_te3); +DECLSPEC void aes128_InvertKey (PRIVATE_AS u32 *ks, SHM_TYPE const u32 *s_te1, SHM_TYPE const u32 *s_td0, SHM_TYPE const u32 *s_td1, SHM_TYPE const u32 *s_td2, SHM_TYPE const u32 *s_td3); DECLSPEC void aes128_set_encrypt_key (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3); DECLSPEC void aes128_set_decrypt_key (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3); -DECLSPEC void aes128_encrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4); -DECLSPEC void aes128_decrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4); -DECLSPEC void aes192_ExpandKey (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3); -DECLSPEC void aes192_InvertKey (PRIVATE_AS u32 *ks, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3); +DECLSPEC void aes128_encrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE const u32 *s_te0, SHM_TYPE const u32 *s_te1, SHM_TYPE const u32 *s_te2, SHM_TYPE const u32 *s_te3, SHM_TYPE const u32 *s_te4); +DECLSPEC void aes128_decrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE const u32 *s_td0, SHM_TYPE const u32 *s_td1, SHM_TYPE const u32 *s_td2, SHM_TYPE const u32 *s_td3, SHM_TYPE const u32 *s_td4); +DECLSPEC void aes192_ExpandKey (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 *ukey, SHM_TYPE const u32 *s_te0, SHM_TYPE const u32 *s_te1, SHM_TYPE const u32 *s_te2, SHM_TYPE const u32 *s_te3); +DECLSPEC void aes192_InvertKey (PRIVATE_AS u32 *ks, SHM_TYPE const u32 *s_te1, SHM_TYPE const u32 *s_td0, SHM_TYPE const u32 *s_td1, SHM_TYPE const u32 *s_td2, SHM_TYPE const u32 *s_td3); DECLSPEC void aes192_set_encrypt_key (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3); DECLSPEC void aes192_set_decrypt_key (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3); -DECLSPEC void aes192_encrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4); -DECLSPEC void aes192_decrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4); -DECLSPEC void aes256_ExpandKey (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3); -DECLSPEC void aes256_InvertKey (PRIVATE_AS u32 *ks, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3); +DECLSPEC void aes192_encrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE const u32 *s_te0, SHM_TYPE const u32 *s_te1, SHM_TYPE const u32 *s_te2, SHM_TYPE const u32 *s_te3, SHM_TYPE const u32 *s_te4); +DECLSPEC void aes192_decrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE const u32 *s_td0, SHM_TYPE const u32 *s_td1, SHM_TYPE const u32 *s_td2, SHM_TYPE const u32 *s_td3, SHM_TYPE const u32 *s_td4); +DECLSPEC void aes256_ExpandKey (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 *ukey, SHM_TYPE const u32 *s_te0, SHM_TYPE const u32 *s_te1, SHM_TYPE const u32 *s_te2, SHM_TYPE const u32 *s_te3); +DECLSPEC void aes256_InvertKey (PRIVATE_AS u32 *ks, SHM_TYPE const u32 *s_te1, SHM_TYPE const u32 *s_td0, SHM_TYPE const u32 *s_td1, SHM_TYPE const u32 *s_td2, SHM_TYPE const u32 *s_td3); DECLSPEC void aes256_set_encrypt_key (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3); DECLSPEC void aes256_set_decrypt_key (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3); -DECLSPEC void aes256_encrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4); -DECLSPEC void aes256_decrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4); +DECLSPEC void aes256_encrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE const u32 *s_te0, SHM_TYPE const u32 *s_te1, SHM_TYPE const u32 *s_te2, SHM_TYPE const u32 *s_te3, SHM_TYPE const u32 *s_te4); +DECLSPEC void aes256_decrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE const u32 *s_td0, SHM_TYPE const u32 *s_td1, SHM_TYPE const u32 *s_td2, SHM_TYPE const u32 *s_td3, SHM_TYPE const u32 *s_td4); DECLSPEC void AES128_set_encrypt_key (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3); DECLSPEC void AES128_set_decrypt_key (PRIVATE_AS u32 *ks, PRIVATE_AS const u32 *ukey, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3); DECLSPEC void AES128_encrypt (PRIVATE_AS const u32 *ks, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4); diff --git a/OpenCL/inc_cipher_cast.cl b/OpenCL/inc_cipher_cast.cl new file mode 100644 index 000000000..e2c5a6fb1 --- /dev/null +++ b/OpenCL/inc_cipher_cast.cl @@ -0,0 +1,683 @@ +/* + * CAST OpenCL + * + * Copyright (c) 2018, magnum. + * This software is hereby released to the general public under + * the following terms: Redistribution and use in source and binary + * forms, with or without modification, are permitted. + * + * Based on version in Truecrypt 7.1a sources + * Based on cast.cpp - written and placed in the public domain by + * Wei Dai and Leonard Janke + * Based on Steve Reid's public domain cast.c + * + * atom - changed S boxes from constant mem to shared mem and some + * other fitting to match hashcat source structures + */ + +#include "inc_vendor.h" +#include "inc_types.h" +#include "inc_platform.h" +#include "inc_common.h" +#include "inc_cipher_cast.h" + +/* CAST S-boxes */ +CONSTANT_VK u32 S[8][256] = +{ + { + 0x30FB40D4UL, 0x9FA0FF0BUL, 0x6BECCD2FUL, 0x3F258C7AUL, + 0x1E213F2FUL, 0x9C004DD3UL, 0x6003E540UL, 0xCF9FC949UL, + 0xBFD4AF27UL, 0x88BBBDB5UL, 0xE2034090UL, 0x98D09675UL, + 0x6E63A0E0UL, 0x15C361D2UL, 0xC2E7661DUL, 0x22D4FF8EUL, + 0x28683B6FUL, 0xC07FD059UL, 0xFF2379C8UL, 0x775F50E2UL, + 0x43C340D3UL, 0xDF2F8656UL, 0x887CA41AUL, 0xA2D2BD2DUL, + 0xA1C9E0D6UL, 0x346C4819UL, 0x61B76D87UL, 0x22540F2FUL, + 0x2ABE32E1UL, 0xAA54166BUL, 0x22568E3AUL, 0xA2D341D0UL, + 0x66DB40C8UL, 0xA784392FUL, 0x004DFF2FUL, 0x2DB9D2DEUL, + 0x97943FACUL, 0x4A97C1D8UL, 0x527644B7UL, 0xB5F437A7UL, + 0xB82CBAEFUL, 0xD751D159UL, 0x6FF7F0EDUL, 0x5A097A1FUL, + 0x827B68D0UL, 0x90ECF52EUL, 0x22B0C054UL, 0xBC8E5935UL, + 0x4B6D2F7FUL, 0x50BB64A2UL, 0xD2664910UL, 0xBEE5812DUL, + 0xB7332290UL, 0xE93B159FUL, 0xB48EE411UL, 0x4BFF345DUL, + 0xFD45C240UL, 0xAD31973FUL, 0xC4F6D02EUL, 0x55FC8165UL, + 0xD5B1CAADUL, 0xA1AC2DAEUL, 0xA2D4B76DUL, 0xC19B0C50UL, + 0x882240F2UL, 0x0C6E4F38UL, 0xA4E4BFD7UL, 0x4F5BA272UL, + 0x564C1D2FUL, 0xC59C5319UL, 0xB949E354UL, 0xB04669FEUL, + 0xB1B6AB8AUL, 0xC71358DDUL, 0x6385C545UL, 0x110F935DUL, + 0x57538AD5UL, 0x6A390493UL, 0xE63D37E0UL, 0x2A54F6B3UL, + 0x3A787D5FUL, 0x6276A0B5UL, 0x19A6FCDFUL, 0x7A42206AUL, + 0x29F9D4D5UL, 0xF61B1891UL, 0xBB72275EUL, 0xAA508167UL, + 0x38901091UL, 0xC6B505EBUL, 0x84C7CB8CUL, 0x2AD75A0FUL, + 0x874A1427UL, 0xA2D1936BUL, 0x2AD286AFUL, 0xAA56D291UL, + 0xD7894360UL, 0x425C750DUL, 0x93B39E26UL, 0x187184C9UL, + 0x6C00B32DUL, 0x73E2BB14UL, 0xA0BEBC3CUL, 0x54623779UL, + 0x64459EABUL, 0x3F328B82UL, 0x7718CF82UL, 0x59A2CEA6UL, + 0x04EE002EUL, 0x89FE78E6UL, 0x3FAB0950UL, 0x325FF6C2UL, + 0x81383F05UL, 0x6963C5C8UL, 0x76CB5AD6UL, 0xD49974C9UL, + 0xCA180DCFUL, 0x380782D5UL, 0xC7FA5CF6UL, 0x8AC31511UL, + 0x35E79E13UL, 0x47DA91D0UL, 0xF40F9086UL, 0xA7E2419EUL, + 0x31366241UL, 0x051EF495UL, 0xAA573B04UL, 0x4A805D8DUL, + 0x548300D0UL, 0x00322A3CUL, 0xBF64CDDFUL, 0xBA57A68EUL, + 0x75C6372BUL, 0x50AFD341UL, 0xA7C13275UL, 0x915A0BF5UL, + 0x6B54BFABUL, 0x2B0B1426UL, 0xAB4CC9D7UL, 0x449CCD82UL, + 0xF7FBF265UL, 0xAB85C5F3UL, 0x1B55DB94UL, 0xAAD4E324UL, + 0xCFA4BD3FUL, 0x2DEAA3E2UL, 0x9E204D02UL, 0xC8BD25ACUL, + 0xEADF55B3UL, 0xD5BD9E98UL, 0xE31231B2UL, 0x2AD5AD6CUL, + 0x954329DEUL, 0xADBE4528UL, 0xD8710F69UL, 0xAA51C90FUL, + 0xAA786BF6UL, 0x22513F1EUL, 0xAA51A79BUL, 0x2AD344CCUL, + 0x7B5A41F0UL, 0xD37CFBADUL, 0x1B069505UL, 0x41ECE491UL, + 0xB4C332E6UL, 0x032268D4UL, 0xC9600ACCUL, 0xCE387E6DUL, + 0xBF6BB16CUL, 0x6A70FB78UL, 0x0D03D9C9UL, 0xD4DF39DEUL, + 0xE01063DAUL, 0x4736F464UL, 0x5AD328D8UL, 0xB347CC96UL, + 0x75BB0FC3UL, 0x98511BFBUL, 0x4FFBCC35UL, 0xB58BCF6AUL, + 0xE11F0ABCUL, 0xBFC5FE4AUL, 0xA70AEC10UL, 0xAC39570AUL, + 0x3F04442FUL, 0x6188B153UL, 0xE0397A2EUL, 0x5727CB79UL, + 0x9CEB418FUL, 0x1CACD68DUL, 0x2AD37C96UL, 0x0175CB9DUL, + 0xC69DFF09UL, 0xC75B65F0UL, 0xD9DB40D8UL, 0xEC0E7779UL, + 0x4744EAD4UL, 0xB11C3274UL, 0xDD24CB9EUL, 0x7E1C54BDUL, + 0xF01144F9UL, 0xD2240EB1UL, 0x9675B3FDUL, 0xA3AC3755UL, + 0xD47C27AFUL, 0x51C85F4DUL, 0x56907596UL, 0xA5BB15E6UL, + 0x580304F0UL, 0xCA042CF1UL, 0x011A37EAUL, 0x8DBFAADBUL, + 0x35BA3E4AUL, 0x3526FFA0UL, 0xC37B4D09UL, 0xBC306ED9UL, + 0x98A52666UL, 0x5648F725UL, 0xFF5E569DUL, 0x0CED63D0UL, + 0x7C63B2CFUL, 0x700B45E1UL, 0xD5EA50F1UL, 0x85A92872UL, + 0xAF1FBDA7UL, 0xD4234870UL, 0xA7870BF3UL, 0x2D3B4D79UL, + 0x42E04198UL, 0x0CD0EDE7UL, 0x26470DB8UL, 0xF881814CUL, + 0x474D6AD7UL, 0x7C0C5E5CUL, 0xD1231959UL, 0x381B7298UL, + 0xF5D2F4DBUL, 0xAB838653UL, 0x6E2F1E23UL, 0x83719C9EUL, + 0xBD91E046UL, 0x9A56456EUL, 0xDC39200CUL, 0x20C8C571UL, + 0x962BDA1CUL, 0xE1E696FFUL, 0xB141AB08UL, 0x7CCA89B9UL, + 0x1A69E783UL, 0x02CC4843UL, 0xA2F7C579UL, 0x429EF47DUL, + 0x427B169CUL, 0x5AC9F049UL, 0xDD8F0F00UL, 0x5C8165BFUL + }, + + { + 0x1F201094UL, 0xEF0BA75BUL, 0x69E3CF7EUL, 0x393F4380UL, + 0xFE61CF7AUL, 0xEEC5207AUL, 0x55889C94UL, 0x72FC0651UL, + 0xADA7EF79UL, 0x4E1D7235UL, 0xD55A63CEUL, 0xDE0436BAUL, + 0x99C430EFUL, 0x5F0C0794UL, 0x18DCDB7DUL, 0xA1D6EFF3UL, + 0xA0B52F7BUL, 0x59E83605UL, 0xEE15B094UL, 0xE9FFD909UL, + 0xDC440086UL, 0xEF944459UL, 0xBA83CCB3UL, 0xE0C3CDFBUL, + 0xD1DA4181UL, 0x3B092AB1UL, 0xF997F1C1UL, 0xA5E6CF7BUL, + 0x01420DDBUL, 0xE4E7EF5BUL, 0x25A1FF41UL, 0xE180F806UL, + 0x1FC41080UL, 0x179BEE7AUL, 0xD37AC6A9UL, 0xFE5830A4UL, + 0x98DE8B7FUL, 0x77E83F4EUL, 0x79929269UL, 0x24FA9F7BUL, + 0xE113C85BUL, 0xACC40083UL, 0xD7503525UL, 0xF7EA615FUL, + 0x62143154UL, 0x0D554B63UL, 0x5D681121UL, 0xC866C359UL, + 0x3D63CF73UL, 0xCEE234C0UL, 0xD4D87E87UL, 0x5C672B21UL, + 0x071F6181UL, 0x39F7627FUL, 0x361E3084UL, 0xE4EB573BUL, + 0x602F64A4UL, 0xD63ACD9CUL, 0x1BBC4635UL, 0x9E81032DUL, + 0x2701F50CUL, 0x99847AB4UL, 0xA0E3DF79UL, 0xBA6CF38CUL, + 0x10843094UL, 0x2537A95EUL, 0xF46F6FFEUL, 0xA1FF3B1FUL, + 0x208CFB6AUL, 0x8F458C74UL, 0xD9E0A227UL, 0x4EC73A34UL, + 0xFC884F69UL, 0x3E4DE8DFUL, 0xEF0E0088UL, 0x3559648DUL, + 0x8A45388CUL, 0x1D804366UL, 0x721D9BFDUL, 0xA58684BBUL, + 0xE8256333UL, 0x844E8212UL, 0x128D8098UL, 0xFED33FB4UL, + 0xCE280AE1UL, 0x27E19BA5UL, 0xD5A6C252UL, 0xE49754BDUL, + 0xC5D655DDUL, 0xEB667064UL, 0x77840B4DUL, 0xA1B6A801UL, + 0x84DB26A9UL, 0xE0B56714UL, 0x21F043B7UL, 0xE5D05860UL, + 0x54F03084UL, 0x066FF472UL, 0xA31AA153UL, 0xDADC4755UL, + 0xB5625DBFUL, 0x68561BE6UL, 0x83CA6B94UL, 0x2D6ED23BUL, + 0xECCF01DBUL, 0xA6D3D0BAUL, 0xB6803D5CUL, 0xAF77A709UL, + 0x33B4A34CUL, 0x397BC8D6UL, 0x5EE22B95UL, 0x5F0E5304UL, + 0x81ED6F61UL, 0x20E74364UL, 0xB45E1378UL, 0xDE18639BUL, + 0x881CA122UL, 0xB96726D1UL, 0x8049A7E8UL, 0x22B7DA7BUL, + 0x5E552D25UL, 0x5272D237UL, 0x79D2951CUL, 0xC60D894CUL, + 0x488CB402UL, 0x1BA4FE5BUL, 0xA4B09F6BUL, 0x1CA815CFUL, + 0xA20C3005UL, 0x8871DF63UL, 0xB9DE2FCBUL, 0x0CC6C9E9UL, + 0x0BEEFF53UL, 0xE3214517UL, 0xB4542835UL, 0x9F63293CUL, + 0xEE41E729UL, 0x6E1D2D7CUL, 0x50045286UL, 0x1E6685F3UL, + 0xF33401C6UL, 0x30A22C95UL, 0x31A70850UL, 0x60930F13UL, + 0x73F98417UL, 0xA1269859UL, 0xEC645C44UL, 0x52C877A9UL, + 0xCDFF33A6UL, 0xA02B1741UL, 0x7CBAD9A2UL, 0x2180036FUL, + 0x50D99C08UL, 0xCB3F4861UL, 0xC26BD765UL, 0x64A3F6ABUL, + 0x80342676UL, 0x25A75E7BUL, 0xE4E6D1FCUL, 0x20C710E6UL, + 0xCDF0B680UL, 0x17844D3BUL, 0x31EEF84DUL, 0x7E0824E4UL, + 0x2CCB49EBUL, 0x846A3BAEUL, 0x8FF77888UL, 0xEE5D60F6UL, + 0x7AF75673UL, 0x2FDD5CDBUL, 0xA11631C1UL, 0x30F66F43UL, + 0xB3FAEC54UL, 0x157FD7FAUL, 0xEF8579CCUL, 0xD152DE58UL, + 0xDB2FFD5EUL, 0x8F32CE19UL, 0x306AF97AUL, 0x02F03EF8UL, + 0x99319AD5UL, 0xC242FA0FUL, 0xA7E3EBB0UL, 0xC68E4906UL, + 0xB8DA230CUL, 0x80823028UL, 0xDCDEF3C8UL, 0xD35FB171UL, + 0x088A1BC8UL, 0xBEC0C560UL, 0x61A3C9E8UL, 0xBCA8F54DUL, + 0xC72FEFFAUL, 0x22822E99UL, 0x82C570B4UL, 0xD8D94E89UL, + 0x8B1C34BCUL, 0x301E16E6UL, 0x273BE979UL, 0xB0FFEAA6UL, + 0x61D9B8C6UL, 0x00B24869UL, 0xB7FFCE3FUL, 0x08DC283BUL, + 0x43DAF65AUL, 0xF7E19798UL, 0x7619B72FUL, 0x8F1C9BA4UL, + 0xDC8637A0UL, 0x16A7D3B1UL, 0x9FC393B7UL, 0xA7136EEBUL, + 0xC6BCC63EUL, 0x1A513742UL, 0xEF6828BCUL, 0x520365D6UL, + 0x2D6A77ABUL, 0x3527ED4BUL, 0x821FD216UL, 0x095C6E2EUL, + 0xDB92F2FBUL, 0x5EEA29CBUL, 0x145892F5UL, 0x91584F7FUL, + 0x5483697BUL, 0x2667A8CCUL, 0x85196048UL, 0x8C4BACEAUL, + 0x833860D4UL, 0x0D23E0F9UL, 0x6C387E8AUL, 0x0AE6D249UL, + 0xB284600CUL, 0xD835731DUL, 0xDCB1C647UL, 0xAC4C56EAUL, + 0x3EBD81B3UL, 0x230EABB0UL, 0x6438BC87UL, 0xF0B5B1FAUL, + 0x8F5EA2B3UL, 0xFC184642UL, 0x0A036B7AUL, 0x4FB089BDUL, + 0x649DA589UL, 0xA345415EUL, 0x5C038323UL, 0x3E5D3BB9UL, + 0x43D79572UL, 0x7E6DD07CUL, 0x06DFDF1EUL, 0x6C6CC4EFUL, + 0x7160A539UL, 0x73BFBE70UL, 0x83877605UL, 0x4523ECF1UL + }, + + { + 0x8DEFC240UL, 0x25FA5D9FUL, 0xEB903DBFUL, 0xE810C907UL, + 0x47607FFFUL, 0x369FE44BUL, 0x8C1FC644UL, 0xAECECA90UL, + 0xBEB1F9BFUL, 0xEEFBCAEAUL, 0xE8CF1950UL, 0x51DF07AEUL, + 0x920E8806UL, 0xF0AD0548UL, 0xE13C8D83UL, 0x927010D5UL, + 0x11107D9FUL, 0x07647DB9UL, 0xB2E3E4D4UL, 0x3D4F285EUL, + 0xB9AFA820UL, 0xFADE82E0UL, 0xA067268BUL, 0x8272792EUL, + 0x553FB2C0UL, 0x489AE22BUL, 0xD4EF9794UL, 0x125E3FBCUL, + 0x21FFFCEEUL, 0x825B1BFDUL, 0x9255C5EDUL, 0x1257A240UL, + 0x4E1A8302UL, 0xBAE07FFFUL, 0x528246E7UL, 0x8E57140EUL, + 0x3373F7BFUL, 0x8C9F8188UL, 0xA6FC4EE8UL, 0xC982B5A5UL, + 0xA8C01DB7UL, 0x579FC264UL, 0x67094F31UL, 0xF2BD3F5FUL, + 0x40FFF7C1UL, 0x1FB78DFCUL, 0x8E6BD2C1UL, 0x437BE59BUL, + 0x99B03DBFUL, 0xB5DBC64BUL, 0x638DC0E6UL, 0x55819D99UL, + 0xA197C81CUL, 0x4A012D6EUL, 0xC5884A28UL, 0xCCC36F71UL, + 0xB843C213UL, 0x6C0743F1UL, 0x8309893CUL, 0x0FEDDD5FUL, + 0x2F7FE850UL, 0xD7C07F7EUL, 0x02507FBFUL, 0x5AFB9A04UL, + 0xA747D2D0UL, 0x1651192EUL, 0xAF70BF3EUL, 0x58C31380UL, + 0x5F98302EUL, 0x727CC3C4UL, 0x0A0FB402UL, 0x0F7FEF82UL, + 0x8C96FDADUL, 0x5D2C2AAEUL, 0x8EE99A49UL, 0x50DA88B8UL, + 0x8427F4A0UL, 0x1EAC5790UL, 0x796FB449UL, 0x8252DC15UL, + 0xEFBD7D9BUL, 0xA672597DUL, 0xADA840D8UL, 0x45F54504UL, + 0xFA5D7403UL, 0xE83EC305UL, 0x4F91751AUL, 0x925669C2UL, + 0x23EFE941UL, 0xA903F12EUL, 0x60270DF2UL, 0x0276E4B6UL, + 0x94FD6574UL, 0x927985B2UL, 0x8276DBCBUL, 0x02778176UL, + 0xF8AF918DUL, 0x4E48F79EUL, 0x8F616DDFUL, 0xE29D840EUL, + 0x842F7D83UL, 0x340CE5C8UL, 0x96BBB682UL, 0x93B4B148UL, + 0xEF303CABUL, 0x984FAF28UL, 0x779FAF9BUL, 0x92DC560DUL, + 0x224D1E20UL, 0x8437AA88UL, 0x7D29DC96UL, 0x2756D3DCUL, + 0x8B907CEEUL, 0xB51FD240UL, 0xE7C07CE3UL, 0xE566B4A1UL, + 0xC3E9615EUL, 0x3CF8209DUL, 0x6094D1E3UL, 0xCD9CA341UL, + 0x5C76460EUL, 0x00EA983BUL, 0xD4D67881UL, 0xFD47572CUL, + 0xF76CEDD9UL, 0xBDA8229CUL, 0x127DADAAUL, 0x438A074EUL, + 0x1F97C090UL, 0x081BDB8AUL, 0x93A07EBEUL, 0xB938CA15UL, + 0x97B03CFFUL, 0x3DC2C0F8UL, 0x8D1AB2ECUL, 0x64380E51UL, + 0x68CC7BFBUL, 0xD90F2788UL, 0x12490181UL, 0x5DE5FFD4UL, + 0xDD7EF86AUL, 0x76A2E214UL, 0xB9A40368UL, 0x925D958FUL, + 0x4B39FFFAUL, 0xBA39AEE9UL, 0xA4FFD30BUL, 0xFAF7933BUL, + 0x6D498623UL, 0x193CBCFAUL, 0x27627545UL, 0x825CF47AUL, + 0x61BD8BA0UL, 0xD11E42D1UL, 0xCEAD04F4UL, 0x127EA392UL, + 0x10428DB7UL, 0x8272A972UL, 0x9270C4A8UL, 0x127DE50BUL, + 0x285BA1C8UL, 0x3C62F44FUL, 0x35C0EAA5UL, 0xE805D231UL, + 0x428929FBUL, 0xB4FCDF82UL, 0x4FB66A53UL, 0x0E7DC15BUL, + 0x1F081FABUL, 0x108618AEUL, 0xFCFD086DUL, 0xF9FF2889UL, + 0x694BCC11UL, 0x236A5CAEUL, 0x12DECA4DUL, 0x2C3F8CC5UL, + 0xD2D02DFEUL, 0xF8EF5896UL, 0xE4CF52DAUL, 0x95155B67UL, + 0x494A488CUL, 0xB9B6A80CUL, 0x5C8F82BCUL, 0x89D36B45UL, + 0x3A609437UL, 0xEC00C9A9UL, 0x44715253UL, 0x0A874B49UL, + 0xD773BC40UL, 0x7C34671CUL, 0x02717EF6UL, 0x4FEB5536UL, + 0xA2D02FFFUL, 0xD2BF60C4UL, 0xD43F03C0UL, 0x50B4EF6DUL, + 0x07478CD1UL, 0x006E1888UL, 0xA2E53F55UL, 0xB9E6D4BCUL, + 0xA2048016UL, 0x97573833UL, 0xD7207D67UL, 0xDE0F8F3DUL, + 0x72F87B33UL, 0xABCC4F33UL, 0x7688C55DUL, 0x7B00A6B0UL, + 0x947B0001UL, 0x570075D2UL, 0xF9BB88F8UL, 0x8942019EUL, + 0x4264A5FFUL, 0x856302E0UL, 0x72DBD92BUL, 0xEE971B69UL, + 0x6EA22FDEUL, 0x5F08AE2BUL, 0xAF7A616DUL, 0xE5C98767UL, + 0xCF1FEBD2UL, 0x61EFC8C2UL, 0xF1AC2571UL, 0xCC8239C2UL, + 0x67214CB8UL, 0xB1E583D1UL, 0xB7DC3E62UL, 0x7F10BDCEUL, + 0xF90A5C38UL, 0x0FF0443DUL, 0x606E6DC6UL, 0x60543A49UL, + 0x5727C148UL, 0x2BE98A1DUL, 0x8AB41738UL, 0x20E1BE24UL, + 0xAF96DA0FUL, 0x68458425UL, 0x99833BE5UL, 0x600D457DUL, + 0x282F9350UL, 0x8334B362UL, 0xD91D1120UL, 0x2B6D8DA0UL, + 0x642B1E31UL, 0x9C305A00UL, 0x52BCE688UL, 0x1B03588AUL, + 0xF7BAEFD5UL, 0x4142ED9CUL, 0xA4315C11UL, 0x83323EC5UL, + 0xDFEF4636UL, 0xA133C501UL, 0xE9D3531CUL, 0xEE353783UL + }, + + { + 0x9DB30420UL, 0x1FB6E9DEUL, 0xA7BE7BEFUL, 0xD273A298UL, + 0x4A4F7BDBUL, 0x64AD8C57UL, 0x85510443UL, 0xFA020ED1UL, + 0x7E287AFFUL, 0xE60FB663UL, 0x095F35A1UL, 0x79EBF120UL, + 0xFD059D43UL, 0x6497B7B1UL, 0xF3641F63UL, 0x241E4ADFUL, + 0x28147F5FUL, 0x4FA2B8CDUL, 0xC9430040UL, 0x0CC32220UL, + 0xFDD30B30UL, 0xC0A5374FUL, 0x1D2D00D9UL, 0x24147B15UL, + 0xEE4D111AUL, 0x0FCA5167UL, 0x71FF904CUL, 0x2D195FFEUL, + 0x1A05645FUL, 0x0C13FEFEUL, 0x081B08CAUL, 0x05170121UL, + 0x80530100UL, 0xE83E5EFEUL, 0xAC9AF4F8UL, 0x7FE72701UL, + 0xD2B8EE5FUL, 0x06DF4261UL, 0xBB9E9B8AUL, 0x7293EA25UL, + 0xCE84FFDFUL, 0xF5718801UL, 0x3DD64B04UL, 0xA26F263BUL, + 0x7ED48400UL, 0x547EEBE6UL, 0x446D4CA0UL, 0x6CF3D6F5UL, + 0x2649ABDFUL, 0xAEA0C7F5UL, 0x36338CC1UL, 0x503F7E93UL, + 0xD3772061UL, 0x11B638E1UL, 0x72500E03UL, 0xF80EB2BBUL, + 0xABE0502EUL, 0xEC8D77DEUL, 0x57971E81UL, 0xE14F6746UL, + 0xC9335400UL, 0x6920318FUL, 0x081DBB99UL, 0xFFC304A5UL, + 0x4D351805UL, 0x7F3D5CE3UL, 0xA6C866C6UL, 0x5D5BCCA9UL, + 0xDAEC6FEAUL, 0x9F926F91UL, 0x9F46222FUL, 0x3991467DUL, + 0xA5BF6D8EUL, 0x1143C44FUL, 0x43958302UL, 0xD0214EEBUL, + 0x022083B8UL, 0x3FB6180CUL, 0x18F8931EUL, 0x281658E6UL, + 0x26486E3EUL, 0x8BD78A70UL, 0x7477E4C1UL, 0xB506E07CUL, + 0xF32D0A25UL, 0x79098B02UL, 0xE4EABB81UL, 0x28123B23UL, + 0x69DEAD38UL, 0x1574CA16UL, 0xDF871B62UL, 0x211C40B7UL, + 0xA51A9EF9UL, 0x0014377BUL, 0x041E8AC8UL, 0x09114003UL, + 0xBD59E4D2UL, 0xE3D156D5UL, 0x4FE876D5UL, 0x2F91A340UL, + 0x557BE8DEUL, 0x00EAE4A7UL, 0x0CE5C2ECUL, 0x4DB4BBA6UL, + 0xE756BDFFUL, 0xDD3369ACUL, 0xEC17B035UL, 0x06572327UL, + 0x99AFC8B0UL, 0x56C8C391UL, 0x6B65811CUL, 0x5E146119UL, + 0x6E85CB75UL, 0xBE07C002UL, 0xC2325577UL, 0x893FF4ECUL, + 0x5BBFC92DUL, 0xD0EC3B25UL, 0xB7801AB7UL, 0x8D6D3B24UL, + 0x20C763EFUL, 0xC366A5FCUL, 0x9C382880UL, 0x0ACE3205UL, + 0xAAC9548AUL, 0xECA1D7C7UL, 0x041AFA32UL, 0x1D16625AUL, + 0x6701902CUL, 0x9B757A54UL, 0x31D477F7UL, 0x9126B031UL, + 0x36CC6FDBUL, 0xC70B8B46UL, 0xD9E66A48UL, 0x56E55A79UL, + 0x026A4CEBUL, 0x52437EFFUL, 0x2F8F76B4UL, 0x0DF980A5UL, + 0x8674CDE3UL, 0xEDDA04EBUL, 0x17A9BE04UL, 0x2C18F4DFUL, + 0xB7747F9DUL, 0xAB2AF7B4UL, 0xEFC34D20UL, 0x2E096B7CUL, + 0x1741A254UL, 0xE5B6A035UL, 0x213D42F6UL, 0x2C1C7C26UL, + 0x61C2F50FUL, 0x6552DAF9UL, 0xD2C231F8UL, 0x25130F69UL, + 0xD8167FA2UL, 0x0418F2C8UL, 0x001A96A6UL, 0x0D1526ABUL, + 0x63315C21UL, 0x5E0A72ECUL, 0x49BAFEFDUL, 0x187908D9UL, + 0x8D0DBD86UL, 0x311170A7UL, 0x3E9B640CUL, 0xCC3E10D7UL, + 0xD5CAD3B6UL, 0x0CAEC388UL, 0xF73001E1UL, 0x6C728AFFUL, + 0x71EAE2A1UL, 0x1F9AF36EUL, 0xCFCBD12FUL, 0xC1DE8417UL, + 0xAC07BE6BUL, 0xCB44A1D8UL, 0x8B9B0F56UL, 0x013988C3UL, + 0xB1C52FCAUL, 0xB4BE31CDUL, 0xD8782806UL, 0x12A3A4E2UL, + 0x6F7DE532UL, 0x58FD7EB6UL, 0xD01EE900UL, 0x24ADFFC2UL, + 0xF4990FC5UL, 0x9711AAC5UL, 0x001D7B95UL, 0x82E5E7D2UL, + 0x109873F6UL, 0x00613096UL, 0xC32D9521UL, 0xADA121FFUL, + 0x29908415UL, 0x7FBB977FUL, 0xAF9EB3DBUL, 0x29C9ED2AUL, + 0x5CE2A465UL, 0xA730F32CUL, 0xD0AA3FE8UL, 0x8A5CC091UL, + 0xD49E2CE7UL, 0x0CE454A9UL, 0xD60ACD86UL, 0x015F1919UL, + 0x77079103UL, 0xDEA03AF6UL, 0x78A8565EUL, 0xDEE356DFUL, + 0x21F05CBEUL, 0x8B75E387UL, 0xB3C50651UL, 0xB8A5C3EFUL, + 0xD8EEB6D2UL, 0xE523BE77UL, 0xC2154529UL, 0x2F69EFDFUL, + 0xAFE67AFBUL, 0xF470C4B2UL, 0xF3E0EB5BUL, 0xD6CC9876UL, + 0x39E4460CUL, 0x1FDA8538UL, 0x1987832FUL, 0xCA007367UL, + 0xA99144F8UL, 0x296B299EUL, 0x492FC295UL, 0x9266BEABUL, + 0xB5676E69UL, 0x9BD3DDDAUL, 0xDF7E052FUL, 0xDB25701CUL, + 0x1B5E51EEUL, 0xF65324E6UL, 0x6AFCE36CUL, 0x0316CC04UL, + 0x8644213EUL, 0xB7DC59D0UL, 0x7965291FUL, 0xCCD6FD43UL, + 0x41823979UL, 0x932BCDF6UL, 0xB657C34DUL, 0x4EDFD282UL, + 0x7AE5290CUL, 0x3CB9536BUL, 0x851E20FEUL, 0x9833557EUL, + 0x13ECF0B0UL, 0xD3FFB372UL, 0x3F85C5C1UL, 0x0AEF7ED2UL + }, + + { + 0x7EC90C04UL, 0x2C6E74B9UL, 0x9B0E66DFUL, 0xA6337911UL, + 0xB86A7FFFUL, 0x1DD358F5UL, 0x44DD9D44UL, 0x1731167FUL, + 0x08FBF1FAUL, 0xE7F511CCUL, 0xD2051B00UL, 0x735ABA00UL, + 0x2AB722D8UL, 0x386381CBUL, 0xACF6243AUL, 0x69BEFD7AUL, + 0xE6A2E77FUL, 0xF0C720CDUL, 0xC4494816UL, 0xCCF5C180UL, + 0x38851640UL, 0x15B0A848UL, 0xE68B18CBUL, 0x4CAADEFFUL, + 0x5F480A01UL, 0x0412B2AAUL, 0x259814FCUL, 0x41D0EFE2UL, + 0x4E40B48DUL, 0x248EB6FBUL, 0x8DBA1CFEUL, 0x41A99B02UL, + 0x1A550A04UL, 0xBA8F65CBUL, 0x7251F4E7UL, 0x95A51725UL, + 0xC106ECD7UL, 0x97A5980AUL, 0xC539B9AAUL, 0x4D79FE6AUL, + 0xF2F3F763UL, 0x68AF8040UL, 0xED0C9E56UL, 0x11B4958BUL, + 0xE1EB5A88UL, 0x8709E6B0UL, 0xD7E07156UL, 0x4E29FEA7UL, + 0x6366E52DUL, 0x02D1C000UL, 0xC4AC8E05UL, 0x9377F571UL, + 0x0C05372AUL, 0x578535F2UL, 0x2261BE02UL, 0xD642A0C9UL, + 0xDF13A280UL, 0x74B55BD2UL, 0x682199C0UL, 0xD421E5ECUL, + 0x53FB3CE8UL, 0xC8ADEDB3UL, 0x28A87FC9UL, 0x3D959981UL, + 0x5C1FF900UL, 0xFE38D399UL, 0x0C4EFF0BUL, 0x062407EAUL, + 0xAA2F4FB1UL, 0x4FB96976UL, 0x90C79505UL, 0xB0A8A774UL, + 0xEF55A1FFUL, 0xE59CA2C2UL, 0xA6B62D27UL, 0xE66A4263UL, + 0xDF65001FUL, 0x0EC50966UL, 0xDFDD55BCUL, 0x29DE0655UL, + 0x911E739AUL, 0x17AF8975UL, 0x32C7911CUL, 0x89F89468UL, + 0x0D01E980UL, 0x524755F4UL, 0x03B63CC9UL, 0x0CC844B2UL, + 0xBCF3F0AAUL, 0x87AC36E9UL, 0xE53A7426UL, 0x01B3D82BUL, + 0x1A9E7449UL, 0x64EE2D7EUL, 0xCDDBB1DAUL, 0x01C94910UL, + 0xB868BF80UL, 0x0D26F3FDUL, 0x9342EDE7UL, 0x04A5C284UL, + 0x636737B6UL, 0x50F5B616UL, 0xF24766E3UL, 0x8ECA36C1UL, + 0x136E05DBUL, 0xFEF18391UL, 0xFB887A37UL, 0xD6E7F7D4UL, + 0xC7FB7DC9UL, 0x3063FCDFUL, 0xB6F589DEUL, 0xEC2941DAUL, + 0x26E46695UL, 0xB7566419UL, 0xF654EFC5UL, 0xD08D58B7UL, + 0x48925401UL, 0xC1BACB7FUL, 0xE5FF550FUL, 0xB6083049UL, + 0x5BB5D0E8UL, 0x87D72E5AUL, 0xAB6A6EE1UL, 0x223A66CEUL, + 0xC62BF3CDUL, 0x9E0885F9UL, 0x68CB3E47UL, 0x086C010FUL, + 0xA21DE820UL, 0xD18B69DEUL, 0xF3F65777UL, 0xFA02C3F6UL, + 0x407EDAC3UL, 0xCBB3D550UL, 0x1793084DUL, 0xB0D70EBAUL, + 0x0AB378D5UL, 0xD951FB0CUL, 0xDED7DA56UL, 0x4124BBE4UL, + 0x94CA0B56UL, 0x0F5755D1UL, 0xE0E1E56EUL, 0x6184B5BEUL, + 0x580A249FUL, 0x94F74BC0UL, 0xE327888EUL, 0x9F7B5561UL, + 0xC3DC0280UL, 0x05687715UL, 0x646C6BD7UL, 0x44904DB3UL, + 0x66B4F0A3UL, 0xC0F1648AUL, 0x697ED5AFUL, 0x49E92FF6UL, + 0x309E374FUL, 0x2CB6356AUL, 0x85808573UL, 0x4991F840UL, + 0x76F0AE02UL, 0x083BE84DUL, 0x28421C9AUL, 0x44489406UL, + 0x736E4CB8UL, 0xC1092910UL, 0x8BC95FC6UL, 0x7D869CF4UL, + 0x134F616FUL, 0x2E77118DUL, 0xB31B2BE1UL, 0xAA90B472UL, + 0x3CA5D717UL, 0x7D161BBAUL, 0x9CAD9010UL, 0xAF462BA2UL, + 0x9FE459D2UL, 0x45D34559UL, 0xD9F2DA13UL, 0xDBC65487UL, + 0xF3E4F94EUL, 0x176D486FUL, 0x097C13EAUL, 0x631DA5C7UL, + 0x445F7382UL, 0x175683F4UL, 0xCDC66A97UL, 0x70BE0288UL, + 0xB3CDCF72UL, 0x6E5DD2F3UL, 0x20936079UL, 0x459B80A5UL, + 0xBE60E2DBUL, 0xA9C23101UL, 0xEBA5315CUL, 0x224E42F2UL, + 0x1C5C1572UL, 0xF6721B2CUL, 0x1AD2FFF3UL, 0x8C25404EUL, + 0x324ED72FUL, 0x4067B7FDUL, 0x0523138EUL, 0x5CA3BC78UL, + 0xDC0FD66EUL, 0x75922283UL, 0x784D6B17UL, 0x58EBB16EUL, + 0x44094F85UL, 0x3F481D87UL, 0xFCFEAE7BUL, 0x77B5FF76UL, + 0x8C2302BFUL, 0xAAF47556UL, 0x5F46B02AUL, 0x2B092801UL, + 0x3D38F5F7UL, 0x0CA81F36UL, 0x52AF4A8AUL, 0x66D5E7C0UL, + 0xDF3B0874UL, 0x95055110UL, 0x1B5AD7A8UL, 0xF61ED5ADUL, + 0x6CF6E479UL, 0x20758184UL, 0xD0CEFA65UL, 0x88F7BE58UL, + 0x4A046826UL, 0x0FF6F8F3UL, 0xA09C7F70UL, 0x5346ABA0UL, + 0x5CE96C28UL, 0xE176EDA3UL, 0x6BAC307FUL, 0x376829D2UL, + 0x85360FA9UL, 0x17E3FE2AUL, 0x24B79767UL, 0xF5A96B20UL, + 0xD6CD2595UL, 0x68FF1EBFUL, 0x7555442CUL, 0xF19F06BEUL, + 0xF9E0659AUL, 0xEEB9491DUL, 0x34010718UL, 0xBB30CAB8UL, + 0xE822FE15UL, 0x88570983UL, 0x750E6249UL, 0xDA627E55UL, + 0x5E76FFA8UL, 0xB1534546UL, 0x6D47DE08UL, 0xEFE9E7D4UL + }, + + { + 0xF6FA8F9DUL, 0x2CAC6CE1UL, 0x4CA34867UL, 0xE2337F7CUL, + 0x95DB08E7UL, 0x016843B4UL, 0xECED5CBCUL, 0x325553ACUL, + 0xBF9F0960UL, 0xDFA1E2EDUL, 0x83F0579DUL, 0x63ED86B9UL, + 0x1AB6A6B8UL, 0xDE5EBE39UL, 0xF38FF732UL, 0x8989B138UL, + 0x33F14961UL, 0xC01937BDUL, 0xF506C6DAUL, 0xE4625E7EUL, + 0xA308EA99UL, 0x4E23E33CUL, 0x79CBD7CCUL, 0x48A14367UL, + 0xA3149619UL, 0xFEC94BD5UL, 0xA114174AUL, 0xEAA01866UL, + 0xA084DB2DUL, 0x09A8486FUL, 0xA888614AUL, 0x2900AF98UL, + 0x01665991UL, 0xE1992863UL, 0xC8F30C60UL, 0x2E78EF3CUL, + 0xD0D51932UL, 0xCF0FEC14UL, 0xF7CA07D2UL, 0xD0A82072UL, + 0xFD41197EUL, 0x9305A6B0UL, 0xE86BE3DAUL, 0x74BED3CDUL, + 0x372DA53CUL, 0x4C7F4448UL, 0xDAB5D440UL, 0x6DBA0EC3UL, + 0x083919A7UL, 0x9FBAEED9UL, 0x49DBCFB0UL, 0x4E670C53UL, + 0x5C3D9C01UL, 0x64BDB941UL, 0x2C0E636AUL, 0xBA7DD9CDUL, + 0xEA6F7388UL, 0xE70BC762UL, 0x35F29ADBUL, 0x5C4CDD8DUL, + 0xF0D48D8CUL, 0xB88153E2UL, 0x08A19866UL, 0x1AE2EAC8UL, + 0x284CAF89UL, 0xAA928223UL, 0x9334BE53UL, 0x3B3A21BFUL, + 0x16434BE3UL, 0x9AEA3906UL, 0xEFE8C36EUL, 0xF890CDD9UL, + 0x80226DAEUL, 0xC340A4A3UL, 0xDF7E9C09UL, 0xA694A807UL, + 0x5B7C5ECCUL, 0x221DB3A6UL, 0x9A69A02FUL, 0x68818A54UL, + 0xCEB2296FUL, 0x53C0843AUL, 0xFE893655UL, 0x25BFE68AUL, + 0xB4628ABCUL, 0xCF222EBFUL, 0x25AC6F48UL, 0xA9A99387UL, + 0x53BDDB65UL, 0xE76FFBE7UL, 0xE967FD78UL, 0x0BA93563UL, + 0x8E342BC1UL, 0xE8A11BE9UL, 0x4980740DUL, 0xC8087DFCUL, + 0x8DE4BF99UL, 0xA11101A0UL, 0x7FD37975UL, 0xDA5A26C0UL, + 0xE81F994FUL, 0x9528CD89UL, 0xFD339FEDUL, 0xB87834BFUL, + 0x5F04456DUL, 0x22258698UL, 0xC9C4C83BUL, 0x2DC156BEUL, + 0x4F628DAAUL, 0x57F55EC5UL, 0xE2220ABEUL, 0xD2916EBFUL, + 0x4EC75B95UL, 0x24F2C3C0UL, 0x42D15D99UL, 0xCD0D7FA0UL, + 0x7B6E27FFUL, 0xA8DC8AF0UL, 0x7345C106UL, 0xF41E232FUL, + 0x35162386UL, 0xE6EA8926UL, 0x3333B094UL, 0x157EC6F2UL, + 0x372B74AFUL, 0x692573E4UL, 0xE9A9D848UL, 0xF3160289UL, + 0x3A62EF1DUL, 0xA787E238UL, 0xF3A5F676UL, 0x74364853UL, + 0x20951063UL, 0x4576698DUL, 0xB6FAD407UL, 0x592AF950UL, + 0x36F73523UL, 0x4CFB6E87UL, 0x7DA4CEC0UL, 0x6C152DAAUL, + 0xCB0396A8UL, 0xC50DFE5DUL, 0xFCD707ABUL, 0x0921C42FUL, + 0x89DFF0BBUL, 0x5FE2BE78UL, 0x448F4F33UL, 0x754613C9UL, + 0x2B05D08DUL, 0x48B9D585UL, 0xDC049441UL, 0xC8098F9BUL, + 0x7DEDE786UL, 0xC39A3373UL, 0x42410005UL, 0x6A091751UL, + 0x0EF3C8A6UL, 0x890072D6UL, 0x28207682UL, 0xA9A9F7BEUL, + 0xBF32679DUL, 0xD45B5B75UL, 0xB353FD00UL, 0xCBB0E358UL, + 0x830F220AUL, 0x1F8FB214UL, 0xD372CF08UL, 0xCC3C4A13UL, + 0x8CF63166UL, 0x061C87BEUL, 0x88C98F88UL, 0x6062E397UL, + 0x47CF8E7AUL, 0xB6C85283UL, 0x3CC2ACFBUL, 0x3FC06976UL, + 0x4E8F0252UL, 0x64D8314DUL, 0xDA3870E3UL, 0x1E665459UL, + 0xC10908F0UL, 0x513021A5UL, 0x6C5B68B7UL, 0x822F8AA0UL, + 0x3007CD3EUL, 0x74719EEFUL, 0xDC872681UL, 0x073340D4UL, + 0x7E432FD9UL, 0x0C5EC241UL, 0x8809286CUL, 0xF592D891UL, + 0x08A930F6UL, 0x957EF305UL, 0xB7FBFFBDUL, 0xC266E96FUL, + 0x6FE4AC98UL, 0xB173ECC0UL, 0xBC60B42AUL, 0x953498DAUL, + 0xFBA1AE12UL, 0x2D4BD736UL, 0x0F25FAABUL, 0xA4F3FCEBUL, + 0xE2969123UL, 0x257F0C3DUL, 0x9348AF49UL, 0x361400BCUL, + 0xE8816F4AUL, 0x3814F200UL, 0xA3F94043UL, 0x9C7A54C2UL, + 0xBC704F57UL, 0xDA41E7F9UL, 0xC25AD33AUL, 0x54F4A084UL, + 0xB17F5505UL, 0x59357CBEUL, 0xEDBD15C8UL, 0x7F97C5ABUL, + 0xBA5AC7B5UL, 0xB6F6DEAFUL, 0x3A479C3AUL, 0x5302DA25UL, + 0x653D7E6AUL, 0x54268D49UL, 0x51A477EAUL, 0x5017D55BUL, + 0xD7D25D88UL, 0x44136C76UL, 0x0404A8C8UL, 0xB8E5A121UL, + 0xB81A928AUL, 0x60ED5869UL, 0x97C55B96UL, 0xEAEC991BUL, + 0x29935913UL, 0x01FDB7F1UL, 0x088E8DFAUL, 0x9AB6F6F5UL, + 0x3B4CBF9FUL, 0x4A5DE3ABUL, 0xE6051D35UL, 0xA0E1D855UL, + 0xD36B4CF1UL, 0xF544EDEBUL, 0xB0E93524UL, 0xBEBB8FBDUL, + 0xA2D762CFUL, 0x49C92F54UL, 0x38B5F331UL, 0x7128A454UL, + 0x48392905UL, 0xA65B1DB8UL, 0x851C97BDUL, 0xD675CF2FUL + }, + + { + 0x85E04019UL, 0x332BF567UL, 0x662DBFFFUL, 0xCFC65693UL, + 0x2A8D7F6FUL, 0xAB9BC912UL, 0xDE6008A1UL, 0x2028DA1FUL, + 0x0227BCE7UL, 0x4D642916UL, 0x18FAC300UL, 0x50F18B82UL, + 0x2CB2CB11UL, 0xB232E75CUL, 0x4B3695F2UL, 0xB28707DEUL, + 0xA05FBCF6UL, 0xCD4181E9UL, 0xE150210CUL, 0xE24EF1BDUL, + 0xB168C381UL, 0xFDE4E789UL, 0x5C79B0D8UL, 0x1E8BFD43UL, + 0x4D495001UL, 0x38BE4341UL, 0x913CEE1DUL, 0x92A79C3FUL, + 0x089766BEUL, 0xBAEEADF4UL, 0x1286BECFUL, 0xB6EACB19UL, + 0x2660C200UL, 0x7565BDE4UL, 0x64241F7AUL, 0x8248DCA9UL, + 0xC3B3AD66UL, 0x28136086UL, 0x0BD8DFA8UL, 0x356D1CF2UL, + 0x107789BEUL, 0xB3B2E9CEUL, 0x0502AA8FUL, 0x0BC0351EUL, + 0x166BF52AUL, 0xEB12FF82UL, 0xE3486911UL, 0xD34D7516UL, + 0x4E7B3AFFUL, 0x5F43671BUL, 0x9CF6E037UL, 0x4981AC83UL, + 0x334266CEUL, 0x8C9341B7UL, 0xD0D854C0UL, 0xCB3A6C88UL, + 0x47BC2829UL, 0x4725BA37UL, 0xA66AD22BUL, 0x7AD61F1EUL, + 0x0C5CBAFAUL, 0x4437F107UL, 0xB6E79962UL, 0x42D2D816UL, + 0x0A961288UL, 0xE1A5C06EUL, 0x13749E67UL, 0x72FC081AUL, + 0xB1D139F7UL, 0xF9583745UL, 0xCF19DF58UL, 0xBEC3F756UL, + 0xC06EBA30UL, 0x07211B24UL, 0x45C28829UL, 0xC95E317FUL, + 0xBC8EC511UL, 0x38BC46E9UL, 0xC6E6FA14UL, 0xBAE8584AUL, + 0xAD4EBC46UL, 0x468F508BUL, 0x7829435FUL, 0xF124183BUL, + 0x821DBA9FUL, 0xAFF60FF4UL, 0xEA2C4E6DUL, 0x16E39264UL, + 0x92544A8BUL, 0x009B4FC3UL, 0xABA68CEDUL, 0x9AC96F78UL, + 0x06A5B79AUL, 0xB2856E6EUL, 0x1AEC3CA9UL, 0xBE838688UL, + 0x0E0804E9UL, 0x55F1BE56UL, 0xE7E5363BUL, 0xB3A1F25DUL, + 0xF7DEBB85UL, 0x61FE033CUL, 0x16746233UL, 0x3C034C28UL, + 0xDA6D0C74UL, 0x79AAC56CUL, 0x3CE4E1ADUL, 0x51F0C802UL, + 0x98F8F35AUL, 0x1626A49FUL, 0xEED82B29UL, 0x1D382FE3UL, + 0x0C4FB99AUL, 0xBB325778UL, 0x3EC6D97BUL, 0x6E77A6A9UL, + 0xCB658B5CUL, 0xD45230C7UL, 0x2BD1408BUL, 0x60C03EB7UL, + 0xB9068D78UL, 0xA33754F4UL, 0xF430C87DUL, 0xC8A71302UL, + 0xB96D8C32UL, 0xEBD4E7BEUL, 0xBE8B9D2DUL, 0x7979FB06UL, + 0xE7225308UL, 0x8B75CF77UL, 0x11EF8DA4UL, 0xE083C858UL, + 0x8D6B786FUL, 0x5A6317A6UL, 0xFA5CF7A0UL, 0x5DDA0033UL, + 0xF28EBFB0UL, 0xF5B9C310UL, 0xA0EAC280UL, 0x08B9767AUL, + 0xA3D9D2B0UL, 0x79D34217UL, 0x021A718DUL, 0x9AC6336AUL, + 0x2711FD60UL, 0x438050E3UL, 0x069908A8UL, 0x3D7FEDC4UL, + 0x826D2BEFUL, 0x4EEB8476UL, 0x488DCF25UL, 0x36C9D566UL, + 0x28E74E41UL, 0xC2610ACAUL, 0x3D49A9CFUL, 0xBAE3B9DFUL, + 0xB65F8DE6UL, 0x92AEAF64UL, 0x3AC7D5E6UL, 0x9EA80509UL, + 0xF22B017DUL, 0xA4173F70UL, 0xDD1E16C3UL, 0x15E0D7F9UL, + 0x50B1B887UL, 0x2B9F4FD5UL, 0x625ABA82UL, 0x6A017962UL, + 0x2EC01B9CUL, 0x15488AA9UL, 0xD716E740UL, 0x40055A2CUL, + 0x93D29A22UL, 0xE32DBF9AUL, 0x058745B9UL, 0x3453DC1EUL, + 0xD699296EUL, 0x496CFF6FUL, 0x1C9F4986UL, 0xDFE2ED07UL, + 0xB87242D1UL, 0x19DE7EAEUL, 0x053E561AUL, 0x15AD6F8CUL, + 0x66626C1CUL, 0x7154C24CUL, 0xEA082B2AUL, 0x93EB2939UL, + 0x17DCB0F0UL, 0x58D4F2AEUL, 0x9EA294FBUL, 0x52CF564CUL, + 0x9883FE66UL, 0x2EC40581UL, 0x763953C3UL, 0x01D6692EUL, + 0xD3A0C108UL, 0xA1E7160EUL, 0xE4F2DFA6UL, 0x693ED285UL, + 0x74904698UL, 0x4C2B0EDDUL, 0x4F757656UL, 0x5D393378UL, + 0xA132234FUL, 0x3D321C5DUL, 0xC3F5E194UL, 0x4B269301UL, + 0xC79F022FUL, 0x3C997E7EUL, 0x5E4F9504UL, 0x3FFAFBBDUL, + 0x76F7AD0EUL, 0x296693F4UL, 0x3D1FCE6FUL, 0xC61E45BEUL, + 0xD3B5AB34UL, 0xF72BF9B7UL, 0x1B0434C0UL, 0x4E72B567UL, + 0x5592A33DUL, 0xB5229301UL, 0xCFD2A87FUL, 0x60AEB767UL, + 0x1814386BUL, 0x30BCC33DUL, 0x38A0C07DUL, 0xFD1606F2UL, + 0xC363519BUL, 0x589DD390UL, 0x5479F8E6UL, 0x1CB8D647UL, + 0x97FD61A9UL, 0xEA7759F4UL, 0x2D57539DUL, 0x569A58CFUL, + 0xE84E63ADUL, 0x462E1B78UL, 0x6580F87EUL, 0xF3817914UL, + 0x91DA55F4UL, 0x40A230F3UL, 0xD1988F35UL, 0xB6E318D2UL, + 0x3FFA50BCUL, 0x3D40F021UL, 0xC3C0BDAEUL, 0x4958C24CUL, + 0x518F36B2UL, 0x84B1D370UL, 0x0FEDCE83UL, 0x878DDADAUL, + 0xF2A279C7UL, 0x94E01BE8UL, 0x90716F4BUL, 0x954B8AA3UL + }, + + { + 0xE216300DUL, 0xBBDDFFFCUL, 0xA7EBDABDUL, 0x35648095UL, + 0x7789F8B7UL, 0xE6C1121BUL, 0x0E241600UL, 0x052CE8B5UL, + 0x11A9CFB0UL, 0xE5952F11UL, 0xECE7990AUL, 0x9386D174UL, + 0x2A42931CUL, 0x76E38111UL, 0xB12DEF3AUL, 0x37DDDDFCUL, + 0xDE9ADEB1UL, 0x0A0CC32CUL, 0xBE197029UL, 0x84A00940UL, + 0xBB243A0FUL, 0xB4D137CFUL, 0xB44E79F0UL, 0x049EEDFDUL, + 0x0B15A15DUL, 0x480D3168UL, 0x8BBBDE5AUL, 0x669DED42UL, + 0xC7ECE831UL, 0x3F8F95E7UL, 0x72DF191BUL, 0x7580330DUL, + 0x94074251UL, 0x5C7DCDFAUL, 0xABBE6D63UL, 0xAA402164UL, + 0xB301D40AUL, 0x02E7D1CAUL, 0x53571DAEUL, 0x7A3182A2UL, + 0x12A8DDECUL, 0xFDAA335DUL, 0x176F43E8UL, 0x71FB46D4UL, + 0x38129022UL, 0xCE949AD4UL, 0xB84769ADUL, 0x965BD862UL, + 0x82F3D055UL, 0x66FB9767UL, 0x15B80B4EUL, 0x1D5B47A0UL, + 0x4CFDE06FUL, 0xC28EC4B8UL, 0x57E8726EUL, 0x647A78FCUL, + 0x99865D44UL, 0x608BD593UL, 0x6C200E03UL, 0x39DC5FF6UL, + 0x5D0B00A3UL, 0xAE63AFF2UL, 0x7E8BD632UL, 0x70108C0CUL, + 0xBBD35049UL, 0x2998DF04UL, 0x980CF42AUL, 0x9B6DF491UL, + 0x9E7EDD53UL, 0x06918548UL, 0x58CB7E07UL, 0x3B74EF2EUL, + 0x522FFFB1UL, 0xD24708CCUL, 0x1C7E27CDUL, 0xA4EB215BUL, + 0x3CF1D2E2UL, 0x19B47A38UL, 0x424F7618UL, 0x35856039UL, + 0x9D17DEE7UL, 0x27EB35E6UL, 0xC9AFF67BUL, 0x36BAF5B8UL, + 0x09C467CDUL, 0xC18910B1UL, 0xE11DBF7BUL, 0x06CD1AF8UL, + 0x7170C608UL, 0x2D5E3354UL, 0xD4DE495AUL, 0x64C6D006UL, + 0xBCC0C62CUL, 0x3DD00DB3UL, 0x708F8F34UL, 0x77D51B42UL, + 0x264F620FUL, 0x24B8D2BFUL, 0x15C1B79EUL, 0x46A52564UL, + 0xF8D7E54EUL, 0x3E378160UL, 0x7895CDA5UL, 0x859C15A5UL, + 0xE6459788UL, 0xC37BC75FUL, 0xDB07BA0CUL, 0x0676A3ABUL, + 0x7F229B1EUL, 0x31842E7BUL, 0x24259FD7UL, 0xF8BEF472UL, + 0x835FFCB8UL, 0x6DF4C1F2UL, 0x96F5B195UL, 0xFD0AF0FCUL, + 0xB0FE134CUL, 0xE2506D3DUL, 0x4F9B12EAUL, 0xF215F225UL, + 0xA223736FUL, 0x9FB4C428UL, 0x25D04979UL, 0x34C713F8UL, + 0xC4618187UL, 0xEA7A6E98UL, 0x7CD16EFCUL, 0x1436876CUL, + 0xF1544107UL, 0xBEDEEE14UL, 0x56E9AF27UL, 0xA04AA441UL, + 0x3CF7C899UL, 0x92ECBAE6UL, 0xDD67016DUL, 0x151682EBUL, + 0xA842EEDFUL, 0xFDBA60B4UL, 0xF1907B75UL, 0x20E3030FUL, + 0x24D8C29EUL, 0xE139673BUL, 0xEFA63FB8UL, 0x71873054UL, + 0xB6F2CF3BUL, 0x9F326442UL, 0xCB15A4CCUL, 0xB01A4504UL, + 0xF1E47D8DUL, 0x844A1BE5UL, 0xBAE7DFDCUL, 0x42CBDA70UL, + 0xCD7DAE0AUL, 0x57E85B7AUL, 0xD53F5AF6UL, 0x20CF4D8CUL, + 0xCEA4D428UL, 0x79D130A4UL, 0x3486EBFBUL, 0x33D3CDDCUL, + 0x77853B53UL, 0x37EFFCB5UL, 0xC5068778UL, 0xE580B3E6UL, + 0x4E68B8F4UL, 0xC5C8B37EUL, 0x0D809EA2UL, 0x398FEB7CUL, + 0x132A4F94UL, 0x43B7950EUL, 0x2FEE7D1CUL, 0x223613BDUL, + 0xDD06CAA2UL, 0x37DF932BUL, 0xC4248289UL, 0xACF3EBC3UL, + 0x5715F6B7UL, 0xEF3478DDUL, 0xF267616FUL, 0xC148CBE4UL, + 0x9052815EUL, 0x5E410FABUL, 0xB48A2465UL, 0x2EDA7FA4UL, + 0xE87B40E4UL, 0xE98EA084UL, 0x5889E9E1UL, 0xEFD390FCUL, + 0xDD07D35BUL, 0xDB485694UL, 0x38D7E5B2UL, 0x57720101UL, + 0x730EDEBCUL, 0x5B643113UL, 0x94917E4FUL, 0x503C2FBAUL, + 0x646F1282UL, 0x7523D24AUL, 0xE0779695UL, 0xF9C17A8FUL, + 0x7A5B2121UL, 0xD187B896UL, 0x29263A4DUL, 0xBA510CDFUL, + 0x81F47C9FUL, 0xAD1163EDUL, 0xEA7B5965UL, 0x1A00726EUL, + 0x11403092UL, 0x00DA6D77UL, 0x4A0CDD61UL, 0xAD1F4603UL, + 0x605BDFB0UL, 0x9EEDC364UL, 0x22EBE6A8UL, 0xCEE7D28AUL, + 0xA0E736A0UL, 0x5564A6B9UL, 0x10853209UL, 0xC7EB8F37UL, + 0x2DE705CAUL, 0x8951570FUL, 0xDF09822BUL, 0xBD691A6CUL, + 0xAA12E4F2UL, 0x87451C0FUL, 0xE0F6A27AUL, 0x3ADA4819UL, + 0x4CF1764FUL, 0x0D771C2BUL, 0x67CDB156UL, 0x350D8384UL, + 0x5938FA0FUL, 0x42399EF3UL, 0x36997B07UL, 0x0E84093DUL, + 0x4AA93E61UL, 0x8360D87BUL, 0x1FA98B0CUL, 0x1149382CUL, + 0xE97625A5UL, 0x0614D1B7UL, 0x0E25244BUL, 0x0C768347UL, + 0x589E8D82UL, 0x0D2059D1UL, 0xA466BB1EUL, 0xF8DA0A82UL, + 0x04F19130UL, 0xBA6E4EC0UL, 0x99265164UL, 0x1EE7230DUL, + 0x50B2AD80UL, 0xEAEE6801UL, 0x8DB2A283UL, 0xEA8BF59EUL + } +}; + +DECLSPEC void Cast5Encrypt (PRIVATE_AS const u8 *inBlock, PRIVATE_AS u8 *outBlock, PRIVATE_AS CAST_KEY *key, SHM_TYPE u32 (*s_S)[256]) +{ + u32 l; GET_UINT32BE(l, inBlock, 0); + u32 r; GET_UINT32BE(r, inBlock, 4); + PRIVATE_AS u32 *K = key->K; + u32 t; + + /* Do the work */ + _CAST_F1(l, r, 0, 16); + _CAST_F2(r, l, 1, 16); + _CAST_F3(l, r, 2, 16); + _CAST_F1(r, l, 3, 16); + _CAST_F2(l, r, 4, 16); + _CAST_F3(r, l, 5, 16); + _CAST_F1(l, r, 6, 16); + _CAST_F2(r, l, 7, 16); + _CAST_F3(l, r, 8, 16); + _CAST_F1(r, l, 9, 16); + _CAST_F2(l, r, 10, 16); + _CAST_F3(r, l, 11, 16); + _CAST_F1(l, r, 12, 16); + _CAST_F2(r, l, 13, 16); + _CAST_F3(l, r, 14, 16); + _CAST_F1(r, l, 15, 16); + + /* Put l,r into outblock */ + PUT_UINT32BE(r, outBlock, 0); + PUT_UINT32BE(l, outBlock, 4); +} + +DECLSPEC void Cast5Decrypt (PRIVATE_AS const u8 *inBlock, PRIVATE_AS u8 *outBlock, PRIVATE_AS CAST_KEY *key, SHM_TYPE u32 (*s_S)[256]) +{ + u32 l; GET_UINT32BE(l, inBlock, 0); + u32 r; GET_UINT32BE(r, inBlock, 4); + PRIVATE_AS u32 *K = key->K; + u32 t; + + /* Only do full 16 rounds if key length > 80 bits */ + _CAST_F1(r, l, 15, 16); + _CAST_F3(l, r, 14, 16); + _CAST_F2(r, l, 13, 16); + _CAST_F1(l, r, 12, 16); + _CAST_F3(r, l, 11, 16); + _CAST_F2(l, r, 10, 16); + _CAST_F1(r, l, 9, 16); + _CAST_F3(l, r, 8, 16); + _CAST_F2(r, l, 7, 16); + _CAST_F1(l, r, 6, 16); + _CAST_F3(r, l, 5, 16); + _CAST_F2(l, r, 4, 16); + _CAST_F1(r, l, 3, 16); + _CAST_F3(l, r, 2, 16); + _CAST_F2(r, l, 1, 16); + _CAST_F1(l, r, 0, 16); + /* Put l,r into outblock */ + PUT_UINT32BE(r, outBlock, 0); + PUT_UINT32BE(l, outBlock, 4); + /* Wipe clean */ + t = l = r = 0; +} + +DECLSPEC void Cast5SetKey (PRIVATE_AS CAST_KEY *key, u32 keylength, PRIVATE_AS const u8 *userKey, SHM_TYPE u32 (*s_S)[256]) +{ + u32 i; + PRIVATE_AS u32 *K = key->K; + u32 X[4], Z[4]; + + GET_UINT32BE(X[0], userKey, 0); + GET_UINT32BE(X[1], userKey, 4); + GET_UINT32BE(X[2], userKey, 8); + GET_UINT32BE(X[3], userKey, 12); + + #define x(i) GETBYTE(X[i/4], 3-i%4) + #define z(i) GETBYTE(Z[i/4], 3-i%4) + + for (i=0; i<=16; i+=16) { + // this part is copied directly from RFC 2144 (with some search and replace) by Wei Dai + Z[0] = X[0] ^ s_S[4][x(0xD)] ^ s_S[5][x(0xF)] ^ s_S[6][x(0xC)] ^ s_S[7][x(0xE)] ^ s_S[6][x(0x8)]; + Z[1] = X[2] ^ s_S[4][z(0x0)] ^ s_S[5][z(0x2)] ^ s_S[6][z(0x1)] ^ s_S[7][z(0x3)] ^ s_S[7][x(0xA)]; + Z[2] = X[3] ^ s_S[4][z(0x7)] ^ s_S[5][z(0x6)] ^ s_S[6][z(0x5)] ^ s_S[7][z(0x4)] ^ s_S[4][x(0x9)]; + Z[3] = X[1] ^ s_S[4][z(0xA)] ^ s_S[5][z(0x9)] ^ s_S[6][z(0xB)] ^ s_S[7][z(0x8)] ^ s_S[5][x(0xB)]; + K[i+0] = s_S[4][z(0x8)] ^ s_S[5][z(0x9)] ^ s_S[6][z(0x7)] ^ s_S[7][z(0x6)] ^ s_S[4][z(0x2)]; + K[i+1] = s_S[4][z(0xA)] ^ s_S[5][z(0xB)] ^ s_S[6][z(0x5)] ^ s_S[7][z(0x4)] ^ s_S[5][z(0x6)]; + K[i+2] = s_S[4][z(0xC)] ^ s_S[5][z(0xD)] ^ s_S[6][z(0x3)] ^ s_S[7][z(0x2)] ^ s_S[6][z(0x9)]; + K[i+3] = s_S[4][z(0xE)] ^ s_S[5][z(0xF)] ^ s_S[6][z(0x1)] ^ s_S[7][z(0x0)] ^ s_S[7][z(0xC)]; + X[0] = Z[2] ^ s_S[4][z(0x5)] ^ s_S[5][z(0x7)] ^ s_S[6][z(0x4)] ^ s_S[7][z(0x6)] ^ s_S[6][z(0x0)]; + X[1] = Z[0] ^ s_S[4][x(0x0)] ^ s_S[5][x(0x2)] ^ s_S[6][x(0x1)] ^ s_S[7][x(0x3)] ^ s_S[7][z(0x2)]; + X[2] = Z[1] ^ s_S[4][x(0x7)] ^ s_S[5][x(0x6)] ^ s_S[6][x(0x5)] ^ s_S[7][x(0x4)] ^ s_S[4][z(0x1)]; + X[3] = Z[3] ^ s_S[4][x(0xA)] ^ s_S[5][x(0x9)] ^ s_S[6][x(0xB)] ^ s_S[7][x(0x8)] ^ s_S[5][z(0x3)]; + K[i+4] = s_S[4][x(0x3)] ^ s_S[5][x(0x2)] ^ s_S[6][x(0xC)] ^ s_S[7][x(0xD)] ^ s_S[4][x(0x8)]; + K[i+5] = s_S[4][x(0x1)] ^ s_S[5][x(0x0)] ^ s_S[6][x(0xE)] ^ s_S[7][x(0xF)] ^ s_S[5][x(0xD)]; + K[i+6] = s_S[4][x(0x7)] ^ s_S[5][x(0x6)] ^ s_S[6][x(0x8)] ^ s_S[7][x(0x9)] ^ s_S[6][x(0x3)]; + K[i+7] = s_S[4][x(0x5)] ^ s_S[5][x(0x4)] ^ s_S[6][x(0xA)] ^ s_S[7][x(0xB)] ^ s_S[7][x(0x7)]; + Z[0] = X[0] ^ s_S[4][x(0xD)] ^ s_S[5][x(0xF)] ^ s_S[6][x(0xC)] ^ s_S[7][x(0xE)] ^ s_S[6][x(0x8)]; + Z[1] = X[2] ^ s_S[4][z(0x0)] ^ s_S[5][z(0x2)] ^ s_S[6][z(0x1)] ^ s_S[7][z(0x3)] ^ s_S[7][x(0xA)]; + Z[2] = X[3] ^ s_S[4][z(0x7)] ^ s_S[5][z(0x6)] ^ s_S[6][z(0x5)] ^ s_S[7][z(0x4)] ^ s_S[4][x(0x9)]; + Z[3] = X[1] ^ s_S[4][z(0xA)] ^ s_S[5][z(0x9)] ^ s_S[6][z(0xB)] ^ s_S[7][z(0x8)] ^ s_S[5][x(0xB)]; + K[i+8] = s_S[4][z(0x3)] ^ s_S[5][z(0x2)] ^ s_S[6][z(0xC)] ^ s_S[7][z(0xD)] ^ s_S[4][z(0x9)]; + K[i+9] = s_S[4][z(0x1)] ^ s_S[5][z(0x0)] ^ s_S[6][z(0xE)] ^ s_S[7][z(0xF)] ^ s_S[5][z(0xC)]; + K[i+10] = s_S[4][z(0x7)] ^ s_S[5][z(0x6)] ^ s_S[6][z(0x8)] ^ s_S[7][z(0x9)] ^ s_S[6][z(0x2)]; + K[i+11] = s_S[4][z(0x5)] ^ s_S[5][z(0x4)] ^ s_S[6][z(0xA)] ^ s_S[7][z(0xB)] ^ s_S[7][z(0x6)]; + X[0] = Z[2] ^ s_S[4][z(0x5)] ^ s_S[5][z(0x7)] ^ s_S[6][z(0x4)] ^ s_S[7][z(0x6)] ^ s_S[6][z(0x0)]; + X[1] = Z[0] ^ s_S[4][x(0x0)] ^ s_S[5][x(0x2)] ^ s_S[6][x(0x1)] ^ s_S[7][x(0x3)] ^ s_S[7][z(0x2)]; + X[2] = Z[1] ^ s_S[4][x(0x7)] ^ s_S[5][x(0x6)] ^ s_S[6][x(0x5)] ^ s_S[7][x(0x4)] ^ s_S[4][z(0x1)]; + X[3] = Z[3] ^ s_S[4][x(0xA)] ^ s_S[5][x(0x9)] ^ s_S[6][x(0xB)] ^ s_S[7][x(0x8)] ^ s_S[5][z(0x3)]; + K[i+12] = s_S[4][x(0x8)] ^ s_S[5][x(0x9)] ^ s_S[6][x(0x7)] ^ s_S[7][x(0x6)] ^ s_S[4][x(0x3)]; + K[i+13] = s_S[4][x(0xA)] ^ s_S[5][x(0xB)] ^ s_S[6][x(0x5)] ^ s_S[7][x(0x4)] ^ s_S[5][x(0x7)]; + K[i+14] = s_S[4][x(0xC)] ^ s_S[5][x(0xD)] ^ s_S[6][x(0x3)] ^ s_S[7][x(0x2)] ^ s_S[6][x(0x8)]; + K[i+15] = s_S[4][x(0xE)] ^ s_S[5][x(0xF)] ^ s_S[6][x(0x1)] ^ s_S[7][x(0x0)] ^ s_S[7][x(0xD)]; + } + + u32 data[32]; + for (i = 0; i < 16; i++) { + data[i * 2] = K[i]; + data[i * 2 + 1] = ((K[i + 16]) + 16) & 0x1f; // here only the lowest 5 bits are set.. + } + + for (i=16; i<32; i++) + K[i] &= 0x1f; +} diff --git a/OpenCL/inc_cipher_cast.h b/OpenCL/inc_cipher_cast.h new file mode 100644 index 000000000..7b96dc558 --- /dev/null +++ b/OpenCL/inc_cipher_cast.h @@ -0,0 +1,59 @@ + + +#ifndef _OPENCL_CAST_H +#define _OPENCL_CAST_H + +// #include "opencl_misc.h" +#define GET_UINT32BE(n, b, i) \ + { \ + (n) = ((uint) (b)[(i)] << 24) \ + | ((uint) (b)[(i) + 1] << 16) \ + | ((uint) (b)[(i) + 2] << 8) \ + | ((uint) (b)[(i) + 3] ); \ + } +#define PUT_UINT32BE(n, b, i) \ + { \ + (b)[(i) ] = (u8) ((n) >> 24); \ + (b)[(i) + 1] = (u8) ((n) >> 16); \ + (b)[(i) + 2] = (u8) ((n) >> 8); \ + (b)[(i) + 3] = (u8) ((n) ); \ + } + +typedef struct { + u32 K[32]; +} CAST_KEY; + +#define GETBYTE(x, y) (uint)(u8)((x)>>(8*(y))) + +/* Macros to access 8-bit bytes out of a 32-bit word */ +#define U8a(x) GETBYTE(x,3) +#define U8b(x) GETBYTE(x,2) +#define U8c(x) GETBYTE(x,1) +#define U8d(x) GETBYTE(x,0) + +/* CAST uses three different round functions */ +#define _CAST_f1(l, r, km, kr) \ + t = hc_rotl32_S(km + r, kr); \ + l ^= ((s_S[0][U8a(t)] ^ s_S[1][U8b(t)]) - \ + s_S[2][U8c(t)]) + s_S[3][U8d(t)]; +#define _CAST_f2(l, r, km, kr) \ + t = hc_rotl32_S(km ^ r, kr); \ + l ^= ((s_S[0][U8a(t)] - s_S[1][U8b(t)]) + \ + s_S[2][U8c(t)]) ^ s_S[3][U8d(t)]; +#define _CAST_f3(l, r, km, kr) \ + t = hc_rotl32_S(km - r, kr); \ + l ^= ((s_S[0][U8a(t)] + s_S[1][U8b(t)]) ^ \ + s_S[2][U8c(t)]) - s_S[3][U8d(t)]; + +#define _CAST_F1(l, r, i, j) _CAST_f1(l, r, K[i], K[i+j]) +#define _CAST_F2(l, r, i, j) _CAST_f2(l, r, K[i], K[i+j]) +#define _CAST_F3(l, r, i, j) _CAST_f3(l, r, K[i], K[i+j]) + + +/* OpenSSL API compatibility */ +#define CAST_set_key(ckey, len, key) Cast5SetKey(ckey, len, key) +#define CAST_ecb_encrypt(in, out, ckey) Cast5Encrypt(in, out, ckey) +#define CAST_ecb_decrypt(in, out, ckey) Cast5Decrypt(in, out, ckey) + + +#endif /* _OPENCL_CAST_H */ diff --git a/OpenCL/inc_common.cl b/OpenCL/inc_common.cl index 0de9924ef..818b32e69 100644 --- a/OpenCL/inc_common.cl +++ b/OpenCL/inc_common.cl @@ -1317,6 +1317,16 @@ DECLSPEC u64x hc_swap64 (const u64x v) asm volatile ("mov.b64 %0, {%1, %2};" : "=l"(r.sf) : "r"(tr.sf), "r"(tl.sf)); #endif + #elif defined IS_METAL + + const u32x a0 = h32_from_64 (v); + const u32x a1 = l32_from_64 (v); + + u32x t0 = hc_swap32 (a0); + u32x t1 = hc_swap32 (a1); + + r = hl32_to_64 (t1, t0); + #else #if defined USE_BITSELECT && defined USE_ROTATE @@ -1380,7 +1390,19 @@ DECLSPEC u64 hc_swap64_S (const u64 v) asm volatile ("prmt.b32 %0, %1, 0, 0x0123;" : "=r"(tr) : "r"(ir)); asm volatile ("mov.b64 %0, {%1, %2};" : "=l"(r) : "r"(tr), "r"(tl)); + + #elif defined IS_METAL + + const u32 v0 = h32_from_64_S (v); + const u32 v1 = l32_from_64_S (v); + + u32 t0 = hc_swap32_S (v0); + u32 t1 = hc_swap32_S (v1); + + r = hl32_to_64_S (t1, t0); + #else + #ifdef USE_SWIZZLE r = as_ulong (as_uchar8 (v).s76543210); #else @@ -2793,6 +2815,11 @@ DECLSPEC int is_valid_base58_8 (const u8 v) if ((v > (u8) '9') && (v < (u8) 'A')) return 0; if ((v > (u8) 'Z') && (v < (u8) 'a')) return 0; + // https://github.com/hashcat/hashcat/issues/3878 + if (v == 'O') return 0; + if (v == 'I') return 0; + if (v == 'l') return 0; + return 1; } @@ -2965,6 +2992,24 @@ DECLSPEC int hc_execute_keyboard_layout_mapping (PRIVATE_AS u32 *w, const int pw return out_len; } +DECLSPEC int count_bits_32 (const u32 v0, const u32 v1) +{ + u32 r = v0 ^ v1; + + if (r == 0) return 0; + + // from https://stackoverflow.com/questions/109023/count-the-number-of-set-bits-in-a-32-bit-integer + + r = r - ((r >> 1) & 0x55555555); // add pairs of bits + r = (r & 0x33333333) + ((r >> 2) & 0x33333333); // quads + r = (r + (r >> 4)) & 0x0F0F0F0F; // groups of 8 + r *= 0x01010101; // horizontal sum of bytes + + // return just that top byte (after truncating to 32-bit even when int is wider than uint32_t) + + return r >> 24; +} + /** * vector functions */ diff --git a/OpenCL/inc_common.h b/OpenCL/inc_common.h index fd6cfb348..434de8866 100644 --- a/OpenCL/inc_common.h +++ b/OpenCL/inc_common.h @@ -11,7 +11,7 @@ * * There are four variables where major differences occur: * - * - P2: Adress space of kernel_rules_t struct. + * - P2: Address space of kernel_rules_t struct. * If the kernel uses rules_buf, it will be stored in CONSTANT_AS. * If it does not, cheaper GLOBAL_AS space is used. * @@ -315,6 +315,8 @@ DECLSPEC int is_valid_printable_8 (const u8 v); DECLSPEC int is_valid_printable_32 (const u32 v); DECLSPEC int hc_find_keyboard_layout_map (const u32 search, const int search_len, LOCAL_AS keyboard_layout_mapping_t *s_keyboard_layout_mapping_buf, const int keyboard_layout_mapping_cnt); DECLSPEC int hc_execute_keyboard_layout_mapping (PRIVATE_AS u32 *w, const int pw_len, LOCAL_AS keyboard_layout_mapping_t *s_keyboard_layout_mapping_buf, const int keyboard_layout_mapping_cnt); +DECLSPEC int count_bits_32 (const u32 v0, const u32 v1); + DECLSPEC void make_utf16be (PRIVATE_AS const u32x *in, PRIVATE_AS u32x *out1, PRIVATE_AS u32x *out2); DECLSPEC void make_utf16beN (PRIVATE_AS const u32x *in, PRIVATE_AS u32x *out1, PRIVATE_AS u32x *out2); DECLSPEC void make_utf16beN_S (PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out1, PRIVATE_AS u32 *out2); diff --git a/OpenCL/inc_comp_multi_iba.cl b/OpenCL/inc_comp_multi_iba.cl new file mode 100644 index 000000000..9a41cc17c --- /dev/null +++ b/OpenCL/inc_comp_multi_iba.cl @@ -0,0 +1,19 @@ + +for (int digest_pos = 0; digest_pos < DIGESTS_CNT; digest_pos++) +{ + const u32 final_hash_pos = DIGESTS_OFFSET_HOST + digest_pos; + + const digest_t *digest = digests_buf + final_hash_pos; + + const int invalid_bits = count_bits_32 (digest->digest_buf[0], r0) + + count_bits_32 (digest->digest_buf[1], r1) + + count_bits_32 (digest->digest_buf[2], r2) + + count_bits_32 (digest->digest_buf[3], r3); + + if (invalid_bits > invalid_bits_accept) continue; + + if (hc_atomic_inc (&hashes_shown[final_hash_pos]) == 0) + { + mark_hash (plains_buf, d_return_buf, SALT_POS_HOST, DIGESTS_CNT, digest_pos, final_hash_pos, gid, il_pos, 0, 0); + } +} diff --git a/OpenCL/inc_comp_multi_iba.h b/OpenCL/inc_comp_multi_iba.h new file mode 100644 index 000000000..e69de29bb diff --git a/OpenCL/inc_ecc_secp256k1.cl b/OpenCL/inc_ecc_secp256k1.cl index d5cf37f56..93e4c922b 100644 --- a/OpenCL/inc_ecc_secp256k1.cl +++ b/OpenCL/inc_ecc_secp256k1.cl @@ -1231,7 +1231,7 @@ DECLSPEC void point_double (PRIVATE_AS u32 *x, PRIVATE_AS u32 *y, PRIVATE_AS u32 * y3 = t3-t4 */ -DECLSPEC void point_add (PRIVATE_AS u32 *x1, PRIVATE_AS u32 *y1, PRIVATE_AS u32 *z1, PRIVATE_AS u32 *x2, PRIVATE_AS u32 *y2) // z2 = 1 +DECLSPEC void point_add (PRIVATE_AS u32 *x1, PRIVATE_AS u32 *y1, PRIVATE_AS u32 *z1, PRIVATE_AS const u32 *x2, PRIVATE_AS const u32 *y2) // z2 = 1 { // How often does this really happen? it should "almost" never happen (but would be safer) @@ -2024,7 +2024,7 @@ DECLSPEC void point_mul (PRIVATE_AS u32 *r, PRIVATE_AS const u32 *k, SECP256K1_T * @param r out: x and y coordinates. * @param x in: x coordinate which should be converted, a pointer to an u32 array with a size of 8. * @param first_byte in: The parity of the y coordinate, a u32. - * @return Returns 0 if successfull, returns 1 if x is greater than the basepoint. + * @return Returns 0 if successful, returns 1 if x is greater than the basepoint. */ DECLSPEC u32 transform_public (PRIVATE_AS secp256k1_t *r, PRIVATE_AS const u32 *x, const u32 first_byte) { @@ -2084,7 +2084,7 @@ DECLSPEC u32 transform_public (PRIVATE_AS secp256k1_t *r, PRIVATE_AS const u32 * * Parse a x coordinate with leading parity to secp256k1_t. * @param r out: x and y coordinates. * @param k in: x coordinate which should be converted with leading parity, a pointer to an u32 array with a size of 9. - * @return Returns 0 if successfull, returns 1 if x is greater than the basepoint or the parity has an unexpected value. + * @return Returns 0 if successful, returns 1 if x is greater than the basepoint or the parity has an unexpected value. */ DECLSPEC u32 parse_public (PRIVATE_AS secp256k1_t *r, PRIVATE_AS const u32 *k) { diff --git a/OpenCL/inc_hash_base58.cl b/OpenCL/inc_hash_base58.cl index 1396c6e07..ebebb73d9 100644 --- a/OpenCL/inc_hash_base58.cl +++ b/OpenCL/inc_hash_base58.cl @@ -69,8 +69,8 @@ DECLSPEC bool b58dec (PRIVATE_AS u8 *bin, PRIVATE_AS u32 *binszp, PRIVATE_AS con { u32 binsz = *binszp; - PRIVATE_AS const u8 *b58u = (PRIVATE_AS u8*) b58; - PRIVATE_AS u8 *binu = (PRIVATE_AS u8*) bin; + PRIVATE_AS const u8 *b58u = b58; + PRIVATE_AS u8 *binu = bin; u32 outisz = (binsz + sizeof (u32) - 1) / sizeof (u32); @@ -144,7 +144,7 @@ DECLSPEC bool b58dec (PRIVATE_AS u8 *bin, PRIVATE_AS u32 *binszp, PRIVATE_AS con // Count canonical base58 byte count - binu = (PRIVATE_AS u8*) bin; + binu = bin; for (u32 i = 0; i < binsz; i++) { @@ -255,7 +255,7 @@ DECLSPEC bool b58check (PRIVATE_AS const u8 *bin, PRIVATE_AS const u32 binsz) u32 data[64] = { 0 }; // 64 * 4 = 256 bytes (should be enough) PRIVATE_AS u8 *datac = (PRIVATE_AS u8*) data; - PRIVATE_AS u8 *binc = (PRIVATE_AS u8*) bin; + PRIVATE_AS const u8 *binc = bin; if (binsz < 4) return false; if (binsz > 256) return false; @@ -288,7 +288,7 @@ DECLSPEC bool b58check (PRIVATE_AS const u8 *bin, PRIVATE_AS const u32 binsz) ctx.h[0] = hc_swap32_S (ctx.h[0]); PRIVATE_AS u8 *ph4 = (PRIVATE_AS u8*) ctx.h; - PRIVATE_AS u8 *sum = (PRIVATE_AS u8*) (binc + (binsz - 4)); // offset: binsz - 4, last 4 bytes + PRIVATE_AS const u8 *sum = (binc + (binsz - 4)); // offset: binsz - 4, last 4 bytes if (ph4[0] != sum[0]) return false; if (ph4[1] != sum[1]) return false; @@ -547,7 +547,7 @@ DECLSPEC bool b58check_38 (PRIVATE_AS const u32 *bin) DECLSPEC bool b58enc (PRIVATE_AS u8 *b58, PRIVATE_AS u32 *b58sz, PRIVATE_AS const u8 *data, PRIVATE_AS const u32 binsz) { - PRIVATE_AS const u8 *bin = (PRIVATE_AS u8 *) data; + PRIVATE_AS const u8 *bin = data; int carry; u32 j = 0; @@ -578,7 +578,7 @@ DECLSPEC bool b58enc (PRIVATE_AS u8 *b58, PRIVATE_AS u32 *b58sz, PRIVATE_AS cons j = 0; - for (; j < (size && !buf[j]); j++) {} + for (; j < size && !buf[j]; j++) {} if (*b58sz <= zcount + size - j) { @@ -609,7 +609,7 @@ DECLSPEC bool b58check_enc (PRIVATE_AS u8 *b58c, PRIVATE_AS u32 *b58c_sz, PRIVAT u8 buf[128] = { 0 }; PRIVATE_AS u32 *buf32 = (PRIVATE_AS u32*) buf; - PRIVATE_AS u8 *data8 = (PRIVATE_AS u8 *) data; + PRIVATE_AS const u8 *data8 = data; PRIVATE_AS u8 *hash = &buf[1 + datasz]; @@ -641,7 +641,7 @@ DECLSPEC bool b58check_enc (PRIVATE_AS u8 *b58c, PRIVATE_AS u32 *b58c_sz, PRIVAT for (u32 i = 0; i < 4; i++) { - ((PRIVATE_AS u8 *) hash)[i] = ((PRIVATE_AS u8 *) ctx.h)[i]; + (hash)[i] = ((PRIVATE_AS u8 *) ctx.h)[i]; } return b58enc (b58c, b58c_sz, buf, 1 + datasz + 4); diff --git a/OpenCL/inc_hash_whirlpool.cl b/OpenCL/inc_hash_whirlpool.cl index a6f2ff09d..7fc9aeab0 100644 --- a/OpenCL/inc_hash_whirlpool.cl +++ b/OpenCL/inc_hash_whirlpool.cl @@ -636,7 +636,7 @@ CONSTANT_VK u64a MT7[256] = S7 = L7 ^ K7; \ } -DECLSPEC void whirlpool_transform (PRIVATE_AS const u32 *w0, PRIVATE_AS const u32 *w1, PRIVATE_AS const u32 *w2, PRIVATE_AS const u32 *w3, PRIVATE_AS u32 *digest, SHM_TYPE u64 *s_MT0, SHM_TYPE u64 *s_MT1, SHM_TYPE u64 *s_MT2, SHM_TYPE u64 *s_MT3, SHM_TYPE u64 *s_MT4, SHM_TYPE u64 *s_MT5, SHM_TYPE u64 *s_MT6, SHM_TYPE u64 *s_MT7) +DECLSPEC void whirlpool_transform (PRIVATE_AS const u32 *w0, PRIVATE_AS const u32 *w1, PRIVATE_AS const u32 *w2, PRIVATE_AS const u32 *w3, PRIVATE_AS u32 *digest, SHM_TYPE const u64 *s_MT0, SHM_TYPE const u64 *s_MT1, SHM_TYPE const u64 *s_MT2, SHM_TYPE const u64 *s_MT3, SHM_TYPE const u64 *s_MT4, SHM_TYPE const u64 *s_MT5, SHM_TYPE const u64 *s_MT6, SHM_TYPE const u64 *s_MT7) { u64 W0 = hl32_to_64_S (w0[0], w0[1]); u64 W1 = hl32_to_64_S (w0[2], w0[3]); @@ -2019,7 +2019,7 @@ DECLSPEC void whirlpool_hmac_final (PRIVATE_AS whirlpool_hmac_ctx_t *ctx) S7 = L7 ^ K7; \ } -DECLSPEC void whirlpool_transform_vector (PRIVATE_AS const u32x *w0, PRIVATE_AS const u32x *w1, PRIVATE_AS const u32x *w2, PRIVATE_AS const u32x *w3, PRIVATE_AS u32x *digest, SHM_TYPE u64 *s_MT0, SHM_TYPE u64 *s_MT1, SHM_TYPE u64 *s_MT2, SHM_TYPE u64 *s_MT3, SHM_TYPE u64 *s_MT4, SHM_TYPE u64 *s_MT5, SHM_TYPE u64 *s_MT6, SHM_TYPE u64 *s_MT7) +DECLSPEC void whirlpool_transform_vector (PRIVATE_AS const u32x *w0, PRIVATE_AS const u32x *w1, PRIVATE_AS const u32x *w2, PRIVATE_AS const u32x *w3, PRIVATE_AS u32x *digest, SHM_TYPE const u64 *s_MT0, SHM_TYPE const u64 *s_MT1, SHM_TYPE const u64 *s_MT2, SHM_TYPE const u64 *s_MT3, SHM_TYPE const u64 *s_MT4, SHM_TYPE const u64 *s_MT5, SHM_TYPE const u64 *s_MT6, SHM_TYPE const u64 *s_MT7) { u64x W0 = hl32_to_64 (w0[0], w0[1]); u64x W1 = hl32_to_64 (w0[2], w0[3]); diff --git a/OpenCL/inc_hash_whirlpool.h b/OpenCL/inc_hash_whirlpool.h index 02fc4e350..b34d20f78 100644 --- a/OpenCL/inc_hash_whirlpool.h +++ b/OpenCL/inc_hash_whirlpool.h @@ -84,7 +84,7 @@ typedef struct whirlpool_hmac_ctx_vector } whirlpool_hmac_ctx_vector_t; -DECLSPEC void whirlpool_transform (PRIVATE_AS const u32 *w0, PRIVATE_AS const u32 *w1, PRIVATE_AS const u32 *w2, PRIVATE_AS const u32 *w3, PRIVATE_AS u32 *digest, SHM_TYPE u64 *s_MT0, SHM_TYPE u64 *s_MT1, SHM_TYPE u64 *s_MT2, SHM_TYPE u64 *s_MT3, SHM_TYPE u64 *s_MT4, SHM_TYPE u64 *s_MT5, SHM_TYPE u64 *s_MT6, SHM_TYPE u64 *s_MT7); +DECLSPEC void whirlpool_transform (PRIVATE_AS const u32 *w0, PRIVATE_AS const u32 *w1, PRIVATE_AS const u32 *w2, PRIVATE_AS const u32 *w3, PRIVATE_AS u32 *digest, SHM_TYPE const u64 *s_MT0, SHM_TYPE const u64 *s_MT1, SHM_TYPE const u64 *s_MT2, SHM_TYPE const u64 *s_MT3, SHM_TYPE const u64 *s_MT4, SHM_TYPE const u64 *s_MT5, SHM_TYPE const u64 *s_MT6, SHM_TYPE const u64 *s_MT7); DECLSPEC void whirlpool_init (PRIVATE_AS whirlpool_ctx_t *ctx, SHM_TYPE u64 *s_MT0, SHM_TYPE u64 *s_MT1, SHM_TYPE u64 *s_MT2, SHM_TYPE u64 *s_MT3, SHM_TYPE u64 *s_MT4, SHM_TYPE u64 *s_MT5, SHM_TYPE u64 *s_MT6, SHM_TYPE u64 *s_MT7); DECLSPEC void whirlpool_update_64 (PRIVATE_AS whirlpool_ctx_t *ctx, PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w2, PRIVATE_AS u32 *w3, const int len); DECLSPEC void whirlpool_update (PRIVATE_AS whirlpool_ctx_t *ctx, PRIVATE_AS const u32 *w, const int len); @@ -111,7 +111,7 @@ DECLSPEC void whirlpool_hmac_update_global_swap (PRIVATE_AS whirlpool_hmac_ctx_t DECLSPEC void whirlpool_hmac_update_global_utf16le (PRIVATE_AS whirlpool_hmac_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len); DECLSPEC void whirlpool_hmac_update_global_utf16le_swap (PRIVATE_AS whirlpool_hmac_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len); DECLSPEC void whirlpool_hmac_final (PRIVATE_AS whirlpool_hmac_ctx_t *ctx); -DECLSPEC void whirlpool_transform_vector (PRIVATE_AS const u32x *w0, PRIVATE_AS const u32x *w1, PRIVATE_AS const u32x *w2, PRIVATE_AS const u32x *w3, PRIVATE_AS u32x *digest, SHM_TYPE u64 *s_MT0, SHM_TYPE u64 *s_MT1, SHM_TYPE u64 *s_MT2, SHM_TYPE u64 *s_MT3, SHM_TYPE u64 *s_MT4, SHM_TYPE u64 *s_MT5, SHM_TYPE u64 *s_MT6, SHM_TYPE u64 *s_MT7); +DECLSPEC void whirlpool_transform_vector (PRIVATE_AS const u32x *w0, PRIVATE_AS const u32x *w1, PRIVATE_AS const u32x *w2, PRIVATE_AS const u32x *w3, PRIVATE_AS u32x *digest, SHM_TYPE const u64 *s_MT0, SHM_TYPE const u64 *s_MT1, SHM_TYPE const u64 *s_MT2, SHM_TYPE const u64 *s_MT3, SHM_TYPE const u64 *s_MT4, SHM_TYPE const u64 *s_MT5, SHM_TYPE const u64 *s_MT6, SHM_TYPE const u64 *s_MT7); DECLSPEC void whirlpool_init_vector (PRIVATE_AS whirlpool_ctx_vector_t *ctx, SHM_TYPE u64 *s_MT0, SHM_TYPE u64 *s_MT1, SHM_TYPE u64 *s_MT2, SHM_TYPE u64 *s_MT3, SHM_TYPE u64 *s_MT4, SHM_TYPE u64 *s_MT5, SHM_TYPE u64 *s_MT6, SHM_TYPE u64 *s_MT7); DECLSPEC void whirlpool_init_vector_from_scalar (PRIVATE_AS whirlpool_ctx_vector_t *ctx, PRIVATE_AS whirlpool_ctx_t *ctx0); DECLSPEC void whirlpool_update_vector_64 (PRIVATE_AS whirlpool_ctx_vector_t *ctx, PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS u32x *w2, PRIVATE_AS u32x *w3, const int len); diff --git a/OpenCL/inc_types.h b/OpenCL/inc_types.h index 63dc5815d..4d7b937d5 100644 --- a/OpenCL/inc_types.h +++ b/OpenCL/inc_types.h @@ -112,6 +112,15 @@ typedef u64 u64x; #if defined IS_CUDA || defined IS_HIP +#ifndef __device_builtin__ +#define __device_builtin__ +#endif + +#ifndef __builtin_align__ +#define __builtin_align__(x) +#endif + + #if VECT_SIZE == 2 struct __device_builtin__ __builtin_align__(2) u8x diff --git a/OpenCL/m02500-pure.cl b/OpenCL/m02500-pure.cl index 06deaf856..80bc26bdc 100644 --- a/OpenCL/m02500-pure.cl +++ b/OpenCL/m02500-pure.cl @@ -92,7 +92,7 @@ DECLSPEC void make_kn (PRIVATE_AS u32 *k) k[3] ^= c * 0x87000000; } -DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS u32x *w2, PRIVATE_AS u32x *w3, PRIVATE_AS u32x *ipad, PRIVATE_AS u32x *opad, PRIVATE_AS u32x *digest) +DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS u32x *w2, PRIVATE_AS u32x *w3, PRIVATE_AS const u32x *ipad, PRIVATE_AS const u32x *opad, PRIVATE_AS u32x *digest) { digest[0] = ipad[0]; digest[1] = ipad[1]; diff --git a/OpenCL/m02630_a0-optimized.cl b/OpenCL/m02630_a0-optimized.cl new file mode 100644 index 000000000..ceb71f299 --- /dev/null +++ b/OpenCL/m02630_a0-optimized.cl @@ -0,0 +1,744 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_rp_optimized.h) +#include M2S(INCLUDE_PATH/inc_rp_optimized.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +KERNEL_FQ void m02630_m04 (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + salt_buf0[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 3]; + salt_buf1[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 7]; + salt_buf2[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[SALT_POS_HOST].salt_buf[10]; + salt_buf2[3] = salt_bufs[SALT_POS_HOST].salt_buf[11]; + salt_buf3[0] = salt_bufs[SALT_POS_HOST].salt_buf[12]; + salt_buf3[1] = salt_bufs[SALT_POS_HOST].salt_buf[13]; + salt_buf3[2] = salt_bufs[SALT_POS_HOST].salt_buf[14]; + salt_buf3[3] = salt_bufs[SALT_POS_HOST].salt_buf[15]; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + u32x w0[4] = { 0 }; + u32x w1[4] = { 0 }; + u32x w2[4] = { 0 }; + u32x w3[4] = { 0 }; + + const u32x out_len = apply_rules_vect_optimized (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); + + /** + * append salt + */ + + u32x s0[4]; + u32x s1[4]; + u32x s2[4]; + u32x s3[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + s2[0] = salt_buf2[0]; + s2[1] = salt_buf2[1]; + s2[2] = salt_buf2[2]; + s2[3] = salt_buf2[3]; + s3[0] = salt_buf3[0]; + s3[1] = salt_buf3[1]; + s3[2] = salt_buf3[2]; + s3[3] = salt_buf3[3]; + + switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len); + + const u32x pw_salt_len = out_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] |= s3[2]; + w3[3] |= s3[3]; + + /** + * md5 + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = pw_salt_len * 8; + u32x wf_t = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + a += make_u32x (MD5M_A); + b += make_u32x (MD5M_B); + c += make_u32x (MD5M_C); + d += make_u32x (MD5M_D); + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + w8_t = 0x80; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 32 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + COMPARE_M_SIMD (a, d, c, b); + } +} + +KERNEL_FQ void m02630_m08 (KERN_ATTR_RULES ()) +{ +} + +KERNEL_FQ void m02630_m16 (KERN_ATTR_RULES ()) +{ +} + +KERNEL_FQ void m02630_s04 (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + salt_buf0[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 3]; + salt_buf1[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 7]; + salt_buf2[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[SALT_POS_HOST].salt_buf[10]; + salt_buf2[3] = salt_bufs[SALT_POS_HOST].salt_buf[11]; + salt_buf3[0] = salt_bufs[SALT_POS_HOST].salt_buf[12]; + salt_buf3[1] = salt_bufs[SALT_POS_HOST].salt_buf[13]; + salt_buf3[2] = salt_bufs[SALT_POS_HOST].salt_buf[14]; + salt_buf3[3] = salt_bufs[SALT_POS_HOST].salt_buf[15]; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + u32x w0[4] = { 0 }; + u32x w1[4] = { 0 }; + u32x w2[4] = { 0 }; + u32x w3[4] = { 0 }; + + const u32x out_len = apply_rules_vect_optimized (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); + + /** + * append salt + */ + + u32x s0[4]; + u32x s1[4]; + u32x s2[4]; + u32x s3[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + s2[0] = salt_buf2[0]; + s2[1] = salt_buf2[1]; + s2[2] = salt_buf2[2]; + s2[3] = salt_buf2[3]; + s3[0] = salt_buf3[0]; + s3[1] = salt_buf3[1]; + s3[2] = salt_buf3[2]; + s3[3] = salt_buf3[3]; + + switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len); + + const u32x pw_salt_len = out_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] |= s3[2]; + w3[3] |= s3[3]; + + /** + * md5 + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = pw_salt_len * 8; + u32x wf_t = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + a += make_u32x (MD5M_A); + b += make_u32x (MD5M_B); + c += make_u32x (MD5M_C); + d += make_u32x (MD5M_D); + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + w8_t = 0x80; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 32 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + + if (MATCHES_NONE_VS (a, search[0])) continue; + + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + COMPARE_S_SIMD (a, d, c, b); + } +} + +KERNEL_FQ void m02630_s08 (KERN_ATTR_RULES ()) +{ +} + +KERNEL_FQ void m02630_s16 (KERN_ATTR_RULES ()) +{ +} diff --git a/OpenCL/m02630_a0-pure.cl b/OpenCL/m02630_a0-pure.cl new file mode 100644 index 000000000..6c691a526 --- /dev/null +++ b/OpenCL/m02630_a0-pure.cl @@ -0,0 +1,259 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_rp.h) +#include M2S(INCLUDE_PATH/inc_rp.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +KERNEL_FQ void m02630_mxx (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + COPY_PW (pws[gid]); + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = salt_bufs[SALT_POS_HOST].salt_buf[idx]; + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + pw_t tmp = PASTE_PW; + + tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); + + md5_ctx_t ctx0; + + md5_init (&ctx0); + + md5_update (&ctx0, tmp.i, tmp.pw_len); + + md5_update (&ctx0, s, salt_len); + + md5_final (&ctx0); + + const u32 a = ctx0.h[0]; + const u32 b = ctx0.h[1]; + const u32 c = ctx0.h[2]; + const u32 d = ctx0.h[3]; + + md5_ctx_t ctx; + + md5_init (&ctx); + + ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + ctx.w2[0] = 0x80; + ctx.w2[1] = 0; + ctx.w2[2] = 0; + ctx.w2[3] = 0; + ctx.w3[0] = 0; + ctx.w3[1] = 0; + ctx.w3[2] = 32 * 8; + ctx.w3[3] = 0; + + md5_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_M_SCALAR (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m02630_sxx (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + COPY_PW (pws[gid]); + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = salt_bufs[SALT_POS_HOST].salt_buf[idx]; + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + pw_t tmp = PASTE_PW; + + tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); + + md5_ctx_t ctx0; + + md5_init (&ctx0); + + md5_update (&ctx0, tmp.i, tmp.pw_len); + + md5_update (&ctx0, s, salt_len); + + md5_final (&ctx0); + + const u32 a = ctx0.h[0]; + const u32 b = ctx0.h[1]; + const u32 c = ctx0.h[2]; + const u32 d = ctx0.h[3]; + + md5_ctx_t ctx; + + md5_init (&ctx); + + ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + ctx.w2[0] = 0x80; + ctx.w2[1] = 0; + ctx.w2[2] = 0; + ctx.w2[3] = 0; + ctx.w3[0] = 0; + ctx.w3[1] = 0; + ctx.w3[2] = 32 * 8; + ctx.w3[3] = 0; + + md5_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_S_SCALAR (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m02630_a1-optimized.cl b/OpenCL/m02630_a1-optimized.cl new file mode 100644 index 000000000..7f6971c8d --- /dev/null +++ b/OpenCL/m02630_a1-optimized.cl @@ -0,0 +1,862 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +KERNEL_FQ void m02630_m04 (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_l_len = pws[gid].pw_len & 63; + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + salt_buf0[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 3]; + salt_buf1[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 7]; + salt_buf2[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[SALT_POS_HOST].salt_buf[10]; + salt_buf2[3] = salt_bufs[SALT_POS_HOST].salt_buf[11]; + salt_buf3[0] = salt_bufs[SALT_POS_HOST].salt_buf[12]; + salt_buf3[1] = salt_bufs[SALT_POS_HOST].salt_buf[13]; + salt_buf3[2] = salt_bufs[SALT_POS_HOST].salt_buf[14]; + salt_buf3[3] = salt_bufs[SALT_POS_HOST].salt_buf[15]; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos) & 63; + + const u32x pw_len = (pw_l_len + pw_r_len) & 63; + + /** + * concat password candidate + */ + + u32x wordl0[4] = { 0 }; + u32x wordl1[4] = { 0 }; + u32x wordl2[4] = { 0 }; + u32x wordl3[4] = { 0 }; + + wordl0[0] = pw_buf0[0]; + wordl0[1] = pw_buf0[1]; + wordl0[2] = pw_buf0[2]; + wordl0[3] = pw_buf0[3]; + wordl1[0] = pw_buf1[0]; + wordl1[1] = pw_buf1[1]; + wordl1[2] = pw_buf1[2]; + wordl1[3] = pw_buf1[3]; + + u32x wordr0[4] = { 0 }; + u32x wordr1[4] = { 0 }; + u32x wordr2[4] = { 0 }; + u32x wordr3[4] = { 0 }; + + wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); + wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); + wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); + wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); + wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); + wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); + wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); + wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); + + if (COMBS_MODE == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + else + { + switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * append salt + */ + + u32x s0[4]; + u32x s1[4]; + u32x s2[4]; + u32x s3[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + s2[0] = salt_buf2[0]; + s2[1] = salt_buf2[1]; + s2[2] = salt_buf2[2]; + s2[3] = salt_buf2[3]; + s3[0] = salt_buf3[0]; + s3[1] = salt_buf3[1]; + s3[2] = salt_buf3[2]; + s3[3] = salt_buf3[3]; + + switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len); + + const u32x pw_salt_len = pw_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] |= s3[2]; + w3[3] |= s3[3]; + + /** + * md5 + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = pw_salt_len * 8; + u32x wf_t = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + a += make_u32x (MD5M_A); + b += make_u32x (MD5M_B); + c += make_u32x (MD5M_C); + d += make_u32x (MD5M_D); + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + w8_t = 0x80; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 32 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + COMPARE_M_SIMD (a, d, c, b); + } +} + +KERNEL_FQ void m02630_m08 (KERN_ATTR_BASIC ()) +{ +} + +KERNEL_FQ void m02630_m16 (KERN_ATTR_BASIC ()) +{ +} + +KERNEL_FQ void m02630_s04 (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_l_len = pws[gid].pw_len & 63; + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + salt_buf0[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 3]; + salt_buf1[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 7]; + salt_buf2[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[SALT_POS_HOST].salt_buf[10]; + salt_buf2[3] = salt_bufs[SALT_POS_HOST].salt_buf[11]; + salt_buf3[0] = salt_bufs[SALT_POS_HOST].salt_buf[12]; + salt_buf3[1] = salt_bufs[SALT_POS_HOST].salt_buf[13]; + salt_buf3[2] = salt_bufs[SALT_POS_HOST].salt_buf[14]; + salt_buf3[3] = salt_bufs[SALT_POS_HOST].salt_buf[15]; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos) & 63; + + const u32x pw_len = (pw_l_len + pw_r_len) & 63; + + /** + * concat password candidate + */ + + u32x wordl0[4] = { 0 }; + u32x wordl1[4] = { 0 }; + u32x wordl2[4] = { 0 }; + u32x wordl3[4] = { 0 }; + + wordl0[0] = pw_buf0[0]; + wordl0[1] = pw_buf0[1]; + wordl0[2] = pw_buf0[2]; + wordl0[3] = pw_buf0[3]; + wordl1[0] = pw_buf1[0]; + wordl1[1] = pw_buf1[1]; + wordl1[2] = pw_buf1[2]; + wordl1[3] = pw_buf1[3]; + + u32x wordr0[4] = { 0 }; + u32x wordr1[4] = { 0 }; + u32x wordr2[4] = { 0 }; + u32x wordr3[4] = { 0 }; + + wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); + wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); + wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); + wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); + wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); + wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); + wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); + wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); + + if (COMBS_MODE == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + else + { + switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * append salt + */ + + u32x s0[4]; + u32x s1[4]; + u32x s2[4]; + u32x s3[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + s2[0] = salt_buf2[0]; + s2[1] = salt_buf2[1]; + s2[2] = salt_buf2[2]; + s2[3] = salt_buf2[3]; + s3[0] = salt_buf3[0]; + s3[1] = salt_buf3[1]; + s3[2] = salt_buf3[2]; + s3[3] = salt_buf3[3]; + + switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len); + + const u32x pw_salt_len = pw_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] |= s3[2]; + w3[3] |= s3[3]; + + /** + * md5 + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = pw_salt_len * 8; + u32x wf_t = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + a += make_u32x (MD5M_A); + b += make_u32x (MD5M_B); + c += make_u32x (MD5M_C); + d += make_u32x (MD5M_D); + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + w8_t = 0x80; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 32 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + + if (MATCHES_NONE_VS (a, search[0])) continue; + + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + COMPARE_S_SIMD (a, d, c, b); + } +} + +KERNEL_FQ void m02630_s08 (KERN_ATTR_BASIC ()) +{ +} + +KERNEL_FQ void m02630_s16 (KERN_ATTR_BASIC ()) +{ +} diff --git a/OpenCL/m02630_a1-pure.cl b/OpenCL/m02630_a1-pure.cl new file mode 100644 index 000000000..1157dd7d7 --- /dev/null +++ b/OpenCL/m02630_a1-pure.cl @@ -0,0 +1,257 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +KERNEL_FQ void m02630_mxx (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = salt_bufs[SALT_POS_HOST].salt_buf[idx]; + } + + md5_ctx_t ctx0; + + md5_init (&ctx0); + + md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + md5_ctx_t ctx1 = ctx0; + + md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); + + md5_update (&ctx1, s, salt_len); + + md5_final (&ctx1); + + const u32 a = ctx1.h[0]; + const u32 b = ctx1.h[1]; + const u32 c = ctx1.h[2]; + const u32 d = ctx1.h[3]; + + md5_ctx_t ctx; + + md5_init (&ctx); + + ctx.len = 32; + + ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + ctx.w2[0] = 0x80; + ctx.w2[1] = 0; + ctx.w2[2] = 0; + ctx.w2[3] = 0; + ctx.w3[0] = 0; + ctx.w3[1] = 0; + ctx.w3[2] = 32 * 8; + ctx.w3[3] = 0; + + md5_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_M_SCALAR (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m02630_sxx (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = salt_bufs[SALT_POS_HOST].salt_buf[idx]; + } + + md5_ctx_t ctx0; + + md5_init (&ctx0); + + md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + md5_ctx_t ctx1 = ctx0; + + md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); + + md5_update (&ctx1, s, salt_len); + + md5_final (&ctx1); + + const u32 a = ctx1.h[0]; + const u32 b = ctx1.h[1]; + const u32 c = ctx1.h[2]; + const u32 d = ctx1.h[3]; + + md5_ctx_t ctx; + + md5_init (&ctx); + + ctx.len = 32; + + ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + ctx.w2[0] = 0x80; + ctx.w2[1] = 0; + ctx.w2[2] = 0; + ctx.w2[3] = 0; + ctx.w3[0] = 0; + ctx.w3[1] = 0; + ctx.w3[2] = 32 * 8; + ctx.w3[3] = 0; + + md5_transform (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_S_SCALAR (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m02630_a3-optimized.cl b/OpenCL/m02630_a3-optimized.cl new file mode 100644 index 000000000..aa12d6a94 --- /dev/null +++ b/OpenCL/m02630_a3-optimized.cl @@ -0,0 +1,1063 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha1.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +DECLSPEC void m02630m (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w2, PRIVATE_AS u32 *w3, const u32 pw_len, KERN_ATTR_FUNC_BASIC (), LOCAL_AS u32 *l_bin2asc) +{ + /** + * modifiers are taken from args + */ + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + salt_buf0[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 3]; + salt_buf1[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 7]; + salt_buf2[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[SALT_POS_HOST].salt_buf[10]; + salt_buf2[3] = salt_bufs[SALT_POS_HOST].salt_buf[11]; + salt_buf3[0] = salt_bufs[SALT_POS_HOST].salt_buf[12]; + salt_buf3[1] = salt_bufs[SALT_POS_HOST].salt_buf[13]; + salt_buf3[2] = salt_bufs[SALT_POS_HOST].salt_buf[14]; + salt_buf3[3] = salt_bufs[SALT_POS_HOST].salt_buf[15]; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * append salt + */ + + u32 salt_buf0_t[4]; + u32 salt_buf1_t[4]; + u32 salt_buf2_t[4]; + u32 salt_buf3_t[4]; + + salt_buf0_t[0] = salt_buf0[0]; + salt_buf0_t[1] = salt_buf0[1]; + salt_buf0_t[2] = salt_buf0[2]; + salt_buf0_t[3] = salt_buf0[3]; + salt_buf1_t[0] = salt_buf1[0]; + salt_buf1_t[1] = salt_buf1[1]; + salt_buf1_t[2] = salt_buf1[2]; + salt_buf1_t[3] = salt_buf1[3]; + salt_buf2_t[0] = salt_buf2[0]; + salt_buf2_t[1] = salt_buf2[1]; + salt_buf2_t[2] = salt_buf2[2]; + salt_buf2_t[3] = salt_buf2[3]; + salt_buf3_t[0] = salt_buf3[0]; + salt_buf3_t[1] = salt_buf3[1]; + salt_buf3_t[2] = salt_buf3[2]; + salt_buf3_t[3] = salt_buf3[3]; + + switch_buffer_by_offset_le_S (salt_buf0_t, salt_buf1_t, salt_buf2_t, salt_buf3_t, pw_len); + + w0[0] |= salt_buf0_t[0]; + w0[1] |= salt_buf0_t[1]; + w0[2] |= salt_buf0_t[2]; + w0[3] |= salt_buf0_t[3]; + w1[0] |= salt_buf1_t[0]; + w1[1] |= salt_buf1_t[1]; + w1[2] |= salt_buf1_t[2]; + w1[3] |= salt_buf1_t[3]; + w2[0] |= salt_buf2_t[0]; + w2[1] |= salt_buf2_t[1]; + w2[2] |= salt_buf2_t[2]; + w2[3] |= salt_buf2_t[3]; + w3[0] |= salt_buf3_t[0]; + w3[1] |= salt_buf3_t[1]; + w3[2] = pw_salt_len * 8; + w3[3] = 0; + + /** + * loop + */ + + u32 w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = ix_create_bft (bfs_buf, il_pos); + + const u32x w0lr = w0l | w0r; + + /** + * md5 + */ + + u32x w0_t = w0lr; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + a += make_u32x (MD5M_A); + b += make_u32x (MD5M_B); + c += make_u32x (MD5M_C); + d += make_u32x (MD5M_D); + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + w8_t = 0x80; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 32 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + COMPARE_M_SIMD (a, d, c, b); + } +} + +DECLSPEC void m02630s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w2, PRIVATE_AS u32 *w3, const u32 pw_len, KERN_ATTR_FUNC_BASIC (), LOCAL_AS u32 *l_bin2asc) +{ + /** + * modifiers are taken from args + */ + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + salt_buf0[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 3]; + salt_buf1[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 7]; + salt_buf2[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[SALT_POS_HOST].salt_buf[10]; + salt_buf2[3] = salt_bufs[SALT_POS_HOST].salt_buf[11]; + salt_buf3[0] = salt_bufs[SALT_POS_HOST].salt_buf[12]; + salt_buf3[1] = salt_bufs[SALT_POS_HOST].salt_buf[13]; + salt_buf3[2] = salt_bufs[SALT_POS_HOST].salt_buf[14]; + salt_buf3[3] = salt_bufs[SALT_POS_HOST].salt_buf[15]; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * append salt + */ + + u32 salt_buf0_t[4]; + u32 salt_buf1_t[4]; + u32 salt_buf2_t[4]; + u32 salt_buf3_t[4]; + + salt_buf0_t[0] = salt_buf0[0]; + salt_buf0_t[1] = salt_buf0[1]; + salt_buf0_t[2] = salt_buf0[2]; + salt_buf0_t[3] = salt_buf0[3]; + salt_buf1_t[0] = salt_buf1[0]; + salt_buf1_t[1] = salt_buf1[1]; + salt_buf1_t[2] = salt_buf1[2]; + salt_buf1_t[3] = salt_buf1[3]; + salt_buf2_t[0] = salt_buf2[0]; + salt_buf2_t[1] = salt_buf2[1]; + salt_buf2_t[2] = salt_buf2[2]; + salt_buf2_t[3] = salt_buf2[3]; + salt_buf3_t[0] = salt_buf3[0]; + salt_buf3_t[1] = salt_buf3[1]; + salt_buf3_t[2] = salt_buf3[2]; + salt_buf3_t[3] = salt_buf3[3]; + + switch_buffer_by_offset_le_S (salt_buf0_t, salt_buf1_t, salt_buf2_t, salt_buf3_t, pw_len); + + w0[0] |= salt_buf0_t[0]; + w0[1] |= salt_buf0_t[1]; + w0[2] |= salt_buf0_t[2]; + w0[3] |= salt_buf0_t[3]; + w1[0] |= salt_buf1_t[0]; + w1[1] |= salt_buf1_t[1]; + w1[2] |= salt_buf1_t[2]; + w1[3] |= salt_buf1_t[3]; + w2[0] |= salt_buf2_t[0]; + w2[1] |= salt_buf2_t[1]; + w2[2] |= salt_buf2_t[2]; + w2[3] |= salt_buf2_t[3]; + w3[0] |= salt_buf3_t[0]; + w3[1] |= salt_buf3_t[1]; + w3[2] = pw_salt_len * 8; + w3[3] = 0; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32 w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = ix_create_bft (bfs_buf, il_pos); + + const u32x w0lr = w0l | w0r; + + /** + * md5 + */ + + u32x w0_t = w0lr; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + a += make_u32x (MD5M_A); + b += make_u32x (MD5M_B); + c += make_u32x (MD5M_C); + d += make_u32x (MD5M_D); + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + w8_t = 0x80; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 32 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + + if (MATCHES_NONE_VS (a, search[0])) continue; + + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + COMPARE_S_SIMD (a, d, c, b); + } +} + +KERNEL_FQ void m02630_m04 (KERN_ATTR_BASIC ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32 w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32 w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m02630m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m02630_m08 (KERN_ATTR_BASIC ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32 w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32 w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m02630m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m02630_m16 (KERN_ATTR_BASIC ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32 w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32 w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m02630m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m02630_s04 (KERN_ATTR_BASIC ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32 w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32 w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m02630s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m02630_s08 (KERN_ATTR_BASIC ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32 w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32 w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m02630s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m02630_s16 (KERN_ATTR_BASIC ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32 w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32 w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m02630s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} diff --git a/OpenCL/m02630_a3-pure.cl b/OpenCL/m02630_a3-pure.cl new file mode 100644 index 000000000..51c5fb3af --- /dev/null +++ b/OpenCL/m02630_a3-pure.cl @@ -0,0 +1,283 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +KERNEL_FQ void m02630_mxx (KERN_ATTR_VECTOR ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + const u32 pw_len = pws[gid].pw_len; + + u32x w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32x s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = salt_bufs[SALT_POS_HOST].salt_buf[idx]; + } + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0lr = w0l | w0r; + + w[0] = w0lr; + + md5_ctx_vector_t ctx0; + + md5_init_vector (&ctx0); + + md5_update_vector (&ctx0, w, pw_len); + + md5_update_vector (&ctx0, s, salt_len); + + md5_final_vector (&ctx0); + + const u32x a = ctx0.h[0]; + const u32x b = ctx0.h[1]; + const u32x c = ctx0.h[2]; + const u32x d = ctx0.h[3]; + + md5_ctx_vector_t ctx; + + md5_init_vector (&ctx); + + ctx.len = 32; + + ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + ctx.w2[0] = 0x80; + ctx.w2[1] = 0; + ctx.w2[2] = 0; + ctx.w2[3] = 0; + ctx.w3[0] = 0; + ctx.w3[1] = 0; + ctx.w3[2] = 32 * 8; + ctx.w3[3] = 0; + + md5_transform_vector (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); + + const u32x r0 = ctx.h[DGST_R0]; + const u32x r1 = ctx.h[DGST_R1]; + const u32x r2 = ctx.h[DGST_R2]; + const u32x r3 = ctx.h[DGST_R3]; + + COMPARE_M_SIMD (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m02630_sxx (KERN_ATTR_VECTOR ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + const u32 pw_len = pws[gid].pw_len; + + u32x w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32x s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = salt_bufs[SALT_POS_HOST].salt_buf[idx]; + } + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0lr = w0l | w0r; + + w[0] = w0lr; + + md5_ctx_vector_t ctx0; + + md5_init_vector (&ctx0); + + md5_update_vector (&ctx0, w, pw_len); + + md5_update_vector (&ctx0, s, salt_len); + + md5_final_vector (&ctx0); + + const u32x a = ctx0.h[0]; + const u32x b = ctx0.h[1]; + const u32x c = ctx0.h[2]; + const u32x d = ctx0.h[3]; + + md5_ctx_vector_t ctx; + + md5_init_vector (&ctx); + + ctx.len = 32; + + ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + ctx.w2[0] = 0x80; + ctx.w2[1] = 0; + ctx.w2[2] = 0; + ctx.w2[3] = 0; + ctx.w3[0] = 0; + ctx.w3[1] = 0; + ctx.w3[2] = 32 * 8; + ctx.w3[3] = 0; + + md5_transform_vector (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); + + const u32x r0 = ctx.h[DGST_R0]; + const u32x r1 = ctx.h[DGST_R1]; + const u32x r2 = ctx.h[DGST_R2]; + const u32x r3 = ctx.h[DGST_R3]; + + COMPARE_S_SIMD (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m03200-pure.cl b/OpenCL/m03200-pure.cl index 6f522ee8d..2828908d7 100644 --- a/OpenCL/m03200-pure.cl +++ b/OpenCL/m03200-pure.cl @@ -339,7 +339,7 @@ DECLSPEC void SET_KEY32 (LOCAL_AS u32 *S, const u64 key, const u32 val) #else -// access pattern: linear access with S offset already set to right offset based on thread ID saving it from compuation +// access pattern: linear access with S offset already set to right offset based on thread ID saving it from computation // makes sense if there are not thread ID's (for instance on CPU) DECLSPEC inline u32 GET_KEY32 (LOCAL_AS u32 *S, const u64 key) diff --git a/OpenCL/m03610_a0-optimized.cl b/OpenCL/m03610_a0-optimized.cl index a2957f1e5..7829bf6fd 100644 --- a/OpenCL/m03610_a0-optimized.cl +++ b/OpenCL/m03610_a0-optimized.cl @@ -217,7 +217,7 @@ KERNEL_FQ void m03610_m04 (KERN_ATTR_RULES ()) | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; - + w2[0] = 0x80; w2[1] = 0; w2[2] = 0; @@ -226,7 +226,7 @@ KERNEL_FQ void m03610_m04 (KERN_ATTR_RULES ()) w3[1] = 0; w3[2] = 32 * 8; w3[3] = 0; - + a = MD5M_A; b = MD5M_B; c = MD5M_C; @@ -617,7 +617,7 @@ KERNEL_FQ void m03610_s04 (KERN_ATTR_RULES ()) | uint_to_hex_lower8 ((d >> 8) & 255) << 16; w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 | uint_to_hex_lower8 ((d >> 24) & 255) << 16; - + w2[0] = 0x80; w2[1] = 0; w2[2] = 0; @@ -631,7 +631,7 @@ KERNEL_FQ void m03610_s04 (KERN_ATTR_RULES ()) b = MD5M_B; c = MD5M_C; d = MD5M_D; - + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); diff --git a/OpenCL/m03610_a1-optimized.cl b/OpenCL/m03610_a1-optimized.cl index 324d3dd61..b8ed49a7a 100644 --- a/OpenCL/m03610_a1-optimized.cl +++ b/OpenCL/m03610_a1-optimized.cl @@ -282,7 +282,7 @@ KERNEL_FQ void m03610_m04 (KERN_ATTR_BASIC ()) w3[1] = 0; w3[2] = 32 * 8; w3[3] = 0; - + a = MD5M_A; b = MD5M_B; c = MD5M_C; diff --git a/OpenCL/m03610_a3-optimized.cl b/OpenCL/m03610_a3-optimized.cl index 91cb5d6a3..55a6d7bf5 100644 --- a/OpenCL/m03610_a3-optimized.cl +++ b/OpenCL/m03610_a3-optimized.cl @@ -202,7 +202,7 @@ DECLSPEC void m03610m (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w w3_t[1] = 0; w3_t[2] = 32 * 8; w3_t[3] = 0; - + a = MD5M_A; b = MD5M_B; c = MD5M_C; diff --git a/OpenCL/m04420_a0-optimized.cl b/OpenCL/m04420_a0-optimized.cl new file mode 100644 index 000000000..e071beef3 --- /dev/null +++ b/OpenCL/m04420_a0-optimized.cl @@ -0,0 +1,813 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_rp_optimized.h) +#include M2S(INCLUDE_PATH/inc_rp_optimized.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha1.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +KERNEL_FQ void m04420_m04 (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + salt_buf0[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 3]; + salt_buf1[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 7]; + salt_buf2[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[SALT_POS_HOST].salt_buf[10]; + salt_buf2[3] = salt_bufs[SALT_POS_HOST].salt_buf[11]; + salt_buf3[0] = salt_bufs[SALT_POS_HOST].salt_buf[12]; + salt_buf3[1] = salt_bufs[SALT_POS_HOST].salt_buf[13]; + salt_buf3[2] = salt_bufs[SALT_POS_HOST].salt_buf[14]; + salt_buf3[3] = salt_bufs[SALT_POS_HOST].salt_buf[15]; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + u32x w0[4] = { 0 }; + u32x w1[4] = { 0 }; + u32x w2[4] = { 0 }; + u32x w3[4] = { 0 }; + + const u32x out_len = apply_rules_vect_optimized (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); + + /** + * append salt + */ + + u32x s0[4]; + u32x s1[4]; + u32x s2[4]; + u32x s3[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + s2[0] = salt_buf2[0]; + s2[1] = salt_buf2[1]; + s2[2] = salt_buf2[2]; + s2[3] = salt_buf2[3]; + s3[0] = salt_buf3[0]; + s3[1] = salt_buf3[1]; + s3[2] = salt_buf3[2]; + s3[3] = salt_buf3[3]; + + switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len); + + const u32x pw_salt_len = out_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] |= s3[2]; + w3[3] |= s3[3]; + + /** + * sha1 + */ + + u32x w0_t = hc_swap32 (w0[0]); + u32x w1_t = hc_swap32 (w0[1]); + u32x w2_t = hc_swap32 (w0[2]); + u32x w3_t = hc_swap32 (w0[3]); + u32x w4_t = hc_swap32 (w1[0]); + u32x w5_t = hc_swap32 (w1[1]); + u32x w6_t = hc_swap32 (w1[2]); + u32x w7_t = hc_swap32 (w1[3]); + u32x w8_t = hc_swap32 (w2[0]); + u32x w9_t = hc_swap32 (w2[1]); + u32x wa_t = hc_swap32 (w2[2]); + u32x wb_t = hc_swap32 (w2[3]); + u32x wc_t = hc_swap32 (w3[0]); + u32x wd_t = hc_swap32 (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += make_u32x (SHA1M_A); + b += make_u32x (SHA1M_B); + c += make_u32x (SHA1M_C); + d += make_u32x (SHA1M_D); + e += make_u32x (SHA1M_E); + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + e = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + COMPARE_M_SIMD (a, d, c, b); + } +} + +KERNEL_FQ void m04420_m08 (KERN_ATTR_RULES ()) +{ +} + +KERNEL_FQ void m04420_m16 (KERN_ATTR_RULES ()) +{ +} + +KERNEL_FQ void m04420_s04 (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + salt_buf0[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 3]; + salt_buf1[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 7]; + salt_buf2[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[SALT_POS_HOST].salt_buf[10]; + salt_buf2[3] = salt_bufs[SALT_POS_HOST].salt_buf[11]; + salt_buf3[0] = salt_bufs[SALT_POS_HOST].salt_buf[12]; + salt_buf3[1] = salt_bufs[SALT_POS_HOST].salt_buf[13]; + salt_buf3[2] = salt_bufs[SALT_POS_HOST].salt_buf[14]; + salt_buf3[3] = salt_bufs[SALT_POS_HOST].salt_buf[15]; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + u32x w0[4] = { 0 }; + u32x w1[4] = { 0 }; + u32x w2[4] = { 0 }; + u32x w3[4] = { 0 }; + + const u32x out_len = apply_rules_vect_optimized (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); + + /** + * append salt + */ + + u32x s0[4]; + u32x s1[4]; + u32x s2[4]; + u32x s3[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + s2[0] = salt_buf2[0]; + s2[1] = salt_buf2[1]; + s2[2] = salt_buf2[2]; + s2[3] = salt_buf2[3]; + s3[0] = salt_buf3[0]; + s3[1] = salt_buf3[1]; + s3[2] = salt_buf3[2]; + s3[3] = salt_buf3[3]; + + switch_buffer_by_offset_le_VV (s0, s1, s2, s3, out_len); + + const u32x pw_salt_len = out_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] |= s3[2]; + w3[3] |= s3[3]; + + /** + * sha1 + */ + + u32x w0_t = hc_swap32 (w0[0]); + u32x w1_t = hc_swap32 (w0[1]); + u32x w2_t = hc_swap32 (w0[2]); + u32x w3_t = hc_swap32 (w0[3]); + u32x w4_t = hc_swap32 (w1[0]); + u32x w5_t = hc_swap32 (w1[1]); + u32x w6_t = hc_swap32 (w1[2]); + u32x w7_t = hc_swap32 (w1[3]); + u32x w8_t = hc_swap32 (w2[0]); + u32x w9_t = hc_swap32 (w2[1]); + u32x wa_t = hc_swap32 (w2[2]); + u32x wb_t = hc_swap32 (w2[3]); + u32x wc_t = hc_swap32 (w3[0]); + u32x wd_t = hc_swap32 (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += make_u32x (SHA1M_A); + b += make_u32x (SHA1M_B); + c += make_u32x (SHA1M_C); + d += make_u32x (SHA1M_D); + e += make_u32x (SHA1M_E); + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + e = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + + if (MATCHES_NONE_VS (a, search[0])) continue; + + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + COMPARE_S_SIMD (a, d, c, b); + } +} + +KERNEL_FQ void m04420_s08 (KERN_ATTR_RULES ()) +{ +} + +KERNEL_FQ void m04420_s16 (KERN_ATTR_RULES ()) +{ +} diff --git a/OpenCL/m04420_a0-pure.cl b/OpenCL/m04420_a0-pure.cl new file mode 100644 index 000000000..a0114a72c --- /dev/null +++ b/OpenCL/m04420_a0-pure.cl @@ -0,0 +1,280 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_rp.h) +#include M2S(INCLUDE_PATH/inc_rp.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha1.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +KERNEL_FQ void m04420_mxx (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + COPY_PW (pws[gid]); + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + /** + * loop + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + pw_t tmp = PASTE_PW; + + tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); + + sha1_ctx_t ctx0; + + sha1_init (&ctx0); + + sha1_update_swap (&ctx0, tmp.i, tmp.pw_len); + + sha1_update (&ctx0, s, salt_len); + + sha1_final (&ctx0); + + const u32 a = ctx0.h[0]; + const u32 b = ctx0.h[1]; + const u32 c = ctx0.h[2]; + const u32 d = ctx0.h[3]; + const u32 e = ctx0.h[4]; + + md5_ctx_t ctx; + + md5_init (&ctx); + + w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + md5_update_64 (&ctx, w0, w1, w2, w3, 40); + + md5_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_M_SCALAR (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m04420_sxx (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + COPY_PW (pws[gid]); + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + /** + * loop + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + pw_t tmp = PASTE_PW; + + tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); + + sha1_ctx_t ctx0; + + sha1_init (&ctx0); + + sha1_update_swap (&ctx0, tmp.i, tmp.pw_len); + + sha1_update (&ctx0, s, salt_len); + + sha1_final (&ctx0); + + const u32 a = ctx0.h[0]; + const u32 b = ctx0.h[1]; + const u32 c = ctx0.h[2]; + const u32 d = ctx0.h[3]; + const u32 e = ctx0.h[4]; + + md5_ctx_t ctx; + + md5_init (&ctx); + + w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + md5_update_64 (&ctx, w0, w1, w2, w3, 40); + + md5_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_S_SCALAR (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m04420_a1-optimized.cl b/OpenCL/m04420_a1-optimized.cl new file mode 100644 index 000000000..2f688826e --- /dev/null +++ b/OpenCL/m04420_a1-optimized.cl @@ -0,0 +1,931 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha1.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +KERNEL_FQ void m04420_m04 (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_l_len = pws[gid].pw_len & 63; + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + salt_buf0[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 3]; + salt_buf1[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 7]; + salt_buf2[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[SALT_POS_HOST].salt_buf[10]; + salt_buf2[3] = salt_bufs[SALT_POS_HOST].salt_buf[11]; + salt_buf3[0] = salt_bufs[SALT_POS_HOST].salt_buf[12]; + salt_buf3[1] = salt_bufs[SALT_POS_HOST].salt_buf[13]; + salt_buf3[2] = salt_bufs[SALT_POS_HOST].salt_buf[14]; + salt_buf3[3] = salt_bufs[SALT_POS_HOST].salt_buf[15]; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos) & 63; + + const u32x pw_len = (pw_l_len + pw_r_len) & 63; + + /** + * concat password candidate + */ + + u32x wordl0[4] = { 0 }; + u32x wordl1[4] = { 0 }; + u32x wordl2[4] = { 0 }; + u32x wordl3[4] = { 0 }; + + wordl0[0] = pw_buf0[0]; + wordl0[1] = pw_buf0[1]; + wordl0[2] = pw_buf0[2]; + wordl0[3] = pw_buf0[3]; + wordl1[0] = pw_buf1[0]; + wordl1[1] = pw_buf1[1]; + wordl1[2] = pw_buf1[2]; + wordl1[3] = pw_buf1[3]; + + u32x wordr0[4] = { 0 }; + u32x wordr1[4] = { 0 }; + u32x wordr2[4] = { 0 }; + u32x wordr3[4] = { 0 }; + + wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); + wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); + wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); + wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); + wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); + wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); + wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); + wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); + + if (COMBS_MODE == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + else + { + switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * append salt + */ + + u32x s0[4]; + u32x s1[4]; + u32x s2[4]; + u32x s3[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + s2[0] = salt_buf2[0]; + s2[1] = salt_buf2[1]; + s2[2] = salt_buf2[2]; + s2[3] = salt_buf2[3]; + s3[0] = salt_buf3[0]; + s3[1] = salt_buf3[1]; + s3[2] = salt_buf3[2]; + s3[3] = salt_buf3[3]; + + switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len); + + const u32x pw_salt_len = pw_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] |= s3[2]; + w3[3] |= s3[3]; + + /** + * sha1 + */ + + u32x w0_t = hc_swap32 (w0[0]); + u32x w1_t = hc_swap32 (w0[1]); + u32x w2_t = hc_swap32 (w0[2]); + u32x w3_t = hc_swap32 (w0[3]); + u32x w4_t = hc_swap32 (w1[0]); + u32x w5_t = hc_swap32 (w1[1]); + u32x w6_t = hc_swap32 (w1[2]); + u32x w7_t = hc_swap32 (w1[3]); + u32x w8_t = hc_swap32 (w2[0]); + u32x w9_t = hc_swap32 (w2[1]); + u32x wa_t = hc_swap32 (w2[2]); + u32x wb_t = hc_swap32 (w2[3]); + u32x wc_t = hc_swap32 (w3[0]); + u32x wd_t = hc_swap32 (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += make_u32x (SHA1M_A); + b += make_u32x (SHA1M_B); + c += make_u32x (SHA1M_C); + d += make_u32x (SHA1M_D); + e += make_u32x (SHA1M_E); + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + e = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + COMPARE_M_SIMD (a, d, c, b); + } +} + +KERNEL_FQ void m04420_m08 (KERN_ATTR_BASIC ()) +{ +} + +KERNEL_FQ void m04420_m16 (KERN_ATTR_BASIC ()) +{ +} + +KERNEL_FQ void m04420_s04 (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_l_len = pws[gid].pw_len & 63; + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + salt_buf0[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 3]; + salt_buf1[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 7]; + salt_buf2[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[SALT_POS_HOST].salt_buf[10]; + salt_buf2[3] = salt_bufs[SALT_POS_HOST].salt_buf[11]; + salt_buf3[0] = salt_bufs[SALT_POS_HOST].salt_buf[12]; + salt_buf3[1] = salt_bufs[SALT_POS_HOST].salt_buf[13]; + salt_buf3[2] = salt_bufs[SALT_POS_HOST].salt_buf[14]; + salt_buf3[3] = salt_bufs[SALT_POS_HOST].salt_buf[15]; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos) & 63; + + const u32x pw_len = (pw_l_len + pw_r_len) & 63; + + /** + * concat password candidate + */ + + u32x wordl0[4] = { 0 }; + u32x wordl1[4] = { 0 }; + u32x wordl2[4] = { 0 }; + u32x wordl3[4] = { 0 }; + + wordl0[0] = pw_buf0[0]; + wordl0[1] = pw_buf0[1]; + wordl0[2] = pw_buf0[2]; + wordl0[3] = pw_buf0[3]; + wordl1[0] = pw_buf1[0]; + wordl1[1] = pw_buf1[1]; + wordl1[2] = pw_buf1[2]; + wordl1[3] = pw_buf1[3]; + + u32x wordr0[4] = { 0 }; + u32x wordr1[4] = { 0 }; + u32x wordr2[4] = { 0 }; + u32x wordr3[4] = { 0 }; + + wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); + wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); + wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); + wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); + wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); + wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); + wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); + wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); + + if (COMBS_MODE == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + else + { + switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * append salt + */ + + u32x s0[4]; + u32x s1[4]; + u32x s2[4]; + u32x s3[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + s2[0] = salt_buf2[0]; + s2[1] = salt_buf2[1]; + s2[2] = salt_buf2[2]; + s2[3] = salt_buf2[3]; + s3[0] = salt_buf3[0]; + s3[1] = salt_buf3[1]; + s3[2] = salt_buf3[2]; + s3[3] = salt_buf3[3]; + + switch_buffer_by_offset_le_VV (s0, s1, s2, s3, pw_len); + + const u32x pw_salt_len = pw_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] |= s3[2]; + w3[3] |= s3[3]; + + /** + * sha1 + */ + + u32x w0_t = hc_swap32 (w0[0]); + u32x w1_t = hc_swap32 (w0[1]); + u32x w2_t = hc_swap32 (w0[2]); + u32x w3_t = hc_swap32 (w0[3]); + u32x w4_t = hc_swap32 (w1[0]); + u32x w5_t = hc_swap32 (w1[1]); + u32x w6_t = hc_swap32 (w1[2]); + u32x w7_t = hc_swap32 (w1[3]); + u32x w8_t = hc_swap32 (w2[0]); + u32x w9_t = hc_swap32 (w2[1]); + u32x wa_t = hc_swap32 (w2[2]); + u32x wb_t = hc_swap32 (w2[3]); + u32x wc_t = hc_swap32 (w3[0]); + u32x wd_t = hc_swap32 (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += make_u32x (SHA1M_A); + b += make_u32x (SHA1M_B); + c += make_u32x (SHA1M_C); + d += make_u32x (SHA1M_D); + e += make_u32x (SHA1M_E); + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + e = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + + if (MATCHES_NONE_VS (a, search[0])) continue; + + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + COMPARE_S_SIMD (a, d, c, b); + } +} + +KERNEL_FQ void m04420_s08 (KERN_ATTR_BASIC ()) +{ +} + +KERNEL_FQ void m04420_s16 (KERN_ATTR_BASIC ()) +{ +} diff --git a/OpenCL/m04420_a1-pure.cl b/OpenCL/m04420_a1-pure.cl new file mode 100644 index 000000000..20b17296c --- /dev/null +++ b/OpenCL/m04420_a1-pure.cl @@ -0,0 +1,274 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha1.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +KERNEL_FQ void m04420_mxx (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + sha1_ctx_t ctx0; + + sha1_init (&ctx0); + + sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); + + /** + * loop + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + sha1_ctx_t ctx1 = ctx0; + + sha1_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); + + sha1_update (&ctx1, s, salt_len); + + sha1_final (&ctx1); + + const u32 a = ctx1.h[0]; + const u32 b = ctx1.h[1]; + const u32 c = ctx1.h[2]; + const u32 d = ctx1.h[3]; + const u32 e = ctx1.h[4]; + + md5_ctx_t ctx; + + md5_init (&ctx); + + w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + md5_update_64 (&ctx, w0, w1, w2, w3, 40); + + md5_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_M_SCALAR (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m04420_sxx (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + sha1_ctx_t ctx0; + + sha1_init (&ctx0); + + sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); + + /** + * loop + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + sha1_ctx_t ctx1 = ctx0; + + sha1_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); + + sha1_update (&ctx1, s, salt_len); + + sha1_final (&ctx1); + + const u32 a = ctx1.h[0]; + const u32 b = ctx1.h[1]; + const u32 c = ctx1.h[2]; + const u32 d = ctx1.h[3]; + const u32 e = ctx1.h[4]; + + md5_ctx_t ctx; + + md5_init (&ctx); + + w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + md5_update_64 (&ctx, w0, w1, w2, w3, 40); + + md5_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_S_SCALAR (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m04420_a3-optimized.cl b/OpenCL/m04420_a3-optimized.cl new file mode 100644 index 000000000..baef3c6a7 --- /dev/null +++ b/OpenCL/m04420_a3-optimized.cl @@ -0,0 +1,1127 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha1.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +DECLSPEC void m04420m (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w2, PRIVATE_AS u32 *w3, const u32 pw_len, KERN_ATTR_FUNC_BASIC (), LOCAL_AS u32 *l_bin2asc) +{ + /** + * modifiers are taken from args + */ + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + u32 salt_buf0_t[4]; + u32 salt_buf1_t[4]; + u32 salt_buf2_t[4]; + u32 salt_buf3_t[4]; + + salt_buf0[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 3]; + salt_buf1[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 7]; + salt_buf2[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[SALT_POS_HOST].salt_buf[10]; + salt_buf2[3] = salt_bufs[SALT_POS_HOST].salt_buf[11]; + salt_buf3[0] = salt_bufs[SALT_POS_HOST].salt_buf[12]; + salt_buf3[1] = salt_bufs[SALT_POS_HOST].salt_buf[13]; + salt_buf3[2] = salt_bufs[SALT_POS_HOST].salt_buf[14]; + salt_buf3[3] = salt_bufs[SALT_POS_HOST].salt_buf[15]; + + salt_buf0_t[0] = salt_buf0[0]; + salt_buf0_t[1] = salt_buf0[1]; + salt_buf0_t[2] = salt_buf0[2]; + salt_buf0_t[3] = salt_buf0[3]; + salt_buf1_t[0] = salt_buf1[0]; + salt_buf1_t[1] = salt_buf1[1]; + salt_buf1_t[2] = salt_buf1[2]; + salt_buf1_t[3] = salt_buf1[3]; + salt_buf2_t[0] = salt_buf2[0]; + salt_buf2_t[1] = salt_buf2[1]; + salt_buf2_t[2] = salt_buf2[2]; + salt_buf2_t[3] = salt_buf2[3]; + salt_buf3_t[0] = salt_buf3[0]; + salt_buf3_t[1] = salt_buf3[1]; + salt_buf3_t[2] = salt_buf3[2]; + salt_buf3_t[3] = salt_buf3[3]; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + append_0x80_4x4_S (salt_buf0_t, salt_buf1_t, salt_buf2_t, salt_buf3_t, salt_len); + + switch_buffer_by_offset_le_S (salt_buf0_t, salt_buf1_t, salt_buf2_t, salt_buf3_t, pw_len); + + w0[ 0] |= hc_swap32_S (salt_buf0_t[0]); + w0[ 1] |= hc_swap32_S (salt_buf0_t[1]); + w0[ 2] |= hc_swap32_S (salt_buf0_t[2]); + w0[ 3] |= hc_swap32_S (salt_buf0_t[3]); + w1[ 0] |= hc_swap32_S (salt_buf1_t[0]); + w1[ 1] |= hc_swap32_S (salt_buf1_t[1]); + w1[ 2] |= hc_swap32_S (salt_buf1_t[2]); + w1[ 3] |= hc_swap32_S (salt_buf1_t[3]); + w2[ 0] |= hc_swap32_S (salt_buf2_t[0]); + w2[ 1] |= hc_swap32_S (salt_buf2_t[1]); + w2[ 2] |= hc_swap32_S (salt_buf2_t[2]); + w2[ 3] |= hc_swap32_S (salt_buf2_t[3]); + w3[ 0] |= hc_swap32_S (salt_buf3_t[0]); + w3[ 1] |= hc_swap32_S (salt_buf3_t[1]); + w3[ 2] |= hc_swap32_S (salt_buf3_t[2]); + w3[ 3] |= hc_swap32_S (salt_buf3_t[3]); + + /** + * loop + */ + + u32 w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = ix_create_bft (bfs_buf, il_pos); + + const u32x w0lr = w0l | w0r; + + /** + * sha1 + */ + + u32x w0_t = w0lr; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += make_u32x (SHA1M_A); + b += make_u32x (SHA1M_B); + c += make_u32x (SHA1M_C); + d += make_u32x (SHA1M_D); + e += make_u32x (SHA1M_E); + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + e = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + COMPARE_M_SIMD (a, d, c, b); + } +} + +DECLSPEC void m04420s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w2, PRIVATE_AS u32 *w3, const u32 pw_len, KERN_ATTR_FUNC_BASIC (), LOCAL_AS u32 *l_bin2asc) +{ + /** + * modifiers are taken from args + */ + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + u32 salt_buf0_t[4]; + u32 salt_buf1_t[4]; + u32 salt_buf2_t[4]; + u32 salt_buf3_t[4]; + + salt_buf0[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 3]; + salt_buf1[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 7]; + salt_buf2[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[SALT_POS_HOST].salt_buf[10]; + salt_buf2[3] = salt_bufs[SALT_POS_HOST].salt_buf[11]; + salt_buf3[0] = salt_bufs[SALT_POS_HOST].salt_buf[12]; + salt_buf3[1] = salt_bufs[SALT_POS_HOST].salt_buf[13]; + salt_buf3[2] = salt_bufs[SALT_POS_HOST].salt_buf[14]; + salt_buf3[3] = salt_bufs[SALT_POS_HOST].salt_buf[15]; + + salt_buf0_t[0] = salt_buf0[0]; + salt_buf0_t[1] = salt_buf0[1]; + salt_buf0_t[2] = salt_buf0[2]; + salt_buf0_t[3] = salt_buf0[3]; + salt_buf1_t[0] = salt_buf1[0]; + salt_buf1_t[1] = salt_buf1[1]; + salt_buf1_t[2] = salt_buf1[2]; + salt_buf1_t[3] = salt_buf1[3]; + salt_buf2_t[0] = salt_buf2[0]; + salt_buf2_t[1] = salt_buf2[1]; + salt_buf2_t[2] = salt_buf2[2]; + salt_buf2_t[3] = salt_buf2[3]; + salt_buf3_t[0] = salt_buf3[0]; + salt_buf3_t[1] = salt_buf3[1]; + salt_buf3_t[2] = salt_buf3[2]; + salt_buf3_t[3] = salt_buf3[3]; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + append_0x80_4x4_S (salt_buf0_t, salt_buf1_t, salt_buf2_t, salt_buf3_t, salt_len); + + switch_buffer_by_offset_le_S (salt_buf0_t, salt_buf1_t, salt_buf2_t, salt_buf3_t, pw_len); + + w0[ 0] |= hc_swap32_S (salt_buf0_t[0]); + w0[ 1] |= hc_swap32_S (salt_buf0_t[1]); + w0[ 2] |= hc_swap32_S (salt_buf0_t[2]); + w0[ 3] |= hc_swap32_S (salt_buf0_t[3]); + w1[ 0] |= hc_swap32_S (salt_buf1_t[0]); + w1[ 1] |= hc_swap32_S (salt_buf1_t[1]); + w1[ 2] |= hc_swap32_S (salt_buf1_t[2]); + w1[ 3] |= hc_swap32_S (salt_buf1_t[3]); + w2[ 0] |= hc_swap32_S (salt_buf2_t[0]); + w2[ 1] |= hc_swap32_S (salt_buf2_t[1]); + w2[ 2] |= hc_swap32_S (salt_buf2_t[2]); + w2[ 3] |= hc_swap32_S (salt_buf2_t[3]); + w3[ 0] |= hc_swap32_S (salt_buf3_t[0]); + w3[ 1] |= hc_swap32_S (salt_buf3_t[1]); + w3[ 2] |= hc_swap32_S (salt_buf3_t[2]); + w3[ 3] |= hc_swap32_S (salt_buf3_t[3]); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32 w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = ix_create_bft (bfs_buf, il_pos); + + const u32x w0lr = w0l | w0r; + + /** + * sha1 + */ + + u32x w0_t = w0lr; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += make_u32x (SHA1M_A); + b += make_u32x (SHA1M_B); + c += make_u32x (SHA1M_C); + d += make_u32x (SHA1M_D); + e += make_u32x (SHA1M_E); + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + e = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + + if (MATCHES_NONE_VS (a, search[0])) continue; + + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + COMPARE_S_SIMD (a, d, c, b); + } +} + +KERNEL_FQ void m04420_m04 (KERN_ATTR_BASIC ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32 w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32 w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m04420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m04420_m08 (KERN_ATTR_BASIC ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32 w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32 w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m04420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m04420_m16 (KERN_ATTR_BASIC ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32 w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32 w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m04420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m04420_s04 (KERN_ATTR_BASIC ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32 w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32 w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m04420s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m04420_s08 (KERN_ATTR_BASIC ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32 w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32 w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m04420s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m04420_s16 (KERN_ATTR_BASIC ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32 w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32 w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m04420s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} diff --git a/OpenCL/m04420_a3-pure.cl b/OpenCL/m04420_a3-pure.cl new file mode 100644 index 000000000..37727503e --- /dev/null +++ b/OpenCL/m04420_a3-pure.cl @@ -0,0 +1,300 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha1.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +KERNEL_FQ void m04420_mxx (KERN_ATTR_VECTOR ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + const u32 pw_len = pws[gid].pw_len; + + u32x w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + /** + * loop + */ + + u32x _w0[4]; + u32x _w1[4]; + u32x _w2[4]; + u32x _w3[4]; + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0 = w0l | w0r; + + w[0] = w0; + + sha1_ctx_vector_t ctx0; + + sha1_init_vector (&ctx0); + + sha1_update_vector (&ctx0, w, pw_len); + + sha1_update_vector (&ctx0, s, salt_len); + + sha1_final_vector (&ctx0); + + const u32x a = ctx0.h[0]; + const u32x b = ctx0.h[1]; + const u32x c = ctx0.h[2]; + const u32x d = ctx0.h[3]; + const u32x e = ctx0.h[4]; + + md5_ctx_vector_t ctx; + + md5_init_vector (&ctx); + + _w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + _w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + _w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + _w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + _w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + _w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + _w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + _w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + _w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + _w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + _w2[2] = 0; + _w2[3] = 0; + _w3[0] = 0; + _w3[1] = 0; + _w3[2] = 0; + _w3[3] = 0; + + md5_update_vector_64 (&ctx, _w0, _w1, _w2, _w3, 40); + + md5_final_vector (&ctx); + + const u32x r0 = ctx.h[DGST_R0]; + const u32x r1 = ctx.h[DGST_R1]; + const u32x r2 = ctx.h[DGST_R2]; + const u32x r3 = ctx.h[DGST_R3]; + + COMPARE_M_SIMD (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m04420_sxx (KERN_ATTR_VECTOR ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + const u32 pw_len = pws[gid].pw_len; + + u32x w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + /** + * loop + */ + + u32x _w0[4]; + u32x _w1[4]; + u32x _w2[4]; + u32x _w3[4]; + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0 = w0l | w0r; + + w[0] = w0; + + sha1_ctx_vector_t ctx0; + + sha1_init_vector (&ctx0); + + sha1_update_vector (&ctx0, w, pw_len); + + sha1_update_vector (&ctx0, s, salt_len); + + sha1_final_vector (&ctx0); + + const u32x a = ctx0.h[0]; + const u32x b = ctx0.h[1]; + const u32x c = ctx0.h[2]; + const u32x d = ctx0.h[3]; + const u32x e = ctx0.h[4]; + + md5_ctx_vector_t ctx; + + md5_init_vector (&ctx); + + _w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + _w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + _w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + _w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + _w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + _w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + _w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + _w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + _w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + _w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + _w2[2] = 0; + _w2[3] = 0; + _w3[0] = 0; + _w3[1] = 0; + _w3[2] = 0; + _w3[3] = 0; + + md5_update_vector_64 (&ctx, _w0, _w1, _w2, _w3, 40); + + md5_final_vector (&ctx); + + const u32x r0 = ctx.h[DGST_R0]; + const u32x r1 = ctx.h[DGST_R1]; + const u32x r2 = ctx.h[DGST_R2]; + const u32x r3 = ctx.h[DGST_R3]; + + COMPARE_S_SIMD (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m04430_a0-optimized.cl b/OpenCL/m04430_a0-optimized.cl new file mode 100644 index 000000000..4f809d3ff --- /dev/null +++ b/OpenCL/m04430_a0-optimized.cl @@ -0,0 +1,773 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_rp_optimized.h) +#include M2S(INCLUDE_PATH/inc_rp_optimized.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha1.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +KERNEL_FQ void m04430_m04 (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + salt_buf0[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 3]; + salt_buf1[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 7]; + salt_buf2[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[SALT_POS_HOST].salt_buf[10]; + salt_buf2[3] = salt_bufs[SALT_POS_HOST].salt_buf[11]; + salt_buf3[0] = salt_bufs[SALT_POS_HOST].salt_buf[12]; + salt_buf3[1] = salt_bufs[SALT_POS_HOST].salt_buf[13]; + salt_buf3[2] = salt_bufs[SALT_POS_HOST].salt_buf[14]; + salt_buf3[3] = salt_bufs[SALT_POS_HOST].salt_buf[15]; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + u32x w0[4] = { 0 }; + u32x w1[4] = { 0 }; + u32x w2[4] = { 0 }; + u32x w3[4] = { 0 }; + + const u32x out_len = apply_rules_vect_optimized (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); + + /** + * prepend salt + */ + + const u32x out_salt_len = out_len + salt_len; + + switch_buffer_by_offset_le_VV (w0, w1, w2, w3, salt_len); + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + w2[0] |= salt_buf2[0]; + w2[1] |= salt_buf2[1]; + w2[2] |= salt_buf2[2]; + w2[3] |= salt_buf2[3]; + w3[0] |= salt_buf3[0]; + w3[1] |= salt_buf3[1]; + w3[2] |= salt_buf3[2]; + w3[3] |= salt_buf3[3]; + + append_0x80_4x4_VV (w0, w1, w2, w3, out_salt_len); + + /** + * sha1 + */ + + u32x w0_t = hc_swap32 (w0[0]); + u32x w1_t = hc_swap32 (w0[1]); + u32x w2_t = hc_swap32 (w0[2]); + u32x w3_t = hc_swap32 (w0[3]); + u32x w4_t = hc_swap32 (w1[0]); + u32x w5_t = hc_swap32 (w1[1]); + u32x w6_t = hc_swap32 (w1[2]); + u32x w7_t = hc_swap32 (w1[3]); + u32x w8_t = hc_swap32 (w2[0]); + u32x w9_t = hc_swap32 (w2[1]); + u32x wa_t = hc_swap32 (w2[2]); + u32x wb_t = hc_swap32 (w2[3]); + u32x wc_t = hc_swap32 (w3[0]); + u32x wd_t = hc_swap32 (w3[1]); + u32x we_t = 0; + u32x wf_t = out_salt_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += make_u32x (SHA1M_A); + b += make_u32x (SHA1M_B); + c += make_u32x (SHA1M_C); + d += make_u32x (SHA1M_D); + e += make_u32x (SHA1M_E); + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + e = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + COMPARE_M_SIMD (a, d, c, b); + } +} + +KERNEL_FQ void m04430_m08 (KERN_ATTR_RULES ()) +{ +} + +KERNEL_FQ void m04430_m16 (KERN_ATTR_RULES ()) +{ +} + +KERNEL_FQ void m04430_s04 (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + salt_buf0[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 3]; + salt_buf1[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 7]; + salt_buf2[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[SALT_POS_HOST].salt_buf[10]; + salt_buf2[3] = salt_bufs[SALT_POS_HOST].salt_buf[11]; + salt_buf3[0] = salt_bufs[SALT_POS_HOST].salt_buf[12]; + salt_buf3[1] = salt_bufs[SALT_POS_HOST].salt_buf[13]; + salt_buf3[2] = salt_bufs[SALT_POS_HOST].salt_buf[14]; + salt_buf3[3] = salt_bufs[SALT_POS_HOST].salt_buf[15]; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + u32x w0[4] = { 0 }; + u32x w1[4] = { 0 }; + u32x w2[4] = { 0 }; + u32x w3[4] = { 0 }; + + const u32x out_len = apply_rules_vect_optimized (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); + + /** + * prepend salt + */ + + const u32x out_salt_len = out_len + salt_len; + + switch_buffer_by_offset_le_VV (w0, w1, w2, w3, salt_len); + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + w2[0] |= salt_buf2[0]; + w2[1] |= salt_buf2[1]; + w2[2] |= salt_buf2[2]; + w2[3] |= salt_buf2[3]; + w3[0] |= salt_buf3[0]; + w3[1] |= salt_buf3[1]; + w3[2] |= salt_buf3[2]; + w3[3] |= salt_buf3[3]; + + append_0x80_4x4_VV (w0, w1, w2, w3, out_salt_len); + + /** + * sha1 + */ + + u32x w0_t = hc_swap32 (w0[0]); + u32x w1_t = hc_swap32 (w0[1]); + u32x w2_t = hc_swap32 (w0[2]); + u32x w3_t = hc_swap32 (w0[3]); + u32x w4_t = hc_swap32 (w1[0]); + u32x w5_t = hc_swap32 (w1[1]); + u32x w6_t = hc_swap32 (w1[2]); + u32x w7_t = hc_swap32 (w1[3]); + u32x w8_t = hc_swap32 (w2[0]); + u32x w9_t = hc_swap32 (w2[1]); + u32x wa_t = hc_swap32 (w2[2]); + u32x wb_t = hc_swap32 (w2[3]); + u32x wc_t = hc_swap32 (w3[0]); + u32x wd_t = hc_swap32 (w3[1]); + u32x we_t = 0; + u32x wf_t = out_salt_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += make_u32x (SHA1M_A); + b += make_u32x (SHA1M_B); + c += make_u32x (SHA1M_C); + d += make_u32x (SHA1M_D); + e += make_u32x (SHA1M_E); + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + e = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + + if (MATCHES_NONE_VS (a, search[0])) continue; + + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + COMPARE_S_SIMD (a, d, c, b); + } +} + +KERNEL_FQ void m04430_s08 (KERN_ATTR_RULES ()) +{ +} + +KERNEL_FQ void m04430_s16 (KERN_ATTR_RULES ()) +{ +} diff --git a/OpenCL/m04430_a0-pure.cl b/OpenCL/m04430_a0-pure.cl new file mode 100644 index 000000000..60cfea81b --- /dev/null +++ b/OpenCL/m04430_a0-pure.cl @@ -0,0 +1,266 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_rp.h) +#include M2S(INCLUDE_PATH/inc_rp.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha1.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +KERNEL_FQ void m04430_mxx (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + COPY_PW (pws[gid]); + + sha1_ctx_t ctx1; + + sha1_init (&ctx1); + + sha1_update_global_swap (&ctx1, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len); + + /** + * loop + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + pw_t tmp = PASTE_PW; + + tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); + + sha1_ctx_t ctx0 = ctx1; + + sha1_update_swap (&ctx0, tmp.i, tmp.pw_len); + + sha1_final (&ctx0); + + const u32 a = ctx0.h[0]; + const u32 b = ctx0.h[1]; + const u32 c = ctx0.h[2]; + const u32 d = ctx0.h[3]; + const u32 e = ctx0.h[4]; + + md5_ctx_t ctx; + + md5_init (&ctx); + + w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + md5_update_64 (&ctx, w0, w1, w2, w3, 40); + + md5_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_M_SCALAR (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m04430_sxx (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + COPY_PW (pws[gid]); + + sha1_ctx_t ctx1; + + sha1_init (&ctx1); + + sha1_update_global_swap (&ctx1, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len); + + /** + * loop + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + pw_t tmp = PASTE_PW; + + tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); + + sha1_ctx_t ctx0 = ctx1; + + sha1_update_swap (&ctx0, tmp.i, tmp.pw_len); + + sha1_final (&ctx0); + + const u32 a = ctx0.h[0]; + const u32 b = ctx0.h[1]; + const u32 c = ctx0.h[2]; + const u32 d = ctx0.h[3]; + const u32 e = ctx0.h[4]; + + md5_ctx_t ctx; + + md5_init (&ctx); + + w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + md5_update_64 (&ctx, w0, w1, w2, w3, 40); + + md5_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_S_SCALAR (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m04430_a1-optimized.cl b/OpenCL/m04430_a1-optimized.cl new file mode 100644 index 000000000..43b94cf73 --- /dev/null +++ b/OpenCL/m04430_a1-optimized.cl @@ -0,0 +1,886 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha1.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +KERNEL_FQ void m04430_m04 (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_l_len = pws[gid].pw_len & 63; + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + salt_buf0[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 3]; + salt_buf1[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 7]; + salt_buf2[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[SALT_POS_HOST].salt_buf[10]; + salt_buf2[3] = salt_bufs[SALT_POS_HOST].salt_buf[11]; + salt_buf3[0] = salt_bufs[SALT_POS_HOST].salt_buf[12]; + salt_buf3[1] = salt_bufs[SALT_POS_HOST].salt_buf[13]; + salt_buf3[2] = salt_bufs[SALT_POS_HOST].salt_buf[14]; + salt_buf3[3] = salt_bufs[SALT_POS_HOST].salt_buf[15]; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos) & 63; + + const u32x pw_len = (pw_l_len + pw_r_len) & 63; + + /** + * concat password candidate + */ + + u32x wordl0[4] = { 0 }; + u32x wordl1[4] = { 0 }; + u32x wordl2[4] = { 0 }; + u32x wordl3[4] = { 0 }; + + wordl0[0] = pw_buf0[0]; + wordl0[1] = pw_buf0[1]; + wordl0[2] = pw_buf0[2]; + wordl0[3] = pw_buf0[3]; + wordl1[0] = pw_buf1[0]; + wordl1[1] = pw_buf1[1]; + wordl1[2] = pw_buf1[2]; + wordl1[3] = pw_buf1[3]; + + u32x wordr0[4] = { 0 }; + u32x wordr1[4] = { 0 }; + u32x wordr2[4] = { 0 }; + u32x wordr3[4] = { 0 }; + + wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); + wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); + wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); + wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); + wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); + wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); + wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); + wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); + + if (COMBS_MODE == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + else + { + switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); + + const u32x pw_salt_len = pw_len + salt_len; + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + w2[0] |= salt_buf2[0]; + w2[1] |= salt_buf2[1]; + w2[2] |= salt_buf2[2]; + w2[3] |= salt_buf2[3]; + w3[0] |= salt_buf3[0]; + w3[1] |= salt_buf3[1]; + w3[2] |= salt_buf3[2]; + w3[3] |= salt_buf3[3]; + + /** + * sha1 + */ + + u32x w0_t = hc_swap32 (w0[0]); + u32x w1_t = hc_swap32 (w0[1]); + u32x w2_t = hc_swap32 (w0[2]); + u32x w3_t = hc_swap32 (w0[3]); + u32x w4_t = hc_swap32 (w1[0]); + u32x w5_t = hc_swap32 (w1[1]); + u32x w6_t = hc_swap32 (w1[2]); + u32x w7_t = hc_swap32 (w1[3]); + u32x w8_t = hc_swap32 (w2[0]); + u32x w9_t = hc_swap32 (w2[1]); + u32x wa_t = hc_swap32 (w2[2]); + u32x wb_t = hc_swap32 (w2[3]); + u32x wc_t = hc_swap32 (w3[0]); + u32x wd_t = hc_swap32 (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += make_u32x (SHA1M_A); + b += make_u32x (SHA1M_B); + c += make_u32x (SHA1M_C); + d += make_u32x (SHA1M_D); + e += make_u32x (SHA1M_E); + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + e = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + COMPARE_M_SIMD (a, d, c, b); + } +} + +KERNEL_FQ void m04430_m08 (KERN_ATTR_BASIC ()) +{ +} + +KERNEL_FQ void m04430_m16 (KERN_ATTR_BASIC ()) +{ +} + +KERNEL_FQ void m04430_s04 (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_l_len = pws[gid].pw_len & 63; + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + salt_buf0[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 3]; + salt_buf1[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[SALT_POS_HOST].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[SALT_POS_HOST].salt_buf[ 7]; + salt_buf2[0] = salt_bufs[SALT_POS_HOST].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[SALT_POS_HOST].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[SALT_POS_HOST].salt_buf[10]; + salt_buf2[3] = salt_bufs[SALT_POS_HOST].salt_buf[11]; + salt_buf3[0] = salt_bufs[SALT_POS_HOST].salt_buf[12]; + salt_buf3[1] = salt_bufs[SALT_POS_HOST].salt_buf[13]; + salt_buf3[2] = salt_bufs[SALT_POS_HOST].salt_buf[14]; + salt_buf3[3] = salt_bufs[SALT_POS_HOST].salt_buf[15]; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos) & 63; + + const u32x pw_len = (pw_l_len + pw_r_len) & 63; + + /** + * concat password candidate + */ + + u32x wordl0[4] = { 0 }; + u32x wordl1[4] = { 0 }; + u32x wordl2[4] = { 0 }; + u32x wordl3[4] = { 0 }; + + wordl0[0] = pw_buf0[0]; + wordl0[1] = pw_buf0[1]; + wordl0[2] = pw_buf0[2]; + wordl0[3] = pw_buf0[3]; + wordl1[0] = pw_buf1[0]; + wordl1[1] = pw_buf1[1]; + wordl1[2] = pw_buf1[2]; + wordl1[3] = pw_buf1[3]; + + u32x wordr0[4] = { 0 }; + u32x wordr1[4] = { 0 }; + u32x wordr2[4] = { 0 }; + u32x wordr3[4] = { 0 }; + + wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); + wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); + wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); + wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); + wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); + wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); + wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); + wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); + + if (COMBS_MODE == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + else + { + switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + switch_buffer_by_offset_le (w0, w1, w2, w3, salt_len); + + const u32x pw_salt_len = pw_len + salt_len; + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + w2[0] |= salt_buf2[0]; + w2[1] |= salt_buf2[1]; + w2[2] |= salt_buf2[2]; + w2[3] |= salt_buf2[3]; + w3[0] |= salt_buf3[0]; + w3[1] |= salt_buf3[1]; + w3[2] |= salt_buf3[2]; + + /** + * sha1 + */ + + u32x w0_t = hc_swap32 (w0[0]); + u32x w1_t = hc_swap32 (w0[1]); + u32x w2_t = hc_swap32 (w0[2]); + u32x w3_t = hc_swap32 (w0[3]); + u32x w4_t = hc_swap32 (w1[0]); + u32x w5_t = hc_swap32 (w1[1]); + u32x w6_t = hc_swap32 (w1[2]); + u32x w7_t = hc_swap32 (w1[3]); + u32x w8_t = hc_swap32 (w2[0]); + u32x w9_t = hc_swap32 (w2[1]); + u32x wa_t = hc_swap32 (w2[2]); + u32x wb_t = hc_swap32 (w2[3]); + u32x wc_t = hc_swap32 (w3[0]); + u32x wd_t = hc_swap32 (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += make_u32x (SHA1M_A); + b += make_u32x (SHA1M_B); + c += make_u32x (SHA1M_C); + d += make_u32x (SHA1M_D); + e += make_u32x (SHA1M_E); + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + e = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + + if (MATCHES_NONE_VS (a, search[0])) continue; + + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + COMPARE_S_SIMD (a, d, c, b); + } +} + +KERNEL_FQ void m04430_s08 (KERN_ATTR_BASIC ()) +{ +} + +KERNEL_FQ void m04430_s16 (KERN_ATTR_BASIC ()) +{ +} diff --git a/OpenCL/m04430_a1-pure.cl b/OpenCL/m04430_a1-pure.cl new file mode 100644 index 000000000..3a801e1a2 --- /dev/null +++ b/OpenCL/m04430_a1-pure.cl @@ -0,0 +1,265 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha1.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +KERNEL_FQ void m04430_mxx (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + sha1_ctx_t ctx0; + + sha1_init (&ctx0); + + sha1_update_global_swap (&ctx0, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len); + + sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); + + /** + * loop + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + sha1_ctx_t ctx1 = ctx0; + + sha1_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); + + sha1_final (&ctx1); + + const u32 a = ctx1.h[0]; + const u32 b = ctx1.h[1]; + const u32 c = ctx1.h[2]; + const u32 d = ctx1.h[3]; + const u32 e = ctx1.h[4]; + + md5_ctx_t ctx; + + md5_init (&ctx); + + w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + md5_update_64 (&ctx, w0, w1, w2, w3, 40); + + md5_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_M_SCALAR (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m04430_sxx (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + sha1_ctx_t ctx0; + + sha1_init (&ctx0); + + sha1_update_global_swap (&ctx0, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len); + + sha1_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); + + /** + * loop + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + sha1_ctx_t ctx1 = ctx0; + + sha1_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); + + sha1_final (&ctx1); + + const u32 a = ctx1.h[0]; + const u32 b = ctx1.h[1]; + const u32 c = ctx1.h[2]; + const u32 d = ctx1.h[3]; + const u32 e = ctx1.h[4]; + + md5_ctx_t ctx; + + md5_init (&ctx); + + w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + md5_update_64 (&ctx, w0, w1, w2, w3, 40); + + md5_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_S_SCALAR (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m04430_a3-optimized.cl b/OpenCL/m04430_a3-optimized.cl new file mode 100644 index 000000000..ccca5001c --- /dev/null +++ b/OpenCL/m04430_a3-optimized.cl @@ -0,0 +1,1123 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha1.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +DECLSPEC void m04430m (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w2, PRIVATE_AS u32 *w3, const u32 pw_len, KERN_ATTR_FUNC_BASIC (), LOCAL_AS u32 *l_bin2asc) +{ + /** + * modifiers are taken from args + */ + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + salt_buf0[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 0]); + salt_buf0[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 1]); + salt_buf0[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 2]); + salt_buf0[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 3]); + salt_buf1[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 4]); + salt_buf1[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 5]); + salt_buf1[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 6]); + salt_buf1[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 7]); + salt_buf2[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 8]); + salt_buf2[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 9]); + salt_buf2[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[10]); + salt_buf2[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[11]); + salt_buf3[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[12]); + salt_buf3[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[13]); + salt_buf3[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[14]); + salt_buf3[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[15]); + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32 w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = ix_create_bft (bfs_buf, il_pos); + + const u32x w0lr = w0l | w0r; + + u32x t0[4]; + u32x t1[4]; + u32x t2[4]; + u32x t3[4]; + + t0[0] = w0lr; + t0[1] = w0[1]; + t0[2] = w0[2]; + t0[3] = w0[3]; + t1[0] = w1[0]; + t1[1] = w1[1]; + t1[2] = w1[2]; + t1[3] = w1[3]; + t2[0] = w2[0]; + t2[1] = w2[1]; + t2[2] = w2[2]; + t2[3] = w2[3]; + t3[0] = w3[0]; + t3[1] = w3[1]; + t3[2] = w3[2]; + t3[3] = w3[3]; + + switch_buffer_by_offset_be (t0, t1, t2, t3, salt_len); + + t0[0] |= salt_buf0[0]; + t0[1] |= salt_buf0[1]; + t0[2] |= salt_buf0[2]; + t0[3] |= salt_buf0[3]; + t1[0] |= salt_buf1[0]; + t1[1] |= salt_buf1[1]; + t1[2] |= salt_buf1[2]; + t1[3] |= salt_buf1[3]; + t2[0] |= salt_buf2[0]; + t2[1] |= salt_buf2[1]; + t2[2] |= salt_buf2[2]; + t2[3] |= salt_buf2[3]; + t3[0] |= salt_buf3[0]; + t3[1] |= salt_buf3[1]; + t3[2] = 0; + t3[3] = pw_salt_len * 8; + + /** + * sha1 + */ + + u32x w0_t = t0[0]; + u32x w1_t = t0[1]; + u32x w2_t = t0[2]; + u32x w3_t = t0[3]; + u32x w4_t = t1[0]; + u32x w5_t = t1[1]; + u32x w6_t = t1[2]; + u32x w7_t = t1[3]; + u32x w8_t = t2[0]; + u32x w9_t = t2[1]; + u32x wa_t = t2[2]; + u32x wb_t = t2[3]; + u32x wc_t = t3[0]; + u32x wd_t = t3[1]; + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += make_u32x (SHA1M_A); + b += make_u32x (SHA1M_B); + c += make_u32x (SHA1M_C); + d += make_u32x (SHA1M_D); + e += make_u32x (SHA1M_E); + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + e = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + COMPARE_M_SIMD (a, d, c, b); + } +} + +DECLSPEC void m04430s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w2, PRIVATE_AS u32 *w3, const u32 pw_len, KERN_ATTR_FUNC_BASIC (), LOCAL_AS u32 *l_bin2asc) +{ + /** + * modifiers are taken from args + */ + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + salt_buf0[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 0]); + salt_buf0[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 1]); + salt_buf0[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 2]); + salt_buf0[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 3]); + salt_buf1[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 4]); + salt_buf1[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 5]); + salt_buf1[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 6]); + salt_buf1[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 7]); + salt_buf2[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 8]); + salt_buf2[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 9]); + salt_buf2[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[10]); + salt_buf2[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[11]); + salt_buf3[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[12]); + salt_buf3[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[13]); + salt_buf3[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[14]); + salt_buf3[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[15]); + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32 w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = ix_create_bft (bfs_buf, il_pos); + + const u32x w0lr = w0l | w0r; + + u32x t0[4]; + u32x t1[4]; + u32x t2[4]; + u32x t3[4]; + + t0[0] = w0lr; + t0[1] = w0[1]; + t0[2] = w0[2]; + t0[3] = w0[3]; + t1[0] = w1[0]; + t1[1] = w1[1]; + t1[2] = w1[2]; + t1[3] = w1[3]; + t2[0] = w2[0]; + t2[1] = w2[1]; + t2[2] = w2[2]; + t2[3] = w2[3]; + t3[0] = w3[0]; + t3[1] = w3[1]; + t3[2] = w3[2]; + t3[3] = w3[3]; + + switch_buffer_by_offset_be (t0, t1, t2, t3, salt_len); + + t0[0] |= salt_buf0[0]; + t0[1] |= salt_buf0[1]; + t0[2] |= salt_buf0[2]; + t0[3] |= salt_buf0[3]; + t1[0] |= salt_buf1[0]; + t1[1] |= salt_buf1[1]; + t1[2] |= salt_buf1[2]; + t1[3] |= salt_buf1[3]; + t2[0] |= salt_buf2[0]; + t2[1] |= salt_buf2[1]; + t2[2] |= salt_buf2[2]; + t2[3] |= salt_buf2[3]; + t3[0] |= salt_buf3[0]; + t3[1] |= salt_buf3[1]; + t3[2] = 0; + t3[3] = pw_salt_len * 8; + + /** + * sha1 + */ + + u32x w0_t = t0[0]; + u32x w1_t = t0[1]; + u32x w2_t = t0[2]; + u32x w3_t = t0[3]; + u32x w4_t = t1[0]; + u32x w5_t = t1[1]; + u32x w6_t = t1[2]; + u32x w7_t = t1[3]; + u32x w8_t = t2[0]; + u32x w9_t = t2[1]; + u32x wa_t = t2[2]; + u32x wb_t = t2[3]; + u32x wc_t = t3[0]; + u32x wd_t = t3[1]; + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = hc_rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = hc_rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = hc_rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = hc_rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = hc_rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = hc_rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = hc_rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = hc_rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = hc_rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = hc_rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = hc_rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = hc_rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = hc_rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = hc_rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = hc_rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = hc_rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += make_u32x (SHA1M_A); + b += make_u32x (SHA1M_B); + c += make_u32x (SHA1M_C); + d += make_u32x (SHA1M_D); + e += make_u32x (SHA1M_E); + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + e = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + + if (MATCHES_NONE_VS (a, search[0])) continue; + + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + COMPARE_S_SIMD (a, d, c, b); + } +} + +KERNEL_FQ void m04430_m04 (KERN_ATTR_BASIC ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32 w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32 w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m04430m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m04430_m08 (KERN_ATTR_BASIC ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32 w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32 w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m04430m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m04430_m16 (KERN_ATTR_BASIC ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32 w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32 w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m04430m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m04430_s04 (KERN_ATTR_BASIC ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32 w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32 w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m04430s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m04430_s08 (KERN_ATTR_BASIC ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32 w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32 w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m04430s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m04430_s16 (KERN_ATTR_BASIC ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32 w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32 w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m04430s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} diff --git a/OpenCL/m04430_a3-pure.cl b/OpenCL/m04430_a3-pure.cl new file mode 100644 index 000000000..54142aeb3 --- /dev/null +++ b/OpenCL/m04430_a3-pure.cl @@ -0,0 +1,290 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha1.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +KERNEL_FQ void m04430_mxx (KERN_ATTR_VECTOR ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + const u32 pw_len = pws[gid].pw_len; + + u32x w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + sha1_ctx_t ctx1; + + sha1_init (&ctx1); + + sha1_update_global_swap (&ctx1, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len); + + /** + * loop + */ + + u32x _w0[4]; + u32x _w1[4]; + u32x _w2[4]; + u32x _w3[4]; + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0 = w0l | w0r; + + w[0] = w0; + + sha1_ctx_vector_t ctx0; + + sha1_init_vector_from_scalar (&ctx0, &ctx1); + + sha1_update_vector (&ctx0, w, pw_len); + + sha1_final_vector (&ctx0); + + const u32x a = ctx0.h[0]; + const u32x b = ctx0.h[1]; + const u32x c = ctx0.h[2]; + const u32x d = ctx0.h[3]; + const u32x e = ctx0.h[4]; + + md5_ctx_vector_t ctx; + + md5_init_vector (&ctx); + + _w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + _w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + _w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + _w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + _w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + _w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + _w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + _w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + _w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + _w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + _w2[2] = 0; + _w2[3] = 0; + _w3[0] = 0; + _w3[1] = 0; + _w3[2] = 0; + _w3[3] = 0; + + md5_update_vector_64 (&ctx, _w0, _w1, _w2, _w3, 40); + + md5_final_vector (&ctx); + + const u32x r0 = ctx.h[DGST_R0]; + const u32x r1 = ctx.h[DGST_R1]; + const u32x r2 = ctx.h[DGST_R2]; + const u32x r3 = ctx.h[DGST_R3]; + + COMPARE_M_SIMD (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m04430_sxx (KERN_ATTR_VECTOR ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + const u32 pw_len = pws[gid].pw_len; + + u32x w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + sha1_ctx_t ctx1; + + sha1_init (&ctx1); + + sha1_update_global_swap (&ctx1, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len); + + /** + * loop + */ + + u32x _w0[4]; + u32x _w1[4]; + u32x _w2[4]; + u32x _w3[4]; + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0 = w0l | w0r; + + w[0] = w0; + + sha1_ctx_vector_t ctx0; + + sha1_init_vector_from_scalar (&ctx0, &ctx1); + + sha1_update_vector (&ctx0, w, pw_len); + + sha1_final_vector (&ctx0); + + const u32x a = ctx0.h[0]; + const u32x b = ctx0.h[1]; + const u32x c = ctx0.h[2]; + const u32x d = ctx0.h[3]; + const u32x e = ctx0.h[4]; + + md5_ctx_vector_t ctx; + + md5_init_vector (&ctx); + + _w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + _w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + _w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + _w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + _w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + _w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + _w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + _w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + _w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + _w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + _w2[2] = 0; + _w2[3] = 0; + _w3[0] = 0; + _w3[1] = 0; + _w3[2] = 0; + _w3[3] = 0; + + md5_update_vector_64 (&ctx, _w0, _w1, _w2, _w3, 40); + + md5_final_vector (&ctx); + + const u32x r0 = ctx.h[DGST_R0]; + const u32x r1 = ctx.h[DGST_R1]; + const u32x r2 = ctx.h[DGST_R2]; + const u32x r3 = ctx.h[DGST_R3]; + + COMPARE_S_SIMD (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m08800-pure.cl b/OpenCL/m08800-pure.cl index a0efce27f..cbd3a250d 100644 --- a/OpenCL/m08800-pure.cl +++ b/OpenCL/m08800-pure.cl @@ -436,7 +436,7 @@ KERNEL_FQ void m08800_comp (KERN_ATTR_TMPS_ESALT (androidfde_tmp_t, androidfde_t u32 r[16]; - // not needed because of cbc mode -- implementation flaw !!. first 16 byte are not interessting + // not needed because of cbc mode -- implementation flaw !!. first 16 bytes are not interesting r[0] = 0; r[1] = 0; diff --git a/OpenCL/m08900-pure.cl b/OpenCL/m08900-pure.cl index 5f96f8ec4..b74b3d9c6 100644 --- a/OpenCL/m08900-pure.cl +++ b/OpenCL/m08900-pure.cl @@ -128,6 +128,36 @@ DECLSPEC uint4 hc_swap32_4 (uint4 v) DECLSPEC void salsa_r (PRIVATE_AS uint4 *TI) { + #if SCRYPT_R > 1 + + uint4 TT[STATE_CNT4 / 2]; + + for (int dst_off = 0, src_off = 4; src_off < STATE_CNT4; dst_off += 4, src_off += 8) + { + TT[dst_off + 0] = TI[src_off + 0]; + TT[dst_off + 1] = TI[src_off + 1]; + TT[dst_off + 2] = TI[src_off + 2]; + TT[dst_off + 3] = TI[src_off + 3]; + } + + for (int dst_off = 4, src_off = 8; src_off < STATE_CNT4; dst_off += 4, src_off += 8) + { + TI[dst_off + 0] = TI[src_off + 0]; + TI[dst_off + 1] = TI[src_off + 1]; + TI[dst_off + 2] = TI[src_off + 2]; + TI[dst_off + 3] = TI[src_off + 3]; + } + + for (int dst_off = STATE_CNT4 / 2, src_off = 0; dst_off < STATE_CNT4; dst_off += 4, src_off += 4) + { + TI[dst_off + 0] = TT[src_off + 0]; + TI[dst_off + 1] = TT[src_off + 1]; + TI[dst_off + 2] = TT[src_off + 2]; + TI[dst_off + 3] = TT[src_off + 3]; + } + + #endif + uint4 R0 = TI[STATE_CNT4 - 4]; uint4 R1 = TI[STATE_CNT4 - 3]; uint4 R2 = TI[STATE_CNT4 - 2]; @@ -165,36 +195,6 @@ DECLSPEC void salsa_r (PRIVATE_AS uint4 *TI) TI[i + 2] = R2; TI[i + 3] = R3; } - - #if SCRYPT_R > 1 - - uint4 TT[STATE_CNT4 / 2]; - - for (int dst_off = 0, src_off = 4; src_off < STATE_CNT4; dst_off += 4, src_off += 8) - { - TT[dst_off + 0] = TI[src_off + 0]; - TT[dst_off + 1] = TI[src_off + 1]; - TT[dst_off + 2] = TI[src_off + 2]; - TT[dst_off + 3] = TI[src_off + 3]; - } - - for (int dst_off = 4, src_off = 8; src_off < STATE_CNT4; dst_off += 4, src_off += 8) - { - TI[dst_off + 0] = TI[src_off + 0]; - TI[dst_off + 1] = TI[src_off + 1]; - TI[dst_off + 2] = TI[src_off + 2]; - TI[dst_off + 3] = TI[src_off + 3]; - } - - for (int dst_off = STATE_CNT4 / 2, src_off = 0; dst_off < STATE_CNT4; dst_off += 4, src_off += 4) - { - TI[dst_off + 0] = TT[src_off + 0]; - TI[dst_off + 1] = TT[src_off + 1]; - TI[dst_off + 2] = TT[src_off + 2]; - TI[dst_off + 3] = TT[src_off + 3]; - } - - #endif } DECLSPEC void scrypt_smix_init (PRIVATE_AS uint4 *X, GLOBAL_AS uint4 *V0, GLOBAL_AS uint4 *V1, GLOBAL_AS uint4 *V2, GLOBAL_AS uint4 *V3, const u64 gid) @@ -217,6 +217,30 @@ DECLSPEC void scrypt_smix_init (PRIVATE_AS uint4 *X, GLOBAL_AS uint4 *V0, GLOBAL case 3: V = V3; break; } + #if SCRYPT_R > 1 + + uint4 TT[STATE_CNT4]; + + for (int z = 0; z < zSIZE; z++) TT[z] = X[z]; + + for (int dst_off = 8, src_off = 4; dst_off < zSIZE; dst_off += 8, src_off += 4) + { + X[dst_off + 0] = TT[src_off + 0]; + X[dst_off + 1] = TT[src_off + 1]; + X[dst_off + 2] = TT[src_off + 2]; + X[dst_off + 3] = TT[src_off + 3]; + } + + for (int dst_off = 4, src_off = zSIZE / 2; dst_off < zSIZE; dst_off += 8, src_off += 4) + { + X[dst_off + 0] = TT[src_off + 0]; + X[dst_off + 1] = TT[src_off + 1]; + X[dst_off + 2] = TT[src_off + 2]; + X[dst_off + 3] = TT[src_off + 3]; + } + + #endif + for (u32 y = 0; y < ySIZE; y++) { for (u32 z = 0; z < zSIZE; z++) V[CO] = X[z]; @@ -327,6 +351,9 @@ KERNEL_FQ void m08900_init (KERN_ATTR_TMPS (scrypt_tmp_t)) #if defined IS_CUDA || defined IS_HIP const uint4 tmp0 = make_uint4 (digest[0], digest[1], digest[2], digest[3]); const uint4 tmp1 = make_uint4 (digest[4], digest[5], digest[6], digest[7]); + #elif defined IS_METAL + const uint4 tmp0 = uint4 (digest[0], digest[1], digest[2], digest[3]); + const uint4 tmp1 = uint4 (digest[4], digest[5], digest[6], digest[7]); #else const uint4 tmp0 = (uint4) (digest[0], digest[1], digest[2], digest[3]); const uint4 tmp1 = (uint4) (digest[4], digest[5], digest[6], digest[7]); @@ -357,6 +384,11 @@ KERNEL_FQ void m08900_init (KERN_ATTR_TMPS (scrypt_tmp_t)) X[1] = make_uint4 (T[1].x, T[2].y, T[3].z, T[0].w); X[2] = make_uint4 (T[2].x, T[3].y, T[0].z, T[1].w); X[3] = make_uint4 (T[3].x, T[0].y, T[1].z, T[2].w); + #elif defined IS_METAL + X[0] = uint4 (T[0].x, T[1].y, T[2].z, T[3].w); + X[1] = uint4 (T[1].x, T[2].y, T[3].z, T[0].w); + X[2] = uint4 (T[2].x, T[3].y, T[0].z, T[1].w); + X[3] = uint4 (T[3].x, T[0].y, T[1].z, T[2].w); #else X[0] = (uint4) (T[0].x, T[1].y, T[2].z, T[3].w); X[1] = (uint4) (T[1].x, T[2].y, T[3].z, T[0].w); @@ -451,10 +483,14 @@ KERNEL_FQ void m08900_comp (KERN_ATTR_TMPS (scrypt_tmp_t)) sha256_hmac_init_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); - for (u32 l = 0; l < SCRYPT_CNT4; l += 4) + for (u32 i = 0; i < SCRYPT_CNT4; i += STATE_CNT4) { + for (u32 j = 0; j < (STATE_CNT4 * 2); j += 8) + { uint4 X[4]; + const u32 l = i + j + ((j >= STATE_CNT4) ? (4 - STATE_CNT4) : 0); + X[0] = tmps[gid].P[l + 0]; X[1] = tmps[gid].P[l + 1]; X[2] = tmps[gid].P[l + 2]; @@ -467,6 +503,11 @@ KERNEL_FQ void m08900_comp (KERN_ATTR_TMPS (scrypt_tmp_t)) T[1] = make_uint4 (X[1].x, X[0].y, X[3].z, X[2].w); T[2] = make_uint4 (X[2].x, X[1].y, X[0].z, X[3].w); T[3] = make_uint4 (X[3].x, X[2].y, X[1].z, X[0].w); + #elif defined IS_METAL + T[0] = uint4 (X[0].x, X[3].y, X[2].z, X[1].w); + T[1] = uint4 (X[1].x, X[0].y, X[3].z, X[2].w); + T[2] = uint4 (X[2].x, X[1].y, X[0].z, X[3].w); + T[3] = uint4 (X[3].x, X[2].y, X[1].z, X[0].w); #else T[0] = (uint4) (X[0].x, X[3].y, X[2].z, X[1].w); T[1] = (uint4) (X[1].x, X[0].y, X[3].z, X[2].w); @@ -497,6 +538,7 @@ KERNEL_FQ void m08900_comp (KERN_ATTR_TMPS (scrypt_tmp_t)) w3[3] = T[3].w; sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 64); + } } w0[0] = 1; diff --git a/OpenCL/m09000-pure.cl b/OpenCL/m09000-pure.cl index 7e9c7298a..999f57bfe 100644 --- a/OpenCL/m09000-pure.cl +++ b/OpenCL/m09000-pure.cl @@ -340,7 +340,7 @@ DECLSPEC void SET_KEY32 (LOCAL_AS u32 *S, const u64 key, const u32 val) #else -// access pattern: linear access with S offset already set to right offset based on thread ID saving it from compuation +// access pattern: linear access with S offset already set to right offset based on thread ID saving it from computation // makes sense if there are not thread ID's (for instance on CPU) DECLSPEC inline u32 GET_KEY32 (LOCAL_AS u32 *S, const u64 key) diff --git a/OpenCL/m10700-optimized.cl b/OpenCL/m10700-optimized.cl index f037f466b..10ebfcac8 100644 --- a/OpenCL/m10700-optimized.cl +++ b/OpenCL/m10700-optimized.cl @@ -323,7 +323,7 @@ DECLSPEC u32 do_round (LOCAL_AS u32 *sc, PRIVATE_AS const u32 *pw, const u32 pw_ make_sc (sc, pw, pw_len, ctx->dgst32, ctx->dgst_len); - // make sure pwbl_len is calculcated before it gets changed + // make sure pwbl_len is calculated before it gets changed const u32 pwbl_len = pw_len + ctx->dgst_len; diff --git a/OpenCL/m13772-pure.cl b/OpenCL/m13772-pure.cl index f1fce4e9a..c4b870208 100644 --- a/OpenCL/m13772-pure.cl +++ b/OpenCL/m13772-pure.cl @@ -357,54 +357,98 @@ KERNEL_FQ void m13772_init (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) streebog512_hmac_update_global_swap (&streebog512_hmac_ctx, salt_bufs[SALT_POS_HOST].salt_buf, 64); - for (u32 i = 0, j = 1; i < 16; i += 8, j += 1) - { - streebog512_hmac_ctx_t streebog512_hmac_ctx2 = streebog512_hmac_ctx; + u32 i = 0; + u32 j = 1; - u32 w0[4]; - u32 w1[4]; - u32 w2[4]; - u32 w3[4]; + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; - w0[0] = j; - w0[1] = 0; - w0[2] = 0; - w0[3] = 0; - w1[0] = 0; - w1[1] = 0; - w1[2] = 0; - w1[3] = 0; - w2[0] = 0; - w2[1] = 0; - w2[2] = 0; - w2[3] = 0; - w3[0] = 0; - w3[1] = 0; - w3[2] = 0; - w3[3] = 0; + streebog512_hmac_ctx_t streebog512_hmac_ctx_v1 = streebog512_hmac_ctx; - streebog512_hmac_update_64 (&streebog512_hmac_ctx2, w0, w1, w2, w3, 4); + w0[0] = j; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; - streebog512_hmac_final (&streebog512_hmac_ctx2); + streebog512_hmac_update_64 (&streebog512_hmac_ctx_v1, w0, w1, w2, w3, 4); - tmps[gid].dgst[i + 0] = streebog512_hmac_ctx2.opad.h[0]; - tmps[gid].dgst[i + 1] = streebog512_hmac_ctx2.opad.h[1]; - tmps[gid].dgst[i + 2] = streebog512_hmac_ctx2.opad.h[2]; - tmps[gid].dgst[i + 3] = streebog512_hmac_ctx2.opad.h[3]; - tmps[gid].dgst[i + 4] = streebog512_hmac_ctx2.opad.h[4]; - tmps[gid].dgst[i + 5] = streebog512_hmac_ctx2.opad.h[5]; - tmps[gid].dgst[i + 6] = streebog512_hmac_ctx2.opad.h[6]; - tmps[gid].dgst[i + 7] = streebog512_hmac_ctx2.opad.h[7]; + streebog512_hmac_final (&streebog512_hmac_ctx_v1); - tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; - tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; - tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; - tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; - tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; - tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; - tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; - tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; - } + tmps[gid].dgst[i + 0] = streebog512_hmac_ctx_v1.opad.h[0]; + tmps[gid].dgst[i + 1] = streebog512_hmac_ctx_v1.opad.h[1]; + tmps[gid].dgst[i + 2] = streebog512_hmac_ctx_v1.opad.h[2]; + tmps[gid].dgst[i + 3] = streebog512_hmac_ctx_v1.opad.h[3]; + tmps[gid].dgst[i + 4] = streebog512_hmac_ctx_v1.opad.h[4]; + tmps[gid].dgst[i + 5] = streebog512_hmac_ctx_v1.opad.h[5]; + tmps[gid].dgst[i + 6] = streebog512_hmac_ctx_v1.opad.h[6]; + tmps[gid].dgst[i + 7] = streebog512_hmac_ctx_v1.opad.h[7]; + + tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; + tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; + tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; + tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; + tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; + tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; + tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; + tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; + + i=8; + j=2; + + streebog512_hmac_ctx_t streebog512_hmac_ctx_v2 = streebog512_hmac_ctx; + + w0[0] = j; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + streebog512_hmac_update_64 (&streebog512_hmac_ctx_v2, w0, w1, w2, w3, 4); + + streebog512_hmac_final (&streebog512_hmac_ctx_v2); + + tmps[gid].dgst[i + 0] = streebog512_hmac_ctx_v2.opad.h[0]; + tmps[gid].dgst[i + 1] = streebog512_hmac_ctx_v2.opad.h[1]; + tmps[gid].dgst[i + 2] = streebog512_hmac_ctx_v2.opad.h[2]; + tmps[gid].dgst[i + 3] = streebog512_hmac_ctx_v2.opad.h[3]; + tmps[gid].dgst[i + 4] = streebog512_hmac_ctx_v2.opad.h[4]; + tmps[gid].dgst[i + 5] = streebog512_hmac_ctx_v2.opad.h[5]; + tmps[gid].dgst[i + 6] = streebog512_hmac_ctx_v2.opad.h[6]; + tmps[gid].dgst[i + 7] = streebog512_hmac_ctx_v2.opad.h[7]; + + tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; + tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; + tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; + tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; + tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; + tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; + tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; + tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; } KERNEL_FQ void m13772_loop (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) diff --git a/OpenCL/m13773-pure.cl b/OpenCL/m13773-pure.cl index 3551d5560..55f14890c 100644 --- a/OpenCL/m13773-pure.cl +++ b/OpenCL/m13773-pure.cl @@ -422,54 +422,142 @@ KERNEL_FQ void m13773_init (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) streebog512_hmac_update_global_swap (&streebog512_hmac_ctx, salt_bufs[SALT_POS_HOST].salt_buf, 64); - for (u32 i = 0, j = 1; i < 24; i += 8, j += 1) - { - streebog512_hmac_ctx_t streebog512_hmac_ctx2 = streebog512_hmac_ctx; + u32 i = 0; + u32 j = 1; - u32 w0[4]; - u32 w1[4]; - u32 w2[4]; - u32 w3[4]; + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; - w0[0] = j; - w0[1] = 0; - w0[2] = 0; - w0[3] = 0; - w1[0] = 0; - w1[1] = 0; - w1[2] = 0; - w1[3] = 0; - w2[0] = 0; - w2[1] = 0; - w2[2] = 0; - w2[3] = 0; - w3[0] = 0; - w3[1] = 0; - w3[2] = 0; - w3[3] = 0; + streebog512_hmac_ctx_t streebog512_hmac_ctx_v1 = streebog512_hmac_ctx; - streebog512_hmac_update_64 (&streebog512_hmac_ctx2, w0, w1, w2, w3, 4); + w0[0] = j; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; - streebog512_hmac_final (&streebog512_hmac_ctx2); + streebog512_hmac_update_64 (&streebog512_hmac_ctx_v1, w0, w1, w2, w3, 4); - tmps[gid].dgst[i + 0] = streebog512_hmac_ctx2.opad.h[0]; - tmps[gid].dgst[i + 1] = streebog512_hmac_ctx2.opad.h[1]; - tmps[gid].dgst[i + 2] = streebog512_hmac_ctx2.opad.h[2]; - tmps[gid].dgst[i + 3] = streebog512_hmac_ctx2.opad.h[3]; - tmps[gid].dgst[i + 4] = streebog512_hmac_ctx2.opad.h[4]; - tmps[gid].dgst[i + 5] = streebog512_hmac_ctx2.opad.h[5]; - tmps[gid].dgst[i + 6] = streebog512_hmac_ctx2.opad.h[6]; - tmps[gid].dgst[i + 7] = streebog512_hmac_ctx2.opad.h[7]; + streebog512_hmac_final (&streebog512_hmac_ctx_v1); - tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; - tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; - tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; - tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; - tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; - tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; - tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; - tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; - } + tmps[gid].dgst[i + 0] = streebog512_hmac_ctx_v1.opad.h[0]; + tmps[gid].dgst[i + 1] = streebog512_hmac_ctx_v1.opad.h[1]; + tmps[gid].dgst[i + 2] = streebog512_hmac_ctx_v1.opad.h[2]; + tmps[gid].dgst[i + 3] = streebog512_hmac_ctx_v1.opad.h[3]; + tmps[gid].dgst[i + 4] = streebog512_hmac_ctx_v1.opad.h[4]; + tmps[gid].dgst[i + 5] = streebog512_hmac_ctx_v1.opad.h[5]; + tmps[gid].dgst[i + 6] = streebog512_hmac_ctx_v1.opad.h[6]; + tmps[gid].dgst[i + 7] = streebog512_hmac_ctx_v1.opad.h[7]; + + tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; + tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; + tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; + tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; + tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; + tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; + tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; + tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; + + i = 8; + j = 2; + + streebog512_hmac_ctx_t streebog512_hmac_ctx_v2 = streebog512_hmac_ctx; + + w0[0] = j; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + streebog512_hmac_update_64 (&streebog512_hmac_ctx_v2, w0, w1, w2, w3, 4); + + streebog512_hmac_final (&streebog512_hmac_ctx_v2); + + tmps[gid].dgst[i + 0] = streebog512_hmac_ctx_v2.opad.h[0]; + tmps[gid].dgst[i + 1] = streebog512_hmac_ctx_v2.opad.h[1]; + tmps[gid].dgst[i + 2] = streebog512_hmac_ctx_v2.opad.h[2]; + tmps[gid].dgst[i + 3] = streebog512_hmac_ctx_v2.opad.h[3]; + tmps[gid].dgst[i + 4] = streebog512_hmac_ctx_v2.opad.h[4]; + tmps[gid].dgst[i + 5] = streebog512_hmac_ctx_v2.opad.h[5]; + tmps[gid].dgst[i + 6] = streebog512_hmac_ctx_v2.opad.h[6]; + tmps[gid].dgst[i + 7] = streebog512_hmac_ctx_v2.opad.h[7]; + + tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; + tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; + tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; + tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; + tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; + tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; + tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; + tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; + + i = 16; + j = 3; + + streebog512_hmac_ctx_t streebog512_hmac_ctx_v3 = streebog512_hmac_ctx; + + w0[0] = j; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + streebog512_hmac_update_64 (&streebog512_hmac_ctx_v3, w0, w1, w2, w3, 4); + + streebog512_hmac_final (&streebog512_hmac_ctx_v3); + + tmps[gid].dgst[i + 0] = streebog512_hmac_ctx_v3.opad.h[0]; + tmps[gid].dgst[i + 1] = streebog512_hmac_ctx_v3.opad.h[1]; + tmps[gid].dgst[i + 2] = streebog512_hmac_ctx_v3.opad.h[2]; + tmps[gid].dgst[i + 3] = streebog512_hmac_ctx_v3.opad.h[3]; + tmps[gid].dgst[i + 4] = streebog512_hmac_ctx_v3.opad.h[4]; + tmps[gid].dgst[i + 5] = streebog512_hmac_ctx_v3.opad.h[5]; + tmps[gid].dgst[i + 6] = streebog512_hmac_ctx_v3.opad.h[6]; + tmps[gid].dgst[i + 7] = streebog512_hmac_ctx_v3.opad.h[7]; + + tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; + tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; + tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; + tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; + tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; + tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; + tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; + tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; } KERNEL_FQ void m13773_loop (KERN_ATTR_TMPS_ESALT (vc64_sbog_tmp_t, vc_t)) diff --git a/OpenCL/m15300-pure.cl b/OpenCL/m15300-pure.cl index faba9ce24..64869baa7 100644 --- a/OpenCL/m15300-pure.cl +++ b/OpenCL/m15300-pure.cl @@ -39,7 +39,7 @@ typedef struct dpapimk u32 SID_offset; /* here only for possible - forward compatibiliy + forward compatibility */ // u8 cipher_algo[16]; // u8 hash_algo[16]; diff --git a/OpenCL/m15310-pure.cl b/OpenCL/m15310-pure.cl index 2c394ea13..bf8c53947 100644 --- a/OpenCL/m15310-pure.cl +++ b/OpenCL/m15310-pure.cl @@ -41,7 +41,7 @@ typedef struct dpapimk u32 SID_offset; /* here only for possible - forward compatibiliy + forward compatibility */ // u8 cipher_algo[16]; // u8 hash_algo[16]; diff --git a/OpenCL/m15700-pure.cl b/OpenCL/m15700-pure.cl index 20cab27d1..d435883ce 100644 --- a/OpenCL/m15700-pure.cl +++ b/OpenCL/m15700-pure.cl @@ -135,6 +135,36 @@ DECLSPEC uint4 hc_swap32_4 (uint4 v) DECLSPEC void salsa_r (PRIVATE_AS uint4 *TI) { + #if SCRYPT_R > 1 + + uint4 TT[STATE_CNT4 / 2]; + + for (int dst_off = 0, src_off = 4; src_off < STATE_CNT4; dst_off += 4, src_off += 8) + { + TT[dst_off + 0] = TI[src_off + 0]; + TT[dst_off + 1] = TI[src_off + 1]; + TT[dst_off + 2] = TI[src_off + 2]; + TT[dst_off + 3] = TI[src_off + 3]; + } + + for (int dst_off = 4, src_off = 8; src_off < STATE_CNT4; dst_off += 4, src_off += 8) + { + TI[dst_off + 0] = TI[src_off + 0]; + TI[dst_off + 1] = TI[src_off + 1]; + TI[dst_off + 2] = TI[src_off + 2]; + TI[dst_off + 3] = TI[src_off + 3]; + } + + for (int dst_off = STATE_CNT4 / 2, src_off = 0; dst_off < STATE_CNT4; dst_off += 4, src_off += 4) + { + TI[dst_off + 0] = TT[src_off + 0]; + TI[dst_off + 1] = TT[src_off + 1]; + TI[dst_off + 2] = TT[src_off + 2]; + TI[dst_off + 3] = TT[src_off + 3]; + } + + #endif + uint4 R0 = TI[STATE_CNT4 - 4]; uint4 R1 = TI[STATE_CNT4 - 3]; uint4 R2 = TI[STATE_CNT4 - 2]; @@ -172,36 +202,6 @@ DECLSPEC void salsa_r (PRIVATE_AS uint4 *TI) TI[i + 2] = R2; TI[i + 3] = R3; } - - #if SCRYPT_R > 1 - - uint4 TT[STATE_CNT4 / 2]; - - for (int dst_off = 0, src_off = 4; src_off < STATE_CNT4; dst_off += 4, src_off += 8) - { - TT[dst_off + 0] = TI[src_off + 0]; - TT[dst_off + 1] = TI[src_off + 1]; - TT[dst_off + 2] = TI[src_off + 2]; - TT[dst_off + 3] = TI[src_off + 3]; - } - - for (int dst_off = 4, src_off = 8; src_off < STATE_CNT4; dst_off += 4, src_off += 8) - { - TI[dst_off + 0] = TI[src_off + 0]; - TI[dst_off + 1] = TI[src_off + 1]; - TI[dst_off + 2] = TI[src_off + 2]; - TI[dst_off + 3] = TI[src_off + 3]; - } - - for (int dst_off = STATE_CNT4 / 2, src_off = 0; dst_off < STATE_CNT4; dst_off += 4, src_off += 4) - { - TI[dst_off + 0] = TT[src_off + 0]; - TI[dst_off + 1] = TT[src_off + 1]; - TI[dst_off + 2] = TT[src_off + 2]; - TI[dst_off + 3] = TT[src_off + 3]; - } - - #endif } DECLSPEC void scrypt_smix_init (PRIVATE_AS uint4 *X, GLOBAL_AS uint4 *V0, GLOBAL_AS uint4 *V1, GLOBAL_AS uint4 *V2, GLOBAL_AS uint4 *V3, const u64 gid) @@ -224,6 +224,30 @@ DECLSPEC void scrypt_smix_init (PRIVATE_AS uint4 *X, GLOBAL_AS uint4 *V0, GLOBAL case 3: V = V3; break; } + #if SCRYPT_R > 1 + + uint4 TT[STATE_CNT4]; + + for (int z = 0; z < zSIZE; z++) TT[z] = X[z]; + + for (int dst_off = 8, src_off = 4; dst_off < zSIZE; dst_off += 8, src_off += 4) + { + X[dst_off + 0] = TT[src_off + 0]; + X[dst_off + 1] = TT[src_off + 1]; + X[dst_off + 2] = TT[src_off + 2]; + X[dst_off + 3] = TT[src_off + 3]; + } + + for (int dst_off = 4, src_off = zSIZE / 2; dst_off < zSIZE; dst_off += 8, src_off += 4) + { + X[dst_off + 0] = TT[src_off + 0]; + X[dst_off + 1] = TT[src_off + 1]; + X[dst_off + 2] = TT[src_off + 2]; + X[dst_off + 3] = TT[src_off + 3]; + } + + #endif + for (u32 y = 0; y < ySIZE; y++) { for (u32 z = 0; z < zSIZE; z++) V[CO] = X[z]; @@ -463,6 +487,9 @@ KERNEL_FQ void m15700_init (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, ethereum_scrypt_ #if defined IS_CUDA || defined IS_HIP const uint4 tmp0 = make_uint4 (digest[0], digest[1], digest[2], digest[3]); const uint4 tmp1 = make_uint4 (digest[4], digest[5], digest[6], digest[7]); + #elif defined IS_METAL + const uint4 tmp0 = uint4 (digest[0], digest[1], digest[2], digest[3]); + const uint4 tmp1 = uint4 (digest[4], digest[5], digest[6], digest[7]); #else const uint4 tmp0 = (uint4) (digest[0], digest[1], digest[2], digest[3]); const uint4 tmp1 = (uint4) (digest[4], digest[5], digest[6], digest[7]); @@ -493,6 +520,11 @@ KERNEL_FQ void m15700_init (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, ethereum_scrypt_ X[1] = make_uint4 (T[1].x, T[2].y, T[3].z, T[0].w); X[2] = make_uint4 (T[2].x, T[3].y, T[0].z, T[1].w); X[3] = make_uint4 (T[3].x, T[0].y, T[1].z, T[2].w); + #elif defined IS_METAL + X[0] = uint4 (T[0].x, T[1].y, T[2].z, T[3].w); + X[1] = uint4 (T[1].x, T[2].y, T[3].z, T[0].w); + X[2] = uint4 (T[2].x, T[3].y, T[0].z, T[1].w); + X[3] = uint4 (T[3].x, T[0].y, T[1].z, T[2].w); #else X[0] = (uint4) (T[0].x, T[1].y, T[2].z, T[3].w); X[1] = (uint4) (T[1].x, T[2].y, T[3].z, T[0].w); @@ -587,10 +619,15 @@ KERNEL_FQ void m15700_comp (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, ethereum_scrypt_ sha256_hmac_init_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); - for (u32 l = 0; l < SCRYPT_CNT4; l += 4) + + for (u32 i = 0; i < SCRYPT_CNT4; i += STATE_CNT4) { + for (u32 j = 0; j < (STATE_CNT4 * 2); j += 8) + { uint4 X[4]; + const u32 l = i + j + ((j >= STATE_CNT4) ? (4 - STATE_CNT4) : 0); + X[0] = tmps[gid].P[l + 0]; X[1] = tmps[gid].P[l + 1]; X[2] = tmps[gid].P[l + 2]; @@ -603,6 +640,11 @@ KERNEL_FQ void m15700_comp (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, ethereum_scrypt_ T[1] = make_uint4 (X[1].x, X[0].y, X[3].z, X[2].w); T[2] = make_uint4 (X[2].x, X[1].y, X[0].z, X[3].w); T[3] = make_uint4 (X[3].x, X[2].y, X[1].z, X[0].w); + #elif defined IS_METAL + T[0] = uint4 (X[0].x, X[3].y, X[2].z, X[1].w); + T[1] = uint4 (X[1].x, X[0].y, X[3].z, X[2].w); + T[2] = uint4 (X[2].x, X[1].y, X[0].z, X[3].w); + T[3] = uint4 (X[3].x, X[2].y, X[1].z, X[0].w); #else T[0] = (uint4) (X[0].x, X[3].y, X[2].z, X[1].w); T[1] = (uint4) (X[1].x, X[0].y, X[3].z, X[2].w); @@ -633,6 +675,7 @@ KERNEL_FQ void m15700_comp (KERN_ATTR_TMPS_ESALT (scrypt_tmp_t, ethereum_scrypt_ w3[3] = T[3].w; sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 64); + } } w0[0] = 1; diff --git a/OpenCL/m15900-pure.cl b/OpenCL/m15900-pure.cl index 9cff5d883..025c50f0d 100644 --- a/OpenCL/m15900-pure.cl +++ b/OpenCL/m15900-pure.cl @@ -40,7 +40,7 @@ typedef struct dpapimk u32 SID_offset; /* here only for possible - forward compatibiliy + forward compatibility */ // u8 cipher_algo[16]; // u8 hash_algo[16]; diff --git a/OpenCL/m15910-pure.cl b/OpenCL/m15910-pure.cl index d73d748ea..d9c781911 100644 --- a/OpenCL/m15910-pure.cl +++ b/OpenCL/m15910-pure.cl @@ -48,7 +48,7 @@ typedef struct dpapimk u32 SID_offset; /* here only for possible - forward compatibiliy + forward compatibility */ // u8 cipher_algo[16]; // u8 hash_algo[16]; diff --git a/OpenCL/m16800-pure.cl b/OpenCL/m16800-pure.cl index 710252ef3..e4752e21c 100644 --- a/OpenCL/m16800-pure.cl +++ b/OpenCL/m16800-pure.cl @@ -45,7 +45,7 @@ typedef struct wpa_pmkid } wpa_pmkid_t; -DECLSPEC void hmac_sha1_run_V (u32x *w0, u32x *w1, u32x *w2, u32x *w3, u32x *ipad, u32x *opad, u32x *digest) +DECLSPEC void hmac_sha1_run_V (u32x *w0, u32x *w1, u32x *w2, u32x *w3, const u32x *ipad, const u32x *opad, u32x *digest) { digest[0] = ipad[0]; digest[1] = ipad[1]; diff --git a/OpenCL/m17040-pure.cl b/OpenCL/m17040-pure.cl new file mode 100644 index 000000000..feeae009f --- /dev/null +++ b/OpenCL/m17040-pure.cl @@ -0,0 +1,404 @@ +/** + * Author......: Netherlands Forensic Institute + * based upon 17010 + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha1.cl) +#include M2S(INCLUDE_PATH/inc_cipher_cast.cl) +#endif + +typedef struct gpg +{ + u32 cipher_algo; + u32 iv[4]; // make this dynamic based on the input hash.. iv_size can be 8 bytes or 16 bytes + u32 modulus_size; + u32 encrypted_data[384]; + u32 encrypted_data_size; + +} gpg_t; + +typedef struct gpg_tmp +{ + // buffer for a maximum of 256 + 8 characters, we extend it to 320 characters so it's always 64 byte aligned + u32 salted_pw_block[80]; + // actual number of bytes in 'salted_pwd' that are used since salt and password are copied multiple times into the buffer + u32 salted_pw_block_len; + + u32 h[10]; + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + u32 len; + +} gpg_tmp_t; + + +DECLSPEC u32 hc_bytealign_le_S (const u32 a, const u32 b, const int c) +{ + const int c_mod_4 = c & 3; + + #if ((defined IS_AMD || defined IS_HIP) && HAS_VPERM == 0) || defined IS_GENERIC + const u32 r = l32_from_64_S ((v64_from_v32ab_S (b, a) >> (c_mod_4 * 8))); + #endif + + #if ((defined IS_AMD || defined IS_HIP) && HAS_VPERM == 1) || defined IS_NV + + #if defined IS_NV + const int selector = (0x76543210 >> (c_mod_4 * 4)) & 0xffff; + #endif + + #if (defined IS_AMD || defined IS_HIP) + const int selector = l32_from_64_S (0x0706050403020100UL >> (c_mod_4 * 8)); + #endif + + const u32 r = hc_byte_perm (b, a, selector); + #endif + + return r; +} + +DECLSPEC void memcat_le_S (PRIVATE_AS u32 *block, const u32 offset, PRIVATE_AS const u32 *append, u32 len) +{ + const u32 start_index = (offset - 1) >> 2; + const u32 count = ((offset + len + 3) >> 2) - start_index; + const int off_mod_4 = offset & 3; + const int off_minus_4 = 4 - off_mod_4; + + block[start_index] |= hc_bytealign_le_S (append[0], 0, off_minus_4); + + for (u32 idx = 1; idx < count; idx++) + { + block[start_index + idx] = hc_bytealign_le_S (append[idx], append[idx - 1], off_minus_4); + } +} + +DECLSPEC void memzero_le_S (PRIVATE_AS u32 *block, const u32 start_offset, const u32 end_offset) +{ + const u32 start_idx = start_offset / 4; + + // zero out bytes in the first u32 starting from 'start_offset' + // math is a bit complex to avoid shifting by 32 bits, which is not possible on some architectures + block[start_idx] &= ~(0xffffffff << ((start_offset & 3) * 8)); + + const u32 end_idx = (end_offset + 3) / 4; + + // zero out bytes in u32 units -- note that the last u32 is completely zeroed! + for (u32 i = start_idx + 1; i < end_idx; i++) + { + block[i] = 0; + } +} + +DECLSPEC void memzero_be_S (PRIVATE_AS u32 *block, const u32 start_offset, const u32 end_offset) +{ + const u32 start_idx = start_offset / 4; + + // zero out bytes in the first u32 starting from 'start_offset' + // math is a bit complex to avoid shifting by 32 bits, which is not possible on some architectures + block[start_idx] &= ~(0xffffffff >> ((start_offset & 3) * 8)); + + const u32 end_idx = (end_offset + 3) / 4; + + // zero out bytes in u32 units -- note that the last u32 is completely zeroed! + for (u32 i = start_idx + 1; i < end_idx; i++) + { + block[i] = 0; + } +} + +DECLSPEC void cast128_decrypt_cfb (GLOBAL_AS const u32 *encrypted_data, int data_len, PRIVATE_AS const u32 *iv, PRIVATE_AS const u32 *key, PRIVATE_AS u32 *decrypted_data, SHM_TYPE u32 (*s_S)[256]) +{ + u8 essiv[8]; + for (int j=0; j<8; j++) { essiv[j] = 0; } + + // TODO remove this casting, would speedup the attack + // We need to do this casting to get values in local memory and have them not be constant. + u32 lencrypted_data[384]; // I'd prefer not to hardcode to 384, but rest of kernel uses the same value + for (u32 i = 0; i < (data_len + 3) / 4; i += 4) + { + lencrypted_data[i + 0] = encrypted_data[i + 0]; + lencrypted_data[i + 1] = encrypted_data[i + 1]; + lencrypted_data[i + 2] = encrypted_data[i + 2]; + lencrypted_data[i + 3] = encrypted_data[i + 3]; + } + PRIVATE_AS u8 *lencrypted_data8 = (PRIVATE_AS u8*)lencrypted_data; + PRIVATE_AS u8 *decrypted_data8 = (PRIVATE_AS u8*)decrypted_data; + PRIVATE_AS u8 *key8 = (PRIVATE_AS u8*)key; + + + // Copy the IV, since this will be modified + // essiv[0] = iv[0]; // IV is zero for our example, but we load it dynamically.. + // essiv[1] = iv[1]; // IV is zero for our example, but we load it dynamically.. + // essiv[2] = 0; + // essiv[3] = 0; //TODO load IV dynamically, code doesn't make any sense currently as essiv is now a u8 + + CAST_KEY ck; + Cast5SetKey(&ck, 16, key8, s_S); + + // Decrypt an CAST5 encrypted block + for (u32 i = 0; i < (data_len + 3) ; i += 8) + { + Cast5Encrypt(essiv, &decrypted_data8[i], &ck, s_S); + + for (int j=0; j<8; j++) { decrypted_data8[i+j] ^= lencrypted_data8[i + j]; } + + // Note: Not necessary if you are only decrypting a single block! + for (int j=0; j<8; j++) { + essiv[j] = lencrypted_data8[i + j]; + } + } +} + +DECLSPEC int check_decoded_data (PRIVATE_AS u32 *decoded_data, const u32 decoded_data_size) +{ + // Check the SHA-1 of the decrypted data which is stored at the end of the decrypted data + const u32 sha1_byte_off = (decoded_data_size - 20); + const u32 sha1_u32_off = sha1_byte_off / 4; + + u32 expected_sha1[5]; + + expected_sha1[0] = hc_bytealign_le_S (decoded_data[sha1_u32_off + 1], decoded_data[sha1_u32_off + 0], sha1_byte_off); + expected_sha1[1] = hc_bytealign_le_S (decoded_data[sha1_u32_off + 2], decoded_data[sha1_u32_off + 1], sha1_byte_off); + expected_sha1[2] = hc_bytealign_le_S (decoded_data[sha1_u32_off + 3], decoded_data[sha1_u32_off + 2], sha1_byte_off); + expected_sha1[3] = hc_bytealign_le_S (decoded_data[sha1_u32_off + 4], decoded_data[sha1_u32_off + 3], sha1_byte_off); + expected_sha1[4] = hc_bytealign_le_S (decoded_data[sha1_u32_off + 5], decoded_data[sha1_u32_off + 4], sha1_byte_off); + + + + memzero_le_S (decoded_data, sha1_byte_off, 384 * sizeof(u32)); + + sha1_ctx_t ctx; + + sha1_init (&ctx); + + sha1_update_swap (&ctx, decoded_data, sha1_byte_off); + + sha1_final (&ctx); + + return (expected_sha1[0] == hc_swap32_S (ctx.h[0])) + && (expected_sha1[1] == hc_swap32_S (ctx.h[1])) + && (expected_sha1[2] == hc_swap32_S (ctx.h[2])) + && (expected_sha1[3] == hc_swap32_S (ctx.h[3])) + && (expected_sha1[4] == hc_swap32_S (ctx.h[4])); +} + +KERNEL_FQ void m17040_init (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +{ + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + const u32 pw_len = pws[gid].pw_len; + const u32 salted_pw_len = (salt_bufs[SALT_POS_HOST].salt_len + pw_len); + + u32 salted_pw_block[80]; + + // concatenate salt and password -- the salt is always 8 bytes + salted_pw_block[0] = salt_bufs[SALT_POS_HOST].salt_buf[0]; + salted_pw_block[1] = salt_bufs[SALT_POS_HOST].salt_buf[1]; + + for (u32 idx = 0; idx < 64; idx++) salted_pw_block[idx + 2] = pws[gid].i[idx]; + + // zero remainder of buffer + for (u32 idx = 66; idx < 80; idx++) salted_pw_block[idx] = 0; + + // create a number of copies for efficiency + const u32 copies = 80 * sizeof(u32) / salted_pw_len; + + for (u32 idx = 1; idx < copies; idx++) + { + memcat_le_S (salted_pw_block, idx * salted_pw_len, salted_pw_block, salted_pw_len); + } + + for (u32 idx = 0; idx < 80; idx++) + { + tmps[gid].salted_pw_block[idx] = hc_swap32_S (salted_pw_block[idx]); + } + + tmps[gid].salted_pw_block_len = (copies * salted_pw_len); + + tmps[gid].h[0] = SHA1M_A; + tmps[gid].h[1] = SHA1M_B; + tmps[gid].h[2] = SHA1M_C; + tmps[gid].h[3] = SHA1M_D; + tmps[gid].h[4] = SHA1M_E; + tmps[gid].h[5] = SHA1M_A; + tmps[gid].h[6] = SHA1M_B; + tmps[gid].h[7] = SHA1M_C; + tmps[gid].h[8] = SHA1M_D; + tmps[gid].h[9] = SHA1M_E; + + tmps[gid].len = 0; +} + +KERNEL_FQ void m17040_loop_prepare (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +{ + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + tmps[gid].h[0] = SHA1M_A; + tmps[gid].h[1] = SHA1M_B; + tmps[gid].h[2] = SHA1M_C; + tmps[gid].h[3] = SHA1M_D; + tmps[gid].h[4] = SHA1M_E; + tmps[gid].h[5] = SHA1M_A; + tmps[gid].h[6] = SHA1M_B; + tmps[gid].h[7] = SHA1M_C; + tmps[gid].h[8] = SHA1M_D; + tmps[gid].h[9] = SHA1M_E; + + tmps[gid].w0[0] = 0; + tmps[gid].w0[1] = 0; + tmps[gid].w0[2] = 0; + tmps[gid].w0[3] = 0; + tmps[gid].w1[0] = 0; + tmps[gid].w1[1] = 0; + tmps[gid].w1[2] = 0; + tmps[gid].w1[3] = 0; + tmps[gid].w2[0] = 0; + tmps[gid].w2[1] = 0; + tmps[gid].w2[2] = 0; + tmps[gid].w2[3] = 0; + tmps[gid].w3[0] = 0; + tmps[gid].w3[1] = 0; + tmps[gid].w3[2] = 0; + tmps[gid].w3[3] = 0; + + tmps[gid].len = 0; +} + +KERNEL_FQ void m17040_loop (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +{ + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + + if (gid >= GID_CNT) return; + + // get the prepared buffer from the gpg_tmp_t struct into a local buffer + u32 salted_pw_block[80]; + for (int i = 0; i < 80; i++) salted_pw_block[i] = tmps[gid].salted_pw_block[i]; + + + const u32 salted_pw_block_len = tmps[gid].salted_pw_block_len; + + // do we really need this, since the salt is always length 8? + if (salted_pw_block_len == 0) return; + + /** + * context load + */ + + sha1_ctx_t ctx; + + for (int i = 0; i < 5; i++) ctx.h[i] = tmps[gid].h[i]; + + for (int i = 0; i < 4; i++) ctx.w0[i] = tmps[gid].w0[i]; + for (int i = 0; i < 4; i++) ctx.w1[i] = tmps[gid].w1[i]; + for (int i = 0; i < 4; i++) ctx.w2[i] = tmps[gid].w2[i]; + for (int i = 0; i < 4; i++) ctx.w3[i] = tmps[gid].w3[i]; + + const u32 pw_len = pws[gid].pw_len; + const u32 salted_pw_len = (salt_bufs[SALT_POS_HOST].salt_len + pw_len); + const u32 remaining_bytes = salted_pw_len % 4; + + ctx.len = tmps[gid].len; + + memzero_be_S (salted_pw_block, salted_pw_len, salted_pw_block_len); + // zero out last bytes of password if not a multiple of 4 + // TODO do we need this wo don't feed the remainder to the hashing algorithm anyway..?? + sha1_update (&ctx, salted_pw_block, salted_pw_len); + sha1_final (&ctx); + + /** + * context save + */ + + for (int i = 0; i < 5; i++) tmps[gid].h[i] = ctx.h[i]; + // this is the sha1 hash of the salt+password: + + for (int i = 0; i < 4; i++) tmps[gid].w0[i] = ctx.w0[i]; + for (int i = 0; i < 4; i++) tmps[gid].w1[i] = ctx.w1[i]; + for (int i = 0; i < 4; i++) tmps[gid].w2[i] = ctx.w2[i]; + for (int i = 0; i < 4; i++) tmps[gid].w3[i] = ctx.w3[i]; + + tmps[gid].len = ctx.len; +} + +KERNEL_FQ void m17040_comp (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +{ + // not in use here, special case... +} + +KERNEL_FQ void m17040_aux1 (KERN_ATTR_TMPS_ESALT (gpg_tmp_t, gpg_t)) +{ + /** + * modifier + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * aes shared + */ + + #ifdef REAL_SHM + + LOCAL_VK u32 s_S[8][256]; + + for (u32 i = lid; i < 256; i += lsz) + { + s_S[0][i] = S[0][i]; + s_S[1][i] = S[1][i]; + s_S[2][i] = S[2][i]; + s_S[3][i] = S[3][i]; + s_S[4][i] = S[4][i]; + s_S[5][i] = S[5][i]; + s_S[6][i] = S[6][i]; + s_S[7][i] = S[7][i]; + } + + SYNC_THREADS (); + + #else + + CONSTANT_AS u32a (*s_S)[256] = S; + + #endif + + if (gid >= GID_CNT) return; + + // retrieve and use the SHA-1 as the key for CAST5 + u32 cast_key[5]; + for (int i = 0; i < 5; i++) cast_key[i] = hc_swap32_S (tmps[gid].h[i]); + + u32 iv[4] = {0}; + for (int idx = 0; idx < 4; idx++) iv[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].iv[idx]; + + u32 decoded_data[384]; + + const u32 enc_data_size = esalt_bufs[DIGESTS_OFFSET_HOST].encrypted_data_size; + + cast128_decrypt_cfb (esalt_bufs[DIGESTS_OFFSET_HOST].encrypted_data, enc_data_size, iv, cast_key, decoded_data, s_S); + + if (check_decoded_data (decoded_data, enc_data_size)) + { + if (hc_atomic_inc (&hashes_shown[DIGESTS_OFFSET_HOST]) == 0) + { + mark_hash (plains_buf, d_return_buf, SALT_POS_HOST, DIGESTS_CNT, 0, DIGESTS_OFFSET_HOST + 0, gid, 0, 0, 0); + } + } +} diff --git a/OpenCL/m18600-pure.cl b/OpenCL/m18600-pure.cl index 6280e0a57..1e00f6628 100644 --- a/OpenCL/m18600-pure.cl +++ b/OpenCL/m18600-pure.cl @@ -350,7 +350,7 @@ DECLSPEC void SET_KEY32 (LOCAL_AS u32 *S, const u64 key, const u32 val) #else -// access pattern: linear access with S offset already set to right offset based on thread ID saving it from compuation +// access pattern: linear access with S offset already set to right offset based on thread ID saving it from computation // makes sense if there are not thread ID's (for instance on CPU) DECLSPEC inline u32 GET_KEY32 (LOCAL_AS u32 *S, const u64 key) diff --git a/OpenCL/m20712_a0-optimized.cl b/OpenCL/m20712_a0-optimized.cl new file mode 100644 index 000000000..48f5e9463 --- /dev/null +++ b/OpenCL/m20712_a0-optimized.cl @@ -0,0 +1,1233 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_rp_optimized.h) +#include M2S(INCLUDE_PATH/inc_rp_optimized.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha256.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +#define SHA256_STEP_REV(a,b,c,d,e,f,g,h) \ +{ \ + u32 t2 = SHA256_S2_S(b) + SHA256_F0o(b,c,d); \ + u32 t1 = a - t2; \ + a = b; \ + b = c; \ + c = d; \ + d = e - t1; \ + e = f; \ + f = g; \ + g = h; \ + h = 0; \ +} + +KERNEL_FQ void m20712_m04 (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 0 + | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 8; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + salt_buf0[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 0]); + salt_buf0[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 1]); + salt_buf0[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 2]); + salt_buf0[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 3]); + salt_buf1[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 4]); + salt_buf1[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 5]); + salt_buf1[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 6]); + salt_buf1[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 7]); + salt_buf2[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 8]); + salt_buf2[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 9]); + salt_buf2[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[10]); + salt_buf2[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[11]); + salt_buf3[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[12]); + salt_buf3[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[13]); + salt_buf3[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[14]); + salt_buf3[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[15]); + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + u32x w0[4] = { 0 }; + u32x w1[4] = { 0 }; + u32x w2[4] = { 0 }; + u32x w3[4] = { 0 }; + + const u32x out_len = apply_rules_vect_optimized (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); + + append_0x80_2x4_VV (w0, w1, out_len); + + /** + * sha256(pass) + */ + + u32x w0_t = hc_swap32 (w0[0]); + u32x w1_t = hc_swap32 (w0[1]); + u32x w2_t = hc_swap32 (w0[2]); + u32x w3_t = hc_swap32 (w0[3]); + u32x w4_t = hc_swap32 (w1[0]); + u32x w5_t = hc_swap32 (w1[1]); + u32x w6_t = hc_swap32 (w1[2]); + u32x w7_t = hc_swap32 (w1[3]); + u32x w8_t = hc_swap32 (w2[0]); + u32x w9_t = hc_swap32 (w2[1]); + u32x wa_t = hc_swap32 (w2[2]); + u32x wb_t = hc_swap32 (w2[3]); + u32x wc_t = hc_swap32 (w3[0]); + u32x wd_t = hc_swap32 (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + a += make_u32x (SHA256M_A); + b += make_u32x (SHA256M_B); + c += make_u32x (SHA256M_C); + d += make_u32x (SHA256M_D); + e += make_u32x (SHA256M_E); + f += make_u32x (SHA256M_F); + g += make_u32x (SHA256M_G); + h += make_u32x (SHA256M_H); + + // final sha256 + + // sha256_update_64, len 64, pos 0 + + w0_t = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w1_t = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w2_t = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w4_t = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w5_t = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + w6_t = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w7_t = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w8_t = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w9_t = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + wa_t = uint_to_hex_lower8_le ((f >> 16) & 255) << 0 | uint_to_hex_lower8_le ((f >> 24) & 255) << 16; + wb_t = uint_to_hex_lower8_le ((f >> 0) & 255) << 0 | uint_to_hex_lower8_le ((f >> 8) & 255) << 16; + wc_t = uint_to_hex_lower8_le ((g >> 16) & 255) << 0 | uint_to_hex_lower8_le ((g >> 24) & 255) << 16; + wd_t = uint_to_hex_lower8_le ((g >> 0) & 255) << 0 | uint_to_hex_lower8_le ((g >> 8) & 255) << 16; + we_t = uint_to_hex_lower8_le ((h >> 16) & 255) << 0 | uint_to_hex_lower8_le ((h >> 24) & 255) << 16; + wf_t = uint_to_hex_lower8_le ((h >> 0) & 255) << 0 | uint_to_hex_lower8_le ((h >> 8) & 255) << 16; + + // sha256 transform + + a = SHA256M_A; + b = SHA256M_B; + c = SHA256M_C; + d = SHA256M_D; + e = SHA256M_E; + f = SHA256M_F; + g = SHA256M_G; + h = SHA256M_H; + + u32x digest[8]; + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + + // append salt + + // sha256_update: ctx_len 64, pos 0, len = salt_len + + w0_t = salt_buf0[0]; + w1_t = salt_buf0[1]; + w2_t = salt_buf0[2]; + w3_t = salt_buf0[3]; + w4_t = salt_buf1[0]; + w5_t = salt_buf1[1]; + w6_t = salt_buf1[2]; + w7_t = salt_buf1[3]; + w8_t = salt_buf2[0]; + w9_t = salt_buf2[1]; + wa_t = salt_buf2[2]; + wb_t = salt_buf2[3]; + wc_t = salt_buf3[0]; + wd_t = salt_buf3[1]; + we_t = salt_buf3[2]; + wf_t = salt_buf3[3]; + + // sha256_update_64: pos 0 + + const int ctx_len = 64 + salt_len; + + const int pos = ctx_len & 63; + + // append_0x80_4x4, offset = pos ^ 3 + + const u32 off = pos ^ 3; + + const u32 c0 = (off & 15) / 4; + + const u32 r0 = 0xff << ((off & 3) * 8); + + const u32 m0[4] = { ((c0 == 0) ? r0 : 0), ((c0 == 1) ? r0 : 0), ((c0 == 2) ? r0 : 0), ((c0 == 3) ? r0 : 0) }; + + const u32 off16 = off / 16; + + const u32 v0[4] = { ((off16 == 0) ? 0x80808080 : 0), ((off16 == 1) ? 0x80808080 : 0), ((off16 == 2) ? 0x80808080 : 0), ((off16 == 3) ? 0x80808080 : 0) }; + + w0_t |= v0[0] & m0[0]; + w1_t |= v0[0] & m0[1]; + w2_t |= v0[0] & m0[2]; + w3_t |= v0[0] & m0[3]; + w4_t |= v0[1] & m0[0]; + w5_t |= v0[1] & m0[1]; + w6_t |= v0[1] & m0[2]; + w7_t |= v0[1] & m0[3]; + w8_t |= v0[2] & m0[0]; + w9_t |= v0[2] & m0[1]; + wa_t |= v0[2] & m0[2]; + wb_t |= v0[2] & m0[3]; + wc_t |= v0[3] & m0[0]; + wd_t |= v0[3] & m0[1]; + we_t |= v0[3] & m0[2]; + wf_t |= v0[3] & m0[3]; + + if (pos >= 56) + { + // sha256 transform + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + + w0_t = 0; + w1_t = 0; + w2_t = 0; + w3_t = 0; + w4_t = 0; + w5_t = 0; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 0; + } + + // last sha256 transform + + we_t = 0; + wf_t = ctx_len * 8; + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + f = digest[5]; + g = digest[6]; + h = digest[7]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + +// a += digest[0] - SHA256M_A; +// b += digest[1] - SHA256M_B; + c += digest[2] - make_u32x (SHA256M_C); + d += digest[3] - make_u32x (SHA256M_D); +// e += digest[4] - SHA256M_E; +// f += digest[5] - SHA256M_F; + g += digest[6] - make_u32x (SHA256M_G); + h += digest[7] - make_u32x (SHA256M_H); + + COMPARE_M_SIMD (d, h, c, g); + } +} + +KERNEL_FQ void m20712_m08 (KERN_ATTR_RULES ()) +{ +} + +KERNEL_FQ void m20712_m16 (KERN_ATTR_RULES ()) +{ +} + +KERNEL_FQ void m20712_s04 (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 0 + | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 8; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + salt_buf0[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 0]); + salt_buf0[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 1]); + salt_buf0[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 2]); + salt_buf0[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 3]); + salt_buf1[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 4]); + salt_buf1[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 5]); + salt_buf1[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 6]); + salt_buf1[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 7]); + salt_buf2[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 8]); + salt_buf2[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 9]); + salt_buf2[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[10]); + salt_buf2[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[11]); + salt_buf3[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[12]); + salt_buf3[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[13]); + salt_buf3[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[14]); + salt_buf3[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[15]); + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + u32x w0[4] = { 0 }; + u32x w1[4] = { 0 }; + u32x w2[4] = { 0 }; + u32x w3[4] = { 0 }; + + const u32x out_len = apply_rules_vect_optimized (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); + + append_0x80_2x4_VV (w0, w1, out_len); + + /** + * sha256(pass) + */ + + u32x w0_t = hc_swap32 (w0[0]); + u32x w1_t = hc_swap32 (w0[1]); + u32x w2_t = hc_swap32 (w0[2]); + u32x w3_t = hc_swap32 (w0[3]); + u32x w4_t = hc_swap32 (w1[0]); + u32x w5_t = hc_swap32 (w1[1]); + u32x w6_t = hc_swap32 (w1[2]); + u32x w7_t = hc_swap32 (w1[3]); + u32x w8_t = hc_swap32 (w2[0]); + u32x w9_t = hc_swap32 (w2[1]); + u32x wa_t = hc_swap32 (w2[2]); + u32x wb_t = hc_swap32 (w2[3]); + u32x wc_t = hc_swap32 (w3[0]); + u32x wd_t = hc_swap32 (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + a += make_u32x (SHA256M_A); + b += make_u32x (SHA256M_B); + c += make_u32x (SHA256M_C); + d += make_u32x (SHA256M_D); + e += make_u32x (SHA256M_E); + f += make_u32x (SHA256M_F); + g += make_u32x (SHA256M_G); + h += make_u32x (SHA256M_H); + + // final sha256 + + // sha256_update_64, len 64, pos 0 + + w0_t = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w1_t = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w2_t = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w4_t = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w5_t = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + w6_t = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w7_t = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w8_t = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w9_t = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + wa_t = uint_to_hex_lower8_le ((f >> 16) & 255) << 0 | uint_to_hex_lower8_le ((f >> 24) & 255) << 16; + wb_t = uint_to_hex_lower8_le ((f >> 0) & 255) << 0 | uint_to_hex_lower8_le ((f >> 8) & 255) << 16; + wc_t = uint_to_hex_lower8_le ((g >> 16) & 255) << 0 | uint_to_hex_lower8_le ((g >> 24) & 255) << 16; + wd_t = uint_to_hex_lower8_le ((g >> 0) & 255) << 0 | uint_to_hex_lower8_le ((g >> 8) & 255) << 16; + we_t = uint_to_hex_lower8_le ((h >> 16) & 255) << 0 | uint_to_hex_lower8_le ((h >> 24) & 255) << 16; + wf_t = uint_to_hex_lower8_le ((h >> 0) & 255) << 0 | uint_to_hex_lower8_le ((h >> 8) & 255) << 16; + + // sha256 transform + + a = SHA256M_A; + b = SHA256M_B; + c = SHA256M_C; + d = SHA256M_D; + e = SHA256M_E; + f = SHA256M_F; + g = SHA256M_G; + h = SHA256M_H; + + u32x digest[8]; + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + + // append salt + + // sha256_update: ctx_len 64, pos 0, len = salt_len + + w0_t = salt_buf0[0]; + w1_t = salt_buf0[1]; + w2_t = salt_buf0[2]; + w3_t = salt_buf0[3]; + w4_t = salt_buf1[0]; + w5_t = salt_buf1[1]; + w6_t = salt_buf1[2]; + w7_t = salt_buf1[3]; + w8_t = salt_buf2[0]; + w9_t = salt_buf2[1]; + wa_t = salt_buf2[2]; + wb_t = salt_buf2[3]; + wc_t = salt_buf3[0]; + wd_t = salt_buf3[1]; + we_t = salt_buf3[2]; + wf_t = salt_buf3[3]; + + // sha256_update_64: pos 0 + + const int ctx_len = 64 + salt_len; + + const int pos = ctx_len & 63; + + // append_0x80_4x4, offset = pos ^ 3 + + const u32 off = pos ^ 3; + + const u32 c0 = (off & 15) / 4; + + const u32 r0 = 0xff << ((off & 3) * 8); + + const u32 m0[4] = { ((c0 == 0) ? r0 : 0), ((c0 == 1) ? r0 : 0), ((c0 == 2) ? r0 : 0), ((c0 == 3) ? r0 : 0) }; + + const u32 off16 = off / 16; + + const u32 v0[4] = { ((off16 == 0) ? 0x80808080 : 0), ((off16 == 1) ? 0x80808080 : 0), ((off16 == 2) ? 0x80808080 : 0), ((off16 == 3) ? 0x80808080 : 0) }; + + w0_t |= v0[0] & m0[0]; + w1_t |= v0[0] & m0[1]; + w2_t |= v0[0] & m0[2]; + w3_t |= v0[0] & m0[3]; + w4_t |= v0[1] & m0[0]; + w5_t |= v0[1] & m0[1]; + w6_t |= v0[1] & m0[2]; + w7_t |= v0[1] & m0[3]; + w8_t |= v0[2] & m0[0]; + w9_t |= v0[2] & m0[1]; + wa_t |= v0[2] & m0[2]; + wb_t |= v0[2] & m0[3]; + wc_t |= v0[3] & m0[0]; + wd_t |= v0[3] & m0[1]; + we_t |= v0[3] & m0[2]; + wf_t |= v0[3] & m0[3]; + + if (pos >= 56) + { + // sha256 transform + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + + w0_t = 0; + w1_t = 0; + w2_t = 0; + w3_t = 0; + w4_t = 0; + w5_t = 0; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 0; + } + + // last sha256 transform + + we_t = 0; + wf_t = ctx_len * 8; + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + f = digest[5]; + g = digest[6]; + h = digest[7]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + + // if (MATCHES_NONE_VS ((h + digest[7] - make_u32x (SHA256M_H)), d_rev)) continue; + + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + + if (MATCHES_NONE_VS ((h + digest[7] - make_u32x (SHA256M_H)), search[1])) continue; + + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + +// a += digest[0] - SHA256M_A; +// b += digest[1] - SHA256M_B; + c += digest[2] - make_u32x (SHA256M_C); + d += digest[3] - make_u32x (SHA256M_D); +// e += digest[4] - SHA256M_E; +// f += digest[5] - SHA256M_F; + g += digest[6] - make_u32x (SHA256M_G); + h += digest[7] - make_u32x (SHA256M_H); + + COMPARE_S_SIMD (d, h, c, g); + } +} + +KERNEL_FQ void m20712_s08 (KERN_ATTR_RULES ()) +{ +} + +KERNEL_FQ void m20712_s16 (KERN_ATTR_RULES ()) +{ +} diff --git a/OpenCL/m20712_a0-pure.cl b/OpenCL/m20712_a0-pure.cl new file mode 100644 index 000000000..4ec9014e3 --- /dev/null +++ b/OpenCL/m20712_a0-pure.cl @@ -0,0 +1,265 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_rp.h) +#include M2S(INCLUDE_PATH/inc_rp.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha256.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +KERNEL_FQ void m20712_mxx (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 0 + | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 8; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + COPY_PW (pws[gid]); + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + pw_t tmp = PASTE_PW; + + tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); + + sha256_ctx_t ctx0; + + sha256_init (&ctx0); + + sha256_update_swap (&ctx0, tmp.i, tmp.pw_len); + + sha256_final (&ctx0); + + const u32 a = ctx0.h[0]; + const u32 b = ctx0.h[1]; + const u32 c = ctx0.h[2]; + const u32 d = ctx0.h[3]; + const u32 e = ctx0.h[4]; + const u32 f = ctx0.h[5]; + const u32 g = ctx0.h[6]; + const u32 h = ctx0.h[7]; + + sha256_ctx_t ctx; + + sha256_init (&ctx); + + w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w2[2] = uint_to_hex_lower8_le ((f >> 16) & 255) << 0 | uint_to_hex_lower8_le ((f >> 24) & 255) << 16; + w2[3] = uint_to_hex_lower8_le ((f >> 0) & 255) << 0 | uint_to_hex_lower8_le ((f >> 8) & 255) << 16; + w3[0] = uint_to_hex_lower8_le ((g >> 16) & 255) << 0 | uint_to_hex_lower8_le ((g >> 24) & 255) << 16; + w3[1] = uint_to_hex_lower8_le ((g >> 0) & 255) << 0 | uint_to_hex_lower8_le ((g >> 8) & 255) << 16; + w3[2] = uint_to_hex_lower8_le ((h >> 16) & 255) << 0 | uint_to_hex_lower8_le ((h >> 24) & 255) << 16; + w3[3] = uint_to_hex_lower8_le ((h >> 0) & 255) << 0 | uint_to_hex_lower8_le ((h >> 8) & 255) << 16; + + sha256_update_64 (&ctx, w0, w1, w2, w3, 64); + + sha256_update (&ctx, s, salt_len); + + sha256_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_M_SCALAR (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m20712_sxx (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 0 + | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 8; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + COPY_PW (pws[gid]); + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + pw_t tmp = PASTE_PW; + + tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); + + sha256_ctx_t ctx0; + + sha256_init (&ctx0); + + sha256_update_swap (&ctx0, tmp.i, tmp.pw_len); + + sha256_final (&ctx0); + + const u32 a = ctx0.h[0]; + const u32 b = ctx0.h[1]; + const u32 c = ctx0.h[2]; + const u32 d = ctx0.h[3]; + const u32 e = ctx0.h[4]; + const u32 f = ctx0.h[5]; + const u32 g = ctx0.h[6]; + const u32 h = ctx0.h[7]; + + sha256_ctx_t ctx; + + sha256_init (&ctx); + + w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w2[2] = uint_to_hex_lower8_le ((f >> 16) & 255) << 0 | uint_to_hex_lower8_le ((f >> 24) & 255) << 16; + w2[3] = uint_to_hex_lower8_le ((f >> 0) & 255) << 0 | uint_to_hex_lower8_le ((f >> 8) & 255) << 16; + w3[0] = uint_to_hex_lower8_le ((g >> 16) & 255) << 0 | uint_to_hex_lower8_le ((g >> 24) & 255) << 16; + w3[1] = uint_to_hex_lower8_le ((g >> 0) & 255) << 0 | uint_to_hex_lower8_le ((g >> 8) & 255) << 16; + w3[2] = uint_to_hex_lower8_le ((h >> 16) & 255) << 0 | uint_to_hex_lower8_le ((h >> 24) & 255) << 16; + w3[3] = uint_to_hex_lower8_le ((h >> 0) & 255) << 0 | uint_to_hex_lower8_le ((h >> 8) & 255) << 16; + + sha256_update_64 (&ctx, w0, w1, w2, w3, 64); + + sha256_update (&ctx, s, salt_len); + + sha256_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_S_SCALAR (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m20712_a1-optimized.cl b/OpenCL/m20712_a1-optimized.cl new file mode 100644 index 000000000..b1088a630 --- /dev/null +++ b/OpenCL/m20712_a1-optimized.cl @@ -0,0 +1,1347 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha256.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +#define SHA256_STEP_REV(a,b,c,d,e,f,g,h) \ +{ \ + u32 t2 = SHA256_S2_S(b) + SHA256_F0o(b,c,d); \ + u32 t1 = a - t2; \ + a = b; \ + b = c; \ + c = d; \ + d = e - t1; \ + e = f; \ + f = g; \ + g = h; \ + h = 0; \ +} + +KERNEL_FQ void m20712_m04 (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 0 + | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 8; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_l_len = pws[gid].pw_len & 63; + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + salt_buf0[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 0]); + salt_buf0[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 1]); + salt_buf0[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 2]); + salt_buf0[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 3]); + salt_buf1[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 4]); + salt_buf1[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 5]); + salt_buf1[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 6]); + salt_buf1[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 7]); + salt_buf2[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 8]); + salt_buf2[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 9]); + salt_buf2[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[10]); + salt_buf2[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[11]); + salt_buf3[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[12]); + salt_buf3[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[13]); + salt_buf3[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[14]); + salt_buf3[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[15]); + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos) & 63; + + const u32x pw_len = (pw_l_len + pw_r_len) & 63; + + /** + * concat password candidate + */ + + u32x wordl0[4] = { 0 }; + u32x wordl1[4] = { 0 }; + u32x wordl2[4] = { 0 }; + u32x wordl3[4] = { 0 }; + + wordl0[0] = pw_buf0[0]; + wordl0[1] = pw_buf0[1]; + wordl0[2] = pw_buf0[2]; + wordl0[3] = pw_buf0[3]; + wordl1[0] = pw_buf1[0]; + wordl1[1] = pw_buf1[1]; + wordl1[2] = pw_buf1[2]; + wordl1[3] = pw_buf1[3]; + + u32x wordr0[4] = { 0 }; + u32x wordr1[4] = { 0 }; + u32x wordr2[4] = { 0 }; + u32x wordr3[4] = { 0 }; + + wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); + wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); + wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); + wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); + wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); + wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); + wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); + wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); + + if (COMBS_MODE == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + else + { + switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * sha256(pass) + */ + + u32x w0_t = hc_swap32 (w0[0]); + u32x w1_t = hc_swap32 (w0[1]); + u32x w2_t = hc_swap32 (w0[2]); + u32x w3_t = hc_swap32 (w0[3]); + u32x w4_t = hc_swap32 (w1[0]); + u32x w5_t = hc_swap32 (w1[1]); + u32x w6_t = hc_swap32 (w1[2]); + u32x w7_t = hc_swap32 (w1[3]); + u32x w8_t = hc_swap32 (w2[0]); + u32x w9_t = hc_swap32 (w2[1]); + u32x wa_t = hc_swap32 (w2[2]); + u32x wb_t = hc_swap32 (w2[3]); + u32x wc_t = hc_swap32 (w3[0]); + u32x wd_t = hc_swap32 (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + a += make_u32x (SHA256M_A); + b += make_u32x (SHA256M_B); + c += make_u32x (SHA256M_C); + d += make_u32x (SHA256M_D); + e += make_u32x (SHA256M_E); + f += make_u32x (SHA256M_F); + g += make_u32x (SHA256M_G); + h += make_u32x (SHA256M_H); + + // final sha256 + + // sha256_update_64, len 64, pos 0 + + w0_t = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w1_t = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w2_t = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w4_t = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w5_t = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + w6_t = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w7_t = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w8_t = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w9_t = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + wa_t = uint_to_hex_lower8_le ((f >> 16) & 255) << 0 | uint_to_hex_lower8_le ((f >> 24) & 255) << 16; + wb_t = uint_to_hex_lower8_le ((f >> 0) & 255) << 0 | uint_to_hex_lower8_le ((f >> 8) & 255) << 16; + wc_t = uint_to_hex_lower8_le ((g >> 16) & 255) << 0 | uint_to_hex_lower8_le ((g >> 24) & 255) << 16; + wd_t = uint_to_hex_lower8_le ((g >> 0) & 255) << 0 | uint_to_hex_lower8_le ((g >> 8) & 255) << 16; + we_t = uint_to_hex_lower8_le ((h >> 16) & 255) << 0 | uint_to_hex_lower8_le ((h >> 24) & 255) << 16; + wf_t = uint_to_hex_lower8_le ((h >> 0) & 255) << 0 | uint_to_hex_lower8_le ((h >> 8) & 255) << 16; + + // sha256 transform + + a = SHA256M_A; + b = SHA256M_B; + c = SHA256M_C; + d = SHA256M_D; + e = SHA256M_E; + f = SHA256M_F; + g = SHA256M_G; + h = SHA256M_H; + + u32x digest[8]; + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + + // append salt + + // sha256_update: ctx_len 64, pos 0, len = salt_len + + w0_t = salt_buf0[0]; + w1_t = salt_buf0[1]; + w2_t = salt_buf0[2]; + w3_t = salt_buf0[3]; + w4_t = salt_buf1[0]; + w5_t = salt_buf1[1]; + w6_t = salt_buf1[2]; + w7_t = salt_buf1[3]; + w8_t = salt_buf2[0]; + w9_t = salt_buf2[1]; + wa_t = salt_buf2[2]; + wb_t = salt_buf2[3]; + wc_t = salt_buf3[0]; + wd_t = salt_buf3[1]; + we_t = salt_buf3[2]; + wf_t = salt_buf3[3]; + + // sha256_update_64: pos 0 + + const int ctx_len = 64 + salt_len; + + const int pos = ctx_len & 63; + + // append_0x80_4x4, offset = pos ^ 3 + + const u32 off = pos ^ 3; + + const u32 c0 = (off & 15) / 4; + + const u32 r0 = 0xff << ((off & 3) * 8); + + const u32 m0[4] = { ((c0 == 0) ? r0 : 0), ((c0 == 1) ? r0 : 0), ((c0 == 2) ? r0 : 0), ((c0 == 3) ? r0 : 0) }; + + const u32 off16 = off / 16; + + const u32 v0[4] = { ((off16 == 0) ? 0x80808080 : 0), ((off16 == 1) ? 0x80808080 : 0), ((off16 == 2) ? 0x80808080 : 0), ((off16 == 3) ? 0x80808080 : 0) }; + + w0_t |= v0[0] & m0[0]; + w1_t |= v0[0] & m0[1]; + w2_t |= v0[0] & m0[2]; + w3_t |= v0[0] & m0[3]; + w4_t |= v0[1] & m0[0]; + w5_t |= v0[1] & m0[1]; + w6_t |= v0[1] & m0[2]; + w7_t |= v0[1] & m0[3]; + w8_t |= v0[2] & m0[0]; + w9_t |= v0[2] & m0[1]; + wa_t |= v0[2] & m0[2]; + wb_t |= v0[2] & m0[3]; + wc_t |= v0[3] & m0[0]; + wd_t |= v0[3] & m0[1]; + we_t |= v0[3] & m0[2]; + wf_t |= v0[3] & m0[3]; + + if (pos >= 56) + { + // sha256 transform + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + + w0_t = 0; + w1_t = 0; + w2_t = 0; + w3_t = 0; + w4_t = 0; + w5_t = 0; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 0; + } + + // last sha256 transform + + we_t = 0; + wf_t = ctx_len * 8; + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + f = digest[5]; + g = digest[6]; + h = digest[7]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + +// a += digest[0] - SHA256M_A; +// b += digest[1] - SHA256M_B; + c += digest[2] - make_u32x (SHA256M_C); + d += digest[3] - make_u32x (SHA256M_D); +// e += digest[4] - SHA256M_E; +// f += digest[5] - SHA256M_F; + g += digest[6] - make_u32x (SHA256M_G); + h += digest[7] - make_u32x (SHA256M_H); + + COMPARE_M_SIMD (d, h, c, g); + } +} + +KERNEL_FQ void m20712_m08 (KERN_ATTR_BASIC ()) +{ +} + +KERNEL_FQ void m20712_m16 (KERN_ATTR_BASIC ()) +{ +} + +KERNEL_FQ void m20712_s04 (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 0 + | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 8; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_l_len = pws[gid].pw_len & 63; + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + salt_buf0[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 0]); + salt_buf0[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 1]); + salt_buf0[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 2]); + salt_buf0[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 3]); + salt_buf1[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 4]); + salt_buf1[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 5]); + salt_buf1[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 6]); + salt_buf1[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 7]); + salt_buf2[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 8]); + salt_buf2[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 9]); + salt_buf2[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[10]); + salt_buf2[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[11]); + salt_buf3[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[12]); + salt_buf3[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[13]); + salt_buf3[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[14]); + salt_buf3[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[15]); + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos) & 63; + + const u32x pw_len = (pw_l_len + pw_r_len) & 63; + + /** + * concat password candidate + */ + + u32x wordl0[4] = { 0 }; + u32x wordl1[4] = { 0 }; + u32x wordl2[4] = { 0 }; + u32x wordl3[4] = { 0 }; + + wordl0[0] = pw_buf0[0]; + wordl0[1] = pw_buf0[1]; + wordl0[2] = pw_buf0[2]; + wordl0[3] = pw_buf0[3]; + wordl1[0] = pw_buf1[0]; + wordl1[1] = pw_buf1[1]; + wordl1[2] = pw_buf1[2]; + wordl1[3] = pw_buf1[3]; + + u32x wordr0[4] = { 0 }; + u32x wordr1[4] = { 0 }; + u32x wordr2[4] = { 0 }; + u32x wordr3[4] = { 0 }; + + wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); + wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); + wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); + wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); + wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); + wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); + wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); + wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); + + if (COMBS_MODE == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + else + { + switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * sha256(pass) + */ + + u32x w0_t = hc_swap32 (w0[0]); + u32x w1_t = hc_swap32 (w0[1]); + u32x w2_t = hc_swap32 (w0[2]); + u32x w3_t = hc_swap32 (w0[3]); + u32x w4_t = hc_swap32 (w1[0]); + u32x w5_t = hc_swap32 (w1[1]); + u32x w6_t = hc_swap32 (w1[2]); + u32x w7_t = hc_swap32 (w1[3]); + u32x w8_t = hc_swap32 (w2[0]); + u32x w9_t = hc_swap32 (w2[1]); + u32x wa_t = hc_swap32 (w2[2]); + u32x wb_t = hc_swap32 (w2[3]); + u32x wc_t = hc_swap32 (w3[0]); + u32x wd_t = hc_swap32 (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + a += make_u32x (SHA256M_A); + b += make_u32x (SHA256M_B); + c += make_u32x (SHA256M_C); + d += make_u32x (SHA256M_D); + e += make_u32x (SHA256M_E); + f += make_u32x (SHA256M_F); + g += make_u32x (SHA256M_G); + h += make_u32x (SHA256M_H); + + // final sha256 + + // sha256_update_64, len 64, pos 0 + + w0_t = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w1_t = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w2_t = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w4_t = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w5_t = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + w6_t = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w7_t = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w8_t = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w9_t = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + wa_t = uint_to_hex_lower8_le ((f >> 16) & 255) << 0 | uint_to_hex_lower8_le ((f >> 24) & 255) << 16; + wb_t = uint_to_hex_lower8_le ((f >> 0) & 255) << 0 | uint_to_hex_lower8_le ((f >> 8) & 255) << 16; + wc_t = uint_to_hex_lower8_le ((g >> 16) & 255) << 0 | uint_to_hex_lower8_le ((g >> 24) & 255) << 16; + wd_t = uint_to_hex_lower8_le ((g >> 0) & 255) << 0 | uint_to_hex_lower8_le ((g >> 8) & 255) << 16; + we_t = uint_to_hex_lower8_le ((h >> 16) & 255) << 0 | uint_to_hex_lower8_le ((h >> 24) & 255) << 16; + wf_t = uint_to_hex_lower8_le ((h >> 0) & 255) << 0 | uint_to_hex_lower8_le ((h >> 8) & 255) << 16; + + // sha256 transform + + a = SHA256M_A; + b = SHA256M_B; + c = SHA256M_C; + d = SHA256M_D; + e = SHA256M_E; + f = SHA256M_F; + g = SHA256M_G; + h = SHA256M_H; + + u32x digest[8]; + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + + // append salt + + // sha256_update: ctx_len 64, pos 0, len = salt_len + + w0_t = salt_buf0[0]; + w1_t = salt_buf0[1]; + w2_t = salt_buf0[2]; + w3_t = salt_buf0[3]; + w4_t = salt_buf1[0]; + w5_t = salt_buf1[1]; + w6_t = salt_buf1[2]; + w7_t = salt_buf1[3]; + w8_t = salt_buf2[0]; + w9_t = salt_buf2[1]; + wa_t = salt_buf2[2]; + wb_t = salt_buf2[3]; + wc_t = salt_buf3[0]; + wd_t = salt_buf3[1]; + we_t = salt_buf3[2]; + wf_t = salt_buf3[3]; + + // sha256_update_64: pos 0 + + const int ctx_len = 64 + salt_len; + + const int pos = ctx_len & 63; + + // append_0x80_4x4, offset = pos ^ 3 + + const u32 off = pos ^ 3; + + const u32 c0 = (off & 15) / 4; + + const u32 r0 = 0xff << ((off & 3) * 8); + + const u32 m0[4] = { ((c0 == 0) ? r0 : 0), ((c0 == 1) ? r0 : 0), ((c0 == 2) ? r0 : 0), ((c0 == 3) ? r0 : 0) }; + + const u32 off16 = off / 16; + + const u32 v0[4] = { ((off16 == 0) ? 0x80808080 : 0), ((off16 == 1) ? 0x80808080 : 0), ((off16 == 2) ? 0x80808080 : 0), ((off16 == 3) ? 0x80808080 : 0) }; + + w0_t |= v0[0] & m0[0]; + w1_t |= v0[0] & m0[1]; + w2_t |= v0[0] & m0[2]; + w3_t |= v0[0] & m0[3]; + w4_t |= v0[1] & m0[0]; + w5_t |= v0[1] & m0[1]; + w6_t |= v0[1] & m0[2]; + w7_t |= v0[1] & m0[3]; + w8_t |= v0[2] & m0[0]; + w9_t |= v0[2] & m0[1]; + wa_t |= v0[2] & m0[2]; + wb_t |= v0[2] & m0[3]; + wc_t |= v0[3] & m0[0]; + wd_t |= v0[3] & m0[1]; + we_t |= v0[3] & m0[2]; + wf_t |= v0[3] & m0[3]; + + if (pos >= 56) + { + // sha256 transform + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + + w0_t = 0; + w1_t = 0; + w2_t = 0; + w3_t = 0; + w4_t = 0; + w5_t = 0; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 0; + } + + // last sha256 transform + + we_t = 0; + wf_t = ctx_len * 8; + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + f = digest[5]; + g = digest[6]; + h = digest[7]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + + // if (MATCHES_NONE_VS ((h + digest[7] - make_u32x (SHA256M_H)), d_rev)) continue; + + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + + if (MATCHES_NONE_VS ((h + digest[7] - make_u32x (SHA256M_H)), search[1])) continue; + + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + +// a += digest[0] - SHA256M_A; +// b += digest[1] - SHA256M_B; + c += digest[2] - make_u32x (SHA256M_C); + d += digest[3] - make_u32x (SHA256M_D); +// e += digest[4] - SHA256M_E; +// f += digest[5] - SHA256M_F; + g += digest[6] - make_u32x (SHA256M_G); + h += digest[7] - make_u32x (SHA256M_H); + + COMPARE_S_SIMD (d, h, c, g); + } +} + +KERNEL_FQ void m20712_s08 (KERN_ATTR_BASIC ()) +{ +} + +KERNEL_FQ void m20712_s16 (KERN_ATTR_BASIC ()) +{ +} diff --git a/OpenCL/m20712_a1-pure.cl b/OpenCL/m20712_a1-pure.cl new file mode 100644 index 000000000..b713e2eca --- /dev/null +++ b/OpenCL/m20712_a1-pure.cl @@ -0,0 +1,259 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha256.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +KERNEL_FQ void m20712_mxx (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 0 + | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 8; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + u32 s[64] = { 0 }; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + sha256_ctx_t ctx1; + + sha256_init (&ctx1); + + sha256_update_global_swap (&ctx1, pws[gid].i, pws[gid].pw_len); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + sha256_ctx_t ctx0 = ctx1; + + sha256_update_global_swap (&ctx0, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); + + sha256_final (&ctx0); + + const u32 a = ctx0.h[0]; + const u32 b = ctx0.h[1]; + const u32 c = ctx0.h[2]; + const u32 d = ctx0.h[3]; + const u32 e = ctx0.h[4]; + const u32 f = ctx0.h[5]; + const u32 g = ctx0.h[6]; + const u32 h = ctx0.h[7]; + + sha256_ctx_t ctx; + + sha256_init (&ctx); + + w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w2[2] = uint_to_hex_lower8_le ((f >> 16) & 255) << 0 | uint_to_hex_lower8_le ((f >> 24) & 255) << 16; + w2[3] = uint_to_hex_lower8_le ((f >> 0) & 255) << 0 | uint_to_hex_lower8_le ((f >> 8) & 255) << 16; + w3[0] = uint_to_hex_lower8_le ((g >> 16) & 255) << 0 | uint_to_hex_lower8_le ((g >> 24) & 255) << 16; + w3[1] = uint_to_hex_lower8_le ((g >> 0) & 255) << 0 | uint_to_hex_lower8_le ((g >> 8) & 255) << 16; + w3[2] = uint_to_hex_lower8_le ((h >> 16) & 255) << 0 | uint_to_hex_lower8_le ((h >> 24) & 255) << 16; + w3[3] = uint_to_hex_lower8_le ((h >> 0) & 255) << 0 | uint_to_hex_lower8_le ((h >> 8) & 255) << 16; + + sha256_update_64 (&ctx, w0, w1, w2, w3, 64); + + sha256_update (&ctx, s, salt_len); + + sha256_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_M_SCALAR (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m20712_sxx (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 0 + | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 8; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + sha256_ctx_t ctx1; + + sha256_init (&ctx1); + + sha256_update_global_swap (&ctx1, pws[gid].i, pws[gid].pw_len); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + sha256_ctx_t ctx0 = ctx1; + + sha256_update_global_swap (&ctx0, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); + + sha256_final (&ctx0); + + const u32 a = ctx0.h[0]; + const u32 b = ctx0.h[1]; + const u32 c = ctx0.h[2]; + const u32 d = ctx0.h[3]; + const u32 e = ctx0.h[4]; + const u32 f = ctx0.h[5]; + const u32 g = ctx0.h[6]; + const u32 h = ctx0.h[7]; + + sha256_ctx_t ctx; + + sha256_init (&ctx); + + w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w2[2] = uint_to_hex_lower8_le ((f >> 16) & 255) << 0 | uint_to_hex_lower8_le ((f >> 24) & 255) << 16; + w2[3] = uint_to_hex_lower8_le ((f >> 0) & 255) << 0 | uint_to_hex_lower8_le ((f >> 8) & 255) << 16; + w3[0] = uint_to_hex_lower8_le ((g >> 16) & 255) << 0 | uint_to_hex_lower8_le ((g >> 24) & 255) << 16; + w3[1] = uint_to_hex_lower8_le ((g >> 0) & 255) << 0 | uint_to_hex_lower8_le ((g >> 8) & 255) << 16; + w3[2] = uint_to_hex_lower8_le ((h >> 16) & 255) << 0 | uint_to_hex_lower8_le ((h >> 24) & 255) << 16; + w3[3] = uint_to_hex_lower8_le ((h >> 0) & 255) << 0 | uint_to_hex_lower8_le ((h >> 8) & 255) << 16; + + sha256_update_64 (&ctx, w0, w1, w2, w3, 64); + + sha256_update (&ctx, s, salt_len); + + sha256_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_S_SCALAR (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m20712_a3-optimized.cl b/OpenCL/m20712_a3-optimized.cl new file mode 100644 index 000000000..2814cbe69 --- /dev/null +++ b/OpenCL/m20712_a3-optimized.cl @@ -0,0 +1,1490 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha256.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +#define SHA256_STEP_REV(a,b,c,d,e,f,g,h) \ +{ \ + u32 t2 = SHA256_S2_S(b) + SHA256_F0o(b,c,d); \ + u32 t1 = a - t2; \ + a = b; \ + b = c; \ + c = d; \ + d = e - t1; \ + e = f; \ + f = g; \ + g = h; \ + h = 0; \ +} + +DECLSPEC void m20712m (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTOR (), LOCAL_AS u32 *l_bin2asc) +{ + /** + * modifiers are taken from args + */ + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + salt_buf0[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 0]); + salt_buf0[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 1]); + salt_buf0[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 2]); + salt_buf0[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 3]); + salt_buf1[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 4]); + salt_buf1[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 5]); + salt_buf1[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 6]); + salt_buf1[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 7]); + salt_buf2[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 8]); + salt_buf2[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 9]); + salt_buf2[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[10]); + salt_buf2[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[11]); + salt_buf3[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[12]); + salt_buf3[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[13]); + salt_buf3[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[14]); + salt_buf3[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[15]); + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + /** + * loop + */ + + u32 w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0 = w0l | w0r; + + /** + * sha256(pass) + */ + + u32x w0_t = w0; + u32x w1_t = w[ 1]; + u32x w2_t = w[ 2]; + u32x w3_t = w[ 3]; + u32x w4_t = w[ 4]; + u32x w5_t = w[ 5]; + u32x w6_t = w[ 6]; + u32x w7_t = w[ 7]; + u32x w8_t = w[ 8]; + u32x w9_t = w[ 9]; + u32x wa_t = w[10]; + u32x wb_t = w[11]; + u32x wc_t = w[12]; + u32x wd_t = w[13]; + u32x we_t = w[14]; + u32x wf_t = w[15]; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + a += make_u32x (SHA256M_A); + b += make_u32x (SHA256M_B); + c += make_u32x (SHA256M_C); + d += make_u32x (SHA256M_D); + e += make_u32x (SHA256M_E); + f += make_u32x (SHA256M_F); + g += make_u32x (SHA256M_G); + h += make_u32x (SHA256M_H); + + // final sha256 + + // sha256_update_64, len 64, pos 0 + + w0_t = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w1_t = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w2_t = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w4_t = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w5_t = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + w6_t = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w7_t = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w8_t = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w9_t = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + wa_t = uint_to_hex_lower8_le ((f >> 16) & 255) << 0 | uint_to_hex_lower8_le ((f >> 24) & 255) << 16; + wb_t = uint_to_hex_lower8_le ((f >> 0) & 255) << 0 | uint_to_hex_lower8_le ((f >> 8) & 255) << 16; + wc_t = uint_to_hex_lower8_le ((g >> 16) & 255) << 0 | uint_to_hex_lower8_le ((g >> 24) & 255) << 16; + wd_t = uint_to_hex_lower8_le ((g >> 0) & 255) << 0 | uint_to_hex_lower8_le ((g >> 8) & 255) << 16; + we_t = uint_to_hex_lower8_le ((h >> 16) & 255) << 0 | uint_to_hex_lower8_le ((h >> 24) & 255) << 16; + wf_t = uint_to_hex_lower8_le ((h >> 0) & 255) << 0 | uint_to_hex_lower8_le ((h >> 8) & 255) << 16; + + // sha256 transform + + a = SHA256M_A; + b = SHA256M_B; + c = SHA256M_C; + d = SHA256M_D; + e = SHA256M_E; + f = SHA256M_F; + g = SHA256M_G; + h = SHA256M_H; + + u32x digest[8]; + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + + // append salt + + // sha256_update: ctx_len 64, pos 0, len = salt_len + + w0_t = salt_buf0[0]; + w1_t = salt_buf0[1]; + w2_t = salt_buf0[2]; + w3_t = salt_buf0[3]; + w4_t = salt_buf1[0]; + w5_t = salt_buf1[1]; + w6_t = salt_buf1[2]; + w7_t = salt_buf1[3]; + w8_t = salt_buf2[0]; + w9_t = salt_buf2[1]; + wa_t = salt_buf2[2]; + wb_t = salt_buf2[3]; + wc_t = salt_buf3[0]; + wd_t = salt_buf3[1]; + we_t = salt_buf3[2]; + wf_t = salt_buf3[3]; + + // sha256_update_64: pos 0 + + const int ctx_len = 64 + salt_len; + + const int pos = ctx_len & 63; + + // append_0x80_4x4, offset = pos ^ 3 + + const u32 off = pos ^ 3; + + const u32 c0 = (off & 15) / 4; + + const u32 r0 = 0xff << ((off & 3) * 8); + + const u32 m0[4] = { ((c0 == 0) ? r0 : 0), ((c0 == 1) ? r0 : 0), ((c0 == 2) ? r0 : 0), ((c0 == 3) ? r0 : 0) }; + + const u32 off16 = off / 16; + + const u32 v0[4] = { ((off16 == 0) ? 0x80808080 : 0), ((off16 == 1) ? 0x80808080 : 0), ((off16 == 2) ? 0x80808080 : 0), ((off16 == 3) ? 0x80808080 : 0) }; + + w0_t |= v0[0] & m0[0]; + w1_t |= v0[0] & m0[1]; + w2_t |= v0[0] & m0[2]; + w3_t |= v0[0] & m0[3]; + w4_t |= v0[1] & m0[0]; + w5_t |= v0[1] & m0[1]; + w6_t |= v0[1] & m0[2]; + w7_t |= v0[1] & m0[3]; + w8_t |= v0[2] & m0[0]; + w9_t |= v0[2] & m0[1]; + wa_t |= v0[2] & m0[2]; + wb_t |= v0[2] & m0[3]; + wc_t |= v0[3] & m0[0]; + wd_t |= v0[3] & m0[1]; + we_t |= v0[3] & m0[2]; + wf_t |= v0[3] & m0[3]; + + if (pos >= 56) + { + // sha256 transform + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + + w0_t = 0; + w1_t = 0; + w2_t = 0; + w3_t = 0; + w4_t = 0; + w5_t = 0; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 0; + } + + // last sha256 transform + + we_t = 0; + wf_t = ctx_len * 8; + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + f = digest[5]; + g = digest[6]; + h = digest[7]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + +// a += digest[0] - SHA256M_A; +// b += digest[1] - SHA256M_B; + c += digest[2] - make_u32x (SHA256M_C); + d += digest[3] - make_u32x (SHA256M_D); +// e += digest[4] - SHA256M_E; +// f += digest[5] - SHA256M_F; + g += digest[6] - make_u32x (SHA256M_G); + h += digest[7] - make_u32x (SHA256M_H); + + COMPARE_M_SIMD (d, h, c, g); + } +} + +DECLSPEC void m20712s (PRIVATE_AS u32 *w, const u32 pw_len, KERN_ATTR_FUNC_VECTOR (), LOCAL_AS u32 *l_bin2asc) +{ + /** + * modifiers are taken from args + */ + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + u32 salt_buf3[4]; + + salt_buf0[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 0]); + salt_buf0[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 1]); + salt_buf0[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 2]); + salt_buf0[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 3]); + salt_buf1[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 4]); + salt_buf1[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 5]); + salt_buf1[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 6]); + salt_buf1[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 7]); + salt_buf2[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 8]); + salt_buf2[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[ 9]); + salt_buf2[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[10]); + salt_buf2[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[11]); + salt_buf3[0] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[12]); + salt_buf3[1] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[13]); + salt_buf3[2] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[14]); + salt_buf3[3] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[15]); + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + /** + * loop + */ + + u32 w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0 = w0l | w0r; + + /** + * sha256(pass) + */ + + u32x w0_t = w0; + u32x w1_t = w[ 1]; + u32x w2_t = w[ 2]; + u32x w3_t = w[ 3]; + u32x w4_t = w[ 4]; + u32x w5_t = w[ 5]; + u32x w6_t = w[ 6]; + u32x w7_t = w[ 7]; + u32x w8_t = w[ 8]; + u32x w9_t = w[ 9]; + u32x wa_t = w[10]; + u32x wb_t = w[11]; + u32x wc_t = w[12]; + u32x wd_t = w[13]; + u32x we_t = w[14]; + u32x wf_t = w[15]; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + a += make_u32x (SHA256M_A); + b += make_u32x (SHA256M_B); + c += make_u32x (SHA256M_C); + d += make_u32x (SHA256M_D); + e += make_u32x (SHA256M_E); + f += make_u32x (SHA256M_F); + g += make_u32x (SHA256M_G); + h += make_u32x (SHA256M_H); + + // final sha256 + + // sha256_update_64, len 64, pos 0 + + w0_t = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w1_t = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w2_t = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w4_t = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w5_t = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + w6_t = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w7_t = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w8_t = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w9_t = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + wa_t = uint_to_hex_lower8_le ((f >> 16) & 255) << 0 | uint_to_hex_lower8_le ((f >> 24) & 255) << 16; + wb_t = uint_to_hex_lower8_le ((f >> 0) & 255) << 0 | uint_to_hex_lower8_le ((f >> 8) & 255) << 16; + wc_t = uint_to_hex_lower8_le ((g >> 16) & 255) << 0 | uint_to_hex_lower8_le ((g >> 24) & 255) << 16; + wd_t = uint_to_hex_lower8_le ((g >> 0) & 255) << 0 | uint_to_hex_lower8_le ((g >> 8) & 255) << 16; + we_t = uint_to_hex_lower8_le ((h >> 16) & 255) << 0 | uint_to_hex_lower8_le ((h >> 24) & 255) << 16; + wf_t = uint_to_hex_lower8_le ((h >> 0) & 255) << 0 | uint_to_hex_lower8_le ((h >> 8) & 255) << 16; + + // sha256 transform + + a = SHA256M_A; + b = SHA256M_B; + c = SHA256M_C; + d = SHA256M_D; + e = SHA256M_E; + f = SHA256M_F; + g = SHA256M_G; + h = SHA256M_H; + + u32x digest[8]; + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + + // append salt + + // sha256_update: ctx_len 64, pos 0, len = salt_len + + w0_t = salt_buf0[0]; + w1_t = salt_buf0[1]; + w2_t = salt_buf0[2]; + w3_t = salt_buf0[3]; + w4_t = salt_buf1[0]; + w5_t = salt_buf1[1]; + w6_t = salt_buf1[2]; + w7_t = salt_buf1[3]; + w8_t = salt_buf2[0]; + w9_t = salt_buf2[1]; + wa_t = salt_buf2[2]; + wb_t = salt_buf2[3]; + wc_t = salt_buf3[0]; + wd_t = salt_buf3[1]; + we_t = salt_buf3[2]; + wf_t = salt_buf3[3]; + + // sha256_update_64: pos 0 + + const int ctx_len = 64 + salt_len; + + const int pos = ctx_len & 63; + + // append_0x80_4x4, offset = pos ^ 3 + + const u32 off = pos ^ 3; + + const u32 c0 = (off & 15) / 4; + + const u32 r0 = 0xff << ((off & 3) * 8); + + const u32 m0[4] = { ((c0 == 0) ? r0 : 0), ((c0 == 1) ? r0 : 0), ((c0 == 2) ? r0 : 0), ((c0 == 3) ? r0 : 0) }; + + const u32 off16 = off / 16; + + const u32 v0[4] = { ((off16 == 0) ? 0x80808080 : 0), ((off16 == 1) ? 0x80808080 : 0), ((off16 == 2) ? 0x80808080 : 0), ((off16 == 3) ? 0x80808080 : 0) }; + + w0_t |= v0[0] & m0[0]; + w1_t |= v0[0] & m0[1]; + w2_t |= v0[0] & m0[2]; + w3_t |= v0[0] & m0[3]; + w4_t |= v0[1] & m0[0]; + w5_t |= v0[1] & m0[1]; + w6_t |= v0[1] & m0[2]; + w7_t |= v0[1] & m0[3]; + w8_t |= v0[2] & m0[0]; + w9_t |= v0[2] & m0[1]; + wa_t |= v0[2] & m0[2]; + wb_t |= v0[2] & m0[3]; + wc_t |= v0[3] & m0[0]; + wd_t |= v0[3] & m0[1]; + we_t |= v0[3] & m0[2]; + wf_t |= v0[3] & m0[3]; + + if (pos >= 56) + { + // sha256 transform + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + + w0_t = 0; + w1_t = 0; + w2_t = 0; + w3_t = 0; + w4_t = 0; + w5_t = 0; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 0; + } + + // last sha256 transform + + we_t = 0; + wf_t = ctx_len * 8; + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + f = digest[5]; + g = digest[6]; + h = digest[7]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + + if (MATCHES_NONE_VS ((h + digest[7] - make_u32x (SHA256M_H)), search[1])) continue; + + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + +// a += digest[0] - SHA256M_A; +// b += digest[1] - SHA256M_B; + c += digest[2] - make_u32x (SHA256M_C); + d += digest[3] - make_u32x (SHA256M_D); +// e += digest[4] - SHA256M_E; +// f += digest[5] - SHA256M_F; + g += digest[6] - make_u32x (SHA256M_G); + h += digest[7] - make_u32x (SHA256M_H); + + COMPARE_S_SIMD (d, h, c, g); + } +} + +KERNEL_FQ void m20712_m04 (KERN_ATTR_VECTOR ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 0 + | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 8; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m20712m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m20712_m08 (KERN_ATTR_VECTOR ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 0 + | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 8; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m20712m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m20712_m16 (KERN_ATTR_VECTOR ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 0 + | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 8; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m20712m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m20712_s04 (KERN_ATTR_VECTOR ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 0 + | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 8; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m20712s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m20712_s08 (KERN_ATTR_VECTOR ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 0 + | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 8; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m20712s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m20712_s16 (KERN_ATTR_VECTOR ()) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 0 + | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 8; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m20712s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} diff --git a/OpenCL/m20712_a3-pure.cl b/OpenCL/m20712_a3-pure.cl new file mode 100644 index 000000000..908b8ca2d --- /dev/null +++ b/OpenCL/m20712_a3-pure.cl @@ -0,0 +1,285 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha256.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8_le(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +KERNEL_FQ void m20712_mxx (KERN_ATTR_VECTOR ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 0 + | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 8; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32x _w0[4]; + u32x _w1[4]; + u32x _w2[4]; + u32x _w3[4]; + + const u32 pw_len = pws[gid].pw_len; + + u32x w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32x s[64] = { 0 }; + + for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0 = w0l | w0r; + + w[0] = w0; + + sha256_ctx_vector_t ctx0; + + sha256_init_vector (&ctx0); + + sha256_update_vector (&ctx0, w, pw_len); + + sha256_final_vector (&ctx0); + + const u32x a = ctx0.h[0]; + const u32x b = ctx0.h[1]; + const u32x c = ctx0.h[2]; + const u32x d = ctx0.h[3]; + const u32x e = ctx0.h[4]; + const u32x f = ctx0.h[5]; + const u32x g = ctx0.h[6]; + const u32x h = ctx0.h[7]; + + sha256_ctx_vector_t ctx; + + sha256_init_vector (&ctx); + + _w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + _w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + _w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + _w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + _w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + _w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + _w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + _w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + _w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + _w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + _w2[2] = uint_to_hex_lower8_le ((f >> 16) & 255) << 0 | uint_to_hex_lower8_le ((f >> 24) & 255) << 16; + _w2[3] = uint_to_hex_lower8_le ((f >> 0) & 255) << 0 | uint_to_hex_lower8_le ((f >> 8) & 255) << 16; + _w3[0] = uint_to_hex_lower8_le ((g >> 16) & 255) << 0 | uint_to_hex_lower8_le ((g >> 24) & 255) << 16; + _w3[1] = uint_to_hex_lower8_le ((g >> 0) & 255) << 0 | uint_to_hex_lower8_le ((g >> 8) & 255) << 16; + _w3[2] = uint_to_hex_lower8_le ((h >> 16) & 255) << 0 | uint_to_hex_lower8_le ((h >> 24) & 255) << 16; + _w3[3] = uint_to_hex_lower8_le ((h >> 0) & 255) << 0 | uint_to_hex_lower8_le ((h >> 8) & 255) << 16; + + sha256_update_vector_64 (&ctx, _w0, _w1, _w2, _w3, 64); + + sha256_update_vector (&ctx, s, salt_len); + + sha256_final_vector (&ctx); + + const u32x r0 = ctx.h[DGST_R0]; + const u32x r1 = ctx.h[DGST_R1]; + const u32x r2 = ctx.h[DGST_R2]; + const u32x r3 = ctx.h[DGST_R3]; + + COMPARE_M_SIMD (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m20712_sxx (KERN_ATTR_VECTOR ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'A' - 10 + i0) << 0 + | ((i1 < 10) ? '0' + i1 : 'A' - 10 + i1) << 8; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + u32x _w0[4]; + u32x _w1[4]; + u32x _w2[4]; + u32x _w3[4]; + + const u32 pw_len = pws[gid].pw_len; + + u32x w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32x s[64] = { 0 }; + + for (int i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0 = w0l | w0r; + + w[0] = w0; + + sha256_ctx_vector_t ctx0; + + sha256_init_vector (&ctx0); + + sha256_update_vector (&ctx0, w, pw_len); + + sha256_final_vector (&ctx0); + + const u32x a = ctx0.h[0]; + const u32x b = ctx0.h[1]; + const u32x c = ctx0.h[2]; + const u32x d = ctx0.h[3]; + const u32x e = ctx0.h[4]; + const u32x f = ctx0.h[5]; + const u32x g = ctx0.h[6]; + const u32x h = ctx0.h[7]; + + sha256_ctx_vector_t ctx; + + sha256_init_vector (&ctx); + + _w0[0] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + _w0[1] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + _w0[2] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + _w0[3] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + _w1[0] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + _w1[1] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + _w1[2] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + _w1[3] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + _w2[0] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + _w2[1] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + _w2[2] = uint_to_hex_lower8_le ((f >> 16) & 255) << 0 | uint_to_hex_lower8_le ((f >> 24) & 255) << 16; + _w2[3] = uint_to_hex_lower8_le ((f >> 0) & 255) << 0 | uint_to_hex_lower8_le ((f >> 8) & 255) << 16; + _w3[0] = uint_to_hex_lower8_le ((g >> 16) & 255) << 0 | uint_to_hex_lower8_le ((g >> 24) & 255) << 16; + _w3[1] = uint_to_hex_lower8_le ((g >> 0) & 255) << 0 | uint_to_hex_lower8_le ((g >> 8) & 255) << 16; + _w3[2] = uint_to_hex_lower8_le ((h >> 16) & 255) << 0 | uint_to_hex_lower8_le ((h >> 24) & 255) << 16; + _w3[3] = uint_to_hex_lower8_le ((h >> 0) & 255) << 0 | uint_to_hex_lower8_le ((h >> 8) & 255) << 16; + + sha256_update_vector_64 (&ctx, _w0, _w1, _w2, _w3, 64); + + sha256_update_vector (&ctx, s, salt_len); + + sha256_final_vector (&ctx); + + const u32x r0 = ctx.h[DGST_R0]; + const u32x r1 = ctx.h[DGST_R1]; + const u32x r2 = ctx.h[DGST_R2]; + const u32x r3 = ctx.h[DGST_R3]; + + COMPARE_S_SIMD (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m21310_a0-pure.cl b/OpenCL/m21310_a0-pure.cl new file mode 100644 index 000000000..dba86ea7d --- /dev/null +++ b/OpenCL/m21310_a0-pure.cl @@ -0,0 +1,282 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_rp.h) +#include M2S(INCLUDE_PATH/inc_rp.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha1.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +typedef struct md5_double_salt +{ + u32 salt1_buf[64]; + int salt1_len; + + u32 salt2_buf[64]; + int salt2_len; + +} md5_double_salt_t; + +KERNEL_FQ void m21310_mxx (KERN_ATTR_RULES_ESALT (md5_double_salt_t)) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + COPY_PW (pws[gid]); + + sha1_ctx_t ctx00; + + sha1_init(&ctx00); + + sha1_update_global (&ctx00, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len); + + md5_ctx_t ctx11; + + md5_init (&ctx11); + + md5_update_global (&ctx11, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len); + + /** + * loop + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + pw_t tmp = PASTE_PW; + + sha1_ctx_t ctx0 = ctx00; + + sha1_update_swap (&ctx0, tmp.i, tmp.pw_len); + + sha1_final (&ctx0); + + const u32 a = ctx0.h[0]; + const u32 b = ctx0.h[1]; + const u32 c = ctx0.h[2]; + const u32 d = ctx0.h[3]; + const u32 e = ctx0.h[4]; + + md5_ctx_t ctx = ctx11; + + w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + md5_update_64 (&ctx, w0, w1, w2, w3, 40); + + md5_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_M_SCALAR (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m21310_sxx (KERN_ATTR_RULES_ESALT (md5_double_salt_t)) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + COPY_PW (pws[gid]); + + sha1_ctx_t ctx00; + + sha1_init(&ctx00); + + sha1_update_global (&ctx00, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len); + + md5_ctx_t ctx11; + + md5_init (&ctx11); + + md5_update_global (&ctx11, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len); + + /** + * loop + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + pw_t tmp = PASTE_PW; + + tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); + + sha1_ctx_t ctx0 = ctx00; + + sha1_update_swap (&ctx0, tmp.i, tmp.pw_len); + + sha1_final (&ctx0); + + const u32 a = ctx0.h[0]; + const u32 b = ctx0.h[1]; + const u32 c = ctx0.h[2]; + const u32 d = ctx0.h[3]; + const u32 e = ctx0.h[4]; + + md5_ctx_t ctx = ctx11; + + w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + md5_update_64 (&ctx, w0, w1, w2, w3, 40); + + md5_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_S_SCALAR (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m21310_a1-pure.cl b/OpenCL/m21310_a1-pure.cl new file mode 100644 index 000000000..be8285e50 --- /dev/null +++ b/OpenCL/m21310_a1-pure.cl @@ -0,0 +1,275 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha1.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +typedef struct md5_double_salt +{ + u32 salt1_buf[64]; + int salt1_len; + + u32 salt2_buf[64]; + int salt2_len; + +} md5_double_salt_t; + +KERNEL_FQ void m21310_mxx (KERN_ATTR_ESALT (md5_double_salt)) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + sha1_ctx_t ctx00; + + sha1_init (&ctx00); + + sha1_update_global (&ctx00, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len); + + sha1_update_global_swap (&ctx00, pws[gid].i, pws[gid].pw_len); + + md5_ctx_t ctx11; + + md5_init (&ctx11); + + md5_update_global (&ctx11, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len); + + /** + * loop + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + sha1_ctx_t ctx0 = ctx00; + + sha1_update_global_swap (&ctx0, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); + + sha1_final (&ctx0); + + const u32 a = ctx0.h[0]; + const u32 b = ctx0.h[1]; + const u32 c = ctx0.h[2]; + const u32 d = ctx0.h[3]; + const u32 e = ctx0.h[4]; + + md5_ctx_t ctx = ctx11; + + w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + md5_update_64 (&ctx, w0, w1, w2, w3, 40); + + md5_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_M_SCALAR (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m21310_sxx (KERN_ATTR_ESALT (md5_double_salt)) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + sha1_ctx_t ctx00; + + sha1_init (&ctx00); + + sha1_update_global (&ctx00, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len); + + sha1_update_global_swap (&ctx00, pws[gid].i, pws[gid].pw_len); + + md5_ctx_t ctx11; + + md5_init (&ctx11); + + md5_update_global (&ctx11, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len); + + /** + * loop + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + sha1_ctx_t ctx0 = ctx00; + + sha1_update_global_swap (&ctx0, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); + + sha1_final (&ctx0); + + const u32 a = ctx0.h[0]; + const u32 b = ctx0.h[1]; + const u32 c = ctx0.h[2]; + const u32 d = ctx0.h[3]; + const u32 e = ctx0.h[4]; + + md5_ctx_t ctx = ctx11; + + w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + md5_update_64 (&ctx, w0, w1, w2, w3, 40); + + md5_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_S_SCALAR (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m21310_a3-pure.cl b/OpenCL/m21310_a3-pure.cl new file mode 100644 index 000000000..546e7defb --- /dev/null +++ b/OpenCL/m21310_a3-pure.cl @@ -0,0 +1,312 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha1.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +typedef struct md5_double_salt +{ + u32 salt1_buf[64]; + int salt1_len; + + u32 salt2_buf[64]; + int salt2_len; + +} md5_double_salt_t; + +KERNEL_FQ void m21310_mxx (KERN_ATTR_VECTOR_ESALT (md5_double_salt)) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + const u32 pw_len = pws[gid].pw_len; + + u32x w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + sha1_ctx_t ctx00; + + sha1_init (&ctx00); + + sha1_update_global (&ctx00, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len); + + md5_ctx_t ctx11; + + md5_init (&ctx11); + + md5_update_global (&ctx11, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len); + + /** + * loop + */ + + u32x _w0[4]; + u32x _w1[4]; + u32x _w2[4]; + u32x _w3[4]; + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0 = w0l | w0r; + + w[0] = w0; + + sha1_ctx_vector_t ctx0; + + sha1_init_vector_from_scalar (&ctx0, &ctx00); + + sha1_update_vector_swap (&ctx0, w, pw_len); + + sha1_final_vector (&ctx0); + + const u32x a = ctx0.h[0]; + const u32x b = ctx0.h[1]; + const u32x c = ctx0.h[2]; + const u32x d = ctx0.h[3]; + const u32x e = ctx0.h[4]; + + md5_ctx_vector_t ctx; + + md5_init_vector_from_scalar (&ctx, &ctx11); + + _w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + _w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + _w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + _w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + _w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + _w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + _w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + _w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + _w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + _w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + _w2[2] = 0; + _w2[3] = 0; + _w3[0] = 0; + _w3[1] = 0; + _w3[2] = 0; + _w3[3] = 0; + + md5_update_vector_64 (&ctx, _w0, _w1, _w2, _w3, 40); + + md5_final_vector (&ctx); + + const u32x r0 = ctx.h[DGST_R0]; + const u32x r1 = ctx.h[DGST_R1]; + const u32x r2 = ctx.h[DGST_R2]; + const u32x r3 = ctx.h[DGST_R3]; + + COMPARE_M_SIMD (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m21310_sxx (KERN_ATTR_VECTOR_ESALT (md5_double_salt)) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + const u32 pw_len = pws[gid].pw_len; + + u32x w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + sha1_ctx_t ctx00; + + sha1_init (&ctx00); + + sha1_update_global (&ctx00, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len); + + md5_ctx_t ctx11; + + md5_init (&ctx11); + + md5_update_global (&ctx11, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf, esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len); + + /** + * loop + */ + + u32x _w0[4]; + u32x _w1[4]; + u32x _w2[4]; + u32x _w3[4]; + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0 = w0l | w0r; + + w[0] = w0; + + sha1_ctx_vector_t ctx0; + + sha1_init_vector_from_scalar (&ctx0, &ctx00); + + sha1_update_vector_swap (&ctx0, w, pw_len); + + sha1_final_vector (&ctx0); + + const u32x a = ctx0.h[0]; + const u32x b = ctx0.h[1]; + const u32x c = ctx0.h[2]; + const u32x d = ctx0.h[3]; + const u32x e = ctx0.h[4]; + + md5_ctx_vector_t ctx; + + md5_init_vector_from_scalar (&ctx, &ctx11); + + _w0[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + _w0[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + _w0[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + _w0[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + _w1[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + _w1[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + _w1[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + _w1[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + _w2[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + _w2[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + _w2[2] = 0; + _w2[3] = 0; + _w3[0] = 0; + _w3[1] = 0; + _w3[2] = 0; + _w3[3] = 0; + + md5_update_vector_64 (&ctx, _w0, _w1, _w2, _w3, 40); + + md5_final_vector (&ctx); + + const u32x r0 = ctx.h[DGST_R0]; + const u32x r1 = ctx.h[DGST_R1]; + const u32x r2 = ctx.h[DGST_R2]; + const u32x r3 = ctx.h[DGST_R3]; + + COMPARE_S_SIMD (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m21700-pure.cl b/OpenCL/m21700-pure.cl index 920f0efa5..554dcfbdf 100644 --- a/OpenCL/m21700-pure.cl +++ b/OpenCL/m21700-pure.cl @@ -325,6 +325,12 @@ KERNEL_FQ void m21700_comp (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) if (gid >= GID_CNT) return; + const u32 digest_pos = LOOP_POS; + + const u32 digest_cur = DIGESTS_OFFSET_HOST + digest_pos; + + GLOBAL_AS const electrum_t *electrum = &esalt_bufs[digest_cur]; + u64 out[8]; out[0] = tmps[gid].out[0]; @@ -379,13 +385,12 @@ KERNEL_FQ void m21700_comp (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) * the main secp256k1 point multiplication by a scalar/tweak: */ - GLOBAL_AS secp256k1_t *coords = (GLOBAL_AS secp256k1_t *) &esalt_bufs[DIGESTS_OFFSET_HOST].coords; + GLOBAL_AS const secp256k1_t *coords = (GLOBAL_AS const secp256k1_t *) &electrum->coords; u32 pubkey[64] = { 0 }; // for point_mul () we need: 1 + 32 bytes (for sha512 () we need more) point_mul (pubkey, tweak, coords); - /* * sha512 () of the pubkey: */ @@ -396,14 +401,13 @@ KERNEL_FQ void m21700_comp (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) sha512_update (&sha512_ctx, pubkey, 33); // 33 because of 32 byte curve point + sign sha512_final (&sha512_ctx); - /* * sha256-hmac () of the data_buf */ - GLOBAL_AS u32 *data_buf = (GLOBAL_AS u32 *) esalt_bufs[DIGESTS_OFFSET_HOST].data_buf; + GLOBAL_AS const u32 *data_buf = (GLOBAL_AS const u32 *) electrum->data_buf; - u32 data_len = esalt_bufs[DIGESTS_OFFSET_HOST].data_len; + u32 data_len = electrum->data_len; u32 key[16] = { 0 }; diff --git a/OpenCL/m21800-pure.cl b/OpenCL/m21800-pure.cl index 9317eb19f..fd301671b 100644 --- a/OpenCL/m21800-pure.cl +++ b/OpenCL/m21800-pure.cl @@ -375,6 +375,11 @@ KERNEL_FQ void m21800_comp (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) if (gid >= GID_CNT) return; + const u32 digest_pos = LOOP_POS; + + const u32 digest_cur = DIGESTS_OFFSET_HOST + digest_pos; + + GLOBAL_AS const electrum_t *electrum = &esalt_bufs[digest_cur]; /* * Start by copying/aligning the data @@ -434,7 +439,7 @@ KERNEL_FQ void m21800_comp (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) * the main secp256k1 point multiplication by a scalar/tweak: */ - GLOBAL_AS secp256k1_t *coords = (GLOBAL_AS secp256k1_t *) &esalt_bufs[DIGESTS_OFFSET_HOST].coords; + GLOBAL_AS const secp256k1_t *coords = (GLOBAL_AS const secp256k1_t *) &electrum->coords; u32 pubkey[64] = { 0 }; // for point_mul () we need: 1 + 32 bytes (for sha512 () we need more) @@ -499,7 +504,7 @@ KERNEL_FQ void m21800_comp (KERN_ATTR_TMPS_ESALT (electrum_tmp_t, electrum_t)) // we need to run it at least once: - GLOBAL_AS u32 *data_buf = (GLOBAL_AS u32 *) esalt_bufs[DIGESTS_OFFSET_HOST].data_buf; + GLOBAL_AS const u32 *data_buf = (GLOBAL_AS const u32 *) electrum->data_buf; u32 data[4]; diff --git a/OpenCL/m22000-pure.cl b/OpenCL/m22000-pure.cl index a4d497ce5..5fc836f89 100644 --- a/OpenCL/m22000-pure.cl +++ b/OpenCL/m22000-pure.cl @@ -109,7 +109,7 @@ DECLSPEC void make_kn (PRIVATE_AS u32 *k) k[3] ^= c * 0x87000000; } -DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS u32x *w2, PRIVATE_AS u32x *w3, PRIVATE_AS u32x *ipad, PRIVATE_AS u32x *opad, PRIVATE_AS u32x *digest) +DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS u32x *w2, PRIVATE_AS u32x *w3, PRIVATE_AS const u32x *ipad, PRIVATE_AS const u32x *opad, PRIVATE_AS u32x *digest) { digest[0] = ipad[0]; digest[1] = ipad[1]; diff --git a/OpenCL/m22001-pure.cl b/OpenCL/m22001-pure.cl index 18f30c028..9034abded 100644 --- a/OpenCL/m22001-pure.cl +++ b/OpenCL/m22001-pure.cl @@ -122,7 +122,7 @@ DECLSPEC void make_kn (PRIVATE_AS u32 *k) k[3] ^= c * 0x87000000; } -DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS u32x *w2, PRIVATE_AS u32x *w3, PRIVATE_AS u32x *ipad, PRIVATE_AS u32x *opad, PRIVATE_AS u32x *digest) +DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS u32x *w2, PRIVATE_AS u32x *w3, PRIVATE_AS const u32x *ipad, PRIVATE_AS const u32x *opad, PRIVATE_AS u32x *digest) { digest[0] = ipad[0]; digest[1] = ipad[1]; diff --git a/OpenCL/m22700-pure.cl b/OpenCL/m22700-pure.cl index 7d65fd52e..303e5e334 100644 --- a/OpenCL/m22700-pure.cl +++ b/OpenCL/m22700-pure.cl @@ -176,6 +176,36 @@ DECLSPEC uint4 hc_swap32_4 (uint4 v) DECLSPEC void salsa_r (PRIVATE_AS uint4 *TI) { + #if SCRYPT_R > 1 + + uint4 TT[STATE_CNT4 / 2]; + + for (int dst_off = 0, src_off = 4; src_off < STATE_CNT4; dst_off += 4, src_off += 8) + { + TT[dst_off + 0] = TI[src_off + 0]; + TT[dst_off + 1] = TI[src_off + 1]; + TT[dst_off + 2] = TI[src_off + 2]; + TT[dst_off + 3] = TI[src_off + 3]; + } + + for (int dst_off = 4, src_off = 8; src_off < STATE_CNT4; dst_off += 4, src_off += 8) + { + TI[dst_off + 0] = TI[src_off + 0]; + TI[dst_off + 1] = TI[src_off + 1]; + TI[dst_off + 2] = TI[src_off + 2]; + TI[dst_off + 3] = TI[src_off + 3]; + } + + for (int dst_off = STATE_CNT4 / 2, src_off = 0; dst_off < STATE_CNT4; dst_off += 4, src_off += 4) + { + TI[dst_off + 0] = TT[src_off + 0]; + TI[dst_off + 1] = TT[src_off + 1]; + TI[dst_off + 2] = TT[src_off + 2]; + TI[dst_off + 3] = TT[src_off + 3]; + } + + #endif + uint4 R0 = TI[STATE_CNT4 - 4]; uint4 R1 = TI[STATE_CNT4 - 3]; uint4 R2 = TI[STATE_CNT4 - 2]; @@ -213,36 +243,6 @@ DECLSPEC void salsa_r (PRIVATE_AS uint4 *TI) TI[i + 2] = R2; TI[i + 3] = R3; } - - #if SCRYPT_R > 1 - - uint4 TT[STATE_CNT4 / 2]; - - for (int dst_off = 0, src_off = 4; src_off < STATE_CNT4; dst_off += 4, src_off += 8) - { - TT[dst_off + 0] = TI[src_off + 0]; - TT[dst_off + 1] = TI[src_off + 1]; - TT[dst_off + 2] = TI[src_off + 2]; - TT[dst_off + 3] = TI[src_off + 3]; - } - - for (int dst_off = 4, src_off = 8; src_off < STATE_CNT4; dst_off += 4, src_off += 8) - { - TI[dst_off + 0] = TI[src_off + 0]; - TI[dst_off + 1] = TI[src_off + 1]; - TI[dst_off + 2] = TI[src_off + 2]; - TI[dst_off + 3] = TI[src_off + 3]; - } - - for (int dst_off = STATE_CNT4 / 2, src_off = 0; dst_off < STATE_CNT4; dst_off += 4, src_off += 4) - { - TI[dst_off + 0] = TT[src_off + 0]; - TI[dst_off + 1] = TT[src_off + 1]; - TI[dst_off + 2] = TT[src_off + 2]; - TI[dst_off + 3] = TT[src_off + 3]; - } - - #endif } DECLSPEC void scrypt_smix_init (PRIVATE_AS uint4 *X, GLOBAL_AS uint4 *V0, GLOBAL_AS uint4 *V1, GLOBAL_AS uint4 *V2, GLOBAL_AS uint4 *V3, const u64 gid) @@ -265,6 +265,30 @@ DECLSPEC void scrypt_smix_init (PRIVATE_AS uint4 *X, GLOBAL_AS uint4 *V0, GLOBAL case 3: V = V3; break; } + #if SCRYPT_R > 1 + + uint4 TT[STATE_CNT4]; + + for (int z = 0; z < zSIZE; z++) TT[z] = X[z]; + + for (int dst_off = 8, src_off = 4; dst_off < zSIZE; dst_off += 8, src_off += 4) + { + X[dst_off + 0] = TT[src_off + 0]; + X[dst_off + 1] = TT[src_off + 1]; + X[dst_off + 2] = TT[src_off + 2]; + X[dst_off + 3] = TT[src_off + 3]; + } + + for (int dst_off = 4, src_off = zSIZE / 2; dst_off < zSIZE; dst_off += 8, src_off += 4) + { + X[dst_off + 0] = TT[src_off + 0]; + X[dst_off + 1] = TT[src_off + 1]; + X[dst_off + 2] = TT[src_off + 2]; + X[dst_off + 3] = TT[src_off + 3]; + } + + #endif + for (u32 y = 0; y < ySIZE; y++) { for (u32 z = 0; z < zSIZE; z++) V[CO] = X[z]; @@ -400,6 +424,9 @@ KERNEL_FQ void m22700_init (KERN_ATTR_TMPS (scrypt_tmp_t)) #if defined IS_CUDA || defined IS_HIP const uint4 tmp0 = make_uint4 (digest[0], digest[1], digest[2], digest[3]); const uint4 tmp1 = make_uint4 (digest[4], digest[5], digest[6], digest[7]); + #elif defined IS_METAL + const uint4 tmp0 = uint4 (digest[0], digest[1], digest[2], digest[3]); + const uint4 tmp1 = uint4 (digest[4], digest[5], digest[6], digest[7]); #else const uint4 tmp0 = (uint4) (digest[0], digest[1], digest[2], digest[3]); const uint4 tmp1 = (uint4) (digest[4], digest[5], digest[6], digest[7]); @@ -430,6 +457,11 @@ KERNEL_FQ void m22700_init (KERN_ATTR_TMPS (scrypt_tmp_t)) X[1] = make_uint4 (T[1].x, T[2].y, T[3].z, T[0].w); X[2] = make_uint4 (T[2].x, T[3].y, T[0].z, T[1].w); X[3] = make_uint4 (T[3].x, T[0].y, T[1].z, T[2].w); + #elif defined IS_METAL + X[0] = uint4 (T[0].x, T[1].y, T[2].z, T[3].w); + X[1] = uint4 (T[1].x, T[2].y, T[3].z, T[0].w); + X[2] = uint4 (T[2].x, T[3].y, T[0].z, T[1].w); + X[3] = uint4 (T[3].x, T[0].y, T[1].z, T[2].w); #else X[0] = (uint4) (T[0].x, T[1].y, T[2].z, T[3].w); X[1] = (uint4) (T[1].x, T[2].y, T[3].z, T[0].w); @@ -589,10 +621,14 @@ KERNEL_FQ void m22700_comp (KERN_ATTR_TMPS (scrypt_tmp_t)) u32 w2[4]; u32 w3[4]; - for (u32 l = 0; l < SCRYPT_CNT4; l += 4) + for (u32 i = 0; i < SCRYPT_CNT4; i += STATE_CNT4) { + for (u32 j = 0; j < (STATE_CNT4 * 2); j += 8) + { uint4 X[4]; + const u32 l = i + j + ((j >= STATE_CNT4) ? (4 - STATE_CNT4) : 0); + X[0] = tmps[gid].P[l + 0]; X[1] = tmps[gid].P[l + 1]; X[2] = tmps[gid].P[l + 2]; @@ -605,6 +641,11 @@ KERNEL_FQ void m22700_comp (KERN_ATTR_TMPS (scrypt_tmp_t)) T[1] = make_uint4 (X[1].x, X[0].y, X[3].z, X[2].w); T[2] = make_uint4 (X[2].x, X[1].y, X[0].z, X[3].w); T[3] = make_uint4 (X[3].x, X[2].y, X[1].z, X[0].w); + #elif defined IS_METAL + T[0] = uint4 (X[0].x, X[3].y, X[2].z, X[1].w); + T[1] = uint4 (X[1].x, X[0].y, X[3].z, X[2].w); + T[2] = uint4 (X[2].x, X[1].y, X[0].z, X[3].w); + T[3] = uint4 (X[3].x, X[2].y, X[1].z, X[0].w); #else T[0] = (uint4) (X[0].x, X[3].y, X[2].z, X[1].w); T[1] = (uint4) (X[1].x, X[0].y, X[3].z, X[2].w); @@ -635,6 +676,7 @@ KERNEL_FQ void m22700_comp (KERN_ATTR_TMPS (scrypt_tmp_t)) w3[3] = T[3].w; sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 64); + } } w0[0] = 1; diff --git a/OpenCL/m25500-pure.cl b/OpenCL/m25500-pure.cl index 05dbd8b48..f5c72c3de 100644 --- a/OpenCL/m25500-pure.cl +++ b/OpenCL/m25500-pure.cl @@ -371,7 +371,7 @@ KERNEL_FQ void m25500_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sh */ /* - // decrypt buffer is not usefull here, skip + // decrypt buffer is not useful here, skip u32 dec[14] = { 0 }; AES_GCM_GCTR (key, J0, enc, enc_len, dec, s_te0, s_te1, s_te2, s_te3, s_te4); diff --git a/OpenCL/m25600-pure.cl b/OpenCL/m25600-pure.cl index d53a828db..98151b7bf 100644 --- a/OpenCL/m25600-pure.cl +++ b/OpenCL/m25600-pure.cl @@ -352,7 +352,7 @@ DECLSPEC void SET_KEY32 (LOCAL_AS u32 *S, const u64 key, const u32 val) #else -// access pattern: linear access with S offset already set to right offset based on thread ID saving it from compuation +// access pattern: linear access with S offset already set to right offset based on thread ID saving it from computation // makes sense if there are not thread ID's (for instance on CPU) DECLSPEC inline u32 GET_KEY32 (LOCAL_AS u32 *S, const u64 key) diff --git a/OpenCL/m25800-pure.cl b/OpenCL/m25800-pure.cl index 8658e17c8..2c3d581ec 100644 --- a/OpenCL/m25800-pure.cl +++ b/OpenCL/m25800-pure.cl @@ -348,7 +348,7 @@ DECLSPEC void SET_KEY32 (LOCAL_AS u32 *S, const u64 key, const u32 val, const u6 #else -// access pattern: linear access with S offset already set to right offset based on thread ID saving it from compuation +// access pattern: linear access with S offset already set to right offset based on thread ID saving it from computation // makes sense if there are not thread ID's (for instance on CPU) DECLSPEC inline u32 GET_KEY32 (LOCAL_AS u32 *S, const u64 key, MAYBE_UNUSED const u64 lid) diff --git a/OpenCL/m26610-pure.cl b/OpenCL/m26610-pure.cl index 5408c5cdf..abd476395 100644 --- a/OpenCL/m26610-pure.cl +++ b/OpenCL/m26610-pure.cl @@ -381,7 +381,7 @@ KERNEL_FQ void m26610_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, pbkdf2_sh /* const int pt_len = 28; // not using 32 byte but 28 because our UTF8 allows up to 4 byte per character and since we decrypt 32 byte - // only we can't garantee it is not in the middle of a UTF8 byte stream at that point + // only we can't guarantee it is not in the middle of a UTF8 byte stream at that point if (hc_enc_scan (pt, pt_len)) { diff --git a/OpenCL/m27700-pure.cl b/OpenCL/m27700-pure.cl index feaca11de..d9bf11510 100644 --- a/OpenCL/m27700-pure.cl +++ b/OpenCL/m27700-pure.cl @@ -126,6 +126,36 @@ DECLSPEC uint4 hc_swap32_4 (uint4 v) DECLSPEC void salsa_r (PRIVATE_AS uint4 *TI) { + #if SCRYPT_R > 1 + + uint4 TT[STATE_CNT4 / 2]; + + for (int dst_off = 0, src_off = 4; src_off < STATE_CNT4; dst_off += 4, src_off += 8) + { + TT[dst_off + 0] = TI[src_off + 0]; + TT[dst_off + 1] = TI[src_off + 1]; + TT[dst_off + 2] = TI[src_off + 2]; + TT[dst_off + 3] = TI[src_off + 3]; + } + + for (int dst_off = 4, src_off = 8; src_off < STATE_CNT4; dst_off += 4, src_off += 8) + { + TI[dst_off + 0] = TI[src_off + 0]; + TI[dst_off + 1] = TI[src_off + 1]; + TI[dst_off + 2] = TI[src_off + 2]; + TI[dst_off + 3] = TI[src_off + 3]; + } + + for (int dst_off = STATE_CNT4 / 2, src_off = 0; dst_off < STATE_CNT4; dst_off += 4, src_off += 4) + { + TI[dst_off + 0] = TT[src_off + 0]; + TI[dst_off + 1] = TT[src_off + 1]; + TI[dst_off + 2] = TT[src_off + 2]; + TI[dst_off + 3] = TT[src_off + 3]; + } + + #endif + uint4 R0 = TI[STATE_CNT4 - 4]; uint4 R1 = TI[STATE_CNT4 - 3]; uint4 R2 = TI[STATE_CNT4 - 2]; @@ -163,36 +193,6 @@ DECLSPEC void salsa_r (PRIVATE_AS uint4 *TI) TI[i + 2] = R2; TI[i + 3] = R3; } - - #if SCRYPT_R > 1 - - uint4 TT[STATE_CNT4 / 2]; - - for (int dst_off = 0, src_off = 4; src_off < STATE_CNT4; dst_off += 4, src_off += 8) - { - TT[dst_off + 0] = TI[src_off + 0]; - TT[dst_off + 1] = TI[src_off + 1]; - TT[dst_off + 2] = TI[src_off + 2]; - TT[dst_off + 3] = TI[src_off + 3]; - } - - for (int dst_off = 4, src_off = 8; src_off < STATE_CNT4; dst_off += 4, src_off += 8) - { - TI[dst_off + 0] = TI[src_off + 0]; - TI[dst_off + 1] = TI[src_off + 1]; - TI[dst_off + 2] = TI[src_off + 2]; - TI[dst_off + 3] = TI[src_off + 3]; - } - - for (int dst_off = STATE_CNT4 / 2, src_off = 0; dst_off < STATE_CNT4; dst_off += 4, src_off += 4) - { - TI[dst_off + 0] = TT[src_off + 0]; - TI[dst_off + 1] = TT[src_off + 1]; - TI[dst_off + 2] = TT[src_off + 2]; - TI[dst_off + 3] = TT[src_off + 3]; - } - - #endif } DECLSPEC void scrypt_smix_init (PRIVATE_AS uint4 *X, GLOBAL_AS uint4 *V0, GLOBAL_AS uint4 *V1, GLOBAL_AS uint4 *V2, GLOBAL_AS uint4 *V3, const u64 gid) @@ -215,6 +215,30 @@ DECLSPEC void scrypt_smix_init (PRIVATE_AS uint4 *X, GLOBAL_AS uint4 *V0, GLOBAL case 3: V = V3; break; } + #if SCRYPT_R > 1 + + uint4 TT[STATE_CNT4]; + + for (int z = 0; z < zSIZE; z++) TT[z] = X[z]; + + for (int dst_off = 8, src_off = 4; dst_off < zSIZE; dst_off += 8, src_off += 4) + { + X[dst_off + 0] = TT[src_off + 0]; + X[dst_off + 1] = TT[src_off + 1]; + X[dst_off + 2] = TT[src_off + 2]; + X[dst_off + 3] = TT[src_off + 3]; + } + + for (int dst_off = 4, src_off = zSIZE / 2; dst_off < zSIZE; dst_off += 8, src_off += 4) + { + X[dst_off + 0] = TT[src_off + 0]; + X[dst_off + 1] = TT[src_off + 1]; + X[dst_off + 2] = TT[src_off + 2]; + X[dst_off + 3] = TT[src_off + 3]; + } + + #endif + for (u32 y = 0; y < ySIZE; y++) { for (u32 z = 0; z < zSIZE; z++) V[CO] = X[z]; @@ -351,6 +375,9 @@ KERNEL_FQ void m27700_init (KERN_ATTR_TMPS (scrypt_tmp_t)) #if defined IS_CUDA || defined IS_HIP const uint4 tmp0 = make_uint4 (digest[0], digest[1], digest[2], digest[3]); const uint4 tmp1 = make_uint4 (digest[4], digest[5], digest[6], digest[7]); + #elif defined IS_METAL + const uint4 tmp0 = uint4 (digest[0], digest[1], digest[2], digest[3]); + const uint4 tmp1 = uint4 (digest[4], digest[5], digest[6], digest[7]); #else const uint4 tmp0 = (uint4) (digest[0], digest[1], digest[2], digest[3]); const uint4 tmp1 = (uint4) (digest[4], digest[5], digest[6], digest[7]); @@ -381,6 +408,11 @@ KERNEL_FQ void m27700_init (KERN_ATTR_TMPS (scrypt_tmp_t)) X[1] = make_uint4 (T[1].x, T[2].y, T[3].z, T[0].w); X[2] = make_uint4 (T[2].x, T[3].y, T[0].z, T[1].w); X[3] = make_uint4 (T[3].x, T[0].y, T[1].z, T[2].w); + #elif defined IS_METAL + X[0] = uint4 (T[0].x, T[1].y, T[2].z, T[3].w); + X[1] = uint4 (T[1].x, T[2].y, T[3].z, T[0].w); + X[2] = uint4 (T[2].x, T[3].y, T[0].z, T[1].w); + X[3] = uint4 (T[3].x, T[0].y, T[1].z, T[2].w); #else X[0] = (uint4) (T[0].x, T[1].y, T[2].z, T[3].w); X[1] = (uint4) (T[1].x, T[2].y, T[3].z, T[0].w); @@ -541,10 +573,14 @@ KERNEL_FQ void m27700_comp (KERN_ATTR_TMPS (scrypt_tmp_t)) u32 w2[4]; u32 w3[4]; - for (u32 l = 0; l < SCRYPT_CNT4; l += 4) + for (u32 i = 0; i < SCRYPT_CNT4; i += STATE_CNT4) { + for (u32 j = 0; j < (STATE_CNT4 * 2); j += 8) + { uint4 X[4]; + const u32 l = i + j + ((j >= STATE_CNT4) ? (4 - STATE_CNT4) : 0); + X[0] = tmps[gid].P[l + 0]; X[1] = tmps[gid].P[l + 1]; X[2] = tmps[gid].P[l + 2]; @@ -557,6 +593,11 @@ KERNEL_FQ void m27700_comp (KERN_ATTR_TMPS (scrypt_tmp_t)) T[1] = make_uint4 (X[1].x, X[0].y, X[3].z, X[2].w); T[2] = make_uint4 (X[2].x, X[1].y, X[0].z, X[3].w); T[3] = make_uint4 (X[3].x, X[2].y, X[1].z, X[0].w); + #elif defined IS_METAL + T[0] = uint4 (X[0].x, X[3].y, X[2].z, X[1].w); + T[1] = uint4 (X[1].x, X[0].y, X[3].z, X[2].w); + T[2] = uint4 (X[2].x, X[1].y, X[0].z, X[3].w); + T[3] = uint4 (X[3].x, X[2].y, X[1].z, X[0].w); #else T[0] = (uint4) (X[0].x, X[3].y, X[2].z, X[1].w); T[1] = (uint4) (X[1].x, X[0].y, X[3].z, X[2].w); @@ -587,6 +628,7 @@ KERNEL_FQ void m27700_comp (KERN_ATTR_TMPS (scrypt_tmp_t)) w3[3] = T[3].w; sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 64); + } } w0[0] = 1; diff --git a/OpenCL/m28200-pure.cl b/OpenCL/m28200-pure.cl index 2ead5b4bc..58106a007 100644 --- a/OpenCL/m28200-pure.cl +++ b/OpenCL/m28200-pure.cl @@ -138,6 +138,36 @@ DECLSPEC uint4 hc_swap32_4 (uint4 v) DECLSPEC void salsa_r (PRIVATE_AS uint4 *TI) { + #if SCRYPT_R > 1 + + uint4 TT[STATE_CNT4 / 2]; + + for (int dst_off = 0, src_off = 4; src_off < STATE_CNT4; dst_off += 4, src_off += 8) + { + TT[dst_off + 0] = TI[src_off + 0]; + TT[dst_off + 1] = TI[src_off + 1]; + TT[dst_off + 2] = TI[src_off + 2]; + TT[dst_off + 3] = TI[src_off + 3]; + } + + for (int dst_off = 4, src_off = 8; src_off < STATE_CNT4; dst_off += 4, src_off += 8) + { + TI[dst_off + 0] = TI[src_off + 0]; + TI[dst_off + 1] = TI[src_off + 1]; + TI[dst_off + 2] = TI[src_off + 2]; + TI[dst_off + 3] = TI[src_off + 3]; + } + + for (int dst_off = STATE_CNT4 / 2, src_off = 0; dst_off < STATE_CNT4; dst_off += 4, src_off += 4) + { + TI[dst_off + 0] = TT[src_off + 0]; + TI[dst_off + 1] = TT[src_off + 1]; + TI[dst_off + 2] = TT[src_off + 2]; + TI[dst_off + 3] = TT[src_off + 3]; + } + + #endif + uint4 R0 = TI[STATE_CNT4 - 4]; uint4 R1 = TI[STATE_CNT4 - 3]; uint4 R2 = TI[STATE_CNT4 - 2]; @@ -175,38 +205,9 @@ DECLSPEC void salsa_r (PRIVATE_AS uint4 *TI) TI[i + 2] = R2; TI[i + 3] = R3; } - - #if SCRYPT_R > 1 - - uint4 TT[STATE_CNT4 / 2]; - - for (int dst_off = 0, src_off = 4; src_off < STATE_CNT4; dst_off += 4, src_off += 8) - { - TT[dst_off + 0] = TI[src_off + 0]; - TT[dst_off + 1] = TI[src_off + 1]; - TT[dst_off + 2] = TI[src_off + 2]; - TT[dst_off + 3] = TI[src_off + 3]; - } - - for (int dst_off = 4, src_off = 8; src_off < STATE_CNT4; dst_off += 4, src_off += 8) - { - TI[dst_off + 0] = TI[src_off + 0]; - TI[dst_off + 1] = TI[src_off + 1]; - TI[dst_off + 2] = TI[src_off + 2]; - TI[dst_off + 3] = TI[src_off + 3]; - } - - for (int dst_off = STATE_CNT4 / 2, src_off = 0; dst_off < STATE_CNT4; dst_off += 4, src_off += 4) - { - TI[dst_off + 0] = TT[src_off + 0]; - TI[dst_off + 1] = TT[src_off + 1]; - TI[dst_off + 2] = TT[src_off + 2]; - TI[dst_off + 3] = TT[src_off + 3]; - } - - #endif } + DECLSPEC void scrypt_smix_init (PRIVATE_AS uint4 *X, GLOBAL_AS uint4 *V0, GLOBAL_AS uint4 *V1, GLOBAL_AS uint4 *V2, GLOBAL_AS uint4 *V3, const u64 gid) { const u32 ySIZE = SCRYPT_N / SCRYPT_TMTO; @@ -227,6 +228,30 @@ DECLSPEC void scrypt_smix_init (PRIVATE_AS uint4 *X, GLOBAL_AS uint4 *V0, GLOBAL case 3: V = V3; break; } + #if SCRYPT_R > 1 + + uint4 TT[STATE_CNT4]; + + for (int z = 0; z < zSIZE; z++) TT[z] = X[z]; + + for (int dst_off = 8, src_off = 4; dst_off < zSIZE; dst_off += 8, src_off += 4) + { + X[dst_off + 0] = TT[src_off + 0]; + X[dst_off + 1] = TT[src_off + 1]; + X[dst_off + 2] = TT[src_off + 2]; + X[dst_off + 3] = TT[src_off + 3]; + } + + for (int dst_off = 4, src_off = zSIZE / 2; dst_off < zSIZE; dst_off += 8, src_off += 4) + { + X[dst_off + 0] = TT[src_off + 0]; + X[dst_off + 1] = TT[src_off + 1]; + X[dst_off + 2] = TT[src_off + 2]; + X[dst_off + 3] = TT[src_off + 3]; + } + + #endif + for (u32 y = 0; y < ySIZE; y++) { for (u32 z = 0; z < zSIZE; z++) V[CO] = X[z]; @@ -337,6 +362,9 @@ KERNEL_FQ void m28200_init (KERN_ATTR_TMPS_ESALT (exodus_tmp_t, exodus_t)) #if defined IS_CUDA || defined IS_HIP const uint4 tmp0 = make_uint4 (digest[0], digest[1], digest[2], digest[3]); const uint4 tmp1 = make_uint4 (digest[4], digest[5], digest[6], digest[7]); + #elif defined IS_METAL + const uint4 tmp0 = uint4 (digest[0], digest[1], digest[2], digest[3]); + const uint4 tmp1 = uint4 (digest[4], digest[5], digest[6], digest[7]); #else const uint4 tmp0 = (uint4) (digest[0], digest[1], digest[2], digest[3]); const uint4 tmp1 = (uint4) (digest[4], digest[5], digest[6], digest[7]); @@ -367,6 +395,11 @@ KERNEL_FQ void m28200_init (KERN_ATTR_TMPS_ESALT (exodus_tmp_t, exodus_t)) X[1] = make_uint4 (T[1].x, T[2].y, T[3].z, T[0].w); X[2] = make_uint4 (T[2].x, T[3].y, T[0].z, T[1].w); X[3] = make_uint4 (T[3].x, T[0].y, T[1].z, T[2].w); + #elif defined IS_METAL + X[0] = uint4 (T[0].x, T[1].y, T[2].z, T[3].w); + X[1] = uint4 (T[1].x, T[2].y, T[3].z, T[0].w); + X[2] = uint4 (T[2].x, T[3].y, T[0].z, T[1].w); + X[3] = uint4 (T[3].x, T[0].y, T[1].z, T[2].w); #else X[0] = (uint4) (T[0].x, T[1].y, T[2].z, T[3].w); X[1] = (uint4) (T[1].x, T[2].y, T[3].z, T[0].w); @@ -509,10 +542,14 @@ KERNEL_FQ void m28200_comp (KERN_ATTR_TMPS_ESALT (exodus_tmp_t, exodus_t)) sha256_hmac_init_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); - for (u32 l = 0; l < SCRYPT_CNT4; l += 4) + for (u32 i = 0; i < SCRYPT_CNT4; i += STATE_CNT4) { + for (u32 j = 0; j < (STATE_CNT4 * 2); j += 8) + { uint4 X[4]; + const u32 l = i + j + ((j >= STATE_CNT4) ? (4 - STATE_CNT4) : 0); + X[0] = tmps[gid].P[l + 0]; X[1] = tmps[gid].P[l + 1]; X[2] = tmps[gid].P[l + 2]; @@ -525,6 +562,11 @@ KERNEL_FQ void m28200_comp (KERN_ATTR_TMPS_ESALT (exodus_tmp_t, exodus_t)) T[1] = make_uint4 (X[1].x, X[0].y, X[3].z, X[2].w); T[2] = make_uint4 (X[2].x, X[1].y, X[0].z, X[3].w); T[3] = make_uint4 (X[3].x, X[2].y, X[1].z, X[0].w); + #elif defined IS_METAL + T[0] = uint4 (X[0].x, X[3].y, X[2].z, X[1].w); + T[1] = uint4 (X[1].x, X[0].y, X[3].z, X[2].w); + T[2] = uint4 (X[2].x, X[1].y, X[0].z, X[3].w); + T[3] = uint4 (X[3].x, X[2].y, X[1].z, X[0].w); #else T[0] = (uint4) (X[0].x, X[3].y, X[2].z, X[1].w); T[1] = (uint4) (X[1].x, X[0].y, X[3].z, X[2].w); @@ -555,6 +597,7 @@ KERNEL_FQ void m28200_comp (KERN_ATTR_TMPS_ESALT (exodus_tmp_t, exodus_t)) w3[3] = T[3].w; sha256_hmac_update_64 (&ctx, w0, w1, w2, w3, 64); + } } w0[0] = 1; diff --git a/OpenCL/m28400-pure.cl b/OpenCL/m28400-pure.cl index 0fb0d45ad..2fec71c5b 100644 --- a/OpenCL/m28400-pure.cl +++ b/OpenCL/m28400-pure.cl @@ -348,7 +348,7 @@ DECLSPEC void SET_KEY32 (LOCAL_AS u32 *S, const u64 key, const u32 val, const u6 #else -// access pattern: linear access with S offset already set to right offset based on thread ID saving it from compuation +// access pattern: linear access with S offset already set to right offset based on thread ID saving it from computation // makes sense if there are not thread ID's (for instance on CPU) DECLSPEC inline u32 GET_KEY32 (LOCAL_AS u32 *S, const u64 key, MAYBE_UNUSED const u64 lid) diff --git a/OpenCL/m29100_a0-pure.cl b/OpenCL/m29100_a0-pure.cl index 0debcc03c..1d53b0036 100644 --- a/OpenCL/m29100_a0-pure.cl +++ b/OpenCL/m29100_a0-pure.cl @@ -34,13 +34,13 @@ KERNEL_FQ void m29100_mxx (KERN_ATTR_RULES ()) const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; - u32 s[16] = { 0 }; + u32 s[32] = { 0 }; #pragma unroll - for (u32 id = 0; id < 16; id++) + for (u32 id = 0; id < 32; id++) { s[id] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[id]); - }; + } /** * base @@ -129,13 +129,13 @@ KERNEL_FQ void m29100_sxx (KERN_ATTR_RULES ()) const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; - u32 s[16] = { 0 }; + u32 s[32] = { 0 }; #pragma unroll - for (u32 id = 0; id < 16; id++) + for (u32 id = 0; id < 32; id++) { s[id] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[id]); - }; + } /** * base diff --git a/OpenCL/m29100_a1-pure.cl b/OpenCL/m29100_a1-pure.cl index e49024082..e6bb17319 100644 --- a/OpenCL/m29100_a1-pure.cl +++ b/OpenCL/m29100_a1-pure.cl @@ -42,13 +42,13 @@ KERNEL_FQ void m29100_mxx (KERN_ATTR_BASIC ()) const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; - u32 s[16] = { 0 }; + u32 s[32] = { 0 }; #pragma unroll - for (u32 id = 0; id < 16; id++) + for (u32 id = 0; id < 32; id++) { s[id] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[id]); - }; + } /** * loop @@ -164,13 +164,13 @@ KERNEL_FQ void m29100_sxx (KERN_ATTR_BASIC ()) const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; - u32 s[16] = { 0 }; + u32 s[32] = { 0 }; #pragma unroll - for (u32 id = 0; id < 16; id++) + for (u32 id = 0; id < 32; id++) { s[id] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[id]); - }; + } /** * loop diff --git a/OpenCL/m29100_a3-pure.cl b/OpenCL/m29100_a3-pure.cl index 5ad364e1b..94c38d7da 100644 --- a/OpenCL/m29100_a3-pure.cl +++ b/OpenCL/m29100_a3-pure.cl @@ -41,13 +41,13 @@ KERNEL_FQ void m29100_mxx (KERN_ATTR_BASIC ()) const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; - u32 s[16] = { 0 }; + u32 s[32] = { 0 }; #pragma unroll - for (u32 id = 0; id < 16; id++) + for (u32 id = 0; id < 32; id++) { s[id] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[id]); - }; + } /** * loop @@ -149,13 +149,13 @@ KERNEL_FQ void m29100_sxx (KERN_ATTR_BASIC ()) const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; - u32 s[16] = { 0 }; + u32 s[32] = { 0 }; #pragma unroll - for (u32 id = 0; id < 16; id++) + for (u32 id = 0; id < 32; id++) { s[id] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[id]); - }; + } /** * loop diff --git a/OpenCL/m29800-pure.cl b/OpenCL/m29800-pure.cl index de4260279..c72f5c267 100644 --- a/OpenCL/m29800-pure.cl +++ b/OpenCL/m29800-pure.cl @@ -351,6 +351,9 @@ KERNEL_FQ void m29800_init (KERN_ATTR_TMPS (scrypt_tmp_t)) #if defined IS_CUDA || defined IS_HIP const uint4 tmp0 = make_uint4 (digest[0], digest[1], digest[2], digest[3]); const uint4 tmp1 = make_uint4 (digest[4], digest[5], digest[6], digest[7]); + #elif defined IS_METAL + const uint4 tmp0 = uint4 (digest[0], digest[1], digest[2], digest[3]); + const uint4 tmp1 = uint4 (digest[4], digest[5], digest[6], digest[7]); #else const uint4 tmp0 = (uint4) (digest[0], digest[1], digest[2], digest[3]); const uint4 tmp1 = (uint4) (digest[4], digest[5], digest[6], digest[7]); @@ -381,6 +384,11 @@ KERNEL_FQ void m29800_init (KERN_ATTR_TMPS (scrypt_tmp_t)) X[1] = make_uint4 (T[1].x, T[2].y, T[3].z, T[0].w); X[2] = make_uint4 (T[2].x, T[3].y, T[0].z, T[1].w); X[3] = make_uint4 (T[3].x, T[0].y, T[1].z, T[2].w); + #elif defined IS_METAL + X[0] = uint4 (T[0].x, T[1].y, T[2].z, T[3].w); + X[1] = uint4 (T[1].x, T[2].y, T[3].z, T[0].w); + X[2] = uint4 (T[2].x, T[3].y, T[0].z, T[1].w); + X[3] = uint4 (T[3].x, T[0].y, T[1].z, T[2].w); #else X[0] = (uint4) (T[0].x, T[1].y, T[2].z, T[3].w); X[1] = (uint4) (T[1].x, T[2].y, T[3].z, T[0].w); @@ -557,6 +565,11 @@ KERNEL_FQ void m29800_comp (KERN_ATTR_TMPS (scrypt_tmp_t)) T[1] = make_uint4 (X[1].x, X[0].y, X[3].z, X[2].w); T[2] = make_uint4 (X[2].x, X[1].y, X[0].z, X[3].w); T[3] = make_uint4 (X[3].x, X[2].y, X[1].z, X[0].w); + #elif defined IS_METAL + T[0] = uint4 (X[0].x, X[3].y, X[2].z, X[1].w); + T[1] = uint4 (X[1].x, X[0].y, X[3].z, X[2].w); + T[2] = uint4 (X[2].x, X[1].y, X[0].z, X[3].w); + T[3] = uint4 (X[3].x, X[2].y, X[1].z, X[0].w); #else T[0] = (uint4) (X[0].x, X[3].y, X[2].z, X[1].w); T[1] = (uint4) (X[1].x, X[0].y, X[3].z, X[2].w); diff --git a/OpenCL/m30600-pure.cl b/OpenCL/m30600-pure.cl index 5aebee3d9..140514465 100644 --- a/OpenCL/m30600-pure.cl +++ b/OpenCL/m30600-pure.cl @@ -349,7 +349,7 @@ DECLSPEC void SET_KEY32 (LOCAL_AS u32 *S, const u64 key, const u32 val, const u6 #else -// access pattern: linear access with S offset already set to right offset based on thread ID saving it from compuation +// access pattern: linear access with S offset already set to right offset based on thread ID saving it from computation // makes sense if there are not thread ID's (for instance on CPU) DECLSPEC inline u32 GET_KEY32 (LOCAL_AS u32 *S, const u64 key, MAYBE_UNUSED const u64 lid) diff --git a/OpenCL/m31400_a0-optimized.cl b/OpenCL/m31400_a0-optimized.cl index 67af97d2d..3ebf076da 100644 --- a/OpenCL/m31400_a0-optimized.cl +++ b/OpenCL/m31400_a0-optimized.cl @@ -496,7 +496,7 @@ KERNEL_FQ void m31400_m04 (KERN_ATTR_RULES_ESALT (scrtv2_t)) we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); - u32x digest[8]; + u32x digest[8]; digest[0] = a + make_u32x (SHA256M_A); digest[1] = b + make_u32x (SHA256M_B); @@ -725,7 +725,7 @@ KERNEL_FQ void m31400_s04 (KERN_ATTR_RULES_ESALT (scrtv2_t)) we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); - u32x digest[8]; + u32x digest[8]; digest[0] = a + make_u32x (SHA256M_A); digest[1] = b + make_u32x (SHA256M_B); diff --git a/OpenCL/m31400_a1-optimized.cl b/OpenCL/m31400_a1-optimized.cl index f37066f84..e6b266a23 100644 --- a/OpenCL/m31400_a1-optimized.cl +++ b/OpenCL/m31400_a1-optimized.cl @@ -562,7 +562,7 @@ KERNEL_FQ void m31400_m04 (KERN_ATTR_ESALT (scrtv2_t)) we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); - u32x digest[8]; + u32x digest[8]; digest[0] = a + make_u32x (SHA256M_A); digest[1] = b + make_u32x (SHA256M_B); @@ -868,7 +868,7 @@ KERNEL_FQ void m31400_s04 (KERN_ATTR_BASIC ()) we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); - u32x digest[8]; + u32x digest[8]; digest[0] = a + make_u32x (SHA256M_A); digest[1] = b + make_u32x (SHA256M_B); diff --git a/OpenCL/m31500-pure.cl b/OpenCL/m31500-pure.cl new file mode 100644 index 000000000..9797dfcff --- /dev/null +++ b/OpenCL/m31500-pure.cl @@ -0,0 +1,141 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_hash_md4.cl) +#endif + +#define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl) +#define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl) + +#ifdef KERNEL_STATIC +DECLSPEC u8 hex_convert (const u8 c) +{ + return (c & 15) + (c >> 6) * 9; +} + +DECLSPEC u8 hex_to_u8 (PRIVATE_AS const u8 *hex) +{ + u8 v = 0; + + v |= ((u8) hex_convert (hex[1]) << 0); + v |= ((u8) hex_convert (hex[0]) << 4); + + return (v); +} +#endif + +typedef struct dcc_tmp +{ + u32 digest_buf[4]; + +} dcc_tmp_t; + + +KERNEL_FQ void m31500_init (KERN_ATTR_TMPS (dcc_tmp_t)) +{ + /** + * modifier + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + u32 in[16]; + + in[ 0] = pws[gid].i[ 0]; + in[ 1] = pws[gid].i[ 1]; + in[ 2] = pws[gid].i[ 2]; + in[ 3] = pws[gid].i[ 3]; + in[ 4] = pws[gid].i[ 4]; + in[ 5] = pws[gid].i[ 5]; + in[ 6] = pws[gid].i[ 6]; + in[ 7] = pws[gid].i[ 7]; + + u32 out[4]; + + PRIVATE_AS u8 *in_ptr = (PRIVATE_AS u8 *) in; + PRIVATE_AS u8 *out_ptr = (PRIVATE_AS u8 *) out; + + for (int i = 0, j = 0; i < 16; i += 1, j += 2) + { + out_ptr[i] = hex_to_u8 (in_ptr + j); + } + + tmps[gid].digest_buf[0] = out[0]; + tmps[gid].digest_buf[1] = out[1]; + tmps[gid].digest_buf[2] = out[2]; + tmps[gid].digest_buf[3] = out[3]; +} + +KERNEL_FQ void m31500_loop (KERN_ATTR_TMPS (dcc_tmp_t)) +{ + +} + +KERNEL_FQ void m31500_comp (KERN_ATTR_TMPS (dcc_tmp_t)) +{ + /** + * modifier + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + /** + * salt + */ + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = salt_bufs[SALT_POS_HOST].salt_buf[idx]; + } + + const u32 a = tmps[gid].digest_buf[0]; + const u32 b = tmps[gid].digest_buf[1]; + const u32 c = tmps[gid].digest_buf[2]; + const u32 d = tmps[gid].digest_buf[3]; + + md4_ctx_t ctx; + + md4_init (&ctx); + + ctx.w0[0] = a; + ctx.w0[1] = b; + ctx.w0[2] = c; + ctx.w0[3] = d; + + ctx.len = 16; + + md4_update_utf16le (&ctx, s, salt_len); + + md4_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + #define il_pos 0 + + #ifdef KERNEL_STATIC + #include COMPARE_M + #endif +} \ No newline at end of file diff --git a/OpenCL/m31600-pure.cl b/OpenCL/m31600-pure.cl new file mode 100644 index 000000000..40af858f4 --- /dev/null +++ b/OpenCL/m31600-pure.cl @@ -0,0 +1,322 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_md4.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha1.cl) +#endif + +#define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl) +#define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl) + +typedef struct dcc2_tmp +{ + u32 ipad[5]; + u32 opad[5]; + + u32 dgst[5]; + u32 out[4]; + +} dcc2_tmp_t; + +#ifdef KERNEL_STATIC +DECLSPEC u8 hex_convert (const u8 c) +{ + return (c & 15) + (c >> 6) * 9; +} + +DECLSPEC u8 hex_to_u8 (PRIVATE_AS const u8 *hex) +{ + u8 v = 0; + + v |= ((u8) hex_convert (hex[1]) << 0); + v |= ((u8) hex_convert (hex[0]) << 4); + + return (v); +} +#endif + +DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS u32x *w2, PRIVATE_AS u32x *w3, PRIVATE_AS u32x *ipad, PRIVATE_AS u32x *opad, PRIVATE_AS u32x *digest) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform_vector (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform_vector (w0, w1, w2, w3, digest); +} + +KERNEL_FQ void m31600_init (KERN_ATTR_TMPS (dcc2_tmp_t)) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + // dcc1 + + u32 in[16]; + + in[ 0] = pws[gid].i[ 0]; + in[ 1] = pws[gid].i[ 1]; + in[ 2] = pws[gid].i[ 2]; + in[ 3] = pws[gid].i[ 3]; + in[ 4] = pws[gid].i[ 4]; + in[ 5] = pws[gid].i[ 5]; + in[ 6] = pws[gid].i[ 6]; + in[ 7] = pws[gid].i[ 7]; + + u32 out[4]; + + PRIVATE_AS u8 *in_ptr = (PRIVATE_AS u8 *) in; + PRIVATE_AS u8 *out_ptr = (PRIVATE_AS u8 *) out; + + for (int i = 0, j = 0; i < 16; i += 1, j += 2) + { + out_ptr[i] = hex_to_u8 (in_ptr + j); + } + + md4_ctx_t md4_ctx; + + md4_init (&md4_ctx); + + md4_ctx.w0[0] = out[0]; + md4_ctx.w0[1] = out[1]; + md4_ctx.w0[2] = out[2]; + md4_ctx.w0[3] = out[3]; + + md4_ctx.len = 16; + + md4_update_global_utf16le (&md4_ctx, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len); + + md4_final (&md4_ctx); + + md4_ctx.h[0] = hc_swap32_S (md4_ctx.h[0]); + md4_ctx.h[1] = hc_swap32_S (md4_ctx.h[1]); + md4_ctx.h[2] = hc_swap32_S (md4_ctx.h[2]); + md4_ctx.h[3] = hc_swap32_S (md4_ctx.h[3]); + + // dcc2 + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + w0[0] = md4_ctx.h[0]; + w0[1] = md4_ctx.h[1]; + w0[2] = md4_ctx.h[2]; + w0[3] = md4_ctx.h[3]; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + sha1_hmac_ctx_t sha1_hmac_ctx; + + sha1_hmac_init_64 (&sha1_hmac_ctx, w0, w1, w2, w3); + + tmps[gid].ipad[0] = sha1_hmac_ctx.ipad.h[0]; + tmps[gid].ipad[1] = sha1_hmac_ctx.ipad.h[1]; + tmps[gid].ipad[2] = sha1_hmac_ctx.ipad.h[2]; + tmps[gid].ipad[3] = sha1_hmac_ctx.ipad.h[3]; + tmps[gid].ipad[4] = sha1_hmac_ctx.ipad.h[4]; + + tmps[gid].opad[0] = sha1_hmac_ctx.opad.h[0]; + tmps[gid].opad[1] = sha1_hmac_ctx.opad.h[1]; + tmps[gid].opad[2] = sha1_hmac_ctx.opad.h[2]; + tmps[gid].opad[3] = sha1_hmac_ctx.opad.h[3]; + tmps[gid].opad[4] = sha1_hmac_ctx.opad.h[4]; + + sha1_hmac_update_global_utf16le_swap (&sha1_hmac_ctx, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len); + + w0[0] = 1; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + sha1_hmac_update_64 (&sha1_hmac_ctx, w0, w1, w2, w3, 4); + + sha1_hmac_final (&sha1_hmac_ctx); + + tmps[gid].dgst[0] = sha1_hmac_ctx.opad.h[0]; + tmps[gid].dgst[1] = sha1_hmac_ctx.opad.h[1]; + tmps[gid].dgst[2] = sha1_hmac_ctx.opad.h[2]; + tmps[gid].dgst[3] = sha1_hmac_ctx.opad.h[3]; + tmps[gid].dgst[4] = sha1_hmac_ctx.opad.h[4]; + + tmps[gid].out[0] = tmps[gid].dgst[0]; + tmps[gid].out[1] = tmps[gid].dgst[1]; + tmps[gid].out[2] = tmps[gid].dgst[2]; + tmps[gid].out[3] = tmps[gid].dgst[3]; +} + +KERNEL_FQ void m31600_loop (KERN_ATTR_TMPS (dcc2_tmp_t)) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + + if ((gid * VECT_SIZE) >= GID_CNT) return; + + u32x ipad[5]; + u32x opad[5]; + + ipad[0] = packv (tmps, ipad, gid, 0); + ipad[1] = packv (tmps, ipad, gid, 1); + ipad[2] = packv (tmps, ipad, gid, 2); + ipad[3] = packv (tmps, ipad, gid, 3); + ipad[4] = packv (tmps, ipad, gid, 4); + + opad[0] = packv (tmps, opad, gid, 0); + opad[1] = packv (tmps, opad, gid, 1); + opad[2] = packv (tmps, opad, gid, 2); + opad[3] = packv (tmps, opad, gid, 3); + opad[4] = packv (tmps, opad, gid, 4); + + /** + * iter1 + */ + + u32x dgst[5]; + u32x out[4]; + + dgst[0] = packv (tmps, dgst, gid, 0); + dgst[1] = packv (tmps, dgst, gid, 1); + dgst[2] = packv (tmps, dgst, gid, 2); + dgst[3] = packv (tmps, dgst, gid, 3); + dgst[4] = packv (tmps, dgst, gid, 4); + + out[0] = packv (tmps, out, gid, 0); + out[1] = packv (tmps, out, gid, 1); + out[2] = packv (tmps, out, gid, 2); + out[3] = packv (tmps, out, gid, 3); + + for (u32 i = 0; i < LOOP_CNT; i++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + hmac_sha1_run_V (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + } + + unpackv (tmps, dgst, gid, 0, dgst[0]); + unpackv (tmps, dgst, gid, 1, dgst[1]); + unpackv (tmps, dgst, gid, 2, dgst[2]); + unpackv (tmps, dgst, gid, 3, dgst[3]); + unpackv (tmps, dgst, gid, 4, dgst[4]); + + unpackv (tmps, out, gid, 0, out[0]); + unpackv (tmps, out, gid, 1, out[1]); + unpackv (tmps, out, gid, 2, out[2]); + unpackv (tmps, out, gid, 3, out[3]); +} + +KERNEL_FQ void m31600_comp (KERN_ATTR_TMPS (dcc2_tmp_t)) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + const u64 lid = get_local_id (0); + + const u32 r0 = tmps[gid].out[DGST_R0]; + const u32 r1 = tmps[gid].out[DGST_R1]; + const u32 r2 = tmps[gid].out[DGST_R2]; + const u32 r3 = tmps[gid].out[DGST_R3]; + + #define il_pos 0 + + #ifdef KERNEL_STATIC + #include COMPARE_M + #endif +} diff --git a/OpenCL/m31800-pure.cl b/OpenCL/m31800-pure.cl index a654faacb..55ec89ddf 100644 --- a/OpenCL/m31800-pure.cl +++ b/OpenCL/m31800-pure.cl @@ -429,7 +429,7 @@ KERNEL_FQ void m31800_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha256_tmp_t, onepasswo /* const int pt_len = 28; // not using 32 byte but 28 because our UTF8 allows up to 4 byte per character and since we decrypt 32 byte - // only we can't garantee it is not in the middle of a UTF8 byte stream at that point + // only we can't guarantee it is not in the middle of a UTF8 byte stream at that point if (hc_enc_scan (pt, pt_len)) { diff --git a/OpenCL/m31900-pure.cl b/OpenCL/m31900-pure.cl index 24ffb1232..fca9b423d 100644 --- a/OpenCL/m31900-pure.cl +++ b/OpenCL/m31900-pure.cl @@ -33,7 +33,7 @@ typedef struct pbkdf2_sha512_aes_cbc u32 salt_buf[64]; u32 iv_buf[4]; u32 iv_len; - u32 ct_buf[4]; + u32 ct_buf[8]; u32 ct_len; } pbkdf2_sha512_aes_cbc_t; @@ -413,16 +413,20 @@ KERNEL_FQ void m31900_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, pbkdf2_sh // ct - u32 ct_buf[4]; + u32 ct_buf[8]; ct_buf[0] = esalt_bufs[DIGESTS_OFFSET_HOST].ct_buf[0]; ct_buf[1] = esalt_bufs[DIGESTS_OFFSET_HOST].ct_buf[1]; ct_buf[2] = esalt_bufs[DIGESTS_OFFSET_HOST].ct_buf[2]; ct_buf[3] = esalt_bufs[DIGESTS_OFFSET_HOST].ct_buf[3]; + ct_buf[4] = esalt_bufs[DIGESTS_OFFSET_HOST].ct_buf[4]; + ct_buf[5] = esalt_bufs[DIGESTS_OFFSET_HOST].ct_buf[5]; + ct_buf[6] = esalt_bufs[DIGESTS_OFFSET_HOST].ct_buf[6]; + ct_buf[7] = esalt_bufs[DIGESTS_OFFSET_HOST].ct_buf[7]; // decrypt first block - u32 pt_buf[4] = { 0 }; + u32 pt_buf[8] = { 0 }; AES256_decrypt (ks, ct_buf, pt_buf, s_td0, s_td1, s_td2, s_td3, s_td4); @@ -431,13 +435,29 @@ KERNEL_FQ void m31900_comp (KERN_ATTR_TMPS_ESALT (pbkdf2_sha512_tmp_t, pbkdf2_sh pt_buf[2] ^= iv_buf[2]; pt_buf[3] ^= iv_buf[3]; - const int correct = is_valid_printable_32 (pt_buf[0]) - + is_valid_printable_32 (pt_buf[1]) - + is_valid_printable_32 (pt_buf[2]) - + is_valid_printable_32 (pt_buf[3]); + const int correct_b1 = is_valid_printable_32 (pt_buf[0]) + + is_valid_printable_32 (pt_buf[1]) + + is_valid_printable_32 (pt_buf[2]) + + is_valid_printable_32 (pt_buf[3]); - if (correct != 4) return; + if (correct_b1 != 4) return; + // proceed with second block to further reduce false-positives + + AES256_decrypt (ks, ct_buf+4, pt_buf+4, s_td0, s_td1, s_td2, s_td3, s_td4); + + pt_buf[4] ^= ct_buf[0]; + pt_buf[5] ^= ct_buf[1]; + pt_buf[6] ^= ct_buf[2]; + pt_buf[7] ^= ct_buf[3]; + + const int correct_b2 = is_valid_printable_32 (pt_buf[4]) + + is_valid_printable_32 (pt_buf[5]) + + is_valid_printable_32 (pt_buf[6]) + + is_valid_printable_32 (pt_buf[7]); + + if (correct_b2 != 4) return; + const u32 r0 = ct_buf[0]; const u32 r1 = ct_buf[1]; const u32 r2 = ct_buf[2]; diff --git a/OpenCL/m32000-pure.cl b/OpenCL/m32000-pure.cl new file mode 100644 index 000000000..e7d985b52 --- /dev/null +++ b/OpenCL/m32000-pure.cl @@ -0,0 +1,127 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#endif + +#define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl) +#define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl) + +typedef struct netiq_sspr_md5_tmp +{ + u32 dgst[4]; + +} netiq_sspr_md5_tmp_t; + +KERNEL_FQ void m32000_init (KERN_ATTR_TMPS (netiq_sspr_md5_tmp_t)) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + md5_ctx_t ctx; + + md5_init (&ctx); + + md5_update_global (&ctx, pws[gid].i, pws[gid].pw_len); + + md5_final (&ctx); + + tmps[gid].dgst[0] = ctx.h[0]; + tmps[gid].dgst[1] = ctx.h[1]; + tmps[gid].dgst[2] = ctx.h[2]; + tmps[gid].dgst[3] = ctx.h[3]; +} + +KERNEL_FQ void m32000_loop (KERN_ATTR_TMPS (netiq_sspr_md5_tmp_t)) +{ + const u64 gid = get_global_id (0); + + if ((gid * VECT_SIZE) >= GID_CNT) return; + + for (u32 i = 0; i < 4; i += 4) + { + u32x dgst[4]; + + dgst[0] = packv (tmps, dgst, gid, i + 0); + dgst[1] = packv (tmps, dgst, gid, i + 1); + dgst[2] = packv (tmps, dgst, gid, i + 2); + dgst[3] = packv (tmps, dgst, gid, i + 3); + + for (u32 j = 0; j < LOOP_CNT; j++) + { + u32x h[4]; + + h[0] = MD5M_A; + h[1] = MD5M_B; + h[2] = MD5M_C; + h[3] = MD5M_D; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = 0x00000080; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 16 * 8; + w3[3] = 0; + + md5_transform_vector (w0, w1, w2, w3, h); + + dgst[0] = h[0]; + dgst[1] = h[1]; + dgst[2] = h[2]; + dgst[3] = h[3]; + } + + unpackv (tmps, dgst, gid, i + 0, dgst[0]); + unpackv (tmps, dgst, gid, i + 1, dgst[1]); + unpackv (tmps, dgst, gid, i + 2, dgst[2]); + unpackv (tmps, dgst, gid, i + 3, dgst[3]); + } +} + +KERNEL_FQ void m32000_comp (KERN_ATTR_TMPS (netiq_sspr_md5_tmp_t)) +{ + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + const u32 r0 = tmps[gid].dgst[0]; + const u32 r1 = tmps[gid].dgst[1]; + const u32 r2 = tmps[gid].dgst[2]; + const u32 r3 = tmps[gid].dgst[3]; + + #define il_pos 0 + + #ifdef KERNEL_STATIC + #include COMPARE_M + #endif +} diff --git a/OpenCL/m32010-pure.cl b/OpenCL/m32010-pure.cl new file mode 100644 index 000000000..c806dce13 --- /dev/null +++ b/OpenCL/m32010-pure.cl @@ -0,0 +1,132 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha1.cl) +#endif + +#define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl) +#define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl) + +typedef struct netiq_sspr_sha1_tmp +{ + u32 dgst[5]; + +} netiq_sspr_sha1_tmp_t; + +KERNEL_FQ void m32010_init (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t)) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + sha1_ctx_t ctx; + + sha1_init (&ctx); + + sha1_update_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); + + sha1_final (&ctx); + + tmps[gid].dgst[0] = ctx.h[0]; + tmps[gid].dgst[1] = ctx.h[1]; + tmps[gid].dgst[2] = ctx.h[2]; + tmps[gid].dgst[3] = ctx.h[3]; + tmps[gid].dgst[4] = ctx.h[4]; +} + +KERNEL_FQ void m32010_loop (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t)) +{ + const u64 gid = get_global_id (0); + + if ((gid * VECT_SIZE) >= GID_CNT) return; + + for (u32 i = 0; i < 5; i += 5) + { + u32x dgst[5]; + + dgst[0] = packv (tmps, dgst, gid, i + 0); + dgst[1] = packv (tmps, dgst, gid, i + 1); + dgst[2] = packv (tmps, dgst, gid, i + 2); + dgst[3] = packv (tmps, dgst, gid, i + 3); + dgst[4] = packv (tmps, dgst, gid, i + 4); + + for (u32 j = 0; j < LOOP_CNT; j++) + { + u32x h[5]; + + h[0] = SHA1M_A; + h[1] = SHA1M_B; + h[2] = SHA1M_C; + h[3] = SHA1M_D; + h[4] = SHA1M_E; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 20 * 8; + + sha1_transform_vector (w0, w1, w2, w3, h); + + dgst[0] = h[0]; + dgst[1] = h[1]; + dgst[2] = h[2]; + dgst[3] = h[3]; + dgst[4] = h[4]; + } + + unpackv (tmps, dgst, gid, i + 0, dgst[0]); + unpackv (tmps, dgst, gid, i + 1, dgst[1]); + unpackv (tmps, dgst, gid, i + 2, dgst[2]); + unpackv (tmps, dgst, gid, i + 3, dgst[3]); + unpackv (tmps, dgst, gid, i + 4, dgst[4]); + } +} + +KERNEL_FQ void m32010_comp (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t)) +{ + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + const u32 r0 = tmps[gid].dgst[DGST_R0]; + const u32 r1 = tmps[gid].dgst[DGST_R1]; + const u32 r2 = tmps[gid].dgst[DGST_R2]; + const u32 r3 = tmps[gid].dgst[DGST_R3]; + + #define il_pos 0 + + #ifdef KERNEL_STATIC + #include COMPARE_M + #endif +} diff --git a/OpenCL/m32020-pure.cl b/OpenCL/m32020-pure.cl new file mode 100644 index 000000000..b779676e2 --- /dev/null +++ b/OpenCL/m32020-pure.cl @@ -0,0 +1,134 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha1.cl) +#endif + +#define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl) +#define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl) + +typedef struct netiq_sspr_sha1_tmp +{ + u32 dgst[5]; + +} netiq_sspr_sha1_tmp_t; + +KERNEL_FQ void m32020_init (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t)) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + sha1_ctx_t ctx; + + sha1_init (&ctx); + + sha1_update_global_swap (&ctx, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len); + + sha1_update_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); + + sha1_final (&ctx); + + tmps[gid].dgst[0] = ctx.h[0]; + tmps[gid].dgst[1] = ctx.h[1]; + tmps[gid].dgst[2] = ctx.h[2]; + tmps[gid].dgst[3] = ctx.h[3]; + tmps[gid].dgst[4] = ctx.h[4]; +} + +KERNEL_FQ void m32020_loop (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t)) +{ + const u64 gid = get_global_id (0); + + if ((gid * VECT_SIZE) >= GID_CNT) return; + + for (u32 i = 0; i < 5; i += 5) + { + u32x dgst[5]; + + dgst[0] = packv (tmps, dgst, gid, i + 0); + dgst[1] = packv (tmps, dgst, gid, i + 1); + dgst[2] = packv (tmps, dgst, gid, i + 2); + dgst[3] = packv (tmps, dgst, gid, i + 3); + dgst[4] = packv (tmps, dgst, gid, i + 4); + + for (u32 j = 0; j < LOOP_CNT; j++) + { + u32x h[5]; + + h[0] = SHA1M_A; + h[1] = SHA1M_B; + h[2] = SHA1M_C; + h[3] = SHA1M_D; + h[4] = SHA1M_E; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 20 * 8; + + sha1_transform_vector (w0, w1, w2, w3, h); + + dgst[0] = h[0]; + dgst[1] = h[1]; + dgst[2] = h[2]; + dgst[3] = h[3]; + dgst[4] = h[4]; + } + + unpackv (tmps, dgst, gid, i + 0, dgst[0]); + unpackv (tmps, dgst, gid, i + 1, dgst[1]); + unpackv (tmps, dgst, gid, i + 2, dgst[2]); + unpackv (tmps, dgst, gid, i + 3, dgst[3]); + unpackv (tmps, dgst, gid, i + 4, dgst[4]); + } +} + +KERNEL_FQ void m32020_comp (KERN_ATTR_TMPS (netiq_sspr_sha1_tmp_t)) +{ + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + const u32 r0 = tmps[gid].dgst[DGST_R0]; + const u32 r1 = tmps[gid].dgst[DGST_R1]; + const u32 r2 = tmps[gid].dgst[DGST_R2]; + const u32 r3 = tmps[gid].dgst[DGST_R3]; + + #define il_pos 0 + + #ifdef KERNEL_STATIC + #include COMPARE_M + #endif +} diff --git a/OpenCL/m32030-pure.cl b/OpenCL/m32030-pure.cl new file mode 100644 index 000000000..78ea30d56 --- /dev/null +++ b/OpenCL/m32030-pure.cl @@ -0,0 +1,149 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha256.cl) +#endif + +#define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl) +#define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl) + +typedef struct netiq_sspr_sha256_tmp +{ + u32 dgst[8]; + +} netiq_sspr_sha256_tmp_t; + +KERNEL_FQ void m32030_init (KERN_ATTR_TMPS (netiq_sspr_sha256_tmp_t)) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + sha256_ctx_t ctx; + + sha256_init (&ctx); + + sha256_update_global_swap (&ctx, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len); + + sha256_update_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); + + sha256_final (&ctx); + + tmps[gid].dgst[0] = ctx.h[0]; + tmps[gid].dgst[1] = ctx.h[1]; + tmps[gid].dgst[2] = ctx.h[2]; + tmps[gid].dgst[3] = ctx.h[3]; + tmps[gid].dgst[4] = ctx.h[4]; + tmps[gid].dgst[5] = ctx.h[5]; + tmps[gid].dgst[6] = ctx.h[6]; + tmps[gid].dgst[7] = ctx.h[7]; +} + +KERNEL_FQ void m32030_loop (KERN_ATTR_TMPS (netiq_sspr_sha256_tmp_t)) +{ + const u64 gid = get_global_id (0); + + if ((gid * VECT_SIZE) >= GID_CNT) return; + + for (u32 i = 0; i < 8; i += 8) + { + u32x dgst[8]; + + dgst[0] = packv (tmps, dgst, gid, i + 0); + dgst[1] = packv (tmps, dgst, gid, i + 1); + dgst[2] = packv (tmps, dgst, gid, i + 2); + dgst[3] = packv (tmps, dgst, gid, i + 3); + dgst[4] = packv (tmps, dgst, gid, i + 4); + dgst[5] = packv (tmps, dgst, gid, i + 5); + dgst[6] = packv (tmps, dgst, gid, i + 6); + dgst[7] = packv (tmps, dgst, gid, i + 7); + + for (u32 j = 0; j < LOOP_CNT; j++) + { + u32x h[8]; + + h[0] = SHA256M_A; + h[1] = SHA256M_B; + h[2] = SHA256M_C; + h[3] = SHA256M_D; + h[4] = SHA256M_E; + h[5] = SHA256M_F; + h[6] = SHA256M_G; + h[7] = SHA256M_H; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = dgst[5]; + w1[2] = dgst[6]; + w1[3] = dgst[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 32 * 8; + + sha256_transform_vector (w0, w1, w2, w3, h); + + dgst[0] = h[0]; + dgst[1] = h[1]; + dgst[2] = h[2]; + dgst[3] = h[3]; + dgst[4] = h[4]; + dgst[5] = h[5]; + dgst[6] = h[6]; + dgst[7] = h[7]; + } + + unpackv (tmps, dgst, gid, i + 0, dgst[0]); + unpackv (tmps, dgst, gid, i + 1, dgst[1]); + unpackv (tmps, dgst, gid, i + 2, dgst[2]); + unpackv (tmps, dgst, gid, i + 3, dgst[3]); + unpackv (tmps, dgst, gid, i + 4, dgst[4]); + unpackv (tmps, dgst, gid, i + 5, dgst[5]); + unpackv (tmps, dgst, gid, i + 6, dgst[6]); + unpackv (tmps, dgst, gid, i + 7, dgst[7]); + } +} + +KERNEL_FQ void m32030_comp (KERN_ATTR_TMPS (netiq_sspr_sha256_tmp_t)) +{ + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + const u32 r0 = tmps[gid].dgst[DGST_R0]; + const u32 r1 = tmps[gid].dgst[DGST_R1]; + const u32 r2 = tmps[gid].dgst[DGST_R2]; + const u32 r3 = tmps[gid].dgst[DGST_R3]; + + #define il_pos 0 + + #ifdef KERNEL_STATIC + #include COMPARE_M + #endif +} diff --git a/OpenCL/m32040-pure.cl b/OpenCL/m32040-pure.cl new file mode 100644 index 000000000..66611bd98 --- /dev/null +++ b/OpenCL/m32040-pure.cl @@ -0,0 +1,173 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha512.cl) +#endif + +#define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl) +#define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl) + +typedef struct netiq_sspr_sha512_tmp +{ + u64 dgst[8]; + +} netiq_sspr_sha512_tmp_t; + +KERNEL_FQ void m32040_init (KERN_ATTR_TMPS (netiq_sspr_sha512_tmp_t)) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + sha512_ctx_t ctx; + + sha512_init (&ctx); + + sha512_update_global_swap (&ctx, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len); + + sha512_update_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); + + sha512_final (&ctx); + + tmps[gid].dgst[0] = ctx.h[0]; + tmps[gid].dgst[1] = ctx.h[1]; + tmps[gid].dgst[2] = ctx.h[2]; + tmps[gid].dgst[3] = ctx.h[3]; + tmps[gid].dgst[4] = ctx.h[4]; + tmps[gid].dgst[5] = ctx.h[5]; + tmps[gid].dgst[6] = ctx.h[6]; + tmps[gid].dgst[7] = ctx.h[7]; +} + +KERNEL_FQ void m32040_loop (KERN_ATTR_TMPS (netiq_sspr_sha512_tmp_t)) +{ + const u64 gid = get_global_id (0); + + if ((gid * VECT_SIZE) >= GID_CNT) return; + + for (u32 i = 0; i < 8; i += 8) + { + u64x dgst[8]; + + dgst[0] = pack64v (tmps, dgst, gid, i + 0); + dgst[1] = pack64v (tmps, dgst, gid, i + 1); + dgst[2] = pack64v (tmps, dgst, gid, i + 2); + dgst[3] = pack64v (tmps, dgst, gid, i + 3); + dgst[4] = pack64v (tmps, dgst, gid, i + 4); + dgst[5] = pack64v (tmps, dgst, gid, i + 5); + dgst[6] = pack64v (tmps, dgst, gid, i + 6); + dgst[7] = pack64v (tmps, dgst, gid, i + 7); + + for (u32 j = 0; j < LOOP_CNT; j++) + { + u64x h[8]; + + h[0] = SHA512M_A; + h[1] = SHA512M_B; + h[2] = SHA512M_C; + h[3] = SHA512M_D; + h[4] = SHA512M_E; + h[5] = SHA512M_F; + h[6] = SHA512M_G; + h[7] = SHA512M_H; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + u32x w4[4]; + u32x w5[4]; + u32x w6[4]; + u32x w7[4]; + + w0[0] = h32_from_64 (dgst[0]); + w0[1] = l32_from_64 (dgst[0]); + w0[2] = h32_from_64 (dgst[1]); + w0[3] = l32_from_64 (dgst[1]); + w1[0] = h32_from_64 (dgst[2]); + w1[1] = l32_from_64 (dgst[2]); + w1[2] = h32_from_64 (dgst[3]); + w1[3] = l32_from_64 (dgst[3]); + w2[0] = h32_from_64 (dgst[4]); + w2[1] = l32_from_64 (dgst[4]); + w2[2] = h32_from_64 (dgst[5]); + w2[3] = l32_from_64 (dgst[5]); + w3[0] = h32_from_64 (dgst[6]); + w3[1] = l32_from_64 (dgst[6]); + w3[2] = h32_from_64 (dgst[7]); + w3[3] = l32_from_64 (dgst[7]); + w4[0] = 0x80000000; + w4[1] = 0; + w4[2] = 0; + w4[3] = 0; + w5[0] = 0; + w5[1] = 0; + w5[2] = 0; + w5[3] = 0; + w6[0] = 0; + w6[1] = 0; + w6[2] = 0; + w6[3] = 0; + w7[0] = 0; + w7[1] = 0; + w7[2] = 0; + w7[3] = 64 * 8; + + sha512_transform_vector (w0, w1, w2, w3, w4, w5, w6, w7, h); + + dgst[0] = h[0]; + dgst[1] = h[1]; + dgst[2] = h[2]; + dgst[3] = h[3]; + dgst[4] = h[4]; + dgst[5] = h[5]; + dgst[6] = h[6]; + dgst[7] = h[7]; + } + + unpack64v (tmps, dgst, gid, i + 0, dgst[0]); + unpack64v (tmps, dgst, gid, i + 1, dgst[1]); + unpack64v (tmps, dgst, gid, i + 2, dgst[2]); + unpack64v (tmps, dgst, gid, i + 3, dgst[3]); + unpack64v (tmps, dgst, gid, i + 4, dgst[4]); + unpack64v (tmps, dgst, gid, i + 5, dgst[5]); + unpack64v (tmps, dgst, gid, i + 6, dgst[6]); + unpack64v (tmps, dgst, gid, i + 7, dgst[7]); + } +} + +KERNEL_FQ void m32040_comp (KERN_ATTR_TMPS (netiq_sspr_sha512_tmp_t)) +{ + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + + if (gid >= GID_CNT) return; + + const u64 a = tmps[gid].dgst[7]; + const u64 b = tmps[gid].dgst[3]; + + const u32 r0 = l32_from_64_S (a); + const u32 r1 = h32_from_64_S (a); + const u32 r2 = l32_from_64_S (b); + const u32 r3 = h32_from_64_S (b); + + #define il_pos 0 + + #ifdef KERNEL_STATIC + #include COMPARE_M + #endif +} diff --git a/OpenCL/m32100-pure.cl b/OpenCL/m32100-pure.cl new file mode 100644 index 000000000..a1e9fe227 --- /dev/null +++ b/OpenCL/m32100-pure.cl @@ -0,0 +1,1038 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha1.cl) +#include M2S(INCLUDE_PATH/inc_cipher_aes.cl) +#endif + +typedef struct krb5asrep_17 +{ + u32 user[128]; + u32 domain[128]; + u32 account_info[512]; + u32 account_info_len; + + u32 checksum[3]; + u32 edata2[5120]; + u32 edata2_len; + u32 format; + +} krb5asrep_17_t; + +typedef struct krb5asrep_17_tmp +{ + u32 ipad[5]; + u32 opad[5]; + u32 dgst[10]; + u32 out[10]; + +} krb5asrep_17_tmp_t; + +DECLSPEC void aes128_encrypt_cbc (PRIVATE_AS const u32 *aes_ks, PRIVATE_AS u32 *aes_iv, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) +{ + u32 data[4]; + + data[0] = hc_swap32_S (in[0]); + data[1] = hc_swap32_S (in[1]); + data[2] = hc_swap32_S (in[2]); + data[3] = hc_swap32_S (in[3]); + + data[0] ^= aes_iv[0]; + data[1] ^= aes_iv[1]; + data[2] ^= aes_iv[2]; + data[3] ^= aes_iv[3]; + + aes128_encrypt (aes_ks, data, out, s_te0, s_te1, s_te2, s_te3, s_te4); + + aes_iv[0] = out[0]; + aes_iv[1] = out[1]; + aes_iv[2] = out[2]; + aes_iv[3] = out[3]; + + out[0] = hc_swap32_S (out[0]); + out[1] = hc_swap32_S (out[1]); + out[2] = hc_swap32_S (out[2]); + out[3] = hc_swap32_S (out[3]); +} + +DECLSPEC void aes128_decrypt_cbc (PRIVATE_AS const u32 *ks1, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, PRIVATE_AS u32 *essiv, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) +{ + aes128_decrypt (ks1, in, out, s_td0, s_td1, s_td2, s_td3, s_td4); + + out[0] ^= essiv[0]; + out[1] ^= essiv[1]; + out[2] ^= essiv[2]; + out[3] ^= essiv[3]; + + essiv[0] = in[0]; + essiv[1] = in[1]; + essiv[2] = in[2]; + essiv[3] = in[3]; +} + +DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS u32x *w2, PRIVATE_AS u32x *w3, PRIVATE_AS u32x *ipad, PRIVATE_AS u32x *opad, PRIVATE_AS u32x *digest) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform_vector (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform_vector (w0, w1, w2, w3, digest); +} + +KERNEL_FQ void m32100_init (KERN_ATTR_TMPS_ESALT (krb5asrep_17_tmp_t, krb5asrep_17_t)) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + /** + * main + */ + + /* initialize hmac-sha1 for pbkdf2(password, account, 4096, account_len) */ + + sha1_hmac_ctx_t sha1_hmac_ctx; + + sha1_hmac_init_global_swap (&sha1_hmac_ctx, pws[gid].i, pws[gid].pw_len); + + tmps[gid].ipad[0] = sha1_hmac_ctx.ipad.h[0]; + tmps[gid].ipad[1] = sha1_hmac_ctx.ipad.h[1]; + tmps[gid].ipad[2] = sha1_hmac_ctx.ipad.h[2]; + tmps[gid].ipad[3] = sha1_hmac_ctx.ipad.h[3]; + tmps[gid].ipad[4] = sha1_hmac_ctx.ipad.h[4]; + + tmps[gid].opad[0] = sha1_hmac_ctx.opad.h[0]; + tmps[gid].opad[1] = sha1_hmac_ctx.opad.h[1]; + tmps[gid].opad[2] = sha1_hmac_ctx.opad.h[2]; + tmps[gid].opad[3] = sha1_hmac_ctx.opad.h[3]; + tmps[gid].opad[4] = sha1_hmac_ctx.opad.h[4]; + + sha1_hmac_update_global_swap (&sha1_hmac_ctx, esalt_bufs[DIGESTS_OFFSET_HOST].account_info, esalt_bufs[DIGESTS_OFFSET_HOST].account_info_len); + + for (u32 i = 0, j = 1; i < 4; i += 5, j += 1) + { + sha1_hmac_ctx_t sha1_hmac_ctx2 = sha1_hmac_ctx; + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + w0[0] = j; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + sha1_hmac_update_64 (&sha1_hmac_ctx2, w0, w1, w2, w3, 4); + + sha1_hmac_final (&sha1_hmac_ctx2); + + tmps[gid].dgst[i + 0] = sha1_hmac_ctx2.opad.h[0]; + tmps[gid].dgst[i + 1] = sha1_hmac_ctx2.opad.h[1]; + tmps[gid].dgst[i + 2] = sha1_hmac_ctx2.opad.h[2]; + tmps[gid].dgst[i + 3] = sha1_hmac_ctx2.opad.h[3]; + tmps[gid].dgst[i + 4] = sha1_hmac_ctx2.opad.h[4]; + + tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; + tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; + tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; + tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; + tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; + } +} + +KERNEL_FQ void m32100_loop (KERN_ATTR_TMPS_ESALT (krb5asrep_17_tmp_t, krb5asrep_17_t)) +{ + /** + * base + */ + const u64 gid = get_global_id (0); + + if ((gid * VECT_SIZE) >= GID_CNT) return; + + u32x ipad[5]; + u32x opad[5]; + + ipad[0] = packv (tmps, ipad, gid, 0); + ipad[1] = packv (tmps, ipad, gid, 1); + ipad[2] = packv (tmps, ipad, gid, 2); + ipad[3] = packv (tmps, ipad, gid, 3); + ipad[4] = packv (tmps, ipad, gid, 4); + + opad[0] = packv (tmps, opad, gid, 0); + opad[1] = packv (tmps, opad, gid, 1); + opad[2] = packv (tmps, opad, gid, 2); + opad[3] = packv (tmps, opad, gid, 3); + opad[4] = packv (tmps, opad, gid, 4); + + for (u32 i = 0; i < 4; i += 5) + { + u32x dgst[5]; + u32x out[5]; + + dgst[0] = packv (tmps, dgst, gid, i + 0); + dgst[1] = packv (tmps, dgst, gid, i + 1); + dgst[2] = packv (tmps, dgst, gid, i + 2); + dgst[3] = packv (tmps, dgst, gid, i + 3); + dgst[4] = packv (tmps, dgst, gid, i + 4); + + out[0] = packv (tmps, out, gid, i + 0); + out[1] = packv (tmps, out, gid, i + 1); + out[2] = packv (tmps, out, gid, i + 2); + out[3] = packv (tmps, out, gid, i + 3); + out[4] = packv (tmps, out, gid, i + 4); + + for (u32 j = 0; j < LOOP_CNT; j++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + hmac_sha1_run_V (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + } + + unpackv (tmps, dgst, gid, i + 0, dgst[0]); + unpackv (tmps, dgst, gid, i + 1, dgst[1]); + unpackv (tmps, dgst, gid, i + 2, dgst[2]); + unpackv (tmps, dgst, gid, i + 3, dgst[3]); + unpackv (tmps, dgst, gid, i + 4, dgst[4]); + + unpackv (tmps, out, gid, i + 0, out[0]); + unpackv (tmps, out, gid, i + 1, out[1]); + unpackv (tmps, out, gid, i + 2, out[2]); + unpackv (tmps, out, gid, i + 3, out[3]); + unpackv (tmps, out, gid, i + 4, out[4]); + } +} + +KERNEL_FQ void m32100_comp (KERN_ATTR_TMPS_ESALT (krb5asrep_17_tmp_t, krb5asrep_17_t)) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * aes shared + */ + + #ifdef REAL_SHM + + LOCAL_VK u32 s_te0[256]; + LOCAL_VK u32 s_te1[256]; + LOCAL_VK u32 s_te2[256]; + LOCAL_VK u32 s_te3[256]; + LOCAL_VK u32 s_te4[256]; + + LOCAL_VK u32 s_td0[256]; + LOCAL_VK u32 s_td1[256]; + LOCAL_VK u32 s_td2[256]; + LOCAL_VK u32 s_td3[256]; + LOCAL_VK u32 s_td4[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + s_te0[i] = te0[i]; + s_te1[i] = te1[i]; + s_te2[i] = te2[i]; + s_te3[i] = te3[i]; + s_te4[i] = te4[i]; + + s_td0[i] = td0[i]; + s_td1[i] = td1[i]; + s_td2[i] = td2[i]; + s_td3[i] = td3[i]; + s_td4[i] = td4[i]; + } + + SYNC_THREADS (); + + #else + + CONSTANT_AS u32a *s_te0 = te0; + CONSTANT_AS u32a *s_te1 = te1; + CONSTANT_AS u32a *s_te2 = te2; + CONSTANT_AS u32a *s_te3 = te3; + CONSTANT_AS u32a *s_te4 = te4; + + CONSTANT_AS u32a *s_td0 = td0; + CONSTANT_AS u32a *s_td1 = td1; + CONSTANT_AS u32a *s_td2 = td2; + CONSTANT_AS u32a *s_td3 = td3; + CONSTANT_AS u32a *s_td4 = td4; + + #endif + + if (gid >= GID_CNT) return; + + /* + at this point, the output ('seed') will be used to generate AES keys: + + key_bytes = derive(seed, 'kerberos'.encode(), seedsize) + + 'key_bytes' will be the AES key used to generate 'ke' and 'ki' + 'ke' will be the AES key to decrypt the ticket + 'ki' will be the key to compute the final HMAC + */ + + u32 nfolded[4]; + + // we can precompute _nfold('kerberos', 16) + nfolded[0] = 0x6b657262; + nfolded[1] = 0x65726f73; + nfolded[2] = 0x7b9b5b2b; + nfolded[3] = 0x93132b93; + + // then aes_cbc encrypt this nfolded value with 'seed' as key along with a null IV + u32 aes_key[4]; + + aes_key[0] = hc_swap32_S (tmps[gid].out[0]); + aes_key[1] = hc_swap32_S (tmps[gid].out[1]); + aes_key[2] = hc_swap32_S (tmps[gid].out[2]); + aes_key[3] = hc_swap32_S (tmps[gid].out[3]); + + u32 aes_iv[4]; + + aes_iv[0] = 0; + aes_iv[1] = 0; + aes_iv[2] = 0; + aes_iv[3] = 0; + + u32 aes_ks[44]; + + aes128_set_encrypt_key (aes_ks, aes_key, s_te0, s_te1, s_te2, s_te3); + + u32 key_bytes[4]; + + aes128_encrypt_cbc (aes_ks, aes_iv, nfolded, key_bytes, s_te0, s_te1, s_te2, s_te3, s_te4); + + /* + We will now compute 'ki', having 'key_bytes' + + Description of the key derivation function from RFC3961 Section 5.3: + The "well-known constant" used for the DK function is the key usage + number, expressed as four octets in big-endian order, followed by + one octet indicated below. + Kc = DK(base-key, usage | 0x99); + Ke = DK(base-key, usage | 0xAA); + Ki = DK(base-key, usage | 0x55); + + The key usage numbers are defined in RFC4120. In Section 5.4.2, it + specifies that a key usage number of 3 is used for the EncASRepPart + of an AS-REP message. + */ + + u32 ki[4]; + + key_bytes[0] = hc_swap32_S (key_bytes[0]); + key_bytes[1] = hc_swap32_S (key_bytes[1]); + key_bytes[2] = hc_swap32_S (key_bytes[2]); + key_bytes[3] = hc_swap32_S (key_bytes[3]); + + // we can precompute _nfold(pack('>IB', 3, 0x55), 16) + nfolded[0] = 0x6b60b058; + nfolded[1] = 0x2a6ba80d; + nfolded[2] = 0x5aad56ab; + nfolded[3] = 0x55406ad5; + + aes_iv[0] = 0; + aes_iv[1] = 0; + aes_iv[2] = 0; + aes_iv[3] = 0; + + // then aes_cbc encrypt this nfolded value with 'key_bytes' as key along with a null IV + aes128_set_encrypt_key (aes_ks, key_bytes, s_te0, s_te1, s_te2, s_te3); + + aes128_encrypt_cbc (aes_ks, aes_iv, nfolded, ki, s_te0, s_te1, s_te2, s_te3, s_te4); + + /* we will now compute 'ke' */ + + u32 ke[4]; + + // we can precompute _nfold(pack('>IB', 3, 0xAA), 16) + nfolded[0] = 0xbe349a4d; + nfolded[1] = 0x24be500e; + nfolded[2] = 0xaf57abd5; + nfolded[3] = 0xea80757a; + + aes_iv[0] = 0; + aes_iv[1] = 0; + aes_iv[2] = 0; + aes_iv[3] = 0; + + // then aes_cbc encrypt this nfolded value with 'key_bytes' as key along with a null IV + aes128_encrypt_cbc (aes_ks, aes_iv, nfolded, ke, s_te0, s_te1, s_te2, s_te3, s_te4); + + /* + We now have 'ke' and 'ki' + + We will decrypt (with 'ke') the 32 first bytes to search for ASN.1 structs + and if we find ASN.1 structs, we will compute the hmac (with 'ki') + + For AS-REP EncASRepPart: + The first byte is 0x79 (01 1 11001, where 01 = "class=APPLICATION", 1 = "form=constructed", 11001 is application type 25) + + According to RFC4120 Section 5.4.2: "Some implementations unconditionally send an encrypted EncTGSRepPart (application + tag number 26) in this field regardless of whether the reply is a AS-REP or a TGS-REP. In the interest of compatibility, + implementors MAY relax the check on the tag number of the decrypted ENC-PART" + + The first byte can thus also be 0x7a (corresponding to application type 26) instead of 0x79 + + The next byte is the length: + + if length < 128 bytes: + length is on 1 byte, and the next byte is 0x30 (class=SEQUENCE) + else if length <= 256: + length is on 2 bytes, the first byte is 0x81, and the third byte is 0x30 (class=SEQUENCE) + else if length > 256: + length is on 3 bytes, the first byte is 0x82, and the fourth byte is 0x30 (class=SEQUENCE) + */ + + u32 first_blocks[16]; + + u32 decrypted_block[4]; + + first_blocks[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[0]; + first_blocks[1] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[1]; + first_blocks[2] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[2]; + first_blocks[3] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[3]; + + first_blocks[4] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[4]; // possible ASN1 structs + first_blocks[5] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[5]; + first_blocks[6] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[6]; // possible ASN1 structs + first_blocks[7] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[7]; + + /* + we will decrypt them here in order to be able to compute hmac directly + if ASN1 structs were to be found + */ + first_blocks[8] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[8]; + first_blocks[9] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[9]; + first_blocks[10] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[10]; + first_blocks[11] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[11]; + + first_blocks[12] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[12]; + first_blocks[13] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[13]; + first_blocks[14] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[14]; + first_blocks[15] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[15]; + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + u32 aes_cts_decrypt_ks[44]; + + AES128_set_decrypt_key (aes_cts_decrypt_ks, ke, s_te0, s_te1, s_te2, s_te3, s_td0, s_td1, s_td2, s_td3); + + aes_iv[0] = 0; + aes_iv[1] = 0; + aes_iv[2] = 0; + aes_iv[3] = 0; + + aes128_decrypt_cbc (aes_cts_decrypt_ks, first_blocks, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w0[0] = hc_swap32_S (decrypted_block[0]); + w0[1] = hc_swap32_S (decrypted_block[1]); + w0[2] = hc_swap32_S (decrypted_block[2]); + w0[3] = hc_swap32_S (decrypted_block[3]); + + aes128_decrypt_cbc (aes_cts_decrypt_ks, first_blocks + 4, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w1[0] = hc_swap32_S (decrypted_block[0]); + w1[1] = hc_swap32_S (decrypted_block[1]); + w1[2] = hc_swap32_S (decrypted_block[2]); + w1[3] = hc_swap32_S (decrypted_block[3]); + + if (((decrypted_block[0] & 0x00ff80ff) == 0x00300079) || + ((decrypted_block[0] & 0x00ff80ff) == 0x0030007a) || + ((decrypted_block[0] & 0xFF00FFFF) == 0x30008179) || + ((decrypted_block[0] & 0xFF00FFFF) == 0x3000817a) || + ((decrypted_block[0] & 0x0000FFFF) == 0x00008279 && (decrypted_block[1] & 0x000000FF) == 0x00000030) || + ((decrypted_block[0] & 0x0000FFFF) == 0x0000827a && (decrypted_block[1] & 0x000000FF) == 0x00000030)) + { + // now we decrypt all the ticket to verify checksum + int block_position; + + int edata2_len = esalt_bufs[DIGESTS_OFFSET_HOST].edata2_len; + + int edata2_left; + + u32 block[16]; + + int last_block_size = edata2_len % 16; + + if (last_block_size == 0) + { + last_block_size = 16; + } + + int last_part = last_block_size + 16; + + int need = edata2_len - last_part; + + int last_block_cbc_position = (need - 16) / 4; + + // we need to decrypt also the 2 following blocks in order to be able to compute the hmac directly + aes128_decrypt_cbc (aes_cts_decrypt_ks, first_blocks + 8, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w2[0] = hc_swap32_S (decrypted_block[0]); + w2[1] = hc_swap32_S (decrypted_block[1]); + w2[2] = hc_swap32_S (decrypted_block[2]); + w2[3] = hc_swap32_S (decrypted_block[3]); + + aes128_decrypt_cbc (aes_cts_decrypt_ks, first_blocks + 12, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w3[0] = hc_swap32_S (decrypted_block[0]); + w3[1] = hc_swap32_S (decrypted_block[1]); + w3[2] = hc_swap32_S (decrypted_block[2]); + w3[3] = hc_swap32_S (decrypted_block[3]); + + sha1_hmac_ctx_t sha1_hmac_ctx; + + /* + hmac message = plaintext + hmac key = ki + */ + + u32 k0[4]; + u32 k1[4]; + u32 k2[4]; + u32 k3[4]; + + k0[0] = ki[0]; + k0[1] = ki[1]; + k0[2] = ki[2]; + k0[3] = ki[3]; + + k1[0] = 0; + k1[1] = 0; + k1[2] = 0; + k1[3] = 0; + + k2[0] = 0; + k2[1] = 0; + k2[2] = 0; + k2[3] = 0; + + k3[0] = 0; + k3[1] = 0; + k3[2] = 0; + k3[3] = 0; + + sha1_hmac_init_64 (&sha1_hmac_ctx, k0, k1, k2, k3); + + sha1_hmac_update_64 (&sha1_hmac_ctx, w0, w1, w2, w3, 64); + + block_position = 16; + + // first 4 blocks are already decrypted + for (edata2_left = need - 64; edata2_left >= 64; edata2_left -= 64) + { + block[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 0]; + block[1] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 1]; + block[2] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 2]; + block[3] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 3]; + block[4] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 4]; + block[5] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 5]; + block[6] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 6]; + block[7] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 7]; + block[8] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 8]; + block[9] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 9]; + block[10] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 10]; + block[11] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 11]; + block[12] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 12]; + block[13] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 13]; + block[14] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 14]; + block[15] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 15]; + + aes128_decrypt_cbc (aes_cts_decrypt_ks, block, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w0[0] = hc_swap32_S (decrypted_block[0]); + w0[1] = hc_swap32_S (decrypted_block[1]); + w0[2] = hc_swap32_S (decrypted_block[2]); + w0[3] = hc_swap32_S (decrypted_block[3]); + + aes128_decrypt_cbc (aes_cts_decrypt_ks, block + 4, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w1[0] = hc_swap32_S (decrypted_block[0]); + w1[1] = hc_swap32_S (decrypted_block[1]); + w1[2] = hc_swap32_S (decrypted_block[2]); + w1[3] = hc_swap32_S (decrypted_block[3]); + + aes128_decrypt_cbc (aes_cts_decrypt_ks, block + 8, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w2[0] = hc_swap32_S (decrypted_block[0]); + w2[1] = hc_swap32_S (decrypted_block[1]); + w2[2] = hc_swap32_S (decrypted_block[2]); + w2[3] = hc_swap32_S (decrypted_block[3]); + + aes128_decrypt_cbc (aes_cts_decrypt_ks, block + 12, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w3[0] = hc_swap32_S (decrypted_block[0]); + w3[1] = hc_swap32_S (decrypted_block[1]); + w3[2] = hc_swap32_S (decrypted_block[2]); + w3[3] = hc_swap32_S (decrypted_block[3]); + + sha1_hmac_update_64 (&sha1_hmac_ctx, w0, w1, w2, w3, 64); + + block_position += 16; + } + + if (edata2_left == 16) + { + block[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 0]; + block[1] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 1]; + block[2] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 2]; + block[3] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 3]; + + aes128_decrypt_cbc (aes_cts_decrypt_ks, block, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w0[0] = hc_swap32_S (decrypted_block[0]); + w0[1] = hc_swap32_S (decrypted_block[1]); + w0[2] = hc_swap32_S (decrypted_block[2]); + w0[3] = hc_swap32_S (decrypted_block[3]); + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + sha1_hmac_update_64 (&sha1_hmac_ctx, w0, w1, w2, w3, 16); + + block_position += 4; + } + else if (edata2_left == 32) + { + block[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 0]; + block[1] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 1]; + block[2] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 2]; + block[3] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 3]; + block[4] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 4]; + block[5] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 5]; + block[6] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 6]; + block[7] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 7]; + + aes128_decrypt_cbc (aes_cts_decrypt_ks, block, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w0[0] = hc_swap32_S (decrypted_block[0]); + w0[1] = hc_swap32_S (decrypted_block[1]); + w0[2] = hc_swap32_S (decrypted_block[2]); + w0[3] = hc_swap32_S (decrypted_block[3]); + + aes128_decrypt_cbc (aes_cts_decrypt_ks, block + 4, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w1[0] = hc_swap32_S (decrypted_block[0]); + w1[1] = hc_swap32_S (decrypted_block[1]); + w1[2] = hc_swap32_S (decrypted_block[2]); + w1[3] = hc_swap32_S (decrypted_block[3]); + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + sha1_hmac_update_64 (&sha1_hmac_ctx, w0, w1, w2, w3, 32); + + block_position += 8; + } + else if (edata2_left == 48) + { + block[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 0]; + block[1] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 1]; + block[2] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 2]; + block[3] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 3]; + block[4] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 4]; + block[5] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 5]; + block[6] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 6]; + block[7] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 7]; + block[8] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 8]; + block[9] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 9]; + block[10] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 10]; + block[11] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 11]; + + aes128_decrypt_cbc (aes_cts_decrypt_ks, block, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w0[0] = hc_swap32_S (decrypted_block[0]); + w0[1] = hc_swap32_S (decrypted_block[1]); + w0[2] = hc_swap32_S (decrypted_block[2]); + w0[3] = hc_swap32_S (decrypted_block[3]); + + aes128_decrypt_cbc (aes_cts_decrypt_ks, block + 4, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w1[0] = hc_swap32_S (decrypted_block[0]); + w1[1] = hc_swap32_S (decrypted_block[1]); + w1[2] = hc_swap32_S (decrypted_block[2]); + w1[3] = hc_swap32_S (decrypted_block[3]); + + aes128_decrypt_cbc (aes_cts_decrypt_ks, block + 8, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w2[0] = hc_swap32_S (decrypted_block[0]); + w2[1] = hc_swap32_S (decrypted_block[1]); + w2[2] = hc_swap32_S (decrypted_block[2]); + w2[3] = hc_swap32_S (decrypted_block[3]); + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + sha1_hmac_update_64 (&sha1_hmac_ctx, w0, w1, w2, w3, 48); + + block_position += 12; + } + + /* + now all the ticket should be decrypted until block n-1 (not included) + and n + */ + + // this is block n-2, it will be xored with the n-1 block later crafted + u32 last_block_cbc[4]; + + last_block_cbc[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_cbc_position + 0]; + last_block_cbc[1] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_cbc_position + 1]; + last_block_cbc[2] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_cbc_position + 2]; + last_block_cbc[3] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_cbc_position + 3]; + + // n-1 block is decrypted separately from the previous blocks which were cbc decrypted + block[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 0]; + block[1] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 1]; + block[2] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 2]; + block[3] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 3]; + + aes128_decrypt (aes_cts_decrypt_ks, block, decrypted_block, s_td0, s_td1, s_td2, s_td3, s_td4); + + u32 last_block[4]; + + int last_block_position = (edata2_len - last_block_size) / 4; + + u32 n_1_crafted[4]; + + u32 last_plaintext[4]; + + last_plaintext[0] = 0; + last_plaintext[1] = 0; + last_plaintext[2] = 0; + last_plaintext[3] = 0; + + /* + n-1 block is first computed as follows: + - fill n-1 block with the X first bytes of the encrypted last block (n) + with X == length of last block + - complete the rest of the block with + + Final block (n) is computed as follows: + - fill with the X first bytes from n-1 block decrypted and xor them with last block (n) + with X == length of last block + */ + int remaining_blocks = last_block_size / 4; + + /* + last block is not necessarily aligned on 4 bytes so we will have + to shift values for the CTS crap... + */ + u32 shift = last_block_size % 4; + + u32 mask; + + switch (remaining_blocks) + { + case 0: + + last_block[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 0]; + + mask = (0xffffffff >> ((4 - last_block_size) * 8)); + + last_plaintext[0] = last_block[0] ^ (decrypted_block[0] & mask); + last_plaintext[0] = hc_swap32_S (last_plaintext[0]); + + n_1_crafted[0] = (last_block[0] & mask) | (decrypted_block[0] & (mask ^ 0xffffffff)); + n_1_crafted[1] = decrypted_block[1]; + n_1_crafted[2] = decrypted_block[2]; + n_1_crafted[3] = decrypted_block[3]; + break; + + case 1: + + last_block[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 0]; + + if (shift == 0) + { + n_1_crafted[0] = last_block[0]; + n_1_crafted[1] = decrypted_block[1]; + n_1_crafted[2] = decrypted_block[2]; + n_1_crafted[3] = decrypted_block[3]; + + last_plaintext[0] = last_block[0] ^ decrypted_block[0]; + last_plaintext[0] = hc_swap32_S (last_plaintext[0]); + } + else + { + last_block[1] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 1]; + + mask = (0xffffffff >> ((4 - (last_block_size % 4)) * 8)); + + last_plaintext[0] = last_block[0] ^ decrypted_block[0]; + last_plaintext[1] = last_block[1] ^ (decrypted_block[1] & mask); + + last_plaintext[0] = hc_swap32_S (last_plaintext[0]); + last_plaintext[1] = hc_swap32_S (last_plaintext[1]); + + n_1_crafted[0] = last_block[0]; + n_1_crafted[1] = (last_block[1] & mask) | (decrypted_block[1] & (mask ^ 0xffffffff)); + n_1_crafted[2] = decrypted_block[2]; + n_1_crafted[3] = decrypted_block[3]; + } + break; + + case 2: + + last_block[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 0]; + last_block[1] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 1]; + + if (shift == 0) + { + n_1_crafted[0] = last_block[0]; + n_1_crafted[1] = last_block[1]; + n_1_crafted[2] = decrypted_block[2]; + n_1_crafted[3] = decrypted_block[3]; + + last_plaintext[0] = last_block[0] ^ decrypted_block[0]; + last_plaintext[1] = last_block[1] ^ decrypted_block[1]; + + last_plaintext[0] = hc_swap32_S (last_plaintext[0]); + last_plaintext[1] = hc_swap32_S (last_plaintext[1]); + } + else + { + last_block[2] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 2]; + + mask = (0xffffffff >> ((4 - (last_block_size % 4)) * 8)); + + last_plaintext[0] = last_block[0] ^ decrypted_block[0]; + last_plaintext[1] = last_block[1] ^ decrypted_block[1]; + last_plaintext[2] = last_block[2] ^ (decrypted_block[2] & mask); + + last_plaintext[0] = hc_swap32_S (last_plaintext[0]); + last_plaintext[1] = hc_swap32_S (last_plaintext[1]); + last_plaintext[2] = hc_swap32_S (last_plaintext[2]); + + n_1_crafted[0] = last_block[0]; + n_1_crafted[1] = last_block[1]; + n_1_crafted[2] = (last_block[2] & mask) | (decrypted_block[2] & (mask ^ 0xffffffff)); + n_1_crafted[3] = decrypted_block[3]; + } + break; + + case 3: + + last_block[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 0]; + last_block[1] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 1]; + last_block[2] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 2]; + + if (shift == 0) + { + n_1_crafted[0] = last_block[0]; + n_1_crafted[1] = last_block[1]; + n_1_crafted[2] = last_block[2]; + n_1_crafted[3] = decrypted_block[3]; + + last_plaintext[0] = last_block[0] ^ decrypted_block[0]; + last_plaintext[1] = last_block[1] ^ decrypted_block[1]; + last_plaintext[2] = last_block[2] ^ decrypted_block[2]; + + last_plaintext[0] = hc_swap32_S (last_plaintext[0]); + last_plaintext[1] = hc_swap32_S (last_plaintext[1]); + last_plaintext[2] = hc_swap32_S (last_plaintext[2]); + } + else + { + last_block[3] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 3]; + + mask = (0xffffffff >> ((4 - (last_block_size % 4)) * 8)); + + last_plaintext[0] = last_block[0] ^ decrypted_block[0]; + last_plaintext[1] = last_block[1] ^ decrypted_block[1]; + last_plaintext[2] = last_block[2] ^ decrypted_block[2]; + last_plaintext[3] = last_block[3] ^ (decrypted_block[3] & mask); + + last_plaintext[0] = hc_swap32_S (last_plaintext[0]); + last_plaintext[1] = hc_swap32_S (last_plaintext[1]); + last_plaintext[2] = hc_swap32_S (last_plaintext[2]); + last_plaintext[3] = hc_swap32_S (last_plaintext[3]); + + n_1_crafted[0] = last_block[0]; + n_1_crafted[1] = last_block[1]; + n_1_crafted[2] = last_block[2]; + n_1_crafted[3] = (last_block[3] & mask) | (decrypted_block[3] & (mask ^ 0xffffffff)); + } + break; + + case 4: + + last_block[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 0]; + last_block[1] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 1]; + last_block[2] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 2]; + last_block[3] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 3]; + + n_1_crafted[0] = last_block[0]; + n_1_crafted[1] = last_block[1]; + n_1_crafted[2] = last_block[2]; + n_1_crafted[3] = last_block[3]; + + last_plaintext[0] = last_block[0] ^ decrypted_block[0]; + last_plaintext[1] = last_block[1] ^ decrypted_block[1]; + last_plaintext[2] = last_block[2] ^ decrypted_block[2]; + last_plaintext[3] = last_block[3] ^ decrypted_block[3]; + + last_plaintext[0] = hc_swap32_S (last_plaintext[0]); + last_plaintext[1] = hc_swap32_S (last_plaintext[1]); + last_plaintext[2] = hc_swap32_S (last_plaintext[2]); + last_plaintext[3] = hc_swap32_S (last_plaintext[3]); + break; + + default: + return; + } + + // then decrypt this newly created n-1 with 'ke' + aes128_decrypt (aes_cts_decrypt_ks, n_1_crafted, n_1_crafted, s_td0, s_td1, s_td2, s_td3, s_td4); + + // then xor with the encrypted n-2 block + n_1_crafted[0] ^= last_block_cbc[0]; + n_1_crafted[1] ^= last_block_cbc[1]; + n_1_crafted[2] ^= last_block_cbc[2]; + n_1_crafted[3] ^= last_block_cbc[3]; + + w0[0] = hc_swap32_S (n_1_crafted[0]); + w0[1] = hc_swap32_S (n_1_crafted[1]); + w0[2] = hc_swap32_S (n_1_crafted[2]); + w0[3] = hc_swap32_S (n_1_crafted[3]); + + w1[0] = last_plaintext[0]; + w1[1] = last_plaintext[1]; + w1[2] = last_plaintext[2]; + w1[3] = last_plaintext[3]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + sha1_hmac_update_64 (&sha1_hmac_ctx, w0, w1, w2, w3, 16 + last_block_size); + + sha1_hmac_final (&sha1_hmac_ctx); + + if (sha1_hmac_ctx.opad.h[0] == esalt_bufs[DIGESTS_OFFSET_HOST].checksum[0] + && sha1_hmac_ctx.opad.h[1] == esalt_bufs[DIGESTS_OFFSET_HOST].checksum[1] + && sha1_hmac_ctx.opad.h[2] == esalt_bufs[DIGESTS_OFFSET_HOST].checksum[2]) + { + if (hc_atomic_inc (&hashes_shown[DIGESTS_OFFSET_HOST]) == 0) + { + #define il_pos 0 + mark_hash (plains_buf, d_return_buf, SALT_POS_HOST, DIGESTS_CNT, 0, DIGESTS_OFFSET_HOST + 0, gid, il_pos, 0, 0); + } + } + } +} diff --git a/OpenCL/m32200-pure.cl b/OpenCL/m32200-pure.cl new file mode 100644 index 000000000..9a9d999ae --- /dev/null +++ b/OpenCL/m32200-pure.cl @@ -0,0 +1,1101 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha1.cl) +#include M2S(INCLUDE_PATH/inc_cipher_aes.cl) +#endif + +typedef struct krb5asrep_18 +{ + u32 user[128]; + u32 domain[128]; + u32 account_info[512]; + u32 account_info_len; + + u32 checksum[3]; + u32 edata2[5120]; + u32 edata2_len; + u32 format; + +} krb5asrep_18_t; + +typedef struct krb5asrep_18_tmp +{ + u32 ipad[5]; + u32 opad[5]; + u32 dgst[16]; + u32 out[16]; + +} krb5asrep_18_tmp_t; + +DECLSPEC void aes256_encrypt_cbc (PRIVATE_AS const u32 *aes_ks, PRIVATE_AS u32 *aes_iv, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, SHM_TYPE u32 *s_te0, SHM_TYPE u32 *s_te1, SHM_TYPE u32 *s_te2, SHM_TYPE u32 *s_te3, SHM_TYPE u32 *s_te4) +{ + u32 data[4]; + + data[0] = hc_swap32_S (in[0]); + data[1] = hc_swap32_S (in[1]); + data[2] = hc_swap32_S (in[2]); + data[3] = hc_swap32_S (in[3]); + + data[0] ^= aes_iv[0]; + data[1] ^= aes_iv[1]; + data[2] ^= aes_iv[2]; + data[3] ^= aes_iv[3]; + + aes256_encrypt (aes_ks, data, out, s_te0, s_te1, s_te2, s_te3, s_te4); + + aes_iv[0] = out[0]; + aes_iv[1] = out[1]; + aes_iv[2] = out[2]; + aes_iv[3] = out[3]; + + out[0] = hc_swap32_S (out[0]); + out[1] = hc_swap32_S (out[1]); + out[2] = hc_swap32_S (out[2]); + out[3] = hc_swap32_S (out[3]); +} + +DECLSPEC void aes256_decrypt_cbc (PRIVATE_AS const u32 *ks1, PRIVATE_AS const u32 *in, PRIVATE_AS u32 *out, PRIVATE_AS u32 *essiv, SHM_TYPE u32 *s_td0, SHM_TYPE u32 *s_td1, SHM_TYPE u32 *s_td2, SHM_TYPE u32 *s_td3, SHM_TYPE u32 *s_td4) +{ + aes256_decrypt (ks1, in, out, s_td0, s_td1, s_td2, s_td3, s_td4); + + out[0] ^= essiv[0]; + out[1] ^= essiv[1]; + out[2] ^= essiv[2]; + out[3] ^= essiv[3]; + + essiv[0] = in[0]; + essiv[1] = in[1]; + essiv[2] = in[2]; + essiv[3] = in[3]; +} + +DECLSPEC void hmac_sha1_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS u32x *w2, PRIVATE_AS u32x *w3, PRIVATE_AS u32x *ipad, PRIVATE_AS u32x *opad, PRIVATE_AS u32x *digest) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform_vector (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform_vector (w0, w1, w2, w3, digest); +} + +KERNEL_FQ void m32200_init (KERN_ATTR_TMPS_ESALT (krb5asrep_18_tmp_t, krb5asrep_18_t)) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + /** + * main + */ + + /* initialize hmac-sha1 for pbkdf2(password, account, 4096, account_len) */ + + sha1_hmac_ctx_t sha1_hmac_ctx; + + sha1_hmac_init_global_swap (&sha1_hmac_ctx, pws[gid].i, pws[gid].pw_len); + + tmps[gid].ipad[0] = sha1_hmac_ctx.ipad.h[0]; + tmps[gid].ipad[1] = sha1_hmac_ctx.ipad.h[1]; + tmps[gid].ipad[2] = sha1_hmac_ctx.ipad.h[2]; + tmps[gid].ipad[3] = sha1_hmac_ctx.ipad.h[3]; + tmps[gid].ipad[4] = sha1_hmac_ctx.ipad.h[4]; + + tmps[gid].opad[0] = sha1_hmac_ctx.opad.h[0]; + tmps[gid].opad[1] = sha1_hmac_ctx.opad.h[1]; + tmps[gid].opad[2] = sha1_hmac_ctx.opad.h[2]; + tmps[gid].opad[3] = sha1_hmac_ctx.opad.h[3]; + tmps[gid].opad[4] = sha1_hmac_ctx.opad.h[4]; + + sha1_hmac_update_global_swap (&sha1_hmac_ctx, esalt_bufs[DIGESTS_OFFSET_HOST].account_info, esalt_bufs[DIGESTS_OFFSET_HOST].account_info_len); + + for (u32 i = 0, j = 1; i < 8; i += 5, j += 1) + { + sha1_hmac_ctx_t sha1_hmac_ctx2 = sha1_hmac_ctx; + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + w0[0] = j; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + sha1_hmac_update_64 (&sha1_hmac_ctx2, w0, w1, w2, w3, 4); + + sha1_hmac_final (&sha1_hmac_ctx2); + + tmps[gid].dgst[i + 0] = sha1_hmac_ctx2.opad.h[0]; + tmps[gid].dgst[i + 1] = sha1_hmac_ctx2.opad.h[1]; + tmps[gid].dgst[i + 2] = sha1_hmac_ctx2.opad.h[2]; + tmps[gid].dgst[i + 3] = sha1_hmac_ctx2.opad.h[3]; + tmps[gid].dgst[i + 4] = sha1_hmac_ctx2.opad.h[4]; + + tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; + tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; + tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; + tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; + tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; + } +} + +KERNEL_FQ void m32200_loop (KERN_ATTR_TMPS_ESALT (krb5asrep_18_tmp_t, krb5asrep_18_t)) +{ + /** + * base + */ + const u64 gid = get_global_id (0); + + if ((gid * VECT_SIZE) >= GID_CNT) return; + + u32x ipad[5]; + u32x opad[5]; + + ipad[0] = packv (tmps, ipad, gid, 0); + ipad[1] = packv (tmps, ipad, gid, 1); + ipad[2] = packv (tmps, ipad, gid, 2); + ipad[3] = packv (tmps, ipad, gid, 3); + ipad[4] = packv (tmps, ipad, gid, 4); + + opad[0] = packv (tmps, opad, gid, 0); + opad[1] = packv (tmps, opad, gid, 1); + opad[2] = packv (tmps, opad, gid, 2); + opad[3] = packv (tmps, opad, gid, 3); + opad[4] = packv (tmps, opad, gid, 4); + + for (u32 i = 0; i < 8; i += 5) + { + u32x dgst[5]; + u32x out[5]; + + dgst[0] = packv (tmps, dgst, gid, i + 0); + dgst[1] = packv (tmps, dgst, gid, i + 1); + dgst[2] = packv (tmps, dgst, gid, i + 2); + dgst[3] = packv (tmps, dgst, gid, i + 3); + dgst[4] = packv (tmps, dgst, gid, i + 4); + + out[0] = packv (tmps, out, gid, i + 0); + out[1] = packv (tmps, out, gid, i + 1); + out[2] = packv (tmps, out, gid, i + 2); + out[3] = packv (tmps, out, gid, i + 3); + out[4] = packv (tmps, out, gid, i + 4); + + for (u32 j = 0; j < LOOP_CNT; j++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + hmac_sha1_run_V (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + } + + unpackv (tmps, dgst, gid, i + 0, dgst[0]); + unpackv (tmps, dgst, gid, i + 1, dgst[1]); + unpackv (tmps, dgst, gid, i + 2, dgst[2]); + unpackv (tmps, dgst, gid, i + 3, dgst[3]); + unpackv (tmps, dgst, gid, i + 4, dgst[4]); + + unpackv (tmps, out, gid, i + 0, out[0]); + unpackv (tmps, out, gid, i + 1, out[1]); + unpackv (tmps, out, gid, i + 2, out[2]); + unpackv (tmps, out, gid, i + 3, out[3]); + unpackv (tmps, out, gid, i + 4, out[4]); + } +} + +KERNEL_FQ void m32200_comp (KERN_ATTR_TMPS_ESALT (krb5asrep_18_tmp_t, krb5asrep_18_t)) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * aes shared + */ + + #ifdef REAL_SHM + + LOCAL_VK u32 s_td0[256]; + LOCAL_VK u32 s_td1[256]; + LOCAL_VK u32 s_td2[256]; + LOCAL_VK u32 s_td3[256]; + LOCAL_VK u32 s_td4[256]; + + LOCAL_VK u32 s_te0[256]; + LOCAL_VK u32 s_te1[256]; + LOCAL_VK u32 s_te2[256]; + LOCAL_VK u32 s_te3[256]; + LOCAL_VK u32 s_te4[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + s_td0[i] = td0[i]; + s_td1[i] = td1[i]; + s_td2[i] = td2[i]; + s_td3[i] = td3[i]; + s_td4[i] = td4[i]; + + s_te0[i] = te0[i]; + s_te1[i] = te1[i]; + s_te2[i] = te2[i]; + s_te3[i] = te3[i]; + s_te4[i] = te4[i]; + } + + SYNC_THREADS (); + + #else + + CONSTANT_AS u32a *s_td0 = td0; + CONSTANT_AS u32a *s_td1 = td1; + CONSTANT_AS u32a *s_td2 = td2; + CONSTANT_AS u32a *s_td3 = td3; + CONSTANT_AS u32a *s_td4 = td4; + + CONSTANT_AS u32a *s_te0 = te0; + CONSTANT_AS u32a *s_te1 = te1; + CONSTANT_AS u32a *s_te2 = te2; + CONSTANT_AS u32a *s_te3 = te3; + CONSTANT_AS u32a *s_te4 = te4; + + #endif + + if (gid >= GID_CNT) return; + + /* + at this point, the output ('seed') will be used to generate AES keys: + + key_bytes = derive(seed, 'kerberos'.encode(), seedsize) + + 'key_bytes' will be the AES key used to generate 'ke' and 'ki' + 'ke' will be the AES key to decrypt the ticket + 'ki' will be the key to compute the final HMAC + */ + + u32 nfolded[4]; + + // we can precompute _nfold('kerberos', 16) + nfolded[0] = 0x6b657262; + nfolded[1] = 0x65726f73; + nfolded[2] = 0x7b9b5b2b; + nfolded[3] = 0x93132b93; + + // then aes_cbc encrypt this nfolded value with 'seed' as key along with a null IV + u32 aes_key[8]; + + aes_key[0] = hc_swap32_S (tmps[gid].out[0]); + aes_key[1] = hc_swap32_S (tmps[gid].out[1]); + aes_key[2] = hc_swap32_S (tmps[gid].out[2]); + aes_key[3] = hc_swap32_S (tmps[gid].out[3]); + aes_key[4] = hc_swap32_S (tmps[gid].out[4]); + aes_key[5] = hc_swap32_S (tmps[gid].out[5]); + aes_key[6] = hc_swap32_S (tmps[gid].out[6]); + aes_key[7] = hc_swap32_S (tmps[gid].out[7]); + + u32 aes_iv[4]; + + aes_iv[0] = 0; + aes_iv[1] = 0; + aes_iv[2] = 0; + aes_iv[3] = 0; + + u32 aes_ks[60]; + + aes256_set_encrypt_key (aes_ks, aes_key, s_te0, s_te1, s_te2, s_te3); + + u32 key_bytes[8]; + + u32 out[4]; + aes256_encrypt_cbc (aes_ks, aes_iv, nfolded, out, s_te0, s_te1, s_te2, s_te3, s_te4); + + key_bytes[0] = out[0]; + key_bytes[1] = out[1]; + key_bytes[2] = out[2]; + key_bytes[3] = out[3]; + + aes_iv[0] = 0; + aes_iv[1] = 0; + aes_iv[2] = 0; + aes_iv[3] = 0; + + aes256_encrypt_cbc (aes_ks, aes_iv, out, out, s_te0, s_te1, s_te2, s_te3, s_te4); + + key_bytes[4] = out[0]; + key_bytes[5] = out[1]; + key_bytes[6] = out[2]; + key_bytes[7] = out[3]; + + /* + We will now compute 'ki', having 'key_bytes' + + Description of the key derivation function from RFC3961 Section 5.3: + The "well-known constant" used for the DK function is the key usage + number, expressed as four octets in big-endian order, followed by + one octet indicated below. + Kc = DK(base-key, usage | 0x99); + Ke = DK(base-key, usage | 0xAA); + Ki = DK(base-key, usage | 0x55); + + The key usage numbers are defined in RFC4120. In Section 5.4.2, it + specifies that a key usage number of 3 is used for the EncASRepPart + of an AS-REP message. + */ + + u32 ki[8]; + + // we can precompute _nfold(pack('>IB', 3, 0x55), 16) + nfolded[0] = 0x6b60b058; + nfolded[1] = 0x2a6ba80d; + nfolded[2] = 0x5aad56ab; + nfolded[3] = 0x55406ad5; + + aes_iv[0] = 0; + aes_iv[1] = 0; + aes_iv[2] = 0; + aes_iv[3] = 0; + + key_bytes[0] = hc_swap32_S (key_bytes[0]); + key_bytes[1] = hc_swap32_S (key_bytes[1]); + key_bytes[2] = hc_swap32_S (key_bytes[2]); + key_bytes[3] = hc_swap32_S (key_bytes[3]); + key_bytes[4] = hc_swap32_S (key_bytes[4]); + key_bytes[5] = hc_swap32_S (key_bytes[5]); + key_bytes[6] = hc_swap32_S (key_bytes[6]); + key_bytes[7] = hc_swap32_S (key_bytes[7]); + + // then aes_cbc encrypt this nfolded value with 'key_bytes' as key along with a null IV + aes256_set_encrypt_key (aes_ks, key_bytes, s_te0, s_te1, s_te2, s_te3); + + aes256_encrypt_cbc (aes_ks, aes_iv, nfolded, out, s_te0, s_te1, s_te2, s_te3, s_te4); + + ki[0] = out[0]; + ki[1] = out[1]; + ki[2] = out[2]; + ki[3] = out[3]; + + aes_iv[0] = 0; + aes_iv[1] = 0; + aes_iv[2] = 0; + aes_iv[3] = 0; + + aes256_encrypt_cbc (aes_ks, aes_iv, out, out, s_te0, s_te1, s_te2, s_te3, s_te4); + + ki[4] = out[0]; + ki[5] = out[1]; + ki[6] = out[2]; + ki[7] = out[3]; + + /* we will now compute 'ke' */ + + u32 ke[8]; + + // we can precompute _nfold(pack('>IB', 3, 0xAA), 16) + nfolded[0] = 0xbe349a4d; + nfolded[1] = 0x24be500e; + nfolded[2] = 0xaf57abd5; + nfolded[3] = 0xea80757a; + + aes_iv[0] = 0; + aes_iv[1] = 0; + aes_iv[2] = 0; + aes_iv[3] = 0; + + // then aes_cbc encrypt this nfolded value with 'key_bytes' as key along with a null IV + aes256_encrypt_cbc (aes_ks, aes_iv, nfolded, out, s_te0, s_te1, s_te2, s_te3, s_te4); + + ke[0] = out[0]; + ke[1] = out[1]; + ke[2] = out[2]; + ke[3] = out[3]; + + aes_iv[0] = 0; + aes_iv[1] = 0; + aes_iv[2] = 0; + aes_iv[3] = 0; + + aes256_encrypt_cbc (aes_ks, aes_iv, out, out, s_te0, s_te1, s_te2, s_te3, s_te4); + + ke[4] = out[0]; + ke[5] = out[1]; + ke[6] = out[2]; + ke[7] = out[3]; + + /* + We now have 'ke' and 'ki' + + We will decrypt (with 'ke') the 32 first bytes to search for ASN.1 structs + and if we find ASN.1 structs, we will compute the hmac (with 'ki') + + For AS-REP EncASRepPart: + The first byte is 0x79 (01 1 11001, where 01 = "class=APPLICATION", 1 = "form=constructed", 11001 is application type 25) + + According to RFC4120 Section 5.4.2: "Some implementations unconditionally send an encrypted EncTGSRepPart (application + tag number 26) in this field regardless of whether the reply is a AS-REP or a TGS-REP. In the interest of compatibility, + implementors MAY relax the check on the tag number of the decrypted ENC-PART" + + The first byte can thus also be 0x7a (corresponding to application type 26) instead of 0x79 + + The next byte is the length: + + if length < 128 bytes: + length is on 1 byte, and the next byte is 0x30 (class=SEQUENCE) + else if length <= 256: + length is on 2 bytes, the first byte is 0x81, and the third byte is 0x30 (class=SEQUENCE) + else if length > 256: + length is on 3 bytes, the first byte is 0x82, and the fourth byte is 0x30 (class=SEQUENCE) + */ + + u32 first_blocks[16]; + + u32 decrypted_block[8]; + + first_blocks[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[0]; + first_blocks[1] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[1]; + first_blocks[2] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[2]; + first_blocks[3] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[3]; + + first_blocks[4] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[4]; // possible ASN1 structs + first_blocks[5] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[5]; + first_blocks[6] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[6]; // possible ASN1 structs + first_blocks[7] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[7]; + + /* + we will decrypt them here in order to be able to compute hmac directly + if ASN1 structs were to be found + */ + first_blocks[8] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[8]; + first_blocks[9] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[9]; + first_blocks[10] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[10]; + first_blocks[11] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[11]; + + first_blocks[12] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[12]; + first_blocks[13] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[13]; + first_blocks[14] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[14]; + first_blocks[15] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[15]; + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + u32 aes_cts_decrypt_ks[60]; + + AES256_set_decrypt_key (aes_cts_decrypt_ks, ke, s_te0, s_te1, s_te2, s_te3, s_td0, s_td1, s_td2, s_td3); + + aes_iv[0] = 0; + aes_iv[1] = 0; + aes_iv[2] = 0; + aes_iv[3] = 0; + + aes256_decrypt_cbc (aes_cts_decrypt_ks, first_blocks, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w0[0] = hc_swap32_S (decrypted_block[0]); + w0[1] = hc_swap32_S (decrypted_block[1]); + w0[2] = hc_swap32_S (decrypted_block[2]); + w0[3] = hc_swap32_S (decrypted_block[3]); + + aes256_decrypt_cbc (aes_cts_decrypt_ks, first_blocks + 4, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w1[0] = hc_swap32_S (decrypted_block[0]); + w1[1] = hc_swap32_S (decrypted_block[1]); + w1[2] = hc_swap32_S (decrypted_block[2]); + w1[3] = hc_swap32_S (decrypted_block[3]); + + if (((decrypted_block[0] & 0x00ff80ff) == 0x00300079) || + ((decrypted_block[0] & 0x00ff80ff) == 0x0030007a) || + ((decrypted_block[0] & 0xFF00FFFF) == 0x30008179) || + ((decrypted_block[0] & 0xFF00FFFF) == 0x3000817a) || + ((decrypted_block[0] & 0x0000FFFF) == 0x00008279 && (decrypted_block[1] & 0x000000FF) == 0x00000030) || + ((decrypted_block[0] & 0x0000FFFF) == 0x0000827a && (decrypted_block[1] & 0x000000FF) == 0x00000030)) + { + // now we decrypt all the ticket to verify checksum + + // we need to decrypt also the 2 following blocks in order to be able to compute the hmac directly + aes256_decrypt_cbc (aes_cts_decrypt_ks, first_blocks + 8, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w2[0] = hc_swap32_S (decrypted_block[0]); + w2[1] = hc_swap32_S (decrypted_block[1]); + w2[2] = hc_swap32_S (decrypted_block[2]); + w2[3] = hc_swap32_S (decrypted_block[3]); + + aes256_decrypt_cbc (aes_cts_decrypt_ks, first_blocks + 12, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w3[0] = hc_swap32_S (decrypted_block[0]); + w3[1] = hc_swap32_S (decrypted_block[1]); + w3[2] = hc_swap32_S (decrypted_block[2]); + w3[3] = hc_swap32_S (decrypted_block[3]); + + int block_position; + + int edata2_len = esalt_bufs[DIGESTS_OFFSET_HOST].edata2_len; + + int edata2_left; + + u32 block[16]; + + int last_block_size = edata2_len % 16; + + if (last_block_size == 0) + { + last_block_size = 16; + } + + int last_part = last_block_size + 16; + + int need = edata2_len - last_part; + + int last_block_cbc_position = (need - 16) / 4; + + sha1_hmac_ctx_t sha1_hmac_ctx; + + /* + hmac message = plaintext + hmac key = ki + */ + + u32 k0[4]; + u32 k1[4]; + u32 k2[4]; + u32 k3[4]; + + k0[0] = ki[0]; + k0[1] = ki[1]; + k0[2] = ki[2]; + k0[3] = ki[3]; + + k1[0] = ki[4]; + k1[1] = ki[5]; + k1[2] = ki[6]; + k1[3] = ki[7]; + + k2[0] = 0; + k2[1] = 0; + k2[2] = 0; + k2[3] = 0; + + k3[0] = 0; + k3[1] = 0; + k3[2] = 0; + k3[3] = 0; + + sha1_hmac_init_64 (&sha1_hmac_ctx, k0, k1, k2, k3); + + sha1_hmac_update_64 (&sha1_hmac_ctx, w0, w1, w2, w3, 64); + + block_position = 16; + + // first 4 blocks are already decrypted + for (edata2_left = need - 64; edata2_left >= 64; edata2_left -= 64) + { + block[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 0]; + block[1] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 1]; + block[2] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 2]; + block[3] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 3]; + block[4] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 4]; + block[5] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 5]; + block[6] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 6]; + block[7] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 7]; + block[8] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 8]; + block[9] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 9]; + block[10] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 10]; + block[11] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 11]; + block[12] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 12]; + block[13] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 13]; + block[14] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 14]; + block[15] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 15]; + + aes256_decrypt_cbc (aes_cts_decrypt_ks, block, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w0[0] = hc_swap32_S (decrypted_block[0]); + w0[1] = hc_swap32_S (decrypted_block[1]); + w0[2] = hc_swap32_S (decrypted_block[2]); + w0[3] = hc_swap32_S (decrypted_block[3]); + + aes256_decrypt_cbc (aes_cts_decrypt_ks, block + 4, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w1[0] = hc_swap32_S (decrypted_block[0]); + w1[1] = hc_swap32_S (decrypted_block[1]); + w1[2] = hc_swap32_S (decrypted_block[2]); + w1[3] = hc_swap32_S (decrypted_block[3]); + + aes256_decrypt_cbc (aes_cts_decrypt_ks, block + 8, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w2[0] = hc_swap32_S (decrypted_block[0]); + w2[1] = hc_swap32_S (decrypted_block[1]); + w2[2] = hc_swap32_S (decrypted_block[2]); + w2[3] = hc_swap32_S (decrypted_block[3]); + + aes256_decrypt_cbc (aes_cts_decrypt_ks, block + 12, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w3[0] = hc_swap32_S (decrypted_block[0]); + w3[1] = hc_swap32_S (decrypted_block[1]); + w3[2] = hc_swap32_S (decrypted_block[2]); + w3[3] = hc_swap32_S (decrypted_block[3]); + + sha1_hmac_update_64 (&sha1_hmac_ctx, w0, w1, w2, w3, 64); + + block_position += 16; + } + + if (edata2_left == 16) + { + + block[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 0]; + block[1] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 1]; + block[2] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 2]; + block[3] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 3]; + + aes256_decrypt_cbc (aes_cts_decrypt_ks, block, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w0[0] = hc_swap32_S (decrypted_block[0]); + w0[1] = hc_swap32_S (decrypted_block[1]); + w0[2] = hc_swap32_S (decrypted_block[2]); + w0[3] = hc_swap32_S (decrypted_block[3]); + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + sha1_hmac_update_64 (&sha1_hmac_ctx, w0, w1, w2, w3, 16); + + block_position += 4; + } + else if (edata2_left == 32) + { + block[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 0]; + block[1] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 1]; + block[2] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 2]; + block[3] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 3]; + block[4] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 4]; + block[5] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 5]; + block[6] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 6]; + block[7] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 7]; + + aes256_decrypt_cbc (aes_cts_decrypt_ks, block, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w0[0] = hc_swap32_S (decrypted_block[0]); + w0[1] = hc_swap32_S (decrypted_block[1]); + w0[2] = hc_swap32_S (decrypted_block[2]); + w0[3] = hc_swap32_S (decrypted_block[3]); + + aes256_decrypt_cbc (aes_cts_decrypt_ks, block + 4, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w1[0] = hc_swap32_S (decrypted_block[0]); + w1[1] = hc_swap32_S (decrypted_block[1]); + w1[2] = hc_swap32_S (decrypted_block[2]); + w1[3] = hc_swap32_S (decrypted_block[3]); + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + sha1_hmac_update_64 (&sha1_hmac_ctx, w0, w1, w2, w3, 32); + + block_position += 8; + } + else if (edata2_left == 48) + { + block[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 0]; + block[1] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 1]; + block[2] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 2]; + block[3] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 3]; + block[4] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 4]; + block[5] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 5]; + block[6] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 6]; + block[7] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 7]; + block[8] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 8]; + block[9] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 9]; + block[10] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 10]; + block[11] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 11]; + + aes256_decrypt_cbc (aes_cts_decrypt_ks, block, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w0[0] = hc_swap32_S (decrypted_block[0]); + w0[1] = hc_swap32_S (decrypted_block[1]); + w0[2] = hc_swap32_S (decrypted_block[2]); + w0[3] = hc_swap32_S (decrypted_block[3]); + + aes256_decrypt_cbc (aes_cts_decrypt_ks, block + 4, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w1[0] = hc_swap32_S (decrypted_block[0]); + w1[1] = hc_swap32_S (decrypted_block[1]); + w1[2] = hc_swap32_S (decrypted_block[2]); + w1[3] = hc_swap32_S (decrypted_block[3]); + + aes256_decrypt_cbc (aes_cts_decrypt_ks, block + 8, decrypted_block, aes_iv, s_td0, s_td1, s_td2, s_td3, s_td4); + + w2[0] = hc_swap32_S (decrypted_block[0]); + w2[1] = hc_swap32_S (decrypted_block[1]); + w2[2] = hc_swap32_S (decrypted_block[2]); + w2[3] = hc_swap32_S (decrypted_block[3]); + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + sha1_hmac_update_64 (&sha1_hmac_ctx, w0, w1, w2, w3, 48); + + block_position += 12; + } + + /* + now all the ticket should be decrypted until block n-1 (not included) + and n + */ + + // this is block n-2, it will be xored with the n-1 block later crafted + u32 last_block_cbc[4]; + + last_block_cbc[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_cbc_position + 0]; + last_block_cbc[1] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_cbc_position + 1]; + last_block_cbc[2] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_cbc_position + 2]; + last_block_cbc[3] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_cbc_position + 3]; + + // n-1 block is decrypted separately from the previous blocks which were cbc decrypted + block[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 0]; + block[1] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 1]; + block[2] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 2]; + block[3] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[block_position + 3]; + + aes256_decrypt (aes_cts_decrypt_ks, block, decrypted_block, s_td0, s_td1, s_td2, s_td3, s_td4); + + u32 last_block[4]; + + int last_block_position = (edata2_len - last_block_size) / 4; + + u32 n_1_crafted[4]; + + u32 last_plaintext[4]; + + last_plaintext[0] = 0; + last_plaintext[1] = 0; + last_plaintext[2] = 0; + last_plaintext[3] = 0; + + /* + n-1 block is first computed as follows: + - fill n-1 block with the X first bytes of the encrypted last block (n) + with X == length of last block + - complete the rest of the block with + + Final block (n) is computed as follows: + - fill with the X first bytes from n-1 block decrypted and xor them with last block (n) + with X == length of last block + */ + int remaining_blocks = last_block_size / 4; + + /* + last block is not necessarily aligned on 4 bytes so we will have + to shift values for the CTS crap... + */ + u32 shift = last_block_size % 4; + + u32 mask; + + switch (remaining_blocks) + { + case 0: + + last_block[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 0]; + + mask = (0xffffffff >> ((4 - last_block_size) * 8)); + + last_plaintext[0] = last_block[0] ^ (decrypted_block[0] & mask); + last_plaintext[0] = hc_swap32_S (last_plaintext[0]); + + n_1_crafted[0] = (last_block[0] & mask) | (decrypted_block[0] & (mask ^ 0xffffffff)); + n_1_crafted[1] = decrypted_block[1]; + n_1_crafted[2] = decrypted_block[2]; + n_1_crafted[3] = decrypted_block[3]; + break; + + case 1: + + last_block[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 0]; + + if (shift == 0) + { + n_1_crafted[0] = last_block[0]; + n_1_crafted[1] = decrypted_block[1]; + n_1_crafted[2] = decrypted_block[2]; + n_1_crafted[3] = decrypted_block[3]; + + last_plaintext[0] = last_block[0] ^ decrypted_block[0]; + last_plaintext[0] = hc_swap32_S (last_plaintext[0]); + } + else + { + last_block[1] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 1]; + + mask = (0xffffffff >> ((4 - (last_block_size % 4)) * 8)); + + last_plaintext[0] = last_block[0] ^ decrypted_block[0]; + last_plaintext[1] = last_block[1] ^ (decrypted_block[1] & mask); + + last_plaintext[0] = hc_swap32_S (last_plaintext[0]); + last_plaintext[1] = hc_swap32_S (last_plaintext[1]); + + n_1_crafted[0] = last_block[0]; + n_1_crafted[1] = (last_block[1] & mask) | (decrypted_block[1] & (mask ^ 0xffffffff)); + n_1_crafted[2] = decrypted_block[2]; + n_1_crafted[3] = decrypted_block[3]; + } + break; + + case 2: + + last_block[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 0]; + last_block[1] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 1]; + + if (shift == 0) + { + n_1_crafted[0] = last_block[0]; + n_1_crafted[1] = last_block[1]; + n_1_crafted[2] = decrypted_block[2]; + n_1_crafted[3] = decrypted_block[3]; + + last_plaintext[0] = last_block[0] ^ decrypted_block[0]; + last_plaintext[1] = last_block[1] ^ decrypted_block[1]; + + last_plaintext[0] = hc_swap32_S (last_plaintext[0]); + last_plaintext[1] = hc_swap32_S (last_plaintext[1]); + } + else + { + last_block[2] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 2]; + + mask = (0xffffffff >> ((4 - (last_block_size % 4)) * 8)); + + last_plaintext[0] = last_block[0] ^ decrypted_block[0]; + last_plaintext[1] = last_block[1] ^ decrypted_block[1]; + last_plaintext[2] = last_block[2] ^ (decrypted_block[2] & mask); + + last_plaintext[0] = hc_swap32_S (last_plaintext[0]); + last_plaintext[1] = hc_swap32_S (last_plaintext[1]); + last_plaintext[2] = hc_swap32_S (last_plaintext[2]); + + n_1_crafted[0] = last_block[0]; + n_1_crafted[1] = last_block[1]; + n_1_crafted[2] = (last_block[2] & mask) | (decrypted_block[2] & (mask ^ 0xffffffff)); + n_1_crafted[3] = decrypted_block[3]; + } + break; + + case 3: + + last_block[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 0]; + last_block[1] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 1]; + last_block[2] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 2]; + + if (shift == 0) + { + n_1_crafted[0] = last_block[0]; + n_1_crafted[1] = last_block[1]; + n_1_crafted[2] = last_block[2]; + n_1_crafted[3] = decrypted_block[3]; + + last_plaintext[0] = last_block[0] ^ decrypted_block[0]; + last_plaintext[1] = last_block[1] ^ decrypted_block[1]; + last_plaintext[2] = last_block[2] ^ decrypted_block[2]; + + last_plaintext[0] = hc_swap32_S (last_plaintext[0]); + last_plaintext[1] = hc_swap32_S (last_plaintext[1]); + last_plaintext[2] = hc_swap32_S (last_plaintext[2]); + } + else + { + last_block[3] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 3]; + + mask = (0xffffffff >> ((4 - (last_block_size % 4)) * 8)); + + last_plaintext[0] = last_block[0] ^ decrypted_block[0]; + last_plaintext[1] = last_block[1] ^ decrypted_block[1]; + last_plaintext[2] = last_block[2] ^ decrypted_block[2]; + last_plaintext[3] = last_block[3] ^ (decrypted_block[3] & mask); + + last_plaintext[0] = hc_swap32_S (last_plaintext[0]); + last_plaintext[1] = hc_swap32_S (last_plaintext[1]); + last_plaintext[2] = hc_swap32_S (last_plaintext[2]); + last_plaintext[3] = hc_swap32_S (last_plaintext[3]); + + n_1_crafted[0] = last_block[0]; + n_1_crafted[1] = last_block[1]; + n_1_crafted[2] = last_block[2]; + n_1_crafted[3] = (last_block[3] & mask) | (decrypted_block[3] & (mask ^ 0xffffffff)); + } + break; + + case 4: + + last_block[0] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 0]; + last_block[1] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 1]; + last_block[2] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 2]; + last_block[3] = esalt_bufs[DIGESTS_OFFSET_HOST].edata2[last_block_position + 3]; + + n_1_crafted[0] = last_block[0]; + n_1_crafted[1] = last_block[1]; + n_1_crafted[2] = last_block[2]; + n_1_crafted[3] = last_block[3]; + + last_plaintext[0] = last_block[0] ^ decrypted_block[0]; + last_plaintext[1] = last_block[1] ^ decrypted_block[1]; + last_plaintext[2] = last_block[2] ^ decrypted_block[2]; + last_plaintext[3] = last_block[3] ^ decrypted_block[3]; + + last_plaintext[0] = hc_swap32_S (last_plaintext[0]); + last_plaintext[1] = hc_swap32_S (last_plaintext[1]); + last_plaintext[2] = hc_swap32_S (last_plaintext[2]); + last_plaintext[3] = hc_swap32_S (last_plaintext[3]); + break; + + default: + return; + } + + + // then decrypt this newly created n-1 with 'ke' + aes256_decrypt (aes_cts_decrypt_ks, n_1_crafted, n_1_crafted, s_td0, s_td1, s_td2, s_td3, s_td4); + + // then xor with the encrypted n-2 block + n_1_crafted[0] ^= last_block_cbc[0]; + n_1_crafted[1] ^= last_block_cbc[1]; + n_1_crafted[2] ^= last_block_cbc[2]; + n_1_crafted[3] ^= last_block_cbc[3]; + + w0[0] = hc_swap32_S (n_1_crafted[0]); + w0[1] = hc_swap32_S (n_1_crafted[1]); + w0[2] = hc_swap32_S (n_1_crafted[2]); + w0[3] = hc_swap32_S (n_1_crafted[3]); + + w1[0] = last_plaintext[0]; + w1[1] = last_plaintext[1]; + w1[2] = last_plaintext[2]; + w1[3] = last_plaintext[3]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + sha1_hmac_update_64 (&sha1_hmac_ctx, w0, w1, w2, w3, 16 + last_block_size); + + sha1_hmac_final (&sha1_hmac_ctx); + + if (sha1_hmac_ctx.opad.h[0] == esalt_bufs[DIGESTS_OFFSET_HOST].checksum[0] + && sha1_hmac_ctx.opad.h[1] == esalt_bufs[DIGESTS_OFFSET_HOST].checksum[1] + && sha1_hmac_ctx.opad.h[2] == esalt_bufs[DIGESTS_OFFSET_HOST].checksum[2]) + { + if (hc_atomic_inc (&hashes_shown[DIGESTS_OFFSET_HOST]) == 0) + { + #define il_pos 0 + mark_hash (plains_buf, d_return_buf, SALT_POS_HOST, DIGESTS_CNT, 0, DIGESTS_OFFSET_HOST + 0, gid, il_pos, 0, 0); + } + } + } +} diff --git a/OpenCL/m32300_a0-optimized.cl b/OpenCL/m32300_a0-optimized.cl new file mode 100644 index 000000000..76400a61e --- /dev/null +++ b/OpenCL/m32300_a0-optimized.cl @@ -0,0 +1,813 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_rp_optimized.h) +#include M2S(INCLUDE_PATH/inc_rp_optimized.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +typedef struct md5_triple_salt +{ + u32 salt1_buf[64]; + int salt1_len; + + u32 salt2_buf[64]; + int salt2_len; + + u32 salt3_buf[64]; + int salt3_len; + +} md5_triple_salt_t; + +KERNEL_FQ void m32300_m04 (KERN_ATTR_RULES_ESALT (md5_triple_salt_t)) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * salt1 + */ + + const u32 salt1_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len; + + u32x salt1_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt1_len; i += 4, idx += 1) + { + salt1_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf[idx]; + } + + /** + * salt2 + */ + + const u32 salt2_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len; + + u32x salt2_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt2_len; i += 4, idx += 1) + { + salt2_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf[idx]; + } + + /** + * salt3 + */ + + const u32 salt3_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_len; + + u32x salt3_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt3_len; i += 4, idx += 1) + { + salt3_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_buf[idx]; + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + u32x w0[4] = { 0 }; + u32x w1[4] = { 0 }; + u32x w2[4] = { 0 }; + u32x w3[4] = { 0 }; + + // md5($password) + + const u32x out_len = apply_rules_vect_optimized (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); + + append_0x80_2x4_VV (w0, w1, out_len); + + w3[2] = out_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += make_u32x (MD5M_A); + b += make_u32x (MD5M_B); + c += make_u32x (MD5M_C); + d += make_u32x (MD5M_D); + + // md5(md5($password).$salt) + + md5_ctx_vector_t ctx; + + md5_init_vector (&ctx); + + ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ctx.len = 32; + + md5_update_vector (&ctx, salt1_buf, salt1_len); + + md5_final_vector (&ctx); + + a = ctx.h[0]; + b = ctx.h[1]; + c = ctx.h[2]; + d = ctx.h[3]; + + md5_init_vector (&ctx); + + md5_update_vector (&ctx, salt2_buf, salt2_len); + + u32x ww0[4]; + u32x ww1[4]; + u32x ww2[4]; + u32x ww3[4]; + + ww0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ww0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ww0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ww0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ww1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ww1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ww1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ww1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ww2[0] = 0; + ww2[1] = 0; + ww2[2] = 0; + ww2[3] = 0; + ww3[0] = 0; + ww3[1] = 0; + ww3[2] = 0; + ww3[3] = 0; + + md5_update_vector_64 (&ctx, ww0, ww1, ww2, ww3, 32); + + md5_update_vector (&ctx, salt3_buf, salt3_len); + + // md5_final_vector + + const int pos = ctx.len & 63; + + append_0x80_4x4 (ctx.w0, ctx.w1, ctx.w2, ctx.w3, pos); + + if (pos >= 56) + { + md5_transform_vector (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); + + ctx.w0[0] = 0; + ctx.w0[1] = 0; + ctx.w0[2] = 0; + ctx.w0[3] = 0; + ctx.w1[0] = 0; + ctx.w1[1] = 0; + ctx.w1[2] = 0; + ctx.w1[3] = 0; + ctx.w2[0] = 0; + ctx.w2[1] = 0; + ctx.w2[2] = 0; + ctx.w2[3] = 0; + ctx.w3[0] = 0; + ctx.w3[1] = 0; + ctx.w3[2] = 0; + ctx.w3[3] = 0; + } + + ctx.w3[2] = ctx.len * 8; + ctx.w3[3] = 0; + + a = ctx.h[0]; + b = ctx.h[1]; + c = ctx.h[2]; + d = ctx.h[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, ctx.w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, ctx.w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, ctx.w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, ctx.w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, ctx.w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, ctx.w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, ctx.w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, ctx.w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, ctx.w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, ctx.w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, ctx.w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, ctx.w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, ctx.w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, ctx.w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, ctx.w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, ctx.w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w2[1], MD5C3f, MD5S33); + + a += ctx.h[0] - make_u32x (MD5M_A); + b += ctx.h[1] - make_u32x (MD5M_B); + c += ctx.h[2] - make_u32x (MD5M_C); + d += ctx.h[3] - make_u32x (MD5M_D); + + COMPARE_M_SIMD (a, d, c, b); + } +} + +KERNEL_FQ void m32300_m08 (KERN_ATTR_RULES ()) +{ +} + +KERNEL_FQ void m32300_m16 (KERN_ATTR_RULES ()) +{ +} + +KERNEL_FQ void m32300_s04 (KERN_ATTR_RULES_ESALT (md5_triple_salt_t)) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * salt1 + */ + + const u32 salt1_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len; + + u32x salt1_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt1_len; i += 4, idx += 1) + { + salt1_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf[idx]; + } + + /** + * salt2 + */ + + const u32 salt2_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len; + + u32x salt2_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt2_len; i += 4, idx += 1) + { + salt2_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf[idx]; + } + + /** + * salt3 + */ + + const u32 salt3_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_len; + + u32x salt3_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt3_len; i += 4, idx += 1) + { + salt3_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_buf[idx]; + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + u32x w0[4] = { 0 }; + u32x w1[4] = { 0 }; + u32x w2[4] = { 0 }; + u32x w3[4] = { 0 }; + + const u32x out_len = apply_rules_vect_optimized (pw_buf0, pw_buf1, pw_len, rules_buf, il_pos, w0, w1); + + append_0x80_2x4_VV (w0, w1, out_len); + + w3[2] = out_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += make_u32x (MD5M_A); + b += make_u32x (MD5M_B); + c += make_u32x (MD5M_C); + d += make_u32x (MD5M_D); + + md5_ctx_vector_t ctx; + + md5_init_vector (&ctx); + + ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ctx.len = 32; + + md5_update_vector (&ctx, salt1_buf, salt1_len); + + md5_final_vector (&ctx); + + a = ctx.h[0]; + b = ctx.h[1]; + c = ctx.h[2]; + d = ctx.h[3]; + + md5_init_vector (&ctx); + + md5_update_vector (&ctx, salt2_buf, salt2_len); + + u32x ww0[4]; + u32x ww1[4]; + u32x ww2[4]; + u32x ww3[4]; + + ww0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ww0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ww0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ww0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ww1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ww1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ww1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ww1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ww2[0] = 0; + ww2[1] = 0; + ww2[2] = 0; + ww2[3] = 0; + ww3[0] = 0; + ww3[1] = 0; + ww3[2] = 0; + ww3[3] = 0; + + md5_update_vector_64 (&ctx, ww0, ww1, ww2, ww3, 32); + + md5_update_vector (&ctx, salt3_buf, salt3_len); + + // md5_final_vector + + const int pos = ctx.len & 63; + + append_0x80_4x4 (ctx.w0, ctx.w1, ctx.w2, ctx.w3, pos); + + if (pos >= 56) + { + md5_transform_vector (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); + + ctx.w0[0] = 0; + ctx.w0[1] = 0; + ctx.w0[2] = 0; + ctx.w0[3] = 0; + ctx.w1[0] = 0; + ctx.w1[1] = 0; + ctx.w1[2] = 0; + ctx.w1[3] = 0; + ctx.w2[0] = 0; + ctx.w2[1] = 0; + ctx.w2[2] = 0; + ctx.w2[3] = 0; + ctx.w3[0] = 0; + ctx.w3[1] = 0; + ctx.w3[2] = 0; + ctx.w3[3] = 0; + } + + ctx.w3[2] = ctx.len * 8; + ctx.w3[3] = 0; + + a = ctx.h[0]; + b = ctx.h[1]; + c = ctx.h[2]; + d = ctx.h[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, ctx.w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, ctx.w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, ctx.w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, ctx.w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, ctx.w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, ctx.w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, ctx.w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, ctx.w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, ctx.w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, ctx.w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, ctx.w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, ctx.w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, ctx.w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, ctx.w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, ctx.w1[0], MD5C3c, MD5S30); + + if (MATCHES_NONE_VS ((a + ctx.h[0] - make_u32x (MD5M_A)), search[0])) continue; + + MD5_STEP (MD5_I , d, a, b, c, ctx.w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w2[1], MD5C3f, MD5S33); + + a += ctx.h[0] - make_u32x (MD5M_A); + b += ctx.h[1] - make_u32x (MD5M_B); + c += ctx.h[2] - make_u32x (MD5M_C); + d += ctx.h[3] - make_u32x (MD5M_D); + + COMPARE_S_SIMD (a, d, c, b); + } +} + +KERNEL_FQ void m32300_s08 (KERN_ATTR_RULES ()) +{ +} + +KERNEL_FQ void m32300_s16 (KERN_ATTR_RULES ()) +{ +} diff --git a/OpenCL/m32300_a0-pure.cl b/OpenCL/m32300_a0-pure.cl new file mode 100644 index 000000000..59c177abc --- /dev/null +++ b/OpenCL/m32300_a0-pure.cl @@ -0,0 +1,388 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_rp.h) +#include M2S(INCLUDE_PATH/inc_rp.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +typedef struct md5_triple_salt +{ + u32 salt1_buf[64]; + int salt1_len; + + u32 salt2_buf[64]; + int salt2_len; + + u32 salt3_buf[64]; + int salt3_len; + +} md5_triple_salt_t; + +KERNEL_FQ void m32300_mxx (KERN_ATTR_RULES_ESALT (md5_triple_salt_t)) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc uppercase table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + COPY_PW (pws[gid]); + + const u32 salt1_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len; + + u32 salt1_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt1_len; i += 4, idx += 1) + { + salt1_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf[idx]; + } + + const u32 salt2_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len; + + u32 salt2_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt2_len; i += 4, idx += 1) + { + salt2_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf[idx]; + } + + const u32 salt3_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_len; + + u32 salt3_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt3_len; i += 4, idx += 1) + { + salt3_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_buf[idx]; + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + pw_t tmp = PASTE_PW; + + tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); + + md5_ctx_t ctx0; + + md5_init (&ctx0); + + md5_update (&ctx0, tmp.i, tmp.pw_len); + + md5_final (&ctx0); + + u32 a = ctx0.h[0]; + u32 b = ctx0.h[1]; + u32 c = ctx0.h[2]; + u32 d = ctx0.h[3]; + + md5_ctx_t ctx; + + md5_init (&ctx); + + ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ctx.len = 32; + + md5_update (&ctx, salt1_buf, salt1_len); + + md5_final (&ctx); + + a = ctx.h[0]; + b = ctx.h[1]; + c = ctx.h[2]; + d = ctx.h[3]; + + md5_init (&ctx); + + md5_update (&ctx, salt2_buf, salt2_len); + + u32 ww0[4]; + u32 ww1[4]; + u32 ww2[4]; + u32 ww3[4]; + + ww0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ww0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ww0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ww0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ww1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ww1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ww1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ww1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ww2[0] = 0; + ww2[1] = 0; + ww2[2] = 0; + ww2[3] = 0; + ww3[0] = 0; + ww3[1] = 0; + ww3[2] = 0; + ww3[3] = 0; + + md5_update_64 (&ctx, ww0, ww1, ww2, ww3, 32); + + md5_update (&ctx, salt3_buf, salt3_len); + + md5_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_M_SCALAR (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m32300_sxx (KERN_ATTR_RULES_ESALT (md5_triple_salt_t)) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc uppercase table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + COPY_PW (pws[gid]); + + const u32 salt1_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len; + + u32 salt1_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt1_len; i += 4, idx += 1) + { + salt1_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf[idx]; + } + + const u32 salt2_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len; + + u32 salt2_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt2_len; i += 4, idx += 1) + { + salt2_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf[idx]; + } + + const u32 salt3_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_len; + + u32 salt3_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt3_len; i += 4, idx += 1) + { + salt3_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_buf[idx]; + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + pw_t tmp = PASTE_PW; + + tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); + + md5_ctx_t ctx0; + + md5_init (&ctx0); + + md5_update (&ctx0, tmp.i, tmp.pw_len); + + md5_final (&ctx0); + + u32 a = ctx0.h[0]; + u32 b = ctx0.h[1]; + u32 c = ctx0.h[2]; + u32 d = ctx0.h[3]; + + md5_ctx_t ctx; + + md5_init (&ctx); + + ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ctx.len = 32; + + md5_update (&ctx, salt1_buf, salt1_len); + + md5_final (&ctx); + + a = ctx.h[0]; + b = ctx.h[1]; + c = ctx.h[2]; + d = ctx.h[3]; + + md5_init (&ctx); + + md5_update (&ctx, salt2_buf, salt2_len); + + u32 ww0[4]; + u32 ww1[4]; + u32 ww2[4]; + u32 ww3[4]; + + ww0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ww0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ww0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ww0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ww1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ww1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ww1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ww1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ww2[0] = 0; + ww2[1] = 0; + ww2[2] = 0; + ww2[3] = 0; + ww3[0] = 0; + ww3[1] = 0; + ww3[2] = 0; + ww3[3] = 0; + + md5_update_64 (&ctx, ww0, ww1, ww2, ww3, 32); + + md5_update (&ctx, salt3_buf, salt3_len); + + md5_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_S_SCALAR (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m32300_a1-optimized.cl b/OpenCL/m32300_a1-optimized.cl new file mode 100644 index 000000000..371cb2d99 --- /dev/null +++ b/OpenCL/m32300_a1-optimized.cl @@ -0,0 +1,925 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +typedef struct md5_triple_salt +{ + u32 salt1_buf[64]; + int salt1_len; + + u32 salt2_buf[64]; + int salt2_len; + + u32 salt3_buf[64]; + int salt3_len; + +} md5_triple_salt_t; + +KERNEL_FQ void m32300_m04 (KERN_ATTR_ESALT (md5_triple_salt_t)) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_l_len = pws[gid].pw_len & 63; + + /** + * salt1 + */ + + const u32 salt1_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len; + + u32x salt1_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt1_len; i += 4, idx += 1) + { + salt1_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf[idx]; + } + + /** + * salt2 + */ + + const u32 salt2_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len; + + u32x salt2_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt2_len; i += 4, idx += 1) + { + salt2_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf[idx]; + } + + /** + * salt3 + */ + + const u32 salt3_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_len; + + u32x salt3_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt3_len; i += 4, idx += 1) + { + salt3_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_buf[idx]; + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos) & 63; + + const u32x pw_len = (pw_l_len + pw_r_len) & 63; + + /** + * concat password candidate + */ + + u32x wordl0[4] = { 0 }; + u32x wordl1[4] = { 0 }; + u32x wordl2[4] = { 0 }; + u32x wordl3[4] = { 0 }; + + wordl0[0] = pw_buf0[0]; + wordl0[1] = pw_buf0[1]; + wordl0[2] = pw_buf0[2]; + wordl0[3] = pw_buf0[3]; + wordl1[0] = pw_buf1[0]; + wordl1[1] = pw_buf1[1]; + wordl1[2] = pw_buf1[2]; + wordl1[3] = pw_buf1[3]; + + u32x wordr0[4] = { 0 }; + u32x wordr1[4] = { 0 }; + u32x wordr2[4] = { 0 }; + u32x wordr3[4] = { 0 }; + + wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); + wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); + wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); + wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); + wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); + wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); + wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); + wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); + + if (COMBS_MODE == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + else + { + switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += make_u32x (MD5M_A); + b += make_u32x (MD5M_B); + c += make_u32x (MD5M_C); + d += make_u32x (MD5M_D); + + md5_ctx_vector_t ctx; + + md5_init_vector (&ctx); + + ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ctx.len = 32; + + md5_update_vector (&ctx, salt1_buf, salt1_len); + + md5_final_vector (&ctx); + + a = ctx.h[0]; + b = ctx.h[1]; + c = ctx.h[2]; + d = ctx.h[3]; + + md5_init_vector (&ctx); + + md5_update_vector (&ctx, salt2_buf, salt2_len); + + u32x ww0[4]; + u32x ww1[4]; + u32x ww2[4]; + u32x ww3[4]; + + ww0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ww0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ww0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ww0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ww1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ww1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ww1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ww1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ww2[0] = 0; + ww2[1] = 0; + ww2[2] = 0; + ww2[3] = 0; + ww3[0] = 0; + ww3[1] = 0; + ww3[2] = 0; + ww3[3] = 0; + + md5_update_vector_64 (&ctx, ww0, ww1, ww2, ww3, 32); + + md5_update_vector (&ctx, salt3_buf, salt3_len); + + // md5_final_vector + + const int pos = ctx.len & 63; + + append_0x80_4x4 (ctx.w0, ctx.w1, ctx.w2, ctx.w3, pos); + + if (pos >= 56) + { + md5_transform_vector (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); + + ctx.w0[0] = 0; + ctx.w0[1] = 0; + ctx.w0[2] = 0; + ctx.w0[3] = 0; + ctx.w1[0] = 0; + ctx.w1[1] = 0; + ctx.w1[2] = 0; + ctx.w1[3] = 0; + ctx.w2[0] = 0; + ctx.w2[1] = 0; + ctx.w2[2] = 0; + ctx.w2[3] = 0; + ctx.w3[0] = 0; + ctx.w3[1] = 0; + ctx.w3[2] = 0; + ctx.w3[3] = 0; + } + + ctx.w3[2] = ctx.len * 8; + ctx.w3[3] = 0; + + a = ctx.h[0]; + b = ctx.h[1]; + c = ctx.h[2]; + d = ctx.h[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, ctx.w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, ctx.w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, ctx.w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, ctx.w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, ctx.w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, ctx.w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, ctx.w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, ctx.w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, ctx.w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, ctx.w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, ctx.w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, ctx.w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, ctx.w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, ctx.w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, ctx.w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, ctx.w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w2[1], MD5C3f, MD5S33); + + a += ctx.h[0] - make_u32x (MD5M_A); + b += ctx.h[1] - make_u32x (MD5M_B); + c += ctx.h[2] - make_u32x (MD5M_C); + d += ctx.h[3] - make_u32x (MD5M_D); + + COMPARE_M_SIMD (a, d, c, b); + } +} + +KERNEL_FQ void m32300_m08 (KERN_ATTR_BASIC ()) +{ +} + +KERNEL_FQ void m32300_m16 (KERN_ATTR_BASIC ()) +{ +} + +KERNEL_FQ void m32300_s04 (KERN_ATTR_ESALT (md5_triple_salt_t)) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 pw_buf0[4]; + u32 pw_buf1[4]; + + pw_buf0[0] = pws[gid].i[0]; + pw_buf0[1] = pws[gid].i[1]; + pw_buf0[2] = pws[gid].i[2]; + pw_buf0[3] = pws[gid].i[3]; + pw_buf1[0] = pws[gid].i[4]; + pw_buf1[1] = pws[gid].i[5]; + pw_buf1[2] = pws[gid].i[6]; + pw_buf1[3] = pws[gid].i[7]; + + const u32 pw_l_len = pws[gid].pw_len & 63; + + /** + * salt1 + */ + + const u32 salt1_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len; + + u32x salt1_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt1_len; i += 4, idx += 1) + { + salt1_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf[idx]; + } + + /** + * salt2 + */ + + const u32 salt2_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len; + + u32x salt2_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt2_len; i += 4, idx += 1) + { + salt2_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf[idx]; + } + + /** + * salt3 + */ + + const u32 salt3_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_len; + + u32x salt3_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt3_len; i += 4, idx += 1) + { + salt3_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_buf[idx]; + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x pw_r_len = pwlenx_create_combt (combs_buf, il_pos) & 63; + + const u32x pw_len = (pw_l_len + pw_r_len) & 63; + + /** + * concat password candidate + */ + + u32x wordl0[4] = { 0 }; + u32x wordl1[4] = { 0 }; + u32x wordl2[4] = { 0 }; + u32x wordl3[4] = { 0 }; + + wordl0[0] = pw_buf0[0]; + wordl0[1] = pw_buf0[1]; + wordl0[2] = pw_buf0[2]; + wordl0[3] = pw_buf0[3]; + wordl1[0] = pw_buf1[0]; + wordl1[1] = pw_buf1[1]; + wordl1[2] = pw_buf1[2]; + wordl1[3] = pw_buf1[3]; + + u32x wordr0[4] = { 0 }; + u32x wordr1[4] = { 0 }; + u32x wordr2[4] = { 0 }; + u32x wordr3[4] = { 0 }; + + wordr0[0] = ix_create_combt (combs_buf, il_pos, 0); + wordr0[1] = ix_create_combt (combs_buf, il_pos, 1); + wordr0[2] = ix_create_combt (combs_buf, il_pos, 2); + wordr0[3] = ix_create_combt (combs_buf, il_pos, 3); + wordr1[0] = ix_create_combt (combs_buf, il_pos, 4); + wordr1[1] = ix_create_combt (combs_buf, il_pos, 5); + wordr1[2] = ix_create_combt (combs_buf, il_pos, 6); + wordr1[3] = ix_create_combt (combs_buf, il_pos, 7); + + if (COMBS_MODE == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset_le_VV (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + else + { + switch_buffer_by_offset_le_VV (wordl0, wordl1, wordl2, wordl3, pw_r_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += make_u32x (MD5M_A); + b += make_u32x (MD5M_B); + c += make_u32x (MD5M_C); + d += make_u32x (MD5M_D); + + md5_ctx_vector_t ctx; + + md5_init_vector (&ctx); + + ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ctx.len = 32; + + md5_update_vector (&ctx, salt1_buf, salt1_len); + + md5_final_vector (&ctx); + + a = ctx.h[0]; + b = ctx.h[1]; + c = ctx.h[2]; + d = ctx.h[3]; + + md5_init_vector (&ctx); + + md5_update_vector (&ctx, salt2_buf, salt2_len); + + u32x ww0[4]; + u32x ww1[4]; + u32x ww2[4]; + u32x ww3[4]; + + ww0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ww0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ww0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ww0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ww1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ww1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ww1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ww1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ww2[0] = 0; + ww2[1] = 0; + ww2[2] = 0; + ww2[3] = 0; + ww3[0] = 0; + ww3[1] = 0; + ww3[2] = 0; + ww3[3] = 0; + + md5_update_vector_64 (&ctx, ww0, ww1, ww2, ww3, 32); + + md5_update_vector (&ctx, salt3_buf, salt3_len); + + // md5_final_vector + + const int pos = ctx.len & 63; + + append_0x80_4x4 (ctx.w0, ctx.w1, ctx.w2, ctx.w3, pos); + + if (pos >= 56) + { + md5_transform_vector (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); + + ctx.w0[0] = 0; + ctx.w0[1] = 0; + ctx.w0[2] = 0; + ctx.w0[3] = 0; + ctx.w1[0] = 0; + ctx.w1[1] = 0; + ctx.w1[2] = 0; + ctx.w1[3] = 0; + ctx.w2[0] = 0; + ctx.w2[1] = 0; + ctx.w2[2] = 0; + ctx.w2[3] = 0; + ctx.w3[0] = 0; + ctx.w3[1] = 0; + ctx.w3[2] = 0; + ctx.w3[3] = 0; + } + + ctx.w3[2] = ctx.len * 8; + ctx.w3[3] = 0; + + a = ctx.h[0]; + b = ctx.h[1]; + c = ctx.h[2]; + d = ctx.h[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, ctx.w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, ctx.w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, ctx.w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, ctx.w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, ctx.w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, ctx.w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, ctx.w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, ctx.w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, ctx.w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, ctx.w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, ctx.w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, ctx.w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, ctx.w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, ctx.w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, ctx.w1[0], MD5C3c, MD5S30); + + if (MATCHES_NONE_VS ((a + ctx.h[0] - make_u32x (MD5M_A)), search[0])) continue; + + MD5_STEP (MD5_I , d, a, b, c, ctx.w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w2[1], MD5C3f, MD5S33); + + a += ctx.h[0] - make_u32x (MD5M_A); + b += ctx.h[1] - make_u32x (MD5M_B); + c += ctx.h[2] - make_u32x (MD5M_C); + d += ctx.h[3] - make_u32x (MD5M_D); + + COMPARE_S_SIMD (a, d, c, b); + } +} + +KERNEL_FQ void m32300_s08 (KERN_ATTR_BASIC ()) +{ +} + +KERNEL_FQ void m32300_s16 (KERN_ATTR_BASIC ()) +{ +} diff --git a/OpenCL/m32300_a1-pure.cl b/OpenCL/m32300_a1-pure.cl new file mode 100644 index 000000000..132db135a --- /dev/null +++ b/OpenCL/m32300_a1-pure.cl @@ -0,0 +1,382 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +typedef struct md5_triple_salt +{ + u32 salt1_buf[64]; + int salt1_len; + + u32 salt2_buf[64]; + int salt2_len; + + u32 salt3_buf[64]; + int salt3_len; + +} md5_triple_salt_t; + +KERNEL_FQ void m32300_mxx (KERN_ATTR_ESALT (md5_triple_salt_t)) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc uppercase array + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + const u32 salt1_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len; + + u32 salt1_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt1_len; i += 4, idx += 1) + { + salt1_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf[idx]; + } + + const u32 salt2_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len; + + u32 salt2_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt2_len; i += 4, idx += 1) + { + salt2_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf[idx]; + } + + const u32 salt3_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_len; + + u32 salt3_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt3_len; i += 4, idx += 1) + { + salt3_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_buf[idx]; + } + + /** + * base + */ + + md5_ctx_t ctx0; + + md5_init (&ctx0); + + md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + md5_ctx_t ctx1 = ctx0; + + md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); + + md5_final (&ctx1); + + u32 a = ctx1.h[0]; + u32 b = ctx1.h[1]; + u32 c = ctx1.h[2]; + u32 d = ctx1.h[3]; + + md5_ctx_t ctx; + + md5_init (&ctx); + + ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ctx.len = 32; + + md5_update (&ctx, salt1_buf, salt1_len); + + md5_final (&ctx); + + a = ctx.h[0]; + b = ctx.h[1]; + c = ctx.h[2]; + d = ctx.h[3]; + + md5_init (&ctx); + + md5_update (&ctx, salt2_buf, salt2_len); + + u32 ww0[4]; + u32 ww1[4]; + u32 ww2[4]; + u32 ww3[4]; + + ww0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ww0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ww0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ww0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ww1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ww1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ww1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ww1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ww2[0] = 0; + ww2[1] = 0; + ww2[2] = 0; + ww2[3] = 0; + ww3[0] = 0; + ww3[1] = 0; + ww3[2] = 0; + ww3[3] = 0; + + md5_update_64 (&ctx, ww0, ww1, ww2, ww3, 32); + + md5_update (&ctx, salt3_buf, salt3_len); + + md5_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_M_SCALAR (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m32300_sxx (KERN_ATTR_ESALT (md5_triple_salt_t)) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc uppercase array + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + const u32 salt1_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len; + + u32 salt1_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt1_len; i += 4, idx += 1) + { + salt1_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf[idx]; + } + + const u32 salt2_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len; + + u32 salt2_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt2_len; i += 4, idx += 1) + { + salt2_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf[idx]; + } + + const u32 salt3_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_len; + + u32 salt3_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt3_len; i += 4, idx += 1) + { + salt3_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_buf[idx]; + } + + /** + * base + */ + + md5_ctx_t ctx0; + + md5_init (&ctx0); + + md5_update_global (&ctx0, pws[gid].i, pws[gid].pw_len); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + md5_ctx_t ctx1 = ctx0; + + md5_update_global (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); + + md5_final (&ctx1); + + u32 a = ctx1.h[0]; + u32 b = ctx1.h[1]; + u32 c = ctx1.h[2]; + u32 d = ctx1.h[3]; + + md5_ctx_t ctx; + + md5_init (&ctx); + + ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ctx.len = 32; + + md5_update (&ctx, salt1_buf, salt1_len); + + md5_final (&ctx); + + a = ctx.h[0]; + b = ctx.h[1]; + c = ctx.h[2]; + d = ctx.h[3]; + + md5_init (&ctx); + + md5_update (&ctx, salt2_buf, salt2_len); + + u32 ww0[4]; + u32 ww1[4]; + u32 ww2[4]; + u32 ww3[4]; + + ww0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ww0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ww0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ww0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ww1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ww1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ww1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ww1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ww2[0] = 0; + ww2[1] = 0; + ww2[2] = 0; + ww2[3] = 0; + ww3[0] = 0; + ww3[1] = 0; + ww3[2] = 0; + ww3[3] = 0; + + md5_update_64 (&ctx, ww0, ww1, ww2, ww3, 32); + + md5_update (&ctx, salt3_buf, salt3_len); + + md5_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_S_SCALAR (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m32300_a3-optimized.cl b/OpenCL/m32300_a3-optimized.cl new file mode 100644 index 000000000..74a051cf5 --- /dev/null +++ b/OpenCL/m32300_a3-optimized.cl @@ -0,0 +1,1169 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +typedef struct md5_triple_salt +{ + u32 salt1_buf[64]; + int salt1_len; + + u32 salt2_buf[64]; + int salt2_len; + + u32 salt3_buf[64]; + int salt3_len; + +} md5_triple_salt_t; + +DECLSPEC void m32300m (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w2, PRIVATE_AS u32 *w3, const u32 pw_len, KERN_ATTR_FUNC_VECTOR_ESALT (md5_triple_salt_t), LOCAL_AS u32 *l_bin2asc) +{ + /** + * modifiers are taken from args + */ + + /** + * salt1 + */ + + const u32 salt1_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len; + + u32x salt1_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt1_len; i += 4, idx += 1) + { + salt1_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf[idx]; + } + + /** + * salt2 + */ + + const u32 salt2_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len; + + u32x salt2_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt2_len; i += 4, idx += 1) + { + salt2_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf[idx]; + } + + /** + * salt3 + */ + + const u32 salt3_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_len; + + u32x salt3_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt3_len; i += 4, idx += 1) + { + salt3_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_buf[idx]; + } + + /** + * loop + */ + + u32 w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0lr = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0lr; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += make_u32x (MD5M_A); + b += make_u32x (MD5M_B); + c += make_u32x (MD5M_C); + d += make_u32x (MD5M_D); + + md5_ctx_vector_t ctx; + + md5_init_vector (&ctx); + + ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ctx.len = 32; + + md5_update_vector (&ctx, salt1_buf, salt1_len); + + md5_final_vector (&ctx); + + a = ctx.h[0]; + b = ctx.h[1]; + c = ctx.h[2]; + d = ctx.h[3]; + + md5_init_vector (&ctx); + + md5_update_vector (&ctx, salt2_buf, salt2_len); + + u32x ww0[4]; + u32x ww1[4]; + u32x ww2[4]; + u32x ww3[4]; + + ww0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ww0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ww0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ww0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ww1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ww1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ww1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ww1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ww2[0] = 0; + ww2[1] = 0; + ww2[2] = 0; + ww2[3] = 0; + ww3[0] = 0; + ww3[1] = 0; + ww3[2] = 0; + ww3[3] = 0; + + md5_update_vector_64 (&ctx, ww0, ww1, ww2, ww3, 32); + + md5_update_vector (&ctx, salt3_buf, salt3_len); + + // md5_final_vector + + const int pos = ctx.len & 63; + + append_0x80_4x4 (ctx.w0, ctx.w1, ctx.w2, ctx.w3, pos); + + if (pos >= 56) + { + md5_transform_vector (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); + + ctx.w0[0] = 0; + ctx.w0[1] = 0; + ctx.w0[2] = 0; + ctx.w0[3] = 0; + ctx.w1[0] = 0; + ctx.w1[1] = 0; + ctx.w1[2] = 0; + ctx.w1[3] = 0; + ctx.w2[0] = 0; + ctx.w2[1] = 0; + ctx.w2[2] = 0; + ctx.w2[3] = 0; + ctx.w3[0] = 0; + ctx.w3[1] = 0; + ctx.w3[2] = 0; + ctx.w3[3] = 0; + } + + ctx.w3[2] = ctx.len * 8; + ctx.w3[3] = 0; + + a = ctx.h[0]; + b = ctx.h[1]; + c = ctx.h[2]; + d = ctx.h[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, ctx.w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, ctx.w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, ctx.w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, ctx.w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, ctx.w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, ctx.w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, ctx.w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, ctx.w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, ctx.w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, ctx.w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, ctx.w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, ctx.w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, ctx.w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, ctx.w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, ctx.w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, ctx.w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w2[1], MD5C3f, MD5S33); + + a += ctx.h[0] - make_u32x (MD5M_A); + b += ctx.h[1] - make_u32x (MD5M_B); + c += ctx.h[2] - make_u32x (MD5M_C); + d += ctx.h[3] - make_u32x (MD5M_D); + + COMPARE_M_SIMD (a, d, c, b); + } +} + +DECLSPEC void m32300s (PRIVATE_AS u32 *w0, PRIVATE_AS u32 *w1, PRIVATE_AS u32 *w2, PRIVATE_AS u32 *w3, const u32 pw_len, KERN_ATTR_FUNC_VECTOR_ESALT (md5_triple_salt_t), LOCAL_AS u32 *l_bin2asc) +{ + /** + * modifiers are taken from args + */ + + /** + * salt1 + */ + + const u32 salt1_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len; + + u32x salt1_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt1_len; i += 4, idx += 1) + { + salt1_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf[idx]; + } + + /** + * salt2 + */ + + const u32 salt2_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len; + + u32x salt2_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt2_len; i += 4, idx += 1) + { + salt2_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf[idx]; + } + + /** + * salt3 + */ + + const u32 salt3_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_len; + + u32x salt3_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt3_len; i += 4, idx += 1) + { + salt3_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_buf[idx]; + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32 w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0lr = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0lr; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + u32x t; + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += make_u32x (MD5M_A); + b += make_u32x (MD5M_B); + c += make_u32x (MD5M_C); + d += make_u32x (MD5M_D); + + md5_ctx_vector_t ctx; + + md5_init_vector (&ctx); + + ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ctx.len = 32; + + md5_update_vector (&ctx, salt1_buf, salt1_len); + + md5_final_vector (&ctx); + + a = ctx.h[0]; + b = ctx.h[1]; + c = ctx.h[2]; + d = ctx.h[3]; + + md5_init_vector (&ctx); + + md5_update_vector (&ctx, salt2_buf, salt2_len); + + u32x ww0[4]; + u32x ww1[4]; + u32x ww2[4]; + u32x ww3[4]; + + ww0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ww0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ww0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ww0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ww1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ww1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ww1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ww1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ww2[0] = 0; + ww2[1] = 0; + ww2[2] = 0; + ww2[3] = 0; + ww3[0] = 0; + ww3[1] = 0; + ww3[2] = 0; + ww3[3] = 0; + + md5_update_vector_64 (&ctx, ww0, ww1, ww2, ww3, 32); + + md5_update_vector (&ctx, salt3_buf, salt3_len); + + // md5_final_vector + + const int pos = ctx.len & 63; + + append_0x80_4x4 (ctx.w0, ctx.w1, ctx.w2, ctx.w3, pos); + + if (pos >= 56) + { + md5_transform_vector (ctx.w0, ctx.w1, ctx.w2, ctx.w3, ctx.h); + + ctx.w0[0] = 0; + ctx.w0[1] = 0; + ctx.w0[2] = 0; + ctx.w0[3] = 0; + ctx.w1[0] = 0; + ctx.w1[1] = 0; + ctx.w1[2] = 0; + ctx.w1[3] = 0; + ctx.w2[0] = 0; + ctx.w2[1] = 0; + ctx.w2[2] = 0; + ctx.w2[3] = 0; + ctx.w3[0] = 0; + ctx.w3[1] = 0; + ctx.w3[2] = 0; + ctx.w3[3] = 0; + } + + ctx.w3[2] = ctx.len * 8; + ctx.w3[3] = 0; + + a = ctx.h[0]; + b = ctx.h[1]; + c = ctx.h[2]; + d = ctx.h[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, ctx.w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, ctx.w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, ctx.w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, ctx.w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, ctx.w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, ctx.w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, ctx.w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, ctx.w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, ctx.w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, ctx.w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, ctx.w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, ctx.w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, ctx.w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, ctx.w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, ctx.w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, ctx.w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, ctx.w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, ctx.w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, ctx.w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, ctx.w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, ctx.w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, ctx.w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, ctx.w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, ctx.w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, ctx.w1[0], MD5C3c, MD5S30); + + if (MATCHES_NONE_VS ((a + ctx.h[0] - make_u32x (MD5M_A)), search[0])) continue; + + MD5_STEP (MD5_I , d, a, b, c, ctx.w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, ctx.w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, ctx.w2[1], MD5C3f, MD5S33); + + a += ctx.h[0] - make_u32x (MD5M_A); + b += ctx.h[1] - make_u32x (MD5M_B); + c += ctx.h[2] - make_u32x (MD5M_C); + d += ctx.h[3] - make_u32x (MD5M_D); + + COMPARE_S_SIMD (a, d, c, b); + } +} + +KERNEL_FQ void m32300_m04 (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32 w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32 w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m32300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m32300_m08 (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32 w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32 w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * main + */ + + m32300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m32300_m16 (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32 w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32 w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * main + */ + + m32300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m32300_s04 (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32 w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32 w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * main + */ + + m32300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m32300_s08 (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32 w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32 w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * main + */ + + m32300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} + +KERNEL_FQ void m32300_s16 (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) +{ + /** + * base + */ + + const u64 lid = get_local_id (0); + const u64 gid = get_global_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * modifier + */ + + u32 w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32 w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32 w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32 w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len & 63; + + /** + * main + */ + + m32300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_extra0_buf, d_extra1_buf, d_extra2_buf, d_extra3_buf, kernel_param, gid, lid, lsz, l_bin2asc); +} diff --git a/OpenCL/m32300_a3-pure.cl b/OpenCL/m32300_a3-pure.cl new file mode 100644 index 000000000..1345df59d --- /dev/null +++ b/OpenCL/m32300_a3-pure.cl @@ -0,0 +1,408 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_md5.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +typedef struct md5_triple_salt +{ + u32 salt1_buf[64]; + int salt1_len; + + u32 salt2_buf[64]; + int salt2_len; + + u32 salt3_buf[64]; + int salt3_len; + +} md5_triple_salt_t; + +KERNEL_FQ void m32300_mxx (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /* + * bin2asc uppercase table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + const u32 pw_len = pws[gid].pw_len; + + u32x w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + const u32 salt1_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len; + + u32x salt1_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt1_len; i += 4, idx += 1) + { + salt1_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf[idx]; + } + + const u32 salt2_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len; + + u32x salt2_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt2_len; i += 4, idx += 1) + { + salt2_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf[idx]; + } + + const u32 salt3_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_len; + + u32x salt3_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt3_len; i += 4, idx += 1) + { + salt3_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_buf[idx]; + } + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0 = w0l | w0r; + + w[0] = w0; + + md5_ctx_vector_t ctx0; + + md5_init_vector (&ctx0); + + md5_update_vector (&ctx0, w, pw_len); + + md5_final_vector (&ctx0); + + u32x a = ctx0.h[0]; + u32x b = ctx0.h[1]; + u32x c = ctx0.h[2]; + u32x d = ctx0.h[3]; + + md5_ctx_vector_t ctx; + + md5_init_vector (&ctx); + + ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ctx.len = 32; + + md5_update_vector (&ctx, salt1_buf, salt1_len); + + md5_final_vector (&ctx); + + a = ctx.h[0]; + b = ctx.h[1]; + c = ctx.h[2]; + d = ctx.h[3]; + + md5_init_vector (&ctx); + + md5_update_vector (&ctx, salt2_buf, salt2_len); + + u32x ww0[4]; + u32x ww1[4]; + u32x ww2[4]; + u32x ww3[4]; + + ww0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ww0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ww0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ww0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ww1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ww1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ww1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ww1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ww2[0] = 0; + ww2[1] = 0; + ww2[2] = 0; + ww2[3] = 0; + ww3[0] = 0; + ww3[1] = 0; + ww3[2] = 0; + ww3[3] = 0; + + md5_update_vector_64 (&ctx, ww0, ww1, ww2, ww3, 32); + + md5_update_vector (&ctx, salt3_buf, salt3_len); + + md5_final_vector (&ctx); + + const u32x r0 = ctx.h[DGST_R0]; + const u32x r1 = ctx.h[DGST_R1]; + const u32x r2 = ctx.h[DGST_R2]; + const u32x r3 = ctx.h[DGST_R3]; + + COMPARE_M_SIMD (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m32300_sxx (KERN_ATTR_VECTOR_ESALT (md5_triple_salt_t)) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /* + * bin2asc uppercase table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 8 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 0; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + const u32 pw_len = pws[gid].pw_len; + + u32x w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + const u32 salt1_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_len; + + u32x salt1_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt1_len; i += 4, idx += 1) + { + salt1_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt1_buf[idx]; + } + + const u32 salt2_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_len; + + u32x salt2_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt2_len; i += 4, idx += 1) + { + salt2_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt2_buf[idx]; + } + + const u32 salt3_len = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_len; + + u32x salt3_buf[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt3_len; i += 4, idx += 1) + { + salt3_buf[idx] = esalt_bufs[DIGESTS_OFFSET_HOST].salt3_buf[idx]; + } + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0 = w0l | w0r; + + w[0] = w0; + + md5_ctx_vector_t ctx0; + + md5_init_vector (&ctx0); + + md5_update_vector (&ctx0, w, pw_len); + + md5_final_vector (&ctx0); + + u32x a = ctx0.h[0]; + u32x b = ctx0.h[1]; + u32x c = ctx0.h[2]; + u32x d = ctx0.h[3]; + + md5_ctx_vector_t ctx; + + md5_init_vector (&ctx); + + ctx.w0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ctx.w0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ctx.w0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ctx.w0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ctx.w1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ctx.w1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ctx.w1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ctx.w1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ctx.len = 32; + + md5_update_vector (&ctx, salt1_buf, salt1_len); + + md5_final_vector (&ctx); + + a = ctx.h[0]; + b = ctx.h[1]; + c = ctx.h[2]; + d = ctx.h[3]; + + md5_init_vector (&ctx); + + md5_update_vector (&ctx, salt2_buf, salt2_len); + + u32x ww0[4]; + u32x ww1[4]; + u32x ww2[4]; + u32x ww3[4]; + + ww0[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + ww0[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + ww0[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + ww0[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + ww1[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + ww1[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + ww1[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + ww1[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + ww2[0] = 0; + ww2[1] = 0; + ww2[2] = 0; + ww2[3] = 0; + ww3[0] = 0; + ww3[1] = 0; + ww3[2] = 0; + ww3[3] = 0; + + md5_update_vector_64 (&ctx, ww0, ww1, ww2, ww3, 32); + + md5_update_vector (&ctx, salt3_buf, salt3_len); + + md5_final_vector (&ctx); + + const u32x r0 = ctx.h[DGST_R0]; + const u32x r1 = ctx.h[DGST_R1]; + const u32x r2 = ctx.h[DGST_R2]; + const u32x r3 = ctx.h[DGST_R3]; + + COMPARE_S_SIMD (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m32410_a0-pure.cl b/OpenCL/m32410_a0-pure.cl new file mode 100644 index 000000000..864468195 --- /dev/null +++ b/OpenCL/m32410_a0-pure.cl @@ -0,0 +1,369 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_rp.h) +#include M2S(INCLUDE_PATH/inc_rp.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha512.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +KERNEL_FQ void m32410_mxx (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + u32 w4[4]; + u32 w5[4]; + u32 w6[4]; + u32 w7[4]; + + COPY_PW (pws[gid]); + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + pw_t tmp = PASTE_PW; + + tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); + + sha512_ctx_t ctx0; + + sha512_init (&ctx0); + + sha512_update_swap (&ctx0, tmp.i, tmp.pw_len); + + sha512_final (&ctx0); + + const u64 a = ctx0.h[0]; + const u64 b = ctx0.h[1]; + const u64 c = ctx0.h[2]; + const u64 d = ctx0.h[3]; + const u64 e = ctx0.h[4]; + const u64 f = ctx0.h[5]; + const u64 g = ctx0.h[6]; + const u64 h = ctx0.h[7]; + + sha512_ctx_t ctx; + + sha512_init (&ctx); + + w0[0] = uint_to_hex_lower8 ((a >> 56) & 255) << 16 + | uint_to_hex_lower8 ((a >> 48) & 255) << 0; + w0[1] = uint_to_hex_lower8 ((a >> 40) & 255) << 16 + | uint_to_hex_lower8 ((a >> 32) & 255) << 0; + w0[2] = uint_to_hex_lower8 ((a >> 24) & 255) << 16 + | uint_to_hex_lower8 ((a >> 16) & 255) << 0; + w0[3] = uint_to_hex_lower8 ((a >> 8) & 255) << 16 + | uint_to_hex_lower8 ((a >> 0) & 255) << 0; + w1[0] = uint_to_hex_lower8 ((b >> 56) & 255) << 16 + | uint_to_hex_lower8 ((b >> 48) & 255) << 0; + w1[1] = uint_to_hex_lower8 ((b >> 40) & 255) << 16 + | uint_to_hex_lower8 ((b >> 32) & 255) << 0; + w1[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 16 + | uint_to_hex_lower8 ((b >> 16) & 255) << 0; + w1[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 16 + | uint_to_hex_lower8 ((b >> 0) & 255) << 0; + w2[0] = uint_to_hex_lower8 ((c >> 56) & 255) << 16 + | uint_to_hex_lower8 ((c >> 48) & 255) << 0; + w2[1] = uint_to_hex_lower8 ((c >> 40) & 255) << 16 + | uint_to_hex_lower8 ((c >> 32) & 255) << 0; + w2[2] = uint_to_hex_lower8 ((c >> 24) & 255) << 16 + | uint_to_hex_lower8 ((c >> 16) & 255) << 0; + w2[3] = uint_to_hex_lower8 ((c >> 8) & 255) << 16 + | uint_to_hex_lower8 ((c >> 0) & 255) << 0; + w3[0] = uint_to_hex_lower8 ((d >> 56) & 255) << 16 + | uint_to_hex_lower8 ((d >> 48) & 255) << 0; + w3[1] = uint_to_hex_lower8 ((d >> 40) & 255) << 16 + | uint_to_hex_lower8 ((d >> 32) & 255) << 0; + w3[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 16 + | uint_to_hex_lower8 ((d >> 16) & 255) << 0; + w3[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 16 + | uint_to_hex_lower8 ((d >> 0) & 255) << 0; + w4[0] = uint_to_hex_lower8 ((e >> 56) & 255) << 16 + | uint_to_hex_lower8 ((e >> 48) & 255) << 0; + w4[1] = uint_to_hex_lower8 ((e >> 40) & 255) << 16 + | uint_to_hex_lower8 ((e >> 32) & 255) << 0; + w4[2] = uint_to_hex_lower8 ((e >> 24) & 255) << 16 + | uint_to_hex_lower8 ((e >> 16) & 255) << 0; + w4[3] = uint_to_hex_lower8 ((e >> 8) & 255) << 16 + | uint_to_hex_lower8 ((e >> 0) & 255) << 0; + w5[0] = uint_to_hex_lower8 ((f >> 56) & 255) << 16 + | uint_to_hex_lower8 ((f >> 48) & 255) << 0; + w5[1] = uint_to_hex_lower8 ((f >> 40) & 255) << 16 + | uint_to_hex_lower8 ((f >> 32) & 255) << 0; + w5[2] = uint_to_hex_lower8 ((f >> 24) & 255) << 16 + | uint_to_hex_lower8 ((f >> 16) & 255) << 0; + w5[3] = uint_to_hex_lower8 ((f >> 8) & 255) << 16 + | uint_to_hex_lower8 ((f >> 0) & 255) << 0; + w6[0] = uint_to_hex_lower8 ((g >> 56) & 255) << 16 + | uint_to_hex_lower8 ((g >> 48) & 255) << 0; + w6[1] = uint_to_hex_lower8 ((g >> 40) & 255) << 16 + | uint_to_hex_lower8 ((g >> 32) & 255) << 0; + w6[2] = uint_to_hex_lower8 ((g >> 24) & 255) << 16 + | uint_to_hex_lower8 ((g >> 16) & 255) << 0; + w6[3] = uint_to_hex_lower8 ((g >> 8) & 255) << 16 + | uint_to_hex_lower8 ((g >> 0) & 255) << 0; + w7[0] = uint_to_hex_lower8 ((h >> 56) & 255) << 16 + | uint_to_hex_lower8 ((h >> 48) & 255) << 0; + w7[1] = uint_to_hex_lower8 ((h >> 40) & 255) << 16 + | uint_to_hex_lower8 ((h >> 32) & 255) << 0; + w7[2] = uint_to_hex_lower8 ((h >> 24) & 255) << 16 + | uint_to_hex_lower8 ((h >> 16) & 255) << 0; + w7[3] = uint_to_hex_lower8 ((h >> 8) & 255) << 16 + | uint_to_hex_lower8 ((h >> 0) & 255) << 0; + + sha512_update_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); + + sha512_update (&ctx, s, salt_len); + + sha512_final (&ctx); + + const u32 r0 = l32_from_64_S (ctx.h[7]); + const u32 r1 = h32_from_64_S (ctx.h[7]); + const u32 r2 = l32_from_64_S (ctx.h[3]); + const u32 r3 = h32_from_64_S (ctx.h[3]); + + COMPARE_M_SCALAR (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m32410_sxx (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + u32 w4[4]; + u32 w5[4]; + u32 w6[4]; + u32 w7[4]; + + COPY_PW (pws[gid]); + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + pw_t tmp = PASTE_PW; + + tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); + + sha512_ctx_t ctx0; + + sha512_init (&ctx0); + + sha512_update_swap (&ctx0, tmp.i, tmp.pw_len); + + sha512_final (&ctx0); + + const u64 a = ctx0.h[0]; + const u64 b = ctx0.h[1]; + const u64 c = ctx0.h[2]; + const u64 d = ctx0.h[3]; + const u64 e = ctx0.h[4]; + const u64 f = ctx0.h[5]; + const u64 g = ctx0.h[6]; + const u64 h = ctx0.h[7]; + + sha512_ctx_t ctx; + + sha512_init (&ctx); + + w0[0] = uint_to_hex_lower8 ((a >> 56) & 255) << 16 + | uint_to_hex_lower8 ((a >> 48) & 255) << 0; + w0[1] = uint_to_hex_lower8 ((a >> 40) & 255) << 16 + | uint_to_hex_lower8 ((a >> 32) & 255) << 0; + w0[2] = uint_to_hex_lower8 ((a >> 24) & 255) << 16 + | uint_to_hex_lower8 ((a >> 16) & 255) << 0; + w0[3] = uint_to_hex_lower8 ((a >> 8) & 255) << 16 + | uint_to_hex_lower8 ((a >> 0) & 255) << 0; + w1[0] = uint_to_hex_lower8 ((b >> 56) & 255) << 16 + | uint_to_hex_lower8 ((b >> 48) & 255) << 0; + w1[1] = uint_to_hex_lower8 ((b >> 40) & 255) << 16 + | uint_to_hex_lower8 ((b >> 32) & 255) << 0; + w1[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 16 + | uint_to_hex_lower8 ((b >> 16) & 255) << 0; + w1[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 16 + | uint_to_hex_lower8 ((b >> 0) & 255) << 0; + w2[0] = uint_to_hex_lower8 ((c >> 56) & 255) << 16 + | uint_to_hex_lower8 ((c >> 48) & 255) << 0; + w2[1] = uint_to_hex_lower8 ((c >> 40) & 255) << 16 + | uint_to_hex_lower8 ((c >> 32) & 255) << 0; + w2[2] = uint_to_hex_lower8 ((c >> 24) & 255) << 16 + | uint_to_hex_lower8 ((c >> 16) & 255) << 0; + w2[3] = uint_to_hex_lower8 ((c >> 8) & 255) << 16 + | uint_to_hex_lower8 ((c >> 0) & 255) << 0; + w3[0] = uint_to_hex_lower8 ((d >> 56) & 255) << 16 + | uint_to_hex_lower8 ((d >> 48) & 255) << 0; + w3[1] = uint_to_hex_lower8 ((d >> 40) & 255) << 16 + | uint_to_hex_lower8 ((d >> 32) & 255) << 0; + w3[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 16 + | uint_to_hex_lower8 ((d >> 16) & 255) << 0; + w3[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 16 + | uint_to_hex_lower8 ((d >> 0) & 255) << 0; + w4[0] = uint_to_hex_lower8 ((e >> 56) & 255) << 16 + | uint_to_hex_lower8 ((e >> 48) & 255) << 0; + w4[1] = uint_to_hex_lower8 ((e >> 40) & 255) << 16 + | uint_to_hex_lower8 ((e >> 32) & 255) << 0; + w4[2] = uint_to_hex_lower8 ((e >> 24) & 255) << 16 + | uint_to_hex_lower8 ((e >> 16) & 255) << 0; + w4[3] = uint_to_hex_lower8 ((e >> 8) & 255) << 16 + | uint_to_hex_lower8 ((e >> 0) & 255) << 0; + w5[0] = uint_to_hex_lower8 ((f >> 56) & 255) << 16 + | uint_to_hex_lower8 ((f >> 48) & 255) << 0; + w5[1] = uint_to_hex_lower8 ((f >> 40) & 255) << 16 + | uint_to_hex_lower8 ((f >> 32) & 255) << 0; + w5[2] = uint_to_hex_lower8 ((f >> 24) & 255) << 16 + | uint_to_hex_lower8 ((f >> 16) & 255) << 0; + w5[3] = uint_to_hex_lower8 ((f >> 8) & 255) << 16 + | uint_to_hex_lower8 ((f >> 0) & 255) << 0; + w6[0] = uint_to_hex_lower8 ((g >> 56) & 255) << 16 + | uint_to_hex_lower8 ((g >> 48) & 255) << 0; + w6[1] = uint_to_hex_lower8 ((g >> 40) & 255) << 16 + | uint_to_hex_lower8 ((g >> 32) & 255) << 0; + w6[2] = uint_to_hex_lower8 ((g >> 24) & 255) << 16 + | uint_to_hex_lower8 ((g >> 16) & 255) << 0; + w6[3] = uint_to_hex_lower8 ((g >> 8) & 255) << 16 + | uint_to_hex_lower8 ((g >> 0) & 255) << 0; + w7[0] = uint_to_hex_lower8 ((h >> 56) & 255) << 16 + | uint_to_hex_lower8 ((h >> 48) & 255) << 0; + w7[1] = uint_to_hex_lower8 ((h >> 40) & 255) << 16 + | uint_to_hex_lower8 ((h >> 32) & 255) << 0; + w7[2] = uint_to_hex_lower8 ((h >> 24) & 255) << 16 + | uint_to_hex_lower8 ((h >> 16) & 255) << 0; + w7[3] = uint_to_hex_lower8 ((h >> 8) & 255) << 16 + | uint_to_hex_lower8 ((h >> 0) & 255) << 0; + + sha512_update_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); + + sha512_update (&ctx, s, salt_len); + + sha512_final (&ctx); + + const u32 r0 = l32_from_64_S (ctx.h[7]); + const u32 r1 = h32_from_64_S (ctx.h[7]); + const u32 r2 = l32_from_64_S (ctx.h[3]); + const u32 r3 = h32_from_64_S (ctx.h[3]); + + COMPARE_S_SCALAR (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m32410_a1-pure.cl b/OpenCL/m32410_a1-pure.cl new file mode 100644 index 000000000..65dccc7d6 --- /dev/null +++ b/OpenCL/m32410_a1-pure.cl @@ -0,0 +1,363 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha512.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +KERNEL_FQ void m32410_mxx (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + u32 w4[4]; + u32 w5[4]; + u32 w6[4]; + u32 w7[4]; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + sha512_ctx_t ctx0; + + sha512_init (&ctx0); + + sha512_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + sha512_ctx_t ctx1 = ctx0; + + sha512_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); + + sha512_final (&ctx1); + + const u64 a = ctx1.h[0]; + const u64 b = ctx1.h[1]; + const u64 c = ctx1.h[2]; + const u64 d = ctx1.h[3]; + const u64 e = ctx1.h[4]; + const u64 f = ctx1.h[5]; + const u64 g = ctx1.h[6]; + const u64 h = ctx1.h[7]; + + sha512_ctx_t ctx; + + sha512_init (&ctx); + + w0[0] = uint_to_hex_lower8 ((a >> 56) & 255) << 16 + | uint_to_hex_lower8 ((a >> 48) & 255) << 0; + w0[1] = uint_to_hex_lower8 ((a >> 40) & 255) << 16 + | uint_to_hex_lower8 ((a >> 32) & 255) << 0; + w0[2] = uint_to_hex_lower8 ((a >> 24) & 255) << 16 + | uint_to_hex_lower8 ((a >> 16) & 255) << 0; + w0[3] = uint_to_hex_lower8 ((a >> 8) & 255) << 16 + | uint_to_hex_lower8 ((a >> 0) & 255) << 0; + w1[0] = uint_to_hex_lower8 ((b >> 56) & 255) << 16 + | uint_to_hex_lower8 ((b >> 48) & 255) << 0; + w1[1] = uint_to_hex_lower8 ((b >> 40) & 255) << 16 + | uint_to_hex_lower8 ((b >> 32) & 255) << 0; + w1[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 16 + | uint_to_hex_lower8 ((b >> 16) & 255) << 0; + w1[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 16 + | uint_to_hex_lower8 ((b >> 0) & 255) << 0; + w2[0] = uint_to_hex_lower8 ((c >> 56) & 255) << 16 + | uint_to_hex_lower8 ((c >> 48) & 255) << 0; + w2[1] = uint_to_hex_lower8 ((c >> 40) & 255) << 16 + | uint_to_hex_lower8 ((c >> 32) & 255) << 0; + w2[2] = uint_to_hex_lower8 ((c >> 24) & 255) << 16 + | uint_to_hex_lower8 ((c >> 16) & 255) << 0; + w2[3] = uint_to_hex_lower8 ((c >> 8) & 255) << 16 + | uint_to_hex_lower8 ((c >> 0) & 255) << 0; + w3[0] = uint_to_hex_lower8 ((d >> 56) & 255) << 16 + | uint_to_hex_lower8 ((d >> 48) & 255) << 0; + w3[1] = uint_to_hex_lower8 ((d >> 40) & 255) << 16 + | uint_to_hex_lower8 ((d >> 32) & 255) << 0; + w3[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 16 + | uint_to_hex_lower8 ((d >> 16) & 255) << 0; + w3[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 16 + | uint_to_hex_lower8 ((d >> 0) & 255) << 0; + w4[0] = uint_to_hex_lower8 ((e >> 56) & 255) << 16 + | uint_to_hex_lower8 ((e >> 48) & 255) << 0; + w4[1] = uint_to_hex_lower8 ((e >> 40) & 255) << 16 + | uint_to_hex_lower8 ((e >> 32) & 255) << 0; + w4[2] = uint_to_hex_lower8 ((e >> 24) & 255) << 16 + | uint_to_hex_lower8 ((e >> 16) & 255) << 0; + w4[3] = uint_to_hex_lower8 ((e >> 8) & 255) << 16 + | uint_to_hex_lower8 ((e >> 0) & 255) << 0; + w5[0] = uint_to_hex_lower8 ((f >> 56) & 255) << 16 + | uint_to_hex_lower8 ((f >> 48) & 255) << 0; + w5[1] = uint_to_hex_lower8 ((f >> 40) & 255) << 16 + | uint_to_hex_lower8 ((f >> 32) & 255) << 0; + w5[2] = uint_to_hex_lower8 ((f >> 24) & 255) << 16 + | uint_to_hex_lower8 ((f >> 16) & 255) << 0; + w5[3] = uint_to_hex_lower8 ((f >> 8) & 255) << 16 + | uint_to_hex_lower8 ((f >> 0) & 255) << 0; + w6[0] = uint_to_hex_lower8 ((g >> 56) & 255) << 16 + | uint_to_hex_lower8 ((g >> 48) & 255) << 0; + w6[1] = uint_to_hex_lower8 ((g >> 40) & 255) << 16 + | uint_to_hex_lower8 ((g >> 32) & 255) << 0; + w6[2] = uint_to_hex_lower8 ((g >> 24) & 255) << 16 + | uint_to_hex_lower8 ((g >> 16) & 255) << 0; + w6[3] = uint_to_hex_lower8 ((g >> 8) & 255) << 16 + | uint_to_hex_lower8 ((g >> 0) & 255) << 0; + w7[0] = uint_to_hex_lower8 ((h >> 56) & 255) << 16 + | uint_to_hex_lower8 ((h >> 48) & 255) << 0; + w7[1] = uint_to_hex_lower8 ((h >> 40) & 255) << 16 + | uint_to_hex_lower8 ((h >> 32) & 255) << 0; + w7[2] = uint_to_hex_lower8 ((h >> 24) & 255) << 16 + | uint_to_hex_lower8 ((h >> 16) & 255) << 0; + w7[3] = uint_to_hex_lower8 ((h >> 8) & 255) << 16 + | uint_to_hex_lower8 ((h >> 0) & 255) << 0; + + sha512_update_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); + + sha512_update (&ctx, s, salt_len); + + sha512_final (&ctx); + + const u32 r0 = l32_from_64_S (ctx.h[7]); + const u32 r1 = h32_from_64_S (ctx.h[7]); + const u32 r2 = l32_from_64_S (ctx.h[3]); + const u32 r3 = h32_from_64_S (ctx.h[3]); + + COMPARE_M_SCALAR (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m32410_sxx (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + u32 w4[4]; + u32 w5[4]; + u32 w6[4]; + u32 w7[4]; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + sha512_ctx_t ctx0; + + sha512_init (&ctx0); + + sha512_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + sha512_ctx_t ctx1 = ctx0; + + sha512_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); + + sha512_final (&ctx1); + + const u64 a = ctx1.h[0]; + const u64 b = ctx1.h[1]; + const u64 c = ctx1.h[2]; + const u64 d = ctx1.h[3]; + const u64 e = ctx1.h[4]; + const u64 f = ctx1.h[5]; + const u64 g = ctx1.h[6]; + const u64 h = ctx1.h[7]; + + sha512_ctx_t ctx; + + sha512_init (&ctx); + + w0[0] = uint_to_hex_lower8 ((a >> 56) & 255) << 16 + | uint_to_hex_lower8 ((a >> 48) & 255) << 0; + w0[1] = uint_to_hex_lower8 ((a >> 40) & 255) << 16 + | uint_to_hex_lower8 ((a >> 32) & 255) << 0; + w0[2] = uint_to_hex_lower8 ((a >> 24) & 255) << 16 + | uint_to_hex_lower8 ((a >> 16) & 255) << 0; + w0[3] = uint_to_hex_lower8 ((a >> 8) & 255) << 16 + | uint_to_hex_lower8 ((a >> 0) & 255) << 0; + w1[0] = uint_to_hex_lower8 ((b >> 56) & 255) << 16 + | uint_to_hex_lower8 ((b >> 48) & 255) << 0; + w1[1] = uint_to_hex_lower8 ((b >> 40) & 255) << 16 + | uint_to_hex_lower8 ((b >> 32) & 255) << 0; + w1[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 16 + | uint_to_hex_lower8 ((b >> 16) & 255) << 0; + w1[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 16 + | uint_to_hex_lower8 ((b >> 0) & 255) << 0; + w2[0] = uint_to_hex_lower8 ((c >> 56) & 255) << 16 + | uint_to_hex_lower8 ((c >> 48) & 255) << 0; + w2[1] = uint_to_hex_lower8 ((c >> 40) & 255) << 16 + | uint_to_hex_lower8 ((c >> 32) & 255) << 0; + w2[2] = uint_to_hex_lower8 ((c >> 24) & 255) << 16 + | uint_to_hex_lower8 ((c >> 16) & 255) << 0; + w2[3] = uint_to_hex_lower8 ((c >> 8) & 255) << 16 + | uint_to_hex_lower8 ((c >> 0) & 255) << 0; + w3[0] = uint_to_hex_lower8 ((d >> 56) & 255) << 16 + | uint_to_hex_lower8 ((d >> 48) & 255) << 0; + w3[1] = uint_to_hex_lower8 ((d >> 40) & 255) << 16 + | uint_to_hex_lower8 ((d >> 32) & 255) << 0; + w3[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 16 + | uint_to_hex_lower8 ((d >> 16) & 255) << 0; + w3[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 16 + | uint_to_hex_lower8 ((d >> 0) & 255) << 0; + w4[0] = uint_to_hex_lower8 ((e >> 56) & 255) << 16 + | uint_to_hex_lower8 ((e >> 48) & 255) << 0; + w4[1] = uint_to_hex_lower8 ((e >> 40) & 255) << 16 + | uint_to_hex_lower8 ((e >> 32) & 255) << 0; + w4[2] = uint_to_hex_lower8 ((e >> 24) & 255) << 16 + | uint_to_hex_lower8 ((e >> 16) & 255) << 0; + w4[3] = uint_to_hex_lower8 ((e >> 8) & 255) << 16 + | uint_to_hex_lower8 ((e >> 0) & 255) << 0; + w5[0] = uint_to_hex_lower8 ((f >> 56) & 255) << 16 + | uint_to_hex_lower8 ((f >> 48) & 255) << 0; + w5[1] = uint_to_hex_lower8 ((f >> 40) & 255) << 16 + | uint_to_hex_lower8 ((f >> 32) & 255) << 0; + w5[2] = uint_to_hex_lower8 ((f >> 24) & 255) << 16 + | uint_to_hex_lower8 ((f >> 16) & 255) << 0; + w5[3] = uint_to_hex_lower8 ((f >> 8) & 255) << 16 + | uint_to_hex_lower8 ((f >> 0) & 255) << 0; + w6[0] = uint_to_hex_lower8 ((g >> 56) & 255) << 16 + | uint_to_hex_lower8 ((g >> 48) & 255) << 0; + w6[1] = uint_to_hex_lower8 ((g >> 40) & 255) << 16 + | uint_to_hex_lower8 ((g >> 32) & 255) << 0; + w6[2] = uint_to_hex_lower8 ((g >> 24) & 255) << 16 + | uint_to_hex_lower8 ((g >> 16) & 255) << 0; + w6[3] = uint_to_hex_lower8 ((g >> 8) & 255) << 16 + | uint_to_hex_lower8 ((g >> 0) & 255) << 0; + w7[0] = uint_to_hex_lower8 ((h >> 56) & 255) << 16 + | uint_to_hex_lower8 ((h >> 48) & 255) << 0; + w7[1] = uint_to_hex_lower8 ((h >> 40) & 255) << 16 + | uint_to_hex_lower8 ((h >> 32) & 255) << 0; + w7[2] = uint_to_hex_lower8 ((h >> 24) & 255) << 16 + | uint_to_hex_lower8 ((h >> 16) & 255) << 0; + w7[3] = uint_to_hex_lower8 ((h >> 8) & 255) << 16 + | uint_to_hex_lower8 ((h >> 0) & 255) << 0; + + sha512_update_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); + + sha512_update (&ctx, s, salt_len); + + sha512_final (&ctx); + + const u32 r0 = l32_from_64_S (ctx.h[7]); + const u32 r1 = h32_from_64_S (ctx.h[7]); + const u32 r2 = l32_from_64_S (ctx.h[3]); + const u32 r3 = h32_from_64_S (ctx.h[3]); + + COMPARE_S_SCALAR (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m32410_a3-pure.cl b/OpenCL/m32410_a3-pure.cl new file mode 100644 index 000000000..32b0c17d9 --- /dev/null +++ b/OpenCL/m32410_a3-pure.cl @@ -0,0 +1,389 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha512.cl) +#endif + +#if VECT_SIZE == 1 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i)]) +#elif VECT_SIZE == 2 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#elif VECT_SIZE == 4 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#elif VECT_SIZE == 8 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7]) +#elif VECT_SIZE == 16 +#define uint_to_hex_lower8(i) make_u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3], l_bin2asc[(i).s4], l_bin2asc[(i).s5], l_bin2asc[(i).s6], l_bin2asc[(i).s7], l_bin2asc[(i).s8], l_bin2asc[(i).s9], l_bin2asc[(i).sa], l_bin2asc[(i).sb], l_bin2asc[(i).sc], l_bin2asc[(i).sd], l_bin2asc[(i).se], l_bin2asc[(i).sf]) +#endif + +KERNEL_FQ void m32410_mxx (KERN_ATTR_VECTOR ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + u32x w4[4]; + u32x w5[4]; + u32x w6[4]; + u32x w7[4]; + + const u32 pw_len = pws[gid].pw_len; + + u32x w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32x s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0_final = w0l | w0r; + + w[0] = w0_final; + + sha512_ctx_vector_t ctx0; + + sha512_init_vector (&ctx0); + + sha512_update_vector (&ctx0, w, pw_len); + + sha512_final_vector (&ctx0); + + const u64x a = ctx0.h[0]; + const u64x b = ctx0.h[1]; + const u64x c = ctx0.h[2]; + const u64x d = ctx0.h[3]; + const u64x e = ctx0.h[4]; + const u64x f = ctx0.h[5]; + const u64x g = ctx0.h[6]; + const u64x h = ctx0.h[7]; + + sha512_ctx_vector_t ctx; + + sha512_init_vector (&ctx); + + w0[0] = uint_to_hex_lower8 ((a >> 56) & 255) << 16 + | uint_to_hex_lower8 ((a >> 48) & 255) << 0; + w0[1] = uint_to_hex_lower8 ((a >> 40) & 255) << 16 + | uint_to_hex_lower8 ((a >> 32) & 255) << 0; + w0[2] = uint_to_hex_lower8 ((a >> 24) & 255) << 16 + | uint_to_hex_lower8 ((a >> 16) & 255) << 0; + w0[3] = uint_to_hex_lower8 ((a >> 8) & 255) << 16 + | uint_to_hex_lower8 ((a >> 0) & 255) << 0; + w1[0] = uint_to_hex_lower8 ((b >> 56) & 255) << 16 + | uint_to_hex_lower8 ((b >> 48) & 255) << 0; + w1[1] = uint_to_hex_lower8 ((b >> 40) & 255) << 16 + | uint_to_hex_lower8 ((b >> 32) & 255) << 0; + w1[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 16 + | uint_to_hex_lower8 ((b >> 16) & 255) << 0; + w1[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 16 + | uint_to_hex_lower8 ((b >> 0) & 255) << 0; + w2[0] = uint_to_hex_lower8 ((c >> 56) & 255) << 16 + | uint_to_hex_lower8 ((c >> 48) & 255) << 0; + w2[1] = uint_to_hex_lower8 ((c >> 40) & 255) << 16 + | uint_to_hex_lower8 ((c >> 32) & 255) << 0; + w2[2] = uint_to_hex_lower8 ((c >> 24) & 255) << 16 + | uint_to_hex_lower8 ((c >> 16) & 255) << 0; + w2[3] = uint_to_hex_lower8 ((c >> 8) & 255) << 16 + | uint_to_hex_lower8 ((c >> 0) & 255) << 0; + w3[0] = uint_to_hex_lower8 ((d >> 56) & 255) << 16 + | uint_to_hex_lower8 ((d >> 48) & 255) << 0; + w3[1] = uint_to_hex_lower8 ((d >> 40) & 255) << 16 + | uint_to_hex_lower8 ((d >> 32) & 255) << 0; + w3[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 16 + | uint_to_hex_lower8 ((d >> 16) & 255) << 0; + w3[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 16 + | uint_to_hex_lower8 ((d >> 0) & 255) << 0; + w4[0] = uint_to_hex_lower8 ((e >> 56) & 255) << 16 + | uint_to_hex_lower8 ((e >> 48) & 255) << 0; + w4[1] = uint_to_hex_lower8 ((e >> 40) & 255) << 16 + | uint_to_hex_lower8 ((e >> 32) & 255) << 0; + w4[2] = uint_to_hex_lower8 ((e >> 24) & 255) << 16 + | uint_to_hex_lower8 ((e >> 16) & 255) << 0; + w4[3] = uint_to_hex_lower8 ((e >> 8) & 255) << 16 + | uint_to_hex_lower8 ((e >> 0) & 255) << 0; + w5[0] = uint_to_hex_lower8 ((f >> 56) & 255) << 16 + | uint_to_hex_lower8 ((f >> 48) & 255) << 0; + w5[1] = uint_to_hex_lower8 ((f >> 40) & 255) << 16 + | uint_to_hex_lower8 ((f >> 32) & 255) << 0; + w5[2] = uint_to_hex_lower8 ((f >> 24) & 255) << 16 + | uint_to_hex_lower8 ((f >> 16) & 255) << 0; + w5[3] = uint_to_hex_lower8 ((f >> 8) & 255) << 16 + | uint_to_hex_lower8 ((f >> 0) & 255) << 0; + w6[0] = uint_to_hex_lower8 ((g >> 56) & 255) << 16 + | uint_to_hex_lower8 ((g >> 48) & 255) << 0; + w6[1] = uint_to_hex_lower8 ((g >> 40) & 255) << 16 + | uint_to_hex_lower8 ((g >> 32) & 255) << 0; + w6[2] = uint_to_hex_lower8 ((g >> 24) & 255) << 16 + | uint_to_hex_lower8 ((g >> 16) & 255) << 0; + w6[3] = uint_to_hex_lower8 ((g >> 8) & 255) << 16 + | uint_to_hex_lower8 ((g >> 0) & 255) << 0; + w7[0] = uint_to_hex_lower8 ((h >> 56) & 255) << 16 + | uint_to_hex_lower8 ((h >> 48) & 255) << 0; + w7[1] = uint_to_hex_lower8 ((h >> 40) & 255) << 16 + | uint_to_hex_lower8 ((h >> 32) & 255) << 0; + w7[2] = uint_to_hex_lower8 ((h >> 24) & 255) << 16 + | uint_to_hex_lower8 ((h >> 16) & 255) << 0; + w7[3] = uint_to_hex_lower8 ((h >> 8) & 255) << 16 + | uint_to_hex_lower8 ((h >> 0) & 255) << 0; + + sha512_update_vector_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); + + sha512_update_vector (&ctx, s, salt_len); + + sha512_final_vector (&ctx); + + const u32x r0 = l32_from_64 (ctx.h[7]); + const u32x r1 = h32_from_64 (ctx.h[7]); + const u32x r2 = l32_from_64 (ctx.h[3]); + const u32x r3 = h32_from_64 (ctx.h[3]); + + COMPARE_M_SIMD (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m32410_sxx (KERN_ATTR_VECTOR ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * bin2asc table + */ + + LOCAL_VK u32 l_bin2asc[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + const u32 i0 = (i >> 0) & 15; + const u32 i1 = (i >> 4) & 15; + + l_bin2asc[i] = ((i0 < 10) ? '0' + i0 : 'a' - 10 + i0) << 0 + | ((i1 < 10) ? '0' + i1 : 'a' - 10 + i1) << 8; + } + + SYNC_THREADS (); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + u32x w4[4]; + u32x w5[4]; + u32x w6[4]; + u32x w7[4]; + + const u32 pw_len = pws[gid].pw_len; + + u32x w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32x s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0_final = w0l | w0r; + + w[0] = w0_final; + + sha512_ctx_vector_t ctx0; + + sha512_init_vector (&ctx0); + + sha512_update_vector (&ctx0, w, pw_len); + + sha512_final_vector (&ctx0); + + const u64x a = ctx0.h[0]; + const u64x b = ctx0.h[1]; + const u64x c = ctx0.h[2]; + const u64x d = ctx0.h[3]; + const u64x e = ctx0.h[4]; + const u64x f = ctx0.h[5]; + const u64x g = ctx0.h[6]; + const u64x h = ctx0.h[7]; + + sha512_ctx_vector_t ctx; + + sha512_init_vector (&ctx); + + w0[0] = uint_to_hex_lower8 ((a >> 56) & 255) << 16 + | uint_to_hex_lower8 ((a >> 48) & 255) << 0; + w0[1] = uint_to_hex_lower8 ((a >> 40) & 255) << 16 + | uint_to_hex_lower8 ((a >> 32) & 255) << 0; + w0[2] = uint_to_hex_lower8 ((a >> 24) & 255) << 16 + | uint_to_hex_lower8 ((a >> 16) & 255) << 0; + w0[3] = uint_to_hex_lower8 ((a >> 8) & 255) << 16 + | uint_to_hex_lower8 ((a >> 0) & 255) << 0; + w1[0] = uint_to_hex_lower8 ((b >> 56) & 255) << 16 + | uint_to_hex_lower8 ((b >> 48) & 255) << 0; + w1[1] = uint_to_hex_lower8 ((b >> 40) & 255) << 16 + | uint_to_hex_lower8 ((b >> 32) & 255) << 0; + w1[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 16 + | uint_to_hex_lower8 ((b >> 16) & 255) << 0; + w1[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 16 + | uint_to_hex_lower8 ((b >> 0) & 255) << 0; + w2[0] = uint_to_hex_lower8 ((c >> 56) & 255) << 16 + | uint_to_hex_lower8 ((c >> 48) & 255) << 0; + w2[1] = uint_to_hex_lower8 ((c >> 40) & 255) << 16 + | uint_to_hex_lower8 ((c >> 32) & 255) << 0; + w2[2] = uint_to_hex_lower8 ((c >> 24) & 255) << 16 + | uint_to_hex_lower8 ((c >> 16) & 255) << 0; + w2[3] = uint_to_hex_lower8 ((c >> 8) & 255) << 16 + | uint_to_hex_lower8 ((c >> 0) & 255) << 0; + w3[0] = uint_to_hex_lower8 ((d >> 56) & 255) << 16 + | uint_to_hex_lower8 ((d >> 48) & 255) << 0; + w3[1] = uint_to_hex_lower8 ((d >> 40) & 255) << 16 + | uint_to_hex_lower8 ((d >> 32) & 255) << 0; + w3[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 16 + | uint_to_hex_lower8 ((d >> 16) & 255) << 0; + w3[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 16 + | uint_to_hex_lower8 ((d >> 0) & 255) << 0; + w4[0] = uint_to_hex_lower8 ((e >> 56) & 255) << 16 + | uint_to_hex_lower8 ((e >> 48) & 255) << 0; + w4[1] = uint_to_hex_lower8 ((e >> 40) & 255) << 16 + | uint_to_hex_lower8 ((e >> 32) & 255) << 0; + w4[2] = uint_to_hex_lower8 ((e >> 24) & 255) << 16 + | uint_to_hex_lower8 ((e >> 16) & 255) << 0; + w4[3] = uint_to_hex_lower8 ((e >> 8) & 255) << 16 + | uint_to_hex_lower8 ((e >> 0) & 255) << 0; + w5[0] = uint_to_hex_lower8 ((f >> 56) & 255) << 16 + | uint_to_hex_lower8 ((f >> 48) & 255) << 0; + w5[1] = uint_to_hex_lower8 ((f >> 40) & 255) << 16 + | uint_to_hex_lower8 ((f >> 32) & 255) << 0; + w5[2] = uint_to_hex_lower8 ((f >> 24) & 255) << 16 + | uint_to_hex_lower8 ((f >> 16) & 255) << 0; + w5[3] = uint_to_hex_lower8 ((f >> 8) & 255) << 16 + | uint_to_hex_lower8 ((f >> 0) & 255) << 0; + w6[0] = uint_to_hex_lower8 ((g >> 56) & 255) << 16 + | uint_to_hex_lower8 ((g >> 48) & 255) << 0; + w6[1] = uint_to_hex_lower8 ((g >> 40) & 255) << 16 + | uint_to_hex_lower8 ((g >> 32) & 255) << 0; + w6[2] = uint_to_hex_lower8 ((g >> 24) & 255) << 16 + | uint_to_hex_lower8 ((g >> 16) & 255) << 0; + w6[3] = uint_to_hex_lower8 ((g >> 8) & 255) << 16 + | uint_to_hex_lower8 ((g >> 0) & 255) << 0; + w7[0] = uint_to_hex_lower8 ((h >> 56) & 255) << 16 + | uint_to_hex_lower8 ((h >> 48) & 255) << 0; + w7[1] = uint_to_hex_lower8 ((h >> 40) & 255) << 16 + | uint_to_hex_lower8 ((h >> 32) & 255) << 0; + w7[2] = uint_to_hex_lower8 ((h >> 24) & 255) << 16 + | uint_to_hex_lower8 ((h >> 16) & 255) << 0; + w7[3] = uint_to_hex_lower8 ((h >> 8) & 255) << 16 + | uint_to_hex_lower8 ((h >> 0) & 255) << 0; + + sha512_update_vector_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 128); + + sha512_update_vector (&ctx, s, salt_len); + + sha512_final_vector (&ctx); + + const u32x r0 = l32_from_64 (ctx.h[7]); + const u32x r1 = h32_from_64 (ctx.h[7]); + const u32x r2 = l32_from_64 (ctx.h[3]); + const u32x r3 = h32_from_64 (ctx.h[3]); + + COMPARE_S_SIMD (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m32420_a0-pure.cl b/OpenCL/m32420_a0-pure.cl new file mode 100644 index 000000000..79a7c2712 --- /dev/null +++ b/OpenCL/m32420_a0-pure.cl @@ -0,0 +1,241 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_rp.h) +#include M2S(INCLUDE_PATH/inc_rp.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha512.cl) +#endif + +KERNEL_FQ void m32420_mxx (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + u32 w4[4]; + u32 w5[4]; + u32 w6[4]; + u32 w7[4]; + + COPY_PW (pws[gid]); + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + pw_t tmp = PASTE_PW; + + tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); + + sha512_ctx_t ctx0; + + sha512_init (&ctx0); + + sha512_update_swap (&ctx0, tmp.i, tmp.pw_len); + + sha512_final (&ctx0); + + sha512_ctx_t ctx; + + sha512_init (&ctx); + + w0[0] = h32_from_64_S (ctx0.h[0]); + w0[1] = l32_from_64_S (ctx0.h[0]); + w0[2] = h32_from_64_S (ctx0.h[1]); + w0[3] = l32_from_64_S (ctx0.h[1]); + w1[0] = h32_from_64_S (ctx0.h[2]); + w1[1] = l32_from_64_S (ctx0.h[2]); + w1[2] = h32_from_64_S (ctx0.h[3]); + w1[3] = l32_from_64_S (ctx0.h[3]); + w2[0] = h32_from_64_S (ctx0.h[4]); + w2[1] = l32_from_64_S (ctx0.h[4]); + w2[2] = h32_from_64_S (ctx0.h[5]); + w2[3] = l32_from_64_S (ctx0.h[5]); + w3[0] = h32_from_64_S (ctx0.h[6]); + w3[1] = l32_from_64_S (ctx0.h[6]); + w3[2] = h32_from_64_S (ctx0.h[7]); + w3[3] = l32_from_64_S (ctx0.h[7]); + w4[0] = 0; + w4[1] = 0; + w4[2] = 0; + w4[3] = 0; + w5[0] = 0; + w5[1] = 0; + w5[2] = 0; + w5[3] = 0; + w6[0] = 0; + w6[1] = 0; + w6[2] = 0; + w6[3] = 0; + w7[0] = 0; + w7[1] = 0; + w7[2] = 0; + w7[3] = 0; + + sha512_update_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64); + + sha512_update (&ctx, s, salt_len); + + sha512_final (&ctx); + + const u32 r0 = l32_from_64_S (ctx.h[7]); + const u32 r1 = h32_from_64_S (ctx.h[7]); + const u32 r2 = l32_from_64_S (ctx.h[3]); + const u32 r3 = h32_from_64_S (ctx.h[3]); + + COMPARE_M_SCALAR (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m32420_sxx (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + u32 w4[4]; + u32 w5[4]; + u32 w6[4]; + u32 w7[4]; + + COPY_PW (pws[gid]); + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + pw_t tmp = PASTE_PW; + + tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); + + sha512_ctx_t ctx0; + + sha512_init (&ctx0); + + sha512_update_swap (&ctx0, tmp.i, tmp.pw_len); + + sha512_final (&ctx0); + + sha512_ctx_t ctx; + + sha512_init (&ctx); + + w0[0] = h32_from_64_S (ctx0.h[0]); + w0[1] = l32_from_64_S (ctx0.h[0]); + w0[2] = h32_from_64_S (ctx0.h[1]); + w0[3] = l32_from_64_S (ctx0.h[1]); + w1[0] = h32_from_64_S (ctx0.h[2]); + w1[1] = l32_from_64_S (ctx0.h[2]); + w1[2] = h32_from_64_S (ctx0.h[3]); + w1[3] = l32_from_64_S (ctx0.h[3]); + w2[0] = h32_from_64_S (ctx0.h[4]); + w2[1] = l32_from_64_S (ctx0.h[4]); + w2[2] = h32_from_64_S (ctx0.h[5]); + w2[3] = l32_from_64_S (ctx0.h[5]); + w3[0] = h32_from_64_S (ctx0.h[6]); + w3[1] = l32_from_64_S (ctx0.h[6]); + w3[2] = h32_from_64_S (ctx0.h[7]); + w3[3] = l32_from_64_S (ctx0.h[7]); + w4[0] = 0; + w4[1] = 0; + w4[2] = 0; + w4[3] = 0; + w5[0] = 0; + w5[1] = 0; + w5[2] = 0; + w5[3] = 0; + w6[0] = 0; + w6[1] = 0; + w6[2] = 0; + w6[3] = 0; + w7[0] = 0; + w7[1] = 0; + w7[2] = 0; + w7[3] = 0; + + sha512_update_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64); + + sha512_update (&ctx, s, salt_len); + + sha512_final (&ctx); + + const u32 r0 = l32_from_64_S (ctx.h[7]); + const u32 r1 = h32_from_64_S (ctx.h[7]); + const u32 r2 = l32_from_64_S (ctx.h[3]); + const u32 r3 = h32_from_64_S (ctx.h[3]); + + COMPARE_S_SCALAR (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m32420_a1-pure.cl b/OpenCL/m32420_a1-pure.cl new file mode 100644 index 000000000..1835d4fba --- /dev/null +++ b/OpenCL/m32420_a1-pure.cl @@ -0,0 +1,235 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha512.cl) +#endif + +KERNEL_FQ void m32420_mxx (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + u32 w4[4]; + u32 w5[4]; + u32 w6[4]; + u32 w7[4]; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + sha512_ctx_t ctx0; + + sha512_init (&ctx0); + + sha512_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + sha512_ctx_t ctx1 = ctx0; + + sha512_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); + + sha512_final (&ctx1); + + sha512_ctx_t ctx; + + sha512_init (&ctx); + + w0[0] = h32_from_64_S (ctx1.h[0]); + w0[1] = l32_from_64_S (ctx1.h[0]); + w0[2] = h32_from_64_S (ctx1.h[1]); + w0[3] = l32_from_64_S (ctx1.h[1]); + w1[0] = h32_from_64_S (ctx1.h[2]); + w1[1] = l32_from_64_S (ctx1.h[2]); + w1[2] = h32_from_64_S (ctx1.h[3]); + w1[3] = l32_from_64_S (ctx1.h[3]); + w2[0] = h32_from_64_S (ctx1.h[4]); + w2[1] = l32_from_64_S (ctx1.h[4]); + w2[2] = h32_from_64_S (ctx1.h[5]); + w2[3] = l32_from_64_S (ctx1.h[5]); + w3[0] = h32_from_64_S (ctx1.h[6]); + w3[1] = l32_from_64_S (ctx1.h[6]); + w3[2] = h32_from_64_S (ctx1.h[7]); + w3[3] = l32_from_64_S (ctx1.h[7]); + w4[0] = 0; + w4[1] = 0; + w4[2] = 0; + w4[3] = 0; + w5[0] = 0; + w5[1] = 0; + w5[2] = 0; + w5[3] = 0; + w6[0] = 0; + w6[1] = 0; + w6[2] = 0; + w6[3] = 0; + w7[0] = 0; + w7[1] = 0; + w7[2] = 0; + w7[3] = 0; + + sha512_update_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64); + + sha512_update (&ctx, s, salt_len); + + sha512_final (&ctx); + + const u32 r0 = l32_from_64_S (ctx.h[7]); + const u32 r1 = h32_from_64_S (ctx.h[7]); + const u32 r2 = l32_from_64_S (ctx.h[3]); + const u32 r3 = h32_from_64_S (ctx.h[3]); + + COMPARE_M_SCALAR (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m32420_sxx (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + u32 w4[4]; + u32 w5[4]; + u32 w6[4]; + u32 w7[4]; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32 s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + sha512_ctx_t ctx0; + + sha512_init (&ctx0); + + sha512_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + sha512_ctx_t ctx1 = ctx0; + + sha512_update_global_swap (&ctx1, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); + + sha512_final (&ctx1); + + sha512_ctx_t ctx; + + sha512_init (&ctx); + + w0[0] = h32_from_64_S (ctx1.h[0]); + w0[1] = l32_from_64_S (ctx1.h[0]); + w0[2] = h32_from_64_S (ctx1.h[1]); + w0[3] = l32_from_64_S (ctx1.h[1]); + w1[0] = h32_from_64_S (ctx1.h[2]); + w1[1] = l32_from_64_S (ctx1.h[2]); + w1[2] = h32_from_64_S (ctx1.h[3]); + w1[3] = l32_from_64_S (ctx1.h[3]); + w2[0] = h32_from_64_S (ctx1.h[4]); + w2[1] = l32_from_64_S (ctx1.h[4]); + w2[2] = h32_from_64_S (ctx1.h[5]); + w2[3] = l32_from_64_S (ctx1.h[5]); + w3[0] = h32_from_64_S (ctx1.h[6]); + w3[1] = l32_from_64_S (ctx1.h[6]); + w3[2] = h32_from_64_S (ctx1.h[7]); + w3[3] = l32_from_64_S (ctx1.h[7]); + w4[0] = 0; + w4[1] = 0; + w4[2] = 0; + w4[3] = 0; + w5[0] = 0; + w5[1] = 0; + w5[2] = 0; + w5[3] = 0; + w6[0] = 0; + w6[1] = 0; + w6[2] = 0; + w6[3] = 0; + w7[0] = 0; + w7[1] = 0; + w7[2] = 0; + w7[3] = 0; + + sha512_update_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64); + + sha512_update (&ctx, s, salt_len); + + sha512_final (&ctx); + + const u32 r0 = l32_from_64_S (ctx.h[7]); + const u32 r1 = h32_from_64_S (ctx.h[7]); + const u32 r2 = l32_from_64_S (ctx.h[3]); + const u32 r3 = h32_from_64_S (ctx.h[3]); + + COMPARE_S_SCALAR (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m32420_a3-pure.cl b/OpenCL/m32420_a3-pure.cl new file mode 100644 index 000000000..ae4575e1b --- /dev/null +++ b/OpenCL/m32420_a3-pure.cl @@ -0,0 +1,270 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha512.cl) +#endif + +KERNEL_FQ void m32420_mxx (KERN_ATTR_VECTOR ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + if (gid >= GID_CNT) return; + + /** + * base + */ + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + u32x w4[4]; + u32x w5[4]; + u32x w6[4]; + u32x w7[4]; + + const u32 pw_len = pws[gid].pw_len; + + u32x w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32x s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0_final = w0l | w0r; + + w[0] = w0_final; + + sha512_ctx_vector_t ctx0; + + sha512_init_vector (&ctx0); + + sha512_update_vector (&ctx0, w, pw_len); + + sha512_final_vector (&ctx0); + + const u64x a = ctx0.h[0]; + const u64x b = ctx0.h[1]; + const u64x c = ctx0.h[2]; + const u64x d = ctx0.h[3]; + const u64x e = ctx0.h[4]; + const u64x f = ctx0.h[5]; + const u64x g = ctx0.h[6]; + const u64x h = ctx0.h[7]; + + sha512_ctx_vector_t ctx; + + sha512_init_vector (&ctx); + + w0[0] = h32_from_64 (ctx0.h[0]); + w0[1] = l32_from_64 (ctx0.h[0]); + w0[2] = h32_from_64 (ctx0.h[1]); + w0[3] = l32_from_64 (ctx0.h[1]); + w1[0] = h32_from_64 (ctx0.h[2]); + w1[1] = l32_from_64 (ctx0.h[2]); + w1[2] = h32_from_64 (ctx0.h[3]); + w1[3] = l32_from_64 (ctx0.h[3]); + w2[0] = h32_from_64 (ctx0.h[4]); + w2[1] = l32_from_64 (ctx0.h[4]); + w2[2] = h32_from_64 (ctx0.h[5]); + w2[3] = l32_from_64 (ctx0.h[5]); + w3[0] = h32_from_64 (ctx0.h[6]); + w3[1] = l32_from_64 (ctx0.h[6]); + w3[2] = h32_from_64 (ctx0.h[7]); + w3[3] = l32_from_64 (ctx0.h[7]); + w4[0] = 0; + w4[1] = 0; + w4[2] = 0; + w4[3] = 0; + w5[0] = 0; + w5[1] = 0; + w5[2] = 0; + w5[3] = 0; + w6[0] = 0; + w6[1] = 0; + w6[2] = 0; + w6[3] = 0; + w7[0] = 0; + w7[1] = 0; + w7[2] = 0; + w7[3] = 0; + + sha512_update_vector_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64); + + sha512_update_vector (&ctx, s, salt_len); + + sha512_final_vector (&ctx); + + const u32x r0 = l32_from_64 (ctx.h[7]); + const u32x r1 = h32_from_64 (ctx.h[7]); + const u32x r2 = l32_from_64 (ctx.h[3]); + const u32x r3 = h32_from_64 (ctx.h[3]); + + COMPARE_M_SIMD (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m32420_sxx (KERN_ATTR_VECTOR ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + u32x w4[4]; + u32x w5[4]; + u32x w6[4]; + u32x w7[4]; + + const u32 pw_len = pws[gid].pw_len; + + u32x w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32x s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32_S (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0_final = w0l | w0r; + + w[0] = w0_final; + + sha512_ctx_vector_t ctx0; + + sha512_init_vector (&ctx0); + + sha512_update_vector (&ctx0, w, pw_len); + + sha512_final_vector (&ctx0); + + sha512_ctx_vector_t ctx; + + sha512_init_vector (&ctx); + + w0[0] = h32_from_64 (ctx0.h[0]); + w0[1] = l32_from_64 (ctx0.h[0]); + w0[2] = h32_from_64 (ctx0.h[1]); + w0[3] = l32_from_64 (ctx0.h[1]); + w1[0] = h32_from_64 (ctx0.h[2]); + w1[1] = l32_from_64 (ctx0.h[2]); + w1[2] = h32_from_64 (ctx0.h[3]); + w1[3] = l32_from_64 (ctx0.h[3]); + w2[0] = h32_from_64 (ctx0.h[4]); + w2[1] = l32_from_64 (ctx0.h[4]); + w2[2] = h32_from_64 (ctx0.h[5]); + w2[3] = l32_from_64 (ctx0.h[5]); + w3[0] = h32_from_64 (ctx0.h[6]); + w3[1] = l32_from_64 (ctx0.h[6]); + w3[2] = h32_from_64 (ctx0.h[7]); + w3[3] = l32_from_64 (ctx0.h[7]); + w4[0] = 0; + w4[1] = 0; + w4[2] = 0; + w4[3] = 0; + w5[0] = 0; + w5[1] = 0; + w5[2] = 0; + w5[3] = 0; + w6[0] = 0; + w6[1] = 0; + w6[2] = 0; + w6[3] = 0; + w7[0] = 0; + w7[1] = 0; + w7[2] = 0; + w7[3] = 0; + + sha512_update_vector_128 (&ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64); + + sha512_update_vector (&ctx, s, salt_len); + + sha512_final_vector (&ctx); + + const u32x r0 = l32_from_64 (ctx.h[7]); + const u32x r1 = h32_from_64 (ctx.h[7]); + const u32x r2 = l32_from_64 (ctx.h[3]); + const u32x r3 = h32_from_64 (ctx.h[3]); + + COMPARE_S_SIMD (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m32500-pure.cl b/OpenCL/m32500-pure.cl new file mode 100644 index 000000000..a40ed2481 --- /dev/null +++ b/OpenCL/m32500-pure.cl @@ -0,0 +1,457 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +// #define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_rp.h) +#include M2S(INCLUDE_PATH/inc_rp.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha256.cl) +#include M2S(INCLUDE_PATH/inc_cipher_aes.cl) +#endif + +#define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl) +#define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl) + +typedef struct payload +{ + u32 pl_buf[64]; + u32 pl_len; + +} payload_t; + +typedef struct doge_tmp +{ + u32 ipad[8]; + u32 opad[8]; + + u32 dgst[32]; + u32 out[32]; + +} doge_tmp_t; + +DECLSPEC void hmac_sha256_run_V (PRIVATE_AS u32x *w0, PRIVATE_AS u32x *w1, PRIVATE_AS u32x *w2, PRIVATE_AS u32x *w3, PRIVATE_AS u32x *ipad, PRIVATE_AS u32x *opad, PRIVATE_AS u32x *digest) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform_vector (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform_vector (w0, w1, w2, w3, digest); +} + +//--------------------------------------------------------------------------------------- +CONSTANT_VK u32 base64_table[64] = +{ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', + 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', + 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', + 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', + 'w', 'x', 'y', 'z', '0', '1', '2', '3', + '4', '5', '6', '7', '8', '9', '+', '/', +}; + +// Wow it's the right file +DECLSPEC u32 base64_encode_three_bytes_better (u32 in) +{ + //in has 3 u8s in, first u8 is not set) + u32 out = 0; + + out |= base64_table[(in >> 18) & 0x3F] << 24; + out |= base64_table[(in >> 12) & 0x3F] << 16; + out |= base64_table[(in >> 6) & 0x3F] << 8; + out |= base64_table[(in >> 0) & 0x3F] << 0; + + return out; +} + +DECLSPEC void base64_encode_sha256 (u32 *out, const u32 *in) +{ + out[0] = base64_encode_three_bytes_better( (in[0] >> 8)); + out[1] = base64_encode_three_bytes_better((in[0] << 16) | (in[1] >> 16)); + out[2] = base64_encode_three_bytes_better((in[1] << 8) | (in[2] >> 24)); + out[3] = base64_encode_three_bytes_better((in[2] << 0)); + + out[4] = base64_encode_three_bytes_better( (in[3] >> 8)); + out[5] = base64_encode_three_bytes_better((in[3] << 16) | (in[4] >> 16)); + out[6] = base64_encode_three_bytes_better((in[4] << 8) | (in[5] >> 24)); + out[7] = base64_encode_three_bytes_better((in[5] << 0)); + + out[8] = base64_encode_three_bytes_better( (in[6] >> 8)); + out[9] = base64_encode_three_bytes_better((in[6] << 16) | (in[7] >> 16)); + + // 0x7c = ord('A') ^ ord('=') so replaces the A that we'll get at the end with an = + out[10] = base64_encode_three_bytes_better(in[7] << 8) ^ 0x7c; +} +//--------------------------------------------------------------------------------------- + +KERNEL_FQ void m32500_init (KERN_ATTR_TMPS_ESALT (doge_tmp_t, payload_t)) +{ + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + sha256_ctx_t ctx; + + sha256_init (&ctx); + sha256_update_global_swap (&ctx, pws[gid].i, pws[gid].pw_len); + sha256_final (&ctx); + + u32 w[16] = { 0 }; // only uses 11, but have to be 16 for sha256_hmac_init function + + base64_encode_sha256 (w, ctx.h); + + // pbkdf + + sha256_hmac_ctx_t sha256_hmac_ctx; + + sha256_hmac_init (&sha256_hmac_ctx, w, 44); + + tmps[gid].ipad[0] = sha256_hmac_ctx.ipad.h[0]; + tmps[gid].ipad[1] = sha256_hmac_ctx.ipad.h[1]; + tmps[gid].ipad[2] = sha256_hmac_ctx.ipad.h[2]; + tmps[gid].ipad[3] = sha256_hmac_ctx.ipad.h[3]; + tmps[gid].ipad[4] = sha256_hmac_ctx.ipad.h[4]; + tmps[gid].ipad[5] = sha256_hmac_ctx.ipad.h[5]; + tmps[gid].ipad[6] = sha256_hmac_ctx.ipad.h[6]; + tmps[gid].ipad[7] = sha256_hmac_ctx.ipad.h[7]; + + tmps[gid].opad[0] = sha256_hmac_ctx.opad.h[0]; + tmps[gid].opad[1] = sha256_hmac_ctx.opad.h[1]; + tmps[gid].opad[2] = sha256_hmac_ctx.opad.h[2]; + tmps[gid].opad[3] = sha256_hmac_ctx.opad.h[3]; + tmps[gid].opad[4] = sha256_hmac_ctx.opad.h[4]; + tmps[gid].opad[5] = sha256_hmac_ctx.opad.h[5]; + tmps[gid].opad[6] = sha256_hmac_ctx.opad.h[6]; + tmps[gid].opad[7] = sha256_hmac_ctx.opad.h[7]; + + sha256_hmac_update_global_swap (&sha256_hmac_ctx, salt_bufs[SALT_POS_HOST].salt_buf, salt_bufs[SALT_POS_HOST].salt_len); + + for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) + { + sha256_hmac_ctx_t sha256_hmac_ctx2 = sha256_hmac_ctx; + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + w0[0] = j; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + sha256_hmac_update_64 (&sha256_hmac_ctx2, w0, w1, w2, w3, 4); + + sha256_hmac_final (&sha256_hmac_ctx2); + + tmps[gid].dgst[i + 0] = sha256_hmac_ctx2.opad.h[0]; + tmps[gid].dgst[i + 1] = sha256_hmac_ctx2.opad.h[1]; + tmps[gid].dgst[i + 2] = sha256_hmac_ctx2.opad.h[2]; + tmps[gid].dgst[i + 3] = sha256_hmac_ctx2.opad.h[3]; + tmps[gid].dgst[i + 4] = sha256_hmac_ctx2.opad.h[4]; + tmps[gid].dgst[i + 5] = sha256_hmac_ctx2.opad.h[5]; + tmps[gid].dgst[i + 6] = sha256_hmac_ctx2.opad.h[6]; + tmps[gid].dgst[i + 7] = sha256_hmac_ctx2.opad.h[7]; + + tmps[gid].out[i + 0] = tmps[gid].dgst[i + 0]; + tmps[gid].out[i + 1] = tmps[gid].dgst[i + 1]; + tmps[gid].out[i + 2] = tmps[gid].dgst[i + 2]; + tmps[gid].out[i + 3] = tmps[gid].dgst[i + 3]; + tmps[gid].out[i + 4] = tmps[gid].dgst[i + 4]; + tmps[gid].out[i + 5] = tmps[gid].dgst[i + 5]; + tmps[gid].out[i + 6] = tmps[gid].dgst[i + 6]; + tmps[gid].out[i + 7] = tmps[gid].dgst[i + 7]; + } + +} + +KERNEL_FQ void m32500_loop (KERN_ATTR_TMPS_ESALT (doge_tmp_t, payload_t)) +{ + //pbkdf2hmac here + + const u64 gid = get_global_id (0); + + if ((gid * VECT_SIZE) >= GID_CNT) return; + + u32x ipad[8]; + u32x opad[8]; + + ipad[0] = packv (tmps, ipad, gid, 0); + ipad[1] = packv (tmps, ipad, gid, 1); + ipad[2] = packv (tmps, ipad, gid, 2); + ipad[3] = packv (tmps, ipad, gid, 3); + ipad[4] = packv (tmps, ipad, gid, 4); + ipad[5] = packv (tmps, ipad, gid, 5); + ipad[6] = packv (tmps, ipad, gid, 6); + ipad[7] = packv (tmps, ipad, gid, 7); + + opad[0] = packv (tmps, opad, gid, 0); + opad[1] = packv (tmps, opad, gid, 1); + opad[2] = packv (tmps, opad, gid, 2); + opad[3] = packv (tmps, opad, gid, 3); + opad[4] = packv (tmps, opad, gid, 4); + opad[5] = packv (tmps, opad, gid, 5); + opad[6] = packv (tmps, opad, gid, 6); + opad[7] = packv (tmps, opad, gid, 7); + + for (u32 i = 0; i < 8; i += 8) + { + u32x dgst[8]; + u32x out[8]; + + dgst[0] = packv (tmps, dgst, gid, i + 0); + dgst[1] = packv (tmps, dgst, gid, i + 1); + dgst[2] = packv (tmps, dgst, gid, i + 2); + dgst[3] = packv (tmps, dgst, gid, i + 3); + dgst[4] = packv (tmps, dgst, gid, i + 4); + dgst[5] = packv (tmps, dgst, gid, i + 5); + dgst[6] = packv (tmps, dgst, gid, i + 6); + dgst[7] = packv (tmps, dgst, gid, i + 7); + + out[0] = packv (tmps, out, gid, i + 0); + out[1] = packv (tmps, out, gid, i + 1); + out[2] = packv (tmps, out, gid, i + 2); + out[3] = packv (tmps, out, gid, i + 3); + out[4] = packv (tmps, out, gid, i + 4); + out[5] = packv (tmps, out, gid, i + 5); + out[6] = packv (tmps, out, gid, i + 6); + out[7] = packv (tmps, out, gid, i + 7); + + for (u32 j = 0; j < LOOP_CNT; j++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = dgst[5]; + w1[2] = dgst[6]; + w1[3] = dgst[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + hmac_sha256_run_V (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + unpackv (tmps, dgst, gid, i + 0, dgst[0]); + unpackv (tmps, dgst, gid, i + 1, dgst[1]); + unpackv (tmps, dgst, gid, i + 2, dgst[2]); + unpackv (tmps, dgst, gid, i + 3, dgst[3]); + unpackv (tmps, dgst, gid, i + 4, dgst[4]); + unpackv (tmps, dgst, gid, i + 5, dgst[5]); + unpackv (tmps, dgst, gid, i + 6, dgst[6]); + unpackv (tmps, dgst, gid, i + 7, dgst[7]); + + unpackv (tmps, out, gid, i + 0, out[0]); + unpackv (tmps, out, gid, i + 1, out[1]); + unpackv (tmps, out, gid, i + 2, out[2]); + unpackv (tmps, out, gid, i + 3, out[3]); + unpackv (tmps, out, gid, i + 4, out[4]); + unpackv (tmps, out, gid, i + 5, out[5]); + unpackv (tmps, out, gid, i + 6, out[6]); + unpackv (tmps, out, gid, i + 7, out[7]); + } +} + +KERNEL_FQ void m32500_comp (KERN_ATTR_TMPS_ESALT (doge_tmp_t, payload_t)) +{ + /** + * base + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id(0); + const u64 lsz = get_local_size(0); + + /** + * aes shared + */ + + #ifdef REAL_SHM + + LOCAL_VK u32 s_td0[256]; + LOCAL_VK u32 s_td1[256]; + LOCAL_VK u32 s_td2[256]; + LOCAL_VK u32 s_td3[256]; + LOCAL_VK u32 s_td4[256]; + + LOCAL_VK u32 s_te0[256]; + LOCAL_VK u32 s_te1[256]; + LOCAL_VK u32 s_te2[256]; + LOCAL_VK u32 s_te3[256]; + LOCAL_VK u32 s_te4[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + s_td0[i] = td0[i]; + s_td1[i] = td1[i]; + s_td2[i] = td2[i]; + s_td3[i] = td3[i]; + s_td4[i] = td4[i]; + + s_te0[i] = te0[i]; + s_te1[i] = te1[i]; + s_te2[i] = te2[i]; + s_te3[i] = te3[i]; + s_te4[i] = te4[i]; + } + + SYNC_THREADS(); + + #else + + CONSTANT_AS u32a* s_td0 = td0; + CONSTANT_AS u32a* s_td1 = td1; + CONSTANT_AS u32a* s_td2 = td2; + CONSTANT_AS u32a* s_td3 = td3; + CONSTANT_AS u32a* s_td4 = td4; + + CONSTANT_AS u32a* s_te0 = te0; + CONSTANT_AS u32a* s_te1 = te1; + CONSTANT_AS u32a* s_te2 = te2; + CONSTANT_AS u32a* s_te3 = te3; + CONSTANT_AS u32a* s_te4 = te4; + + #endif + + if (gid >= GID_CNT) return; + + u32 ukey[8]; + + ukey[0] = tmps[gid].out[0]; + ukey[1] = tmps[gid].out[1]; + ukey[2] = tmps[gid].out[2]; + ukey[3] = tmps[gid].out[3]; + ukey[4] = tmps[gid].out[4]; + ukey[5] = tmps[gid].out[5]; + ukey[6] = tmps[gid].out[6]; + ukey[7] = tmps[gid].out[7]; + + u32 ks[60]; + + AES256_set_decrypt_key (ks, ukey, s_te0, s_te1, s_te2, s_te3, s_td0, s_td1, s_td2, s_td3); + + // iv + + u32 prev_ct[4]; // iv is the first 4 u32s -> needs to be prev ct for cbc encryption (each block used prior ct) + // todo: might want to swap in module + + prev_ct[0] = hc_swap32 (esalt_bufs[DIGESTS_OFFSET_HOST].pl_buf[0]); + prev_ct[1] = hc_swap32 (esalt_bufs[DIGESTS_OFFSET_HOST].pl_buf[1]); + prev_ct[2] = hc_swap32 (esalt_bufs[DIGESTS_OFFSET_HOST].pl_buf[2]); + prev_ct[3] = hc_swap32 (esalt_bufs[DIGESTS_OFFSET_HOST].pl_buf[3]); + + u32 isAscii = 0; + + // ct + u32 ct_buf[4]; + + // Padding is Crypto.pad.iso10126 -pads with random bytes until the last byte, and which defines the number of padding bytes + // So knocking off last block to not account for any non-ascii padding + // todo: pkcs_padding_bs16() might be able to replace this + + for (u32 i = 4, j = 16; j < esalt_bufs[DIGESTS_OFFSET_HOST].pl_len - 16; i += 4, j += 16) + { + ct_buf[0] = hc_swap32_S (esalt_bufs[DIGESTS_OFFSET_HOST].pl_buf[i + 0]); + ct_buf[1] = hc_swap32_S (esalt_bufs[DIGESTS_OFFSET_HOST].pl_buf[i + 1]); + ct_buf[2] = hc_swap32_S (esalt_bufs[DIGESTS_OFFSET_HOST].pl_buf[i + 2]); + ct_buf[3] = hc_swap32_S (esalt_bufs[DIGESTS_OFFSET_HOST].pl_buf[i + 3]); + + u32 pt_buf[4]; + + AES256_decrypt (ks, ct_buf, pt_buf, s_td0, s_td1, s_td2, s_td3, s_td4); + + for (u32 x = 0; x < 4; x++) + { + pt_buf[x] ^= prev_ct[x]; + isAscii |= pt_buf[x] & 0x80808080; //check the ciphertext is human readable + prev_ct[x] = ct_buf[x]; //set previous CT as the new IV for the next block + } + } + + const u32 r0 = isAscii; + const u32 r1 = 0; + const u32 r2 = 0; + const u32 r3 = 0; + + #define il_pos 0 + + #ifdef KERNEL_STATIC + #include COMPARE_M + #endif +} diff --git a/OpenCL/m32600_a0-pure.cl b/OpenCL/m32600_a0-pure.cl new file mode 100644 index 000000000..b3200f1cf --- /dev/null +++ b/OpenCL/m32600_a0-pure.cl @@ -0,0 +1,233 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_rp.h) +#include M2S(INCLUDE_PATH/inc_rp.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_hash_whirlpool.cl) +#endif + +KERNEL_FQ void m32600_mxx (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * Whirlpool shared + */ + + #ifdef REAL_SHM + + LOCAL_VK u64 s_MT0[256]; + LOCAL_VK u64 s_MT1[256]; + LOCAL_VK u64 s_MT2[256]; + LOCAL_VK u64 s_MT3[256]; + LOCAL_VK u64 s_MT4[256]; + LOCAL_VK u64 s_MT5[256]; + LOCAL_VK u64 s_MT6[256]; + LOCAL_VK u64 s_MT7[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + s_MT0[i] = MT0[i]; + s_MT1[i] = MT1[i]; + s_MT2[i] = MT2[i]; + s_MT3[i] = MT3[i]; + s_MT4[i] = MT4[i]; + s_MT5[i] = MT5[i]; + s_MT6[i] = MT6[i]; + s_MT7[i] = MT7[i]; + } + + SYNC_THREADS (); + + #else + + CONSTANT_AS u64a *s_MT0 = MT0; + CONSTANT_AS u64a *s_MT1 = MT1; + CONSTANT_AS u64a *s_MT2 = MT2; + CONSTANT_AS u64a *s_MT3 = MT3; + CONSTANT_AS u64a *s_MT4 = MT4; + CONSTANT_AS u64a *s_MT5 = MT5; + CONSTANT_AS u64a *s_MT6 = MT6; + CONSTANT_AS u64a *s_MT7 = MT7; + + #endif + + if (gid >= GID_CNT) return; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32x s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32 (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + whirlpool_ctx_t ctx0; + + whirlpool_init (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7); + + whirlpool_update (&ctx0, s, salt_len); + + /** + * base + */ + + COPY_PW (pws[gid]); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + pw_t tmp = PASTE_PW; + + tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); + + whirlpool_ctx_t ctx = ctx0; + + whirlpool_update_swap (&ctx, tmp.i, tmp.pw_len); + + whirlpool_update (&ctx, s, salt_len); + + whirlpool_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_M_SCALAR (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m32600_sxx (KERN_ATTR_RULES ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * Whirlpool shared + */ + + #ifdef REAL_SHM + + LOCAL_VK u64 s_MT0[256]; + LOCAL_VK u64 s_MT1[256]; + LOCAL_VK u64 s_MT2[256]; + LOCAL_VK u64 s_MT3[256]; + LOCAL_VK u64 s_MT4[256]; + LOCAL_VK u64 s_MT5[256]; + LOCAL_VK u64 s_MT6[256]; + LOCAL_VK u64 s_MT7[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + s_MT0[i] = MT0[i]; + s_MT1[i] = MT1[i]; + s_MT2[i] = MT2[i]; + s_MT3[i] = MT3[i]; + s_MT4[i] = MT4[i]; + s_MT5[i] = MT5[i]; + s_MT6[i] = MT6[i]; + s_MT7[i] = MT7[i]; + } + + SYNC_THREADS (); + + #else + + CONSTANT_AS u64a *s_MT0 = MT0; + CONSTANT_AS u64a *s_MT1 = MT1; + CONSTANT_AS u64a *s_MT2 = MT2; + CONSTANT_AS u64a *s_MT3 = MT3; + CONSTANT_AS u64a *s_MT4 = MT4; + CONSTANT_AS u64a *s_MT5 = MT5; + CONSTANT_AS u64a *s_MT6 = MT6; + CONSTANT_AS u64a *s_MT7 = MT7; + + #endif + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32x s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32 (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + whirlpool_ctx_t ctx0; + + whirlpool_init (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7); + + whirlpool_update (&ctx0, s, salt_len); + + /** + * base + */ + + COPY_PW (pws[gid]); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + pw_t tmp = PASTE_PW; + + tmp.pw_len = apply_rules (rules_buf[il_pos].cmds, tmp.i, tmp.pw_len); + + whirlpool_ctx_t ctx = ctx0; + + whirlpool_update_swap (&ctx, tmp.i, tmp.pw_len); + + whirlpool_update (&ctx, s, salt_len); + + whirlpool_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_S_SCALAR (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m32600_a1-pure.cl b/OpenCL/m32600_a1-pure.cl new file mode 100644 index 000000000..40289ed35 --- /dev/null +++ b/OpenCL/m32600_a1-pure.cl @@ -0,0 +1,223 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +//#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_scalar.cl) +#include M2S(INCLUDE_PATH/inc_hash_whirlpool.cl) +#endif + +KERNEL_FQ void m32600_mxx (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * Whirlpool shared + */ + + #ifdef REAL_SHM + + LOCAL_VK u64 s_MT0[256]; + LOCAL_VK u64 s_MT1[256]; + LOCAL_VK u64 s_MT2[256]; + LOCAL_VK u64 s_MT3[256]; + LOCAL_VK u64 s_MT4[256]; + LOCAL_VK u64 s_MT5[256]; + LOCAL_VK u64 s_MT6[256]; + LOCAL_VK u64 s_MT7[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + s_MT0[i] = MT0[i]; + s_MT1[i] = MT1[i]; + s_MT2[i] = MT2[i]; + s_MT3[i] = MT3[i]; + s_MT4[i] = MT4[i]; + s_MT5[i] = MT5[i]; + s_MT6[i] = MT6[i]; + s_MT7[i] = MT7[i]; + } + + SYNC_THREADS (); + + #else + + CONSTANT_AS u64a *s_MT0 = MT0; + CONSTANT_AS u64a *s_MT1 = MT1; + CONSTANT_AS u64a *s_MT2 = MT2; + CONSTANT_AS u64a *s_MT3 = MT3; + CONSTANT_AS u64a *s_MT4 = MT4; + CONSTANT_AS u64a *s_MT5 = MT5; + CONSTANT_AS u64a *s_MT6 = MT6; + CONSTANT_AS u64a *s_MT7 = MT7; + + #endif + + if (gid >= GID_CNT) return; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32x s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32 (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + /** + * base + */ + + whirlpool_ctx_t ctx0; + + whirlpool_init (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7); + + whirlpool_update (&ctx0, s, salt_len); + + whirlpool_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + whirlpool_ctx_t ctx = ctx0; + + whirlpool_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); + + whirlpool_update (&ctx, s, salt_len); + + whirlpool_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_M_SCALAR (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m32600_sxx (KERN_ATTR_BASIC ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * Whirlpool shared + */ + + #ifdef REAL_SHM + + LOCAL_VK u64 s_MT0[256]; + LOCAL_VK u64 s_MT1[256]; + LOCAL_VK u64 s_MT2[256]; + LOCAL_VK u64 s_MT3[256]; + LOCAL_VK u64 s_MT4[256]; + LOCAL_VK u64 s_MT5[256]; + LOCAL_VK u64 s_MT6[256]; + LOCAL_VK u64 s_MT7[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + s_MT0[i] = MT0[i]; + s_MT1[i] = MT1[i]; + s_MT2[i] = MT2[i]; + s_MT3[i] = MT3[i]; + s_MT4[i] = MT4[i]; + s_MT5[i] = MT5[i]; + s_MT6[i] = MT6[i]; + s_MT7[i] = MT7[i]; + } + + SYNC_THREADS (); + + #else + + CONSTANT_AS u64a *s_MT0 = MT0; + CONSTANT_AS u64a *s_MT1 = MT1; + CONSTANT_AS u64a *s_MT2 = MT2; + CONSTANT_AS u64a *s_MT3 = MT3; + CONSTANT_AS u64a *s_MT4 = MT4; + CONSTANT_AS u64a *s_MT5 = MT5; + CONSTANT_AS u64a *s_MT6 = MT6; + CONSTANT_AS u64a *s_MT7 = MT7; + + #endif + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32x s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32 (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + /** + * base + */ + + whirlpool_ctx_t ctx0; + + whirlpool_init (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7); + + whirlpool_update (&ctx0, s, salt_len); + + whirlpool_update_global_swap (&ctx0, pws[gid].i, pws[gid].pw_len); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos++) + { + whirlpool_ctx_t ctx = ctx0; + + whirlpool_update_global_swap (&ctx, combs_buf[il_pos].i, combs_buf[il_pos].pw_len); + + whirlpool_update (&ctx, s, salt_len); + + whirlpool_final (&ctx); + + const u32 r0 = ctx.h[DGST_R0]; + const u32 r1 = ctx.h[DGST_R1]; + const u32 r2 = ctx.h[DGST_R2]; + const u32 r3 = ctx.h[DGST_R3]; + + COMPARE_S_SCALAR (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m32600_a3-pure.cl b/OpenCL/m32600_a3-pure.cl new file mode 100644 index 000000000..173ba4381 --- /dev/null +++ b/OpenCL/m32600_a3-pure.cl @@ -0,0 +1,253 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#define NEW_SIMD_CODE + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_simd.cl) +#include M2S(INCLUDE_PATH/inc_hash_whirlpool.cl) +#endif + +KERNEL_FQ void m32600_mxx (KERN_ATTR_VECTOR ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * Whirlpool shared + */ + + #ifdef REAL_SHM + + LOCAL_VK u64 s_MT0[256]; + LOCAL_VK u64 s_MT1[256]; + LOCAL_VK u64 s_MT2[256]; + LOCAL_VK u64 s_MT3[256]; + LOCAL_VK u64 s_MT4[256]; + LOCAL_VK u64 s_MT5[256]; + LOCAL_VK u64 s_MT6[256]; + LOCAL_VK u64 s_MT7[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + s_MT0[i] = MT0[i]; + s_MT1[i] = MT1[i]; + s_MT2[i] = MT2[i]; + s_MT3[i] = MT3[i]; + s_MT4[i] = MT4[i]; + s_MT5[i] = MT5[i]; + s_MT6[i] = MT6[i]; + s_MT7[i] = MT7[i]; + } + + SYNC_THREADS (); + + #else + + CONSTANT_AS u64a *s_MT0 = MT0; + CONSTANT_AS u64a *s_MT1 = MT1; + CONSTANT_AS u64a *s_MT2 = MT2; + CONSTANT_AS u64a *s_MT3 = MT3; + CONSTANT_AS u64a *s_MT4 = MT4; + CONSTANT_AS u64a *s_MT5 = MT5; + CONSTANT_AS u64a *s_MT6 = MT6; + CONSTANT_AS u64a *s_MT7 = MT7; + + #endif + + if (gid >= GID_CNT) return; + + /** + * base + */ + + const u32 pw_len = pws[gid].pw_len; + + u32x w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32x s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32 (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + whirlpool_ctx_vector_t ctx0; + + whirlpool_init_vector (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7); + + whirlpool_update_vector (&ctx0, s, salt_len); + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0 = w0l | w0r; + + w[0] = w0; + + whirlpool_ctx_vector_t ctx = ctx0; + + whirlpool_update_vector (&ctx, w, pw_len); + + whirlpool_update_vector (&ctx, s, salt_len); + + whirlpool_final_vector (&ctx); + + const u32x r0 = ctx.h[DGST_R0]; + const u32x r1 = ctx.h[DGST_R1]; + const u32x r2 = ctx.h[DGST_R2]; + const u32x r3 = ctx.h[DGST_R3]; + + COMPARE_M_SIMD (r0, r1, r2, r3); + } +} + +KERNEL_FQ void m32600_sxx (KERN_ATTR_VECTOR ()) +{ + /** + * modifier + */ + + const u64 gid = get_global_id (0); + const u64 lid = get_local_id (0); + const u64 lsz = get_local_size (0); + + /** + * Whirlpool shared + */ + + #ifdef REAL_SHM + + LOCAL_VK u64 s_MT0[256]; + LOCAL_VK u64 s_MT1[256]; + LOCAL_VK u64 s_MT2[256]; + LOCAL_VK u64 s_MT3[256]; + LOCAL_VK u64 s_MT4[256]; + LOCAL_VK u64 s_MT5[256]; + LOCAL_VK u64 s_MT6[256]; + LOCAL_VK u64 s_MT7[256]; + + for (u32 i = lid; i < 256; i += lsz) + { + s_MT0[i] = MT0[i]; + s_MT1[i] = MT1[i]; + s_MT2[i] = MT2[i]; + s_MT3[i] = MT3[i]; + s_MT4[i] = MT4[i]; + s_MT5[i] = MT5[i]; + s_MT6[i] = MT6[i]; + s_MT7[i] = MT7[i]; + } + + SYNC_THREADS (); + + #else + + CONSTANT_AS u64a *s_MT0 = MT0; + CONSTANT_AS u64a *s_MT1 = MT1; + CONSTANT_AS u64a *s_MT2 = MT2; + CONSTANT_AS u64a *s_MT3 = MT3; + CONSTANT_AS u64a *s_MT4 = MT4; + CONSTANT_AS u64a *s_MT5 = MT5; + CONSTANT_AS u64a *s_MT6 = MT6; + CONSTANT_AS u64a *s_MT7 = MT7; + + #endif + + if (gid >= GID_CNT) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R0], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R1], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R2], + digests_buf[DIGESTS_OFFSET_HOST].digest_buf[DGST_R3] + }; + + /** + * base + */ + + const u32 pw_len = pws[gid].pw_len; + + u32x w[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < pw_len; i += 4, idx += 1) + { + w[idx] = pws[gid].i[idx]; + } + + const u32 salt_len = salt_bufs[SALT_POS_HOST].salt_len; + + u32x s[64] = { 0 }; + + for (u32 i = 0, idx = 0; i < salt_len; i += 4, idx += 1) + { + s[idx] = hc_swap32 (salt_bufs[SALT_POS_HOST].salt_buf[idx]); + } + + whirlpool_ctx_vector_t ctx0; + + whirlpool_init_vector (&ctx0, s_MT0, s_MT1, s_MT2, s_MT3, s_MT4, s_MT5, s_MT6, s_MT7); + + whirlpool_update_vector (&ctx0, s, salt_len); + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < IL_CNT; il_pos += VECT_SIZE) + { + const u32x w0r = words_buf_r[il_pos / VECT_SIZE]; + + const u32x w0 = w0l | w0r; + + w[0] = w0; + + whirlpool_ctx_vector_t ctx = ctx0; + + whirlpool_update_vector (&ctx, w, pw_len); + + whirlpool_update_vector (&ctx, s, salt_len); + + whirlpool_final_vector (&ctx); + + const u32x r0 = ctx.h[DGST_R0]; + const u32x r1 = ctx.h[DGST_R1]; + const u32x r2 = ctx.h[DGST_R2]; + const u32x r3 = ctx.h[DGST_R3]; + + COMPARE_S_SIMD (r0, r1, r2, r3); + } +} diff --git a/OpenCL/m32700-pure.cl b/OpenCL/m32700-pure.cl new file mode 100644 index 000000000..4f25d3020 --- /dev/null +++ b/OpenCL/m32700-pure.cl @@ -0,0 +1,232 @@ +/** + * Author......: hansvh + * License.....: MIT + */ + +#ifdef KERNEL_STATIC +#include M2S(INCLUDE_PATH/inc_vendor.h) +#include M2S(INCLUDE_PATH/inc_types.h) +#include M2S(INCLUDE_PATH/inc_platform.cl) +#include M2S(INCLUDE_PATH/inc_common.cl) +#include M2S(INCLUDE_PATH/inc_hash_sha1.cl) +#endif + +#define COMPARE_S M2S(INCLUDE_PATH/inc_comp_single.cl) +#define COMPARE_M M2S(INCLUDE_PATH/inc_comp_multi.cl) + +typedef struct sha1_tmp +{ + u32 salt32[8]; + u32 newdes_key32[60]; + +} sha1_tmp_t; + +CONSTANT_VK u32 newdes_rotor[256] = +{ + 0x20, 0x89, 0xef, 0xbc, 0x66, 0x7d, 0xdd, 0x48, 0xd4, 0x44, 0x51, 0x25, 0x56, 0xed, 0x93, 0x95, + 0x46, 0xe5, 0x11, 0x7c, 0x73, 0xcf, 0x21, 0x14, 0x7a, 0x8f, 0x19, 0xd7, 0x33, 0xb7, 0x8a, 0x8e, + 0x92, 0xd3, 0x6e, 0xad, 0x01, 0xe4, 0xbd, 0x0e, 0x67, 0x4e, 0xa2, 0x24, 0xfd, 0xa7, 0x74, 0xff, + 0x9e, 0x2d, 0xb9, 0x32, 0x62, 0xa8, 0xfa, 0xeb, 0x36, 0x8d, 0xc3, 0xf7, 0xf0, 0x3f, 0x94, 0x02, + 0xe0, 0xa9, 0xd6, 0xb4, 0x3e, 0x16, 0x75, 0x6c, 0x13, 0xac, 0xa1, 0x9f, 0xa0, 0x2f, 0x2b, 0xab, + 0xc2, 0xaf, 0xb2, 0x38, 0xc4, 0x70, 0x17, 0xdc, 0x59, 0x15, 0xa4, 0x82, 0x9d, 0x08, 0x55, 0xfb, + 0xd8, 0x2c, 0x5e, 0xb3, 0xe2, 0x26, 0x5a, 0x77, 0x28, 0xca, 0x22, 0xce, 0x23, 0x45, 0xe7, 0xf6, + 0x1d, 0x6d, 0x4a, 0x47, 0xb0, 0x06, 0x3c, 0x91, 0x41, 0x0d, 0x4d, 0x97, 0x0c, 0x7f, 0x5f, 0xc7, + 0x39, 0x65, 0x05, 0xe8, 0x96, 0xd2, 0x81, 0x18, 0xb5, 0x0a, 0x79, 0xbb, 0x30, 0xc1, 0x8b, 0xfc, + 0xdb, 0x40, 0x58, 0xe9, 0x60, 0x80, 0x50, 0x35, 0xbf, 0x90, 0xda, 0x0b, 0x6a, 0x84, 0x9b, 0x68, + 0x5b, 0x88, 0x1f, 0x2a, 0xf3, 0x42, 0x7e, 0x87, 0x1e, 0x1a, 0x57, 0xba, 0xb6, 0x9a, 0xf2, 0x7b, + 0x52, 0xa6, 0xd0, 0x27, 0x98, 0xbe, 0x71, 0xcd, 0x72, 0x69, 0xe1, 0x54, 0x49, 0xa3, 0x63, 0x6f, + 0xcc, 0x3d, 0xc8, 0xd9, 0xaa, 0x0f, 0xc6, 0x1c, 0xc0, 0xfe, 0x86, 0xea, 0xde, 0x07, 0xec, 0xf8, + 0xc9, 0x29, 0xb1, 0x9c, 0x5c, 0x83, 0x43, 0xf9, 0xf5, 0xb8, 0xcb, 0x09, 0xf1, 0x00, 0x1b, 0x2e, + 0x85, 0xae, 0x4b, 0x12, 0x5d, 0xd1, 0x64, 0x78, 0x4c, 0xd5, 0x10, 0x53, 0x04, 0x6b, 0x8c, 0x34, + 0x3a, 0x37, 0x03, 0xf4, 0x61, 0xc5, 0xee, 0xe3, 0x76, 0x31, 0x4f, 0xe6, 0xdf, 0xa5, 0x99, 0x3b, +}; + +DECLSPEC void new_des (u32 *block, u32 *newdes_key) +{ + #define B0 (*(block+0)) + #define B1 (*(block+1)) + #define B2 (*(block+2)) + #define B3 (*(block+3)) + #define B4 (*(block+4)) + #define B5 (*(block+5)) + #define B6 (*(block+6)) + #define B7 (*(block+7)) + + for (int count = 0; count < 8; count++) + { + B4 = B4 ^ newdes_rotor[B0 ^ *(newdes_key++)]; + B5 = B5 ^ newdes_rotor[B1 ^ *(newdes_key++)]; + B6 = B6 ^ newdes_rotor[B2 ^ *(newdes_key++)]; + B7 = B7 ^ newdes_rotor[B3 ^ *(newdes_key++)]; + + B1 = B1 ^ newdes_rotor[B4 ^ *(newdes_key++)]; + B2 = B2 ^ newdes_rotor[B4 ^ B5]; + B3 = B3 ^ newdes_rotor[B6 ^ *(newdes_key++)]; + B0 = B0 ^ newdes_rotor[B7 ^ *(newdes_key++)]; + } + + B4 = B4 ^ newdes_rotor[B0 ^ *(newdes_key++)]; + B5 = B5 ^ newdes_rotor[B1 ^ *(newdes_key++)]; + B6 = B6 ^ newdes_rotor[B2 ^ *(newdes_key++)]; + B7 = B7 ^ newdes_rotor[B3 ^ *(newdes_key++)]; +} + +DECLSPEC void key_expansion (const u8 *sha1sum, u32 *result) +{ + for (int count = 0; count < 15; count++) + { + const u8 shi = sha1sum[count]; + + result[0] = shi; + result[1] = shi ^ sha1sum[7]; // ??? will be always zero for byte 24, 29, 34 + result[2] = shi ^ sha1sum[8]; + result[3] = shi ^ sha1sum[9]; + + result += 4; + } +} + +DECLSPEC void sha1_final_32700 (PRIVATE_AS sha1_ctx_t *ctx) +{ + const int pos = ctx->len & 63; + + append_0x80_4x4_S (ctx->w0, ctx->w1, ctx->w2, ctx->w3, pos); + + if (pos >= 56) + { + sha1_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); + + ctx->w0[0] = 0; + ctx->w0[1] = 0; + ctx->w0[2] = 0; + ctx->w0[3] = 0; + ctx->w1[0] = 0; + ctx->w1[1] = 0; + ctx->w1[2] = 0; + ctx->w1[3] = 0; + ctx->w2[0] = 0; + ctx->w2[1] = 0; + ctx->w2[2] = 0; + ctx->w2[3] = 0; + ctx->w3[0] = 0; + ctx->w3[1] = 0; + ctx->w3[2] = 0; + ctx->w3[3] = 0; + } + + ctx->w3[2] = 0; + ctx->w3[3] = hc_swap32_S (ctx->len * 8); + + sha1_transform (ctx->w0, ctx->w1, ctx->w2, ctx->w3, ctx->h); +} + +KERNEL_FQ void m32700_init (KERN_ATTR_TMPS (sha1_tmp_t)) +{ + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + // Initial "SHA-1" (with endianness bug) + sha1_ctx_t ctx; + + sha1_init (&ctx); + sha1_update_global (&ctx, pws[gid].i, pws[gid].pw_len); + sha1_final_32700 (&ctx); + // sha1_final (&ctx); + + ctx.h[0] = hc_swap32_S (ctx.h[0]); + ctx.h[1] = hc_swap32_S (ctx.h[1]); + ctx.h[2] = hc_swap32_S (ctx.h[2]); + ctx.h[3] = hc_swap32_S (ctx.h[3]); + ctx.h[4] = hc_swap32_S (ctx.h[4]); + + // Crate a NewDES key + u32 newdes_key32[60]; + + key_expansion ((const u8 *) ctx.h, newdes_key32); + + for (int i = 0; i < 60; i++) + { + tmps[gid].newdes_key32[i] = newdes_key32[i]; + } + + for (int i = 0, j = 0; i < 8; i += 4, j += 1) + { + const u32 salt = salt_bufs[SALT_POS_HOST].salt_buf[j]; + + tmps[gid].salt32[i + 0] = unpack_v8a_from_v32_S (salt); + tmps[gid].salt32[i + 1] = unpack_v8b_from_v32_S (salt); + tmps[gid].salt32[i + 2] = unpack_v8c_from_v32_S (salt); + tmps[gid].salt32[i + 3] = unpack_v8d_from_v32_S (salt); + } +} + +KERNEL_FQ void m32700_loop (KERN_ATTR_TMPS (sha1_tmp_t)) +{ + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + u32 newdes_key32[60]; + + for (int i = 0; i < 60; i++) + { + newdes_key32[i] = tmps[gid].newdes_key32[i]; + } + + u32 salt32[8]; + + for (int i = 0; i < 8; i++) + { + salt32[i] = tmps[gid].salt32[i]; + } + + // Run 1000 iterations of NewDES on the derived salt + for (int i = 0; i < LOOP_CNT; i++) + { + new_des (salt32, newdes_key32); + } + + for (int i = 0; i < 8; i++) + { + tmps[gid].salt32[i] = salt32[i]; + } +} + +KERNEL_FQ void m32700_comp (KERN_ATTR_TMPS (sha1_tmp_t)) +{ + const u64 gid = get_global_id (0); + + if (gid >= GID_CNT) return; + + u32 salt[16] = { 0 }; + + salt[0] = (tmps[gid].salt32[0] << 0) + | (tmps[gid].salt32[1] << 8) + | (tmps[gid].salt32[2] << 16) + | (tmps[gid].salt32[3] << 24); + + salt[1] = (tmps[gid].salt32[4] << 0) + | (tmps[gid].salt32[5] << 8) + | (tmps[gid].salt32[6] << 16) + | (tmps[gid].salt32[7] << 24); + + // Final "SHA-1" (with endianness bug) + sha1_ctx_t ctx; + + sha1_init (&ctx); + sha1_update (&ctx, salt, 8); + sha1_update_global (&ctx, pws[gid].i, pws[gid].pw_len); + sha1_final_32700 (&ctx); + + const u32 r0 = ctx.h[0]; + const u32 r1 = ctx.h[1]; + const u32 r2 = ctx.h[2]; + const u32 r3 = ctx.h[3]; + + #define il_pos 0 + + #ifdef KERNEL_STATIC + #include COMPARE_M + #endif +} diff --git a/charsets/standard/Romanian/ro_ISO-8859-2.hcchr b/charsets/standard/Romanian/ro_ISO-8859-2.hcchr new file mode 100644 index 000000000..d2c3fbd3d --- /dev/null +++ b/charsets/standard/Romanian/ro_ISO-8859-2.hcchr @@ -0,0 +1 @@ +aăâbcdefghiîjklmnopqrsștțuvwxyzAĂÂBCDEFGHIÎJKLMNOPQRSȘTȚUVWXYZ diff --git a/deps/LZMA-SDK/C/7z.h b/deps/LZMA-SDK/C/7z.h index 969523cd3..304f75ffc 100644 --- a/deps/LZMA-SDK/C/7z.h +++ b/deps/LZMA-SDK/C/7z.h @@ -1,204 +1,204 @@ -/* 7z.h -- 7z interface -2018-07-02 : Igor Pavlov : Public domain */ - -#ifndef __7Z_H -#define __7Z_H - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -#define k7zStartHeaderSize 0x20 -#define k7zSignatureSize 6 - -extern const Byte k7zSignature[k7zSignatureSize]; - -typedef struct -{ - const Byte *Data; - size_t Size; -} CSzData; - -/* CSzCoderInfo & CSzFolder support only default methods */ - -typedef struct -{ - size_t PropsOffset; - UInt32 MethodID; - Byte NumStreams; - Byte PropsSize; -} CSzCoderInfo; - -typedef struct -{ - UInt32 InIndex; - UInt32 OutIndex; -} CSzBond; - -#define SZ_NUM_CODERS_IN_FOLDER_MAX 4 -#define SZ_NUM_BONDS_IN_FOLDER_MAX 3 -#define SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX 4 - -typedef struct -{ - UInt32 NumCoders; - UInt32 NumBonds; - UInt32 NumPackStreams; - UInt32 UnpackStream; - UInt32 PackStreams[SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX]; - CSzBond Bonds[SZ_NUM_BONDS_IN_FOLDER_MAX]; - CSzCoderInfo Coders[SZ_NUM_CODERS_IN_FOLDER_MAX]; -} CSzFolder; - - -SRes SzGetNextFolderItem(CSzFolder *f, CSzData *sd); - -typedef struct -{ - UInt32 Low; - UInt32 High; -} CNtfsFileTime; - -typedef struct -{ - Byte *Defs; /* MSB 0 bit numbering */ - UInt32 *Vals; -} CSzBitUi32s; - -typedef struct -{ - Byte *Defs; /* MSB 0 bit numbering */ - // UInt64 *Vals; - CNtfsFileTime *Vals; -} CSzBitUi64s; - -#define SzBitArray_Check(p, i) (((p)[(i) >> 3] & (0x80 >> ((i) & 7))) != 0) - -#define SzBitWithVals_Check(p, i) ((p)->Defs && ((p)->Defs[(i) >> 3] & (0x80 >> ((i) & 7))) != 0) - -typedef struct -{ - UInt32 NumPackStreams; - UInt32 NumFolders; - - UInt64 *PackPositions; // NumPackStreams + 1 - CSzBitUi32s FolderCRCs; // NumFolders - - size_t *FoCodersOffsets; // NumFolders + 1 - UInt32 *FoStartPackStreamIndex; // NumFolders + 1 - UInt32 *FoToCoderUnpackSizes; // NumFolders + 1 - Byte *FoToMainUnpackSizeIndex; // NumFolders - UInt64 *CoderUnpackSizes; // for all coders in all folders - - Byte *CodersData; - - UInt64 RangeLimit; -} CSzAr; - -UInt64 SzAr_GetFolderUnpackSize(const CSzAr *p, UInt32 folderIndex); - -SRes SzAr_DecodeFolder(const CSzAr *p, UInt32 folderIndex, - ILookInStream *stream, UInt64 startPos, - Byte *outBuffer, size_t outSize, - ISzAllocPtr allocMain); - -typedef struct -{ - CSzAr db; - - UInt64 startPosAfterHeader; - UInt64 dataPos; - - UInt32 NumFiles; - - UInt64 *UnpackPositions; // NumFiles + 1 - // Byte *IsEmptyFiles; - Byte *IsDirs; - CSzBitUi32s CRCs; - - CSzBitUi32s Attribs; - // CSzBitUi32s Parents; - CSzBitUi64s MTime; - CSzBitUi64s CTime; - - UInt32 *FolderToFile; // NumFolders + 1 - UInt32 *FileToFolder; // NumFiles - - size_t *FileNameOffsets; /* in 2-byte steps */ - Byte *FileNames; /* UTF-16-LE */ -} CSzArEx; - -#define SzArEx_IsDir(p, i) (SzBitArray_Check((p)->IsDirs, i)) - -#define SzArEx_GetFileSize(p, i) ((p)->UnpackPositions[(i) + 1] - (p)->UnpackPositions[i]) - -void SzArEx_Init(CSzArEx *p); -void SzArEx_Free(CSzArEx *p, ISzAllocPtr alloc); -UInt64 SzArEx_GetFolderStreamPos(const CSzArEx *p, UInt32 folderIndex, UInt32 indexInFolder); -int SzArEx_GetFolderFullPackSize(const CSzArEx *p, UInt32 folderIndex, UInt64 *resSize); - -/* -if dest == NULL, the return value specifies the required size of the buffer, - in 16-bit characters, including the null-terminating character. -if dest != NULL, the return value specifies the number of 16-bit characters that - are written to the dest, including the null-terminating character. */ - -size_t SzArEx_GetFileNameUtf16(const CSzArEx *p, size_t fileIndex, UInt16 *dest); - -/* -size_t SzArEx_GetFullNameLen(const CSzArEx *p, size_t fileIndex); -UInt16 *SzArEx_GetFullNameUtf16_Back(const CSzArEx *p, size_t fileIndex, UInt16 *dest); -*/ - - - -/* - SzArEx_Extract extracts file from archive - - *outBuffer must be 0 before first call for each new archive. - - Extracting cache: - If you need to decompress more than one file, you can send - these values from previous call: - *blockIndex, - *outBuffer, - *outBufferSize - You can consider "*outBuffer" as cache of solid block. If your archive is solid, - it will increase decompression speed. - - If you use external function, you can declare these 3 cache variables - (blockIndex, outBuffer, outBufferSize) as static in that external function. - - Free *outBuffer and set *outBuffer to 0, if you want to flush cache. -*/ - -SRes SzArEx_Extract( - const CSzArEx *db, - ILookInStream *inStream, - UInt32 fileIndex, /* index of file */ - UInt32 *blockIndex, /* index of solid block */ - Byte **outBuffer, /* pointer to pointer to output buffer (allocated with allocMain) */ - size_t *outBufferSize, /* buffer size for output buffer */ - size_t *offset, /* offset of stream for required file in *outBuffer */ - size_t *outSizeProcessed, /* size of file in *outBuffer */ - ISzAllocPtr allocMain, - ISzAllocPtr allocTemp); - - -/* -SzArEx_Open Errors: -SZ_ERROR_NO_ARCHIVE -SZ_ERROR_ARCHIVE -SZ_ERROR_UNSUPPORTED -SZ_ERROR_MEM -SZ_ERROR_CRC -SZ_ERROR_INPUT_EOF -SZ_ERROR_FAIL -*/ - -SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream, - ISzAllocPtr allocMain, ISzAllocPtr allocTemp); - -EXTERN_C_END - -#endif +/* 7z.h -- 7z interface +2018-07-02 : Igor Pavlov : Public domain */ + +#ifndef __7Z_H +#define __7Z_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +#define k7zStartHeaderSize 0x20 +#define k7zSignatureSize 6 + +extern const Byte k7zSignature[k7zSignatureSize]; + +typedef struct +{ + const Byte *Data; + size_t Size; +} CSzData; + +/* CSzCoderInfo & CSzFolder support only default methods */ + +typedef struct +{ + size_t PropsOffset; + UInt32 MethodID; + Byte NumStreams; + Byte PropsSize; +} CSzCoderInfo; + +typedef struct +{ + UInt32 InIndex; + UInt32 OutIndex; +} CSzBond; + +#define SZ_NUM_CODERS_IN_FOLDER_MAX 4 +#define SZ_NUM_BONDS_IN_FOLDER_MAX 3 +#define SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX 4 + +typedef struct +{ + UInt32 NumCoders; + UInt32 NumBonds; + UInt32 NumPackStreams; + UInt32 UnpackStream; + UInt32 PackStreams[SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX]; + CSzBond Bonds[SZ_NUM_BONDS_IN_FOLDER_MAX]; + CSzCoderInfo Coders[SZ_NUM_CODERS_IN_FOLDER_MAX]; +} CSzFolder; + + +SRes SzGetNextFolderItem(CSzFolder *f, CSzData *sd); + +typedef struct +{ + UInt32 Low; + UInt32 High; +} CNtfsFileTime; + +typedef struct +{ + Byte *Defs; /* MSB 0 bit numbering */ + UInt32 *Vals; +} CSzBitUi32s; + +typedef struct +{ + Byte *Defs; /* MSB 0 bit numbering */ + // UInt64 *Vals; + CNtfsFileTime *Vals; +} CSzBitUi64s; + +#define SzBitArray_Check(p, i) (((p)[(i) >> 3] & (0x80 >> ((i) & 7))) != 0) + +#define SzBitWithVals_Check(p, i) ((p)->Defs && ((p)->Defs[(i) >> 3] & (0x80 >> ((i) & 7))) != 0) + +typedef struct +{ + UInt32 NumPackStreams; + UInt32 NumFolders; + + UInt64 *PackPositions; // NumPackStreams + 1 + CSzBitUi32s FolderCRCs; // NumFolders + + size_t *FoCodersOffsets; // NumFolders + 1 + UInt32 *FoStartPackStreamIndex; // NumFolders + 1 + UInt32 *FoToCoderUnpackSizes; // NumFolders + 1 + Byte *FoToMainUnpackSizeIndex; // NumFolders + UInt64 *CoderUnpackSizes; // for all coders in all folders + + Byte *CodersData; + + UInt64 RangeLimit; +} CSzAr; + +UInt64 SzAr_GetFolderUnpackSize(const CSzAr *p, UInt32 folderIndex); + +SRes SzAr_DecodeFolder(const CSzAr *p, UInt32 folderIndex, + ILookInStream *stream, UInt64 startPos, + Byte *outBuffer, size_t outSize, + ISzAllocPtr allocMain); + +typedef struct +{ + CSzAr db; + + UInt64 startPosAfterHeader; + UInt64 dataPos; + + UInt32 NumFiles; + + UInt64 *UnpackPositions; // NumFiles + 1 + // Byte *IsEmptyFiles; + Byte *IsDirs; + CSzBitUi32s CRCs; + + CSzBitUi32s Attribs; + // CSzBitUi32s Parents; + CSzBitUi64s MTime; + CSzBitUi64s CTime; + + UInt32 *FolderToFile; // NumFolders + 1 + UInt32 *FileToFolder; // NumFiles + + size_t *FileNameOffsets; /* in 2-byte steps */ + Byte *FileNames; /* UTF-16-LE */ +} CSzArEx; + +#define SzArEx_IsDir(p, i) (SzBitArray_Check((p)->IsDirs, i)) + +#define SzArEx_GetFileSize(p, i) ((p)->UnpackPositions[(i) + 1] - (p)->UnpackPositions[i]) + +void SzArEx_Init(CSzArEx *p); +void SzArEx_Free(CSzArEx *p, ISzAllocPtr alloc); +UInt64 SzArEx_GetFolderStreamPos(const CSzArEx *p, UInt32 folderIndex, UInt32 indexInFolder); +int SzArEx_GetFolderFullPackSize(const CSzArEx *p, UInt32 folderIndex, UInt64 *resSize); + +/* +if dest == NULL, the return value specifies the required size of the buffer, + in 16-bit characters, including the null-terminating character. +if dest != NULL, the return value specifies the number of 16-bit characters that + are written to the dest, including the null-terminating character. */ + +size_t SzArEx_GetFileNameUtf16(const CSzArEx *p, size_t fileIndex, UInt16 *dest); + +/* +size_t SzArEx_GetFullNameLen(const CSzArEx *p, size_t fileIndex); +UInt16 *SzArEx_GetFullNameUtf16_Back(const CSzArEx *p, size_t fileIndex, UInt16 *dest); +*/ + + + +/* + SzArEx_Extract extracts file from archive + + *outBuffer must be 0 before first call for each new archive. + + Extracting cache: + If you need to decompress more than one file, you can send + these values from previous call: + *blockIndex, + *outBuffer, + *outBufferSize + You can consider "*outBuffer" as cache of solid block. If your archive is solid, + it will increase decompression speed. + + If you use external function, you can declare these 3 cache variables + (blockIndex, outBuffer, outBufferSize) as static in that external function. + + Free *outBuffer and set *outBuffer to 0, if you want to flush cache. +*/ + +SRes SzArEx_Extract( + const CSzArEx *db, + ILookInStream *inStream, + UInt32 fileIndex, /* index of file */ + UInt32 *blockIndex, /* index of solid block */ + Byte **outBuffer, /* pointer to pointer to output buffer (allocated with allocMain) */ + size_t *outBufferSize, /* buffer size for output buffer */ + size_t *offset, /* offset of stream for required file in *outBuffer */ + size_t *outSizeProcessed, /* size of file in *outBuffer */ + ISzAllocPtr allocMain, + ISzAllocPtr allocTemp); + + +/* +SzArEx_Open Errors: +SZ_ERROR_NO_ARCHIVE +SZ_ERROR_ARCHIVE +SZ_ERROR_UNSUPPORTED +SZ_ERROR_MEM +SZ_ERROR_CRC +SZ_ERROR_INPUT_EOF +SZ_ERROR_FAIL +*/ + +SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream, + ISzAllocPtr allocMain, ISzAllocPtr allocTemp); + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/7zAlloc.c b/deps/LZMA-SDK/C/7zAlloc.c index ea32809c6..c924a529f 100644 --- a/deps/LZMA-SDK/C/7zAlloc.c +++ b/deps/LZMA-SDK/C/7zAlloc.c @@ -1,80 +1,80 @@ -/* 7zAlloc.c -- Allocation functions -2017-04-03 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include - -#include "7zAlloc.h" - -/* #define _SZ_ALLOC_DEBUG */ -/* use _SZ_ALLOC_DEBUG to debug alloc/free operations */ - -#ifdef _SZ_ALLOC_DEBUG - -#ifdef _WIN32 -#include -#endif - -#include -int g_allocCount = 0; -int g_allocCountTemp = 0; - -#endif - -void *SzAlloc(ISzAllocPtr p, size_t size) -{ - UNUSED_VAR(p); - if (size == 0) - return 0; - #ifdef _SZ_ALLOC_DEBUG - fprintf(stderr, "\nAlloc %10u bytes; count = %10d", (unsigned)size, g_allocCount); - g_allocCount++; - #endif - return malloc(size); -} - -void SzFree(ISzAllocPtr p, void *address) -{ - UNUSED_VAR(p); - #ifdef _SZ_ALLOC_DEBUG - if (address != 0) - { - g_allocCount--; - fprintf(stderr, "\nFree; count = %10d", g_allocCount); - } - #endif - free(address); -} - -void *SzAllocTemp(ISzAllocPtr p, size_t size) -{ - UNUSED_VAR(p); - if (size == 0) - return 0; - #ifdef _SZ_ALLOC_DEBUG - fprintf(stderr, "\nAlloc_temp %10u bytes; count = %10d", (unsigned)size, g_allocCountTemp); - g_allocCountTemp++; - #ifdef _WIN32 - return HeapAlloc(GetProcessHeap(), 0, size); - #endif - #endif - return malloc(size); -} - -void SzFreeTemp(ISzAllocPtr p, void *address) -{ - UNUSED_VAR(p); - #ifdef _SZ_ALLOC_DEBUG - if (address != 0) - { - g_allocCountTemp--; - fprintf(stderr, "\nFree_temp; count = %10d", g_allocCountTemp); - } - #ifdef _WIN32 - HeapFree(GetProcessHeap(), 0, address); - return; - #endif - #endif - free(address); -} +/* 7zAlloc.c -- Allocation functions +2017-04-03 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include + +#include "7zAlloc.h" + +/* #define _SZ_ALLOC_DEBUG */ +/* use _SZ_ALLOC_DEBUG to debug alloc/free operations */ + +#ifdef _SZ_ALLOC_DEBUG + +#ifdef _WIN32 +#include +#endif + +#include +int g_allocCount = 0; +int g_allocCountTemp = 0; + +#endif + +void *SzAlloc(ISzAllocPtr p, size_t size) +{ + UNUSED_VAR(p); + if (size == 0) + return 0; + #ifdef _SZ_ALLOC_DEBUG + fprintf(stderr, "\nAlloc %10u bytes; count = %10d", (unsigned)size, g_allocCount); + g_allocCount++; + #endif + return malloc(size); +} + +void SzFree(ISzAllocPtr p, void *address) +{ + UNUSED_VAR(p); + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + { + g_allocCount--; + fprintf(stderr, "\nFree; count = %10d", g_allocCount); + } + #endif + free(address); +} + +void *SzAllocTemp(ISzAllocPtr p, size_t size) +{ + UNUSED_VAR(p); + if (size == 0) + return 0; + #ifdef _SZ_ALLOC_DEBUG + fprintf(stderr, "\nAlloc_temp %10u bytes; count = %10d", (unsigned)size, g_allocCountTemp); + g_allocCountTemp++; + #ifdef _WIN32 + return HeapAlloc(GetProcessHeap(), 0, size); + #endif + #endif + return malloc(size); +} + +void SzFreeTemp(ISzAllocPtr p, void *address) +{ + UNUSED_VAR(p); + #ifdef _SZ_ALLOC_DEBUG + if (address != 0) + { + g_allocCountTemp--; + fprintf(stderr, "\nFree_temp; count = %10d", g_allocCountTemp); + } + #ifdef _WIN32 + HeapFree(GetProcessHeap(), 0, address); + return; + #endif + #endif + free(address); +} diff --git a/deps/LZMA-SDK/C/7zAlloc.h b/deps/LZMA-SDK/C/7zAlloc.h index c0f89d73c..44778f9b2 100644 --- a/deps/LZMA-SDK/C/7zAlloc.h +++ b/deps/LZMA-SDK/C/7zAlloc.h @@ -1,19 +1,19 @@ -/* 7zAlloc.h -- Allocation functions -2017-04-03 : Igor Pavlov : Public domain */ - -#ifndef __7Z_ALLOC_H -#define __7Z_ALLOC_H - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -void *SzAlloc(ISzAllocPtr p, size_t size); -void SzFree(ISzAllocPtr p, void *address); - -void *SzAllocTemp(ISzAllocPtr p, size_t size); -void SzFreeTemp(ISzAllocPtr p, void *address); - -EXTERN_C_END - -#endif +/* 7zAlloc.h -- Allocation functions +2017-04-03 : Igor Pavlov : Public domain */ + +#ifndef __7Z_ALLOC_H +#define __7Z_ALLOC_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +void *SzAlloc(ISzAllocPtr p, size_t size); +void SzFree(ISzAllocPtr p, void *address); + +void *SzAllocTemp(ISzAllocPtr p, size_t size); +void SzFreeTemp(ISzAllocPtr p, void *address); + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/7zArcIn.c b/deps/LZMA-SDK/C/7zArcIn.c index 7ccc72101..0d9dec41e 100644 --- a/deps/LZMA-SDK/C/7zArcIn.c +++ b/deps/LZMA-SDK/C/7zArcIn.c @@ -1,1783 +1,1783 @@ -/* 7zArcIn.c -- 7z Input functions -2021-02-09 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include - -#include "7z.h" -#include "7zBuf.h" -#include "7zCrc.h" -#include "CpuArch.h" - -#define MY_ALLOC(T, p, size, alloc) { \ - if ((p = (T *)ISzAlloc_Alloc(alloc, (size) * sizeof(T))) == NULL) return SZ_ERROR_MEM; } - -#define MY_ALLOC_ZE(T, p, size, alloc) { if ((size) == 0) p = NULL; else MY_ALLOC(T, p, size, alloc) } - -#define MY_ALLOC_AND_CPY(to, size, from, alloc) \ - { MY_ALLOC(Byte, to, size, alloc); memcpy(to, from, size); } - -#define MY_ALLOC_ZE_AND_CPY(to, size, from, alloc) \ - { if ((size) == 0) to = NULL; else { MY_ALLOC_AND_CPY(to, size, from, alloc) } } - -#define k7zMajorVersion 0 - -enum EIdEnum -{ - k7zIdEnd, - k7zIdHeader, - k7zIdArchiveProperties, - k7zIdAdditionalStreamsInfo, - k7zIdMainStreamsInfo, - k7zIdFilesInfo, - k7zIdPackInfo, - k7zIdUnpackInfo, - k7zIdSubStreamsInfo, - k7zIdSize, - k7zIdCRC, - k7zIdFolder, - k7zIdCodersUnpackSize, - k7zIdNumUnpackStream, - k7zIdEmptyStream, - k7zIdEmptyFile, - k7zIdAnti, - k7zIdName, - k7zIdCTime, - k7zIdATime, - k7zIdMTime, - k7zIdWinAttrib, - k7zIdComment, - k7zIdEncodedHeader, - k7zIdStartPos, - k7zIdDummy - // k7zNtSecure, - // k7zParent, - // k7zIsReal -}; - -const Byte k7zSignature[k7zSignatureSize] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C}; - -#define SzBitUi32s_Init(p) { (p)->Defs = NULL; (p)->Vals = NULL; } - -static SRes SzBitUi32s_Alloc(CSzBitUi32s *p, size_t num, ISzAllocPtr alloc) -{ - if (num == 0) - { - p->Defs = NULL; - p->Vals = NULL; - } - else - { - MY_ALLOC(Byte, p->Defs, (num + 7) >> 3, alloc); - MY_ALLOC(UInt32, p->Vals, num, alloc); - } - return SZ_OK; -} - -static void SzBitUi32s_Free(CSzBitUi32s *p, ISzAllocPtr alloc) -{ - ISzAlloc_Free(alloc, p->Defs); p->Defs = NULL; - ISzAlloc_Free(alloc, p->Vals); p->Vals = NULL; -} - -#define SzBitUi64s_Init(p) { (p)->Defs = NULL; (p)->Vals = NULL; } - -static void SzBitUi64s_Free(CSzBitUi64s *p, ISzAllocPtr alloc) -{ - ISzAlloc_Free(alloc, p->Defs); p->Defs = NULL; - ISzAlloc_Free(alloc, p->Vals); p->Vals = NULL; -} - - -static void SzAr_Init(CSzAr *p) -{ - p->NumPackStreams = 0; - p->NumFolders = 0; - - p->PackPositions = NULL; - SzBitUi32s_Init(&p->FolderCRCs); - - p->FoCodersOffsets = NULL; - p->FoStartPackStreamIndex = NULL; - p->FoToCoderUnpackSizes = NULL; - p->FoToMainUnpackSizeIndex = NULL; - p->CoderUnpackSizes = NULL; - - p->CodersData = NULL; - - p->RangeLimit = 0; -} - -static void SzAr_Free(CSzAr *p, ISzAllocPtr alloc) -{ - ISzAlloc_Free(alloc, p->PackPositions); - SzBitUi32s_Free(&p->FolderCRCs, alloc); - - ISzAlloc_Free(alloc, p->FoCodersOffsets); - ISzAlloc_Free(alloc, p->FoStartPackStreamIndex); - ISzAlloc_Free(alloc, p->FoToCoderUnpackSizes); - ISzAlloc_Free(alloc, p->FoToMainUnpackSizeIndex); - ISzAlloc_Free(alloc, p->CoderUnpackSizes); - - ISzAlloc_Free(alloc, p->CodersData); - - SzAr_Init(p); -} - - -void SzArEx_Init(CSzArEx *p) -{ - SzAr_Init(&p->db); - - p->NumFiles = 0; - p->dataPos = 0; - - p->UnpackPositions = NULL; - p->IsDirs = NULL; - - p->FolderToFile = NULL; - p->FileToFolder = NULL; - - p->FileNameOffsets = NULL; - p->FileNames = NULL; - - SzBitUi32s_Init(&p->CRCs); - SzBitUi32s_Init(&p->Attribs); - // SzBitUi32s_Init(&p->Parents); - SzBitUi64s_Init(&p->MTime); - SzBitUi64s_Init(&p->CTime); -} - -void SzArEx_Free(CSzArEx *p, ISzAllocPtr alloc) -{ - ISzAlloc_Free(alloc, p->UnpackPositions); - ISzAlloc_Free(alloc, p->IsDirs); - - ISzAlloc_Free(alloc, p->FolderToFile); - ISzAlloc_Free(alloc, p->FileToFolder); - - ISzAlloc_Free(alloc, p->FileNameOffsets); - ISzAlloc_Free(alloc, p->FileNames); - - SzBitUi32s_Free(&p->CRCs, alloc); - SzBitUi32s_Free(&p->Attribs, alloc); - // SzBitUi32s_Free(&p->Parents, alloc); - SzBitUi64s_Free(&p->MTime, alloc); - SzBitUi64s_Free(&p->CTime, alloc); - - SzAr_Free(&p->db, alloc); - SzArEx_Init(p); -} - - -static int TestSignatureCandidate(const Byte *testBytes) -{ - unsigned i; - for (i = 0; i < k7zSignatureSize; i++) - if (testBytes[i] != k7zSignature[i]) - return 0; - return 1; -} - -#define SzData_Clear(p) { (p)->Data = NULL; (p)->Size = 0; } - -#define SZ_READ_BYTE_SD(_sd_, dest) if ((_sd_)->Size == 0) return SZ_ERROR_ARCHIVE; (_sd_)->Size--; dest = *(_sd_)->Data++; -#define SZ_READ_BYTE(dest) SZ_READ_BYTE_SD(sd, dest) -#define SZ_READ_BYTE_2(dest) if (sd.Size == 0) return SZ_ERROR_ARCHIVE; sd.Size--; dest = *sd.Data++; - -#define SKIP_DATA(sd, size) { sd->Size -= (size_t)(size); sd->Data += (size_t)(size); } -#define SKIP_DATA2(sd, size) { sd.Size -= (size_t)(size); sd.Data += (size_t)(size); } - -#define SZ_READ_32(dest) if (sd.Size < 4) return SZ_ERROR_ARCHIVE; \ - dest = GetUi32(sd.Data); SKIP_DATA2(sd, 4); - -static MY_NO_INLINE SRes ReadNumber(CSzData *sd, UInt64 *value) -{ - Byte firstByte, mask; - unsigned i; - UInt32 v; - - SZ_READ_BYTE(firstByte); - if ((firstByte & 0x80) == 0) - { - *value = firstByte; - return SZ_OK; - } - SZ_READ_BYTE(v); - if ((firstByte & 0x40) == 0) - { - *value = (((UInt32)firstByte & 0x3F) << 8) | v; - return SZ_OK; - } - SZ_READ_BYTE(mask); - *value = v | ((UInt32)mask << 8); - mask = 0x20; - for (i = 2; i < 8; i++) - { - Byte b; - if ((firstByte & mask) == 0) - { - UInt64 highPart = (unsigned)firstByte & (unsigned)(mask - 1); - *value |= (highPart << (8 * i)); - return SZ_OK; - } - SZ_READ_BYTE(b); - *value |= ((UInt64)b << (8 * i)); - mask >>= 1; - } - return SZ_OK; -} - - -static MY_NO_INLINE SRes SzReadNumber32(CSzData *sd, UInt32 *value) -{ - Byte firstByte; - UInt64 value64; - if (sd->Size == 0) - return SZ_ERROR_ARCHIVE; - firstByte = *sd->Data; - if ((firstByte & 0x80) == 0) - { - *value = firstByte; - sd->Data++; - sd->Size--; - return SZ_OK; - } - RINOK(ReadNumber(sd, &value64)); - if (value64 >= (UInt32)0x80000000 - 1) - return SZ_ERROR_UNSUPPORTED; - if (value64 >= ((UInt64)(1) << ((sizeof(size_t) - 1) * 8 + 4))) - return SZ_ERROR_UNSUPPORTED; - *value = (UInt32)value64; - return SZ_OK; -} - -#define ReadID(sd, value) ReadNumber(sd, value) - -static SRes SkipData(CSzData *sd) -{ - UInt64 size; - RINOK(ReadNumber(sd, &size)); - if (size > sd->Size) - return SZ_ERROR_ARCHIVE; - SKIP_DATA(sd, size); - return SZ_OK; -} - -static SRes WaitId(CSzData *sd, UInt32 id) -{ - for (;;) - { - UInt64 type; - RINOK(ReadID(sd, &type)); - if (type == id) - return SZ_OK; - if (type == k7zIdEnd) - return SZ_ERROR_ARCHIVE; - RINOK(SkipData(sd)); - } -} - -static SRes RememberBitVector(CSzData *sd, UInt32 numItems, const Byte **v) -{ - UInt32 numBytes = (numItems + 7) >> 3; - if (numBytes > sd->Size) - return SZ_ERROR_ARCHIVE; - *v = sd->Data; - SKIP_DATA(sd, numBytes); - return SZ_OK; -} - -static UInt32 CountDefinedBits(const Byte *bits, UInt32 numItems) -{ - Byte b = 0; - unsigned m = 0; - UInt32 sum = 0; - for (; numItems != 0; numItems--) - { - if (m == 0) - { - b = *bits++; - m = 8; - } - m--; - sum += ((b >> m) & 1); - } - return sum; -} - -static MY_NO_INLINE SRes ReadBitVector(CSzData *sd, UInt32 numItems, Byte **v, ISzAllocPtr alloc) -{ - Byte allAreDefined; - Byte *v2; - UInt32 numBytes = (numItems + 7) >> 3; - *v = NULL; - SZ_READ_BYTE(allAreDefined); - if (numBytes == 0) - return SZ_OK; - if (allAreDefined == 0) - { - if (numBytes > sd->Size) - return SZ_ERROR_ARCHIVE; - MY_ALLOC_AND_CPY(*v, numBytes, sd->Data, alloc); - SKIP_DATA(sd, numBytes); - return SZ_OK; - } - MY_ALLOC(Byte, *v, numBytes, alloc); - v2 = *v; - memset(v2, 0xFF, (size_t)numBytes); - { - unsigned numBits = (unsigned)numItems & 7; - if (numBits != 0) - v2[(size_t)numBytes - 1] = (Byte)((((UInt32)1 << numBits) - 1) << (8 - numBits)); - } - return SZ_OK; -} - -static MY_NO_INLINE SRes ReadUi32s(CSzData *sd2, UInt32 numItems, CSzBitUi32s *crcs, ISzAllocPtr alloc) -{ - UInt32 i; - CSzData sd; - UInt32 *vals; - const Byte *defs; - MY_ALLOC_ZE(UInt32, crcs->Vals, numItems, alloc); - sd = *sd2; - defs = crcs->Defs; - vals = crcs->Vals; - for (i = 0; i < numItems; i++) - if (SzBitArray_Check(defs, i)) - { - SZ_READ_32(vals[i]); - } - else - vals[i] = 0; - *sd2 = sd; - return SZ_OK; -} - -static SRes ReadBitUi32s(CSzData *sd, UInt32 numItems, CSzBitUi32s *crcs, ISzAllocPtr alloc) -{ - SzBitUi32s_Free(crcs, alloc); - RINOK(ReadBitVector(sd, numItems, &crcs->Defs, alloc)); - return ReadUi32s(sd, numItems, crcs, alloc); -} - -static SRes SkipBitUi32s(CSzData *sd, UInt32 numItems) -{ - Byte allAreDefined; - UInt32 numDefined = numItems; - SZ_READ_BYTE(allAreDefined); - if (!allAreDefined) - { - size_t numBytes = (numItems + 7) >> 3; - if (numBytes > sd->Size) - return SZ_ERROR_ARCHIVE; - numDefined = CountDefinedBits(sd->Data, numItems); - SKIP_DATA(sd, numBytes); - } - if (numDefined > (sd->Size >> 2)) - return SZ_ERROR_ARCHIVE; - SKIP_DATA(sd, (size_t)numDefined * 4); - return SZ_OK; -} - -static SRes ReadPackInfo(CSzAr *p, CSzData *sd, ISzAllocPtr alloc) -{ - RINOK(SzReadNumber32(sd, &p->NumPackStreams)); - - RINOK(WaitId(sd, k7zIdSize)); - MY_ALLOC(UInt64, p->PackPositions, (size_t)p->NumPackStreams + 1, alloc); - { - UInt64 sum = 0; - UInt32 i; - UInt32 numPackStreams = p->NumPackStreams; - for (i = 0; i < numPackStreams; i++) - { - UInt64 packSize; - p->PackPositions[i] = sum; - RINOK(ReadNumber(sd, &packSize)); - sum += packSize; - if (sum < packSize) - return SZ_ERROR_ARCHIVE; - } - p->PackPositions[i] = sum; - } - - for (;;) - { - UInt64 type; - RINOK(ReadID(sd, &type)); - if (type == k7zIdEnd) - return SZ_OK; - if (type == k7zIdCRC) - { - /* CRC of packed streams is unused now */ - RINOK(SkipBitUi32s(sd, p->NumPackStreams)); - continue; - } - RINOK(SkipData(sd)); - } -} - -/* -static SRes SzReadSwitch(CSzData *sd) -{ - Byte external; - RINOK(SzReadByte(sd, &external)); - return (external == 0) ? SZ_OK: SZ_ERROR_UNSUPPORTED; -} -*/ - -#define k_NumCodersStreams_in_Folder_MAX (SZ_NUM_BONDS_IN_FOLDER_MAX + SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX) - -SRes SzGetNextFolderItem(CSzFolder *f, CSzData *sd) -{ - UInt32 numCoders, i; - UInt32 numInStreams = 0; - const Byte *dataStart = sd->Data; - - f->NumCoders = 0; - f->NumBonds = 0; - f->NumPackStreams = 0; - f->UnpackStream = 0; - - RINOK(SzReadNumber32(sd, &numCoders)); - if (numCoders == 0 || numCoders > SZ_NUM_CODERS_IN_FOLDER_MAX) - return SZ_ERROR_UNSUPPORTED; - - for (i = 0; i < numCoders; i++) - { - Byte mainByte; - CSzCoderInfo *coder = f->Coders + i; - unsigned idSize, j; - UInt64 id; - - SZ_READ_BYTE(mainByte); - if ((mainByte & 0xC0) != 0) - return SZ_ERROR_UNSUPPORTED; - - idSize = (unsigned)(mainByte & 0xF); - if (idSize > sizeof(id)) - return SZ_ERROR_UNSUPPORTED; - if (idSize > sd->Size) - return SZ_ERROR_ARCHIVE; - id = 0; - for (j = 0; j < idSize; j++) - { - id = ((id << 8) | *sd->Data); - sd->Data++; - sd->Size--; - } - if (id > (UInt32)0xFFFFFFFF) - return SZ_ERROR_UNSUPPORTED; - coder->MethodID = (UInt32)id; - - coder->NumStreams = 1; - coder->PropsOffset = 0; - coder->PropsSize = 0; - - if ((mainByte & 0x10) != 0) - { - UInt32 numStreams; - - RINOK(SzReadNumber32(sd, &numStreams)); - if (numStreams > k_NumCodersStreams_in_Folder_MAX) - return SZ_ERROR_UNSUPPORTED; - coder->NumStreams = (Byte)numStreams; - - RINOK(SzReadNumber32(sd, &numStreams)); - if (numStreams != 1) - return SZ_ERROR_UNSUPPORTED; - } - - numInStreams += coder->NumStreams; - - if (numInStreams > k_NumCodersStreams_in_Folder_MAX) - return SZ_ERROR_UNSUPPORTED; - - if ((mainByte & 0x20) != 0) - { - UInt32 propsSize = 0; - RINOK(SzReadNumber32(sd, &propsSize)); - if (propsSize > sd->Size) - return SZ_ERROR_ARCHIVE; - if (propsSize >= 0x80) - return SZ_ERROR_UNSUPPORTED; - coder->PropsOffset = (size_t)(sd->Data - dataStart); - coder->PropsSize = (Byte)propsSize; - sd->Data += (size_t)propsSize; - sd->Size -= (size_t)propsSize; - } - } - - /* - if (numInStreams == 1 && numCoders == 1) - { - f->NumPackStreams = 1; - f->PackStreams[0] = 0; - } - else - */ - { - Byte streamUsed[k_NumCodersStreams_in_Folder_MAX]; - UInt32 numBonds, numPackStreams; - - numBonds = numCoders - 1; - if (numInStreams < numBonds) - return SZ_ERROR_ARCHIVE; - if (numBonds > SZ_NUM_BONDS_IN_FOLDER_MAX) - return SZ_ERROR_UNSUPPORTED; - f->NumBonds = numBonds; - - numPackStreams = numInStreams - numBonds; - if (numPackStreams > SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX) - return SZ_ERROR_UNSUPPORTED; - f->NumPackStreams = numPackStreams; - - for (i = 0; i < numInStreams; i++) - streamUsed[i] = False; - - if (numBonds != 0) - { - Byte coderUsed[SZ_NUM_CODERS_IN_FOLDER_MAX]; - - for (i = 0; i < numCoders; i++) - coderUsed[i] = False; - - for (i = 0; i < numBonds; i++) - { - CSzBond *bp = f->Bonds + i; - - RINOK(SzReadNumber32(sd, &bp->InIndex)); - if (bp->InIndex >= numInStreams || streamUsed[bp->InIndex]) - return SZ_ERROR_ARCHIVE; - streamUsed[bp->InIndex] = True; - - RINOK(SzReadNumber32(sd, &bp->OutIndex)); - if (bp->OutIndex >= numCoders || coderUsed[bp->OutIndex]) - return SZ_ERROR_ARCHIVE; - coderUsed[bp->OutIndex] = True; - } - - for (i = 0; i < numCoders; i++) - if (!coderUsed[i]) - { - f->UnpackStream = i; - break; - } - - if (i == numCoders) - return SZ_ERROR_ARCHIVE; - } - - if (numPackStreams == 1) - { - for (i = 0; i < numInStreams; i++) - if (!streamUsed[i]) - break; - if (i == numInStreams) - return SZ_ERROR_ARCHIVE; - f->PackStreams[0] = i; - } - else - for (i = 0; i < numPackStreams; i++) - { - UInt32 index; - RINOK(SzReadNumber32(sd, &index)); - if (index >= numInStreams || streamUsed[index]) - return SZ_ERROR_ARCHIVE; - streamUsed[index] = True; - f->PackStreams[i] = index; - } - } - - f->NumCoders = numCoders; - - return SZ_OK; -} - - -static MY_NO_INLINE SRes SkipNumbers(CSzData *sd2, UInt32 num) -{ - CSzData sd; - sd = *sd2; - for (; num != 0; num--) - { - Byte firstByte, mask; - unsigned i; - SZ_READ_BYTE_2(firstByte); - if ((firstByte & 0x80) == 0) - continue; - if ((firstByte & 0x40) == 0) - { - if (sd.Size == 0) - return SZ_ERROR_ARCHIVE; - sd.Size--; - sd.Data++; - continue; - } - mask = 0x20; - for (i = 2; i < 8 && (firstByte & mask) != 0; i++) - mask >>= 1; - if (i > sd.Size) - return SZ_ERROR_ARCHIVE; - SKIP_DATA2(sd, i); - } - *sd2 = sd; - return SZ_OK; -} - - -#define k_Scan_NumCoders_MAX 64 -#define k_Scan_NumCodersStreams_in_Folder_MAX 64 - - -static SRes ReadUnpackInfo(CSzAr *p, - CSzData *sd2, - UInt32 numFoldersMax, - const CBuf *tempBufs, UInt32 numTempBufs, - ISzAllocPtr alloc) -{ - CSzData sd; - - UInt32 fo, numFolders, numCodersOutStreams, packStreamIndex; - const Byte *startBufPtr; - Byte external; - - RINOK(WaitId(sd2, k7zIdFolder)); - - RINOK(SzReadNumber32(sd2, &numFolders)); - if (numFolders > numFoldersMax) - return SZ_ERROR_UNSUPPORTED; - p->NumFolders = numFolders; - - SZ_READ_BYTE_SD(sd2, external); - if (external == 0) - sd = *sd2; - else - { - UInt32 index; - RINOK(SzReadNumber32(sd2, &index)); - if (index >= numTempBufs) - return SZ_ERROR_ARCHIVE; - sd.Data = tempBufs[index].data; - sd.Size = tempBufs[index].size; - } - - MY_ALLOC(size_t, p->FoCodersOffsets, (size_t)numFolders + 1, alloc); - MY_ALLOC(UInt32, p->FoStartPackStreamIndex, (size_t)numFolders + 1, alloc); - MY_ALLOC(UInt32, p->FoToCoderUnpackSizes, (size_t)numFolders + 1, alloc); - MY_ALLOC_ZE(Byte, p->FoToMainUnpackSizeIndex, (size_t)numFolders, alloc); - - startBufPtr = sd.Data; - - packStreamIndex = 0; - numCodersOutStreams = 0; - - for (fo = 0; fo < numFolders; fo++) - { - UInt32 numCoders, ci, numInStreams = 0; - - p->FoCodersOffsets[fo] = (size_t)(sd.Data - startBufPtr); - - RINOK(SzReadNumber32(&sd, &numCoders)); - if (numCoders == 0 || numCoders > k_Scan_NumCoders_MAX) - return SZ_ERROR_UNSUPPORTED; - - for (ci = 0; ci < numCoders; ci++) - { - Byte mainByte; - unsigned idSize; - UInt32 coderInStreams; - - SZ_READ_BYTE_2(mainByte); - if ((mainByte & 0xC0) != 0) - return SZ_ERROR_UNSUPPORTED; - idSize = (mainByte & 0xF); - if (idSize > 8) - return SZ_ERROR_UNSUPPORTED; - if (idSize > sd.Size) - return SZ_ERROR_ARCHIVE; - SKIP_DATA2(sd, idSize); - - coderInStreams = 1; - - if ((mainByte & 0x10) != 0) - { - UInt32 coderOutStreams; - RINOK(SzReadNumber32(&sd, &coderInStreams)); - RINOK(SzReadNumber32(&sd, &coderOutStreams)); - if (coderInStreams > k_Scan_NumCodersStreams_in_Folder_MAX || coderOutStreams != 1) - return SZ_ERROR_UNSUPPORTED; - } - - numInStreams += coderInStreams; - - if ((mainByte & 0x20) != 0) - { - UInt32 propsSize; - RINOK(SzReadNumber32(&sd, &propsSize)); - if (propsSize > sd.Size) - return SZ_ERROR_ARCHIVE; - SKIP_DATA2(sd, propsSize); - } - } - - { - UInt32 indexOfMainStream = 0; - UInt32 numPackStreams = 1; - - if (numCoders != 1 || numInStreams != 1) - { - Byte streamUsed[k_Scan_NumCodersStreams_in_Folder_MAX]; - Byte coderUsed[k_Scan_NumCoders_MAX]; - - UInt32 i; - UInt32 numBonds = numCoders - 1; - if (numInStreams < numBonds) - return SZ_ERROR_ARCHIVE; - - if (numInStreams > k_Scan_NumCodersStreams_in_Folder_MAX) - return SZ_ERROR_UNSUPPORTED; - - for (i = 0; i < numInStreams; i++) - streamUsed[i] = False; - for (i = 0; i < numCoders; i++) - coderUsed[i] = False; - - for (i = 0; i < numBonds; i++) - { - UInt32 index; - - RINOK(SzReadNumber32(&sd, &index)); - if (index >= numInStreams || streamUsed[index]) - return SZ_ERROR_ARCHIVE; - streamUsed[index] = True; - - RINOK(SzReadNumber32(&sd, &index)); - if (index >= numCoders || coderUsed[index]) - return SZ_ERROR_ARCHIVE; - coderUsed[index] = True; - } - - numPackStreams = numInStreams - numBonds; - - if (numPackStreams != 1) - for (i = 0; i < numPackStreams; i++) - { - UInt32 index; - RINOK(SzReadNumber32(&sd, &index)); - if (index >= numInStreams || streamUsed[index]) - return SZ_ERROR_ARCHIVE; - streamUsed[index] = True; - } - - for (i = 0; i < numCoders; i++) - if (!coderUsed[i]) - { - indexOfMainStream = i; - break; - } - - if (i == numCoders) - return SZ_ERROR_ARCHIVE; - } - - p->FoStartPackStreamIndex[fo] = packStreamIndex; - p->FoToCoderUnpackSizes[fo] = numCodersOutStreams; - p->FoToMainUnpackSizeIndex[fo] = (Byte)indexOfMainStream; - numCodersOutStreams += numCoders; - if (numCodersOutStreams < numCoders) - return SZ_ERROR_UNSUPPORTED; - if (numPackStreams > p->NumPackStreams - packStreamIndex) - return SZ_ERROR_ARCHIVE; - packStreamIndex += numPackStreams; - } - } - - p->FoToCoderUnpackSizes[fo] = numCodersOutStreams; - - { - const size_t dataSize = (size_t)(sd.Data - startBufPtr); - p->FoStartPackStreamIndex[fo] = packStreamIndex; - p->FoCodersOffsets[fo] = dataSize; - MY_ALLOC_ZE_AND_CPY(p->CodersData, dataSize, startBufPtr, alloc); - } - - if (external != 0) - { - if (sd.Size != 0) - return SZ_ERROR_ARCHIVE; - sd = *sd2; - } - - RINOK(WaitId(&sd, k7zIdCodersUnpackSize)); - - MY_ALLOC_ZE(UInt64, p->CoderUnpackSizes, (size_t)numCodersOutStreams, alloc); - { - UInt32 i; - for (i = 0; i < numCodersOutStreams; i++) - { - RINOK(ReadNumber(&sd, p->CoderUnpackSizes + i)); - } - } - - for (;;) - { - UInt64 type; - RINOK(ReadID(&sd, &type)); - if (type == k7zIdEnd) - { - *sd2 = sd; - return SZ_OK; - } - if (type == k7zIdCRC) - { - RINOK(ReadBitUi32s(&sd, numFolders, &p->FolderCRCs, alloc)); - continue; - } - RINOK(SkipData(&sd)); - } -} - - -UInt64 SzAr_GetFolderUnpackSize(const CSzAr *p, UInt32 folderIndex) -{ - return p->CoderUnpackSizes[p->FoToCoderUnpackSizes[folderIndex] + p->FoToMainUnpackSizeIndex[folderIndex]]; -} - - -typedef struct -{ - UInt32 NumTotalSubStreams; - UInt32 NumSubDigests; - CSzData sdNumSubStreams; - CSzData sdSizes; - CSzData sdCRCs; -} CSubStreamInfo; - - -static SRes ReadSubStreamsInfo(CSzAr *p, CSzData *sd, CSubStreamInfo *ssi) -{ - UInt64 type = 0; - UInt32 numSubDigests = 0; - UInt32 numFolders = p->NumFolders; - UInt32 numUnpackStreams = numFolders; - UInt32 numUnpackSizesInData = 0; - - for (;;) - { - RINOK(ReadID(sd, &type)); - if (type == k7zIdNumUnpackStream) - { - UInt32 i; - ssi->sdNumSubStreams.Data = sd->Data; - numUnpackStreams = 0; - numSubDigests = 0; - for (i = 0; i < numFolders; i++) - { - UInt32 numStreams; - RINOK(SzReadNumber32(sd, &numStreams)); - if (numUnpackStreams > numUnpackStreams + numStreams) - return SZ_ERROR_UNSUPPORTED; - numUnpackStreams += numStreams; - if (numStreams != 0) - numUnpackSizesInData += (numStreams - 1); - if (numStreams != 1 || !SzBitWithVals_Check(&p->FolderCRCs, i)) - numSubDigests += numStreams; - } - ssi->sdNumSubStreams.Size = (size_t)(sd->Data - ssi->sdNumSubStreams.Data); - continue; - } - if (type == k7zIdCRC || type == k7zIdSize || type == k7zIdEnd) - break; - RINOK(SkipData(sd)); - } - - if (!ssi->sdNumSubStreams.Data) - { - numSubDigests = numFolders; - if (p->FolderCRCs.Defs) - numSubDigests = numFolders - CountDefinedBits(p->FolderCRCs.Defs, numFolders); - } - - ssi->NumTotalSubStreams = numUnpackStreams; - ssi->NumSubDigests = numSubDigests; - - if (type == k7zIdSize) - { - ssi->sdSizes.Data = sd->Data; - RINOK(SkipNumbers(sd, numUnpackSizesInData)); - ssi->sdSizes.Size = (size_t)(sd->Data - ssi->sdSizes.Data); - RINOK(ReadID(sd, &type)); - } - - for (;;) - { - if (type == k7zIdEnd) - return SZ_OK; - if (type == k7zIdCRC) - { - ssi->sdCRCs.Data = sd->Data; - RINOK(SkipBitUi32s(sd, numSubDigests)); - ssi->sdCRCs.Size = (size_t)(sd->Data - ssi->sdCRCs.Data); - } - else - { - RINOK(SkipData(sd)); - } - RINOK(ReadID(sd, &type)); - } -} - -static SRes SzReadStreamsInfo(CSzAr *p, - CSzData *sd, - UInt32 numFoldersMax, const CBuf *tempBufs, UInt32 numTempBufs, - UInt64 *dataOffset, - CSubStreamInfo *ssi, - ISzAllocPtr alloc) -{ - UInt64 type; - - SzData_Clear(&ssi->sdSizes); - SzData_Clear(&ssi->sdCRCs); - SzData_Clear(&ssi->sdNumSubStreams); - - *dataOffset = 0; - RINOK(ReadID(sd, &type)); - if (type == k7zIdPackInfo) - { - RINOK(ReadNumber(sd, dataOffset)); - if (*dataOffset > p->RangeLimit) - return SZ_ERROR_ARCHIVE; - RINOK(ReadPackInfo(p, sd, alloc)); - if (p->PackPositions[p->NumPackStreams] > p->RangeLimit - *dataOffset) - return SZ_ERROR_ARCHIVE; - RINOK(ReadID(sd, &type)); - } - if (type == k7zIdUnpackInfo) - { - RINOK(ReadUnpackInfo(p, sd, numFoldersMax, tempBufs, numTempBufs, alloc)); - RINOK(ReadID(sd, &type)); - } - if (type == k7zIdSubStreamsInfo) - { - RINOK(ReadSubStreamsInfo(p, sd, ssi)); - RINOK(ReadID(sd, &type)); - } - else - { - ssi->NumTotalSubStreams = p->NumFolders; - // ssi->NumSubDigests = 0; - } - - return (type == k7zIdEnd ? SZ_OK : SZ_ERROR_UNSUPPORTED); -} - -static SRes SzReadAndDecodePackedStreams( - ILookInStream *inStream, - CSzData *sd, - CBuf *tempBufs, - UInt32 numFoldersMax, - UInt64 baseOffset, - CSzAr *p, - ISzAllocPtr allocTemp) -{ - UInt64 dataStartPos; - UInt32 fo; - CSubStreamInfo ssi; - - RINOK(SzReadStreamsInfo(p, sd, numFoldersMax, NULL, 0, &dataStartPos, &ssi, allocTemp)); - - dataStartPos += baseOffset; - if (p->NumFolders == 0) - return SZ_ERROR_ARCHIVE; - - for (fo = 0; fo < p->NumFolders; fo++) - Buf_Init(tempBufs + fo); - - for (fo = 0; fo < p->NumFolders; fo++) - { - CBuf *tempBuf = tempBufs + fo; - UInt64 unpackSize = SzAr_GetFolderUnpackSize(p, fo); - if ((size_t)unpackSize != unpackSize) - return SZ_ERROR_MEM; - if (!Buf_Create(tempBuf, (size_t)unpackSize, allocTemp)) - return SZ_ERROR_MEM; - } - - for (fo = 0; fo < p->NumFolders; fo++) - { - const CBuf *tempBuf = tempBufs + fo; - RINOK(LookInStream_SeekTo(inStream, dataStartPos)); - RINOK(SzAr_DecodeFolder(p, fo, inStream, dataStartPos, tempBuf->data, tempBuf->size, allocTemp)); - } - - return SZ_OK; -} - -static SRes SzReadFileNames(const Byte *data, size_t size, UInt32 numFiles, size_t *offsets) -{ - size_t pos = 0; - *offsets++ = 0; - if (numFiles == 0) - return (size == 0) ? SZ_OK : SZ_ERROR_ARCHIVE; - if (size < 2) - return SZ_ERROR_ARCHIVE; - if (data[size - 2] != 0 || data[size - 1] != 0) - return SZ_ERROR_ARCHIVE; - do - { - const Byte *p; - if (pos == size) - return SZ_ERROR_ARCHIVE; - for (p = data + pos; - #ifdef _WIN32 - *(const UInt16 *)(const void *)p != 0 - #else - p[0] != 0 || p[1] != 0 - #endif - ; p += 2); - pos = (size_t)(p - data) + 2; - *offsets++ = (pos >> 1); - } - while (--numFiles); - return (pos == size) ? SZ_OK : SZ_ERROR_ARCHIVE; -} - -static MY_NO_INLINE SRes ReadTime(CSzBitUi64s *p, UInt32 num, - CSzData *sd2, - const CBuf *tempBufs, UInt32 numTempBufs, - ISzAllocPtr alloc) -{ - CSzData sd; - UInt32 i; - CNtfsFileTime *vals; - Byte *defs; - Byte external; - - RINOK(ReadBitVector(sd2, num, &p->Defs, alloc)); - - SZ_READ_BYTE_SD(sd2, external); - if (external == 0) - sd = *sd2; - else - { - UInt32 index; - RINOK(SzReadNumber32(sd2, &index)); - if (index >= numTempBufs) - return SZ_ERROR_ARCHIVE; - sd.Data = tempBufs[index].data; - sd.Size = tempBufs[index].size; - } - - MY_ALLOC_ZE(CNtfsFileTime, p->Vals, num, alloc); - vals = p->Vals; - defs = p->Defs; - for (i = 0; i < num; i++) - if (SzBitArray_Check(defs, i)) - { - if (sd.Size < 8) - return SZ_ERROR_ARCHIVE; - vals[i].Low = GetUi32(sd.Data); - vals[i].High = GetUi32(sd.Data + 4); - SKIP_DATA2(sd, 8); - } - else - vals[i].High = vals[i].Low = 0; - - if (external == 0) - *sd2 = sd; - - return SZ_OK; -} - - -#define NUM_ADDITIONAL_STREAMS_MAX 8 - - -static SRes SzReadHeader2( - CSzArEx *p, /* allocMain */ - CSzData *sd, - ILookInStream *inStream, - CBuf *tempBufs, UInt32 *numTempBufs, - ISzAllocPtr allocMain, - ISzAllocPtr allocTemp - ) -{ - CSubStreamInfo ssi; - -{ - UInt64 type; - - SzData_Clear(&ssi.sdSizes); - SzData_Clear(&ssi.sdCRCs); - SzData_Clear(&ssi.sdNumSubStreams); - - ssi.NumSubDigests = 0; - ssi.NumTotalSubStreams = 0; - - RINOK(ReadID(sd, &type)); - - if (type == k7zIdArchiveProperties) - { - for (;;) - { - UInt64 type2; - RINOK(ReadID(sd, &type2)); - if (type2 == k7zIdEnd) - break; - RINOK(SkipData(sd)); - } - RINOK(ReadID(sd, &type)); - } - - if (type == k7zIdAdditionalStreamsInfo) - { - CSzAr tempAr; - SRes res; - - SzAr_Init(&tempAr); - tempAr.RangeLimit = p->db.RangeLimit; - - res = SzReadAndDecodePackedStreams(inStream, sd, tempBufs, NUM_ADDITIONAL_STREAMS_MAX, - p->startPosAfterHeader, &tempAr, allocTemp); - *numTempBufs = tempAr.NumFolders; - SzAr_Free(&tempAr, allocTemp); - - if (res != SZ_OK) - return res; - RINOK(ReadID(sd, &type)); - } - - if (type == k7zIdMainStreamsInfo) - { - RINOK(SzReadStreamsInfo(&p->db, sd, (UInt32)1 << 30, tempBufs, *numTempBufs, - &p->dataPos, &ssi, allocMain)); - p->dataPos += p->startPosAfterHeader; - RINOK(ReadID(sd, &type)); - } - - if (type == k7zIdEnd) - { - return SZ_OK; - } - - if (type != k7zIdFilesInfo) - return SZ_ERROR_ARCHIVE; -} - -{ - UInt32 numFiles = 0; - UInt32 numEmptyStreams = 0; - const Byte *emptyStreams = NULL; - const Byte *emptyFiles = NULL; - - RINOK(SzReadNumber32(sd, &numFiles)); - p->NumFiles = numFiles; - - for (;;) - { - UInt64 type; - UInt64 size; - RINOK(ReadID(sd, &type)); - if (type == k7zIdEnd) - break; - RINOK(ReadNumber(sd, &size)); - if (size > sd->Size) - return SZ_ERROR_ARCHIVE; - - if (type >= ((UInt32)1 << 8)) - { - SKIP_DATA(sd, size); - } - else switch ((unsigned)type) - { - case k7zIdName: - { - size_t namesSize; - const Byte *namesData; - Byte external; - - SZ_READ_BYTE(external); - if (external == 0) - { - namesSize = (size_t)size - 1; - namesData = sd->Data; - } - else - { - UInt32 index; - RINOK(SzReadNumber32(sd, &index)); - if (index >= *numTempBufs) - return SZ_ERROR_ARCHIVE; - namesData = (tempBufs)[index].data; - namesSize = (tempBufs)[index].size; - } - - if ((namesSize & 1) != 0) - return SZ_ERROR_ARCHIVE; - MY_ALLOC(size_t, p->FileNameOffsets, numFiles + 1, allocMain); - MY_ALLOC_ZE_AND_CPY(p->FileNames, namesSize, namesData, allocMain); - RINOK(SzReadFileNames(p->FileNames, namesSize, numFiles, p->FileNameOffsets)) - if (external == 0) - { - SKIP_DATA(sd, namesSize); - } - break; - } - case k7zIdEmptyStream: - { - RINOK(RememberBitVector(sd, numFiles, &emptyStreams)); - numEmptyStreams = CountDefinedBits(emptyStreams, numFiles); - emptyFiles = NULL; - break; - } - case k7zIdEmptyFile: - { - RINOK(RememberBitVector(sd, numEmptyStreams, &emptyFiles)); - break; - } - case k7zIdWinAttrib: - { - Byte external; - CSzData sdSwitch; - CSzData *sdPtr; - SzBitUi32s_Free(&p->Attribs, allocMain); - RINOK(ReadBitVector(sd, numFiles, &p->Attribs.Defs, allocMain)); - - SZ_READ_BYTE(external); - if (external == 0) - sdPtr = sd; - else - { - UInt32 index; - RINOK(SzReadNumber32(sd, &index)); - if (index >= *numTempBufs) - return SZ_ERROR_ARCHIVE; - sdSwitch.Data = (tempBufs)[index].data; - sdSwitch.Size = (tempBufs)[index].size; - sdPtr = &sdSwitch; - } - RINOK(ReadUi32s(sdPtr, numFiles, &p->Attribs, allocMain)); - break; - } - /* - case k7zParent: - { - SzBitUi32s_Free(&p->Parents, allocMain); - RINOK(ReadBitVector(sd, numFiles, &p->Parents.Defs, allocMain)); - RINOK(SzReadSwitch(sd)); - RINOK(ReadUi32s(sd, numFiles, &p->Parents, allocMain)); - break; - } - */ - case k7zIdMTime: RINOK(ReadTime(&p->MTime, numFiles, sd, tempBufs, *numTempBufs, allocMain)); break; - case k7zIdCTime: RINOK(ReadTime(&p->CTime, numFiles, sd, tempBufs, *numTempBufs, allocMain)); break; - default: - { - SKIP_DATA(sd, size); - } - } - } - - if (numFiles - numEmptyStreams != ssi.NumTotalSubStreams) - return SZ_ERROR_ARCHIVE; - - for (;;) - { - UInt64 type; - RINOK(ReadID(sd, &type)); - if (type == k7zIdEnd) - break; - RINOK(SkipData(sd)); - } - - { - UInt32 i; - UInt32 emptyFileIndex = 0; - UInt32 folderIndex = 0; - UInt32 remSubStreams = 0; - UInt32 numSubStreams = 0; - UInt64 unpackPos = 0; - const Byte *digestsDefs = NULL; - const Byte *digestsVals = NULL; - UInt32 digestsValsIndex = 0; - UInt32 digestIndex; - Byte allDigestsDefined = 0; - Byte isDirMask = 0; - Byte crcMask = 0; - Byte mask = 0x80; - - MY_ALLOC(UInt32, p->FolderToFile, p->db.NumFolders + 1, allocMain); - MY_ALLOC_ZE(UInt32, p->FileToFolder, p->NumFiles, allocMain); - MY_ALLOC(UInt64, p->UnpackPositions, p->NumFiles + 1, allocMain); - MY_ALLOC_ZE(Byte, p->IsDirs, (p->NumFiles + 7) >> 3, allocMain); - - RINOK(SzBitUi32s_Alloc(&p->CRCs, p->NumFiles, allocMain)); - - if (ssi.sdCRCs.Size != 0) - { - SZ_READ_BYTE_SD(&ssi.sdCRCs, allDigestsDefined); - if (allDigestsDefined) - digestsVals = ssi.sdCRCs.Data; - else - { - size_t numBytes = (ssi.NumSubDigests + 7) >> 3; - digestsDefs = ssi.sdCRCs.Data; - digestsVals = digestsDefs + numBytes; - } - } - - digestIndex = 0; - - for (i = 0; i < numFiles; i++, mask >>= 1) - { - if (mask == 0) - { - UInt32 byteIndex = (i - 1) >> 3; - p->IsDirs[byteIndex] = isDirMask; - p->CRCs.Defs[byteIndex] = crcMask; - isDirMask = 0; - crcMask = 0; - mask = 0x80; - } - - p->UnpackPositions[i] = unpackPos; - p->CRCs.Vals[i] = 0; - - if (emptyStreams && SzBitArray_Check(emptyStreams, i)) - { - if (emptyFiles) - { - if (!SzBitArray_Check(emptyFiles, emptyFileIndex)) - isDirMask |= mask; - emptyFileIndex++; - } - else - isDirMask |= mask; - if (remSubStreams == 0) - { - p->FileToFolder[i] = (UInt32)-1; - continue; - } - } - - if (remSubStreams == 0) - { - for (;;) - { - if (folderIndex >= p->db.NumFolders) - return SZ_ERROR_ARCHIVE; - p->FolderToFile[folderIndex] = i; - numSubStreams = 1; - if (ssi.sdNumSubStreams.Data) - { - RINOK(SzReadNumber32(&ssi.sdNumSubStreams, &numSubStreams)); - } - remSubStreams = numSubStreams; - if (numSubStreams != 0) - break; - { - UInt64 folderUnpackSize = SzAr_GetFolderUnpackSize(&p->db, folderIndex); - unpackPos += folderUnpackSize; - if (unpackPos < folderUnpackSize) - return SZ_ERROR_ARCHIVE; - } - - folderIndex++; - } - } - - p->FileToFolder[i] = folderIndex; - - if (emptyStreams && SzBitArray_Check(emptyStreams, i)) - continue; - - if (--remSubStreams == 0) - { - UInt64 folderUnpackSize = SzAr_GetFolderUnpackSize(&p->db, folderIndex); - UInt64 startFolderUnpackPos = p->UnpackPositions[p->FolderToFile[folderIndex]]; - if (folderUnpackSize < unpackPos - startFolderUnpackPos) - return SZ_ERROR_ARCHIVE; - unpackPos = startFolderUnpackPos + folderUnpackSize; - if (unpackPos < folderUnpackSize) - return SZ_ERROR_ARCHIVE; - - if (numSubStreams == 1 && SzBitWithVals_Check(&p->db.FolderCRCs, i)) - { - p->CRCs.Vals[i] = p->db.FolderCRCs.Vals[folderIndex]; - crcMask |= mask; - } - else if (allDigestsDefined || (digestsDefs && SzBitArray_Check(digestsDefs, digestIndex))) - { - p->CRCs.Vals[i] = GetUi32(digestsVals + (size_t)digestsValsIndex * 4); - digestsValsIndex++; - crcMask |= mask; - } - - folderIndex++; - } - else - { - UInt64 v; - RINOK(ReadNumber(&ssi.sdSizes, &v)); - unpackPos += v; - if (unpackPos < v) - return SZ_ERROR_ARCHIVE; - if (allDigestsDefined || (digestsDefs && SzBitArray_Check(digestsDefs, digestIndex))) - { - p->CRCs.Vals[i] = GetUi32(digestsVals + (size_t)digestsValsIndex * 4); - digestsValsIndex++; - crcMask |= mask; - } - } - } - - if (mask != 0x80) - { - UInt32 byteIndex = (i - 1) >> 3; - p->IsDirs[byteIndex] = isDirMask; - p->CRCs.Defs[byteIndex] = crcMask; - } - - p->UnpackPositions[i] = unpackPos; - - if (remSubStreams != 0) - return SZ_ERROR_ARCHIVE; - - for (;;) - { - p->FolderToFile[folderIndex] = i; - if (folderIndex >= p->db.NumFolders) - break; - if (!ssi.sdNumSubStreams.Data) - return SZ_ERROR_ARCHIVE; - RINOK(SzReadNumber32(&ssi.sdNumSubStreams, &numSubStreams)); - if (numSubStreams != 0) - return SZ_ERROR_ARCHIVE; - /* - { - UInt64 folderUnpackSize = SzAr_GetFolderUnpackSize(&p->db, folderIndex); - unpackPos += folderUnpackSize; - if (unpackPos < folderUnpackSize) - return SZ_ERROR_ARCHIVE; - } - */ - folderIndex++; - } - - if (ssi.sdNumSubStreams.Data && ssi.sdNumSubStreams.Size != 0) - return SZ_ERROR_ARCHIVE; - } -} - return SZ_OK; -} - - -static SRes SzReadHeader( - CSzArEx *p, - CSzData *sd, - ILookInStream *inStream, - ISzAllocPtr allocMain, - ISzAllocPtr allocTemp) -{ - UInt32 i; - UInt32 numTempBufs = 0; - SRes res; - CBuf tempBufs[NUM_ADDITIONAL_STREAMS_MAX]; - - for (i = 0; i < NUM_ADDITIONAL_STREAMS_MAX; i++) - Buf_Init(tempBufs + i); - - res = SzReadHeader2(p, sd, inStream, - tempBufs, &numTempBufs, - allocMain, allocTemp); - - for (i = 0; i < NUM_ADDITIONAL_STREAMS_MAX; i++) - Buf_Free(tempBufs + i, allocTemp); - - RINOK(res); - - if (sd->Size != 0) - return SZ_ERROR_FAIL; - - return res; -} - -static SRes SzArEx_Open2( - CSzArEx *p, - ILookInStream *inStream, - ISzAllocPtr allocMain, - ISzAllocPtr allocTemp) -{ - Byte header[k7zStartHeaderSize]; - Int64 startArcPos; - UInt64 nextHeaderOffset, nextHeaderSize; - size_t nextHeaderSizeT; - UInt32 nextHeaderCRC; - CBuf buf; - SRes res; - - startArcPos = 0; - RINOK(ILookInStream_Seek(inStream, &startArcPos, SZ_SEEK_CUR)); - - RINOK(LookInStream_Read2(inStream, header, k7zStartHeaderSize, SZ_ERROR_NO_ARCHIVE)); - - if (!TestSignatureCandidate(header)) - return SZ_ERROR_NO_ARCHIVE; - if (header[6] != k7zMajorVersion) - return SZ_ERROR_UNSUPPORTED; - - nextHeaderOffset = GetUi64(header + 12); - nextHeaderSize = GetUi64(header + 20); - nextHeaderCRC = GetUi32(header + 28); - - p->startPosAfterHeader = (UInt64)startArcPos + k7zStartHeaderSize; - - if (CrcCalc(header + 12, 20) != GetUi32(header + 8)) - return SZ_ERROR_CRC; - - p->db.RangeLimit = nextHeaderOffset; - - nextHeaderSizeT = (size_t)nextHeaderSize; - if (nextHeaderSizeT != nextHeaderSize) - return SZ_ERROR_MEM; - if (nextHeaderSizeT == 0) - return SZ_OK; - if (nextHeaderOffset > nextHeaderOffset + nextHeaderSize || - nextHeaderOffset > nextHeaderOffset + nextHeaderSize + k7zStartHeaderSize) - return SZ_ERROR_NO_ARCHIVE; - - { - Int64 pos = 0; - RINOK(ILookInStream_Seek(inStream, &pos, SZ_SEEK_END)); - if ((UInt64)pos < (UInt64)startArcPos + nextHeaderOffset || - (UInt64)pos < (UInt64)startArcPos + k7zStartHeaderSize + nextHeaderOffset || - (UInt64)pos < (UInt64)startArcPos + k7zStartHeaderSize + nextHeaderOffset + nextHeaderSize) - return SZ_ERROR_INPUT_EOF; - } - - RINOK(LookInStream_SeekTo(inStream, (UInt64)startArcPos + k7zStartHeaderSize + nextHeaderOffset)); - - if (!Buf_Create(&buf, nextHeaderSizeT, allocTemp)) - return SZ_ERROR_MEM; - - res = LookInStream_Read(inStream, buf.data, nextHeaderSizeT); - - if (res == SZ_OK) - { - res = SZ_ERROR_ARCHIVE; - if (CrcCalc(buf.data, nextHeaderSizeT) == nextHeaderCRC) - { - CSzData sd; - UInt64 type; - sd.Data = buf.data; - sd.Size = buf.size; - - res = ReadID(&sd, &type); - - if (res == SZ_OK && type == k7zIdEncodedHeader) - { - CSzAr tempAr; - CBuf tempBuf; - Buf_Init(&tempBuf); - - SzAr_Init(&tempAr); - tempAr.RangeLimit = p->db.RangeLimit; - - res = SzReadAndDecodePackedStreams(inStream, &sd, &tempBuf, 1, p->startPosAfterHeader, &tempAr, allocTemp); - SzAr_Free(&tempAr, allocTemp); - - if (res != SZ_OK) - { - Buf_Free(&tempBuf, allocTemp); - } - else - { - Buf_Free(&buf, allocTemp); - buf.data = tempBuf.data; - buf.size = tempBuf.size; - sd.Data = buf.data; - sd.Size = buf.size; - res = ReadID(&sd, &type); - } - } - - if (res == SZ_OK) - { - if (type == k7zIdHeader) - { - /* - CSzData sd2; - unsigned ttt; - for (ttt = 0; ttt < 40000; ttt++) - { - SzArEx_Free(p, allocMain); - sd2 = sd; - res = SzReadHeader(p, &sd2, inStream, allocMain, allocTemp); - if (res != SZ_OK) - break; - } - */ - res = SzReadHeader(p, &sd, inStream, allocMain, allocTemp); - } - else - res = SZ_ERROR_UNSUPPORTED; - } - } - } - - Buf_Free(&buf, allocTemp); - return res; -} - - -SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream, - ISzAllocPtr allocMain, ISzAllocPtr allocTemp) -{ - SRes res = SzArEx_Open2(p, inStream, allocMain, allocTemp); - if (res != SZ_OK) - SzArEx_Free(p, allocMain); - return res; -} - - -SRes SzArEx_Extract( - const CSzArEx *p, - ILookInStream *inStream, - UInt32 fileIndex, - UInt32 *blockIndex, - Byte **tempBuf, - size_t *outBufferSize, - size_t *offset, - size_t *outSizeProcessed, - ISzAllocPtr allocMain, - ISzAllocPtr allocTemp) -{ - UInt32 folderIndex = p->FileToFolder[fileIndex]; - SRes res = SZ_OK; - - *offset = 0; - *outSizeProcessed = 0; - - if (folderIndex == (UInt32)-1) - { - ISzAlloc_Free(allocMain, *tempBuf); - *blockIndex = folderIndex; - *tempBuf = NULL; - *outBufferSize = 0; - return SZ_OK; - } - - if (*tempBuf == NULL || *blockIndex != folderIndex) - { - UInt64 unpackSizeSpec = SzAr_GetFolderUnpackSize(&p->db, folderIndex); - /* - UInt64 unpackSizeSpec = - p->UnpackPositions[p->FolderToFile[(size_t)folderIndex + 1]] - - p->UnpackPositions[p->FolderToFile[folderIndex]]; - */ - size_t unpackSize = (size_t)unpackSizeSpec; - - if (unpackSize != unpackSizeSpec) - return SZ_ERROR_MEM; - *blockIndex = folderIndex; - ISzAlloc_Free(allocMain, *tempBuf); - *tempBuf = NULL; - - if (res == SZ_OK) - { - *outBufferSize = unpackSize; - if (unpackSize != 0) - { - *tempBuf = (Byte *)ISzAlloc_Alloc(allocMain, unpackSize); - if (*tempBuf == NULL) - res = SZ_ERROR_MEM; - } - - if (res == SZ_OK) - { - res = SzAr_DecodeFolder(&p->db, folderIndex, - inStream, p->dataPos, *tempBuf, unpackSize, allocTemp); - } - } - } - - if (res == SZ_OK) - { - UInt64 unpackPos = p->UnpackPositions[fileIndex]; - *offset = (size_t)(unpackPos - p->UnpackPositions[p->FolderToFile[folderIndex]]); - *outSizeProcessed = (size_t)(p->UnpackPositions[(size_t)fileIndex + 1] - unpackPos); - if (*offset + *outSizeProcessed > *outBufferSize) - return SZ_ERROR_FAIL; - if (SzBitWithVals_Check(&p->CRCs, fileIndex)) - if (CrcCalc(*tempBuf + *offset, *outSizeProcessed) != p->CRCs.Vals[fileIndex]) - res = SZ_ERROR_CRC; - } - - return res; -} - - -size_t SzArEx_GetFileNameUtf16(const CSzArEx *p, size_t fileIndex, UInt16 *dest) -{ - size_t offs = p->FileNameOffsets[fileIndex]; - size_t len = p->FileNameOffsets[fileIndex + 1] - offs; - if (dest != 0) - { - size_t i; - const Byte *src = p->FileNames + offs * 2; - for (i = 0; i < len; i++) - dest[i] = GetUi16(src + i * 2); - } - return len; -} - -/* -size_t SzArEx_GetFullNameLen(const CSzArEx *p, size_t fileIndex) -{ - size_t len; - if (!p->FileNameOffsets) - return 1; - len = 0; - for (;;) - { - UInt32 parent = (UInt32)(Int32)-1; - len += p->FileNameOffsets[fileIndex + 1] - p->FileNameOffsets[fileIndex]; - if SzBitWithVals_Check(&p->Parents, fileIndex) - parent = p->Parents.Vals[fileIndex]; - if (parent == (UInt32)(Int32)-1) - return len; - fileIndex = parent; - } -} - -UInt16 *SzArEx_GetFullNameUtf16_Back(const CSzArEx *p, size_t fileIndex, UInt16 *dest) -{ - BoolInt needSlash; - if (!p->FileNameOffsets) - { - *(--dest) = 0; - return dest; - } - needSlash = False; - for (;;) - { - UInt32 parent = (UInt32)(Int32)-1; - size_t curLen = p->FileNameOffsets[fileIndex + 1] - p->FileNameOffsets[fileIndex]; - SzArEx_GetFileNameUtf16(p, fileIndex, dest - curLen); - if (needSlash) - *(dest - 1) = '/'; - needSlash = True; - dest -= curLen; - - if SzBitWithVals_Check(&p->Parents, fileIndex) - parent = p->Parents.Vals[fileIndex]; - if (parent == (UInt32)(Int32)-1) - return dest; - fileIndex = parent; - } -} -*/ +/* 7zArcIn.c -- 7z Input functions +2021-02-09 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include + +#include "7z.h" +#include "7zBuf.h" +#include "7zCrc.h" +#include "CpuArch.h" + +#define MY_ALLOC(T, p, size, alloc) { \ + if ((p = (T *)ISzAlloc_Alloc(alloc, (size) * sizeof(T))) == NULL) return SZ_ERROR_MEM; } + +#define MY_ALLOC_ZE(T, p, size, alloc) { if ((size) == 0) p = NULL; else MY_ALLOC(T, p, size, alloc) } + +#define MY_ALLOC_AND_CPY(to, size, from, alloc) \ + { MY_ALLOC(Byte, to, size, alloc); memcpy(to, from, size); } + +#define MY_ALLOC_ZE_AND_CPY(to, size, from, alloc) \ + { if ((size) == 0) to = NULL; else { MY_ALLOC_AND_CPY(to, size, from, alloc) } } + +#define k7zMajorVersion 0 + +enum EIdEnum +{ + k7zIdEnd, + k7zIdHeader, + k7zIdArchiveProperties, + k7zIdAdditionalStreamsInfo, + k7zIdMainStreamsInfo, + k7zIdFilesInfo, + k7zIdPackInfo, + k7zIdUnpackInfo, + k7zIdSubStreamsInfo, + k7zIdSize, + k7zIdCRC, + k7zIdFolder, + k7zIdCodersUnpackSize, + k7zIdNumUnpackStream, + k7zIdEmptyStream, + k7zIdEmptyFile, + k7zIdAnti, + k7zIdName, + k7zIdCTime, + k7zIdATime, + k7zIdMTime, + k7zIdWinAttrib, + k7zIdComment, + k7zIdEncodedHeader, + k7zIdStartPos, + k7zIdDummy + // k7zNtSecure, + // k7zParent, + // k7zIsReal +}; + +const Byte k7zSignature[k7zSignatureSize] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C}; + +#define SzBitUi32s_Init(p) { (p)->Defs = NULL; (p)->Vals = NULL; } + +static SRes SzBitUi32s_Alloc(CSzBitUi32s *p, size_t num, ISzAllocPtr alloc) +{ + if (num == 0) + { + p->Defs = NULL; + p->Vals = NULL; + } + else + { + MY_ALLOC(Byte, p->Defs, (num + 7) >> 3, alloc); + MY_ALLOC(UInt32, p->Vals, num, alloc); + } + return SZ_OK; +} + +static void SzBitUi32s_Free(CSzBitUi32s *p, ISzAllocPtr alloc) +{ + ISzAlloc_Free(alloc, p->Defs); p->Defs = NULL; + ISzAlloc_Free(alloc, p->Vals); p->Vals = NULL; +} + +#define SzBitUi64s_Init(p) { (p)->Defs = NULL; (p)->Vals = NULL; } + +static void SzBitUi64s_Free(CSzBitUi64s *p, ISzAllocPtr alloc) +{ + ISzAlloc_Free(alloc, p->Defs); p->Defs = NULL; + ISzAlloc_Free(alloc, p->Vals); p->Vals = NULL; +} + + +static void SzAr_Init(CSzAr *p) +{ + p->NumPackStreams = 0; + p->NumFolders = 0; + + p->PackPositions = NULL; + SzBitUi32s_Init(&p->FolderCRCs); + + p->FoCodersOffsets = NULL; + p->FoStartPackStreamIndex = NULL; + p->FoToCoderUnpackSizes = NULL; + p->FoToMainUnpackSizeIndex = NULL; + p->CoderUnpackSizes = NULL; + + p->CodersData = NULL; + + p->RangeLimit = 0; +} + +static void SzAr_Free(CSzAr *p, ISzAllocPtr alloc) +{ + ISzAlloc_Free(alloc, p->PackPositions); + SzBitUi32s_Free(&p->FolderCRCs, alloc); + + ISzAlloc_Free(alloc, p->FoCodersOffsets); + ISzAlloc_Free(alloc, p->FoStartPackStreamIndex); + ISzAlloc_Free(alloc, p->FoToCoderUnpackSizes); + ISzAlloc_Free(alloc, p->FoToMainUnpackSizeIndex); + ISzAlloc_Free(alloc, p->CoderUnpackSizes); + + ISzAlloc_Free(alloc, p->CodersData); + + SzAr_Init(p); +} + + +void SzArEx_Init(CSzArEx *p) +{ + SzAr_Init(&p->db); + + p->NumFiles = 0; + p->dataPos = 0; + + p->UnpackPositions = NULL; + p->IsDirs = NULL; + + p->FolderToFile = NULL; + p->FileToFolder = NULL; + + p->FileNameOffsets = NULL; + p->FileNames = NULL; + + SzBitUi32s_Init(&p->CRCs); + SzBitUi32s_Init(&p->Attribs); + // SzBitUi32s_Init(&p->Parents); + SzBitUi64s_Init(&p->MTime); + SzBitUi64s_Init(&p->CTime); +} + +void SzArEx_Free(CSzArEx *p, ISzAllocPtr alloc) +{ + ISzAlloc_Free(alloc, p->UnpackPositions); + ISzAlloc_Free(alloc, p->IsDirs); + + ISzAlloc_Free(alloc, p->FolderToFile); + ISzAlloc_Free(alloc, p->FileToFolder); + + ISzAlloc_Free(alloc, p->FileNameOffsets); + ISzAlloc_Free(alloc, p->FileNames); + + SzBitUi32s_Free(&p->CRCs, alloc); + SzBitUi32s_Free(&p->Attribs, alloc); + // SzBitUi32s_Free(&p->Parents, alloc); + SzBitUi64s_Free(&p->MTime, alloc); + SzBitUi64s_Free(&p->CTime, alloc); + + SzAr_Free(&p->db, alloc); + SzArEx_Init(p); +} + + +static int TestSignatureCandidate(const Byte *testBytes) +{ + unsigned i; + for (i = 0; i < k7zSignatureSize; i++) + if (testBytes[i] != k7zSignature[i]) + return 0; + return 1; +} + +#define SzData_Clear(p) { (p)->Data = NULL; (p)->Size = 0; } + +#define SZ_READ_BYTE_SD(_sd_, dest) if ((_sd_)->Size == 0) return SZ_ERROR_ARCHIVE; (_sd_)->Size--; dest = *(_sd_)->Data++; +#define SZ_READ_BYTE(dest) SZ_READ_BYTE_SD(sd, dest) +#define SZ_READ_BYTE_2(dest) if (sd.Size == 0) return SZ_ERROR_ARCHIVE; sd.Size--; dest = *sd.Data++; + +#define SKIP_DATA(sd, size) { sd->Size -= (size_t)(size); sd->Data += (size_t)(size); } +#define SKIP_DATA2(sd, size) { sd.Size -= (size_t)(size); sd.Data += (size_t)(size); } + +#define SZ_READ_32(dest) if (sd.Size < 4) return SZ_ERROR_ARCHIVE; \ + dest = GetUi32(sd.Data); SKIP_DATA2(sd, 4); + +static MY_NO_INLINE SRes ReadNumber(CSzData *sd, UInt64 *value) +{ + Byte firstByte, mask; + unsigned i; + UInt32 v; + + SZ_READ_BYTE(firstByte); + if ((firstByte & 0x80) == 0) + { + *value = firstByte; + return SZ_OK; + } + SZ_READ_BYTE(v); + if ((firstByte & 0x40) == 0) + { + *value = (((UInt32)firstByte & 0x3F) << 8) | v; + return SZ_OK; + } + SZ_READ_BYTE(mask); + *value = v | ((UInt32)mask << 8); + mask = 0x20; + for (i = 2; i < 8; i++) + { + Byte b; + if ((firstByte & mask) == 0) + { + UInt64 highPart = (unsigned)firstByte & (unsigned)(mask - 1); + *value |= (highPart << (8 * i)); + return SZ_OK; + } + SZ_READ_BYTE(b); + *value |= ((UInt64)b << (8 * i)); + mask >>= 1; + } + return SZ_OK; +} + + +static MY_NO_INLINE SRes SzReadNumber32(CSzData *sd, UInt32 *value) +{ + Byte firstByte; + UInt64 value64; + if (sd->Size == 0) + return SZ_ERROR_ARCHIVE; + firstByte = *sd->Data; + if ((firstByte & 0x80) == 0) + { + *value = firstByte; + sd->Data++; + sd->Size--; + return SZ_OK; + } + RINOK(ReadNumber(sd, &value64)); + if (value64 >= (UInt32)0x80000000 - 1) + return SZ_ERROR_UNSUPPORTED; + if (value64 >= ((UInt64)(1) << ((sizeof(size_t) - 1) * 8 + 4))) + return SZ_ERROR_UNSUPPORTED; + *value = (UInt32)value64; + return SZ_OK; +} + +#define ReadID(sd, value) ReadNumber(sd, value) + +static SRes SkipData(CSzData *sd) +{ + UInt64 size; + RINOK(ReadNumber(sd, &size)); + if (size > sd->Size) + return SZ_ERROR_ARCHIVE; + SKIP_DATA(sd, size); + return SZ_OK; +} + +static SRes WaitId(CSzData *sd, UInt32 id) +{ + for (;;) + { + UInt64 type; + RINOK(ReadID(sd, &type)); + if (type == id) + return SZ_OK; + if (type == k7zIdEnd) + return SZ_ERROR_ARCHIVE; + RINOK(SkipData(sd)); + } +} + +static SRes RememberBitVector(CSzData *sd, UInt32 numItems, const Byte **v) +{ + UInt32 numBytes = (numItems + 7) >> 3; + if (numBytes > sd->Size) + return SZ_ERROR_ARCHIVE; + *v = sd->Data; + SKIP_DATA(sd, numBytes); + return SZ_OK; +} + +static UInt32 CountDefinedBits(const Byte *bits, UInt32 numItems) +{ + Byte b = 0; + unsigned m = 0; + UInt32 sum = 0; + for (; numItems != 0; numItems--) + { + if (m == 0) + { + b = *bits++; + m = 8; + } + m--; + sum += ((b >> m) & 1); + } + return sum; +} + +static MY_NO_INLINE SRes ReadBitVector(CSzData *sd, UInt32 numItems, Byte **v, ISzAllocPtr alloc) +{ + Byte allAreDefined; + Byte *v2; + UInt32 numBytes = (numItems + 7) >> 3; + *v = NULL; + SZ_READ_BYTE(allAreDefined); + if (numBytes == 0) + return SZ_OK; + if (allAreDefined == 0) + { + if (numBytes > sd->Size) + return SZ_ERROR_ARCHIVE; + MY_ALLOC_AND_CPY(*v, numBytes, sd->Data, alloc); + SKIP_DATA(sd, numBytes); + return SZ_OK; + } + MY_ALLOC(Byte, *v, numBytes, alloc); + v2 = *v; + memset(v2, 0xFF, (size_t)numBytes); + { + unsigned numBits = (unsigned)numItems & 7; + if (numBits != 0) + v2[(size_t)numBytes - 1] = (Byte)((((UInt32)1 << numBits) - 1) << (8 - numBits)); + } + return SZ_OK; +} + +static MY_NO_INLINE SRes ReadUi32s(CSzData *sd2, UInt32 numItems, CSzBitUi32s *crcs, ISzAllocPtr alloc) +{ + UInt32 i; + CSzData sd; + UInt32 *vals; + const Byte *defs; + MY_ALLOC_ZE(UInt32, crcs->Vals, numItems, alloc); + sd = *sd2; + defs = crcs->Defs; + vals = crcs->Vals; + for (i = 0; i < numItems; i++) + if (SzBitArray_Check(defs, i)) + { + SZ_READ_32(vals[i]); + } + else + vals[i] = 0; + *sd2 = sd; + return SZ_OK; +} + +static SRes ReadBitUi32s(CSzData *sd, UInt32 numItems, CSzBitUi32s *crcs, ISzAllocPtr alloc) +{ + SzBitUi32s_Free(crcs, alloc); + RINOK(ReadBitVector(sd, numItems, &crcs->Defs, alloc)); + return ReadUi32s(sd, numItems, crcs, alloc); +} + +static SRes SkipBitUi32s(CSzData *sd, UInt32 numItems) +{ + Byte allAreDefined; + UInt32 numDefined = numItems; + SZ_READ_BYTE(allAreDefined); + if (!allAreDefined) + { + size_t numBytes = (numItems + 7) >> 3; + if (numBytes > sd->Size) + return SZ_ERROR_ARCHIVE; + numDefined = CountDefinedBits(sd->Data, numItems); + SKIP_DATA(sd, numBytes); + } + if (numDefined > (sd->Size >> 2)) + return SZ_ERROR_ARCHIVE; + SKIP_DATA(sd, (size_t)numDefined * 4); + return SZ_OK; +} + +static SRes ReadPackInfo(CSzAr *p, CSzData *sd, ISzAllocPtr alloc) +{ + RINOK(SzReadNumber32(sd, &p->NumPackStreams)); + + RINOK(WaitId(sd, k7zIdSize)); + MY_ALLOC(UInt64, p->PackPositions, (size_t)p->NumPackStreams + 1, alloc); + { + UInt64 sum = 0; + UInt32 i; + UInt32 numPackStreams = p->NumPackStreams; + for (i = 0; i < numPackStreams; i++) + { + UInt64 packSize; + p->PackPositions[i] = sum; + RINOK(ReadNumber(sd, &packSize)); + sum += packSize; + if (sum < packSize) + return SZ_ERROR_ARCHIVE; + } + p->PackPositions[i] = sum; + } + + for (;;) + { + UInt64 type; + RINOK(ReadID(sd, &type)); + if (type == k7zIdEnd) + return SZ_OK; + if (type == k7zIdCRC) + { + /* CRC of packed streams is unused now */ + RINOK(SkipBitUi32s(sd, p->NumPackStreams)); + continue; + } + RINOK(SkipData(sd)); + } +} + +/* +static SRes SzReadSwitch(CSzData *sd) +{ + Byte external; + RINOK(SzReadByte(sd, &external)); + return (external == 0) ? SZ_OK: SZ_ERROR_UNSUPPORTED; +} +*/ + +#define k_NumCodersStreams_in_Folder_MAX (SZ_NUM_BONDS_IN_FOLDER_MAX + SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX) + +SRes SzGetNextFolderItem(CSzFolder *f, CSzData *sd) +{ + UInt32 numCoders, i; + UInt32 numInStreams = 0; + const Byte *dataStart = sd->Data; + + f->NumCoders = 0; + f->NumBonds = 0; + f->NumPackStreams = 0; + f->UnpackStream = 0; + + RINOK(SzReadNumber32(sd, &numCoders)); + if (numCoders == 0 || numCoders > SZ_NUM_CODERS_IN_FOLDER_MAX) + return SZ_ERROR_UNSUPPORTED; + + for (i = 0; i < numCoders; i++) + { + Byte mainByte; + CSzCoderInfo *coder = f->Coders + i; + unsigned idSize, j; + UInt64 id; + + SZ_READ_BYTE(mainByte); + if ((mainByte & 0xC0) != 0) + return SZ_ERROR_UNSUPPORTED; + + idSize = (unsigned)(mainByte & 0xF); + if (idSize > sizeof(id)) + return SZ_ERROR_UNSUPPORTED; + if (idSize > sd->Size) + return SZ_ERROR_ARCHIVE; + id = 0; + for (j = 0; j < idSize; j++) + { + id = ((id << 8) | *sd->Data); + sd->Data++; + sd->Size--; + } + if (id > (UInt32)0xFFFFFFFF) + return SZ_ERROR_UNSUPPORTED; + coder->MethodID = (UInt32)id; + + coder->NumStreams = 1; + coder->PropsOffset = 0; + coder->PropsSize = 0; + + if ((mainByte & 0x10) != 0) + { + UInt32 numStreams; + + RINOK(SzReadNumber32(sd, &numStreams)); + if (numStreams > k_NumCodersStreams_in_Folder_MAX) + return SZ_ERROR_UNSUPPORTED; + coder->NumStreams = (Byte)numStreams; + + RINOK(SzReadNumber32(sd, &numStreams)); + if (numStreams != 1) + return SZ_ERROR_UNSUPPORTED; + } + + numInStreams += coder->NumStreams; + + if (numInStreams > k_NumCodersStreams_in_Folder_MAX) + return SZ_ERROR_UNSUPPORTED; + + if ((mainByte & 0x20) != 0) + { + UInt32 propsSize = 0; + RINOK(SzReadNumber32(sd, &propsSize)); + if (propsSize > sd->Size) + return SZ_ERROR_ARCHIVE; + if (propsSize >= 0x80) + return SZ_ERROR_UNSUPPORTED; + coder->PropsOffset = (size_t)(sd->Data - dataStart); + coder->PropsSize = (Byte)propsSize; + sd->Data += (size_t)propsSize; + sd->Size -= (size_t)propsSize; + } + } + + /* + if (numInStreams == 1 && numCoders == 1) + { + f->NumPackStreams = 1; + f->PackStreams[0] = 0; + } + else + */ + { + Byte streamUsed[k_NumCodersStreams_in_Folder_MAX]; + UInt32 numBonds, numPackStreams; + + numBonds = numCoders - 1; + if (numInStreams < numBonds) + return SZ_ERROR_ARCHIVE; + if (numBonds > SZ_NUM_BONDS_IN_FOLDER_MAX) + return SZ_ERROR_UNSUPPORTED; + f->NumBonds = numBonds; + + numPackStreams = numInStreams - numBonds; + if (numPackStreams > SZ_NUM_PACK_STREAMS_IN_FOLDER_MAX) + return SZ_ERROR_UNSUPPORTED; + f->NumPackStreams = numPackStreams; + + for (i = 0; i < numInStreams; i++) + streamUsed[i] = False; + + if (numBonds != 0) + { + Byte coderUsed[SZ_NUM_CODERS_IN_FOLDER_MAX]; + + for (i = 0; i < numCoders; i++) + coderUsed[i] = False; + + for (i = 0; i < numBonds; i++) + { + CSzBond *bp = f->Bonds + i; + + RINOK(SzReadNumber32(sd, &bp->InIndex)); + if (bp->InIndex >= numInStreams || streamUsed[bp->InIndex]) + return SZ_ERROR_ARCHIVE; + streamUsed[bp->InIndex] = True; + + RINOK(SzReadNumber32(sd, &bp->OutIndex)); + if (bp->OutIndex >= numCoders || coderUsed[bp->OutIndex]) + return SZ_ERROR_ARCHIVE; + coderUsed[bp->OutIndex] = True; + } + + for (i = 0; i < numCoders; i++) + if (!coderUsed[i]) + { + f->UnpackStream = i; + break; + } + + if (i == numCoders) + return SZ_ERROR_ARCHIVE; + } + + if (numPackStreams == 1) + { + for (i = 0; i < numInStreams; i++) + if (!streamUsed[i]) + break; + if (i == numInStreams) + return SZ_ERROR_ARCHIVE; + f->PackStreams[0] = i; + } + else + for (i = 0; i < numPackStreams; i++) + { + UInt32 index; + RINOK(SzReadNumber32(sd, &index)); + if (index >= numInStreams || streamUsed[index]) + return SZ_ERROR_ARCHIVE; + streamUsed[index] = True; + f->PackStreams[i] = index; + } + } + + f->NumCoders = numCoders; + + return SZ_OK; +} + + +static MY_NO_INLINE SRes SkipNumbers(CSzData *sd2, UInt32 num) +{ + CSzData sd; + sd = *sd2; + for (; num != 0; num--) + { + Byte firstByte, mask; + unsigned i; + SZ_READ_BYTE_2(firstByte); + if ((firstByte & 0x80) == 0) + continue; + if ((firstByte & 0x40) == 0) + { + if (sd.Size == 0) + return SZ_ERROR_ARCHIVE; + sd.Size--; + sd.Data++; + continue; + } + mask = 0x20; + for (i = 2; i < 8 && (firstByte & mask) != 0; i++) + mask >>= 1; + if (i > sd.Size) + return SZ_ERROR_ARCHIVE; + SKIP_DATA2(sd, i); + } + *sd2 = sd; + return SZ_OK; +} + + +#define k_Scan_NumCoders_MAX 64 +#define k_Scan_NumCodersStreams_in_Folder_MAX 64 + + +static SRes ReadUnpackInfo(CSzAr *p, + CSzData *sd2, + UInt32 numFoldersMax, + const CBuf *tempBufs, UInt32 numTempBufs, + ISzAllocPtr alloc) +{ + CSzData sd; + + UInt32 fo, numFolders, numCodersOutStreams, packStreamIndex; + const Byte *startBufPtr; + Byte external; + + RINOK(WaitId(sd2, k7zIdFolder)); + + RINOK(SzReadNumber32(sd2, &numFolders)); + if (numFolders > numFoldersMax) + return SZ_ERROR_UNSUPPORTED; + p->NumFolders = numFolders; + + SZ_READ_BYTE_SD(sd2, external); + if (external == 0) + sd = *sd2; + else + { + UInt32 index; + RINOK(SzReadNumber32(sd2, &index)); + if (index >= numTempBufs) + return SZ_ERROR_ARCHIVE; + sd.Data = tempBufs[index].data; + sd.Size = tempBufs[index].size; + } + + MY_ALLOC(size_t, p->FoCodersOffsets, (size_t)numFolders + 1, alloc); + MY_ALLOC(UInt32, p->FoStartPackStreamIndex, (size_t)numFolders + 1, alloc); + MY_ALLOC(UInt32, p->FoToCoderUnpackSizes, (size_t)numFolders + 1, alloc); + MY_ALLOC_ZE(Byte, p->FoToMainUnpackSizeIndex, (size_t)numFolders, alloc); + + startBufPtr = sd.Data; + + packStreamIndex = 0; + numCodersOutStreams = 0; + + for (fo = 0; fo < numFolders; fo++) + { + UInt32 numCoders, ci, numInStreams = 0; + + p->FoCodersOffsets[fo] = (size_t)(sd.Data - startBufPtr); + + RINOK(SzReadNumber32(&sd, &numCoders)); + if (numCoders == 0 || numCoders > k_Scan_NumCoders_MAX) + return SZ_ERROR_UNSUPPORTED; + + for (ci = 0; ci < numCoders; ci++) + { + Byte mainByte; + unsigned idSize; + UInt32 coderInStreams; + + SZ_READ_BYTE_2(mainByte); + if ((mainByte & 0xC0) != 0) + return SZ_ERROR_UNSUPPORTED; + idSize = (mainByte & 0xF); + if (idSize > 8) + return SZ_ERROR_UNSUPPORTED; + if (idSize > sd.Size) + return SZ_ERROR_ARCHIVE; + SKIP_DATA2(sd, idSize); + + coderInStreams = 1; + + if ((mainByte & 0x10) != 0) + { + UInt32 coderOutStreams; + RINOK(SzReadNumber32(&sd, &coderInStreams)); + RINOK(SzReadNumber32(&sd, &coderOutStreams)); + if (coderInStreams > k_Scan_NumCodersStreams_in_Folder_MAX || coderOutStreams != 1) + return SZ_ERROR_UNSUPPORTED; + } + + numInStreams += coderInStreams; + + if ((mainByte & 0x20) != 0) + { + UInt32 propsSize; + RINOK(SzReadNumber32(&sd, &propsSize)); + if (propsSize > sd.Size) + return SZ_ERROR_ARCHIVE; + SKIP_DATA2(sd, propsSize); + } + } + + { + UInt32 indexOfMainStream = 0; + UInt32 numPackStreams = 1; + + if (numCoders != 1 || numInStreams != 1) + { + Byte streamUsed[k_Scan_NumCodersStreams_in_Folder_MAX]; + Byte coderUsed[k_Scan_NumCoders_MAX]; + + UInt32 i; + UInt32 numBonds = numCoders - 1; + if (numInStreams < numBonds) + return SZ_ERROR_ARCHIVE; + + if (numInStreams > k_Scan_NumCodersStreams_in_Folder_MAX) + return SZ_ERROR_UNSUPPORTED; + + for (i = 0; i < numInStreams; i++) + streamUsed[i] = False; + for (i = 0; i < numCoders; i++) + coderUsed[i] = False; + + for (i = 0; i < numBonds; i++) + { + UInt32 index; + + RINOK(SzReadNumber32(&sd, &index)); + if (index >= numInStreams || streamUsed[index]) + return SZ_ERROR_ARCHIVE; + streamUsed[index] = True; + + RINOK(SzReadNumber32(&sd, &index)); + if (index >= numCoders || coderUsed[index]) + return SZ_ERROR_ARCHIVE; + coderUsed[index] = True; + } + + numPackStreams = numInStreams - numBonds; + + if (numPackStreams != 1) + for (i = 0; i < numPackStreams; i++) + { + UInt32 index; + RINOK(SzReadNumber32(&sd, &index)); + if (index >= numInStreams || streamUsed[index]) + return SZ_ERROR_ARCHIVE; + streamUsed[index] = True; + } + + for (i = 0; i < numCoders; i++) + if (!coderUsed[i]) + { + indexOfMainStream = i; + break; + } + + if (i == numCoders) + return SZ_ERROR_ARCHIVE; + } + + p->FoStartPackStreamIndex[fo] = packStreamIndex; + p->FoToCoderUnpackSizes[fo] = numCodersOutStreams; + p->FoToMainUnpackSizeIndex[fo] = (Byte)indexOfMainStream; + numCodersOutStreams += numCoders; + if (numCodersOutStreams < numCoders) + return SZ_ERROR_UNSUPPORTED; + if (numPackStreams > p->NumPackStreams - packStreamIndex) + return SZ_ERROR_ARCHIVE; + packStreamIndex += numPackStreams; + } + } + + p->FoToCoderUnpackSizes[fo] = numCodersOutStreams; + + { + const size_t dataSize = (size_t)(sd.Data - startBufPtr); + p->FoStartPackStreamIndex[fo] = packStreamIndex; + p->FoCodersOffsets[fo] = dataSize; + MY_ALLOC_ZE_AND_CPY(p->CodersData, dataSize, startBufPtr, alloc); + } + + if (external != 0) + { + if (sd.Size != 0) + return SZ_ERROR_ARCHIVE; + sd = *sd2; + } + + RINOK(WaitId(&sd, k7zIdCodersUnpackSize)); + + MY_ALLOC_ZE(UInt64, p->CoderUnpackSizes, (size_t)numCodersOutStreams, alloc); + { + UInt32 i; + for (i = 0; i < numCodersOutStreams; i++) + { + RINOK(ReadNumber(&sd, p->CoderUnpackSizes + i)); + } + } + + for (;;) + { + UInt64 type; + RINOK(ReadID(&sd, &type)); + if (type == k7zIdEnd) + { + *sd2 = sd; + return SZ_OK; + } + if (type == k7zIdCRC) + { + RINOK(ReadBitUi32s(&sd, numFolders, &p->FolderCRCs, alloc)); + continue; + } + RINOK(SkipData(&sd)); + } +} + + +UInt64 SzAr_GetFolderUnpackSize(const CSzAr *p, UInt32 folderIndex) +{ + return p->CoderUnpackSizes[p->FoToCoderUnpackSizes[folderIndex] + p->FoToMainUnpackSizeIndex[folderIndex]]; +} + + +typedef struct +{ + UInt32 NumTotalSubStreams; + UInt32 NumSubDigests; + CSzData sdNumSubStreams; + CSzData sdSizes; + CSzData sdCRCs; +} CSubStreamInfo; + + +static SRes ReadSubStreamsInfo(CSzAr *p, CSzData *sd, CSubStreamInfo *ssi) +{ + UInt64 type = 0; + UInt32 numSubDigests = 0; + UInt32 numFolders = p->NumFolders; + UInt32 numUnpackStreams = numFolders; + UInt32 numUnpackSizesInData = 0; + + for (;;) + { + RINOK(ReadID(sd, &type)); + if (type == k7zIdNumUnpackStream) + { + UInt32 i; + ssi->sdNumSubStreams.Data = sd->Data; + numUnpackStreams = 0; + numSubDigests = 0; + for (i = 0; i < numFolders; i++) + { + UInt32 numStreams; + RINOK(SzReadNumber32(sd, &numStreams)); + if (numUnpackStreams > numUnpackStreams + numStreams) + return SZ_ERROR_UNSUPPORTED; + numUnpackStreams += numStreams; + if (numStreams != 0) + numUnpackSizesInData += (numStreams - 1); + if (numStreams != 1 || !SzBitWithVals_Check(&p->FolderCRCs, i)) + numSubDigests += numStreams; + } + ssi->sdNumSubStreams.Size = (size_t)(sd->Data - ssi->sdNumSubStreams.Data); + continue; + } + if (type == k7zIdCRC || type == k7zIdSize || type == k7zIdEnd) + break; + RINOK(SkipData(sd)); + } + + if (!ssi->sdNumSubStreams.Data) + { + numSubDigests = numFolders; + if (p->FolderCRCs.Defs) + numSubDigests = numFolders - CountDefinedBits(p->FolderCRCs.Defs, numFolders); + } + + ssi->NumTotalSubStreams = numUnpackStreams; + ssi->NumSubDigests = numSubDigests; + + if (type == k7zIdSize) + { + ssi->sdSizes.Data = sd->Data; + RINOK(SkipNumbers(sd, numUnpackSizesInData)); + ssi->sdSizes.Size = (size_t)(sd->Data - ssi->sdSizes.Data); + RINOK(ReadID(sd, &type)); + } + + for (;;) + { + if (type == k7zIdEnd) + return SZ_OK; + if (type == k7zIdCRC) + { + ssi->sdCRCs.Data = sd->Data; + RINOK(SkipBitUi32s(sd, numSubDigests)); + ssi->sdCRCs.Size = (size_t)(sd->Data - ssi->sdCRCs.Data); + } + else + { + RINOK(SkipData(sd)); + } + RINOK(ReadID(sd, &type)); + } +} + +static SRes SzReadStreamsInfo(CSzAr *p, + CSzData *sd, + UInt32 numFoldersMax, const CBuf *tempBufs, UInt32 numTempBufs, + UInt64 *dataOffset, + CSubStreamInfo *ssi, + ISzAllocPtr alloc) +{ + UInt64 type; + + SzData_Clear(&ssi->sdSizes); + SzData_Clear(&ssi->sdCRCs); + SzData_Clear(&ssi->sdNumSubStreams); + + *dataOffset = 0; + RINOK(ReadID(sd, &type)); + if (type == k7zIdPackInfo) + { + RINOK(ReadNumber(sd, dataOffset)); + if (*dataOffset > p->RangeLimit) + return SZ_ERROR_ARCHIVE; + RINOK(ReadPackInfo(p, sd, alloc)); + if (p->PackPositions[p->NumPackStreams] > p->RangeLimit - *dataOffset) + return SZ_ERROR_ARCHIVE; + RINOK(ReadID(sd, &type)); + } + if (type == k7zIdUnpackInfo) + { + RINOK(ReadUnpackInfo(p, sd, numFoldersMax, tempBufs, numTempBufs, alloc)); + RINOK(ReadID(sd, &type)); + } + if (type == k7zIdSubStreamsInfo) + { + RINOK(ReadSubStreamsInfo(p, sd, ssi)); + RINOK(ReadID(sd, &type)); + } + else + { + ssi->NumTotalSubStreams = p->NumFolders; + // ssi->NumSubDigests = 0; + } + + return (type == k7zIdEnd ? SZ_OK : SZ_ERROR_UNSUPPORTED); +} + +static SRes SzReadAndDecodePackedStreams( + ILookInStream *inStream, + CSzData *sd, + CBuf *tempBufs, + UInt32 numFoldersMax, + UInt64 baseOffset, + CSzAr *p, + ISzAllocPtr allocTemp) +{ + UInt64 dataStartPos; + UInt32 fo; + CSubStreamInfo ssi; + + RINOK(SzReadStreamsInfo(p, sd, numFoldersMax, NULL, 0, &dataStartPos, &ssi, allocTemp)); + + dataStartPos += baseOffset; + if (p->NumFolders == 0) + return SZ_ERROR_ARCHIVE; + + for (fo = 0; fo < p->NumFolders; fo++) + Buf_Init(tempBufs + fo); + + for (fo = 0; fo < p->NumFolders; fo++) + { + CBuf *tempBuf = tempBufs + fo; + UInt64 unpackSize = SzAr_GetFolderUnpackSize(p, fo); + if ((size_t)unpackSize != unpackSize) + return SZ_ERROR_MEM; + if (!Buf_Create(tempBuf, (size_t)unpackSize, allocTemp)) + return SZ_ERROR_MEM; + } + + for (fo = 0; fo < p->NumFolders; fo++) + { + const CBuf *tempBuf = tempBufs + fo; + RINOK(LookInStream_SeekTo(inStream, dataStartPos)); + RINOK(SzAr_DecodeFolder(p, fo, inStream, dataStartPos, tempBuf->data, tempBuf->size, allocTemp)); + } + + return SZ_OK; +} + +static SRes SzReadFileNames(const Byte *data, size_t size, UInt32 numFiles, size_t *offsets) +{ + size_t pos = 0; + *offsets++ = 0; + if (numFiles == 0) + return (size == 0) ? SZ_OK : SZ_ERROR_ARCHIVE; + if (size < 2) + return SZ_ERROR_ARCHIVE; + if (data[size - 2] != 0 || data[size - 1] != 0) + return SZ_ERROR_ARCHIVE; + do + { + const Byte *p; + if (pos == size) + return SZ_ERROR_ARCHIVE; + for (p = data + pos; + #ifdef _WIN32 + *(const UInt16 *)(const void *)p != 0 + #else + p[0] != 0 || p[1] != 0 + #endif + ; p += 2); + pos = (size_t)(p - data) + 2; + *offsets++ = (pos >> 1); + } + while (--numFiles); + return (pos == size) ? SZ_OK : SZ_ERROR_ARCHIVE; +} + +static MY_NO_INLINE SRes ReadTime(CSzBitUi64s *p, UInt32 num, + CSzData *sd2, + const CBuf *tempBufs, UInt32 numTempBufs, + ISzAllocPtr alloc) +{ + CSzData sd; + UInt32 i; + CNtfsFileTime *vals; + Byte *defs; + Byte external; + + RINOK(ReadBitVector(sd2, num, &p->Defs, alloc)); + + SZ_READ_BYTE_SD(sd2, external); + if (external == 0) + sd = *sd2; + else + { + UInt32 index; + RINOK(SzReadNumber32(sd2, &index)); + if (index >= numTempBufs) + return SZ_ERROR_ARCHIVE; + sd.Data = tempBufs[index].data; + sd.Size = tempBufs[index].size; + } + + MY_ALLOC_ZE(CNtfsFileTime, p->Vals, num, alloc); + vals = p->Vals; + defs = p->Defs; + for (i = 0; i < num; i++) + if (SzBitArray_Check(defs, i)) + { + if (sd.Size < 8) + return SZ_ERROR_ARCHIVE; + vals[i].Low = GetUi32(sd.Data); + vals[i].High = GetUi32(sd.Data + 4); + SKIP_DATA2(sd, 8); + } + else + vals[i].High = vals[i].Low = 0; + + if (external == 0) + *sd2 = sd; + + return SZ_OK; +} + + +#define NUM_ADDITIONAL_STREAMS_MAX 8 + + +static SRes SzReadHeader2( + CSzArEx *p, /* allocMain */ + CSzData *sd, + ILookInStream *inStream, + CBuf *tempBufs, UInt32 *numTempBufs, + ISzAllocPtr allocMain, + ISzAllocPtr allocTemp + ) +{ + CSubStreamInfo ssi; + +{ + UInt64 type; + + SzData_Clear(&ssi.sdSizes); + SzData_Clear(&ssi.sdCRCs); + SzData_Clear(&ssi.sdNumSubStreams); + + ssi.NumSubDigests = 0; + ssi.NumTotalSubStreams = 0; + + RINOK(ReadID(sd, &type)); + + if (type == k7zIdArchiveProperties) + { + for (;;) + { + UInt64 type2; + RINOK(ReadID(sd, &type2)); + if (type2 == k7zIdEnd) + break; + RINOK(SkipData(sd)); + } + RINOK(ReadID(sd, &type)); + } + + if (type == k7zIdAdditionalStreamsInfo) + { + CSzAr tempAr; + SRes res; + + SzAr_Init(&tempAr); + tempAr.RangeLimit = p->db.RangeLimit; + + res = SzReadAndDecodePackedStreams(inStream, sd, tempBufs, NUM_ADDITIONAL_STREAMS_MAX, + p->startPosAfterHeader, &tempAr, allocTemp); + *numTempBufs = tempAr.NumFolders; + SzAr_Free(&tempAr, allocTemp); + + if (res != SZ_OK) + return res; + RINOK(ReadID(sd, &type)); + } + + if (type == k7zIdMainStreamsInfo) + { + RINOK(SzReadStreamsInfo(&p->db, sd, (UInt32)1 << 30, tempBufs, *numTempBufs, + &p->dataPos, &ssi, allocMain)); + p->dataPos += p->startPosAfterHeader; + RINOK(ReadID(sd, &type)); + } + + if (type == k7zIdEnd) + { + return SZ_OK; + } + + if (type != k7zIdFilesInfo) + return SZ_ERROR_ARCHIVE; +} + +{ + UInt32 numFiles = 0; + UInt32 numEmptyStreams = 0; + const Byte *emptyStreams = NULL; + const Byte *emptyFiles = NULL; + + RINOK(SzReadNumber32(sd, &numFiles)); + p->NumFiles = numFiles; + + for (;;) + { + UInt64 type; + UInt64 size; + RINOK(ReadID(sd, &type)); + if (type == k7zIdEnd) + break; + RINOK(ReadNumber(sd, &size)); + if (size > sd->Size) + return SZ_ERROR_ARCHIVE; + + if (type >= ((UInt32)1 << 8)) + { + SKIP_DATA(sd, size); + } + else switch ((unsigned)type) + { + case k7zIdName: + { + size_t namesSize; + const Byte *namesData; + Byte external; + + SZ_READ_BYTE(external); + if (external == 0) + { + namesSize = (size_t)size - 1; + namesData = sd->Data; + } + else + { + UInt32 index; + RINOK(SzReadNumber32(sd, &index)); + if (index >= *numTempBufs) + return SZ_ERROR_ARCHIVE; + namesData = (tempBufs)[index].data; + namesSize = (tempBufs)[index].size; + } + + if ((namesSize & 1) != 0) + return SZ_ERROR_ARCHIVE; + MY_ALLOC(size_t, p->FileNameOffsets, numFiles + 1, allocMain); + MY_ALLOC_ZE_AND_CPY(p->FileNames, namesSize, namesData, allocMain); + RINOK(SzReadFileNames(p->FileNames, namesSize, numFiles, p->FileNameOffsets)) + if (external == 0) + { + SKIP_DATA(sd, namesSize); + } + break; + } + case k7zIdEmptyStream: + { + RINOK(RememberBitVector(sd, numFiles, &emptyStreams)); + numEmptyStreams = CountDefinedBits(emptyStreams, numFiles); + emptyFiles = NULL; + break; + } + case k7zIdEmptyFile: + { + RINOK(RememberBitVector(sd, numEmptyStreams, &emptyFiles)); + break; + } + case k7zIdWinAttrib: + { + Byte external; + CSzData sdSwitch; + CSzData *sdPtr; + SzBitUi32s_Free(&p->Attribs, allocMain); + RINOK(ReadBitVector(sd, numFiles, &p->Attribs.Defs, allocMain)); + + SZ_READ_BYTE(external); + if (external == 0) + sdPtr = sd; + else + { + UInt32 index; + RINOK(SzReadNumber32(sd, &index)); + if (index >= *numTempBufs) + return SZ_ERROR_ARCHIVE; + sdSwitch.Data = (tempBufs)[index].data; + sdSwitch.Size = (tempBufs)[index].size; + sdPtr = &sdSwitch; + } + RINOK(ReadUi32s(sdPtr, numFiles, &p->Attribs, allocMain)); + break; + } + /* + case k7zParent: + { + SzBitUi32s_Free(&p->Parents, allocMain); + RINOK(ReadBitVector(sd, numFiles, &p->Parents.Defs, allocMain)); + RINOK(SzReadSwitch(sd)); + RINOK(ReadUi32s(sd, numFiles, &p->Parents, allocMain)); + break; + } + */ + case k7zIdMTime: RINOK(ReadTime(&p->MTime, numFiles, sd, tempBufs, *numTempBufs, allocMain)); break; + case k7zIdCTime: RINOK(ReadTime(&p->CTime, numFiles, sd, tempBufs, *numTempBufs, allocMain)); break; + default: + { + SKIP_DATA(sd, size); + } + } + } + + if (numFiles - numEmptyStreams != ssi.NumTotalSubStreams) + return SZ_ERROR_ARCHIVE; + + for (;;) + { + UInt64 type; + RINOK(ReadID(sd, &type)); + if (type == k7zIdEnd) + break; + RINOK(SkipData(sd)); + } + + { + UInt32 i; + UInt32 emptyFileIndex = 0; + UInt32 folderIndex = 0; + UInt32 remSubStreams = 0; + UInt32 numSubStreams = 0; + UInt64 unpackPos = 0; + const Byte *digestsDefs = NULL; + const Byte *digestsVals = NULL; + UInt32 digestsValsIndex = 0; + UInt32 digestIndex; + Byte allDigestsDefined = 0; + Byte isDirMask = 0; + Byte crcMask = 0; + Byte mask = 0x80; + + MY_ALLOC(UInt32, p->FolderToFile, p->db.NumFolders + 1, allocMain); + MY_ALLOC_ZE(UInt32, p->FileToFolder, p->NumFiles, allocMain); + MY_ALLOC(UInt64, p->UnpackPositions, p->NumFiles + 1, allocMain); + MY_ALLOC_ZE(Byte, p->IsDirs, (p->NumFiles + 7) >> 3, allocMain); + + RINOK(SzBitUi32s_Alloc(&p->CRCs, p->NumFiles, allocMain)); + + if (ssi.sdCRCs.Size != 0) + { + SZ_READ_BYTE_SD(&ssi.sdCRCs, allDigestsDefined); + if (allDigestsDefined) + digestsVals = ssi.sdCRCs.Data; + else + { + size_t numBytes = (ssi.NumSubDigests + 7) >> 3; + digestsDefs = ssi.sdCRCs.Data; + digestsVals = digestsDefs + numBytes; + } + } + + digestIndex = 0; + + for (i = 0; i < numFiles; i++, mask >>= 1) + { + if (mask == 0) + { + UInt32 byteIndex = (i - 1) >> 3; + p->IsDirs[byteIndex] = isDirMask; + p->CRCs.Defs[byteIndex] = crcMask; + isDirMask = 0; + crcMask = 0; + mask = 0x80; + } + + p->UnpackPositions[i] = unpackPos; + p->CRCs.Vals[i] = 0; + + if (emptyStreams && SzBitArray_Check(emptyStreams, i)) + { + if (emptyFiles) + { + if (!SzBitArray_Check(emptyFiles, emptyFileIndex)) + isDirMask |= mask; + emptyFileIndex++; + } + else + isDirMask |= mask; + if (remSubStreams == 0) + { + p->FileToFolder[i] = (UInt32)-1; + continue; + } + } + + if (remSubStreams == 0) + { + for (;;) + { + if (folderIndex >= p->db.NumFolders) + return SZ_ERROR_ARCHIVE; + p->FolderToFile[folderIndex] = i; + numSubStreams = 1; + if (ssi.sdNumSubStreams.Data) + { + RINOK(SzReadNumber32(&ssi.sdNumSubStreams, &numSubStreams)); + } + remSubStreams = numSubStreams; + if (numSubStreams != 0) + break; + { + UInt64 folderUnpackSize = SzAr_GetFolderUnpackSize(&p->db, folderIndex); + unpackPos += folderUnpackSize; + if (unpackPos < folderUnpackSize) + return SZ_ERROR_ARCHIVE; + } + + folderIndex++; + } + } + + p->FileToFolder[i] = folderIndex; + + if (emptyStreams && SzBitArray_Check(emptyStreams, i)) + continue; + + if (--remSubStreams == 0) + { + UInt64 folderUnpackSize = SzAr_GetFolderUnpackSize(&p->db, folderIndex); + UInt64 startFolderUnpackPos = p->UnpackPositions[p->FolderToFile[folderIndex]]; + if (folderUnpackSize < unpackPos - startFolderUnpackPos) + return SZ_ERROR_ARCHIVE; + unpackPos = startFolderUnpackPos + folderUnpackSize; + if (unpackPos < folderUnpackSize) + return SZ_ERROR_ARCHIVE; + + if (numSubStreams == 1 && SzBitWithVals_Check(&p->db.FolderCRCs, i)) + { + p->CRCs.Vals[i] = p->db.FolderCRCs.Vals[folderIndex]; + crcMask |= mask; + } + else if (allDigestsDefined || (digestsDefs && SzBitArray_Check(digestsDefs, digestIndex))) + { + p->CRCs.Vals[i] = GetUi32(digestsVals + (size_t)digestsValsIndex * 4); + digestsValsIndex++; + crcMask |= mask; + } + + folderIndex++; + } + else + { + UInt64 v; + RINOK(ReadNumber(&ssi.sdSizes, &v)); + unpackPos += v; + if (unpackPos < v) + return SZ_ERROR_ARCHIVE; + if (allDigestsDefined || (digestsDefs && SzBitArray_Check(digestsDefs, digestIndex))) + { + p->CRCs.Vals[i] = GetUi32(digestsVals + (size_t)digestsValsIndex * 4); + digestsValsIndex++; + crcMask |= mask; + } + } + } + + if (mask != 0x80) + { + UInt32 byteIndex = (i - 1) >> 3; + p->IsDirs[byteIndex] = isDirMask; + p->CRCs.Defs[byteIndex] = crcMask; + } + + p->UnpackPositions[i] = unpackPos; + + if (remSubStreams != 0) + return SZ_ERROR_ARCHIVE; + + for (;;) + { + p->FolderToFile[folderIndex] = i; + if (folderIndex >= p->db.NumFolders) + break; + if (!ssi.sdNumSubStreams.Data) + return SZ_ERROR_ARCHIVE; + RINOK(SzReadNumber32(&ssi.sdNumSubStreams, &numSubStreams)); + if (numSubStreams != 0) + return SZ_ERROR_ARCHIVE; + /* + { + UInt64 folderUnpackSize = SzAr_GetFolderUnpackSize(&p->db, folderIndex); + unpackPos += folderUnpackSize; + if (unpackPos < folderUnpackSize) + return SZ_ERROR_ARCHIVE; + } + */ + folderIndex++; + } + + if (ssi.sdNumSubStreams.Data && ssi.sdNumSubStreams.Size != 0) + return SZ_ERROR_ARCHIVE; + } +} + return SZ_OK; +} + + +static SRes SzReadHeader( + CSzArEx *p, + CSzData *sd, + ILookInStream *inStream, + ISzAllocPtr allocMain, + ISzAllocPtr allocTemp) +{ + UInt32 i; + UInt32 numTempBufs = 0; + SRes res; + CBuf tempBufs[NUM_ADDITIONAL_STREAMS_MAX]; + + for (i = 0; i < NUM_ADDITIONAL_STREAMS_MAX; i++) + Buf_Init(tempBufs + i); + + res = SzReadHeader2(p, sd, inStream, + tempBufs, &numTempBufs, + allocMain, allocTemp); + + for (i = 0; i < NUM_ADDITIONAL_STREAMS_MAX; i++) + Buf_Free(tempBufs + i, allocTemp); + + RINOK(res); + + if (sd->Size != 0) + return SZ_ERROR_FAIL; + + return res; +} + +static SRes SzArEx_Open2( + CSzArEx *p, + ILookInStream *inStream, + ISzAllocPtr allocMain, + ISzAllocPtr allocTemp) +{ + Byte header[k7zStartHeaderSize]; + Int64 startArcPos; + UInt64 nextHeaderOffset, nextHeaderSize; + size_t nextHeaderSizeT; + UInt32 nextHeaderCRC; + CBuf buf; + SRes res; + + startArcPos = 0; + RINOK(ILookInStream_Seek(inStream, &startArcPos, SZ_SEEK_CUR)); + + RINOK(LookInStream_Read2(inStream, header, k7zStartHeaderSize, SZ_ERROR_NO_ARCHIVE)); + + if (!TestSignatureCandidate(header)) + return SZ_ERROR_NO_ARCHIVE; + if (header[6] != k7zMajorVersion) + return SZ_ERROR_UNSUPPORTED; + + nextHeaderOffset = GetUi64(header + 12); + nextHeaderSize = GetUi64(header + 20); + nextHeaderCRC = GetUi32(header + 28); + + p->startPosAfterHeader = (UInt64)startArcPos + k7zStartHeaderSize; + + if (CrcCalc(header + 12, 20) != GetUi32(header + 8)) + return SZ_ERROR_CRC; + + p->db.RangeLimit = nextHeaderOffset; + + nextHeaderSizeT = (size_t)nextHeaderSize; + if (nextHeaderSizeT != nextHeaderSize) + return SZ_ERROR_MEM; + if (nextHeaderSizeT == 0) + return SZ_OK; + if (nextHeaderOffset > nextHeaderOffset + nextHeaderSize || + nextHeaderOffset > nextHeaderOffset + nextHeaderSize + k7zStartHeaderSize) + return SZ_ERROR_NO_ARCHIVE; + + { + Int64 pos = 0; + RINOK(ILookInStream_Seek(inStream, &pos, SZ_SEEK_END)); + if ((UInt64)pos < (UInt64)startArcPos + nextHeaderOffset || + (UInt64)pos < (UInt64)startArcPos + k7zStartHeaderSize + nextHeaderOffset || + (UInt64)pos < (UInt64)startArcPos + k7zStartHeaderSize + nextHeaderOffset + nextHeaderSize) + return SZ_ERROR_INPUT_EOF; + } + + RINOK(LookInStream_SeekTo(inStream, (UInt64)startArcPos + k7zStartHeaderSize + nextHeaderOffset)); + + if (!Buf_Create(&buf, nextHeaderSizeT, allocTemp)) + return SZ_ERROR_MEM; + + res = LookInStream_Read(inStream, buf.data, nextHeaderSizeT); + + if (res == SZ_OK) + { + res = SZ_ERROR_ARCHIVE; + if (CrcCalc(buf.data, nextHeaderSizeT) == nextHeaderCRC) + { + CSzData sd; + UInt64 type; + sd.Data = buf.data; + sd.Size = buf.size; + + res = ReadID(&sd, &type); + + if (res == SZ_OK && type == k7zIdEncodedHeader) + { + CSzAr tempAr; + CBuf tempBuf; + Buf_Init(&tempBuf); + + SzAr_Init(&tempAr); + tempAr.RangeLimit = p->db.RangeLimit; + + res = SzReadAndDecodePackedStreams(inStream, &sd, &tempBuf, 1, p->startPosAfterHeader, &tempAr, allocTemp); + SzAr_Free(&tempAr, allocTemp); + + if (res != SZ_OK) + { + Buf_Free(&tempBuf, allocTemp); + } + else + { + Buf_Free(&buf, allocTemp); + buf.data = tempBuf.data; + buf.size = tempBuf.size; + sd.Data = buf.data; + sd.Size = buf.size; + res = ReadID(&sd, &type); + } + } + + if (res == SZ_OK) + { + if (type == k7zIdHeader) + { + /* + CSzData sd2; + unsigned ttt; + for (ttt = 0; ttt < 40000; ttt++) + { + SzArEx_Free(p, allocMain); + sd2 = sd; + res = SzReadHeader(p, &sd2, inStream, allocMain, allocTemp); + if (res != SZ_OK) + break; + } + */ + res = SzReadHeader(p, &sd, inStream, allocMain, allocTemp); + } + else + res = SZ_ERROR_UNSUPPORTED; + } + } + } + + Buf_Free(&buf, allocTemp); + return res; +} + + +SRes SzArEx_Open(CSzArEx *p, ILookInStream *inStream, + ISzAllocPtr allocMain, ISzAllocPtr allocTemp) +{ + SRes res = SzArEx_Open2(p, inStream, allocMain, allocTemp); + if (res != SZ_OK) + SzArEx_Free(p, allocMain); + return res; +} + + +SRes SzArEx_Extract( + const CSzArEx *p, + ILookInStream *inStream, + UInt32 fileIndex, + UInt32 *blockIndex, + Byte **tempBuf, + size_t *outBufferSize, + size_t *offset, + size_t *outSizeProcessed, + ISzAllocPtr allocMain, + ISzAllocPtr allocTemp) +{ + UInt32 folderIndex = p->FileToFolder[fileIndex]; + SRes res = SZ_OK; + + *offset = 0; + *outSizeProcessed = 0; + + if (folderIndex == (UInt32)-1) + { + ISzAlloc_Free(allocMain, *tempBuf); + *blockIndex = folderIndex; + *tempBuf = NULL; + *outBufferSize = 0; + return SZ_OK; + } + + if (*tempBuf == NULL || *blockIndex != folderIndex) + { + UInt64 unpackSizeSpec = SzAr_GetFolderUnpackSize(&p->db, folderIndex); + /* + UInt64 unpackSizeSpec = + p->UnpackPositions[p->FolderToFile[(size_t)folderIndex + 1]] - + p->UnpackPositions[p->FolderToFile[folderIndex]]; + */ + size_t unpackSize = (size_t)unpackSizeSpec; + + if (unpackSize != unpackSizeSpec) + return SZ_ERROR_MEM; + *blockIndex = folderIndex; + ISzAlloc_Free(allocMain, *tempBuf); + *tempBuf = NULL; + + if (res == SZ_OK) + { + *outBufferSize = unpackSize; + if (unpackSize != 0) + { + *tempBuf = (Byte *)ISzAlloc_Alloc(allocMain, unpackSize); + if (*tempBuf == NULL) + res = SZ_ERROR_MEM; + } + + if (res == SZ_OK) + { + res = SzAr_DecodeFolder(&p->db, folderIndex, + inStream, p->dataPos, *tempBuf, unpackSize, allocTemp); + } + } + } + + if (res == SZ_OK) + { + UInt64 unpackPos = p->UnpackPositions[fileIndex]; + *offset = (size_t)(unpackPos - p->UnpackPositions[p->FolderToFile[folderIndex]]); + *outSizeProcessed = (size_t)(p->UnpackPositions[(size_t)fileIndex + 1] - unpackPos); + if (*offset + *outSizeProcessed > *outBufferSize) + return SZ_ERROR_FAIL; + if (SzBitWithVals_Check(&p->CRCs, fileIndex)) + if (CrcCalc(*tempBuf + *offset, *outSizeProcessed) != p->CRCs.Vals[fileIndex]) + res = SZ_ERROR_CRC; + } + + return res; +} + + +size_t SzArEx_GetFileNameUtf16(const CSzArEx *p, size_t fileIndex, UInt16 *dest) +{ + size_t offs = p->FileNameOffsets[fileIndex]; + size_t len = p->FileNameOffsets[fileIndex + 1] - offs; + if (dest != 0) + { + size_t i; + const Byte *src = p->FileNames + offs * 2; + for (i = 0; i < len; i++) + dest[i] = GetUi16(src + i * 2); + } + return len; +} + +/* +size_t SzArEx_GetFullNameLen(const CSzArEx *p, size_t fileIndex) +{ + size_t len; + if (!p->FileNameOffsets) + return 1; + len = 0; + for (;;) + { + UInt32 parent = (UInt32)(Int32)-1; + len += p->FileNameOffsets[fileIndex + 1] - p->FileNameOffsets[fileIndex]; + if SzBitWithVals_Check(&p->Parents, fileIndex) + parent = p->Parents.Vals[fileIndex]; + if (parent == (UInt32)(Int32)-1) + return len; + fileIndex = parent; + } +} + +UInt16 *SzArEx_GetFullNameUtf16_Back(const CSzArEx *p, size_t fileIndex, UInt16 *dest) +{ + BoolInt needSlash; + if (!p->FileNameOffsets) + { + *(--dest) = 0; + return dest; + } + needSlash = False; + for (;;) + { + UInt32 parent = (UInt32)(Int32)-1; + size_t curLen = p->FileNameOffsets[fileIndex + 1] - p->FileNameOffsets[fileIndex]; + SzArEx_GetFileNameUtf16(p, fileIndex, dest - curLen); + if (needSlash) + *(dest - 1) = '/'; + needSlash = True; + dest -= curLen; + + if SzBitWithVals_Check(&p->Parents, fileIndex) + parent = p->Parents.Vals[fileIndex]; + if (parent == (UInt32)(Int32)-1) + return dest; + fileIndex = parent; + } +} +*/ diff --git a/deps/LZMA-SDK/C/7zBuf.c b/deps/LZMA-SDK/C/7zBuf.c index 438bba68b..8865c32a8 100644 --- a/deps/LZMA-SDK/C/7zBuf.c +++ b/deps/LZMA-SDK/C/7zBuf.c @@ -1,36 +1,36 @@ -/* 7zBuf.c -- Byte Buffer -2017-04-03 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include "7zBuf.h" - -void Buf_Init(CBuf *p) -{ - p->data = 0; - p->size = 0; -} - -int Buf_Create(CBuf *p, size_t size, ISzAllocPtr alloc) -{ - p->size = 0; - if (size == 0) - { - p->data = 0; - return 1; - } - p->data = (Byte *)ISzAlloc_Alloc(alloc, size); - if (p->data) - { - p->size = size; - return 1; - } - return 0; -} - -void Buf_Free(CBuf *p, ISzAllocPtr alloc) -{ - ISzAlloc_Free(alloc, p->data); - p->data = 0; - p->size = 0; -} +/* 7zBuf.c -- Byte Buffer +2017-04-03 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "7zBuf.h" + +void Buf_Init(CBuf *p) +{ + p->data = 0; + p->size = 0; +} + +int Buf_Create(CBuf *p, size_t size, ISzAllocPtr alloc) +{ + p->size = 0; + if (size == 0) + { + p->data = 0; + return 1; + } + p->data = (Byte *)ISzAlloc_Alloc(alloc, size); + if (p->data) + { + p->size = size; + return 1; + } + return 0; +} + +void Buf_Free(CBuf *p, ISzAllocPtr alloc) +{ + ISzAlloc_Free(alloc, p->data); + p->data = 0; + p->size = 0; +} diff --git a/deps/LZMA-SDK/C/7zBuf.h b/deps/LZMA-SDK/C/7zBuf.h index 5942d6e62..81d1b5b64 100644 --- a/deps/LZMA-SDK/C/7zBuf.h +++ b/deps/LZMA-SDK/C/7zBuf.h @@ -1,35 +1,35 @@ -/* 7zBuf.h -- Byte Buffer -2017-04-03 : Igor Pavlov : Public domain */ - -#ifndef __7Z_BUF_H -#define __7Z_BUF_H - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -typedef struct -{ - Byte *data; - size_t size; -} CBuf; - -void Buf_Init(CBuf *p); -int Buf_Create(CBuf *p, size_t size, ISzAllocPtr alloc); -void Buf_Free(CBuf *p, ISzAllocPtr alloc); - -typedef struct -{ - Byte *data; - size_t size; - size_t pos; -} CDynBuf; - -void DynBuf_Construct(CDynBuf *p); -void DynBuf_SeekToBeg(CDynBuf *p); -int DynBuf_Write(CDynBuf *p, const Byte *buf, size_t size, ISzAllocPtr alloc); -void DynBuf_Free(CDynBuf *p, ISzAllocPtr alloc); - -EXTERN_C_END - -#endif +/* 7zBuf.h -- Byte Buffer +2017-04-03 : Igor Pavlov : Public domain */ + +#ifndef __7Z_BUF_H +#define __7Z_BUF_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +typedef struct +{ + Byte *data; + size_t size; +} CBuf; + +void Buf_Init(CBuf *p); +int Buf_Create(CBuf *p, size_t size, ISzAllocPtr alloc); +void Buf_Free(CBuf *p, ISzAllocPtr alloc); + +typedef struct +{ + Byte *data; + size_t size; + size_t pos; +} CDynBuf; + +void DynBuf_Construct(CDynBuf *p); +void DynBuf_SeekToBeg(CDynBuf *p); +int DynBuf_Write(CDynBuf *p, const Byte *buf, size_t size, ISzAllocPtr alloc); +void DynBuf_Free(CDynBuf *p, ISzAllocPtr alloc); + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/7zBuf2.c b/deps/LZMA-SDK/C/7zBuf2.c index 49b4343b6..208347416 100644 --- a/deps/LZMA-SDK/C/7zBuf2.c +++ b/deps/LZMA-SDK/C/7zBuf2.c @@ -1,52 +1,52 @@ -/* 7zBuf2.c -- Byte Buffer -2017-04-03 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include - -#include "7zBuf.h" - -void DynBuf_Construct(CDynBuf *p) -{ - p->data = 0; - p->size = 0; - p->pos = 0; -} - -void DynBuf_SeekToBeg(CDynBuf *p) -{ - p->pos = 0; -} - -int DynBuf_Write(CDynBuf *p, const Byte *buf, size_t size, ISzAllocPtr alloc) -{ - if (size > p->size - p->pos) - { - size_t newSize = p->pos + size; - Byte *data; - newSize += newSize / 4; - data = (Byte *)ISzAlloc_Alloc(alloc, newSize); - if (!data) - return 0; - p->size = newSize; - if (p->pos != 0) - memcpy(data, p->data, p->pos); - ISzAlloc_Free(alloc, p->data); - p->data = data; - } - if (size != 0) - { - memcpy(p->data + p->pos, buf, size); - p->pos += size; - } - return 1; -} - -void DynBuf_Free(CDynBuf *p, ISzAllocPtr alloc) -{ - ISzAlloc_Free(alloc, p->data); - p->data = 0; - p->size = 0; - p->pos = 0; -} +/* 7zBuf2.c -- Byte Buffer +2017-04-03 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include + +#include "7zBuf.h" + +void DynBuf_Construct(CDynBuf *p) +{ + p->data = 0; + p->size = 0; + p->pos = 0; +} + +void DynBuf_SeekToBeg(CDynBuf *p) +{ + p->pos = 0; +} + +int DynBuf_Write(CDynBuf *p, const Byte *buf, size_t size, ISzAllocPtr alloc) +{ + if (size > p->size - p->pos) + { + size_t newSize = p->pos + size; + Byte *data; + newSize += newSize / 4; + data = (Byte *)ISzAlloc_Alloc(alloc, newSize); + if (!data) + return 0; + p->size = newSize; + if (p->pos != 0) + memcpy(data, p->data, p->pos); + ISzAlloc_Free(alloc, p->data); + p->data = data; + } + if (size != 0) + { + memcpy(p->data + p->pos, buf, size); + p->pos += size; + } + return 1; +} + +void DynBuf_Free(CDynBuf *p, ISzAllocPtr alloc) +{ + ISzAlloc_Free(alloc, p->data); + p->data = 0; + p->size = 0; + p->pos = 0; +} diff --git a/deps/LZMA-SDK/C/7zCrc.c b/deps/LZMA-SDK/C/7zCrc.c index c7ec353d6..f186324dd 100644 --- a/deps/LZMA-SDK/C/7zCrc.c +++ b/deps/LZMA-SDK/C/7zCrc.c @@ -1,322 +1,322 @@ -/* 7zCrc.c -- CRC32 init -2021-04-01 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include "7zCrc.h" -#include "CpuArch.h" - -#define kCrcPoly 0xEDB88320 - -#ifdef MY_CPU_LE - #define CRC_NUM_TABLES 8 -#else - #define CRC_NUM_TABLES 9 - - #define CRC_UINT32_SWAP(v) ((v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | (v << 24)) - - UInt32 MY_FAST_CALL CrcUpdateT1_BeT4(UInt32 v, const void *data, size_t size, const UInt32 *table); - UInt32 MY_FAST_CALL CrcUpdateT1_BeT8(UInt32 v, const void *data, size_t size, const UInt32 *table); -#endif - -#ifndef MY_CPU_BE - UInt32 MY_FAST_CALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const UInt32 *table); - UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table); -#endif - -typedef UInt32 (MY_FAST_CALL *CRC_FUNC)(UInt32 v, const void *data, size_t size, const UInt32 *table); - -extern -CRC_FUNC g_CrcUpdateT4; -CRC_FUNC g_CrcUpdateT4; -extern -CRC_FUNC g_CrcUpdateT8; -CRC_FUNC g_CrcUpdateT8; -extern -CRC_FUNC g_CrcUpdateT0_32; -CRC_FUNC g_CrcUpdateT0_32; -extern -CRC_FUNC g_CrcUpdateT0_64; -CRC_FUNC g_CrcUpdateT0_64; -extern -CRC_FUNC g_CrcUpdate; -CRC_FUNC g_CrcUpdate; - -UInt32 g_CrcTable[256 * CRC_NUM_TABLES]; - -UInt32 MY_FAST_CALL CrcUpdate(UInt32 v, const void *data, size_t size) -{ - return g_CrcUpdate(v, data, size, g_CrcTable); -} - -UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size) -{ - return g_CrcUpdate(CRC_INIT_VAL, data, size, g_CrcTable) ^ CRC_INIT_VAL; -} - -#define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) - -UInt32 MY_FAST_CALL CrcUpdateT1(UInt32 v, const void *data, size_t size, const UInt32 *table); -UInt32 MY_FAST_CALL CrcUpdateT1(UInt32 v, const void *data, size_t size, const UInt32 *table) -{ - const Byte *p = (const Byte *)data; - const Byte *pEnd = p + size; - for (; p != pEnd; p++) - v = CRC_UPDATE_BYTE_2(v, *p); - return v; -} - - -/* ---------- hardware CRC ---------- */ - -#ifdef MY_CPU_LE - -#if defined(MY_CPU_ARM_OR_ARM64) - -// #pragma message("ARM*") - - #if defined(_MSC_VER) - #if defined(MY_CPU_ARM64) - #if (_MSC_VER >= 1910) - #define USE_ARM64_CRC - #endif - #endif - #elif (defined(__clang__) && (__clang_major__ >= 3)) \ - || (defined(__GNUC__) && (__GNUC__ > 4)) - #if !defined(__ARM_FEATURE_CRC32) - #define __ARM_FEATURE_CRC32 1 - #if (!defined(__clang__) || (__clang_major__ > 3)) // fix these numbers - #define ATTRIB_CRC __attribute__((__target__("arch=armv8-a+crc"))) - #endif - #endif - #if defined(__ARM_FEATURE_CRC32) - #define USE_ARM64_CRC - #include - #endif - #endif - -#else - -// no hardware CRC - -// #define USE_CRC_EMU - -#ifdef USE_CRC_EMU - -#pragma message("ARM64 CRC emulation") - -MY_FORCE_INLINE -UInt32 __crc32b(UInt32 v, UInt32 data) -{ - const UInt32 *table = g_CrcTable; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); - return v; -} - -MY_FORCE_INLINE -UInt32 __crc32w(UInt32 v, UInt32 data) -{ - const UInt32 *table = g_CrcTable; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - return v; -} - -MY_FORCE_INLINE -UInt32 __crc32d(UInt32 v, UInt64 data) -{ - const UInt32 *table = g_CrcTable; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; - return v; -} - -#endif // USE_CRC_EMU - -#endif // defined(MY_CPU_ARM64) && defined(MY_CPU_LE) - - - -#if defined(USE_ARM64_CRC) || defined(USE_CRC_EMU) - -#define T0_32_UNROLL_BYTES (4 * 4) -#define T0_64_UNROLL_BYTES (4 * 8) - -#ifndef ATTRIB_CRC -#define ATTRIB_CRC -#endif -// #pragma message("USE ARM HW CRC") - -ATTRIB_CRC -UInt32 MY_FAST_CALL CrcUpdateT0_32(UInt32 v, const void *data, size_t size, const UInt32 *table); -ATTRIB_CRC -UInt32 MY_FAST_CALL CrcUpdateT0_32(UInt32 v, const void *data, size_t size, const UInt32 *table) -{ - const Byte *p = (const Byte *)data; - UNUSED_VAR(table); - - for (; size != 0 && ((unsigned)(ptrdiff_t)p & (T0_32_UNROLL_BYTES - 1)) != 0; size--) - v = __crc32b(v, *p++); - - if (size >= T0_32_UNROLL_BYTES) - { - const Byte *lim = p + size; - size &= (T0_32_UNROLL_BYTES - 1); - lim -= size; - do - { - v = __crc32w(v, *(const UInt32 *)(const void *)(p)); - v = __crc32w(v, *(const UInt32 *)(const void *)(p + 4)); p += 2 * 4; - v = __crc32w(v, *(const UInt32 *)(const void *)(p)); - v = __crc32w(v, *(const UInt32 *)(const void *)(p + 4)); p += 2 * 4; - } - while (p != lim); - } - - for (; size != 0; size--) - v = __crc32b(v, *p++); - - return v; -} - -ATTRIB_CRC -UInt32 MY_FAST_CALL CrcUpdateT0_64(UInt32 v, const void *data, size_t size, const UInt32 *table); -ATTRIB_CRC -UInt32 MY_FAST_CALL CrcUpdateT0_64(UInt32 v, const void *data, size_t size, const UInt32 *table) -{ - const Byte *p = (const Byte *)data; - UNUSED_VAR(table); - - for (; size != 0 && ((unsigned)(ptrdiff_t)p & (T0_64_UNROLL_BYTES - 1)) != 0; size--) - v = __crc32b(v, *p++); - - if (size >= T0_64_UNROLL_BYTES) - { - const Byte *lim = p + size; - size &= (T0_64_UNROLL_BYTES - 1); - lim -= size; - do - { - v = __crc32d(v, *(const UInt64 *)(const void *)(p)); - v = __crc32d(v, *(const UInt64 *)(const void *)(p + 8)); p += 2 * 8; - v = __crc32d(v, *(const UInt64 *)(const void *)(p)); - v = __crc32d(v, *(const UInt64 *)(const void *)(p + 8)); p += 2 * 8; - } - while (p != lim); - } - - for (; size != 0; size--) - v = __crc32b(v, *p++); - - return v; -} - -#endif // defined(USE_ARM64_CRC) || defined(USE_CRC_EMU) - -#endif // MY_CPU_LE - - - - -void MY_FAST_CALL CrcGenerateTable() -{ - UInt32 i; - for (i = 0; i < 256; i++) - { - UInt32 r = i; - unsigned j; - for (j = 0; j < 8; j++) - r = (r >> 1) ^ (kCrcPoly & ((UInt32)0 - (r & 1))); - g_CrcTable[i] = r; - } - for (i = 256; i < 256 * CRC_NUM_TABLES; i++) - { - UInt32 r = g_CrcTable[(size_t)i - 256]; - g_CrcTable[i] = g_CrcTable[r & 0xFF] ^ (r >> 8); - } - - #if CRC_NUM_TABLES < 4 - - g_CrcUpdate = CrcUpdateT1; - - #else - - #ifdef MY_CPU_LE - - g_CrcUpdateT4 = CrcUpdateT4; - g_CrcUpdate = CrcUpdateT4; - - #if CRC_NUM_TABLES >= 8 - g_CrcUpdateT8 = CrcUpdateT8; - - #ifdef MY_CPU_X86_OR_AMD64 - if (!CPU_Is_InOrder()) - #endif - g_CrcUpdate = CrcUpdateT8; - #endif - - #else - { - #ifndef MY_CPU_BE - UInt32 k = 0x01020304; - const Byte *p = (const Byte *)&k; - if (p[0] == 4 && p[1] == 3) - { - g_CrcUpdateT4 = CrcUpdateT4; - g_CrcUpdate = CrcUpdateT4; - #if CRC_NUM_TABLES >= 8 - g_CrcUpdateT8 = CrcUpdateT8; - g_CrcUpdate = CrcUpdateT8; - #endif - } - else if (p[0] != 1 || p[1] != 2) - g_CrcUpdate = CrcUpdateT1; - else - #endif - { - for (i = 256 * CRC_NUM_TABLES - 1; i >= 256; i--) - { - UInt32 x = g_CrcTable[(size_t)i - 256]; - g_CrcTable[i] = CRC_UINT32_SWAP(x); - } - g_CrcUpdateT4 = CrcUpdateT1_BeT4; - g_CrcUpdate = CrcUpdateT1_BeT4; - #if CRC_NUM_TABLES >= 8 - g_CrcUpdateT8 = CrcUpdateT1_BeT8; - g_CrcUpdate = CrcUpdateT1_BeT8; - #endif - } - } - #endif - #endif - - #ifdef MY_CPU_LE - #ifdef USE_ARM64_CRC - if (CPU_IsSupported_CRC32()) - { - g_CrcUpdateT0_32 = CrcUpdateT0_32; - g_CrcUpdateT0_64 = CrcUpdateT0_64; - g_CrcUpdate = - #if defined(MY_CPU_ARM) - CrcUpdateT0_32; - #else - CrcUpdateT0_64; - #endif - } - #endif - - #ifdef USE_CRC_EMU - g_CrcUpdateT0_32 = CrcUpdateT0_32; - g_CrcUpdateT0_64 = CrcUpdateT0_64; - g_CrcUpdate = CrcUpdateT0_64; - #endif - #endif -} +/* 7zCrc.c -- CRC32 init +2021-04-01 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "7zCrc.h" +#include "CpuArch.h" + +#define kCrcPoly 0xEDB88320 + +#ifdef MY_CPU_LE + #define CRC_NUM_TABLES 8 +#else + #define CRC_NUM_TABLES 9 + + #define CRC_UINT32_SWAP(v) ((v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | (v << 24)) + + UInt32 MY_FAST_CALL CrcUpdateT1_BeT4(UInt32 v, const void *data, size_t size, const UInt32 *table); + UInt32 MY_FAST_CALL CrcUpdateT1_BeT8(UInt32 v, const void *data, size_t size, const UInt32 *table); +#endif + +#ifndef MY_CPU_BE + UInt32 MY_FAST_CALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const UInt32 *table); + UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table); +#endif + +typedef UInt32 (MY_FAST_CALL *CRC_FUNC)(UInt32 v, const void *data, size_t size, const UInt32 *table); + +extern +CRC_FUNC g_CrcUpdateT4; +CRC_FUNC g_CrcUpdateT4; +extern +CRC_FUNC g_CrcUpdateT8; +CRC_FUNC g_CrcUpdateT8; +extern +CRC_FUNC g_CrcUpdateT0_32; +CRC_FUNC g_CrcUpdateT0_32; +extern +CRC_FUNC g_CrcUpdateT0_64; +CRC_FUNC g_CrcUpdateT0_64; +extern +CRC_FUNC g_CrcUpdate; +CRC_FUNC g_CrcUpdate; + +UInt32 g_CrcTable[256 * CRC_NUM_TABLES]; + +UInt32 MY_FAST_CALL CrcUpdate(UInt32 v, const void *data, size_t size) +{ + return g_CrcUpdate(v, data, size, g_CrcTable); +} + +UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size) +{ + return g_CrcUpdate(CRC_INIT_VAL, data, size, g_CrcTable) ^ CRC_INIT_VAL; +} + +#define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) + +UInt32 MY_FAST_CALL CrcUpdateT1(UInt32 v, const void *data, size_t size, const UInt32 *table); +UInt32 MY_FAST_CALL CrcUpdateT1(UInt32 v, const void *data, size_t size, const UInt32 *table) +{ + const Byte *p = (const Byte *)data; + const Byte *pEnd = p + size; + for (; p != pEnd; p++) + v = CRC_UPDATE_BYTE_2(v, *p); + return v; +} + + +/* ---------- hardware CRC ---------- */ + +#ifdef MY_CPU_LE + +#if defined(MY_CPU_ARM_OR_ARM64) + +// #pragma message("ARM*") + + #if defined(_MSC_VER) + #if defined(MY_CPU_ARM64) + #if (_MSC_VER >= 1910) + #define USE_ARM64_CRC + #endif + #endif + #elif (defined(__clang__) && (__clang_major__ >= 3)) \ + || (defined(__GNUC__) && (__GNUC__ > 4)) + #if !defined(__ARM_FEATURE_CRC32) + #define __ARM_FEATURE_CRC32 1 + #if (!defined(__clang__) || (__clang_major__ > 3)) // fix these numbers + #define ATTRIB_CRC __attribute__((__target__("arch=armv8-a+crc"))) + #endif + #endif + #if defined(__ARM_FEATURE_CRC32) + #define USE_ARM64_CRC + #include + #endif + #endif + +#else + +// no hardware CRC + +// #define USE_CRC_EMU + +#ifdef USE_CRC_EMU + +#pragma message("ARM64 CRC emulation") + +MY_FORCE_INLINE +UInt32 __crc32b(UInt32 v, UInt32 data) +{ + const UInt32 *table = g_CrcTable; + v = CRC_UPDATE_BYTE_2(v, (Byte)data); + return v; +} + +MY_FORCE_INLINE +UInt32 __crc32w(UInt32 v, UInt32 data) +{ + const UInt32 *table = g_CrcTable; + v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; + v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; + v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; + v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; + return v; +} + +MY_FORCE_INLINE +UInt32 __crc32d(UInt32 v, UInt64 data) +{ + const UInt32 *table = g_CrcTable; + v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; + v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; + v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; + v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; + v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; + v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; + v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; + v = CRC_UPDATE_BYTE_2(v, (Byte)data); data >>= 8; + return v; +} + +#endif // USE_CRC_EMU + +#endif // defined(MY_CPU_ARM64) && defined(MY_CPU_LE) + + + +#if defined(USE_ARM64_CRC) || defined(USE_CRC_EMU) + +#define T0_32_UNROLL_BYTES (4 * 4) +#define T0_64_UNROLL_BYTES (4 * 8) + +#ifndef ATTRIB_CRC +#define ATTRIB_CRC +#endif +// #pragma message("USE ARM HW CRC") + +ATTRIB_CRC +UInt32 MY_FAST_CALL CrcUpdateT0_32(UInt32 v, const void *data, size_t size, const UInt32 *table); +ATTRIB_CRC +UInt32 MY_FAST_CALL CrcUpdateT0_32(UInt32 v, const void *data, size_t size, const UInt32 *table) +{ + const Byte *p = (const Byte *)data; + UNUSED_VAR(table); + + for (; size != 0 && ((unsigned)(ptrdiff_t)p & (T0_32_UNROLL_BYTES - 1)) != 0; size--) + v = __crc32b(v, *p++); + + if (size >= T0_32_UNROLL_BYTES) + { + const Byte *lim = p + size; + size &= (T0_32_UNROLL_BYTES - 1); + lim -= size; + do + { + v = __crc32w(v, *(const UInt32 *)(const void *)(p)); + v = __crc32w(v, *(const UInt32 *)(const void *)(p + 4)); p += 2 * 4; + v = __crc32w(v, *(const UInt32 *)(const void *)(p)); + v = __crc32w(v, *(const UInt32 *)(const void *)(p + 4)); p += 2 * 4; + } + while (p != lim); + } + + for (; size != 0; size--) + v = __crc32b(v, *p++); + + return v; +} + +ATTRIB_CRC +UInt32 MY_FAST_CALL CrcUpdateT0_64(UInt32 v, const void *data, size_t size, const UInt32 *table); +ATTRIB_CRC +UInt32 MY_FAST_CALL CrcUpdateT0_64(UInt32 v, const void *data, size_t size, const UInt32 *table) +{ + const Byte *p = (const Byte *)data; + UNUSED_VAR(table); + + for (; size != 0 && ((unsigned)(ptrdiff_t)p & (T0_64_UNROLL_BYTES - 1)) != 0; size--) + v = __crc32b(v, *p++); + + if (size >= T0_64_UNROLL_BYTES) + { + const Byte *lim = p + size; + size &= (T0_64_UNROLL_BYTES - 1); + lim -= size; + do + { + v = __crc32d(v, *(const UInt64 *)(const void *)(p)); + v = __crc32d(v, *(const UInt64 *)(const void *)(p + 8)); p += 2 * 8; + v = __crc32d(v, *(const UInt64 *)(const void *)(p)); + v = __crc32d(v, *(const UInt64 *)(const void *)(p + 8)); p += 2 * 8; + } + while (p != lim); + } + + for (; size != 0; size--) + v = __crc32b(v, *p++); + + return v; +} + +#endif // defined(USE_ARM64_CRC) || defined(USE_CRC_EMU) + +#endif // MY_CPU_LE + + + + +void MY_FAST_CALL CrcGenerateTable() +{ + UInt32 i; + for (i = 0; i < 256; i++) + { + UInt32 r = i; + unsigned j; + for (j = 0; j < 8; j++) + r = (r >> 1) ^ (kCrcPoly & ((UInt32)0 - (r & 1))); + g_CrcTable[i] = r; + } + for (i = 256; i < 256 * CRC_NUM_TABLES; i++) + { + UInt32 r = g_CrcTable[(size_t)i - 256]; + g_CrcTable[i] = g_CrcTable[r & 0xFF] ^ (r >> 8); + } + + #if CRC_NUM_TABLES < 4 + + g_CrcUpdate = CrcUpdateT1; + + #else + + #ifdef MY_CPU_LE + + g_CrcUpdateT4 = CrcUpdateT4; + g_CrcUpdate = CrcUpdateT4; + + #if CRC_NUM_TABLES >= 8 + g_CrcUpdateT8 = CrcUpdateT8; + + #ifdef MY_CPU_X86_OR_AMD64 + if (!CPU_Is_InOrder()) + #endif + g_CrcUpdate = CrcUpdateT8; + #endif + + #else + { + #ifndef MY_CPU_BE + UInt32 k = 0x01020304; + const Byte *p = (const Byte *)&k; + if (p[0] == 4 && p[1] == 3) + { + g_CrcUpdateT4 = CrcUpdateT4; + g_CrcUpdate = CrcUpdateT4; + #if CRC_NUM_TABLES >= 8 + g_CrcUpdateT8 = CrcUpdateT8; + g_CrcUpdate = CrcUpdateT8; + #endif + } + else if (p[0] != 1 || p[1] != 2) + g_CrcUpdate = CrcUpdateT1; + else + #endif + { + for (i = 256 * CRC_NUM_TABLES - 1; i >= 256; i--) + { + UInt32 x = g_CrcTable[(size_t)i - 256]; + g_CrcTable[i] = CRC_UINT32_SWAP(x); + } + g_CrcUpdateT4 = CrcUpdateT1_BeT4; + g_CrcUpdate = CrcUpdateT1_BeT4; + #if CRC_NUM_TABLES >= 8 + g_CrcUpdateT8 = CrcUpdateT1_BeT8; + g_CrcUpdate = CrcUpdateT1_BeT8; + #endif + } + } + #endif + #endif + + #ifdef MY_CPU_LE + #ifdef USE_ARM64_CRC + if (CPU_IsSupported_CRC32()) + { + g_CrcUpdateT0_32 = CrcUpdateT0_32; + g_CrcUpdateT0_64 = CrcUpdateT0_64; + g_CrcUpdate = + #if defined(MY_CPU_ARM) + CrcUpdateT0_32; + #else + CrcUpdateT0_64; + #endif + } + #endif + + #ifdef USE_CRC_EMU + g_CrcUpdateT0_32 = CrcUpdateT0_32; + g_CrcUpdateT0_64 = CrcUpdateT0_64; + g_CrcUpdate = CrcUpdateT0_64; + #endif + #endif +} diff --git a/deps/LZMA-SDK/C/7zCrc.h b/deps/LZMA-SDK/C/7zCrc.h index 3b0459402..8fd579587 100644 --- a/deps/LZMA-SDK/C/7zCrc.h +++ b/deps/LZMA-SDK/C/7zCrc.h @@ -1,25 +1,25 @@ -/* 7zCrc.h -- CRC32 calculation -2013-01-18 : Igor Pavlov : Public domain */ - -#ifndef __7Z_CRC_H -#define __7Z_CRC_H - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -extern UInt32 g_CrcTable[]; - -/* Call CrcGenerateTable one time before other CRC functions */ -void MY_FAST_CALL CrcGenerateTable(void); - -#define CRC_INIT_VAL 0xFFFFFFFF -#define CRC_GET_DIGEST(crc) ((crc) ^ CRC_INIT_VAL) -#define CRC_UPDATE_BYTE(crc, b) (g_CrcTable[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) - -UInt32 MY_FAST_CALL CrcUpdate(UInt32 crc, const void *data, size_t size); -UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size); - -EXTERN_C_END - -#endif +/* 7zCrc.h -- CRC32 calculation +2013-01-18 : Igor Pavlov : Public domain */ + +#ifndef __7Z_CRC_H +#define __7Z_CRC_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +extern UInt32 g_CrcTable[]; + +/* Call CrcGenerateTable one time before other CRC functions */ +void MY_FAST_CALL CrcGenerateTable(void); + +#define CRC_INIT_VAL 0xFFFFFFFF +#define CRC_GET_DIGEST(crc) ((crc) ^ CRC_INIT_VAL) +#define CRC_UPDATE_BYTE(crc, b) (g_CrcTable[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) + +UInt32 MY_FAST_CALL CrcUpdate(UInt32 crc, const void *data, size_t size); +UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size); + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/7zCrcOpt.c b/deps/LZMA-SDK/C/7zCrcOpt.c index efaa7ab9d..69fad9ca2 100644 --- a/deps/LZMA-SDK/C/7zCrcOpt.c +++ b/deps/LZMA-SDK/C/7zCrcOpt.c @@ -1,117 +1,117 @@ -/* 7zCrcOpt.c -- CRC32 calculation -2021-02-09 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include "CpuArch.h" - -#ifndef MY_CPU_BE - -#define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) - -UInt32 MY_FAST_CALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const UInt32 *table); -UInt32 MY_FAST_CALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const UInt32 *table) -{ - const Byte *p = (const Byte *)data; - for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) - v = CRC_UPDATE_BYTE_2(v, *p); - for (; size >= 4; size -= 4, p += 4) - { - v ^= *(const UInt32 *)(const void *)p; - v = - (table + 0x300)[((v ) & 0xFF)] - ^ (table + 0x200)[((v >> 8) & 0xFF)] - ^ (table + 0x100)[((v >> 16) & 0xFF)] - ^ (table + 0x000)[((v >> 24))]; - } - for (; size > 0; size--, p++) - v = CRC_UPDATE_BYTE_2(v, *p); - return v; -} - -UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table); -UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table) -{ - const Byte *p = (const Byte *)data; - for (; size > 0 && ((unsigned)(ptrdiff_t)p & 7) != 0; size--, p++) - v = CRC_UPDATE_BYTE_2(v, *p); - for (; size >= 8; size -= 8, p += 8) - { - UInt32 d; - v ^= *(const UInt32 *)(const void *)p; - v = - (table + 0x700)[((v ) & 0xFF)] - ^ (table + 0x600)[((v >> 8) & 0xFF)] - ^ (table + 0x500)[((v >> 16) & 0xFF)] - ^ (table + 0x400)[((v >> 24))]; - d = *((const UInt32 *)(const void *)p + 1); - v ^= - (table + 0x300)[((d ) & 0xFF)] - ^ (table + 0x200)[((d >> 8) & 0xFF)] - ^ (table + 0x100)[((d >> 16) & 0xFF)] - ^ (table + 0x000)[((d >> 24))]; - } - for (; size > 0; size--, p++) - v = CRC_UPDATE_BYTE_2(v, *p); - return v; -} - -#endif - - -#ifndef MY_CPU_LE - -#define CRC_UINT32_SWAP(v) ((v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | (v << 24)) - -#define CRC_UPDATE_BYTE_2_BE(crc, b) (table[(((crc) >> 24) ^ (b))] ^ ((crc) << 8)) - -UInt32 MY_FAST_CALL CrcUpdateT1_BeT4(UInt32 v, const void *data, size_t size, const UInt32 *table) -{ - const Byte *p = (const Byte *)data; - table += 0x100; - v = CRC_UINT32_SWAP(v); - for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) - v = CRC_UPDATE_BYTE_2_BE(v, *p); - for (; size >= 4; size -= 4, p += 4) - { - v ^= *(const UInt32 *)(const void *)p; - v = - (table + 0x000)[((v ) & 0xFF)] - ^ (table + 0x100)[((v >> 8) & 0xFF)] - ^ (table + 0x200)[((v >> 16) & 0xFF)] - ^ (table + 0x300)[((v >> 24))]; - } - for (; size > 0; size--, p++) - v = CRC_UPDATE_BYTE_2_BE(v, *p); - return CRC_UINT32_SWAP(v); -} - -UInt32 MY_FAST_CALL CrcUpdateT1_BeT8(UInt32 v, const void *data, size_t size, const UInt32 *table) -{ - const Byte *p = (const Byte *)data; - table += 0x100; - v = CRC_UINT32_SWAP(v); - for (; size > 0 && ((unsigned)(ptrdiff_t)p & 7) != 0; size--, p++) - v = CRC_UPDATE_BYTE_2_BE(v, *p); - for (; size >= 8; size -= 8, p += 8) - { - UInt32 d; - v ^= *(const UInt32 *)(const void *)p; - v = - (table + 0x400)[((v ) & 0xFF)] - ^ (table + 0x500)[((v >> 8) & 0xFF)] - ^ (table + 0x600)[((v >> 16) & 0xFF)] - ^ (table + 0x700)[((v >> 24))]; - d = *((const UInt32 *)(const void *)p + 1); - v ^= - (table + 0x000)[((d ) & 0xFF)] - ^ (table + 0x100)[((d >> 8) & 0xFF)] - ^ (table + 0x200)[((d >> 16) & 0xFF)] - ^ (table + 0x300)[((d >> 24))]; - } - for (; size > 0; size--, p++) - v = CRC_UPDATE_BYTE_2_BE(v, *p); - return CRC_UINT32_SWAP(v); -} - -#endif +/* 7zCrcOpt.c -- CRC32 calculation +2021-02-09 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "CpuArch.h" + +#ifndef MY_CPU_BE + +#define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) + +UInt32 MY_FAST_CALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const UInt32 *table); +UInt32 MY_FAST_CALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const UInt32 *table) +{ + const Byte *p = (const Byte *)data; + for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) + v = CRC_UPDATE_BYTE_2(v, *p); + for (; size >= 4; size -= 4, p += 4) + { + v ^= *(const UInt32 *)(const void *)p; + v = + (table + 0x300)[((v ) & 0xFF)] + ^ (table + 0x200)[((v >> 8) & 0xFF)] + ^ (table + 0x100)[((v >> 16) & 0xFF)] + ^ (table + 0x000)[((v >> 24))]; + } + for (; size > 0; size--, p++) + v = CRC_UPDATE_BYTE_2(v, *p); + return v; +} + +UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table); +UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table) +{ + const Byte *p = (const Byte *)data; + for (; size > 0 && ((unsigned)(ptrdiff_t)p & 7) != 0; size--, p++) + v = CRC_UPDATE_BYTE_2(v, *p); + for (; size >= 8; size -= 8, p += 8) + { + UInt32 d; + v ^= *(const UInt32 *)(const void *)p; + v = + (table + 0x700)[((v ) & 0xFF)] + ^ (table + 0x600)[((v >> 8) & 0xFF)] + ^ (table + 0x500)[((v >> 16) & 0xFF)] + ^ (table + 0x400)[((v >> 24))]; + d = *((const UInt32 *)(const void *)p + 1); + v ^= + (table + 0x300)[((d ) & 0xFF)] + ^ (table + 0x200)[((d >> 8) & 0xFF)] + ^ (table + 0x100)[((d >> 16) & 0xFF)] + ^ (table + 0x000)[((d >> 24))]; + } + for (; size > 0; size--, p++) + v = CRC_UPDATE_BYTE_2(v, *p); + return v; +} + +#endif + + +#ifndef MY_CPU_LE + +#define CRC_UINT32_SWAP(v) ((v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | (v << 24)) + +#define CRC_UPDATE_BYTE_2_BE(crc, b) (table[(((crc) >> 24) ^ (b))] ^ ((crc) << 8)) + +UInt32 MY_FAST_CALL CrcUpdateT1_BeT4(UInt32 v, const void *data, size_t size, const UInt32 *table) +{ + const Byte *p = (const Byte *)data; + table += 0x100; + v = CRC_UINT32_SWAP(v); + for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) + v = CRC_UPDATE_BYTE_2_BE(v, *p); + for (; size >= 4; size -= 4, p += 4) + { + v ^= *(const UInt32 *)(const void *)p; + v = + (table + 0x000)[((v ) & 0xFF)] + ^ (table + 0x100)[((v >> 8) & 0xFF)] + ^ (table + 0x200)[((v >> 16) & 0xFF)] + ^ (table + 0x300)[((v >> 24))]; + } + for (; size > 0; size--, p++) + v = CRC_UPDATE_BYTE_2_BE(v, *p); + return CRC_UINT32_SWAP(v); +} + +UInt32 MY_FAST_CALL CrcUpdateT1_BeT8(UInt32 v, const void *data, size_t size, const UInt32 *table) +{ + const Byte *p = (const Byte *)data; + table += 0x100; + v = CRC_UINT32_SWAP(v); + for (; size > 0 && ((unsigned)(ptrdiff_t)p & 7) != 0; size--, p++) + v = CRC_UPDATE_BYTE_2_BE(v, *p); + for (; size >= 8; size -= 8, p += 8) + { + UInt32 d; + v ^= *(const UInt32 *)(const void *)p; + v = + (table + 0x400)[((v ) & 0xFF)] + ^ (table + 0x500)[((v >> 8) & 0xFF)] + ^ (table + 0x600)[((v >> 16) & 0xFF)] + ^ (table + 0x700)[((v >> 24))]; + d = *((const UInt32 *)(const void *)p + 1); + v ^= + (table + 0x000)[((d ) & 0xFF)] + ^ (table + 0x100)[((d >> 8) & 0xFF)] + ^ (table + 0x200)[((d >> 16) & 0xFF)] + ^ (table + 0x300)[((d >> 24))]; + } + for (; size > 0; size--, p++) + v = CRC_UPDATE_BYTE_2_BE(v, *p); + return CRC_UINT32_SWAP(v); +} + +#endif diff --git a/deps/LZMA-SDK/C/7zDec.c b/deps/LZMA-SDK/C/7zDec.c index 83e37d166..fbfd016e1 100644 --- a/deps/LZMA-SDK/C/7zDec.c +++ b/deps/LZMA-SDK/C/7zDec.c @@ -1,600 +1,600 @@ -/* 7zDec.c -- Decoding from 7z folder -2021-02-09 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include - -/* #define _7ZIP_PPMD_SUPPPORT */ - -#include "7z.h" -#include "7zCrc.h" - -#include "Bcj2.h" -#include "Bra.h" -#include "CpuArch.h" -#include "Delta.h" -#include "LzmaDec.h" -#include "Lzma2Dec.h" -#ifdef _7ZIP_PPMD_SUPPPORT -#include "Ppmd7.h" -#endif - -#define k_Copy 0 -#ifndef _7Z_NO_METHOD_LZMA2 -#define k_LZMA2 0x21 -#endif -#define k_LZMA 0x30101 -#define k_BCJ2 0x303011B -#ifndef _7Z_NO_METHODS_FILTERS -#define k_Delta 3 -#define k_BCJ 0x3030103 -#define k_PPC 0x3030205 -#define k_IA64 0x3030401 -#define k_ARM 0x3030501 -#define k_ARMT 0x3030701 -#define k_SPARC 0x3030805 -#endif - -#ifdef _7ZIP_PPMD_SUPPPORT - -#define k_PPMD 0x30401 - -typedef struct -{ - IByteIn vt; - const Byte *cur; - const Byte *end; - const Byte *begin; - UInt64 processed; - BoolInt extra; - SRes res; - const ILookInStream *inStream; -} CByteInToLook; - -static Byte ReadByte(const IByteIn *pp) -{ - CByteInToLook *p = CONTAINER_FROM_VTBL(pp, CByteInToLook, vt); - if (p->cur != p->end) - return *p->cur++; - if (p->res == SZ_OK) - { - size_t size = (size_t)(p->cur - p->begin); - p->processed += size; - p->res = ILookInStream_Skip(p->inStream, size); - size = (1 << 25); - p->res = ILookInStream_Look(p->inStream, (const void **)&p->begin, &size); - p->cur = p->begin; - p->end = p->begin + size; - if (size != 0) - return *p->cur++;; - } - p->extra = True; - return 0; -} - -static SRes SzDecodePpmd(const Byte *props, unsigned propsSize, UInt64 inSize, const ILookInStream *inStream, - Byte *outBuffer, SizeT outSize, ISzAllocPtr allocMain) -{ - CPpmd7 ppmd; - CByteInToLook s; - SRes res = SZ_OK; - - s.vt.Read = ReadByte; - s.inStream = inStream; - s.begin = s.end = s.cur = NULL; - s.extra = False; - s.res = SZ_OK; - s.processed = 0; - - if (propsSize != 5) - return SZ_ERROR_UNSUPPORTED; - - { - unsigned order = props[0]; - UInt32 memSize = GetUi32(props + 1); - if (order < PPMD7_MIN_ORDER || - order > PPMD7_MAX_ORDER || - memSize < PPMD7_MIN_MEM_SIZE || - memSize > PPMD7_MAX_MEM_SIZE) - return SZ_ERROR_UNSUPPORTED; - Ppmd7_Construct(&ppmd); - if (!Ppmd7_Alloc(&ppmd, memSize, allocMain)) - return SZ_ERROR_MEM; - Ppmd7_Init(&ppmd, order); - } - { - ppmd.rc.dec.Stream = &s.vt; - if (!Ppmd7z_RangeDec_Init(&ppmd.rc.dec)) - res = SZ_ERROR_DATA; - else if (!s.extra) - { - Byte *buf = outBuffer; - const Byte *lim = buf + outSize; - for (; buf != lim; buf++) - { - int sym = Ppmd7z_DecodeSymbol(&ppmd); - if (s.extra || sym < 0) - break; - *buf = (Byte)sym; - } - if (buf != lim) - res = SZ_ERROR_DATA; - else if (!Ppmd7z_RangeDec_IsFinishedOK(&ppmd.rc.dec)) - { - /* if (Ppmd7z_DecodeSymbol(&ppmd) != PPMD7_SYM_END || !Ppmd7z_RangeDec_IsFinishedOK(&ppmd.rc.dec)) */ - res = SZ_ERROR_DATA; - } - } - if (s.extra) - res = (s.res != SZ_OK ? s.res : SZ_ERROR_DATA); - else if (s.processed + (size_t)(s.cur - s.begin) != inSize) - res = SZ_ERROR_DATA; - } - Ppmd7_Free(&ppmd, allocMain); - return res; -} - -#endif - - -static SRes SzDecodeLzma(const Byte *props, unsigned propsSize, UInt64 inSize, ILookInStream *inStream, - Byte *outBuffer, SizeT outSize, ISzAllocPtr allocMain) -{ - CLzmaDec state; - SRes res = SZ_OK; - - LzmaDec_Construct(&state); - RINOK(LzmaDec_AllocateProbs(&state, props, propsSize, allocMain)); - state.dic = outBuffer; - state.dicBufSize = outSize; - LzmaDec_Init(&state); - - for (;;) - { - const void *inBuf = NULL; - size_t lookahead = (1 << 18); - if (lookahead > inSize) - lookahead = (size_t)inSize; - res = ILookInStream_Look(inStream, &inBuf, &lookahead); - if (res != SZ_OK) - break; - - { - SizeT inProcessed = (SizeT)lookahead, dicPos = state.dicPos; - ELzmaStatus status; - res = LzmaDec_DecodeToDic(&state, outSize, (const Byte *)inBuf, &inProcessed, LZMA_FINISH_END, &status); - lookahead -= inProcessed; - inSize -= inProcessed; - if (res != SZ_OK) - break; - - if (status == LZMA_STATUS_FINISHED_WITH_MARK) - { - if (outSize != state.dicPos || inSize != 0) - res = SZ_ERROR_DATA; - break; - } - - if (outSize == state.dicPos && inSize == 0 && status == LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK) - break; - - if (inProcessed == 0 && dicPos == state.dicPos) - { - res = SZ_ERROR_DATA; - break; - } - - res = ILookInStream_Skip(inStream, inProcessed); - if (res != SZ_OK) - break; - } - } - - LzmaDec_FreeProbs(&state, allocMain); - return res; -} - - -#ifndef _7Z_NO_METHOD_LZMA2 - -static SRes SzDecodeLzma2(const Byte *props, unsigned propsSize, UInt64 inSize, ILookInStream *inStream, - Byte *outBuffer, SizeT outSize, ISzAllocPtr allocMain) -{ - CLzma2Dec state; - SRes res = SZ_OK; - - Lzma2Dec_Construct(&state); - if (propsSize != 1) - return SZ_ERROR_DATA; - RINOK(Lzma2Dec_AllocateProbs(&state, props[0], allocMain)); - state.decoder.dic = outBuffer; - state.decoder.dicBufSize = outSize; - Lzma2Dec_Init(&state); - - for (;;) - { - const void *inBuf = NULL; - size_t lookahead = (1 << 18); - if (lookahead > inSize) - lookahead = (size_t)inSize; - res = ILookInStream_Look(inStream, &inBuf, &lookahead); - if (res != SZ_OK) - break; - - { - SizeT inProcessed = (SizeT)lookahead, dicPos = state.decoder.dicPos; - ELzmaStatus status; - res = Lzma2Dec_DecodeToDic(&state, outSize, (const Byte *)inBuf, &inProcessed, LZMA_FINISH_END, &status); - lookahead -= inProcessed; - inSize -= inProcessed; - if (res != SZ_OK) - break; - - if (status == LZMA_STATUS_FINISHED_WITH_MARK) - { - if (outSize != state.decoder.dicPos || inSize != 0) - res = SZ_ERROR_DATA; - break; - } - - if (inProcessed == 0 && dicPos == state.decoder.dicPos) - { - res = SZ_ERROR_DATA; - break; - } - - res = ILookInStream_Skip(inStream, inProcessed); - if (res != SZ_OK) - break; - } - } - - Lzma2Dec_FreeProbs(&state, allocMain); - return res; -} - -#endif - - -static SRes SzDecodeCopy(UInt64 inSize, ILookInStream *inStream, Byte *outBuffer) -{ - while (inSize > 0) - { - const void *inBuf; - size_t curSize = (1 << 18); - if (curSize > inSize) - curSize = (size_t)inSize; - RINOK(ILookInStream_Look(inStream, &inBuf, &curSize)); - if (curSize == 0) - return SZ_ERROR_INPUT_EOF; - memcpy(outBuffer, inBuf, curSize); - outBuffer += curSize; - inSize -= curSize; - RINOK(ILookInStream_Skip(inStream, curSize)); - } - return SZ_OK; -} - -static BoolInt IS_MAIN_METHOD(UInt32 m) -{ - switch (m) - { - case k_Copy: - case k_LZMA: - #ifndef _7Z_NO_METHOD_LZMA2 - case k_LZMA2: - #endif - #ifdef _7ZIP_PPMD_SUPPPORT - case k_PPMD: - #endif - return True; - } - return False; -} - -static BoolInt IS_SUPPORTED_CODER(const CSzCoderInfo *c) -{ - return - c->NumStreams == 1 - /* && c->MethodID <= (UInt32)0xFFFFFFFF */ - && IS_MAIN_METHOD((UInt32)c->MethodID); -} - -#define IS_BCJ2(c) ((c)->MethodID == k_BCJ2 && (c)->NumStreams == 4) - -static SRes CheckSupportedFolder(const CSzFolder *f) -{ - if (f->NumCoders < 1 || f->NumCoders > 4) - return SZ_ERROR_UNSUPPORTED; - if (!IS_SUPPORTED_CODER(&f->Coders[0])) - return SZ_ERROR_UNSUPPORTED; - if (f->NumCoders == 1) - { - if (f->NumPackStreams != 1 || f->PackStreams[0] != 0 || f->NumBonds != 0) - return SZ_ERROR_UNSUPPORTED; - return SZ_OK; - } - - - #ifndef _7Z_NO_METHODS_FILTERS - - if (f->NumCoders == 2) - { - const CSzCoderInfo *c = &f->Coders[1]; - if ( - /* c->MethodID > (UInt32)0xFFFFFFFF || */ - c->NumStreams != 1 - || f->NumPackStreams != 1 - || f->PackStreams[0] != 0 - || f->NumBonds != 1 - || f->Bonds[0].InIndex != 1 - || f->Bonds[0].OutIndex != 0) - return SZ_ERROR_UNSUPPORTED; - switch ((UInt32)c->MethodID) - { - case k_Delta: - case k_BCJ: - case k_PPC: - case k_IA64: - case k_SPARC: - case k_ARM: - case k_ARMT: - break; - default: - return SZ_ERROR_UNSUPPORTED; - } - return SZ_OK; - } - - #endif - - - if (f->NumCoders == 4) - { - if (!IS_SUPPORTED_CODER(&f->Coders[1]) - || !IS_SUPPORTED_CODER(&f->Coders[2]) - || !IS_BCJ2(&f->Coders[3])) - return SZ_ERROR_UNSUPPORTED; - if (f->NumPackStreams != 4 - || f->PackStreams[0] != 2 - || f->PackStreams[1] != 6 - || f->PackStreams[2] != 1 - || f->PackStreams[3] != 0 - || f->NumBonds != 3 - || f->Bonds[0].InIndex != 5 || f->Bonds[0].OutIndex != 0 - || f->Bonds[1].InIndex != 4 || f->Bonds[1].OutIndex != 1 - || f->Bonds[2].InIndex != 3 || f->Bonds[2].OutIndex != 2) - return SZ_ERROR_UNSUPPORTED; - return SZ_OK; - } - - return SZ_ERROR_UNSUPPORTED; -} - -#ifndef _7Z_NO_METHODS_FILTERS -#define CASE_BRA_CONV(isa) case k_ ## isa: isa ## _Convert(outBuffer, outSize, 0, 0); break; -#endif - -static SRes SzFolder_Decode2(const CSzFolder *folder, - const Byte *propsData, - const UInt64 *unpackSizes, - const UInt64 *packPositions, - ILookInStream *inStream, UInt64 startPos, - Byte *outBuffer, SizeT outSize, ISzAllocPtr allocMain, - Byte *tempBuf[]) -{ - UInt32 ci; - SizeT tempSizes[3] = { 0, 0, 0}; - SizeT tempSize3 = 0; - Byte *tempBuf3 = 0; - - RINOK(CheckSupportedFolder(folder)); - - for (ci = 0; ci < folder->NumCoders; ci++) - { - const CSzCoderInfo *coder = &folder->Coders[ci]; - - if (IS_MAIN_METHOD((UInt32)coder->MethodID)) - { - UInt32 si = 0; - UInt64 offset; - UInt64 inSize; - Byte *outBufCur = outBuffer; - SizeT outSizeCur = outSize; - if (folder->NumCoders == 4) - { - UInt32 indices[] = { 3, 2, 0 }; - UInt64 unpackSize = unpackSizes[ci]; - si = indices[ci]; - if (ci < 2) - { - Byte *temp; - outSizeCur = (SizeT)unpackSize; - if (outSizeCur != unpackSize) - return SZ_ERROR_MEM; - temp = (Byte *)ISzAlloc_Alloc(allocMain, outSizeCur); - if (!temp && outSizeCur != 0) - return SZ_ERROR_MEM; - outBufCur = tempBuf[1 - ci] = temp; - tempSizes[1 - ci] = outSizeCur; - } - else if (ci == 2) - { - if (unpackSize > outSize) /* check it */ - return SZ_ERROR_PARAM; - tempBuf3 = outBufCur = outBuffer + (outSize - (size_t)unpackSize); - tempSize3 = outSizeCur = (SizeT)unpackSize; - } - else - return SZ_ERROR_UNSUPPORTED; - } - offset = packPositions[si]; - inSize = packPositions[(size_t)si + 1] - offset; - RINOK(LookInStream_SeekTo(inStream, startPos + offset)); - - if (coder->MethodID == k_Copy) - { - if (inSize != outSizeCur) /* check it */ - return SZ_ERROR_DATA; - RINOK(SzDecodeCopy(inSize, inStream, outBufCur)); - } - else if (coder->MethodID == k_LZMA) - { - RINOK(SzDecodeLzma(propsData + coder->PropsOffset, coder->PropsSize, inSize, inStream, outBufCur, outSizeCur, allocMain)); - } - #ifndef _7Z_NO_METHOD_LZMA2 - else if (coder->MethodID == k_LZMA2) - { - RINOK(SzDecodeLzma2(propsData + coder->PropsOffset, coder->PropsSize, inSize, inStream, outBufCur, outSizeCur, allocMain)); - } - #endif - #ifdef _7ZIP_PPMD_SUPPPORT - else if (coder->MethodID == k_PPMD) - { - RINOK(SzDecodePpmd(propsData + coder->PropsOffset, coder->PropsSize, inSize, inStream, outBufCur, outSizeCur, allocMain)); - } - #endif - else - return SZ_ERROR_UNSUPPORTED; - } - else if (coder->MethodID == k_BCJ2) - { - UInt64 offset = packPositions[1]; - UInt64 s3Size = packPositions[2] - offset; - - if (ci != 3) - return SZ_ERROR_UNSUPPORTED; - - tempSizes[2] = (SizeT)s3Size; - if (tempSizes[2] != s3Size) - return SZ_ERROR_MEM; - tempBuf[2] = (Byte *)ISzAlloc_Alloc(allocMain, tempSizes[2]); - if (!tempBuf[2] && tempSizes[2] != 0) - return SZ_ERROR_MEM; - - RINOK(LookInStream_SeekTo(inStream, startPos + offset)); - RINOK(SzDecodeCopy(s3Size, inStream, tempBuf[2])); - - if ((tempSizes[0] & 3) != 0 || - (tempSizes[1] & 3) != 0 || - tempSize3 + tempSizes[0] + tempSizes[1] != outSize) - return SZ_ERROR_DATA; - - { - CBcj2Dec p; - - p.bufs[0] = tempBuf3; p.lims[0] = tempBuf3 + tempSize3; - p.bufs[1] = tempBuf[0]; p.lims[1] = tempBuf[0] + tempSizes[0]; - p.bufs[2] = tempBuf[1]; p.lims[2] = tempBuf[1] + tempSizes[1]; - p.bufs[3] = tempBuf[2]; p.lims[3] = tempBuf[2] + tempSizes[2]; - - p.dest = outBuffer; - p.destLim = outBuffer + outSize; - - Bcj2Dec_Init(&p); - RINOK(Bcj2Dec_Decode(&p)); - - { - unsigned i; - for (i = 0; i < 4; i++) - if (p.bufs[i] != p.lims[i]) - return SZ_ERROR_DATA; - - if (!Bcj2Dec_IsFinished(&p)) - return SZ_ERROR_DATA; - - if (p.dest != p.destLim - || p.state != BCJ2_STREAM_MAIN) - return SZ_ERROR_DATA; - } - } - } - #ifndef _7Z_NO_METHODS_FILTERS - else if (ci == 1) - { - if (coder->MethodID == k_Delta) - { - if (coder->PropsSize != 1) - return SZ_ERROR_UNSUPPORTED; - { - Byte state[DELTA_STATE_SIZE]; - Delta_Init(state); - Delta_Decode(state, (unsigned)(propsData[coder->PropsOffset]) + 1, outBuffer, outSize); - } - } - else - { - if (coder->PropsSize != 0) - return SZ_ERROR_UNSUPPORTED; - switch (coder->MethodID) - { - case k_BCJ: - { - UInt32 state; - x86_Convert_Init(state); - x86_Convert(outBuffer, outSize, 0, &state, 0); - break; - } - CASE_BRA_CONV(PPC) - CASE_BRA_CONV(IA64) - CASE_BRA_CONV(SPARC) - CASE_BRA_CONV(ARM) - CASE_BRA_CONV(ARMT) - default: - return SZ_ERROR_UNSUPPORTED; - } - } - } - #endif - else - return SZ_ERROR_UNSUPPORTED; - } - - return SZ_OK; -} - - -SRes SzAr_DecodeFolder(const CSzAr *p, UInt32 folderIndex, - ILookInStream *inStream, UInt64 startPos, - Byte *outBuffer, size_t outSize, - ISzAllocPtr allocMain) -{ - SRes res; - CSzFolder folder; - CSzData sd; - - const Byte *data = p->CodersData + p->FoCodersOffsets[folderIndex]; - sd.Data = data; - sd.Size = p->FoCodersOffsets[(size_t)folderIndex + 1] - p->FoCodersOffsets[folderIndex]; - - res = SzGetNextFolderItem(&folder, &sd); - - if (res != SZ_OK) - return res; - - if (sd.Size != 0 - || folder.UnpackStream != p->FoToMainUnpackSizeIndex[folderIndex] - || outSize != SzAr_GetFolderUnpackSize(p, folderIndex)) - return SZ_ERROR_FAIL; - { - unsigned i; - Byte *tempBuf[3] = { 0, 0, 0}; - - res = SzFolder_Decode2(&folder, data, - &p->CoderUnpackSizes[p->FoToCoderUnpackSizes[folderIndex]], - p->PackPositions + p->FoStartPackStreamIndex[folderIndex], - inStream, startPos, - outBuffer, (SizeT)outSize, allocMain, tempBuf); - - for (i = 0; i < 3; i++) - ISzAlloc_Free(allocMain, tempBuf[i]); - - if (res == SZ_OK) - if (SzBitWithVals_Check(&p->FolderCRCs, folderIndex)) - if (CrcCalc(outBuffer, outSize) != p->FolderCRCs.Vals[folderIndex]) - res = SZ_ERROR_CRC; - - return res; - } -} +/* 7zDec.c -- Decoding from 7z folder +2021-02-09 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include + +/* #define _7ZIP_PPMD_SUPPPORT */ + +#include "7z.h" +#include "7zCrc.h" + +#include "Bcj2.h" +#include "Bra.h" +#include "CpuArch.h" +#include "Delta.h" +#include "LzmaDec.h" +#include "Lzma2Dec.h" +#ifdef _7ZIP_PPMD_SUPPPORT +#include "Ppmd7.h" +#endif + +#define k_Copy 0 +#ifndef _7Z_NO_METHOD_LZMA2 +#define k_LZMA2 0x21 +#endif +#define k_LZMA 0x30101 +#define k_BCJ2 0x303011B +#ifndef _7Z_NO_METHODS_FILTERS +#define k_Delta 3 +#define k_BCJ 0x3030103 +#define k_PPC 0x3030205 +#define k_IA64 0x3030401 +#define k_ARM 0x3030501 +#define k_ARMT 0x3030701 +#define k_SPARC 0x3030805 +#endif + +#ifdef _7ZIP_PPMD_SUPPPORT + +#define k_PPMD 0x30401 + +typedef struct +{ + IByteIn vt; + const Byte *cur; + const Byte *end; + const Byte *begin; + UInt64 processed; + BoolInt extra; + SRes res; + const ILookInStream *inStream; +} CByteInToLook; + +static Byte ReadByte(const IByteIn *pp) +{ + CByteInToLook *p = CONTAINER_FROM_VTBL(pp, CByteInToLook, vt); + if (p->cur != p->end) + return *p->cur++; + if (p->res == SZ_OK) + { + size_t size = (size_t)(p->cur - p->begin); + p->processed += size; + p->res = ILookInStream_Skip(p->inStream, size); + size = (1 << 25); + p->res = ILookInStream_Look(p->inStream, (const void **)&p->begin, &size); + p->cur = p->begin; + p->end = p->begin + size; + if (size != 0) + return *p->cur++;; + } + p->extra = True; + return 0; +} + +static SRes SzDecodePpmd(const Byte *props, unsigned propsSize, UInt64 inSize, const ILookInStream *inStream, + Byte *outBuffer, SizeT outSize, ISzAllocPtr allocMain) +{ + CPpmd7 ppmd; + CByteInToLook s; + SRes res = SZ_OK; + + s.vt.Read = ReadByte; + s.inStream = inStream; + s.begin = s.end = s.cur = NULL; + s.extra = False; + s.res = SZ_OK; + s.processed = 0; + + if (propsSize != 5) + return SZ_ERROR_UNSUPPORTED; + + { + unsigned order = props[0]; + UInt32 memSize = GetUi32(props + 1); + if (order < PPMD7_MIN_ORDER || + order > PPMD7_MAX_ORDER || + memSize < PPMD7_MIN_MEM_SIZE || + memSize > PPMD7_MAX_MEM_SIZE) + return SZ_ERROR_UNSUPPORTED; + Ppmd7_Construct(&ppmd); + if (!Ppmd7_Alloc(&ppmd, memSize, allocMain)) + return SZ_ERROR_MEM; + Ppmd7_Init(&ppmd, order); + } + { + ppmd.rc.dec.Stream = &s.vt; + if (!Ppmd7z_RangeDec_Init(&ppmd.rc.dec)) + res = SZ_ERROR_DATA; + else if (!s.extra) + { + Byte *buf = outBuffer; + const Byte *lim = buf + outSize; + for (; buf != lim; buf++) + { + int sym = Ppmd7z_DecodeSymbol(&ppmd); + if (s.extra || sym < 0) + break; + *buf = (Byte)sym; + } + if (buf != lim) + res = SZ_ERROR_DATA; + else if (!Ppmd7z_RangeDec_IsFinishedOK(&ppmd.rc.dec)) + { + /* if (Ppmd7z_DecodeSymbol(&ppmd) != PPMD7_SYM_END || !Ppmd7z_RangeDec_IsFinishedOK(&ppmd.rc.dec)) */ + res = SZ_ERROR_DATA; + } + } + if (s.extra) + res = (s.res != SZ_OK ? s.res : SZ_ERROR_DATA); + else if (s.processed + (size_t)(s.cur - s.begin) != inSize) + res = SZ_ERROR_DATA; + } + Ppmd7_Free(&ppmd, allocMain); + return res; +} + +#endif + + +static SRes SzDecodeLzma(const Byte *props, unsigned propsSize, UInt64 inSize, ILookInStream *inStream, + Byte *outBuffer, SizeT outSize, ISzAllocPtr allocMain) +{ + CLzmaDec state; + SRes res = SZ_OK; + + LzmaDec_Construct(&state); + RINOK(LzmaDec_AllocateProbs(&state, props, propsSize, allocMain)); + state.dic = outBuffer; + state.dicBufSize = outSize; + LzmaDec_Init(&state); + + for (;;) + { + const void *inBuf = NULL; + size_t lookahead = (1 << 18); + if (lookahead > inSize) + lookahead = (size_t)inSize; + res = ILookInStream_Look(inStream, &inBuf, &lookahead); + if (res != SZ_OK) + break; + + { + SizeT inProcessed = (SizeT)lookahead, dicPos = state.dicPos; + ELzmaStatus status; + res = LzmaDec_DecodeToDic(&state, outSize, (const Byte *)inBuf, &inProcessed, LZMA_FINISH_END, &status); + lookahead -= inProcessed; + inSize -= inProcessed; + if (res != SZ_OK) + break; + + if (status == LZMA_STATUS_FINISHED_WITH_MARK) + { + if (outSize != state.dicPos || inSize != 0) + res = SZ_ERROR_DATA; + break; + } + + if (outSize == state.dicPos && inSize == 0 && status == LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK) + break; + + if (inProcessed == 0 && dicPos == state.dicPos) + { + res = SZ_ERROR_DATA; + break; + } + + res = ILookInStream_Skip(inStream, inProcessed); + if (res != SZ_OK) + break; + } + } + + LzmaDec_FreeProbs(&state, allocMain); + return res; +} + + +#ifndef _7Z_NO_METHOD_LZMA2 + +static SRes SzDecodeLzma2(const Byte *props, unsigned propsSize, UInt64 inSize, ILookInStream *inStream, + Byte *outBuffer, SizeT outSize, ISzAllocPtr allocMain) +{ + CLzma2Dec state; + SRes res = SZ_OK; + + Lzma2Dec_Construct(&state); + if (propsSize != 1) + return SZ_ERROR_DATA; + RINOK(Lzma2Dec_AllocateProbs(&state, props[0], allocMain)); + state.decoder.dic = outBuffer; + state.decoder.dicBufSize = outSize; + Lzma2Dec_Init(&state); + + for (;;) + { + const void *inBuf = NULL; + size_t lookahead = (1 << 18); + if (lookahead > inSize) + lookahead = (size_t)inSize; + res = ILookInStream_Look(inStream, &inBuf, &lookahead); + if (res != SZ_OK) + break; + + { + SizeT inProcessed = (SizeT)lookahead, dicPos = state.decoder.dicPos; + ELzmaStatus status; + res = Lzma2Dec_DecodeToDic(&state, outSize, (const Byte *)inBuf, &inProcessed, LZMA_FINISH_END, &status); + lookahead -= inProcessed; + inSize -= inProcessed; + if (res != SZ_OK) + break; + + if (status == LZMA_STATUS_FINISHED_WITH_MARK) + { + if (outSize != state.decoder.dicPos || inSize != 0) + res = SZ_ERROR_DATA; + break; + } + + if (inProcessed == 0 && dicPos == state.decoder.dicPos) + { + res = SZ_ERROR_DATA; + break; + } + + res = ILookInStream_Skip(inStream, inProcessed); + if (res != SZ_OK) + break; + } + } + + Lzma2Dec_FreeProbs(&state, allocMain); + return res; +} + +#endif + + +static SRes SzDecodeCopy(UInt64 inSize, ILookInStream *inStream, Byte *outBuffer) +{ + while (inSize > 0) + { + const void *inBuf; + size_t curSize = (1 << 18); + if (curSize > inSize) + curSize = (size_t)inSize; + RINOK(ILookInStream_Look(inStream, &inBuf, &curSize)); + if (curSize == 0) + return SZ_ERROR_INPUT_EOF; + memcpy(outBuffer, inBuf, curSize); + outBuffer += curSize; + inSize -= curSize; + RINOK(ILookInStream_Skip(inStream, curSize)); + } + return SZ_OK; +} + +static BoolInt IS_MAIN_METHOD(UInt32 m) +{ + switch (m) + { + case k_Copy: + case k_LZMA: + #ifndef _7Z_NO_METHOD_LZMA2 + case k_LZMA2: + #endif + #ifdef _7ZIP_PPMD_SUPPPORT + case k_PPMD: + #endif + return True; + } + return False; +} + +static BoolInt IS_SUPPORTED_CODER(const CSzCoderInfo *c) +{ + return + c->NumStreams == 1 + /* && c->MethodID <= (UInt32)0xFFFFFFFF */ + && IS_MAIN_METHOD((UInt32)c->MethodID); +} + +#define IS_BCJ2(c) ((c)->MethodID == k_BCJ2 && (c)->NumStreams == 4) + +static SRes CheckSupportedFolder(const CSzFolder *f) +{ + if (f->NumCoders < 1 || f->NumCoders > 4) + return SZ_ERROR_UNSUPPORTED; + if (!IS_SUPPORTED_CODER(&f->Coders[0])) + return SZ_ERROR_UNSUPPORTED; + if (f->NumCoders == 1) + { + if (f->NumPackStreams != 1 || f->PackStreams[0] != 0 || f->NumBonds != 0) + return SZ_ERROR_UNSUPPORTED; + return SZ_OK; + } + + + #ifndef _7Z_NO_METHODS_FILTERS + + if (f->NumCoders == 2) + { + const CSzCoderInfo *c = &f->Coders[1]; + if ( + /* c->MethodID > (UInt32)0xFFFFFFFF || */ + c->NumStreams != 1 + || f->NumPackStreams != 1 + || f->PackStreams[0] != 0 + || f->NumBonds != 1 + || f->Bonds[0].InIndex != 1 + || f->Bonds[0].OutIndex != 0) + return SZ_ERROR_UNSUPPORTED; + switch ((UInt32)c->MethodID) + { + case k_Delta: + case k_BCJ: + case k_PPC: + case k_IA64: + case k_SPARC: + case k_ARM: + case k_ARMT: + break; + default: + return SZ_ERROR_UNSUPPORTED; + } + return SZ_OK; + } + + #endif + + + if (f->NumCoders == 4) + { + if (!IS_SUPPORTED_CODER(&f->Coders[1]) + || !IS_SUPPORTED_CODER(&f->Coders[2]) + || !IS_BCJ2(&f->Coders[3])) + return SZ_ERROR_UNSUPPORTED; + if (f->NumPackStreams != 4 + || f->PackStreams[0] != 2 + || f->PackStreams[1] != 6 + || f->PackStreams[2] != 1 + || f->PackStreams[3] != 0 + || f->NumBonds != 3 + || f->Bonds[0].InIndex != 5 || f->Bonds[0].OutIndex != 0 + || f->Bonds[1].InIndex != 4 || f->Bonds[1].OutIndex != 1 + || f->Bonds[2].InIndex != 3 || f->Bonds[2].OutIndex != 2) + return SZ_ERROR_UNSUPPORTED; + return SZ_OK; + } + + return SZ_ERROR_UNSUPPORTED; +} + +#ifndef _7Z_NO_METHODS_FILTERS +#define CASE_BRA_CONV(isa) case k_ ## isa: isa ## _Convert(outBuffer, outSize, 0, 0); break; +#endif + +static SRes SzFolder_Decode2(const CSzFolder *folder, + const Byte *propsData, + const UInt64 *unpackSizes, + const UInt64 *packPositions, + ILookInStream *inStream, UInt64 startPos, + Byte *outBuffer, SizeT outSize, ISzAllocPtr allocMain, + Byte *tempBuf[]) +{ + UInt32 ci; + SizeT tempSizes[3] = { 0, 0, 0}; + SizeT tempSize3 = 0; + Byte *tempBuf3 = 0; + + RINOK(CheckSupportedFolder(folder)); + + for (ci = 0; ci < folder->NumCoders; ci++) + { + const CSzCoderInfo *coder = &folder->Coders[ci]; + + if (IS_MAIN_METHOD((UInt32)coder->MethodID)) + { + UInt32 si = 0; + UInt64 offset; + UInt64 inSize; + Byte *outBufCur = outBuffer; + SizeT outSizeCur = outSize; + if (folder->NumCoders == 4) + { + UInt32 indices[] = { 3, 2, 0 }; + UInt64 unpackSize = unpackSizes[ci]; + si = indices[ci]; + if (ci < 2) + { + Byte *temp; + outSizeCur = (SizeT)unpackSize; + if (outSizeCur != unpackSize) + return SZ_ERROR_MEM; + temp = (Byte *)ISzAlloc_Alloc(allocMain, outSizeCur); + if (!temp && outSizeCur != 0) + return SZ_ERROR_MEM; + outBufCur = tempBuf[1 - ci] = temp; + tempSizes[1 - ci] = outSizeCur; + } + else if (ci == 2) + { + if (unpackSize > outSize) /* check it */ + return SZ_ERROR_PARAM; + tempBuf3 = outBufCur = outBuffer + (outSize - (size_t)unpackSize); + tempSize3 = outSizeCur = (SizeT)unpackSize; + } + else + return SZ_ERROR_UNSUPPORTED; + } + offset = packPositions[si]; + inSize = packPositions[(size_t)si + 1] - offset; + RINOK(LookInStream_SeekTo(inStream, startPos + offset)); + + if (coder->MethodID == k_Copy) + { + if (inSize != outSizeCur) /* check it */ + return SZ_ERROR_DATA; + RINOK(SzDecodeCopy(inSize, inStream, outBufCur)); + } + else if (coder->MethodID == k_LZMA) + { + RINOK(SzDecodeLzma(propsData + coder->PropsOffset, coder->PropsSize, inSize, inStream, outBufCur, outSizeCur, allocMain)); + } + #ifndef _7Z_NO_METHOD_LZMA2 + else if (coder->MethodID == k_LZMA2) + { + RINOK(SzDecodeLzma2(propsData + coder->PropsOffset, coder->PropsSize, inSize, inStream, outBufCur, outSizeCur, allocMain)); + } + #endif + #ifdef _7ZIP_PPMD_SUPPPORT + else if (coder->MethodID == k_PPMD) + { + RINOK(SzDecodePpmd(propsData + coder->PropsOffset, coder->PropsSize, inSize, inStream, outBufCur, outSizeCur, allocMain)); + } + #endif + else + return SZ_ERROR_UNSUPPORTED; + } + else if (coder->MethodID == k_BCJ2) + { + UInt64 offset = packPositions[1]; + UInt64 s3Size = packPositions[2] - offset; + + if (ci != 3) + return SZ_ERROR_UNSUPPORTED; + + tempSizes[2] = (SizeT)s3Size; + if (tempSizes[2] != s3Size) + return SZ_ERROR_MEM; + tempBuf[2] = (Byte *)ISzAlloc_Alloc(allocMain, tempSizes[2]); + if (!tempBuf[2] && tempSizes[2] != 0) + return SZ_ERROR_MEM; + + RINOK(LookInStream_SeekTo(inStream, startPos + offset)); + RINOK(SzDecodeCopy(s3Size, inStream, tempBuf[2])); + + if ((tempSizes[0] & 3) != 0 || + (tempSizes[1] & 3) != 0 || + tempSize3 + tempSizes[0] + tempSizes[1] != outSize) + return SZ_ERROR_DATA; + + { + CBcj2Dec p; + + p.bufs[0] = tempBuf3; p.lims[0] = tempBuf3 + tempSize3; + p.bufs[1] = tempBuf[0]; p.lims[1] = tempBuf[0] + tempSizes[0]; + p.bufs[2] = tempBuf[1]; p.lims[2] = tempBuf[1] + tempSizes[1]; + p.bufs[3] = tempBuf[2]; p.lims[3] = tempBuf[2] + tempSizes[2]; + + p.dest = outBuffer; + p.destLim = outBuffer + outSize; + + Bcj2Dec_Init(&p); + RINOK(Bcj2Dec_Decode(&p)); + + { + unsigned i; + for (i = 0; i < 4; i++) + if (p.bufs[i] != p.lims[i]) + return SZ_ERROR_DATA; + + if (!Bcj2Dec_IsFinished(&p)) + return SZ_ERROR_DATA; + + if (p.dest != p.destLim + || p.state != BCJ2_STREAM_MAIN) + return SZ_ERROR_DATA; + } + } + } + #ifndef _7Z_NO_METHODS_FILTERS + else if (ci == 1) + { + if (coder->MethodID == k_Delta) + { + if (coder->PropsSize != 1) + return SZ_ERROR_UNSUPPORTED; + { + Byte state[DELTA_STATE_SIZE]; + Delta_Init(state); + Delta_Decode(state, (unsigned)(propsData[coder->PropsOffset]) + 1, outBuffer, outSize); + } + } + else + { + if (coder->PropsSize != 0) + return SZ_ERROR_UNSUPPORTED; + switch (coder->MethodID) + { + case k_BCJ: + { + UInt32 state; + x86_Convert_Init(state); + x86_Convert(outBuffer, outSize, 0, &state, 0); + break; + } + CASE_BRA_CONV(PPC) + CASE_BRA_CONV(IA64) + CASE_BRA_CONV(SPARC) + CASE_BRA_CONV(ARM) + CASE_BRA_CONV(ARMT) + default: + return SZ_ERROR_UNSUPPORTED; + } + } + } + #endif + else + return SZ_ERROR_UNSUPPORTED; + } + + return SZ_OK; +} + + +SRes SzAr_DecodeFolder(const CSzAr *p, UInt32 folderIndex, + ILookInStream *inStream, UInt64 startPos, + Byte *outBuffer, size_t outSize, + ISzAllocPtr allocMain) +{ + SRes res; + CSzFolder folder; + CSzData sd; + + const Byte *data = p->CodersData + p->FoCodersOffsets[folderIndex]; + sd.Data = data; + sd.Size = p->FoCodersOffsets[(size_t)folderIndex + 1] - p->FoCodersOffsets[folderIndex]; + + res = SzGetNextFolderItem(&folder, &sd); + + if (res != SZ_OK) + return res; + + if (sd.Size != 0 + || folder.UnpackStream != p->FoToMainUnpackSizeIndex[folderIndex] + || outSize != SzAr_GetFolderUnpackSize(p, folderIndex)) + return SZ_ERROR_FAIL; + { + unsigned i; + Byte *tempBuf[3] = { 0, 0, 0}; + + res = SzFolder_Decode2(&folder, data, + &p->CoderUnpackSizes[p->FoToCoderUnpackSizes[folderIndex]], + p->PackPositions + p->FoStartPackStreamIndex[folderIndex], + inStream, startPos, + outBuffer, (SizeT)outSize, allocMain, tempBuf); + + for (i = 0; i < 3; i++) + ISzAlloc_Free(allocMain, tempBuf[i]); + + if (res == SZ_OK) + if (SzBitWithVals_Check(&p->FolderCRCs, folderIndex)) + if (CrcCalc(outBuffer, outSize) != p->FolderCRCs.Vals[folderIndex]) + res = SZ_ERROR_CRC; + + return res; + } +} diff --git a/deps/LZMA-SDK/C/7zFile.c b/deps/LZMA-SDK/C/7zFile.c index 900125d52..13d2efa47 100644 --- a/deps/LZMA-SDK/C/7zFile.c +++ b/deps/LZMA-SDK/C/7zFile.c @@ -1,442 +1,442 @@ -/* 7zFile.c -- File IO -2021-04-29 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include "7zFile.h" - -#ifndef USE_WINDOWS_FILE - - #include - - #ifndef USE_FOPEN - #include - #include - #ifdef _WIN32 - #include - typedef int ssize_t; - typedef int off_t; - #else - #include - #endif - #endif - -#else - -/* - ReadFile and WriteFile functions in Windows have BUG: - If you Read or Write 64MB or more (probably min_failure_size = 64MB - 32KB + 1) - from/to Network file, it returns ERROR_NO_SYSTEM_RESOURCES - (Insufficient system resources exist to complete the requested service). - Probably in some version of Windows there are problems with other sizes: - for 32 MB (maybe also for 16 MB). - And message can be "Network connection was lost" -*/ - -#endif - -#define kChunkSizeMax (1 << 22) - -void File_Construct(CSzFile *p) -{ - #ifdef USE_WINDOWS_FILE - p->handle = INVALID_HANDLE_VALUE; - #elif defined(USE_FOPEN) - p->file = NULL; - #else - p->fd = -1; - #endif -} - -#if !defined(UNDER_CE) || !defined(USE_WINDOWS_FILE) - -static WRes File_Open(CSzFile *p, const char *name, int writeMode) -{ - #ifdef USE_WINDOWS_FILE - - p->handle = CreateFileA(name, - writeMode ? GENERIC_WRITE : GENERIC_READ, - FILE_SHARE_READ, NULL, - writeMode ? CREATE_ALWAYS : OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, NULL); - return (p->handle != INVALID_HANDLE_VALUE) ? 0 : GetLastError(); - - #elif defined(USE_FOPEN) - - p->file = fopen(name, writeMode ? "wb+" : "rb"); - return (p->file != 0) ? 0 : - #ifdef UNDER_CE - 2; /* ENOENT */ - #else - errno; - #endif - - #else - - int flags = (writeMode ? (O_CREAT | O_EXCL | O_WRONLY) : O_RDONLY); - #ifdef O_BINARY - flags |= O_BINARY; - #endif - p->fd = open(name, flags, 0666); - return (p->fd != -1) ? 0 : errno; - - #endif -} - -WRes InFile_Open(CSzFile *p, const char *name) { return File_Open(p, name, 0); } - -WRes OutFile_Open(CSzFile *p, const char *name) -{ - #if defined(USE_WINDOWS_FILE) || defined(USE_FOPEN) - return File_Open(p, name, 1); - #else - p->fd = creat(name, 0666); - return (p->fd != -1) ? 0 : errno; - #endif -} - -#endif - - -#ifdef USE_WINDOWS_FILE -static WRes File_OpenW(CSzFile *p, const WCHAR *name, int writeMode) -{ - p->handle = CreateFileW(name, - writeMode ? GENERIC_WRITE : GENERIC_READ, - FILE_SHARE_READ, NULL, - writeMode ? CREATE_ALWAYS : OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, NULL); - return (p->handle != INVALID_HANDLE_VALUE) ? 0 : GetLastError(); -} -WRes InFile_OpenW(CSzFile *p, const WCHAR *name) { return File_OpenW(p, name, 0); } -WRes OutFile_OpenW(CSzFile *p, const WCHAR *name) { return File_OpenW(p, name, 1); } -#endif - -WRes File_Close(CSzFile *p) -{ - #ifdef USE_WINDOWS_FILE - - if (p->handle != INVALID_HANDLE_VALUE) - { - if (!CloseHandle(p->handle)) - return GetLastError(); - p->handle = INVALID_HANDLE_VALUE; - } - - #elif defined(USE_FOPEN) - - if (p->file != NULL) - { - int res = fclose(p->file); - if (res != 0) - { - if (res == EOF) - return errno; - return res; - } - p->file = NULL; - } - - #else - - if (p->fd != -1) - { - if (close(p->fd) != 0) - return errno; - p->fd = -1; - } - - #endif - - return 0; -} - - -WRes File_Read(CSzFile *p, void *data, size_t *size) -{ - size_t originalSize = *size; - *size = 0; - if (originalSize == 0) - return 0; - - #ifdef USE_WINDOWS_FILE - - do - { - const DWORD curSize = (originalSize > kChunkSizeMax) ? kChunkSizeMax : (DWORD)originalSize; - DWORD processed = 0; - const BOOL res = ReadFile(p->handle, data, curSize, &processed, NULL); - data = (void *)((Byte *)data + processed); - originalSize -= processed; - *size += processed; - if (!res) - return GetLastError(); - // debug : we can break here for partial reading mode - if (processed == 0) - break; - } - while (originalSize > 0); - - #elif defined(USE_FOPEN) - - do - { - const size_t curSize = (originalSize > kChunkSizeMax) ? kChunkSizeMax : originalSize; - const size_t processed = fread(data, 1, curSize, p->file); - data = (void *)((Byte *)data + (size_t)processed); - originalSize -= processed; - *size += processed; - if (processed != curSize) - return ferror(p->file); - // debug : we can break here for partial reading mode - if (processed == 0) - break; - } - while (originalSize > 0); - - #else - - do - { - const size_t curSize = (originalSize > kChunkSizeMax) ? kChunkSizeMax : originalSize; - const ssize_t processed = read(p->fd, data, curSize); - if (processed == -1) - return errno; - if (processed == 0) - break; - data = (void *)((Byte *)data + (size_t)processed); - originalSize -= (size_t)processed; - *size += (size_t)processed; - // debug : we can break here for partial reading mode - // break; - } - while (originalSize > 0); - - #endif - - return 0; -} - - -WRes File_Write(CSzFile *p, const void *data, size_t *size) -{ - size_t originalSize = *size; - *size = 0; - if (originalSize == 0) - return 0; - - #ifdef USE_WINDOWS_FILE - - do - { - const DWORD curSize = (originalSize > kChunkSizeMax) ? kChunkSizeMax : (DWORD)originalSize; - DWORD processed = 0; - const BOOL res = WriteFile(p->handle, data, curSize, &processed, NULL); - data = (const void *)((const Byte *)data + processed); - originalSize -= processed; - *size += processed; - if (!res) - return GetLastError(); - if (processed == 0) - break; - } - while (originalSize > 0); - - #elif defined(USE_FOPEN) - - do - { - const size_t curSize = (originalSize > kChunkSizeMax) ? kChunkSizeMax : originalSize; - const size_t processed = fwrite(data, 1, curSize, p->file); - data = (void *)((Byte *)data + (size_t)processed); - originalSize -= processed; - *size += processed; - if (processed != curSize) - return ferror(p->file); - if (processed == 0) - break; - } - while (originalSize > 0); - - #else - - do - { - const size_t curSize = (originalSize > kChunkSizeMax) ? kChunkSizeMax : originalSize; - const ssize_t processed = write(p->fd, data, curSize); - if (processed == -1) - return errno; - if (processed == 0) - break; - data = (void *)((Byte *)data + (size_t)processed); - originalSize -= (size_t)processed; - *size += (size_t)processed; - } - while (originalSize > 0); - - #endif - - return 0; -} - - -WRes File_Seek(CSzFile *p, Int64 *pos, ESzSeek origin) -{ - #ifdef USE_WINDOWS_FILE - - DWORD moveMethod; - UInt32 low = (UInt32)*pos; - LONG high = (LONG)((UInt64)*pos >> 16 >> 16); /* for case when UInt64 is 32-bit only */ - switch (origin) - { - case SZ_SEEK_SET: moveMethod = FILE_BEGIN; break; - case SZ_SEEK_CUR: moveMethod = FILE_CURRENT; break; - case SZ_SEEK_END: moveMethod = FILE_END; break; - default: return ERROR_INVALID_PARAMETER; - } - low = SetFilePointer(p->handle, (LONG)low, &high, moveMethod); - if (low == (UInt32)0xFFFFFFFF) - { - WRes res = GetLastError(); - if (res != NO_ERROR) - return res; - } - *pos = ((Int64)high << 32) | low; - return 0; - - #else - - int moveMethod; // = origin; - - switch (origin) - { - case SZ_SEEK_SET: moveMethod = SEEK_SET; break; - case SZ_SEEK_CUR: moveMethod = SEEK_CUR; break; - case SZ_SEEK_END: moveMethod = SEEK_END; break; - default: return EINVAL; - } - - #if defined(USE_FOPEN) - { - int res = fseek(p->file, (long)*pos, moveMethod); - if (res == -1) - return errno; - *pos = ftell(p->file); - if (*pos == -1) - return errno; - return 0; - } - #else - { - off_t res = lseek(p->fd, (off_t)*pos, moveMethod); - if (res == -1) - return errno; - *pos = res; - return 0; - } - - #endif // USE_FOPEN - #endif // USE_WINDOWS_FILE -} - - -WRes File_GetLength(CSzFile *p, UInt64 *length) -{ - #ifdef USE_WINDOWS_FILE - - DWORD sizeHigh; - DWORD sizeLow = GetFileSize(p->handle, &sizeHigh); - if (sizeLow == 0xFFFFFFFF) - { - DWORD res = GetLastError(); - if (res != NO_ERROR) - return res; - } - *length = (((UInt64)sizeHigh) << 32) + sizeLow; - return 0; - - #elif defined(USE_FOPEN) - - long pos = ftell(p->file); - int res = fseek(p->file, 0, SEEK_END); - *length = ftell(p->file); - fseek(p->file, pos, SEEK_SET); - return res; - - #else - - off_t pos; - *length = 0; - pos = lseek(p->fd, 0, SEEK_CUR); - if (pos != -1) - { - const off_t len2 = lseek(p->fd, 0, SEEK_END); - const off_t res2 = lseek(p->fd, pos, SEEK_SET); - if (len2 != -1) - { - *length = (UInt64)len2; - if (res2 != -1) - return 0; - } - } - return errno; - - #endif -} - - -/* ---------- FileSeqInStream ---------- */ - -static SRes FileSeqInStream_Read(const ISeqInStream *pp, void *buf, size_t *size) -{ - CFileSeqInStream *p = CONTAINER_FROM_VTBL(pp, CFileSeqInStream, vt); - WRes wres = File_Read(&p->file, buf, size); - p->wres = wres; - return (wres == 0) ? SZ_OK : SZ_ERROR_READ; -} - -void FileSeqInStream_CreateVTable(CFileSeqInStream *p) -{ - p->vt.Read = FileSeqInStream_Read; -} - - -/* ---------- FileInStream ---------- */ - -static SRes FileInStream_Read(const ISeekInStream *pp, void *buf, size_t *size) -{ - CFileInStream *p = CONTAINER_FROM_VTBL(pp, CFileInStream, vt); - WRes wres = File_Read(&p->file, buf, size); - p->wres = wres; - return (wres == 0) ? SZ_OK : SZ_ERROR_READ; -} - -static SRes FileInStream_Seek(const ISeekInStream *pp, Int64 *pos, ESzSeek origin) -{ - CFileInStream *p = CONTAINER_FROM_VTBL(pp, CFileInStream, vt); - WRes wres = File_Seek(&p->file, pos, origin); - p->wres = wres; - return (wres == 0) ? SZ_OK : SZ_ERROR_READ; -} - -void FileInStream_CreateVTable(CFileInStream *p) -{ - p->vt.Read = FileInStream_Read; - p->vt.Seek = FileInStream_Seek; -} - - -/* ---------- FileOutStream ---------- */ - -static size_t FileOutStream_Write(const ISeqOutStream *pp, const void *data, size_t size) -{ - CFileOutStream *p = CONTAINER_FROM_VTBL(pp, CFileOutStream, vt); - WRes wres = File_Write(&p->file, data, &size); - p->wres = wres; - return size; -} - -void FileOutStream_CreateVTable(CFileOutStream *p) -{ - p->vt.Write = FileOutStream_Write; -} +/* 7zFile.c -- File IO +2021-04-29 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "7zFile.h" + +#ifndef USE_WINDOWS_FILE + + #include + + #ifndef USE_FOPEN + #include + #include + #ifdef _WIN32 + #include + typedef int ssize_t; + typedef int off_t; + #else + #include + #endif + #endif + +#else + +/* + ReadFile and WriteFile functions in Windows have BUG: + If you Read or Write 64MB or more (probably min_failure_size = 64MB - 32KB + 1) + from/to Network file, it returns ERROR_NO_SYSTEM_RESOURCES + (Insufficient system resources exist to complete the requested service). + Probably in some version of Windows there are problems with other sizes: + for 32 MB (maybe also for 16 MB). + And message can be "Network connection was lost" +*/ + +#endif + +#define kChunkSizeMax (1 << 22) + +void File_Construct(CSzFile *p) +{ + #ifdef USE_WINDOWS_FILE + p->handle = INVALID_HANDLE_VALUE; + #elif defined(USE_FOPEN) + p->file = NULL; + #else + p->fd = -1; + #endif +} + +#if !defined(UNDER_CE) || !defined(USE_WINDOWS_FILE) + +static WRes File_Open(CSzFile *p, const char *name, int writeMode) +{ + #ifdef USE_WINDOWS_FILE + + p->handle = CreateFileA(name, + writeMode ? GENERIC_WRITE : GENERIC_READ, + FILE_SHARE_READ, NULL, + writeMode ? CREATE_ALWAYS : OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, NULL); + return (p->handle != INVALID_HANDLE_VALUE) ? 0 : GetLastError(); + + #elif defined(USE_FOPEN) + + p->file = fopen(name, writeMode ? "wb+" : "rb"); + return (p->file != 0) ? 0 : + #ifdef UNDER_CE + 2; /* ENOENT */ + #else + errno; + #endif + + #else + + int flags = (writeMode ? (O_CREAT | O_EXCL | O_WRONLY) : O_RDONLY); + #ifdef O_BINARY + flags |= O_BINARY; + #endif + p->fd = open(name, flags, 0666); + return (p->fd != -1) ? 0 : errno; + + #endif +} + +WRes InFile_Open(CSzFile *p, const char *name) { return File_Open(p, name, 0); } + +WRes OutFile_Open(CSzFile *p, const char *name) +{ + #if defined(USE_WINDOWS_FILE) || defined(USE_FOPEN) + return File_Open(p, name, 1); + #else + p->fd = creat(name, 0666); + return (p->fd != -1) ? 0 : errno; + #endif +} + +#endif + + +#ifdef USE_WINDOWS_FILE +static WRes File_OpenW(CSzFile *p, const WCHAR *name, int writeMode) +{ + p->handle = CreateFileW(name, + writeMode ? GENERIC_WRITE : GENERIC_READ, + FILE_SHARE_READ, NULL, + writeMode ? CREATE_ALWAYS : OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, NULL); + return (p->handle != INVALID_HANDLE_VALUE) ? 0 : GetLastError(); +} +WRes InFile_OpenW(CSzFile *p, const WCHAR *name) { return File_OpenW(p, name, 0); } +WRes OutFile_OpenW(CSzFile *p, const WCHAR *name) { return File_OpenW(p, name, 1); } +#endif + +WRes File_Close(CSzFile *p) +{ + #ifdef USE_WINDOWS_FILE + + if (p->handle != INVALID_HANDLE_VALUE) + { + if (!CloseHandle(p->handle)) + return GetLastError(); + p->handle = INVALID_HANDLE_VALUE; + } + + #elif defined(USE_FOPEN) + + if (p->file != NULL) + { + int res = fclose(p->file); + if (res != 0) + { + if (res == EOF) + return errno; + return res; + } + p->file = NULL; + } + + #else + + if (p->fd != -1) + { + if (close(p->fd) != 0) + return errno; + p->fd = -1; + } + + #endif + + return 0; +} + + +WRes File_Read(CSzFile *p, void *data, size_t *size) +{ + size_t originalSize = *size; + *size = 0; + if (originalSize == 0) + return 0; + + #ifdef USE_WINDOWS_FILE + + do + { + const DWORD curSize = (originalSize > kChunkSizeMax) ? kChunkSizeMax : (DWORD)originalSize; + DWORD processed = 0; + const BOOL res = ReadFile(p->handle, data, curSize, &processed, NULL); + data = (void *)((Byte *)data + processed); + originalSize -= processed; + *size += processed; + if (!res) + return GetLastError(); + // debug : we can break here for partial reading mode + if (processed == 0) + break; + } + while (originalSize > 0); + + #elif defined(USE_FOPEN) + + do + { + const size_t curSize = (originalSize > kChunkSizeMax) ? kChunkSizeMax : originalSize; + const size_t processed = fread(data, 1, curSize, p->file); + data = (void *)((Byte *)data + (size_t)processed); + originalSize -= processed; + *size += processed; + if (processed != curSize) + return ferror(p->file); + // debug : we can break here for partial reading mode + if (processed == 0) + break; + } + while (originalSize > 0); + + #else + + do + { + const size_t curSize = (originalSize > kChunkSizeMax) ? kChunkSizeMax : originalSize; + const ssize_t processed = read(p->fd, data, curSize); + if (processed == -1) + return errno; + if (processed == 0) + break; + data = (void *)((Byte *)data + (size_t)processed); + originalSize -= (size_t)processed; + *size += (size_t)processed; + // debug : we can break here for partial reading mode + // break; + } + while (originalSize > 0); + + #endif + + return 0; +} + + +WRes File_Write(CSzFile *p, const void *data, size_t *size) +{ + size_t originalSize = *size; + *size = 0; + if (originalSize == 0) + return 0; + + #ifdef USE_WINDOWS_FILE + + do + { + const DWORD curSize = (originalSize > kChunkSizeMax) ? kChunkSizeMax : (DWORD)originalSize; + DWORD processed = 0; + const BOOL res = WriteFile(p->handle, data, curSize, &processed, NULL); + data = (const void *)((const Byte *)data + processed); + originalSize -= processed; + *size += processed; + if (!res) + return GetLastError(); + if (processed == 0) + break; + } + while (originalSize > 0); + + #elif defined(USE_FOPEN) + + do + { + const size_t curSize = (originalSize > kChunkSizeMax) ? kChunkSizeMax : originalSize; + const size_t processed = fwrite(data, 1, curSize, p->file); + data = (void *)((Byte *)data + (size_t)processed); + originalSize -= processed; + *size += processed; + if (processed != curSize) + return ferror(p->file); + if (processed == 0) + break; + } + while (originalSize > 0); + + #else + + do + { + const size_t curSize = (originalSize > kChunkSizeMax) ? kChunkSizeMax : originalSize; + const ssize_t processed = write(p->fd, data, curSize); + if (processed == -1) + return errno; + if (processed == 0) + break; + data = (void *)((Byte *)data + (size_t)processed); + originalSize -= (size_t)processed; + *size += (size_t)processed; + } + while (originalSize > 0); + + #endif + + return 0; +} + + +WRes File_Seek(CSzFile *p, Int64 *pos, ESzSeek origin) +{ + #ifdef USE_WINDOWS_FILE + + DWORD moveMethod; + UInt32 low = (UInt32)*pos; + LONG high = (LONG)((UInt64)*pos >> 16 >> 16); /* for case when UInt64 is 32-bit only */ + switch (origin) + { + case SZ_SEEK_SET: moveMethod = FILE_BEGIN; break; + case SZ_SEEK_CUR: moveMethod = FILE_CURRENT; break; + case SZ_SEEK_END: moveMethod = FILE_END; break; + default: return ERROR_INVALID_PARAMETER; + } + low = SetFilePointer(p->handle, (LONG)low, &high, moveMethod); + if (low == (UInt32)0xFFFFFFFF) + { + WRes res = GetLastError(); + if (res != NO_ERROR) + return res; + } + *pos = ((Int64)high << 32) | low; + return 0; + + #else + + int moveMethod; // = origin; + + switch (origin) + { + case SZ_SEEK_SET: moveMethod = SEEK_SET; break; + case SZ_SEEK_CUR: moveMethod = SEEK_CUR; break; + case SZ_SEEK_END: moveMethod = SEEK_END; break; + default: return EINVAL; + } + + #if defined(USE_FOPEN) + { + int res = fseek(p->file, (long)*pos, moveMethod); + if (res == -1) + return errno; + *pos = ftell(p->file); + if (*pos == -1) + return errno; + return 0; + } + #else + { + off_t res = lseek(p->fd, (off_t)*pos, moveMethod); + if (res == -1) + return errno; + *pos = res; + return 0; + } + + #endif // USE_FOPEN + #endif // USE_WINDOWS_FILE +} + + +WRes File_GetLength(CSzFile *p, UInt64 *length) +{ + #ifdef USE_WINDOWS_FILE + + DWORD sizeHigh; + DWORD sizeLow = GetFileSize(p->handle, &sizeHigh); + if (sizeLow == 0xFFFFFFFF) + { + DWORD res = GetLastError(); + if (res != NO_ERROR) + return res; + } + *length = (((UInt64)sizeHigh) << 32) + sizeLow; + return 0; + + #elif defined(USE_FOPEN) + + long pos = ftell(p->file); + int res = fseek(p->file, 0, SEEK_END); + *length = ftell(p->file); + fseek(p->file, pos, SEEK_SET); + return res; + + #else + + off_t pos; + *length = 0; + pos = lseek(p->fd, 0, SEEK_CUR); + if (pos != -1) + { + const off_t len2 = lseek(p->fd, 0, SEEK_END); + const off_t res2 = lseek(p->fd, pos, SEEK_SET); + if (len2 != -1) + { + *length = (UInt64)len2; + if (res2 != -1) + return 0; + } + } + return errno; + + #endif +} + + +/* ---------- FileSeqInStream ---------- */ + +static SRes FileSeqInStream_Read(const ISeqInStream *pp, void *buf, size_t *size) +{ + CFileSeqInStream *p = CONTAINER_FROM_VTBL(pp, CFileSeqInStream, vt); + WRes wres = File_Read(&p->file, buf, size); + p->wres = wres; + return (wres == 0) ? SZ_OK : SZ_ERROR_READ; +} + +void FileSeqInStream_CreateVTable(CFileSeqInStream *p) +{ + p->vt.Read = FileSeqInStream_Read; +} + + +/* ---------- FileInStream ---------- */ + +static SRes FileInStream_Read(const ISeekInStream *pp, void *buf, size_t *size) +{ + CFileInStream *p = CONTAINER_FROM_VTBL(pp, CFileInStream, vt); + WRes wres = File_Read(&p->file, buf, size); + p->wres = wres; + return (wres == 0) ? SZ_OK : SZ_ERROR_READ; +} + +static SRes FileInStream_Seek(const ISeekInStream *pp, Int64 *pos, ESzSeek origin) +{ + CFileInStream *p = CONTAINER_FROM_VTBL(pp, CFileInStream, vt); + WRes wres = File_Seek(&p->file, pos, origin); + p->wres = wres; + return (wres == 0) ? SZ_OK : SZ_ERROR_READ; +} + +void FileInStream_CreateVTable(CFileInStream *p) +{ + p->vt.Read = FileInStream_Read; + p->vt.Seek = FileInStream_Seek; +} + + +/* ---------- FileOutStream ---------- */ + +static size_t FileOutStream_Write(const ISeqOutStream *pp, const void *data, size_t size) +{ + CFileOutStream *p = CONTAINER_FROM_VTBL(pp, CFileOutStream, vt); + WRes wres = File_Write(&p->file, data, &size); + p->wres = wres; + return size; +} + +void FileOutStream_CreateVTable(CFileOutStream *p) +{ + p->vt.Write = FileOutStream_Write; +} diff --git a/deps/LZMA-SDK/C/7zFile.h b/deps/LZMA-SDK/C/7zFile.h index c7a30fc2b..788abb6b9 100644 --- a/deps/LZMA-SDK/C/7zFile.h +++ b/deps/LZMA-SDK/C/7zFile.h @@ -1,91 +1,91 @@ -/* 7zFile.h -- File IO -2021-02-15 : Igor Pavlov : Public domain */ - -#ifndef __7Z_FILE_H -#define __7Z_FILE_H - -#ifdef _WIN32 -#define USE_WINDOWS_FILE -// #include -#endif - -#ifdef USE_WINDOWS_FILE -#include -#else -// note: USE_FOPEN mode is limited to 32-bit file size -// #define USE_FOPEN -// #include -#endif - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -/* ---------- File ---------- */ - -typedef struct -{ - #ifdef USE_WINDOWS_FILE - HANDLE handle; - #elif defined(USE_FOPEN) - FILE *file; - #else - int fd; - #endif -} CSzFile; - -void File_Construct(CSzFile *p); -#if !defined(UNDER_CE) || !defined(USE_WINDOWS_FILE) -WRes InFile_Open(CSzFile *p, const char *name); -WRes OutFile_Open(CSzFile *p, const char *name); -#endif -#ifdef USE_WINDOWS_FILE -WRes InFile_OpenW(CSzFile *p, const WCHAR *name); -WRes OutFile_OpenW(CSzFile *p, const WCHAR *name); -#endif -WRes File_Close(CSzFile *p); - -/* reads max(*size, remain file's size) bytes */ -WRes File_Read(CSzFile *p, void *data, size_t *size); - -/* writes *size bytes */ -WRes File_Write(CSzFile *p, const void *data, size_t *size); - -WRes File_Seek(CSzFile *p, Int64 *pos, ESzSeek origin); -WRes File_GetLength(CSzFile *p, UInt64 *length); - - -/* ---------- FileInStream ---------- */ - -typedef struct -{ - ISeqInStream vt; - CSzFile file; - WRes wres; -} CFileSeqInStream; - -void FileSeqInStream_CreateVTable(CFileSeqInStream *p); - - -typedef struct -{ - ISeekInStream vt; - CSzFile file; - WRes wres; -} CFileInStream; - -void FileInStream_CreateVTable(CFileInStream *p); - - -typedef struct -{ - ISeqOutStream vt; - CSzFile file; - WRes wres; -} CFileOutStream; - -void FileOutStream_CreateVTable(CFileOutStream *p); - -EXTERN_C_END - -#endif +/* 7zFile.h -- File IO +2021-02-15 : Igor Pavlov : Public domain */ + +#ifndef __7Z_FILE_H +#define __7Z_FILE_H + +#ifdef _WIN32 +#define USE_WINDOWS_FILE +// #include +#endif + +#ifdef USE_WINDOWS_FILE +#include +#else +// note: USE_FOPEN mode is limited to 32-bit file size +// #define USE_FOPEN +// #include +#endif + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +/* ---------- File ---------- */ + +typedef struct +{ + #ifdef USE_WINDOWS_FILE + HANDLE handle; + #elif defined(USE_FOPEN) + FILE *file; + #else + int fd; + #endif +} CSzFile; + +void File_Construct(CSzFile *p); +#if !defined(UNDER_CE) || !defined(USE_WINDOWS_FILE) +WRes InFile_Open(CSzFile *p, const char *name); +WRes OutFile_Open(CSzFile *p, const char *name); +#endif +#ifdef USE_WINDOWS_FILE +WRes InFile_OpenW(CSzFile *p, const WCHAR *name); +WRes OutFile_OpenW(CSzFile *p, const WCHAR *name); +#endif +WRes File_Close(CSzFile *p); + +/* reads max(*size, remain file's size) bytes */ +WRes File_Read(CSzFile *p, void *data, size_t *size); + +/* writes *size bytes */ +WRes File_Write(CSzFile *p, const void *data, size_t *size); + +WRes File_Seek(CSzFile *p, Int64 *pos, ESzSeek origin); +WRes File_GetLength(CSzFile *p, UInt64 *length); + + +/* ---------- FileInStream ---------- */ + +typedef struct +{ + ISeqInStream vt; + CSzFile file; + WRes wres; +} CFileSeqInStream; + +void FileSeqInStream_CreateVTable(CFileSeqInStream *p); + + +typedef struct +{ + ISeekInStream vt; + CSzFile file; + WRes wres; +} CFileInStream; + +void FileInStream_CreateVTable(CFileInStream *p); + + +typedef struct +{ + ISeqOutStream vt; + CSzFile file; + WRes wres; +} CFileOutStream; + +void FileOutStream_CreateVTable(CFileOutStream *p); + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/7zStream.c b/deps/LZMA-SDK/C/7zStream.c index 4b472a41d..28a14604f 100644 --- a/deps/LZMA-SDK/C/7zStream.c +++ b/deps/LZMA-SDK/C/7zStream.c @@ -1,176 +1,176 @@ -/* 7zStream.c -- 7z Stream functions -2021-02-09 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include - -#include "7zTypes.h" - -SRes SeqInStream_Read2(const ISeqInStream *stream, void *buf, size_t size, SRes errorType) -{ - while (size != 0) - { - size_t processed = size; - RINOK(ISeqInStream_Read(stream, buf, &processed)); - if (processed == 0) - return errorType; - buf = (void *)((Byte *)buf + processed); - size -= processed; - } - return SZ_OK; -} - -SRes SeqInStream_Read(const ISeqInStream *stream, void *buf, size_t size) -{ - return SeqInStream_Read2(stream, buf, size, SZ_ERROR_INPUT_EOF); -} - -SRes SeqInStream_ReadByte(const ISeqInStream *stream, Byte *buf) -{ - size_t processed = 1; - RINOK(ISeqInStream_Read(stream, buf, &processed)); - return (processed == 1) ? SZ_OK : SZ_ERROR_INPUT_EOF; -} - - - -SRes LookInStream_SeekTo(const ILookInStream *stream, UInt64 offset) -{ - Int64 t = (Int64)offset; - return ILookInStream_Seek(stream, &t, SZ_SEEK_SET); -} - -SRes LookInStream_LookRead(const ILookInStream *stream, void *buf, size_t *size) -{ - const void *lookBuf; - if (*size == 0) - return SZ_OK; - RINOK(ILookInStream_Look(stream, &lookBuf, size)); - memcpy(buf, lookBuf, *size); - return ILookInStream_Skip(stream, *size); -} - -SRes LookInStream_Read2(const ILookInStream *stream, void *buf, size_t size, SRes errorType) -{ - while (size != 0) - { - size_t processed = size; - RINOK(ILookInStream_Read(stream, buf, &processed)); - if (processed == 0) - return errorType; - buf = (void *)((Byte *)buf + processed); - size -= processed; - } - return SZ_OK; -} - -SRes LookInStream_Read(const ILookInStream *stream, void *buf, size_t size) -{ - return LookInStream_Read2(stream, buf, size, SZ_ERROR_INPUT_EOF); -} - - - -#define GET_LookToRead2 CLookToRead2 *p = CONTAINER_FROM_VTBL(pp, CLookToRead2, vt); - -static SRes LookToRead2_Look_Lookahead(const ILookInStream *pp, const void **buf, size_t *size) -{ - SRes res = SZ_OK; - GET_LookToRead2 - size_t size2 = p->size - p->pos; - if (size2 == 0 && *size != 0) - { - p->pos = 0; - p->size = 0; - size2 = p->bufSize; - res = ISeekInStream_Read(p->realStream, p->buf, &size2); - p->size = size2; - } - if (*size > size2) - *size = size2; - *buf = p->buf + p->pos; - return res; -} - -static SRes LookToRead2_Look_Exact(const ILookInStream *pp, const void **buf, size_t *size) -{ - SRes res = SZ_OK; - GET_LookToRead2 - size_t size2 = p->size - p->pos; - if (size2 == 0 && *size != 0) - { - p->pos = 0; - p->size = 0; - if (*size > p->bufSize) - *size = p->bufSize; - res = ISeekInStream_Read(p->realStream, p->buf, size); - size2 = p->size = *size; - } - if (*size > size2) - *size = size2; - *buf = p->buf + p->pos; - return res; -} - -static SRes LookToRead2_Skip(const ILookInStream *pp, size_t offset) -{ - GET_LookToRead2 - p->pos += offset; - return SZ_OK; -} - -static SRes LookToRead2_Read(const ILookInStream *pp, void *buf, size_t *size) -{ - GET_LookToRead2 - size_t rem = p->size - p->pos; - if (rem == 0) - return ISeekInStream_Read(p->realStream, buf, size); - if (rem > *size) - rem = *size; - memcpy(buf, p->buf + p->pos, rem); - p->pos += rem; - *size = rem; - return SZ_OK; -} - -static SRes LookToRead2_Seek(const ILookInStream *pp, Int64 *pos, ESzSeek origin) -{ - GET_LookToRead2 - p->pos = p->size = 0; - return ISeekInStream_Seek(p->realStream, pos, origin); -} - -void LookToRead2_CreateVTable(CLookToRead2 *p, int lookahead) -{ - p->vt.Look = lookahead ? - LookToRead2_Look_Lookahead : - LookToRead2_Look_Exact; - p->vt.Skip = LookToRead2_Skip; - p->vt.Read = LookToRead2_Read; - p->vt.Seek = LookToRead2_Seek; -} - - - -static SRes SecToLook_Read(const ISeqInStream *pp, void *buf, size_t *size) -{ - CSecToLook *p = CONTAINER_FROM_VTBL(pp, CSecToLook, vt); - return LookInStream_LookRead(p->realStream, buf, size); -} - -void SecToLook_CreateVTable(CSecToLook *p) -{ - p->vt.Read = SecToLook_Read; -} - -static SRes SecToRead_Read(const ISeqInStream *pp, void *buf, size_t *size) -{ - CSecToRead *p = CONTAINER_FROM_VTBL(pp, CSecToRead, vt); - return ILookInStream_Read(p->realStream, buf, size); -} - -void SecToRead_CreateVTable(CSecToRead *p) -{ - p->vt.Read = SecToRead_Read; -} +/* 7zStream.c -- 7z Stream functions +2021-02-09 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include + +#include "7zTypes.h" + +SRes SeqInStream_Read2(const ISeqInStream *stream, void *buf, size_t size, SRes errorType) +{ + while (size != 0) + { + size_t processed = size; + RINOK(ISeqInStream_Read(stream, buf, &processed)); + if (processed == 0) + return errorType; + buf = (void *)((Byte *)buf + processed); + size -= processed; + } + return SZ_OK; +} + +SRes SeqInStream_Read(const ISeqInStream *stream, void *buf, size_t size) +{ + return SeqInStream_Read2(stream, buf, size, SZ_ERROR_INPUT_EOF); +} + +SRes SeqInStream_ReadByte(const ISeqInStream *stream, Byte *buf) +{ + size_t processed = 1; + RINOK(ISeqInStream_Read(stream, buf, &processed)); + return (processed == 1) ? SZ_OK : SZ_ERROR_INPUT_EOF; +} + + + +SRes LookInStream_SeekTo(const ILookInStream *stream, UInt64 offset) +{ + Int64 t = (Int64)offset; + return ILookInStream_Seek(stream, &t, SZ_SEEK_SET); +} + +SRes LookInStream_LookRead(const ILookInStream *stream, void *buf, size_t *size) +{ + const void *lookBuf; + if (*size == 0) + return SZ_OK; + RINOK(ILookInStream_Look(stream, &lookBuf, size)); + memcpy(buf, lookBuf, *size); + return ILookInStream_Skip(stream, *size); +} + +SRes LookInStream_Read2(const ILookInStream *stream, void *buf, size_t size, SRes errorType) +{ + while (size != 0) + { + size_t processed = size; + RINOK(ILookInStream_Read(stream, buf, &processed)); + if (processed == 0) + return errorType; + buf = (void *)((Byte *)buf + processed); + size -= processed; + } + return SZ_OK; +} + +SRes LookInStream_Read(const ILookInStream *stream, void *buf, size_t size) +{ + return LookInStream_Read2(stream, buf, size, SZ_ERROR_INPUT_EOF); +} + + + +#define GET_LookToRead2 CLookToRead2 *p = CONTAINER_FROM_VTBL(pp, CLookToRead2, vt); + +static SRes LookToRead2_Look_Lookahead(const ILookInStream *pp, const void **buf, size_t *size) +{ + SRes res = SZ_OK; + GET_LookToRead2 + size_t size2 = p->size - p->pos; + if (size2 == 0 && *size != 0) + { + p->pos = 0; + p->size = 0; + size2 = p->bufSize; + res = ISeekInStream_Read(p->realStream, p->buf, &size2); + p->size = size2; + } + if (*size > size2) + *size = size2; + *buf = p->buf + p->pos; + return res; +} + +static SRes LookToRead2_Look_Exact(const ILookInStream *pp, const void **buf, size_t *size) +{ + SRes res = SZ_OK; + GET_LookToRead2 + size_t size2 = p->size - p->pos; + if (size2 == 0 && *size != 0) + { + p->pos = 0; + p->size = 0; + if (*size > p->bufSize) + *size = p->bufSize; + res = ISeekInStream_Read(p->realStream, p->buf, size); + size2 = p->size = *size; + } + if (*size > size2) + *size = size2; + *buf = p->buf + p->pos; + return res; +} + +static SRes LookToRead2_Skip(const ILookInStream *pp, size_t offset) +{ + GET_LookToRead2 + p->pos += offset; + return SZ_OK; +} + +static SRes LookToRead2_Read(const ILookInStream *pp, void *buf, size_t *size) +{ + GET_LookToRead2 + size_t rem = p->size - p->pos; + if (rem == 0) + return ISeekInStream_Read(p->realStream, buf, size); + if (rem > *size) + rem = *size; + memcpy(buf, p->buf + p->pos, rem); + p->pos += rem; + *size = rem; + return SZ_OK; +} + +static SRes LookToRead2_Seek(const ILookInStream *pp, Int64 *pos, ESzSeek origin) +{ + GET_LookToRead2 + p->pos = p->size = 0; + return ISeekInStream_Seek(p->realStream, pos, origin); +} + +void LookToRead2_CreateVTable(CLookToRead2 *p, int lookahead) +{ + p->vt.Look = lookahead ? + LookToRead2_Look_Lookahead : + LookToRead2_Look_Exact; + p->vt.Skip = LookToRead2_Skip; + p->vt.Read = LookToRead2_Read; + p->vt.Seek = LookToRead2_Seek; +} + + + +static SRes SecToLook_Read(const ISeqInStream *pp, void *buf, size_t *size) +{ + CSecToLook *p = CONTAINER_FROM_VTBL(pp, CSecToLook, vt); + return LookInStream_LookRead(p->realStream, buf, size); +} + +void SecToLook_CreateVTable(CSecToLook *p) +{ + p->vt.Read = SecToLook_Read; +} + +static SRes SecToRead_Read(const ISeqInStream *pp, void *buf, size_t *size) +{ + CSecToRead *p = CONTAINER_FROM_VTBL(pp, CSecToRead, vt); + return ILookInStream_Read(p->realStream, buf, size); +} + +void SecToRead_CreateVTable(CSecToRead *p) +{ + p->vt.Read = SecToRead_Read; +} diff --git a/deps/LZMA-SDK/C/7zTypes.h b/deps/LZMA-SDK/C/7zTypes.h index 497b14506..f7d707183 100644 --- a/deps/LZMA-SDK/C/7zTypes.h +++ b/deps/LZMA-SDK/C/7zTypes.h @@ -1,519 +1,529 @@ -/* 7zTypes.h -- Basic types -2021-04-25 : Igor Pavlov : Public domain */ - -#ifndef __7Z_TYPES_H -#define __7Z_TYPES_H - -#ifdef _WIN32 -/* #include */ -#else -#include -#endif - -#include - -#ifndef EXTERN_C_BEGIN -#ifdef __cplusplus -#define EXTERN_C_BEGIN extern "C" { -#define EXTERN_C_END } -#else -#define EXTERN_C_BEGIN -#define EXTERN_C_END -#endif -#endif - -EXTERN_C_BEGIN - -#define SZ_OK 0 - -#define SZ_ERROR_DATA 1 -#define SZ_ERROR_MEM 2 -#define SZ_ERROR_CRC 3 -#define SZ_ERROR_UNSUPPORTED 4 -#define SZ_ERROR_PARAM 5 -#define SZ_ERROR_INPUT_EOF 6 -#define SZ_ERROR_OUTPUT_EOF 7 -#define SZ_ERROR_READ 8 -#define SZ_ERROR_WRITE 9 -#define SZ_ERROR_PROGRESS 10 -#define SZ_ERROR_FAIL 11 -#define SZ_ERROR_THREAD 12 - -#define SZ_ERROR_ARCHIVE 16 -#define SZ_ERROR_NO_ARCHIVE 17 - -typedef int SRes; - - -#ifdef _MSC_VER - #if _MSC_VER > 1200 - #define MY_ALIGN(n) __declspec(align(n)) - #else - #define MY_ALIGN(n) - #endif -#else - #define MY_ALIGN(n) __attribute__ ((aligned(n))) -#endif - - -#ifdef _WIN32 - -/* typedef DWORD WRes; */ -typedef unsigned WRes; -#define MY_SRes_HRESULT_FROM_WRes(x) HRESULT_FROM_WIN32(x) - -#else // _WIN32 - -// #define ENV_HAVE_LSTAT -typedef int WRes; - -// (FACILITY_ERRNO = 0x800) is 7zip's FACILITY constant to represent (errno) errors in HRESULT -#define MY__FACILITY_ERRNO 0x800 -#define MY__FACILITY_WIN32 7 -#define MY__FACILITY__WRes MY__FACILITY_ERRNO - -#define MY_HRESULT_FROM_errno_CONST_ERROR(x) ((HRESULT)( \ - ( (HRESULT)(x) & 0x0000FFFF) \ - | (MY__FACILITY__WRes << 16) \ - | (HRESULT)0x80000000 )) - -#define MY_SRes_HRESULT_FROM_WRes(x) \ - ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : MY_HRESULT_FROM_errno_CONST_ERROR(x)) - -// we call macro HRESULT_FROM_WIN32 for system errors (WRes) that are (errno) -#define HRESULT_FROM_WIN32(x) MY_SRes_HRESULT_FROM_WRes(x) - -/* -#define ERROR_FILE_NOT_FOUND 2L -#define ERROR_ACCESS_DENIED 5L -#define ERROR_NO_MORE_FILES 18L -#define ERROR_LOCK_VIOLATION 33L -#define ERROR_FILE_EXISTS 80L -#define ERROR_DISK_FULL 112L -#define ERROR_NEGATIVE_SEEK 131L -#define ERROR_ALREADY_EXISTS 183L -#define ERROR_DIRECTORY 267L -#define ERROR_TOO_MANY_POSTS 298L - -#define ERROR_INVALID_REPARSE_DATA 4392L -#define ERROR_REPARSE_TAG_INVALID 4393L -#define ERROR_REPARSE_TAG_MISMATCH 4394L -*/ - -// we use errno equivalents for some WIN32 errors: - -#define ERROR_INVALID_FUNCTION EINVAL -#define ERROR_ALREADY_EXISTS EEXIST -#define ERROR_FILE_EXISTS EEXIST -#define ERROR_PATH_NOT_FOUND ENOENT -#define ERROR_FILE_NOT_FOUND ENOENT -#define ERROR_DISK_FULL ENOSPC -// #define ERROR_INVALID_HANDLE EBADF - -// we use FACILITY_WIN32 for errors that has no errno equivalent -// Too many posts were made to a semaphore. -#define ERROR_TOO_MANY_POSTS ((HRESULT)0x8007012AL) -#define ERROR_INVALID_REPARSE_DATA ((HRESULT)0x80071128L) -#define ERROR_REPARSE_TAG_INVALID ((HRESULT)0x80071129L) - -// if (MY__FACILITY__WRes != FACILITY_WIN32), -// we use FACILITY_WIN32 for COM errors: -#define E_OUTOFMEMORY ((HRESULT)0x8007000EL) -#define E_INVALIDARG ((HRESULT)0x80070057L) -#define MY__E_ERROR_NEGATIVE_SEEK ((HRESULT)0x80070083L) - -/* -// we can use FACILITY_ERRNO for some COM errors, that have errno equivalents: -#define E_OUTOFMEMORY MY_HRESULT_FROM_errno_CONST_ERROR(ENOMEM) -#define E_INVALIDARG MY_HRESULT_FROM_errno_CONST_ERROR(EINVAL) -#define MY__E_ERROR_NEGATIVE_SEEK MY_HRESULT_FROM_errno_CONST_ERROR(EINVAL) -*/ - -// gcc / clang : (sizeof(long) == sizeof(void*)) in 32/64 bits -typedef long INT_PTR; -typedef unsigned long UINT_PTR; - -#define TEXT(quote) quote - -#define FILE_ATTRIBUTE_READONLY 0x0001 -#define FILE_ATTRIBUTE_HIDDEN 0x0002 -#define FILE_ATTRIBUTE_SYSTEM 0x0004 -#define FILE_ATTRIBUTE_DIRECTORY 0x0010 -#define FILE_ATTRIBUTE_ARCHIVE 0x0020 -#define FILE_ATTRIBUTE_DEVICE 0x0040 -#define FILE_ATTRIBUTE_NORMAL 0x0080 -#define FILE_ATTRIBUTE_TEMPORARY 0x0100 -#define FILE_ATTRIBUTE_SPARSE_FILE 0x0200 -#define FILE_ATTRIBUTE_REPARSE_POINT 0x0400 -#define FILE_ATTRIBUTE_COMPRESSED 0x0800 -#define FILE_ATTRIBUTE_OFFLINE 0x1000 -#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x2000 -#define FILE_ATTRIBUTE_ENCRYPTED 0x4000 - -#define FILE_ATTRIBUTE_UNIX_EXTENSION 0x8000 /* trick for Unix */ - -#endif - - -#ifndef RINOK -#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; } -#endif - -#ifndef RINOK_WRes -#define RINOK_WRes(x) { WRes __result__ = (x); if (__result__ != 0) return __result__; } -#endif - -typedef unsigned char Byte; -typedef short Int16; -typedef unsigned short UInt16; - -#ifdef _LZMA_UINT32_IS_ULONG -typedef long Int32; -typedef unsigned long UInt32; -#else -typedef int Int32; -typedef unsigned int UInt32; -#endif - - -#ifndef _WIN32 - -typedef int INT; -typedef Int32 INT32; -typedef unsigned int UINT; -typedef UInt32 UINT32; -typedef INT32 LONG; // LONG, ULONG and DWORD must be 32-bit for _WIN32 compatibility -typedef UINT32 ULONG; - -#undef DWORD -typedef UINT32 DWORD; - -#define VOID void - -#define HRESULT LONG - -typedef void *LPVOID; -// typedef void VOID; -// typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR; -// gcc / clang on Unix : sizeof(long==sizeof(void*) in 32 or 64 bits) -typedef long INT_PTR; -typedef unsigned long UINT_PTR; -typedef long LONG_PTR; -typedef unsigned long DWORD_PTR; - -typedef size_t SIZE_T; - -#endif // _WIN32 - - - -#ifdef _SZ_NO_INT_64 - -/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers. - NOTES: Some code will work incorrectly in that case! */ - -typedef long Int64; -typedef unsigned long UInt64; - -#else - -#if defined(_MSC_VER) || defined(__BORLANDC__) -typedef __int64 Int64; -typedef unsigned __int64 UInt64; -#define UINT64_CONST(n) n -#else -typedef long long int Int64; -typedef unsigned long long int UInt64; -#define UINT64_CONST(n) n ## ULL -#endif - -#endif - -#ifdef _LZMA_NO_SYSTEM_SIZE_T -typedef UInt32 SizeT; -#else -typedef size_t SizeT; -#endif - -typedef int BoolInt; -/* typedef BoolInt Bool; */ -#define True 1 -#define False 0 - - -#ifdef _WIN32 -#define MY_STD_CALL __stdcall -#else -#define MY_STD_CALL -#endif - -#ifdef _MSC_VER - -#if _MSC_VER >= 1300 -#define MY_NO_INLINE __declspec(noinline) -#else -#define MY_NO_INLINE -#endif - -#define MY_FORCE_INLINE __forceinline - -#define MY_CDECL __cdecl -#define MY_FAST_CALL __fastcall - -#else // _MSC_VER - -#if (defined(__GNUC__) && (__GNUC__ >= 4)) \ - || (defined(__clang__) && (__clang_major__ >= 4)) \ - || defined(__INTEL_COMPILER) \ - || defined(__xlC__) -#define MY_NO_INLINE __attribute__((noinline)) -// #define MY_FORCE_INLINE __attribute__((always_inline)) inline -#else -#define MY_NO_INLINE -#endif - -#define MY_FORCE_INLINE - - -#define MY_CDECL - -#if defined(_M_IX86) \ - || defined(__i386__) -// #define MY_FAST_CALL __attribute__((fastcall)) -// #define MY_FAST_CALL __attribute__((cdecl)) -#define MY_FAST_CALL -#elif defined(MY_CPU_AMD64) -// #define MY_FAST_CALL __attribute__((ms_abi)) -#define MY_FAST_CALL -#else -#define MY_FAST_CALL -#endif - -#endif // _MSC_VER - - -/* The following interfaces use first parameter as pointer to structure */ - -typedef struct IByteIn IByteIn; -struct IByteIn -{ - Byte (*Read)(const IByteIn *p); /* reads one byte, returns 0 in case of EOF or error */ -}; -#define IByteIn_Read(p) (p)->Read(p) - - -typedef struct IByteOut IByteOut; -struct IByteOut -{ - void (*Write)(const IByteOut *p, Byte b); -}; -#define IByteOut_Write(p, b) (p)->Write(p, b) - - -typedef struct ISeqInStream ISeqInStream; -struct ISeqInStream -{ - SRes (*Read)(const ISeqInStream *p, void *buf, size_t *size); - /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. - (output(*size) < input(*size)) is allowed */ -}; -#define ISeqInStream_Read(p, buf, size) (p)->Read(p, buf, size) - -/* it can return SZ_ERROR_INPUT_EOF */ -SRes SeqInStream_Read(const ISeqInStream *stream, void *buf, size_t size); -SRes SeqInStream_Read2(const ISeqInStream *stream, void *buf, size_t size, SRes errorType); -SRes SeqInStream_ReadByte(const ISeqInStream *stream, Byte *buf); - - -typedef struct ISeqOutStream ISeqOutStream; -struct ISeqOutStream -{ - size_t (*Write)(const ISeqOutStream *p, const void *buf, size_t size); - /* Returns: result - the number of actually written bytes. - (result < size) means error */ -}; -#define ISeqOutStream_Write(p, buf, size) (p)->Write(p, buf, size) - -typedef enum -{ - SZ_SEEK_SET = 0, - SZ_SEEK_CUR = 1, - SZ_SEEK_END = 2 -} ESzSeek; - - -typedef struct ISeekInStream ISeekInStream; -struct ISeekInStream -{ - SRes (*Read)(const ISeekInStream *p, void *buf, size_t *size); /* same as ISeqInStream::Read */ - SRes (*Seek)(const ISeekInStream *p, Int64 *pos, ESzSeek origin); -}; -#define ISeekInStream_Read(p, buf, size) (p)->Read(p, buf, size) -#define ISeekInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin) - - -typedef struct ILookInStream ILookInStream; -struct ILookInStream -{ - SRes (*Look)(const ILookInStream *p, const void **buf, size_t *size); - /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. - (output(*size) > input(*size)) is not allowed - (output(*size) < input(*size)) is allowed */ - SRes (*Skip)(const ILookInStream *p, size_t offset); - /* offset must be <= output(*size) of Look */ - - SRes (*Read)(const ILookInStream *p, void *buf, size_t *size); - /* reads directly (without buffer). It's same as ISeqInStream::Read */ - SRes (*Seek)(const ILookInStream *p, Int64 *pos, ESzSeek origin); -}; - -#define ILookInStream_Look(p, buf, size) (p)->Look(p, buf, size) -#define ILookInStream_Skip(p, offset) (p)->Skip(p, offset) -#define ILookInStream_Read(p, buf, size) (p)->Read(p, buf, size) -#define ILookInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin) - - -SRes LookInStream_LookRead(const ILookInStream *stream, void *buf, size_t *size); -SRes LookInStream_SeekTo(const ILookInStream *stream, UInt64 offset); - -/* reads via ILookInStream::Read */ -SRes LookInStream_Read2(const ILookInStream *stream, void *buf, size_t size, SRes errorType); -SRes LookInStream_Read(const ILookInStream *stream, void *buf, size_t size); - - - -typedef struct -{ - ILookInStream vt; - const ISeekInStream *realStream; - - size_t pos; - size_t size; /* it's data size */ - - /* the following variables must be set outside */ - Byte *buf; - size_t bufSize; -} CLookToRead2; - -void LookToRead2_CreateVTable(CLookToRead2 *p, int lookahead); - -#define LookToRead2_Init(p) { (p)->pos = (p)->size = 0; } - - -typedef struct -{ - ISeqInStream vt; - const ILookInStream *realStream; -} CSecToLook; - -void SecToLook_CreateVTable(CSecToLook *p); - - - -typedef struct -{ - ISeqInStream vt; - const ILookInStream *realStream; -} CSecToRead; - -void SecToRead_CreateVTable(CSecToRead *p); - - -typedef struct ICompressProgress ICompressProgress; - -struct ICompressProgress -{ - SRes (*Progress)(const ICompressProgress *p, UInt64 inSize, UInt64 outSize); - /* Returns: result. (result != SZ_OK) means break. - Value (UInt64)(Int64)-1 for size means unknown value. */ -}; -#define ICompressProgress_Progress(p, inSize, outSize) (p)->Progress(p, inSize, outSize) - - - -typedef struct ISzAlloc ISzAlloc; -typedef const ISzAlloc * ISzAllocPtr; - -struct ISzAlloc -{ - void *(*Alloc)(ISzAllocPtr p, size_t size); - void (*Free)(ISzAllocPtr p, void *address); /* address can be 0 */ -}; - -#define ISzAlloc_Alloc(p, size) (p)->Alloc(p, size) -#define ISzAlloc_Free(p, a) (p)->Free(p, a) - -/* deprecated */ -#define IAlloc_Alloc(p, size) ISzAlloc_Alloc(p, size) -#define IAlloc_Free(p, a) ISzAlloc_Free(p, a) - - - - - -#ifndef MY_offsetof - #ifdef offsetof - #define MY_offsetof(type, m) offsetof(type, m) - /* - #define MY_offsetof(type, m) FIELD_OFFSET(type, m) - */ - #else - #define MY_offsetof(type, m) ((size_t)&(((type *)0)->m)) - #endif -#endif - - - -#ifndef MY_container_of - -/* -#define MY_container_of(ptr, type, m) container_of(ptr, type, m) -#define MY_container_of(ptr, type, m) CONTAINING_RECORD(ptr, type, m) -#define MY_container_of(ptr, type, m) ((type *)((char *)(ptr) - offsetof(type, m))) -#define MY_container_of(ptr, type, m) (&((type *)0)->m == (ptr), ((type *)(((char *)(ptr)) - MY_offsetof(type, m)))) -*/ - -/* - GCC shows warning: "perhaps the 'offsetof' macro was used incorrectly" - GCC 3.4.4 : classes with constructor - GCC 4.8.1 : classes with non-public variable members" -*/ - -#define MY_container_of(ptr, type, m) ((type *)(void *)((char *)(void *)(1 ? (ptr) : &((type *)0)->m) - MY_offsetof(type, m))) - -#endif - -#define CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) ((type *)(void *)(ptr)) - -/* -#define CONTAINER_FROM_VTBL(ptr, type, m) CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) -*/ -#define CONTAINER_FROM_VTBL(ptr, type, m) MY_container_of(ptr, type, m) - -#define CONTAINER_FROM_VTBL_CLS(ptr, type, m) CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) -/* -#define CONTAINER_FROM_VTBL_CLS(ptr, type, m) CONTAINER_FROM_VTBL(ptr, type, m) -*/ - - -#define MY_memset_0_ARRAY(a) memset((a), 0, sizeof(a)) - -#ifdef _WIN32 - -#define CHAR_PATH_SEPARATOR '\\' -#define WCHAR_PATH_SEPARATOR L'\\' -#define STRING_PATH_SEPARATOR "\\" -#define WSTRING_PATH_SEPARATOR L"\\" - -#else - -#define CHAR_PATH_SEPARATOR '/' -#define WCHAR_PATH_SEPARATOR L'/' -#define STRING_PATH_SEPARATOR "/" -#define WSTRING_PATH_SEPARATOR L"/" - -#endif - -EXTERN_C_END - -#endif +/* 7zTypes.h -- Basic types +2022-04-01 : Igor Pavlov : Public domain */ + +#ifndef __7Z_TYPES_H +#define __7Z_TYPES_H + +#ifdef _WIN32 +/* #include */ +#else +#include +#endif + +#include + +#ifndef EXTERN_C_BEGIN +#ifdef __cplusplus +#define EXTERN_C_BEGIN extern "C" { +#define EXTERN_C_END } +#else +#define EXTERN_C_BEGIN +#define EXTERN_C_END +#endif +#endif + +EXTERN_C_BEGIN + +#define SZ_OK 0 + +#define SZ_ERROR_DATA 1 +#define SZ_ERROR_MEM 2 +#define SZ_ERROR_CRC 3 +#define SZ_ERROR_UNSUPPORTED 4 +#define SZ_ERROR_PARAM 5 +#define SZ_ERROR_INPUT_EOF 6 +#define SZ_ERROR_OUTPUT_EOF 7 +#define SZ_ERROR_READ 8 +#define SZ_ERROR_WRITE 9 +#define SZ_ERROR_PROGRESS 10 +#define SZ_ERROR_FAIL 11 +#define SZ_ERROR_THREAD 12 + +#define SZ_ERROR_ARCHIVE 16 +#define SZ_ERROR_NO_ARCHIVE 17 + +typedef int SRes; + + +#ifdef _MSC_VER + #if _MSC_VER > 1200 + #define MY_ALIGN(n) __declspec(align(n)) + #else + #define MY_ALIGN(n) + #endif +#else + #define MY_ALIGN(n) __attribute__ ((aligned(n))) +#endif + + +#ifdef _WIN32 + +/* typedef DWORD WRes; */ +typedef unsigned WRes; +#define MY_SRes_HRESULT_FROM_WRes(x) HRESULT_FROM_WIN32(x) + +// #define MY_HRES_ERROR__INTERNAL_ERROR MY_SRes_HRESULT_FROM_WRes(ERROR_INTERNAL_ERROR) + +#else // _WIN32 + +// #define ENV_HAVE_LSTAT +typedef int WRes; + +// (FACILITY_ERRNO = 0x800) is 7zip's FACILITY constant to represent (errno) errors in HRESULT +#define MY__FACILITY_ERRNO 0x800 +#define MY__FACILITY_WIN32 7 +#define MY__FACILITY__WRes MY__FACILITY_ERRNO + +#define MY_HRESULT_FROM_errno_CONST_ERROR(x) ((HRESULT)( \ + ( (HRESULT)(x) & 0x0000FFFF) \ + | (MY__FACILITY__WRes << 16) \ + | (HRESULT)0x80000000 )) + +#define MY_SRes_HRESULT_FROM_WRes(x) \ + ((HRESULT)(x) <= 0 ? ((HRESULT)(x)) : MY_HRESULT_FROM_errno_CONST_ERROR(x)) + +// we call macro HRESULT_FROM_WIN32 for system errors (WRes) that are (errno) +#define HRESULT_FROM_WIN32(x) MY_SRes_HRESULT_FROM_WRes(x) + +/* +#define ERROR_FILE_NOT_FOUND 2L +#define ERROR_ACCESS_DENIED 5L +#define ERROR_NO_MORE_FILES 18L +#define ERROR_LOCK_VIOLATION 33L +#define ERROR_FILE_EXISTS 80L +#define ERROR_DISK_FULL 112L +#define ERROR_NEGATIVE_SEEK 131L +#define ERROR_ALREADY_EXISTS 183L +#define ERROR_DIRECTORY 267L +#define ERROR_TOO_MANY_POSTS 298L + +#define ERROR_INTERNAL_ERROR 1359L +#define ERROR_INVALID_REPARSE_DATA 4392L +#define ERROR_REPARSE_TAG_INVALID 4393L +#define ERROR_REPARSE_TAG_MISMATCH 4394L +*/ + +// we use errno equivalents for some WIN32 errors: + +#define ERROR_INVALID_PARAMETER EINVAL +#define ERROR_INVALID_FUNCTION EINVAL +#define ERROR_ALREADY_EXISTS EEXIST +#define ERROR_FILE_EXISTS EEXIST +#define ERROR_PATH_NOT_FOUND ENOENT +#define ERROR_FILE_NOT_FOUND ENOENT +#define ERROR_DISK_FULL ENOSPC +// #define ERROR_INVALID_HANDLE EBADF + +// we use FACILITY_WIN32 for errors that has no errno equivalent +// Too many posts were made to a semaphore. +#define ERROR_TOO_MANY_POSTS ((HRESULT)0x8007012AL) +#define ERROR_INVALID_REPARSE_DATA ((HRESULT)0x80071128L) +#define ERROR_REPARSE_TAG_INVALID ((HRESULT)0x80071129L) + +// if (MY__FACILITY__WRes != FACILITY_WIN32), +// we use FACILITY_WIN32 for COM errors: +#define E_OUTOFMEMORY ((HRESULT)0x8007000EL) +#define E_INVALIDARG ((HRESULT)0x80070057L) +#define MY__E_ERROR_NEGATIVE_SEEK ((HRESULT)0x80070083L) + +/* +// we can use FACILITY_ERRNO for some COM errors, that have errno equivalents: +#define E_OUTOFMEMORY MY_HRESULT_FROM_errno_CONST_ERROR(ENOMEM) +#define E_INVALIDARG MY_HRESULT_FROM_errno_CONST_ERROR(EINVAL) +#define MY__E_ERROR_NEGATIVE_SEEK MY_HRESULT_FROM_errno_CONST_ERROR(EINVAL) +*/ + +#define TEXT(quote) quote + +#define FILE_ATTRIBUTE_READONLY 0x0001 +#define FILE_ATTRIBUTE_HIDDEN 0x0002 +#define FILE_ATTRIBUTE_SYSTEM 0x0004 +#define FILE_ATTRIBUTE_DIRECTORY 0x0010 +#define FILE_ATTRIBUTE_ARCHIVE 0x0020 +#define FILE_ATTRIBUTE_DEVICE 0x0040 +#define FILE_ATTRIBUTE_NORMAL 0x0080 +#define FILE_ATTRIBUTE_TEMPORARY 0x0100 +#define FILE_ATTRIBUTE_SPARSE_FILE 0x0200 +#define FILE_ATTRIBUTE_REPARSE_POINT 0x0400 +#define FILE_ATTRIBUTE_COMPRESSED 0x0800 +#define FILE_ATTRIBUTE_OFFLINE 0x1000 +#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x2000 +#define FILE_ATTRIBUTE_ENCRYPTED 0x4000 + +#define FILE_ATTRIBUTE_UNIX_EXTENSION 0x8000 /* trick for Unix */ + +#endif + + +#ifndef RINOK +#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; } +#endif + +#ifndef RINOK_WRes +#define RINOK_WRes(x) { WRes __result__ = (x); if (__result__ != 0) return __result__; } +#endif + +typedef unsigned char Byte; +typedef short Int16; +typedef unsigned short UInt16; + +#ifdef _LZMA_UINT32_IS_ULONG +typedef long Int32; +typedef unsigned long UInt32; +#else +typedef int Int32; +typedef unsigned int UInt32; +#endif + + +#ifndef _WIN32 + +typedef int INT; +typedef Int32 INT32; +typedef unsigned int UINT; +typedef UInt32 UINT32; +typedef INT32 LONG; // LONG, ULONG and DWORD must be 32-bit for _WIN32 compatibility +typedef UINT32 ULONG; + +#undef DWORD +typedef UINT32 DWORD; + +#define VOID void + +#define HRESULT LONG + +typedef void *LPVOID; +// typedef void VOID; +// typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR; +// gcc / clang on Unix : sizeof(long==sizeof(void*) in 32 or 64 bits) +typedef long INT_PTR; +typedef unsigned long UINT_PTR; +typedef long LONG_PTR; +typedef unsigned long DWORD_PTR; + +typedef size_t SIZE_T; + +#endif // _WIN32 + + +#define MY_HRES_ERROR__INTERNAL_ERROR ((HRESULT)0x8007054FL) + + +#ifdef _SZ_NO_INT_64 + +/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers. + NOTES: Some code will work incorrectly in that case! */ + +typedef long Int64; +typedef unsigned long UInt64; + +#else + +#if defined(_MSC_VER) || defined(__BORLANDC__) +typedef __int64 Int64; +typedef unsigned __int64 UInt64; +#define UINT64_CONST(n) n +#else +typedef long long int Int64; +typedef unsigned long long int UInt64; +#define UINT64_CONST(n) n ## ULL +#endif + +#endif + +#ifdef _LZMA_NO_SYSTEM_SIZE_T +typedef UInt32 SizeT; +#else +typedef size_t SizeT; +#endif + +typedef int BoolInt; +/* typedef BoolInt Bool; */ +#define True 1 +#define False 0 + + +#ifdef _WIN32 +#define MY_STD_CALL __stdcall +#else +#define MY_STD_CALL +#endif + +#ifdef _MSC_VER + +#if _MSC_VER >= 1300 +#define MY_NO_INLINE __declspec(noinline) +#else +#define MY_NO_INLINE +#endif + +#define MY_FORCE_INLINE __forceinline + +#define MY_CDECL __cdecl +#define MY_FAST_CALL __fastcall + +#else // _MSC_VER + +#if (defined(__GNUC__) && (__GNUC__ >= 4)) \ + || (defined(__clang__) && (__clang_major__ >= 4)) \ + || defined(__INTEL_COMPILER) \ + || defined(__xlC__) +#define MY_NO_INLINE __attribute__((noinline)) +// #define MY_FORCE_INLINE __attribute__((always_inline)) inline +#else +#define MY_NO_INLINE +#endif + +#define MY_FORCE_INLINE + + +#define MY_CDECL + +#if defined(_M_IX86) \ + || defined(__i386__) +// #define MY_FAST_CALL __attribute__((fastcall)) +// #define MY_FAST_CALL __attribute__((cdecl)) +#define MY_FAST_CALL +#elif defined(MY_CPU_AMD64) +// #define MY_FAST_CALL __attribute__((ms_abi)) +#define MY_FAST_CALL +#else +#define MY_FAST_CALL +#endif + +#endif // _MSC_VER + + +/* The following interfaces use first parameter as pointer to structure */ + +typedef struct IByteIn IByteIn; +struct IByteIn +{ + Byte (*Read)(const IByteIn *p); /* reads one byte, returns 0 in case of EOF or error */ +}; +#define IByteIn_Read(p) (p)->Read(p) + + +typedef struct IByteOut IByteOut; +struct IByteOut +{ + void (*Write)(const IByteOut *p, Byte b); +}; +#define IByteOut_Write(p, b) (p)->Write(p, b) + + +typedef struct ISeqInStream ISeqInStream; +struct ISeqInStream +{ + SRes (*Read)(const ISeqInStream *p, void *buf, size_t *size); + /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. + (output(*size) < input(*size)) is allowed */ +}; +#define ISeqInStream_Read(p, buf, size) (p)->Read(p, buf, size) + +/* it can return SZ_ERROR_INPUT_EOF */ +SRes SeqInStream_Read(const ISeqInStream *stream, void *buf, size_t size); +SRes SeqInStream_Read2(const ISeqInStream *stream, void *buf, size_t size, SRes errorType); +SRes SeqInStream_ReadByte(const ISeqInStream *stream, Byte *buf); + + +typedef struct ISeqOutStream ISeqOutStream; +struct ISeqOutStream +{ + size_t (*Write)(const ISeqOutStream *p, const void *buf, size_t size); + /* Returns: result - the number of actually written bytes. + (result < size) means error */ +}; +#define ISeqOutStream_Write(p, buf, size) (p)->Write(p, buf, size) + +typedef enum +{ + SZ_SEEK_SET = 0, + SZ_SEEK_CUR = 1, + SZ_SEEK_END = 2 +} ESzSeek; + + +typedef struct ISeekInStream ISeekInStream; +struct ISeekInStream +{ + SRes (*Read)(const ISeekInStream *p, void *buf, size_t *size); /* same as ISeqInStream::Read */ + SRes (*Seek)(const ISeekInStream *p, Int64 *pos, ESzSeek origin); +}; +#define ISeekInStream_Read(p, buf, size) (p)->Read(p, buf, size) +#define ISeekInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin) + + +typedef struct ILookInStream ILookInStream; +struct ILookInStream +{ + SRes (*Look)(const ILookInStream *p, const void **buf, size_t *size); + /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream. + (output(*size) > input(*size)) is not allowed + (output(*size) < input(*size)) is allowed */ + SRes (*Skip)(const ILookInStream *p, size_t offset); + /* offset must be <= output(*size) of Look */ + + SRes (*Read)(const ILookInStream *p, void *buf, size_t *size); + /* reads directly (without buffer). It's same as ISeqInStream::Read */ + SRes (*Seek)(const ILookInStream *p, Int64 *pos, ESzSeek origin); +}; + +#define ILookInStream_Look(p, buf, size) (p)->Look(p, buf, size) +#define ILookInStream_Skip(p, offset) (p)->Skip(p, offset) +#define ILookInStream_Read(p, buf, size) (p)->Read(p, buf, size) +#define ILookInStream_Seek(p, pos, origin) (p)->Seek(p, pos, origin) + + +SRes LookInStream_LookRead(const ILookInStream *stream, void *buf, size_t *size); +SRes LookInStream_SeekTo(const ILookInStream *stream, UInt64 offset); + +/* reads via ILookInStream::Read */ +SRes LookInStream_Read2(const ILookInStream *stream, void *buf, size_t size, SRes errorType); +SRes LookInStream_Read(const ILookInStream *stream, void *buf, size_t size); + + + +typedef struct +{ + ILookInStream vt; + const ISeekInStream *realStream; + + size_t pos; + size_t size; /* it's data size */ + + /* the following variables must be set outside */ + Byte *buf; + size_t bufSize; +} CLookToRead2; + +void LookToRead2_CreateVTable(CLookToRead2 *p, int lookahead); + +#define LookToRead2_Init(p) { (p)->pos = (p)->size = 0; } + + +typedef struct +{ + ISeqInStream vt; + const ILookInStream *realStream; +} CSecToLook; + +void SecToLook_CreateVTable(CSecToLook *p); + + + +typedef struct +{ + ISeqInStream vt; + const ILookInStream *realStream; +} CSecToRead; + +void SecToRead_CreateVTable(CSecToRead *p); + + +typedef struct ICompressProgress ICompressProgress; + +struct ICompressProgress +{ + SRes (*Progress)(const ICompressProgress *p, UInt64 inSize, UInt64 outSize); + /* Returns: result. (result != SZ_OK) means break. + Value (UInt64)(Int64)-1 for size means unknown value. */ +}; +#define ICompressProgress_Progress(p, inSize, outSize) (p)->Progress(p, inSize, outSize) + + + +typedef struct ISzAlloc ISzAlloc; +typedef const ISzAlloc * ISzAllocPtr; + +struct ISzAlloc +{ + void *(*Alloc)(ISzAllocPtr p, size_t size); + void (*Free)(ISzAllocPtr p, void *address); /* address can be 0 */ +}; + +#define ISzAlloc_Alloc(p, size) (p)->Alloc(p, size) +#define ISzAlloc_Free(p, a) (p)->Free(p, a) + +/* deprecated */ +#define IAlloc_Alloc(p, size) ISzAlloc_Alloc(p, size) +#define IAlloc_Free(p, a) ISzAlloc_Free(p, a) + + + + + +#ifndef MY_offsetof + #ifdef offsetof + #define MY_offsetof(type, m) offsetof(type, m) + /* + #define MY_offsetof(type, m) FIELD_OFFSET(type, m) + */ + #else + #define MY_offsetof(type, m) ((size_t)&(((type *)0)->m)) + #endif +#endif + + + +#ifndef MY_container_of + +/* +#define MY_container_of(ptr, type, m) container_of(ptr, type, m) +#define MY_container_of(ptr, type, m) CONTAINING_RECORD(ptr, type, m) +#define MY_container_of(ptr, type, m) ((type *)((char *)(ptr) - offsetof(type, m))) +#define MY_container_of(ptr, type, m) (&((type *)0)->m == (ptr), ((type *)(((char *)(ptr)) - MY_offsetof(type, m)))) +*/ + +/* + GCC shows warning: "perhaps the 'offsetof' macro was used incorrectly" + GCC 3.4.4 : classes with constructor + GCC 4.8.1 : classes with non-public variable members" +*/ + +#define MY_container_of(ptr, type, m) ((type *)(void *)((char *)(void *)(1 ? (ptr) : &((type *)0)->m) - MY_offsetof(type, m))) + +#endif + +#define CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) ((type *)(void *)(ptr)) + +/* +#define CONTAINER_FROM_VTBL(ptr, type, m) CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) +*/ +#define CONTAINER_FROM_VTBL(ptr, type, m) MY_container_of(ptr, type, m) + +#define CONTAINER_FROM_VTBL_CLS(ptr, type, m) CONTAINER_FROM_VTBL_SIMPLE(ptr, type, m) +/* +#define CONTAINER_FROM_VTBL_CLS(ptr, type, m) CONTAINER_FROM_VTBL(ptr, type, m) +*/ + + +#define MY_memset_0_ARRAY(a) memset((a), 0, sizeof(a)) + +#ifdef _WIN32 + +#define CHAR_PATH_SEPARATOR '\\' +#define WCHAR_PATH_SEPARATOR L'\\' +#define STRING_PATH_SEPARATOR "\\" +#define WSTRING_PATH_SEPARATOR L"\\" + +#else + +#define CHAR_PATH_SEPARATOR '/' +#define WCHAR_PATH_SEPARATOR L'/' +#define STRING_PATH_SEPARATOR "/" +#define WSTRING_PATH_SEPARATOR L"/" + +#endif + +#define k_PropVar_TimePrec_0 0 +#define k_PropVar_TimePrec_Unix 1 +#define k_PropVar_TimePrec_DOS 2 +#define k_PropVar_TimePrec_HighPrec 3 +#define k_PropVar_TimePrec_Base 16 +#define k_PropVar_TimePrec_100ns (k_PropVar_TimePrec_Base + 7) +#define k_PropVar_TimePrec_1ns (k_PropVar_TimePrec_Base + 9) + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/7zVersion.h b/deps/LZMA-SDK/C/7zVersion.h index 0fe636abc..49ea81dd3 100644 --- a/deps/LZMA-SDK/C/7zVersion.h +++ b/deps/LZMA-SDK/C/7zVersion.h @@ -1,27 +1,27 @@ -#define MY_VER_MAJOR 21 -#define MY_VER_MINOR 02 -#define MY_VER_BUILD 0 -#define MY_VERSION_NUMBERS "21.02 alpha" -#define MY_VERSION MY_VERSION_NUMBERS - -#ifdef MY_CPU_NAME - #define MY_VERSION_CPU MY_VERSION " (" MY_CPU_NAME ")" -#else - #define MY_VERSION_CPU MY_VERSION -#endif - -#define MY_DATE "2021-05-06" -#undef MY_COPYRIGHT -#undef MY_VERSION_COPYRIGHT_DATE -#define MY_AUTHOR_NAME "Igor Pavlov" -#define MY_COPYRIGHT_PD "Igor Pavlov : Public domain" -#define MY_COPYRIGHT_CR "Copyright (c) 1999-2021 Igor Pavlov" - -#ifdef USE_COPYRIGHT_CR - #define MY_COPYRIGHT MY_COPYRIGHT_CR -#else - #define MY_COPYRIGHT MY_COPYRIGHT_PD -#endif - -#define MY_COPYRIGHT_DATE MY_COPYRIGHT " : " MY_DATE -#define MY_VERSION_COPYRIGHT_DATE MY_VERSION_CPU " : " MY_COPYRIGHT " : " MY_DATE +#define MY_VER_MAJOR 22 +#define MY_VER_MINOR 01 +#define MY_VER_BUILD 0 +#define MY_VERSION_NUMBERS "22.01" +#define MY_VERSION MY_VERSION_NUMBERS + +#ifdef MY_CPU_NAME + #define MY_VERSION_CPU MY_VERSION " (" MY_CPU_NAME ")" +#else + #define MY_VERSION_CPU MY_VERSION +#endif + +#define MY_DATE "2022-07-15" +#undef MY_COPYRIGHT +#undef MY_VERSION_COPYRIGHT_DATE +#define MY_AUTHOR_NAME "Igor Pavlov" +#define MY_COPYRIGHT_PD "Igor Pavlov : Public domain" +#define MY_COPYRIGHT_CR "Copyright (c) 1999-2022 Igor Pavlov" + +#ifdef USE_COPYRIGHT_CR + #define MY_COPYRIGHT MY_COPYRIGHT_CR +#else + #define MY_COPYRIGHT MY_COPYRIGHT_PD +#endif + +#define MY_COPYRIGHT_DATE MY_COPYRIGHT " : " MY_DATE +#define MY_VERSION_COPYRIGHT_DATE MY_VERSION_CPU " : " MY_COPYRIGHT " : " MY_DATE diff --git a/deps/LZMA-SDK/C/7zVersion.rc b/deps/LZMA-SDK/C/7zVersion.rc index 6ed26de74..e520995dd 100644 --- a/deps/LZMA-SDK/C/7zVersion.rc +++ b/deps/LZMA-SDK/C/7zVersion.rc @@ -1,55 +1,55 @@ -#define MY_VS_FFI_FILEFLAGSMASK 0x0000003FL -#define MY_VOS_NT_WINDOWS32 0x00040004L -#define MY_VOS_CE_WINDOWS32 0x00050004L - -#define MY_VFT_APP 0x00000001L -#define MY_VFT_DLL 0x00000002L - -// #include - -#ifndef MY_VERSION -#include "7zVersion.h" -#endif - -#define MY_VER MY_VER_MAJOR,MY_VER_MINOR,MY_VER_BUILD,0 - -#ifdef DEBUG -#define DBG_FL VS_FF_DEBUG -#else -#define DBG_FL 0 -#endif - -#define MY_VERSION_INFO(fileType, descr, intName, origName) \ -LANGUAGE 9, 1 \ -1 VERSIONINFO \ - FILEVERSION MY_VER \ - PRODUCTVERSION MY_VER \ - FILEFLAGSMASK MY_VS_FFI_FILEFLAGSMASK \ - FILEFLAGS DBG_FL \ - FILEOS MY_VOS_NT_WINDOWS32 \ - FILETYPE fileType \ - FILESUBTYPE 0x0L \ -BEGIN \ - BLOCK "StringFileInfo" \ - BEGIN \ - BLOCK "040904b0" \ - BEGIN \ - VALUE "CompanyName", "Igor Pavlov" \ - VALUE "FileDescription", descr \ - VALUE "FileVersion", MY_VERSION \ - VALUE "InternalName", intName \ - VALUE "LegalCopyright", MY_COPYRIGHT \ - VALUE "OriginalFilename", origName \ - VALUE "ProductName", "7-Zip" \ - VALUE "ProductVersion", MY_VERSION \ - END \ - END \ - BLOCK "VarFileInfo" \ - BEGIN \ - VALUE "Translation", 0x409, 1200 \ - END \ -END - -#define MY_VERSION_INFO_APP(descr, intName) MY_VERSION_INFO(MY_VFT_APP, descr, intName, intName ".exe") - -#define MY_VERSION_INFO_DLL(descr, intName) MY_VERSION_INFO(MY_VFT_DLL, descr, intName, intName ".dll") +#define MY_VS_FFI_FILEFLAGSMASK 0x0000003FL +#define MY_VOS_NT_WINDOWS32 0x00040004L +#define MY_VOS_CE_WINDOWS32 0x00050004L + +#define MY_VFT_APP 0x00000001L +#define MY_VFT_DLL 0x00000002L + +// #include + +#ifndef MY_VERSION +#include "7zVersion.h" +#endif + +#define MY_VER MY_VER_MAJOR,MY_VER_MINOR,MY_VER_BUILD,0 + +#ifdef DEBUG +#define DBG_FL VS_FF_DEBUG +#else +#define DBG_FL 0 +#endif + +#define MY_VERSION_INFO(fileType, descr, intName, origName) \ +LANGUAGE 9, 1 \ +1 VERSIONINFO \ + FILEVERSION MY_VER \ + PRODUCTVERSION MY_VER \ + FILEFLAGSMASK MY_VS_FFI_FILEFLAGSMASK \ + FILEFLAGS DBG_FL \ + FILEOS MY_VOS_NT_WINDOWS32 \ + FILETYPE fileType \ + FILESUBTYPE 0x0L \ +BEGIN \ + BLOCK "StringFileInfo" \ + BEGIN \ + BLOCK "040904b0" \ + BEGIN \ + VALUE "CompanyName", "Igor Pavlov" \ + VALUE "FileDescription", descr \ + VALUE "FileVersion", MY_VERSION \ + VALUE "InternalName", intName \ + VALUE "LegalCopyright", MY_COPYRIGHT \ + VALUE "OriginalFilename", origName \ + VALUE "ProductName", "7-Zip" \ + VALUE "ProductVersion", MY_VERSION \ + END \ + END \ + BLOCK "VarFileInfo" \ + BEGIN \ + VALUE "Translation", 0x409, 1200 \ + END \ +END + +#define MY_VERSION_INFO_APP(descr, intName) MY_VERSION_INFO(MY_VFT_APP, descr, intName, intName ".exe") + +#define MY_VERSION_INFO_DLL(descr, intName) MY_VERSION_INFO(MY_VFT_DLL, descr, intName, intName ".dll") diff --git a/deps/LZMA-SDK/C/7zip_gcc_c.mak b/deps/LZMA-SDK/C/7zip_gcc_c.mak index 00ecfb043..24505f377 100644 --- a/deps/LZMA-SDK/C/7zip_gcc_c.mak +++ b/deps/LZMA-SDK/C/7zip_gcc_c.mak @@ -1,301 +1,343 @@ - -MY_ARCH_2 = $(MY_ARCH) - -MY_ASM = jwasm -MY_ASM = asmc - -PROGPATH = $(O)/$(PROG) - - -# for object file -CFLAGS_BASE_LIST = -c -# for ASM file -# CFLAGS_BASE_LIST = -S -CFLAGS_BASE = $(MY_ARCH_2) -O2 $(CFLAGS_BASE_LIST) -Wall -Werror -Wextra $(CFLAGS_WARN) \ - -DNDEBUG -D_REENTRANT -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE - - -LDFLAGS_STATIC = -DNDEBUG -# -static - -ifdef SystemDrive -IS_MINGW = 1 -endif - -ifdef DEF_FILE - - -ifdef IS_MINGW -SHARED_EXT=.dll -LDFLAGS = -shared -DEF $(DEF_FILE) $(LDFLAGS_STATIC) -else -SHARED_EXT=.so -LDFLAGS = -shared -fPIC $(LDFLAGS_STATIC) -CC_SHARED=-fPIC -endif - - -else - -LDFLAGS = $(LDFLAGS_STATIC) -# -s is not required for clang, do we need it for GGC ??? -# -s - -#-static -static-libgcc -static-libstdc++ - -ifdef IS_MINGW -SHARED_EXT=.exe -else -SHARED_EXT= -endif - -endif - - -PROGPATH = $(O)/$(PROG)$(SHARED_EXT) - - -ifndef O -O=_o -endif - -ifdef IS_MINGW - -RM = del -MY_MKDIR=mkdir -LIB2 = -loleaut32 -luuid -ladvapi32 -lUser32 - - -CXXFLAGS_EXTRA = -DUNICODE -D_UNICODE -# -Wno-delete-non-virtual-dtor - -DEL_OBJ_EXE = -$(RM) $(O)\*.o $(O)\$(PROG).exe $(O)\$(PROG).dll - -else - -RM = rm -f -MY_MKDIR=mkdir -p -# CFLAGS_BASE := $(CFLAGS_BASE) -D_7ZIP_ST -# CXXFLAGS_EXTRA = -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE - -# LOCAL_LIBS=-lpthread -# LOCAL_LIBS_DLL=$(LOCAL_LIBS) -ldl -LIB2 = -lpthread -ldl - -DEL_OBJ_EXE = -$(RM) $(PROGPATH) $(OBJS) - -endif - - - -CFLAGS = $(LOCAL_FLAGS) $(CFLAGS_BASE2) $(CFLAGS_BASE) $(CC_SHARED) -o $@ - - -ifdef IS_X64 -AFLAGS_ABI = -elf64 -DABI_LINUX -else -AFLAGS_ABI = -elf -DABI_LINUX -DABI_CDECL -# -DABI_CDECL -# -DABI_LINUX -# -DABI_CDECL -endif -AFLAGS = $(AFLAGS_ABI) -Fo$(O)/ - - -CXX_WARN_FLAGS = -#-Wno-invalid-offsetof -#-Wno-reorder - -CXXFLAGS = $(LOCAL_FLAGS) $(CXXFLAGS_BASE2) $(CFLAGS_BASE) $(CXXFLAGS_EXTRA) $(CC_SHARED) -o $@ $(CXX_WARN_FLAGS) - -all: $(O) $(PROGPATH) - -$(O): - $(MY_MKDIR) $(O) - -$(PROGPATH): $(OBJS) - $(CXX) -s -o $(PROGPATH) $(MY_ARCH_2) $(LDFLAGS) $(OBJS) $(MY_LIBS) $(LIB2) - - - -ifndef NO_DEFAULT_RES -$O/resource.o: resource.rc - windres.exe $(RFLAGS) resource.rc $O/resource.o -endif - - - -$O/7zAlloc.o: ../../../C/7zAlloc.c - $(CC) $(CFLAGS) $< -$O/7zArcIn.o: ../../../C/7zArcIn.c - $(CC) $(CFLAGS) $< -$O/7zBuf.o: ../../../C/7zBuf.c - $(CC) $(CFLAGS) $< -$O/7zBuf2.o: ../../../C/7zBuf2.c - $(CC) $(CFLAGS) $< -$O/7zCrc.o: ../../../C/7zCrc.c - $(CC) $(CFLAGS) $< -$O/7zDec.o: ../../../C/7zDec.c - $(CC) $(CFLAGS) $< -$O/7zFile.o: ../../../C/7zFile.c - $(CC) $(CFLAGS) $< -$O/7zStream.o: ../../../C/7zStream.c - $(CC) $(CFLAGS) $< -$O/Aes.o: ../../../C/Aes.c - $(CC) $(CFLAGS) $< -$O/Alloc.o: ../../../C/Alloc.c - $(CC) $(CFLAGS) $< -$O/Bcj2.o: ../../../C/Bcj2.c - $(CC) $(CFLAGS) $< -$O/Bcj2Enc.o: ../../../C/Bcj2Enc.c - $(CC) $(CFLAGS) $< -$O/Blake2s.o: ../../../C/Blake2s.c - $(CC) $(CFLAGS) $< -$O/Bra.o: ../../../C/Bra.c - $(CC) $(CFLAGS) $< -$O/Bra86.o: ../../../C/Bra86.c - $(CC) $(CFLAGS) $< -$O/BraIA64.o: ../../../C/BraIA64.c - $(CC) $(CFLAGS) $< -$O/BwtSort.o: ../../../C/BwtSort.c - $(CC) $(CFLAGS) $< - -$O/CpuArch.o: ../../../C/CpuArch.c - $(CC) $(CFLAGS) $< -$O/Delta.o: ../../../C/Delta.c - $(CC) $(CFLAGS) $< -$O/DllSecur.o: ../../../C/DllSecur.c - $(CC) $(CFLAGS) $< -$O/HuffEnc.o: ../../../C/HuffEnc.c - $(CC) $(CFLAGS) $< -$O/LzFind.o: ../../../C/LzFind.c - $(CC) $(CFLAGS) $< - -# ifdef MT_FILES -$O/LzFindMt.o: ../../../C/LzFindMt.c - $(CC) $(CFLAGS) $< - -$O/Threads.o: ../../../C/Threads.c - $(CC) $(CFLAGS) $< -# endif - -$O/LzmaEnc.o: ../../../C/LzmaEnc.c - $(CC) $(CFLAGS) $< -$O/Lzma86Dec.o: ../../../C/Lzma86Dec.c - $(CC) $(CFLAGS) $< -$O/Lzma86Enc.o: ../../../C/Lzma86Enc.c - $(CC) $(CFLAGS) $< -$O/Lzma2Dec.o: ../../../C/Lzma2Dec.c - $(CC) $(CFLAGS) $< -$O/Lzma2DecMt.o: ../../../C/Lzma2DecMt.c - $(CC) $(CFLAGS) $< -$O/Lzma2Enc.o: ../../../C/Lzma2Enc.c - $(CC) $(CFLAGS) $< -$O/LzmaLib.o: ../../../C/LzmaLib.c - $(CC) $(CFLAGS) $< -$O/MtCoder.o: ../../../C/MtCoder.c - $(CC) $(CFLAGS) $< -$O/MtDec.o: ../../../C/MtDec.c - $(CC) $(CFLAGS) $< -$O/Ppmd7.o: ../../../C/Ppmd7.c - $(CC) $(CFLAGS) $< -$O/Ppmd7aDec.o: ../../../C/Ppmd7aDec.c - $(CC) $(CFLAGS) $< -$O/Ppmd7Dec.o: ../../../C/Ppmd7Dec.c - $(CC) $(CFLAGS) $< -$O/Ppmd7Enc.o: ../../../C/Ppmd7Enc.c - $(CC) $(CFLAGS) $< -$O/Ppmd8.o: ../../../C/Ppmd8.c - $(CC) $(CFLAGS) $< -$O/Ppmd8Dec.o: ../../../C/Ppmd8Dec.c - $(CC) $(CFLAGS) $< -$O/Ppmd8Enc.o: ../../../C/Ppmd8Enc.c - $(CC) $(CFLAGS) $< -$O/Sha1.o: ../../../C/Sha1.c - $(CC) $(CFLAGS) $< -$O/Sha256.o: ../../../C/Sha256.c - $(CC) $(CFLAGS) $< -$O/Sort.o: ../../../C/Sort.c - $(CC) $(CFLAGS) $< -$O/Xz.o: ../../../C/Xz.c - $(CC) $(CFLAGS) $< -$O/XzCrc64.o: ../../../C/XzCrc64.c - $(CC) $(CFLAGS) $< - - -ifdef USE_ASM -ifdef IS_X64 -USE_X86_ASM=1 -else -ifdef IS_X86 -USE_X86_ASM=1 -endif -endif -endif - -ifdef USE_X86_ASM -$O/7zCrcOpt.o: ../../../Asm/x86/7zCrcOpt.asm - $(MY_ASM) $(AFLAGS) $< -$O/XzCrc64Opt.o: ../../../Asm/x86/XzCrc64Opt.asm - $(MY_ASM) $(AFLAGS) $< -$O/AesOpt.o: ../../../Asm/x86/AesOpt.asm - $(MY_ASM) $(AFLAGS) $< -$O/Sha1Opt.o: ../../../Asm/x86/Sha1Opt.asm - $(MY_ASM) $(AFLAGS) $< -$O/Sha256Opt.o: ../../../Asm/x86/Sha256Opt.asm - $(MY_ASM) $(AFLAGS) $< -else -$O/7zCrcOpt.o: ../../7zCrcOpt.c - $(CC) $(CFLAGS) $< -$O/XzCrc64Opt.o: ../../XzCrc64Opt.c - $(CC) $(CFLAGS) $< -$O/Sha1Opt.o: ../../Sha1Opt.c - $(CC) $(CFLAGS) $< -$O/Sha256Opt.o: ../../Sha256Opt.c - $(CC) $(CFLAGS) $< -$O/AesOpt.o: ../../AesOpt.c - $(CC) $(CFLAGS) $< -endif - - -ifdef USE_LZMA_DEC_ASM - -ifdef IS_X64 -$O/LzmaDecOpt.o: ../../../Asm/x86/LzmaDecOpt.asm - $(MY_ASM) $(AFLAGS) $< -endif - -ifdef IS_ARM64 -$O/LzmaDecOpt.o: ../../../Asm/arm64/LzmaDecOpt.S ../../../Asm/arm64/7zAsm.S - $(CC) $(CFLAGS) $< -endif - -$O/LzmaDec.o: ../../LzmaDec.c - $(CC) $(CFLAGS) -D_LZMA_DEC_OPT $< - -else - -$O/LzmaDec.o: ../../LzmaDec.c - $(CC) $(CFLAGS) $< - -endif - - - -$O/XzDec.o: ../../../C/XzDec.c - $(CC) $(CFLAGS) $< -$O/XzEnc.o: ../../../C/XzEnc.c - $(CC) $(CFLAGS) $< -$O/XzIn.o: ../../../C/XzIn.c - $(CC) $(CFLAGS) $< - - -$O/7zMain.o: ../../../C/Util/7z/7zMain.c - $(CC) $(CFLAGS) $< -$O/LzmaUtil.o: ../../../C/Util/Lzma/LzmaUtil.c - $(CC) $(CFLAGS) $< - - - -clean: - -$(DEL_OBJ_EXE) + +MY_ARCH_2 = $(MY_ARCH) + +MY_ASM = jwasm +MY_ASM = asmc + +PROGPATH = $(O)/$(PROG) +PROGPATH_STATIC = $(O)/$(PROG)s + + +# for object file +CFLAGS_BASE_LIST = -c +# for ASM file +# CFLAGS_BASE_LIST = -S +CFLAGS_BASE = $(MY_ARCH_2) -O2 $(CFLAGS_BASE_LIST) -Wall -Werror -Wextra $(CFLAGS_WARN) \ + -DNDEBUG -D_REENTRANT -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE + + +ifdef SystemDrive +IS_MINGW = 1 +else +ifdef SYSTEMDRIVE +# ifdef OS +IS_MINGW = 1 +endif +endif + +ifdef IS_MINGW +LDFLAGS_STATIC_2 = -static +else +ifndef DEF_FILE +ifndef IS_NOT_STANDALONE +ifndef MY_DYNAMIC_LINK +ifneq ($(CC), clang) +LDFLAGS_STATIC_2 = +# -static +# -static-libstdc++ -static-libgcc +endif +endif +endif +endif +endif + +LDFLAGS_STATIC = -DNDEBUG $(LDFLAGS_STATIC_2) + +ifdef DEF_FILE + + +ifdef IS_MINGW +SHARED_EXT=.dll +LDFLAGS = -shared -DEF $(DEF_FILE) $(LDFLAGS_STATIC) +else +SHARED_EXT=.so +LDFLAGS = -shared -fPIC $(LDFLAGS_STATIC) +CC_SHARED=-fPIC +endif + + +else + +LDFLAGS = $(LDFLAGS_STATIC) +# -s is not required for clang, do we need it for GGC ??? +# -s + +#-static -static-libgcc -static-libstdc++ + +ifdef IS_MINGW +SHARED_EXT=.exe +else +SHARED_EXT= +endif + +endif + + +PROGPATH = $(O)/$(PROG)$(SHARED_EXT) +PROGPATH_STATIC = $(O)/$(PROG)s$(SHARED_EXT) + +ifndef O +O=_o +endif + +ifdef IS_MINGW + +ifdef MSYSTEM +RM = rm -f +MY_MKDIR=mkdir -p +DEL_OBJ_EXE = -$(RM) $(PROGPATH) $(PROGPATH_STATIC) $(OBJS) +else +RM = del +MY_MKDIR=mkdir +DEL_OBJ_EXE = -$(RM) $(O)\*.o $(O)\$(PROG).exe $(O)\$(PROG).dll +endif + + +LIB2 = -lOle32 -loleaut32 -luuid -ladvapi32 -lUser32 + +CXXFLAGS_EXTRA = -DUNICODE -D_UNICODE +# -Wno-delete-non-virtual-dtor + + +else + +RM = rm -f +MY_MKDIR=mkdir -p +# CFLAGS_BASE := $(CFLAGS_BASE) -D_7ZIP_ST +# CXXFLAGS_EXTRA = -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE + +# LOCAL_LIBS=-lpthread +# LOCAL_LIBS_DLL=$(LOCAL_LIBS) -ldl +LIB2 = -lpthread -ldl + +DEL_OBJ_EXE = -$(RM) $(PROGPATH) $(PROGPATH_STATIC) $(OBJS) + +endif + + + +CFLAGS = $(LOCAL_FLAGS) $(CFLAGS_BASE2) $(CFLAGS_BASE) $(CC_SHARED) -o $@ + + +ifdef IS_X64 +AFLAGS_ABI = -elf64 -DABI_LINUX +else +AFLAGS_ABI = -elf -DABI_LINUX -DABI_CDECL +# -DABI_CDECL +# -DABI_LINUX +# -DABI_CDECL +endif +AFLAGS = $(AFLAGS_ABI) -Fo$(O)/ + + +CXX_WARN_FLAGS = +#-Wno-invalid-offsetof +#-Wno-reorder + +CXXFLAGS = $(LOCAL_FLAGS) $(CXXFLAGS_BASE2) $(CFLAGS_BASE) $(CXXFLAGS_EXTRA) $(CC_SHARED) -o $@ $(CXX_WARN_FLAGS) + +STATIC_TARGET= +ifdef COMPL_STATIC +STATIC_TARGET=$(PROGPATH_STATIC) +endif + + +all: $(O) $(PROGPATH) $(STATIC_TARGET) + +$(O): + $(MY_MKDIR) $(O) + +LFLAGS_ALL = -s $(MY_ARCH_2) $(LDFLAGS) $(LD_arch) $(OBJS) $(MY_LIBS) $(LIB2) +$(PROGPATH): $(OBJS) + $(CXX) -o $(PROGPATH) $(LFLAGS_ALL) + +$(PROGPATH_STATIC): $(OBJS) + $(CXX) -static -o $(PROGPATH_STATIC) $(LFLAGS_ALL) + + +ifndef NO_DEFAULT_RES +$O/resource.o: resource.rc + windres.exe $(RFLAGS) resource.rc $O/resource.o +endif + + + +$O/7zAlloc.o: ../../../C/7zAlloc.c + $(CC) $(CFLAGS) $< +$O/7zArcIn.o: ../../../C/7zArcIn.c + $(CC) $(CFLAGS) $< +$O/7zBuf.o: ../../../C/7zBuf.c + $(CC) $(CFLAGS) $< +$O/7zBuf2.o: ../../../C/7zBuf2.c + $(CC) $(CFLAGS) $< +$O/7zCrc.o: ../../../C/7zCrc.c + $(CC) $(CFLAGS) $< +$O/7zDec.o: ../../../C/7zDec.c + $(CC) $(CFLAGS) $< +$O/7zFile.o: ../../../C/7zFile.c + $(CC) $(CFLAGS) $< +$O/7zStream.o: ../../../C/7zStream.c + $(CC) $(CFLAGS) $< +$O/Aes.o: ../../../C/Aes.c + $(CC) $(CFLAGS) $< +$O/Alloc.o: ../../../C/Alloc.c + $(CC) $(CFLAGS) $< +$O/Bcj2.o: ../../../C/Bcj2.c + $(CC) $(CFLAGS) $< +$O/Bcj2Enc.o: ../../../C/Bcj2Enc.c + $(CC) $(CFLAGS) $< +$O/Blake2s.o: ../../../C/Blake2s.c + $(CC) $(CFLAGS) $< +$O/Bra.o: ../../../C/Bra.c + $(CC) $(CFLAGS) $< +$O/Bra86.o: ../../../C/Bra86.c + $(CC) $(CFLAGS) $< +$O/BraIA64.o: ../../../C/BraIA64.c + $(CC) $(CFLAGS) $< +$O/BwtSort.o: ../../../C/BwtSort.c + $(CC) $(CFLAGS) $< + +$O/CpuArch.o: ../../../C/CpuArch.c + $(CC) $(CFLAGS) $< +$O/Delta.o: ../../../C/Delta.c + $(CC) $(CFLAGS) $< +$O/DllSecur.o: ../../../C/DllSecur.c + $(CC) $(CFLAGS) $< +$O/HuffEnc.o: ../../../C/HuffEnc.c + $(CC) $(CFLAGS) $< +$O/LzFind.o: ../../../C/LzFind.c + $(CC) $(CFLAGS) $< + +# ifdef MT_FILES +$O/LzFindMt.o: ../../../C/LzFindMt.c + $(CC) $(CFLAGS) $< +$O/LzFindOpt.o: ../../../C/LzFindOpt.c + $(CC) $(CFLAGS) $< + +$O/Threads.o: ../../../C/Threads.c + $(CC) $(CFLAGS) $< +# endif + +$O/LzmaEnc.o: ../../../C/LzmaEnc.c + $(CC) $(CFLAGS) $< +$O/Lzma86Dec.o: ../../../C/Lzma86Dec.c + $(CC) $(CFLAGS) $< +$O/Lzma86Enc.o: ../../../C/Lzma86Enc.c + $(CC) $(CFLAGS) $< +$O/Lzma2Dec.o: ../../../C/Lzma2Dec.c + $(CC) $(CFLAGS) $< +$O/Lzma2DecMt.o: ../../../C/Lzma2DecMt.c + $(CC) $(CFLAGS) $< +$O/Lzma2Enc.o: ../../../C/Lzma2Enc.c + $(CC) $(CFLAGS) $< +$O/LzmaLib.o: ../../../C/LzmaLib.c + $(CC) $(CFLAGS) $< +$O/MtCoder.o: ../../../C/MtCoder.c + $(CC) $(CFLAGS) $< +$O/MtDec.o: ../../../C/MtDec.c + $(CC) $(CFLAGS) $< +$O/Ppmd7.o: ../../../C/Ppmd7.c + $(CC) $(CFLAGS) $< +$O/Ppmd7aDec.o: ../../../C/Ppmd7aDec.c + $(CC) $(CFLAGS) $< +$O/Ppmd7Dec.o: ../../../C/Ppmd7Dec.c + $(CC) $(CFLAGS) $< +$O/Ppmd7Enc.o: ../../../C/Ppmd7Enc.c + $(CC) $(CFLAGS) $< +$O/Ppmd8.o: ../../../C/Ppmd8.c + $(CC) $(CFLAGS) $< +$O/Ppmd8Dec.o: ../../../C/Ppmd8Dec.c + $(CC) $(CFLAGS) $< +$O/Ppmd8Enc.o: ../../../C/Ppmd8Enc.c + $(CC) $(CFLAGS) $< +$O/Sha1.o: ../../../C/Sha1.c + $(CC) $(CFLAGS) $< +$O/Sha256.o: ../../../C/Sha256.c + $(CC) $(CFLAGS) $< +$O/Sort.o: ../../../C/Sort.c + $(CC) $(CFLAGS) $< +$O/Xz.o: ../../../C/Xz.c + $(CC) $(CFLAGS) $< +$O/XzCrc64.o: ../../../C/XzCrc64.c + $(CC) $(CFLAGS) $< + + +ifdef USE_ASM +ifdef IS_X64 +USE_X86_ASM=1 +else +ifdef IS_X86 +USE_X86_ASM=1 +endif +endif +endif + +ifdef USE_X86_ASM +$O/7zCrcOpt.o: ../../../Asm/x86/7zCrcOpt.asm + $(MY_ASM) $(AFLAGS) $< +$O/XzCrc64Opt.o: ../../../Asm/x86/XzCrc64Opt.asm + $(MY_ASM) $(AFLAGS) $< +$O/AesOpt.o: ../../../Asm/x86/AesOpt.asm + $(MY_ASM) $(AFLAGS) $< +$O/Sha1Opt.o: ../../../Asm/x86/Sha1Opt.asm + $(MY_ASM) $(AFLAGS) $< +$O/Sha256Opt.o: ../../../Asm/x86/Sha256Opt.asm + $(MY_ASM) $(AFLAGS) $< +else +$O/7zCrcOpt.o: ../../7zCrcOpt.c + $(CC) $(CFLAGS) $< +$O/XzCrc64Opt.o: ../../XzCrc64Opt.c + $(CC) $(CFLAGS) $< +$O/Sha1Opt.o: ../../Sha1Opt.c + $(CC) $(CFLAGS) $< +$O/Sha256Opt.o: ../../Sha256Opt.c + $(CC) $(CFLAGS) $< +$O/AesOpt.o: ../../AesOpt.c + $(CC) $(CFLAGS) $< +endif + + +ifdef USE_LZMA_DEC_ASM + +ifdef IS_X64 +$O/LzmaDecOpt.o: ../../../Asm/x86/LzmaDecOpt.asm + $(MY_ASM) $(AFLAGS) $< +endif + +ifdef IS_ARM64 +$O/LzmaDecOpt.o: ../../../Asm/arm64/LzmaDecOpt.S ../../../Asm/arm64/7zAsm.S + $(CC) $(CFLAGS) $< +endif + +$O/LzmaDec.o: ../../LzmaDec.c + $(CC) $(CFLAGS) -D_LZMA_DEC_OPT $< + +else + +$O/LzmaDec.o: ../../LzmaDec.c + $(CC) $(CFLAGS) $< + +endif + + + +$O/XzDec.o: ../../../C/XzDec.c + $(CC) $(CFLAGS) $< +$O/XzEnc.o: ../../../C/XzEnc.c + $(CC) $(CFLAGS) $< +$O/XzIn.o: ../../../C/XzIn.c + $(CC) $(CFLAGS) $< + + +$O/7zMain.o: ../../../C/Util/7z/7zMain.c + $(CC) $(CFLAGS) $< +$O/LzmaUtil.o: ../../../C/Util/Lzma/LzmaUtil.c + $(CC) $(CFLAGS) $< +$O/7zipInstall.o: ../../../C/Util/7zipInstall/7zipInstall.c + $(CC) $(CFLAGS) $< +$O/7zipUninstall.o: ../../../C/Util/7zipUninstall/7zipUninstall.c + $(CC) $(CFLAGS) $< + + +clean: + -$(DEL_OBJ_EXE) diff --git a/deps/LZMA-SDK/C/Aes.c b/deps/LZMA-SDK/C/Aes.c index 0f0ddc87a..27e32e622 100644 --- a/deps/LZMA-SDK/C/Aes.c +++ b/deps/LZMA-SDK/C/Aes.c @@ -1,375 +1,375 @@ -/* Aes.c -- AES encryption / decryption -2021-04-01 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include "CpuArch.h" -#include "Aes.h" - -AES_CODE_FUNC g_AesCbc_Decode; -#ifndef _SFX -AES_CODE_FUNC g_AesCbc_Encode; -AES_CODE_FUNC g_AesCtr_Code; -UInt32 g_Aes_SupportedFunctions_Flags; -#endif - -static UInt32 T[256 * 4]; -static const Byte Sbox[256] = { - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, - 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, - 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, - 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, - 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, - 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, - 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, - 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, - 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, - 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, - 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16}; - - -static UInt32 D[256 * 4]; -static Byte InvS[256]; - -#define xtime(x) ((((x) << 1) ^ (((x) & 0x80) != 0 ? 0x1B : 0)) & 0xFF) - -#define Ui32(a0, a1, a2, a3) ((UInt32)(a0) | ((UInt32)(a1) << 8) | ((UInt32)(a2) << 16) | ((UInt32)(a3) << 24)) - -#define gb0(x) ( (x) & 0xFF) -#define gb1(x) (((x) >> ( 8)) & 0xFF) -#define gb2(x) (((x) >> (16)) & 0xFF) -#define gb3(x) (((x) >> (24))) - -#define gb(n, x) gb ## n(x) - -#define TT(x) (T + (x << 8)) -#define DD(x) (D + (x << 8)) - - -// #define _SHOW_AES_STATUS - -#ifdef MY_CPU_X86_OR_AMD64 - #define USE_HW_AES -#elif defined(MY_CPU_ARM_OR_ARM64) && defined(MY_CPU_LE) - #if defined(__clang__) - #if (__clang_major__ >= 8) // fix that check - #define USE_HW_AES - #endif - #elif defined(__GNUC__) - #if (__GNUC__ >= 6) // fix that check - #define USE_HW_AES - #endif - #elif defined(_MSC_VER) - #if _MSC_VER >= 1910 - #define USE_HW_AES - #endif - #endif -#endif - -#ifdef USE_HW_AES -#ifdef _SHOW_AES_STATUS -#include -#define _PRF(x) x -#else -#define _PRF(x) -#endif -#endif - - -void AesGenTables(void) -{ - unsigned i; - for (i = 0; i < 256; i++) - InvS[Sbox[i]] = (Byte)i; - - for (i = 0; i < 256; i++) - { - { - UInt32 a1 = Sbox[i]; - UInt32 a2 = xtime(a1); - UInt32 a3 = a2 ^ a1; - TT(0)[i] = Ui32(a2, a1, a1, a3); - TT(1)[i] = Ui32(a3, a2, a1, a1); - TT(2)[i] = Ui32(a1, a3, a2, a1); - TT(3)[i] = Ui32(a1, a1, a3, a2); - } - { - UInt32 a1 = InvS[i]; - UInt32 a2 = xtime(a1); - UInt32 a4 = xtime(a2); - UInt32 a8 = xtime(a4); - UInt32 a9 = a8 ^ a1; - UInt32 aB = a8 ^ a2 ^ a1; - UInt32 aD = a8 ^ a4 ^ a1; - UInt32 aE = a8 ^ a4 ^ a2; - DD(0)[i] = Ui32(aE, a9, aD, aB); - DD(1)[i] = Ui32(aB, aE, a9, aD); - DD(2)[i] = Ui32(aD, aB, aE, a9); - DD(3)[i] = Ui32(a9, aD, aB, aE); - } - } - - { - AES_CODE_FUNC d = AesCbc_Decode; - #ifndef _SFX - AES_CODE_FUNC e = AesCbc_Encode; - AES_CODE_FUNC c = AesCtr_Code; - UInt32 flags = 0; - #endif - - #ifdef USE_HW_AES - if (CPU_IsSupported_AES()) - { - // #pragma message ("AES HW") - _PRF(printf("\n===AES HW\n")); - d = AesCbc_Decode_HW; - - #ifndef _SFX - e = AesCbc_Encode_HW; - c = AesCtr_Code_HW; - flags = k_Aes_SupportedFunctions_HW; - #endif - - #ifdef MY_CPU_X86_OR_AMD64 - if (CPU_IsSupported_VAES_AVX2()) - { - _PRF(printf("\n===vaes avx2\n")); - d = AesCbc_Decode_HW_256; - #ifndef _SFX - c = AesCtr_Code_HW_256; - flags |= k_Aes_SupportedFunctions_HW_256; - #endif - } - #endif - } - #endif - - g_AesCbc_Decode = d; - #ifndef _SFX - g_AesCbc_Encode = e; - g_AesCtr_Code = c; - g_Aes_SupportedFunctions_Flags = flags; - #endif - } -} - - -#define HT(i, x, s) TT(x)[gb(x, s[(i + x) & 3])] - -#define HT4(m, i, s, p) m[i] = \ - HT(i, 0, s) ^ \ - HT(i, 1, s) ^ \ - HT(i, 2, s) ^ \ - HT(i, 3, s) ^ w[p + i] - -#define HT16(m, s, p) \ - HT4(m, 0, s, p); \ - HT4(m, 1, s, p); \ - HT4(m, 2, s, p); \ - HT4(m, 3, s, p); \ - -#define FT(i, x) Sbox[gb(x, m[(i + x) & 3])] -#define FT4(i) dest[i] = Ui32(FT(i, 0), FT(i, 1), FT(i, 2), FT(i, 3)) ^ w[i]; - - -#define HD(i, x, s) DD(x)[gb(x, s[(i - x) & 3])] - -#define HD4(m, i, s, p) m[i] = \ - HD(i, 0, s) ^ \ - HD(i, 1, s) ^ \ - HD(i, 2, s) ^ \ - HD(i, 3, s) ^ w[p + i]; - -#define HD16(m, s, p) \ - HD4(m, 0, s, p); \ - HD4(m, 1, s, p); \ - HD4(m, 2, s, p); \ - HD4(m, 3, s, p); \ - -#define FD(i, x) InvS[gb(x, m[(i - x) & 3])] -#define FD4(i) dest[i] = Ui32(FD(i, 0), FD(i, 1), FD(i, 2), FD(i, 3)) ^ w[i]; - -void MY_FAST_CALL Aes_SetKey_Enc(UInt32 *w, const Byte *key, unsigned keySize) -{ - unsigned i, m; - const UInt32 *wLim; - UInt32 t; - UInt32 rcon = 1; - - keySize /= 4; - w[0] = ((UInt32)keySize / 2) + 3; - w += 4; - - for (i = 0; i < keySize; i++, key += 4) - w[i] = GetUi32(key); - - t = w[(size_t)keySize - 1]; - wLim = w + (size_t)keySize * 3 + 28; - m = 0; - do - { - if (m == 0) - { - t = Ui32(Sbox[gb1(t)] ^ rcon, Sbox[gb2(t)], Sbox[gb3(t)], Sbox[gb0(t)]); - rcon <<= 1; - if (rcon & 0x100) - rcon = 0x1b; - m = keySize; - } - else if (m == 4 && keySize > 6) - t = Ui32(Sbox[gb0(t)], Sbox[gb1(t)], Sbox[gb2(t)], Sbox[gb3(t)]); - m--; - t ^= w[0]; - w[keySize] = t; - } - while (++w != wLim); -} - -void MY_FAST_CALL Aes_SetKey_Dec(UInt32 *w, const Byte *key, unsigned keySize) -{ - unsigned i, num; - Aes_SetKey_Enc(w, key, keySize); - num = keySize + 20; - w += 8; - for (i = 0; i < num; i++) - { - UInt32 r = w[i]; - w[i] = - DD(0)[Sbox[gb0(r)]] ^ - DD(1)[Sbox[gb1(r)]] ^ - DD(2)[Sbox[gb2(r)]] ^ - DD(3)[Sbox[gb3(r)]]; - } -} - -/* Aes_Encode and Aes_Decode functions work with little-endian words. - src and dest are pointers to 4 UInt32 words. - src and dest can point to same block */ - -// MY_FORCE_INLINE -static void Aes_Encode(const UInt32 *w, UInt32 *dest, const UInt32 *src) -{ - UInt32 s[4]; - UInt32 m[4]; - UInt32 numRounds2 = w[0]; - w += 4; - s[0] = src[0] ^ w[0]; - s[1] = src[1] ^ w[1]; - s[2] = src[2] ^ w[2]; - s[3] = src[3] ^ w[3]; - w += 4; - for (;;) - { - HT16(m, s, 0); - if (--numRounds2 == 0) - break; - HT16(s, m, 4); - w += 8; - } - w += 4; - FT4(0); FT4(1); FT4(2); FT4(3); -} - -MY_FORCE_INLINE -static void Aes_Decode(const UInt32 *w, UInt32 *dest, const UInt32 *src) -{ - UInt32 s[4]; - UInt32 m[4]; - UInt32 numRounds2 = w[0]; - w += 4 + numRounds2 * 8; - s[0] = src[0] ^ w[0]; - s[1] = src[1] ^ w[1]; - s[2] = src[2] ^ w[2]; - s[3] = src[3] ^ w[3]; - for (;;) - { - w -= 8; - HD16(m, s, 4); - if (--numRounds2 == 0) - break; - HD16(s, m, 0); - } - FD4(0); FD4(1); FD4(2); FD4(3); -} - -void AesCbc_Init(UInt32 *p, const Byte *iv) -{ - unsigned i; - for (i = 0; i < 4; i++) - p[i] = GetUi32(iv + i * 4); -} - -void MY_FAST_CALL AesCbc_Encode(UInt32 *p, Byte *data, size_t numBlocks) -{ - for (; numBlocks != 0; numBlocks--, data += AES_BLOCK_SIZE) - { - p[0] ^= GetUi32(data); - p[1] ^= GetUi32(data + 4); - p[2] ^= GetUi32(data + 8); - p[3] ^= GetUi32(data + 12); - - Aes_Encode(p + 4, p, p); - - SetUi32(data, p[0]); - SetUi32(data + 4, p[1]); - SetUi32(data + 8, p[2]); - SetUi32(data + 12, p[3]); - } -} - -void MY_FAST_CALL AesCbc_Decode(UInt32 *p, Byte *data, size_t numBlocks) -{ - UInt32 in[4], out[4]; - for (; numBlocks != 0; numBlocks--, data += AES_BLOCK_SIZE) - { - in[0] = GetUi32(data); - in[1] = GetUi32(data + 4); - in[2] = GetUi32(data + 8); - in[3] = GetUi32(data + 12); - - Aes_Decode(p + 4, out, in); - - SetUi32(data, p[0] ^ out[0]); - SetUi32(data + 4, p[1] ^ out[1]); - SetUi32(data + 8, p[2] ^ out[2]); - SetUi32(data + 12, p[3] ^ out[3]); - - p[0] = in[0]; - p[1] = in[1]; - p[2] = in[2]; - p[3] = in[3]; - } -} - -void MY_FAST_CALL AesCtr_Code(UInt32 *p, Byte *data, size_t numBlocks) -{ - for (; numBlocks != 0; numBlocks--) - { - UInt32 temp[4]; - unsigned i; - - if (++p[0] == 0) - p[1]++; - - Aes_Encode(p + 4, temp, p); - - for (i = 0; i < 4; i++, data += 4) - { - UInt32 t = temp[i]; - - #ifdef MY_CPU_LE_UNALIGN - *((UInt32 *)(void *)data) ^= t; - #else - data[0] ^= (t & 0xFF); - data[1] ^= ((t >> 8) & 0xFF); - data[2] ^= ((t >> 16) & 0xFF); - data[3] ^= ((t >> 24)); - #endif - } - } -} +/* Aes.c -- AES encryption / decryption +2021-05-13 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "CpuArch.h" +#include "Aes.h" + +AES_CODE_FUNC g_AesCbc_Decode; +#ifndef _SFX +AES_CODE_FUNC g_AesCbc_Encode; +AES_CODE_FUNC g_AesCtr_Code; +UInt32 g_Aes_SupportedFunctions_Flags; +#endif + +static UInt32 T[256 * 4]; +static const Byte Sbox[256] = { + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16}; + + +static UInt32 D[256 * 4]; +static Byte InvS[256]; + +#define xtime(x) ((((x) << 1) ^ (((x) & 0x80) != 0 ? 0x1B : 0)) & 0xFF) + +#define Ui32(a0, a1, a2, a3) ((UInt32)(a0) | ((UInt32)(a1) << 8) | ((UInt32)(a2) << 16) | ((UInt32)(a3) << 24)) + +#define gb0(x) ( (x) & 0xFF) +#define gb1(x) (((x) >> ( 8)) & 0xFF) +#define gb2(x) (((x) >> (16)) & 0xFF) +#define gb3(x) (((x) >> (24))) + +#define gb(n, x) gb ## n(x) + +#define TT(x) (T + (x << 8)) +#define DD(x) (D + (x << 8)) + + +// #define _SHOW_AES_STATUS + +#ifdef MY_CPU_X86_OR_AMD64 + #define USE_HW_AES +#elif defined(MY_CPU_ARM_OR_ARM64) && defined(MY_CPU_LE) + #if defined(__clang__) + #if (__clang_major__ >= 8) // fix that check + #define USE_HW_AES + #endif + #elif defined(__GNUC__) + #if (__GNUC__ >= 6) // fix that check + #define USE_HW_AES + #endif + #elif defined(_MSC_VER) + #if _MSC_VER >= 1910 + #define USE_HW_AES + #endif + #endif +#endif + +#ifdef USE_HW_AES +#ifdef _SHOW_AES_STATUS +#include +#define _PRF(x) x +#else +#define _PRF(x) +#endif +#endif + + +void AesGenTables(void) +{ + unsigned i; + for (i = 0; i < 256; i++) + InvS[Sbox[i]] = (Byte)i; + + for (i = 0; i < 256; i++) + { + { + UInt32 a1 = Sbox[i]; + UInt32 a2 = xtime(a1); + UInt32 a3 = a2 ^ a1; + TT(0)[i] = Ui32(a2, a1, a1, a3); + TT(1)[i] = Ui32(a3, a2, a1, a1); + TT(2)[i] = Ui32(a1, a3, a2, a1); + TT(3)[i] = Ui32(a1, a1, a3, a2); + } + { + UInt32 a1 = InvS[i]; + UInt32 a2 = xtime(a1); + UInt32 a4 = xtime(a2); + UInt32 a8 = xtime(a4); + UInt32 a9 = a8 ^ a1; + UInt32 aB = a8 ^ a2 ^ a1; + UInt32 aD = a8 ^ a4 ^ a1; + UInt32 aE = a8 ^ a4 ^ a2; + DD(0)[i] = Ui32(aE, a9, aD, aB); + DD(1)[i] = Ui32(aB, aE, a9, aD); + DD(2)[i] = Ui32(aD, aB, aE, a9); + DD(3)[i] = Ui32(a9, aD, aB, aE); + } + } + + { + AES_CODE_FUNC d = AesCbc_Decode; + #ifndef _SFX + AES_CODE_FUNC e = AesCbc_Encode; + AES_CODE_FUNC c = AesCtr_Code; + UInt32 flags = 0; + #endif + + #ifdef USE_HW_AES + if (CPU_IsSupported_AES()) + { + // #pragma message ("AES HW") + _PRF(printf("\n===AES HW\n")); + d = AesCbc_Decode_HW; + + #ifndef _SFX + e = AesCbc_Encode_HW; + c = AesCtr_Code_HW; + flags = k_Aes_SupportedFunctions_HW; + #endif + + #ifdef MY_CPU_X86_OR_AMD64 + if (CPU_IsSupported_VAES_AVX2()) + { + _PRF(printf("\n===vaes avx2\n")); + d = AesCbc_Decode_HW_256; + #ifndef _SFX + c = AesCtr_Code_HW_256; + flags |= k_Aes_SupportedFunctions_HW_256; + #endif + } + #endif + } + #endif + + g_AesCbc_Decode = d; + #ifndef _SFX + g_AesCbc_Encode = e; + g_AesCtr_Code = c; + g_Aes_SupportedFunctions_Flags = flags; + #endif + } +} + + +#define HT(i, x, s) TT(x)[gb(x, s[(i + x) & 3])] + +#define HT4(m, i, s, p) m[i] = \ + HT(i, 0, s) ^ \ + HT(i, 1, s) ^ \ + HT(i, 2, s) ^ \ + HT(i, 3, s) ^ w[p + i] + +#define HT16(m, s, p) \ + HT4(m, 0, s, p); \ + HT4(m, 1, s, p); \ + HT4(m, 2, s, p); \ + HT4(m, 3, s, p); \ + +#define FT(i, x) Sbox[gb(x, m[(i + x) & 3])] +#define FT4(i) dest[i] = Ui32(FT(i, 0), FT(i, 1), FT(i, 2), FT(i, 3)) ^ w[i]; + + +#define HD(i, x, s) DD(x)[gb(x, s[(i - x) & 3])] + +#define HD4(m, i, s, p) m[i] = \ + HD(i, 0, s) ^ \ + HD(i, 1, s) ^ \ + HD(i, 2, s) ^ \ + HD(i, 3, s) ^ w[p + i]; + +#define HD16(m, s, p) \ + HD4(m, 0, s, p); \ + HD4(m, 1, s, p); \ + HD4(m, 2, s, p); \ + HD4(m, 3, s, p); \ + +#define FD(i, x) InvS[gb(x, m[(i - x) & 3])] +#define FD4(i) dest[i] = Ui32(FD(i, 0), FD(i, 1), FD(i, 2), FD(i, 3)) ^ w[i]; + +void MY_FAST_CALL Aes_SetKey_Enc(UInt32 *w, const Byte *key, unsigned keySize) +{ + unsigned i, m; + const UInt32 *wLim; + UInt32 t; + UInt32 rcon = 1; + + keySize /= 4; + w[0] = ((UInt32)keySize / 2) + 3; + w += 4; + + for (i = 0; i < keySize; i++, key += 4) + w[i] = GetUi32(key); + + t = w[(size_t)keySize - 1]; + wLim = w + (size_t)keySize * 3 + 28; + m = 0; + do + { + if (m == 0) + { + t = Ui32(Sbox[gb1(t)] ^ rcon, Sbox[gb2(t)], Sbox[gb3(t)], Sbox[gb0(t)]); + rcon <<= 1; + if (rcon & 0x100) + rcon = 0x1b; + m = keySize; + } + else if (m == 4 && keySize > 6) + t = Ui32(Sbox[gb0(t)], Sbox[gb1(t)], Sbox[gb2(t)], Sbox[gb3(t)]); + m--; + t ^= w[0]; + w[keySize] = t; + } + while (++w != wLim); +} + +void MY_FAST_CALL Aes_SetKey_Dec(UInt32 *w, const Byte *key, unsigned keySize) +{ + unsigned i, num; + Aes_SetKey_Enc(w, key, keySize); + num = keySize + 20; + w += 8; + for (i = 0; i < num; i++) + { + UInt32 r = w[i]; + w[i] = + DD(0)[Sbox[gb0(r)]] ^ + DD(1)[Sbox[gb1(r)]] ^ + DD(2)[Sbox[gb2(r)]] ^ + DD(3)[Sbox[gb3(r)]]; + } +} + +/* Aes_Encode and Aes_Decode functions work with little-endian words. + src and dest are pointers to 4 UInt32 words. + src and dest can point to same block */ + +// MY_FORCE_INLINE +static void Aes_Encode(const UInt32 *w, UInt32 *dest, const UInt32 *src) +{ + UInt32 s[4]; + UInt32 m[4]; + UInt32 numRounds2 = w[0]; + w += 4; + s[0] = src[0] ^ w[0]; + s[1] = src[1] ^ w[1]; + s[2] = src[2] ^ w[2]; + s[3] = src[3] ^ w[3]; + w += 4; + for (;;) + { + HT16(m, s, 0); + if (--numRounds2 == 0) + break; + HT16(s, m, 4); + w += 8; + } + w += 4; + FT4(0); FT4(1); FT4(2); FT4(3); +} + +MY_FORCE_INLINE +static void Aes_Decode(const UInt32 *w, UInt32 *dest, const UInt32 *src) +{ + UInt32 s[4]; + UInt32 m[4]; + UInt32 numRounds2 = w[0]; + w += 4 + numRounds2 * 8; + s[0] = src[0] ^ w[0]; + s[1] = src[1] ^ w[1]; + s[2] = src[2] ^ w[2]; + s[3] = src[3] ^ w[3]; + for (;;) + { + w -= 8; + HD16(m, s, 4); + if (--numRounds2 == 0) + break; + HD16(s, m, 0); + } + FD4(0); FD4(1); FD4(2); FD4(3); +} + +void AesCbc_Init(UInt32 *p, const Byte *iv) +{ + unsigned i; + for (i = 0; i < 4; i++) + p[i] = GetUi32(iv + i * 4); +} + +void MY_FAST_CALL AesCbc_Encode(UInt32 *p, Byte *data, size_t numBlocks) +{ + for (; numBlocks != 0; numBlocks--, data += AES_BLOCK_SIZE) + { + p[0] ^= GetUi32(data); + p[1] ^= GetUi32(data + 4); + p[2] ^= GetUi32(data + 8); + p[3] ^= GetUi32(data + 12); + + Aes_Encode(p + 4, p, p); + + SetUi32(data, p[0]); + SetUi32(data + 4, p[1]); + SetUi32(data + 8, p[2]); + SetUi32(data + 12, p[3]); + } +} + +void MY_FAST_CALL AesCbc_Decode(UInt32 *p, Byte *data, size_t numBlocks) +{ + UInt32 in[4], out[4]; + for (; numBlocks != 0; numBlocks--, data += AES_BLOCK_SIZE) + { + in[0] = GetUi32(data); + in[1] = GetUi32(data + 4); + in[2] = GetUi32(data + 8); + in[3] = GetUi32(data + 12); + + Aes_Decode(p + 4, out, in); + + SetUi32(data, p[0] ^ out[0]); + SetUi32(data + 4, p[1] ^ out[1]); + SetUi32(data + 8, p[2] ^ out[2]); + SetUi32(data + 12, p[3] ^ out[3]); + + p[0] = in[0]; + p[1] = in[1]; + p[2] = in[2]; + p[3] = in[3]; + } +} + +void MY_FAST_CALL AesCtr_Code(UInt32 *p, Byte *data, size_t numBlocks) +{ + for (; numBlocks != 0; numBlocks--) + { + UInt32 temp[4]; + unsigned i; + + if (++p[0] == 0) + p[1]++; + + Aes_Encode(p + 4, temp, p); + + for (i = 0; i < 4; i++, data += 4) + { + UInt32 t = temp[i]; + + #ifdef MY_CPU_LE_UNALIGN + *((UInt32 *)(void *)data) ^= t; + #else + data[0] = (Byte)(data[0] ^ (t & 0xFF)); + data[1] = (Byte)(data[1] ^ ((t >> 8) & 0xFF)); + data[2] = (Byte)(data[2] ^ ((t >> 16) & 0xFF)); + data[3] = (Byte)(data[3] ^ ((t >> 24))); + #endif + } + } +} diff --git a/deps/LZMA-SDK/C/Aes.h b/deps/LZMA-SDK/C/Aes.h index 602e25ea2..2aa225642 100644 --- a/deps/LZMA-SDK/C/Aes.h +++ b/deps/LZMA-SDK/C/Aes.h @@ -1,60 +1,60 @@ -/* Aes.h -- AES encryption / decryption -2018-04-28 : Igor Pavlov : Public domain */ - -#ifndef __AES_H -#define __AES_H - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -#define AES_BLOCK_SIZE 16 - -/* Call AesGenTables one time before other AES functions */ -void AesGenTables(void); - -/* UInt32 pointers must be 16-byte aligned */ - -/* 16-byte (4 * 32-bit words) blocks: 1 (IV) + 1 (keyMode) + 15 (AES-256 roundKeys) */ -#define AES_NUM_IVMRK_WORDS ((1 + 1 + 15) * 4) - -/* aes - 16-byte aligned pointer to keyMode+roundKeys sequence */ -/* keySize = 16 or 24 or 32 (bytes) */ -typedef void (MY_FAST_CALL *AES_SET_KEY_FUNC)(UInt32 *aes, const Byte *key, unsigned keySize); -void MY_FAST_CALL Aes_SetKey_Enc(UInt32 *aes, const Byte *key, unsigned keySize); -void MY_FAST_CALL Aes_SetKey_Dec(UInt32 *aes, const Byte *key, unsigned keySize); - -/* ivAes - 16-byte aligned pointer to iv+keyMode+roundKeys sequence: UInt32[AES_NUM_IVMRK_WORDS] */ -void AesCbc_Init(UInt32 *ivAes, const Byte *iv); /* iv size is AES_BLOCK_SIZE */ - -/* data - 16-byte aligned pointer to data */ -/* numBlocks - the number of 16-byte blocks in data array */ -typedef void (MY_FAST_CALL *AES_CODE_FUNC)(UInt32 *ivAes, Byte *data, size_t numBlocks); - -extern AES_CODE_FUNC g_AesCbc_Decode; -#ifndef _SFX -extern AES_CODE_FUNC g_AesCbc_Encode; -extern AES_CODE_FUNC g_AesCtr_Code; -#define k_Aes_SupportedFunctions_HW (1 << 2) -#define k_Aes_SupportedFunctions_HW_256 (1 << 3) -extern UInt32 g_Aes_SupportedFunctions_Flags; -#endif - - -#define DECLARE__AES_CODE_FUNC(funcName) \ - void MY_FAST_CALL funcName(UInt32 *ivAes, Byte *data, size_t numBlocks); - -DECLARE__AES_CODE_FUNC (AesCbc_Encode) -DECLARE__AES_CODE_FUNC (AesCbc_Decode) -DECLARE__AES_CODE_FUNC (AesCtr_Code) - -DECLARE__AES_CODE_FUNC (AesCbc_Encode_HW) -DECLARE__AES_CODE_FUNC (AesCbc_Decode_HW) -DECLARE__AES_CODE_FUNC (AesCtr_Code_HW) - -DECLARE__AES_CODE_FUNC (AesCbc_Decode_HW_256) -DECLARE__AES_CODE_FUNC (AesCtr_Code_HW_256) - -EXTERN_C_END - -#endif +/* Aes.h -- AES encryption / decryption +2018-04-28 : Igor Pavlov : Public domain */ + +#ifndef __AES_H +#define __AES_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +#define AES_BLOCK_SIZE 16 + +/* Call AesGenTables one time before other AES functions */ +void AesGenTables(void); + +/* UInt32 pointers must be 16-byte aligned */ + +/* 16-byte (4 * 32-bit words) blocks: 1 (IV) + 1 (keyMode) + 15 (AES-256 roundKeys) */ +#define AES_NUM_IVMRK_WORDS ((1 + 1 + 15) * 4) + +/* aes - 16-byte aligned pointer to keyMode+roundKeys sequence */ +/* keySize = 16 or 24 or 32 (bytes) */ +typedef void (MY_FAST_CALL *AES_SET_KEY_FUNC)(UInt32 *aes, const Byte *key, unsigned keySize); +void MY_FAST_CALL Aes_SetKey_Enc(UInt32 *aes, const Byte *key, unsigned keySize); +void MY_FAST_CALL Aes_SetKey_Dec(UInt32 *aes, const Byte *key, unsigned keySize); + +/* ivAes - 16-byte aligned pointer to iv+keyMode+roundKeys sequence: UInt32[AES_NUM_IVMRK_WORDS] */ +void AesCbc_Init(UInt32 *ivAes, const Byte *iv); /* iv size is AES_BLOCK_SIZE */ + +/* data - 16-byte aligned pointer to data */ +/* numBlocks - the number of 16-byte blocks in data array */ +typedef void (MY_FAST_CALL *AES_CODE_FUNC)(UInt32 *ivAes, Byte *data, size_t numBlocks); + +extern AES_CODE_FUNC g_AesCbc_Decode; +#ifndef _SFX +extern AES_CODE_FUNC g_AesCbc_Encode; +extern AES_CODE_FUNC g_AesCtr_Code; +#define k_Aes_SupportedFunctions_HW (1 << 2) +#define k_Aes_SupportedFunctions_HW_256 (1 << 3) +extern UInt32 g_Aes_SupportedFunctions_Flags; +#endif + + +#define DECLARE__AES_CODE_FUNC(funcName) \ + void MY_FAST_CALL funcName(UInt32 *ivAes, Byte *data, size_t numBlocks); + +DECLARE__AES_CODE_FUNC (AesCbc_Encode) +DECLARE__AES_CODE_FUNC (AesCbc_Decode) +DECLARE__AES_CODE_FUNC (AesCtr_Code) + +DECLARE__AES_CODE_FUNC (AesCbc_Encode_HW) +DECLARE__AES_CODE_FUNC (AesCbc_Decode_HW) +DECLARE__AES_CODE_FUNC (AesCtr_Code_HW) + +DECLARE__AES_CODE_FUNC (AesCbc_Decode_HW_256) +DECLARE__AES_CODE_FUNC (AesCtr_Code_HW_256) + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/AesOpt.c b/deps/LZMA-SDK/C/AesOpt.c index 1bdc9a882..8be8ff69d 100644 --- a/deps/LZMA-SDK/C/AesOpt.c +++ b/deps/LZMA-SDK/C/AesOpt.c @@ -1,776 +1,776 @@ -/* AesOpt.c -- AES optimized code for x86 AES hardware instructions -2021-04-01 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include "CpuArch.h" - -#ifdef MY_CPU_X86_OR_AMD64 - - #if defined(__clang__) - #if __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 8) - #define USE_INTEL_AES - #define ATTRIB_AES __attribute__((__target__("aes"))) - #if (__clang_major__ >= 8) - #define USE_INTEL_VAES - #define ATTRIB_VAES __attribute__((__target__("aes,vaes,avx2"))) - #endif - #endif - #elif defined(__GNUC__) - #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) - #define USE_INTEL_AES - #ifndef __AES__ - #define ATTRIB_AES __attribute__((__target__("aes"))) - #endif - #if (__GNUC__ >= 8) - #define USE_INTEL_VAES - #define ATTRIB_VAES __attribute__((__target__("aes,vaes,avx2"))) - #endif - #endif - #elif defined(__INTEL_COMPILER) - #if (__INTEL_COMPILER >= 1110) - #define USE_INTEL_AES - #if (__INTEL_COMPILER >= 1900) - #define USE_INTEL_VAES - #endif - #endif - #elif defined(_MSC_VER) - #if (_MSC_VER > 1500) || (_MSC_FULL_VER >= 150030729) - #define USE_INTEL_AES - #if (_MSC_VER >= 1910) - #define USE_INTEL_VAES - #endif - #endif - #endif - -#ifndef ATTRIB_AES - #define ATTRIB_AES -#endif -#ifndef ATTRIB_VAES - #define ATTRIB_VAES -#endif - - -#ifdef USE_INTEL_AES - -#include - -#ifndef USE_INTEL_VAES -#define AES_TYPE_keys __m128i -#define AES_TYPE_data __m128i -#endif - -#define AES_FUNC_START(name) \ - void MY_FAST_CALL name(__m128i *p, __m128i *data, size_t numBlocks) - -#define AES_FUNC_START2(name) \ -AES_FUNC_START (name); \ -ATTRIB_AES \ -AES_FUNC_START (name) - -#define MM_OP(op, dest, src) dest = op(dest, src); -#define MM_OP_m(op, src) MM_OP(op, m, src); - -#define MM_XOR( dest, src) MM_OP(_mm_xor_si128, dest, src); -#define AVX_XOR(dest, src) MM_OP(_mm256_xor_si256, dest, src); - - -AES_FUNC_START2 (AesCbc_Encode_HW) -{ - __m128i m = *p; - const __m128i k0 = p[2]; - const __m128i k1 = p[3]; - const UInt32 numRounds2 = *(const UInt32 *)(p + 1) - 1; - for (; numBlocks != 0; numBlocks--, data++) - { - UInt32 r = numRounds2; - const __m128i *w = p + 4; - __m128i temp = *data; - MM_XOR (temp, k0); - MM_XOR (m, temp); - MM_OP_m (_mm_aesenc_si128, k1); - do - { - MM_OP_m (_mm_aesenc_si128, w[0]); - MM_OP_m (_mm_aesenc_si128, w[1]); - w += 2; - } - while (--r); - MM_OP_m (_mm_aesenclast_si128, w[0]); - *data = m; - } - *p = m; -} - - -#define WOP_1(op) -#define WOP_2(op) WOP_1 (op) op (m1, 1); -#define WOP_3(op) WOP_2 (op) op (m2, 2); -#define WOP_4(op) WOP_3 (op) op (m3, 3); -#ifdef MY_CPU_AMD64 -#define WOP_5(op) WOP_4 (op) op (m4, 4); -#define WOP_6(op) WOP_5 (op) op (m5, 5); -#define WOP_7(op) WOP_6 (op) op (m6, 6); -#define WOP_8(op) WOP_7 (op) op (m7, 7); -#endif -/* -#define WOP_9(op) WOP_8 (op) op (m8, 8); -#define WOP_10(op) WOP_9 (op) op (m9, 9); -#define WOP_11(op) WOP_10(op) op (m10, 10); -#define WOP_12(op) WOP_11(op) op (m11, 11); -#define WOP_13(op) WOP_12(op) op (m12, 12); -#define WOP_14(op) WOP_13(op) op (m13, 13); -*/ - -#ifdef MY_CPU_AMD64 - #define NUM_WAYS 8 - #define WOP_M1 WOP_8 -#else - #define NUM_WAYS 4 - #define WOP_M1 WOP_4 -#endif - -#define WOP(op) op (m0, 0); WOP_M1(op) - - -#define DECLARE_VAR(reg, ii) __m128i reg -#define LOAD_data( reg, ii) reg = data[ii]; -#define STORE_data( reg, ii) data[ii] = reg; -#if (NUM_WAYS > 1) -#define XOR_data_M1(reg, ii) MM_XOR (reg, data[ii- 1]); -#endif - -#define AVX__DECLARE_VAR(reg, ii) __m256i reg -#define AVX__LOAD_data( reg, ii) reg = ((const __m256i *)(const void *)data)[ii]; -#define AVX__STORE_data( reg, ii) ((__m256i *)(void *)data)[ii] = reg; -#define AVX__XOR_data_M1(reg, ii) AVX_XOR (reg, (((const __m256i *)(const void *)(data - 1))[ii])); - -#define MM_OP_key(op, reg) MM_OP(op, reg, key); - -#define AES_DEC( reg, ii) MM_OP_key (_mm_aesdec_si128, reg) -#define AES_DEC_LAST( reg, ii) MM_OP_key (_mm_aesdeclast_si128, reg) -#define AES_ENC( reg, ii) MM_OP_key (_mm_aesenc_si128, reg) -#define AES_ENC_LAST( reg, ii) MM_OP_key (_mm_aesenclast_si128, reg) -#define AES_XOR( reg, ii) MM_OP_key (_mm_xor_si128, reg) - - -#define AVX__AES_DEC( reg, ii) MM_OP_key (_mm256_aesdec_epi128, reg) -#define AVX__AES_DEC_LAST( reg, ii) MM_OP_key (_mm256_aesdeclast_epi128, reg) -#define AVX__AES_ENC( reg, ii) MM_OP_key (_mm256_aesenc_epi128, reg) -#define AVX__AES_ENC_LAST( reg, ii) MM_OP_key (_mm256_aesenclast_epi128, reg) -#define AVX__AES_XOR( reg, ii) MM_OP_key (_mm256_xor_si256, reg) - -#define CTR_START(reg, ii) MM_OP (_mm_add_epi64, ctr, one); reg = ctr; -#define CTR_END( reg, ii) MM_XOR (data[ii], reg); - -#define AVX__CTR_START(reg, ii) MM_OP (_mm256_add_epi64, ctr2, two); reg = _mm256_xor_si256(ctr2, key); -#define AVX__CTR_END( reg, ii) AVX_XOR (((__m256i *)(void *)data)[ii], reg); - -#define WOP_KEY(op, n) { \ - const __m128i key = w[n]; \ - WOP(op); } - -#define AVX__WOP_KEY(op, n) { \ - const __m256i key = w[n]; \ - WOP(op); } - - -#define WIDE_LOOP_START \ - dataEnd = data + numBlocks; \ - if (numBlocks >= NUM_WAYS) \ - { dataEnd -= NUM_WAYS; do { \ - - -#define WIDE_LOOP_END \ - data += NUM_WAYS; \ - } while (data <= dataEnd); \ - dataEnd += NUM_WAYS; } \ - - -#define SINGLE_LOOP \ - for (; data < dataEnd; data++) - - -#define NUM_AES_KEYS_MAX 15 - -#define WIDE_LOOP_START_AVX(OP) \ - dataEnd = data + numBlocks; \ - if (numBlocks >= NUM_WAYS * 2) \ - { __m256i keys[NUM_AES_KEYS_MAX]; \ - UInt32 ii; \ - OP \ - for (ii = 0; ii < numRounds; ii++) \ - keys[ii] = _mm256_broadcastsi128_si256(p[ii]); \ - dataEnd -= NUM_WAYS * 2; do { \ - - -#define WIDE_LOOP_END_AVX(OP) \ - data += NUM_WAYS * 2; \ - } while (data <= dataEnd); \ - dataEnd += NUM_WAYS * 2; \ - OP \ - _mm256_zeroupper(); \ - } \ - -/* MSVC for x86: If we don't call _mm256_zeroupper(), and -arch:IA32 is not specified, - MSVC still can insert vzeroupper instruction. */ - - -AES_FUNC_START2 (AesCbc_Decode_HW) -{ - __m128i iv = *p; - const __m128i *wStart = p + *(const UInt32 *)(p + 1) * 2 + 2 - 1; - const __m128i *dataEnd; - p += 2; - - WIDE_LOOP_START - { - const __m128i *w = wStart; - - WOP (DECLARE_VAR) - WOP (LOAD_data); - WOP_KEY (AES_XOR, 1) - - do - { - WOP_KEY (AES_DEC, 0) - w--; - } - while (w != p); - WOP_KEY (AES_DEC_LAST, 0) - - MM_XOR (m0, iv); - WOP_M1 (XOR_data_M1) - iv = data[NUM_WAYS - 1]; - WOP (STORE_data); - } - WIDE_LOOP_END - - SINGLE_LOOP - { - const __m128i *w = wStart - 1; - __m128i m = _mm_xor_si128 (w[2], *data); - do - { - MM_OP_m (_mm_aesdec_si128, w[1]); - MM_OP_m (_mm_aesdec_si128, w[0]); - w -= 2; - } - while (w != p); - MM_OP_m (_mm_aesdec_si128, w[1]); - MM_OP_m (_mm_aesdeclast_si128, w[0]); - - MM_XOR (m, iv); - iv = *data; - *data = m; - } - - p[-2] = iv; -} - - -AES_FUNC_START2 (AesCtr_Code_HW) -{ - __m128i ctr = *p; - UInt32 numRoundsMinus2 = *(const UInt32 *)(p + 1) * 2 - 1; - const __m128i *dataEnd; - __m128i one = _mm_cvtsi32_si128(1); - - p += 2; - - WIDE_LOOP_START - { - const __m128i *w = p; - UInt32 r = numRoundsMinus2; - WOP (DECLARE_VAR) - WOP (CTR_START); - WOP_KEY (AES_XOR, 0) - w += 1; - do - { - WOP_KEY (AES_ENC, 0) - w += 1; - } - while (--r); - WOP_KEY (AES_ENC_LAST, 0) - - WOP (CTR_END); - } - WIDE_LOOP_END - - SINGLE_LOOP - { - UInt32 numRounds2 = *(const UInt32 *)(p - 2 + 1) - 1; - const __m128i *w = p; - __m128i m; - MM_OP (_mm_add_epi64, ctr, one); - m = _mm_xor_si128 (ctr, p[0]); - w += 1; - do - { - MM_OP_m (_mm_aesenc_si128, w[0]); - MM_OP_m (_mm_aesenc_si128, w[1]); - w += 2; - } - while (--numRounds2); - MM_OP_m (_mm_aesenc_si128, w[0]); - MM_OP_m (_mm_aesenclast_si128, w[1]); - MM_XOR (*data, m); - } - - p[-2] = ctr; -} - - - -#ifdef USE_INTEL_VAES - -#if defined(__clang__) && defined(_MSC_VER) -#define __SSE4_2__ -#define __AES__ -#define __AVX__ -#define __AVX2__ -#define __VAES__ -#define __AVX512F__ -#define __AVX512VL__ -#endif - -#include - -#define VAES_FUNC_START2(name) \ -AES_FUNC_START (name); \ -ATTRIB_VAES \ -AES_FUNC_START (name) - -VAES_FUNC_START2 (AesCbc_Decode_HW_256) -{ - __m128i iv = *p; - const __m128i *dataEnd; - UInt32 numRounds = *(const UInt32 *)(p + 1) * 2 + 1; - p += 2; - - WIDE_LOOP_START_AVX(;) - { - const __m256i *w = keys + numRounds - 2; - - WOP (AVX__DECLARE_VAR) - WOP (AVX__LOAD_data); - AVX__WOP_KEY (AVX__AES_XOR, 1) - - do - { - AVX__WOP_KEY (AVX__AES_DEC, 0) - w--; - } - while (w != keys); - AVX__WOP_KEY (AVX__AES_DEC_LAST, 0) - - AVX_XOR (m0, _mm256_setr_m128i(iv, data[0])); - WOP_M1 (AVX__XOR_data_M1) - iv = data[NUM_WAYS * 2 - 1]; - WOP (AVX__STORE_data); - } - WIDE_LOOP_END_AVX(;) - - SINGLE_LOOP - { - const __m128i *w = p + *(const UInt32 *)(p + 1 - 2) * 2 + 1 - 3; - __m128i m = _mm_xor_si128 (w[2], *data); - do - { - MM_OP_m (_mm_aesdec_si128, w[1]); - MM_OP_m (_mm_aesdec_si128, w[0]); - w -= 2; - } - while (w != p); - MM_OP_m (_mm_aesdec_si128, w[1]); - MM_OP_m (_mm_aesdeclast_si128, w[0]); - - MM_XOR (m, iv); - iv = *data; - *data = m; - } - - p[-2] = iv; -} - - -/* -SSE2: _mm_cvtsi32_si128 : movd -AVX: _mm256_setr_m128i : vinsertf128 -AVX2: _mm256_add_epi64 : vpaddq ymm, ymm, ymm - _mm256_extracti128_si256 : vextracti128 - _mm256_broadcastsi128_si256 : vbroadcasti128 -*/ - -#define AVX__CTR_LOOP_START \ - ctr2 = _mm256_setr_m128i(_mm_sub_epi64(ctr, one), ctr); \ - two = _mm256_setr_m128i(one, one); \ - two = _mm256_add_epi64(two, two); \ - -// two = _mm256_setr_epi64x(2, 0, 2, 0); - -#define AVX__CTR_LOOP_ENC \ - ctr = _mm256_extracti128_si256 (ctr2, 1); \ - -VAES_FUNC_START2 (AesCtr_Code_HW_256) -{ - __m128i ctr = *p; - UInt32 numRounds = *(const UInt32 *)(p + 1) * 2 + 1; - const __m128i *dataEnd; - __m128i one = _mm_cvtsi32_si128(1); - __m256i ctr2, two; - p += 2; - - WIDE_LOOP_START_AVX (AVX__CTR_LOOP_START) - { - const __m256i *w = keys; - UInt32 r = numRounds - 2; - WOP (AVX__DECLARE_VAR) - AVX__WOP_KEY (AVX__CTR_START, 0); - - w += 1; - do - { - AVX__WOP_KEY (AVX__AES_ENC, 0) - w += 1; - } - while (--r); - AVX__WOP_KEY (AVX__AES_ENC_LAST, 0) - - WOP (AVX__CTR_END); - } - WIDE_LOOP_END_AVX (AVX__CTR_LOOP_ENC) - - SINGLE_LOOP - { - UInt32 numRounds2 = *(const UInt32 *)(p - 2 + 1) - 1; - const __m128i *w = p; - __m128i m; - MM_OP (_mm_add_epi64, ctr, one); - m = _mm_xor_si128 (ctr, p[0]); - w += 1; - do - { - MM_OP_m (_mm_aesenc_si128, w[0]); - MM_OP_m (_mm_aesenc_si128, w[1]); - w += 2; - } - while (--numRounds2); - MM_OP_m (_mm_aesenc_si128, w[0]); - MM_OP_m (_mm_aesenclast_si128, w[1]); - MM_XOR (*data, m); - } - - p[-2] = ctr; -} - -#endif // USE_INTEL_VAES - -#else // USE_INTEL_AES - -/* no USE_INTEL_AES */ - -#pragma message("AES HW_SW stub was used") - -#define AES_TYPE_keys UInt32 -#define AES_TYPE_data Byte - -#define AES_FUNC_START(name) \ - void MY_FAST_CALL name(UInt32 *p, Byte *data, size_t numBlocks) \ - -#define AES_COMPAT_STUB(name) \ - AES_FUNC_START(name); \ - AES_FUNC_START(name ## _HW) \ - { name(p, data, numBlocks); } - -AES_COMPAT_STUB (AesCbc_Encode) -AES_COMPAT_STUB (AesCbc_Decode) -AES_COMPAT_STUB (AesCtr_Code) - -#endif // USE_INTEL_AES - - -#ifndef USE_INTEL_VAES - -#pragma message("VAES HW_SW stub was used") - -#define VAES_COMPAT_STUB(name) \ - void MY_FAST_CALL name ## _256(UInt32 *p, Byte *data, size_t numBlocks); \ - void MY_FAST_CALL name ## _256(UInt32 *p, Byte *data, size_t numBlocks) \ - { name((AES_TYPE_keys *)(void *)p, (AES_TYPE_data *)(void *)data, numBlocks); } - -VAES_COMPAT_STUB (AesCbc_Decode_HW) -VAES_COMPAT_STUB (AesCtr_Code_HW) - -#endif // ! USE_INTEL_VAES - - -#elif defined(MY_CPU_ARM_OR_ARM64) && defined(MY_CPU_LE) - - #if defined(__clang__) - #if (__clang_major__ >= 8) // fix that check - #define USE_HW_AES - #endif - #elif defined(__GNUC__) - #if (__GNUC__ >= 6) // fix that check - #define USE_HW_AES - #endif - #elif defined(_MSC_VER) - #if _MSC_VER >= 1910 - #define USE_HW_AES - #endif - #endif - -#ifdef USE_HW_AES - -// #pragma message("=== AES HW === ") - -#if defined(__clang__) || defined(__GNUC__) - #ifdef MY_CPU_ARM64 - #define ATTRIB_AES __attribute__((__target__("+crypto"))) - #else - #define ATTRIB_AES __attribute__((__target__("fpu=crypto-neon-fp-armv8"))) - #endif -#else - // _MSC_VER - // for arm32 - #define _ARM_USE_NEW_NEON_INTRINSICS -#endif - -#ifndef ATTRIB_AES - #define ATTRIB_AES -#endif - -#if defined(_MSC_VER) && defined(MY_CPU_ARM64) -#include -#else -#include -#endif - -typedef uint8x16_t v128; - -#define AES_FUNC_START(name) \ - void MY_FAST_CALL name(v128 *p, v128 *data, size_t numBlocks) - -#define AES_FUNC_START2(name) \ -AES_FUNC_START (name); \ -ATTRIB_AES \ -AES_FUNC_START (name) - -#define MM_OP(op, dest, src) dest = op(dest, src); -#define MM_OP_m(op, src) MM_OP(op, m, src); -#define MM_OP1_m(op) m = op(m); - -#define MM_XOR( dest, src) MM_OP(veorq_u8, dest, src); -#define MM_XOR_m( src) MM_XOR(m, src); - -#define AES_E_m(k) MM_OP_m (vaeseq_u8, k); -#define AES_E_MC_m(k) AES_E_m (k); MM_OP1_m(vaesmcq_u8); - - -AES_FUNC_START2 (AesCbc_Encode_HW) -{ - v128 m = *p; - const v128 k0 = p[2]; - const v128 k1 = p[3]; - const v128 k2 = p[4]; - const v128 k3 = p[5]; - const v128 k4 = p[6]; - const v128 k5 = p[7]; - const v128 k6 = p[8]; - const v128 k7 = p[9]; - const v128 k8 = p[10]; - const v128 k9 = p[11]; - const UInt32 numRounds2 = *(const UInt32 *)(p + 1); - const v128 *w = p + ((size_t)numRounds2 * 2); - const v128 k_z1 = w[1]; - const v128 k_z0 = w[2]; - for (; numBlocks != 0; numBlocks--, data++) - { - MM_XOR_m (*data); - AES_E_MC_m (k0) - AES_E_MC_m (k1) - AES_E_MC_m (k2) - AES_E_MC_m (k3) - AES_E_MC_m (k4) - AES_E_MC_m (k5) - AES_E_MC_m (k6) - AES_E_MC_m (k7) - AES_E_MC_m (k8) - if (numRounds2 >= 6) - { - AES_E_MC_m (k9) - AES_E_MC_m (p[12]) - if (numRounds2 != 6) - { - AES_E_MC_m (p[13]) - AES_E_MC_m (p[14]) - } - } - AES_E_m (k_z1); - MM_XOR_m (k_z0); - *data = m; - } - *p = m; -} - - -#define WOP_1(op) -#define WOP_2(op) WOP_1 (op) op (m1, 1); -#define WOP_3(op) WOP_2 (op) op (m2, 2); -#define WOP_4(op) WOP_3 (op) op (m3, 3); -#define WOP_5(op) WOP_4 (op) op (m4, 4); -#define WOP_6(op) WOP_5 (op) op (m5, 5); -#define WOP_7(op) WOP_6 (op) op (m6, 6); -#define WOP_8(op) WOP_7 (op) op (m7, 7); - - #define NUM_WAYS 8 - #define WOP_M1 WOP_8 - -#define WOP(op) op (m0, 0); WOP_M1(op) - -#define DECLARE_VAR(reg, ii) v128 reg -#define LOAD_data( reg, ii) reg = data[ii]; -#define STORE_data( reg, ii) data[ii] = reg; -#if (NUM_WAYS > 1) -#define XOR_data_M1(reg, ii) MM_XOR (reg, data[ii- 1]); -#endif - -#define MM_OP_key(op, reg) MM_OP (op, reg, key); - -#define AES_D_m(k) MM_OP_m (vaesdq_u8, k); -#define AES_D_IMC_m(k) AES_D_m (k); MM_OP1_m (vaesimcq_u8); - -#define AES_XOR( reg, ii) MM_OP_key (veorq_u8, reg) -#define AES_D( reg, ii) MM_OP_key (vaesdq_u8, reg) -#define AES_E( reg, ii) MM_OP_key (vaeseq_u8, reg) - -#define AES_D_IMC( reg, ii) AES_D (reg, ii); reg = vaesimcq_u8(reg) -#define AES_E_MC( reg, ii) AES_E (reg, ii); reg = vaesmcq_u8(reg) - -#define CTR_START(reg, ii) MM_OP (vaddq_u64, ctr, one); reg = vreinterpretq_u8_u64(ctr); -#define CTR_END( reg, ii) MM_XOR (data[ii], reg); - -#define WOP_KEY(op, n) { \ - const v128 key = w[n]; \ - WOP(op); } - -#define WIDE_LOOP_START \ - dataEnd = data + numBlocks; \ - if (numBlocks >= NUM_WAYS) \ - { dataEnd -= NUM_WAYS; do { \ - -#define WIDE_LOOP_END \ - data += NUM_WAYS; \ - } while (data <= dataEnd); \ - dataEnd += NUM_WAYS; } \ - -#define SINGLE_LOOP \ - for (; data < dataEnd; data++) - - -AES_FUNC_START2 (AesCbc_Decode_HW) -{ - v128 iv = *p; - const v128 *wStart = p + ((size_t)*(const UInt32 *)(p + 1)) * 2; - const v128 *dataEnd; - p += 2; - - WIDE_LOOP_START - { - const v128 *w = wStart; - WOP (DECLARE_VAR) - WOP (LOAD_data); - WOP_KEY (AES_D_IMC, 2) - do - { - WOP_KEY (AES_D_IMC, 1) - WOP_KEY (AES_D_IMC, 0) - w -= 2; - } - while (w != p); - WOP_KEY (AES_D, 1) - WOP_KEY (AES_XOR, 0) - MM_XOR (m0, iv); - WOP_M1 (XOR_data_M1) - iv = data[NUM_WAYS - 1]; - WOP (STORE_data); - } - WIDE_LOOP_END - - SINGLE_LOOP - { - const v128 *w = wStart; - v128 m = *data; - AES_D_IMC_m (w[2]) - do - { - AES_D_IMC_m (w[1]); - AES_D_IMC_m (w[0]); - w -= 2; - } - while (w != p); - AES_D_m (w[1]); - MM_XOR_m (w[0]); - MM_XOR_m (iv); - iv = *data; - *data = m; - } - - p[-2] = iv; -} - - -AES_FUNC_START2 (AesCtr_Code_HW) -{ - uint64x2_t ctr = vreinterpretq_u64_u8(*p); - const v128 *wEnd = p + ((size_t)*(const UInt32 *)(p + 1)) * 2; - const v128 *dataEnd; - uint64x2_t one = vdupq_n_u64(0); - one = vsetq_lane_u64(1, one, 0); - p += 2; - - WIDE_LOOP_START - { - const v128 *w = p; - WOP (DECLARE_VAR) - WOP (CTR_START); - do - { - WOP_KEY (AES_E_MC, 0) - WOP_KEY (AES_E_MC, 1) - w += 2; - } - while (w != wEnd); - WOP_KEY (AES_E_MC, 0) - WOP_KEY (AES_E, 1) - WOP_KEY (AES_XOR, 2) - WOP (CTR_END); - } - WIDE_LOOP_END - - SINGLE_LOOP - { - const v128 *w = p; - v128 m; - CTR_START (m, 0); - do - { - AES_E_MC_m (w[0]); - AES_E_MC_m (w[1]); - w += 2; - } - while (w != wEnd); - AES_E_MC_m (w[0]); - AES_E_m (w[1]); - MM_XOR_m (w[2]); - CTR_END (m, 0); - } - - p[-2] = vreinterpretq_u8_u64(ctr); -} - -#endif // USE_HW_AES - -#endif // MY_CPU_ARM_OR_ARM64 +/* AesOpt.c -- AES optimized code for x86 AES hardware instructions +2021-04-01 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "CpuArch.h" + +#ifdef MY_CPU_X86_OR_AMD64 + + #if defined(__clang__) + #if __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 8) + #define USE_INTEL_AES + #define ATTRIB_AES __attribute__((__target__("aes"))) + #if (__clang_major__ >= 8) + #define USE_INTEL_VAES + #define ATTRIB_VAES __attribute__((__target__("aes,vaes,avx2"))) + #endif + #endif + #elif defined(__GNUC__) + #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) + #define USE_INTEL_AES + #ifndef __AES__ + #define ATTRIB_AES __attribute__((__target__("aes"))) + #endif + #if (__GNUC__ >= 8) + #define USE_INTEL_VAES + #define ATTRIB_VAES __attribute__((__target__("aes,vaes,avx2"))) + #endif + #endif + #elif defined(__INTEL_COMPILER) + #if (__INTEL_COMPILER >= 1110) + #define USE_INTEL_AES + #if (__INTEL_COMPILER >= 1900) + #define USE_INTEL_VAES + #endif + #endif + #elif defined(_MSC_VER) + #if (_MSC_VER > 1500) || (_MSC_FULL_VER >= 150030729) + #define USE_INTEL_AES + #if (_MSC_VER >= 1910) + #define USE_INTEL_VAES + #endif + #endif + #endif + +#ifndef ATTRIB_AES + #define ATTRIB_AES +#endif +#ifndef ATTRIB_VAES + #define ATTRIB_VAES +#endif + + +#ifdef USE_INTEL_AES + +#include + +#ifndef USE_INTEL_VAES +#define AES_TYPE_keys __m128i +#define AES_TYPE_data __m128i +#endif + +#define AES_FUNC_START(name) \ + void MY_FAST_CALL name(__m128i *p, __m128i *data, size_t numBlocks) + +#define AES_FUNC_START2(name) \ +AES_FUNC_START (name); \ +ATTRIB_AES \ +AES_FUNC_START (name) + +#define MM_OP(op, dest, src) dest = op(dest, src); +#define MM_OP_m(op, src) MM_OP(op, m, src); + +#define MM_XOR( dest, src) MM_OP(_mm_xor_si128, dest, src); +#define AVX_XOR(dest, src) MM_OP(_mm256_xor_si256, dest, src); + + +AES_FUNC_START2 (AesCbc_Encode_HW) +{ + __m128i m = *p; + const __m128i k0 = p[2]; + const __m128i k1 = p[3]; + const UInt32 numRounds2 = *(const UInt32 *)(p + 1) - 1; + for (; numBlocks != 0; numBlocks--, data++) + { + UInt32 r = numRounds2; + const __m128i *w = p + 4; + __m128i temp = *data; + MM_XOR (temp, k0); + MM_XOR (m, temp); + MM_OP_m (_mm_aesenc_si128, k1); + do + { + MM_OP_m (_mm_aesenc_si128, w[0]); + MM_OP_m (_mm_aesenc_si128, w[1]); + w += 2; + } + while (--r); + MM_OP_m (_mm_aesenclast_si128, w[0]); + *data = m; + } + *p = m; +} + + +#define WOP_1(op) +#define WOP_2(op) WOP_1 (op) op (m1, 1); +#define WOP_3(op) WOP_2 (op) op (m2, 2); +#define WOP_4(op) WOP_3 (op) op (m3, 3); +#ifdef MY_CPU_AMD64 +#define WOP_5(op) WOP_4 (op) op (m4, 4); +#define WOP_6(op) WOP_5 (op) op (m5, 5); +#define WOP_7(op) WOP_6 (op) op (m6, 6); +#define WOP_8(op) WOP_7 (op) op (m7, 7); +#endif +/* +#define WOP_9(op) WOP_8 (op) op (m8, 8); +#define WOP_10(op) WOP_9 (op) op (m9, 9); +#define WOP_11(op) WOP_10(op) op (m10, 10); +#define WOP_12(op) WOP_11(op) op (m11, 11); +#define WOP_13(op) WOP_12(op) op (m12, 12); +#define WOP_14(op) WOP_13(op) op (m13, 13); +*/ + +#ifdef MY_CPU_AMD64 + #define NUM_WAYS 8 + #define WOP_M1 WOP_8 +#else + #define NUM_WAYS 4 + #define WOP_M1 WOP_4 +#endif + +#define WOP(op) op (m0, 0); WOP_M1(op) + + +#define DECLARE_VAR(reg, ii) __m128i reg +#define LOAD_data( reg, ii) reg = data[ii]; +#define STORE_data( reg, ii) data[ii] = reg; +#if (NUM_WAYS > 1) +#define XOR_data_M1(reg, ii) MM_XOR (reg, data[ii- 1]); +#endif + +#define AVX__DECLARE_VAR(reg, ii) __m256i reg +#define AVX__LOAD_data( reg, ii) reg = ((const __m256i *)(const void *)data)[ii]; +#define AVX__STORE_data( reg, ii) ((__m256i *)(void *)data)[ii] = reg; +#define AVX__XOR_data_M1(reg, ii) AVX_XOR (reg, (((const __m256i *)(const void *)(data - 1))[ii])); + +#define MM_OP_key(op, reg) MM_OP(op, reg, key); + +#define AES_DEC( reg, ii) MM_OP_key (_mm_aesdec_si128, reg) +#define AES_DEC_LAST( reg, ii) MM_OP_key (_mm_aesdeclast_si128, reg) +#define AES_ENC( reg, ii) MM_OP_key (_mm_aesenc_si128, reg) +#define AES_ENC_LAST( reg, ii) MM_OP_key (_mm_aesenclast_si128, reg) +#define AES_XOR( reg, ii) MM_OP_key (_mm_xor_si128, reg) + + +#define AVX__AES_DEC( reg, ii) MM_OP_key (_mm256_aesdec_epi128, reg) +#define AVX__AES_DEC_LAST( reg, ii) MM_OP_key (_mm256_aesdeclast_epi128, reg) +#define AVX__AES_ENC( reg, ii) MM_OP_key (_mm256_aesenc_epi128, reg) +#define AVX__AES_ENC_LAST( reg, ii) MM_OP_key (_mm256_aesenclast_epi128, reg) +#define AVX__AES_XOR( reg, ii) MM_OP_key (_mm256_xor_si256, reg) + +#define CTR_START(reg, ii) MM_OP (_mm_add_epi64, ctr, one); reg = ctr; +#define CTR_END( reg, ii) MM_XOR (data[ii], reg); + +#define AVX__CTR_START(reg, ii) MM_OP (_mm256_add_epi64, ctr2, two); reg = _mm256_xor_si256(ctr2, key); +#define AVX__CTR_END( reg, ii) AVX_XOR (((__m256i *)(void *)data)[ii], reg); + +#define WOP_KEY(op, n) { \ + const __m128i key = w[n]; \ + WOP(op); } + +#define AVX__WOP_KEY(op, n) { \ + const __m256i key = w[n]; \ + WOP(op); } + + +#define WIDE_LOOP_START \ + dataEnd = data + numBlocks; \ + if (numBlocks >= NUM_WAYS) \ + { dataEnd -= NUM_WAYS; do { \ + + +#define WIDE_LOOP_END \ + data += NUM_WAYS; \ + } while (data <= dataEnd); \ + dataEnd += NUM_WAYS; } \ + + +#define SINGLE_LOOP \ + for (; data < dataEnd; data++) + + +#define NUM_AES_KEYS_MAX 15 + +#define WIDE_LOOP_START_AVX(OP) \ + dataEnd = data + numBlocks; \ + if (numBlocks >= NUM_WAYS * 2) \ + { __m256i keys[NUM_AES_KEYS_MAX]; \ + UInt32 ii; \ + OP \ + for (ii = 0; ii < numRounds; ii++) \ + keys[ii] = _mm256_broadcastsi128_si256(p[ii]); \ + dataEnd -= NUM_WAYS * 2; do { \ + + +#define WIDE_LOOP_END_AVX(OP) \ + data += NUM_WAYS * 2; \ + } while (data <= dataEnd); \ + dataEnd += NUM_WAYS * 2; \ + OP \ + _mm256_zeroupper(); \ + } \ + +/* MSVC for x86: If we don't call _mm256_zeroupper(), and -arch:IA32 is not specified, + MSVC still can insert vzeroupper instruction. */ + + +AES_FUNC_START2 (AesCbc_Decode_HW) +{ + __m128i iv = *p; + const __m128i *wStart = p + *(const UInt32 *)(p + 1) * 2 + 2 - 1; + const __m128i *dataEnd; + p += 2; + + WIDE_LOOP_START + { + const __m128i *w = wStart; + + WOP (DECLARE_VAR) + WOP (LOAD_data); + WOP_KEY (AES_XOR, 1) + + do + { + WOP_KEY (AES_DEC, 0) + w--; + } + while (w != p); + WOP_KEY (AES_DEC_LAST, 0) + + MM_XOR (m0, iv); + WOP_M1 (XOR_data_M1) + iv = data[NUM_WAYS - 1]; + WOP (STORE_data); + } + WIDE_LOOP_END + + SINGLE_LOOP + { + const __m128i *w = wStart - 1; + __m128i m = _mm_xor_si128 (w[2], *data); + do + { + MM_OP_m (_mm_aesdec_si128, w[1]); + MM_OP_m (_mm_aesdec_si128, w[0]); + w -= 2; + } + while (w != p); + MM_OP_m (_mm_aesdec_si128, w[1]); + MM_OP_m (_mm_aesdeclast_si128, w[0]); + + MM_XOR (m, iv); + iv = *data; + *data = m; + } + + p[-2] = iv; +} + + +AES_FUNC_START2 (AesCtr_Code_HW) +{ + __m128i ctr = *p; + UInt32 numRoundsMinus2 = *(const UInt32 *)(p + 1) * 2 - 1; + const __m128i *dataEnd; + __m128i one = _mm_cvtsi32_si128(1); + + p += 2; + + WIDE_LOOP_START + { + const __m128i *w = p; + UInt32 r = numRoundsMinus2; + WOP (DECLARE_VAR) + WOP (CTR_START); + WOP_KEY (AES_XOR, 0) + w += 1; + do + { + WOP_KEY (AES_ENC, 0) + w += 1; + } + while (--r); + WOP_KEY (AES_ENC_LAST, 0) + + WOP (CTR_END); + } + WIDE_LOOP_END + + SINGLE_LOOP + { + UInt32 numRounds2 = *(const UInt32 *)(p - 2 + 1) - 1; + const __m128i *w = p; + __m128i m; + MM_OP (_mm_add_epi64, ctr, one); + m = _mm_xor_si128 (ctr, p[0]); + w += 1; + do + { + MM_OP_m (_mm_aesenc_si128, w[0]); + MM_OP_m (_mm_aesenc_si128, w[1]); + w += 2; + } + while (--numRounds2); + MM_OP_m (_mm_aesenc_si128, w[0]); + MM_OP_m (_mm_aesenclast_si128, w[1]); + MM_XOR (*data, m); + } + + p[-2] = ctr; +} + + + +#ifdef USE_INTEL_VAES + +#if defined(__clang__) && defined(_MSC_VER) +#define __SSE4_2__ +#define __AES__ +#define __AVX__ +#define __AVX2__ +#define __VAES__ +#define __AVX512F__ +#define __AVX512VL__ +#endif + +#include + +#define VAES_FUNC_START2(name) \ +AES_FUNC_START (name); \ +ATTRIB_VAES \ +AES_FUNC_START (name) + +VAES_FUNC_START2 (AesCbc_Decode_HW_256) +{ + __m128i iv = *p; + const __m128i *dataEnd; + UInt32 numRounds = *(const UInt32 *)(p + 1) * 2 + 1; + p += 2; + + WIDE_LOOP_START_AVX(;) + { + const __m256i *w = keys + numRounds - 2; + + WOP (AVX__DECLARE_VAR) + WOP (AVX__LOAD_data); + AVX__WOP_KEY (AVX__AES_XOR, 1) + + do + { + AVX__WOP_KEY (AVX__AES_DEC, 0) + w--; + } + while (w != keys); + AVX__WOP_KEY (AVX__AES_DEC_LAST, 0) + + AVX_XOR (m0, _mm256_setr_m128i(iv, data[0])); + WOP_M1 (AVX__XOR_data_M1) + iv = data[NUM_WAYS * 2 - 1]; + WOP (AVX__STORE_data); + } + WIDE_LOOP_END_AVX(;) + + SINGLE_LOOP + { + const __m128i *w = p + *(const UInt32 *)(p + 1 - 2) * 2 + 1 - 3; + __m128i m = _mm_xor_si128 (w[2], *data); + do + { + MM_OP_m (_mm_aesdec_si128, w[1]); + MM_OP_m (_mm_aesdec_si128, w[0]); + w -= 2; + } + while (w != p); + MM_OP_m (_mm_aesdec_si128, w[1]); + MM_OP_m (_mm_aesdeclast_si128, w[0]); + + MM_XOR (m, iv); + iv = *data; + *data = m; + } + + p[-2] = iv; +} + + +/* +SSE2: _mm_cvtsi32_si128 : movd +AVX: _mm256_setr_m128i : vinsertf128 +AVX2: _mm256_add_epi64 : vpaddq ymm, ymm, ymm + _mm256_extracti128_si256 : vextracti128 + _mm256_broadcastsi128_si256 : vbroadcasti128 +*/ + +#define AVX__CTR_LOOP_START \ + ctr2 = _mm256_setr_m128i(_mm_sub_epi64(ctr, one), ctr); \ + two = _mm256_setr_m128i(one, one); \ + two = _mm256_add_epi64(two, two); \ + +// two = _mm256_setr_epi64x(2, 0, 2, 0); + +#define AVX__CTR_LOOP_ENC \ + ctr = _mm256_extracti128_si256 (ctr2, 1); \ + +VAES_FUNC_START2 (AesCtr_Code_HW_256) +{ + __m128i ctr = *p; + UInt32 numRounds = *(const UInt32 *)(p + 1) * 2 + 1; + const __m128i *dataEnd; + __m128i one = _mm_cvtsi32_si128(1); + __m256i ctr2, two; + p += 2; + + WIDE_LOOP_START_AVX (AVX__CTR_LOOP_START) + { + const __m256i *w = keys; + UInt32 r = numRounds - 2; + WOP (AVX__DECLARE_VAR) + AVX__WOP_KEY (AVX__CTR_START, 0); + + w += 1; + do + { + AVX__WOP_KEY (AVX__AES_ENC, 0) + w += 1; + } + while (--r); + AVX__WOP_KEY (AVX__AES_ENC_LAST, 0) + + WOP (AVX__CTR_END); + } + WIDE_LOOP_END_AVX (AVX__CTR_LOOP_ENC) + + SINGLE_LOOP + { + UInt32 numRounds2 = *(const UInt32 *)(p - 2 + 1) - 1; + const __m128i *w = p; + __m128i m; + MM_OP (_mm_add_epi64, ctr, one); + m = _mm_xor_si128 (ctr, p[0]); + w += 1; + do + { + MM_OP_m (_mm_aesenc_si128, w[0]); + MM_OP_m (_mm_aesenc_si128, w[1]); + w += 2; + } + while (--numRounds2); + MM_OP_m (_mm_aesenc_si128, w[0]); + MM_OP_m (_mm_aesenclast_si128, w[1]); + MM_XOR (*data, m); + } + + p[-2] = ctr; +} + +#endif // USE_INTEL_VAES + +#else // USE_INTEL_AES + +/* no USE_INTEL_AES */ + +#pragma message("AES HW_SW stub was used") + +#define AES_TYPE_keys UInt32 +#define AES_TYPE_data Byte + +#define AES_FUNC_START(name) \ + void MY_FAST_CALL name(UInt32 *p, Byte *data, size_t numBlocks) \ + +#define AES_COMPAT_STUB(name) \ + AES_FUNC_START(name); \ + AES_FUNC_START(name ## _HW) \ + { name(p, data, numBlocks); } + +AES_COMPAT_STUB (AesCbc_Encode) +AES_COMPAT_STUB (AesCbc_Decode) +AES_COMPAT_STUB (AesCtr_Code) + +#endif // USE_INTEL_AES + + +#ifndef USE_INTEL_VAES + +#pragma message("VAES HW_SW stub was used") + +#define VAES_COMPAT_STUB(name) \ + void MY_FAST_CALL name ## _256(UInt32 *p, Byte *data, size_t numBlocks); \ + void MY_FAST_CALL name ## _256(UInt32 *p, Byte *data, size_t numBlocks) \ + { name((AES_TYPE_keys *)(void *)p, (AES_TYPE_data *)(void *)data, numBlocks); } + +VAES_COMPAT_STUB (AesCbc_Decode_HW) +VAES_COMPAT_STUB (AesCtr_Code_HW) + +#endif // ! USE_INTEL_VAES + + +#elif defined(MY_CPU_ARM_OR_ARM64) && defined(MY_CPU_LE) + + #if defined(__clang__) + #if (__clang_major__ >= 8) // fix that check + #define USE_HW_AES + #endif + #elif defined(__GNUC__) + #if (__GNUC__ >= 6) // fix that check + #define USE_HW_AES + #endif + #elif defined(_MSC_VER) + #if _MSC_VER >= 1910 + #define USE_HW_AES + #endif + #endif + +#ifdef USE_HW_AES + +// #pragma message("=== AES HW === ") + +#if defined(__clang__) || defined(__GNUC__) + #ifdef MY_CPU_ARM64 + #define ATTRIB_AES __attribute__((__target__("+crypto"))) + #else + #define ATTRIB_AES __attribute__((__target__("fpu=crypto-neon-fp-armv8"))) + #endif +#else + // _MSC_VER + // for arm32 + #define _ARM_USE_NEW_NEON_INTRINSICS +#endif + +#ifndef ATTRIB_AES + #define ATTRIB_AES +#endif + +#if defined(_MSC_VER) && defined(MY_CPU_ARM64) +#include +#else +#include +#endif + +typedef uint8x16_t v128; + +#define AES_FUNC_START(name) \ + void MY_FAST_CALL name(v128 *p, v128 *data, size_t numBlocks) + +#define AES_FUNC_START2(name) \ +AES_FUNC_START (name); \ +ATTRIB_AES \ +AES_FUNC_START (name) + +#define MM_OP(op, dest, src) dest = op(dest, src); +#define MM_OP_m(op, src) MM_OP(op, m, src); +#define MM_OP1_m(op) m = op(m); + +#define MM_XOR( dest, src) MM_OP(veorq_u8, dest, src); +#define MM_XOR_m( src) MM_XOR(m, src); + +#define AES_E_m(k) MM_OP_m (vaeseq_u8, k); +#define AES_E_MC_m(k) AES_E_m (k); MM_OP1_m(vaesmcq_u8); + + +AES_FUNC_START2 (AesCbc_Encode_HW) +{ + v128 m = *p; + const v128 k0 = p[2]; + const v128 k1 = p[3]; + const v128 k2 = p[4]; + const v128 k3 = p[5]; + const v128 k4 = p[6]; + const v128 k5 = p[7]; + const v128 k6 = p[8]; + const v128 k7 = p[9]; + const v128 k8 = p[10]; + const v128 k9 = p[11]; + const UInt32 numRounds2 = *(const UInt32 *)(p + 1); + const v128 *w = p + ((size_t)numRounds2 * 2); + const v128 k_z1 = w[1]; + const v128 k_z0 = w[2]; + for (; numBlocks != 0; numBlocks--, data++) + { + MM_XOR_m (*data); + AES_E_MC_m (k0) + AES_E_MC_m (k1) + AES_E_MC_m (k2) + AES_E_MC_m (k3) + AES_E_MC_m (k4) + AES_E_MC_m (k5) + AES_E_MC_m (k6) + AES_E_MC_m (k7) + AES_E_MC_m (k8) + if (numRounds2 >= 6) + { + AES_E_MC_m (k9) + AES_E_MC_m (p[12]) + if (numRounds2 != 6) + { + AES_E_MC_m (p[13]) + AES_E_MC_m (p[14]) + } + } + AES_E_m (k_z1); + MM_XOR_m (k_z0); + *data = m; + } + *p = m; +} + + +#define WOP_1(op) +#define WOP_2(op) WOP_1 (op) op (m1, 1); +#define WOP_3(op) WOP_2 (op) op (m2, 2); +#define WOP_4(op) WOP_3 (op) op (m3, 3); +#define WOP_5(op) WOP_4 (op) op (m4, 4); +#define WOP_6(op) WOP_5 (op) op (m5, 5); +#define WOP_7(op) WOP_6 (op) op (m6, 6); +#define WOP_8(op) WOP_7 (op) op (m7, 7); + + #define NUM_WAYS 8 + #define WOP_M1 WOP_8 + +#define WOP(op) op (m0, 0); WOP_M1(op) + +#define DECLARE_VAR(reg, ii) v128 reg +#define LOAD_data( reg, ii) reg = data[ii]; +#define STORE_data( reg, ii) data[ii] = reg; +#if (NUM_WAYS > 1) +#define XOR_data_M1(reg, ii) MM_XOR (reg, data[ii- 1]); +#endif + +#define MM_OP_key(op, reg) MM_OP (op, reg, key); + +#define AES_D_m(k) MM_OP_m (vaesdq_u8, k); +#define AES_D_IMC_m(k) AES_D_m (k); MM_OP1_m (vaesimcq_u8); + +#define AES_XOR( reg, ii) MM_OP_key (veorq_u8, reg) +#define AES_D( reg, ii) MM_OP_key (vaesdq_u8, reg) +#define AES_E( reg, ii) MM_OP_key (vaeseq_u8, reg) + +#define AES_D_IMC( reg, ii) AES_D (reg, ii); reg = vaesimcq_u8(reg) +#define AES_E_MC( reg, ii) AES_E (reg, ii); reg = vaesmcq_u8(reg) + +#define CTR_START(reg, ii) MM_OP (vaddq_u64, ctr, one); reg = vreinterpretq_u8_u64(ctr); +#define CTR_END( reg, ii) MM_XOR (data[ii], reg); + +#define WOP_KEY(op, n) { \ + const v128 key = w[n]; \ + WOP(op); } + +#define WIDE_LOOP_START \ + dataEnd = data + numBlocks; \ + if (numBlocks >= NUM_WAYS) \ + { dataEnd -= NUM_WAYS; do { \ + +#define WIDE_LOOP_END \ + data += NUM_WAYS; \ + } while (data <= dataEnd); \ + dataEnd += NUM_WAYS; } \ + +#define SINGLE_LOOP \ + for (; data < dataEnd; data++) + + +AES_FUNC_START2 (AesCbc_Decode_HW) +{ + v128 iv = *p; + const v128 *wStart = p + ((size_t)*(const UInt32 *)(p + 1)) * 2; + const v128 *dataEnd; + p += 2; + + WIDE_LOOP_START + { + const v128 *w = wStart; + WOP (DECLARE_VAR) + WOP (LOAD_data); + WOP_KEY (AES_D_IMC, 2) + do + { + WOP_KEY (AES_D_IMC, 1) + WOP_KEY (AES_D_IMC, 0) + w -= 2; + } + while (w != p); + WOP_KEY (AES_D, 1) + WOP_KEY (AES_XOR, 0) + MM_XOR (m0, iv); + WOP_M1 (XOR_data_M1) + iv = data[NUM_WAYS - 1]; + WOP (STORE_data); + } + WIDE_LOOP_END + + SINGLE_LOOP + { + const v128 *w = wStart; + v128 m = *data; + AES_D_IMC_m (w[2]) + do + { + AES_D_IMC_m (w[1]); + AES_D_IMC_m (w[0]); + w -= 2; + } + while (w != p); + AES_D_m (w[1]); + MM_XOR_m (w[0]); + MM_XOR_m (iv); + iv = *data; + *data = m; + } + + p[-2] = iv; +} + + +AES_FUNC_START2 (AesCtr_Code_HW) +{ + uint64x2_t ctr = vreinterpretq_u64_u8(*p); + const v128 *wEnd = p + ((size_t)*(const UInt32 *)(p + 1)) * 2; + const v128 *dataEnd; + uint64x2_t one = vdupq_n_u64(0); + one = vsetq_lane_u64(1, one, 0); + p += 2; + + WIDE_LOOP_START + { + const v128 *w = p; + WOP (DECLARE_VAR) + WOP (CTR_START); + do + { + WOP_KEY (AES_E_MC, 0) + WOP_KEY (AES_E_MC, 1) + w += 2; + } + while (w != wEnd); + WOP_KEY (AES_E_MC, 0) + WOP_KEY (AES_E, 1) + WOP_KEY (AES_XOR, 2) + WOP (CTR_END); + } + WIDE_LOOP_END + + SINGLE_LOOP + { + const v128 *w = p; + v128 m; + CTR_START (m, 0); + do + { + AES_E_MC_m (w[0]); + AES_E_MC_m (w[1]); + w += 2; + } + while (w != wEnd); + AES_E_MC_m (w[0]); + AES_E_m (w[1]); + MM_XOR_m (w[2]); + CTR_END (m, 0); + } + + p[-2] = vreinterpretq_u8_u64(ctr); +} + +#endif // USE_HW_AES + +#endif // MY_CPU_ARM_OR_ARM64 diff --git a/deps/LZMA-SDK/C/Alloc.c b/deps/LZMA-SDK/C/Alloc.c index 064701a8c..242ae3d4f 100644 --- a/deps/LZMA-SDK/C/Alloc.c +++ b/deps/LZMA-SDK/C/Alloc.c @@ -1,463 +1,463 @@ -/* Alloc.c -- Memory allocation functions -2020-10-29 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include - -#ifdef _WIN32 -#include -#endif -#include - -#include "Alloc.h" - -/* #define _SZ_ALLOC_DEBUG */ - -/* use _SZ_ALLOC_DEBUG to debug alloc/free operations */ -#ifdef _SZ_ALLOC_DEBUG - -#include -int g_allocCount = 0; -int g_allocCountMid = 0; -int g_allocCountBig = 0; - - -#define CONVERT_INT_TO_STR(charType, tempSize) \ - unsigned char temp[tempSize]; unsigned i = 0; \ - while (val >= 10) { temp[i++] = (unsigned char)('0' + (unsigned)(val % 10)); val /= 10; } \ - *s++ = (charType)('0' + (unsigned)val); \ - while (i != 0) { i--; *s++ = temp[i]; } \ - *s = 0; - -static void ConvertUInt64ToString(UInt64 val, char *s) -{ - CONVERT_INT_TO_STR(char, 24); -} - -#define GET_HEX_CHAR(t) ((char)(((t < 10) ? ('0' + t) : ('A' + (t - 10))))) - -static void ConvertUInt64ToHex(UInt64 val, char *s) -{ - UInt64 v = val; - unsigned i; - for (i = 1;; i++) - { - v >>= 4; - if (v == 0) - break; - } - s[i] = 0; - do - { - unsigned t = (unsigned)(val & 0xF); - val >>= 4; - s[--i] = GET_HEX_CHAR(t); - } - while (i); -} - -#define DEBUG_OUT_STREAM stderr - -static void Print(const char *s) -{ - fputs(s, DEBUG_OUT_STREAM); -} - -static void PrintAligned(const char *s, size_t align) -{ - size_t len = strlen(s); - for(;;) - { - fputc(' ', DEBUG_OUT_STREAM); - if (len >= align) - break; - ++len; - } - Print(s); -} - -static void PrintLn() -{ - Print("\n"); -} - -static void PrintHex(UInt64 v, size_t align) -{ - char s[32]; - ConvertUInt64ToHex(v, s); - PrintAligned(s, align); -} - -static void PrintDec(UInt64 v, size_t align) -{ - char s[32]; - ConvertUInt64ToString(v, s); - PrintAligned(s, align); -} - -static void PrintAddr(void *p) -{ - PrintHex((UInt64)(size_t)(ptrdiff_t)p, 12); -} - - -#define PRINT_ALLOC(name, cnt, size, ptr) \ - Print(name " "); \ - PrintDec(cnt++, 10); \ - PrintHex(size, 10); \ - PrintAddr(ptr); \ - PrintLn(); - -#define PRINT_FREE(name, cnt, ptr) if (ptr) { \ - Print(name " "); \ - PrintDec(--cnt, 10); \ - PrintAddr(ptr); \ - PrintLn(); } - -#else - -#define PRINT_ALLOC(name, cnt, size, ptr) -#define PRINT_FREE(name, cnt, ptr) -#define Print(s) -#define PrintLn() -#define PrintHex(v, align) -#define PrintAddr(p) - -#endif - - - -void *MyAlloc(size_t size) -{ - if (size == 0) - return NULL; - PRINT_ALLOC("Alloc ", g_allocCount, size, NULL); - #ifdef _SZ_ALLOC_DEBUG - { - void *p = malloc(size); - // PRINT_ALLOC("Alloc ", g_allocCount, size, p); - return p; - } - #else - return malloc(size); - #endif -} - -void MyFree(void *address) -{ - PRINT_FREE("Free ", g_allocCount, address); - - free(address); -} - -#ifdef _WIN32 - -void *MidAlloc(size_t size) -{ - if (size == 0) - return NULL; - - PRINT_ALLOC("Alloc-Mid", g_allocCountMid, size, NULL); - - return VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE); -} - -void MidFree(void *address) -{ - PRINT_FREE("Free-Mid", g_allocCountMid, address); - - if (!address) - return; - VirtualFree(address, 0, MEM_RELEASE); -} - -#ifdef _7ZIP_LARGE_PAGES - -#ifdef MEM_LARGE_PAGES - #define MY__MEM_LARGE_PAGES MEM_LARGE_PAGES -#else - #define MY__MEM_LARGE_PAGES 0x20000000 -#endif - -extern -SIZE_T g_LargePageSize; -SIZE_T g_LargePageSize = 0; -typedef SIZE_T (WINAPI *GetLargePageMinimumP)(VOID); - -#endif // _7ZIP_LARGE_PAGES - -void SetLargePageSize() -{ - #ifdef _7ZIP_LARGE_PAGES - SIZE_T size; - GetLargePageMinimumP largePageMinimum = (GetLargePageMinimumP) - GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetLargePageMinimum"); - if (!largePageMinimum) - return; - size = largePageMinimum(); - if (size == 0 || (size & (size - 1)) != 0) - return; - g_LargePageSize = size; - #endif -} - - -void *BigAlloc(size_t size) -{ - if (size == 0) - return NULL; - - PRINT_ALLOC("Alloc-Big", g_allocCountBig, size, NULL); - - #ifdef _7ZIP_LARGE_PAGES - { - SIZE_T ps = g_LargePageSize; - if (ps != 0 && ps <= (1 << 30) && size > (ps / 2)) - { - size_t size2; - ps--; - size2 = (size + ps) & ~ps; - if (size2 >= size) - { - void *res = VirtualAlloc(NULL, size2, MEM_COMMIT | MY__MEM_LARGE_PAGES, PAGE_READWRITE); - if (res) - return res; - } - } - } - #endif - - return VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE); -} - -void BigFree(void *address) -{ - PRINT_FREE("Free-Big", g_allocCountBig, address); - - if (!address) - return; - VirtualFree(address, 0, MEM_RELEASE); -} - -#endif - - -static void *SzAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p); return MyAlloc(size); } -static void SzFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p); MyFree(address); } -const ISzAlloc g_Alloc = { SzAlloc, SzFree }; - -static void *SzMidAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p); return MidAlloc(size); } -static void SzMidFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p); MidFree(address); } -const ISzAlloc g_MidAlloc = { SzMidAlloc, SzMidFree }; - -static void *SzBigAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p); return BigAlloc(size); } -static void SzBigFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p); BigFree(address); } -const ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree }; - - -/* - uintptr_t : C99 (optional) - : unsupported in VS6 -*/ - -#ifdef _WIN32 - typedef UINT_PTR UIntPtr; -#else - /* - typedef uintptr_t UIntPtr; - */ - typedef ptrdiff_t UIntPtr; -#endif - - -#define ADJUST_ALLOC_SIZE 0 -/* -#define ADJUST_ALLOC_SIZE (sizeof(void *) - 1) -*/ -/* - Use (ADJUST_ALLOC_SIZE = (sizeof(void *) - 1)), if - MyAlloc() can return address that is NOT multiple of sizeof(void *). -*/ - - -/* -#define MY_ALIGN_PTR_DOWN(p, align) ((void *)((char *)(p) - ((size_t)(UIntPtr)(p) & ((align) - 1)))) -*/ -#define MY_ALIGN_PTR_DOWN(p, align) ((void *)((((UIntPtr)(p)) & ~((UIntPtr)(align) - 1)))) - - -#if !defined(_WIN32) && defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L) - #define USE_posix_memalign -#endif - -#ifndef USE_posix_memalign -#define MY_ALIGN_PTR_UP_PLUS(p, align) MY_ALIGN_PTR_DOWN(((char *)(p) + (align) + ADJUST_ALLOC_SIZE), align) -#endif - -/* - This posix_memalign() is for test purposes only. - We also need special Free() function instead of free(), - if this posix_memalign() is used. -*/ - -/* -static int posix_memalign(void **ptr, size_t align, size_t size) -{ - size_t newSize = size + align; - void *p; - void *pAligned; - *ptr = NULL; - if (newSize < size) - return 12; // ENOMEM - p = MyAlloc(newSize); - if (!p) - return 12; // ENOMEM - pAligned = MY_ALIGN_PTR_UP_PLUS(p, align); - ((void **)pAligned)[-1] = p; - *ptr = pAligned; - return 0; -} -*/ - -/* - ALLOC_ALIGN_SIZE >= sizeof(void *) - ALLOC_ALIGN_SIZE >= cache_line_size -*/ - -#define ALLOC_ALIGN_SIZE ((size_t)1 << 7) - -static void *SzAlignedAlloc(ISzAllocPtr pp, size_t size) -{ - #ifndef USE_posix_memalign - - void *p; - void *pAligned; - size_t newSize; - UNUSED_VAR(pp); - - /* also we can allocate additional dummy ALLOC_ALIGN_SIZE bytes after aligned - block to prevent cache line sharing with another allocated blocks */ - - newSize = size + ALLOC_ALIGN_SIZE * 1 + ADJUST_ALLOC_SIZE; - if (newSize < size) - return NULL; - - p = MyAlloc(newSize); - - if (!p) - return NULL; - pAligned = MY_ALIGN_PTR_UP_PLUS(p, ALLOC_ALIGN_SIZE); - - Print(" size="); PrintHex(size, 8); - Print(" a_size="); PrintHex(newSize, 8); - Print(" ptr="); PrintAddr(p); - Print(" a_ptr="); PrintAddr(pAligned); - PrintLn(); - - ((void **)pAligned)[-1] = p; - - return pAligned; - - #else - - void *p; - UNUSED_VAR(pp); - if (posix_memalign(&p, ALLOC_ALIGN_SIZE, size)) - return NULL; - - Print(" posix_memalign="); PrintAddr(p); - PrintLn(); - - return p; - - #endif -} - - -static void SzAlignedFree(ISzAllocPtr pp, void *address) -{ - UNUSED_VAR(pp); - #ifndef USE_posix_memalign - if (address) - MyFree(((void **)address)[-1]); - #else - free(address); - #endif -} - - -const ISzAlloc g_AlignedAlloc = { SzAlignedAlloc, SzAlignedFree }; - - - -#define MY_ALIGN_PTR_DOWN_1(p) MY_ALIGN_PTR_DOWN(p, sizeof(void *)) - -/* we align ptr to support cases where CAlignOffsetAlloc::offset is not multiply of sizeof(void *) */ -#define REAL_BLOCK_PTR_VAR(p) ((void **)MY_ALIGN_PTR_DOWN_1(p))[-1] -/* -#define REAL_BLOCK_PTR_VAR(p) ((void **)(p))[-1] -*/ - -static void *AlignOffsetAlloc_Alloc(ISzAllocPtr pp, size_t size) -{ - CAlignOffsetAlloc *p = CONTAINER_FROM_VTBL(pp, CAlignOffsetAlloc, vt); - void *adr; - void *pAligned; - size_t newSize; - size_t extra; - size_t alignSize = (size_t)1 << p->numAlignBits; - - if (alignSize < sizeof(void *)) - alignSize = sizeof(void *); - - if (p->offset >= alignSize) - return NULL; - - /* also we can allocate additional dummy ALLOC_ALIGN_SIZE bytes after aligned - block to prevent cache line sharing with another allocated blocks */ - extra = p->offset & (sizeof(void *) - 1); - newSize = size + alignSize + extra + ADJUST_ALLOC_SIZE; - if (newSize < size) - return NULL; - - adr = ISzAlloc_Alloc(p->baseAlloc, newSize); - - if (!adr) - return NULL; - - pAligned = (char *)MY_ALIGN_PTR_DOWN((char *)adr + - alignSize - p->offset + extra + ADJUST_ALLOC_SIZE, alignSize) + p->offset; - - PrintLn(); - Print("- Aligned: "); - Print(" size="); PrintHex(size, 8); - Print(" a_size="); PrintHex(newSize, 8); - Print(" ptr="); PrintAddr(adr); - Print(" a_ptr="); PrintAddr(pAligned); - PrintLn(); - - REAL_BLOCK_PTR_VAR(pAligned) = adr; - - return pAligned; -} - - -static void AlignOffsetAlloc_Free(ISzAllocPtr pp, void *address) -{ - if (address) - { - CAlignOffsetAlloc *p = CONTAINER_FROM_VTBL(pp, CAlignOffsetAlloc, vt); - PrintLn(); - Print("- Aligned Free: "); - PrintLn(); - ISzAlloc_Free(p->baseAlloc, REAL_BLOCK_PTR_VAR(address)); - } -} - - -void AlignOffsetAlloc_CreateVTable(CAlignOffsetAlloc *p) -{ - p->vt.Alloc = AlignOffsetAlloc_Alloc; - p->vt.Free = AlignOffsetAlloc_Free; -} +/* Alloc.c -- Memory allocation functions +2021-07-13 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include + +#ifdef _WIN32 +#include +#endif +#include + +#include "Alloc.h" + +/* #define _SZ_ALLOC_DEBUG */ + +/* use _SZ_ALLOC_DEBUG to debug alloc/free operations */ +#ifdef _SZ_ALLOC_DEBUG + +#include +int g_allocCount = 0; +int g_allocCountMid = 0; +int g_allocCountBig = 0; + + +#define CONVERT_INT_TO_STR(charType, tempSize) \ + unsigned char temp[tempSize]; unsigned i = 0; \ + while (val >= 10) { temp[i++] = (unsigned char)('0' + (unsigned)(val % 10)); val /= 10; } \ + *s++ = (charType)('0' + (unsigned)val); \ + while (i != 0) { i--; *s++ = temp[i]; } \ + *s = 0; + +static void ConvertUInt64ToString(UInt64 val, char *s) +{ + CONVERT_INT_TO_STR(char, 24); +} + +#define GET_HEX_CHAR(t) ((char)(((t < 10) ? ('0' + t) : ('A' + (t - 10))))) + +static void ConvertUInt64ToHex(UInt64 val, char *s) +{ + UInt64 v = val; + unsigned i; + for (i = 1;; i++) + { + v >>= 4; + if (v == 0) + break; + } + s[i] = 0; + do + { + unsigned t = (unsigned)(val & 0xF); + val >>= 4; + s[--i] = GET_HEX_CHAR(t); + } + while (i); +} + +#define DEBUG_OUT_STREAM stderr + +static void Print(const char *s) +{ + fputs(s, DEBUG_OUT_STREAM); +} + +static void PrintAligned(const char *s, size_t align) +{ + size_t len = strlen(s); + for(;;) + { + fputc(' ', DEBUG_OUT_STREAM); + if (len >= align) + break; + ++len; + } + Print(s); +} + +static void PrintLn() +{ + Print("\n"); +} + +static void PrintHex(UInt64 v, size_t align) +{ + char s[32]; + ConvertUInt64ToHex(v, s); + PrintAligned(s, align); +} + +static void PrintDec(UInt64 v, size_t align) +{ + char s[32]; + ConvertUInt64ToString(v, s); + PrintAligned(s, align); +} + +static void PrintAddr(void *p) +{ + PrintHex((UInt64)(size_t)(ptrdiff_t)p, 12); +} + + +#define PRINT_ALLOC(name, cnt, size, ptr) \ + Print(name " "); \ + PrintDec(cnt++, 10); \ + PrintHex(size, 10); \ + PrintAddr(ptr); \ + PrintLn(); + +#define PRINT_FREE(name, cnt, ptr) if (ptr) { \ + Print(name " "); \ + PrintDec(--cnt, 10); \ + PrintAddr(ptr); \ + PrintLn(); } + +#else + +#define PRINT_ALLOC(name, cnt, size, ptr) +#define PRINT_FREE(name, cnt, ptr) +#define Print(s) +#define PrintLn() +#define PrintHex(v, align) +#define PrintAddr(p) + +#endif + + + +void *MyAlloc(size_t size) +{ + if (size == 0) + return NULL; + PRINT_ALLOC("Alloc ", g_allocCount, size, NULL); + #ifdef _SZ_ALLOC_DEBUG + { + void *p = malloc(size); + // PRINT_ALLOC("Alloc ", g_allocCount, size, p); + return p; + } + #else + return malloc(size); + #endif +} + +void MyFree(void *address) +{ + PRINT_FREE("Free ", g_allocCount, address); + + free(address); +} + +#ifdef _WIN32 + +void *MidAlloc(size_t size) +{ + if (size == 0) + return NULL; + + PRINT_ALLOC("Alloc-Mid", g_allocCountMid, size, NULL); + + return VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE); +} + +void MidFree(void *address) +{ + PRINT_FREE("Free-Mid", g_allocCountMid, address); + + if (!address) + return; + VirtualFree(address, 0, MEM_RELEASE); +} + +#ifdef _7ZIP_LARGE_PAGES + +#ifdef MEM_LARGE_PAGES + #define MY__MEM_LARGE_PAGES MEM_LARGE_PAGES +#else + #define MY__MEM_LARGE_PAGES 0x20000000 +#endif + +extern +SIZE_T g_LargePageSize; +SIZE_T g_LargePageSize = 0; +typedef SIZE_T (WINAPI *GetLargePageMinimumP)(VOID); + +#endif // _7ZIP_LARGE_PAGES + +void SetLargePageSize() +{ + #ifdef _7ZIP_LARGE_PAGES + SIZE_T size; + GetLargePageMinimumP largePageMinimum = (GetLargePageMinimumP) + GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetLargePageMinimum"); + if (!largePageMinimum) + return; + size = largePageMinimum(); + if (size == 0 || (size & (size - 1)) != 0) + return; + g_LargePageSize = size; + #endif +} + + +void *BigAlloc(size_t size) +{ + if (size == 0) + return NULL; + + PRINT_ALLOC("Alloc-Big", g_allocCountBig, size, NULL); + + #ifdef _7ZIP_LARGE_PAGES + { + SIZE_T ps = g_LargePageSize; + if (ps != 0 && ps <= (1 << 30) && size > (ps / 2)) + { + size_t size2; + ps--; + size2 = (size + ps) & ~ps; + if (size2 >= size) + { + void *res = VirtualAlloc(NULL, size2, MEM_COMMIT | MY__MEM_LARGE_PAGES, PAGE_READWRITE); + if (res) + return res; + } + } + } + #endif + + return VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE); +} + +void BigFree(void *address) +{ + PRINT_FREE("Free-Big", g_allocCountBig, address); + + if (!address) + return; + VirtualFree(address, 0, MEM_RELEASE); +} + +#endif + + +static void *SzAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p); return MyAlloc(size); } +static void SzFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p); MyFree(address); } +const ISzAlloc g_Alloc = { SzAlloc, SzFree }; + +#ifdef _WIN32 +static void *SzMidAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p); return MidAlloc(size); } +static void SzMidFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p); MidFree(address); } +static void *SzBigAlloc(ISzAllocPtr p, size_t size) { UNUSED_VAR(p); return BigAlloc(size); } +static void SzBigFree(ISzAllocPtr p, void *address) { UNUSED_VAR(p); BigFree(address); } +const ISzAlloc g_MidAlloc = { SzMidAlloc, SzMidFree }; +const ISzAlloc g_BigAlloc = { SzBigAlloc, SzBigFree }; +#endif + +/* + uintptr_t : C99 (optional) + : unsupported in VS6 +*/ + +#ifdef _WIN32 + typedef UINT_PTR UIntPtr; +#else + /* + typedef uintptr_t UIntPtr; + */ + typedef ptrdiff_t UIntPtr; +#endif + + +#define ADJUST_ALLOC_SIZE 0 +/* +#define ADJUST_ALLOC_SIZE (sizeof(void *) - 1) +*/ +/* + Use (ADJUST_ALLOC_SIZE = (sizeof(void *) - 1)), if + MyAlloc() can return address that is NOT multiple of sizeof(void *). +*/ + + +/* +#define MY_ALIGN_PTR_DOWN(p, align) ((void *)((char *)(p) - ((size_t)(UIntPtr)(p) & ((align) - 1)))) +*/ +#define MY_ALIGN_PTR_DOWN(p, align) ((void *)((((UIntPtr)(p)) & ~((UIntPtr)(align) - 1)))) + + +#if !defined(_WIN32) && defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L) + #define USE_posix_memalign +#endif + +#ifndef USE_posix_memalign +#define MY_ALIGN_PTR_UP_PLUS(p, align) MY_ALIGN_PTR_DOWN(((char *)(p) + (align) + ADJUST_ALLOC_SIZE), align) +#endif + +/* + This posix_memalign() is for test purposes only. + We also need special Free() function instead of free(), + if this posix_memalign() is used. +*/ + +/* +static int posix_memalign(void **ptr, size_t align, size_t size) +{ + size_t newSize = size + align; + void *p; + void *pAligned; + *ptr = NULL; + if (newSize < size) + return 12; // ENOMEM + p = MyAlloc(newSize); + if (!p) + return 12; // ENOMEM + pAligned = MY_ALIGN_PTR_UP_PLUS(p, align); + ((void **)pAligned)[-1] = p; + *ptr = pAligned; + return 0; +} +*/ + +/* + ALLOC_ALIGN_SIZE >= sizeof(void *) + ALLOC_ALIGN_SIZE >= cache_line_size +*/ + +#define ALLOC_ALIGN_SIZE ((size_t)1 << 7) + +static void *SzAlignedAlloc(ISzAllocPtr pp, size_t size) +{ + #ifndef USE_posix_memalign + + void *p; + void *pAligned; + size_t newSize; + UNUSED_VAR(pp); + + /* also we can allocate additional dummy ALLOC_ALIGN_SIZE bytes after aligned + block to prevent cache line sharing with another allocated blocks */ + + newSize = size + ALLOC_ALIGN_SIZE * 1 + ADJUST_ALLOC_SIZE; + if (newSize < size) + return NULL; + + p = MyAlloc(newSize); + + if (!p) + return NULL; + pAligned = MY_ALIGN_PTR_UP_PLUS(p, ALLOC_ALIGN_SIZE); + + Print(" size="); PrintHex(size, 8); + Print(" a_size="); PrintHex(newSize, 8); + Print(" ptr="); PrintAddr(p); + Print(" a_ptr="); PrintAddr(pAligned); + PrintLn(); + + ((void **)pAligned)[-1] = p; + + return pAligned; + + #else + + void *p; + UNUSED_VAR(pp); + if (posix_memalign(&p, ALLOC_ALIGN_SIZE, size)) + return NULL; + + Print(" posix_memalign="); PrintAddr(p); + PrintLn(); + + return p; + + #endif +} + + +static void SzAlignedFree(ISzAllocPtr pp, void *address) +{ + UNUSED_VAR(pp); + #ifndef USE_posix_memalign + if (address) + MyFree(((void **)address)[-1]); + #else + free(address); + #endif +} + + +const ISzAlloc g_AlignedAlloc = { SzAlignedAlloc, SzAlignedFree }; + + + +#define MY_ALIGN_PTR_DOWN_1(p) MY_ALIGN_PTR_DOWN(p, sizeof(void *)) + +/* we align ptr to support cases where CAlignOffsetAlloc::offset is not multiply of sizeof(void *) */ +#define REAL_BLOCK_PTR_VAR(p) ((void **)MY_ALIGN_PTR_DOWN_1(p))[-1] +/* +#define REAL_BLOCK_PTR_VAR(p) ((void **)(p))[-1] +*/ + +static void *AlignOffsetAlloc_Alloc(ISzAllocPtr pp, size_t size) +{ + CAlignOffsetAlloc *p = CONTAINER_FROM_VTBL(pp, CAlignOffsetAlloc, vt); + void *adr; + void *pAligned; + size_t newSize; + size_t extra; + size_t alignSize = (size_t)1 << p->numAlignBits; + + if (alignSize < sizeof(void *)) + alignSize = sizeof(void *); + + if (p->offset >= alignSize) + return NULL; + + /* also we can allocate additional dummy ALLOC_ALIGN_SIZE bytes after aligned + block to prevent cache line sharing with another allocated blocks */ + extra = p->offset & (sizeof(void *) - 1); + newSize = size + alignSize + extra + ADJUST_ALLOC_SIZE; + if (newSize < size) + return NULL; + + adr = ISzAlloc_Alloc(p->baseAlloc, newSize); + + if (!adr) + return NULL; + + pAligned = (char *)MY_ALIGN_PTR_DOWN((char *)adr + + alignSize - p->offset + extra + ADJUST_ALLOC_SIZE, alignSize) + p->offset; + + PrintLn(); + Print("- Aligned: "); + Print(" size="); PrintHex(size, 8); + Print(" a_size="); PrintHex(newSize, 8); + Print(" ptr="); PrintAddr(adr); + Print(" a_ptr="); PrintAddr(pAligned); + PrintLn(); + + REAL_BLOCK_PTR_VAR(pAligned) = adr; + + return pAligned; +} + + +static void AlignOffsetAlloc_Free(ISzAllocPtr pp, void *address) +{ + if (address) + { + CAlignOffsetAlloc *p = CONTAINER_FROM_VTBL(pp, CAlignOffsetAlloc, vt); + PrintLn(); + Print("- Aligned Free: "); + PrintLn(); + ISzAlloc_Free(p->baseAlloc, REAL_BLOCK_PTR_VAR(address)); + } +} + + +void AlignOffsetAlloc_CreateVTable(CAlignOffsetAlloc *p) +{ + p->vt.Alloc = AlignOffsetAlloc_Alloc; + p->vt.Free = AlignOffsetAlloc_Free; +} diff --git a/deps/LZMA-SDK/C/Alloc.h b/deps/LZMA-SDK/C/Alloc.h index a1bbe942c..3be2041eb 100644 --- a/deps/LZMA-SDK/C/Alloc.h +++ b/deps/LZMA-SDK/C/Alloc.h @@ -1,51 +1,58 @@ -/* Alloc.h -- Memory allocation functions -2021-02-08 : Igor Pavlov : Public domain */ - -#ifndef __COMMON_ALLOC_H -#define __COMMON_ALLOC_H - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -void *MyAlloc(size_t size); -void MyFree(void *address); - -#ifdef _WIN32 - -void SetLargePageSize(void); - -void *MidAlloc(size_t size); -void MidFree(void *address); -void *BigAlloc(size_t size); -void BigFree(void *address); - -#else - -#define MidAlloc(size) MyAlloc(size) -#define MidFree(address) MyFree(address) -#define BigAlloc(size) MyAlloc(size) -#define BigFree(address) MyFree(address) - -#endif - -extern const ISzAlloc g_Alloc; -extern const ISzAlloc g_BigAlloc; -extern const ISzAlloc g_MidAlloc; -extern const ISzAlloc g_AlignedAlloc; - - -typedef struct -{ - ISzAlloc vt; - ISzAllocPtr baseAlloc; - unsigned numAlignBits; /* ((1 << numAlignBits) >= sizeof(void *)) */ - size_t offset; /* (offset == (k * sizeof(void *)) && offset < (1 << numAlignBits) */ -} CAlignOffsetAlloc; - -void AlignOffsetAlloc_CreateVTable(CAlignOffsetAlloc *p); - - -EXTERN_C_END - -#endif +/* Alloc.h -- Memory allocation functions +2021-07-13 : Igor Pavlov : Public domain */ + +#ifndef __COMMON_ALLOC_H +#define __COMMON_ALLOC_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +void *MyAlloc(size_t size); +void MyFree(void *address); + +#ifdef _WIN32 + +void SetLargePageSize(void); + +void *MidAlloc(size_t size); +void MidFree(void *address); +void *BigAlloc(size_t size); +void BigFree(void *address); + +#else + +#define MidAlloc(size) MyAlloc(size) +#define MidFree(address) MyFree(address) +#define BigAlloc(size) MyAlloc(size) +#define BigFree(address) MyFree(address) + +#endif + +extern const ISzAlloc g_Alloc; + +#ifdef _WIN32 +extern const ISzAlloc g_BigAlloc; +extern const ISzAlloc g_MidAlloc; +#else +#define g_BigAlloc g_AlignedAlloc +#define g_MidAlloc g_AlignedAlloc +#endif + +extern const ISzAlloc g_AlignedAlloc; + + +typedef struct +{ + ISzAlloc vt; + ISzAllocPtr baseAlloc; + unsigned numAlignBits; /* ((1 << numAlignBits) >= sizeof(void *)) */ + size_t offset; /* (offset == (k * sizeof(void *)) && offset < (1 << numAlignBits) */ +} CAlignOffsetAlloc; + +void AlignOffsetAlloc_CreateVTable(CAlignOffsetAlloc *p); + + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/Bcj2.c b/deps/LZMA-SDK/C/Bcj2.c index c1772f234..c7b956708 100644 --- a/deps/LZMA-SDK/C/Bcj2.c +++ b/deps/LZMA-SDK/C/Bcj2.c @@ -1,257 +1,257 @@ -/* Bcj2.c -- BCJ2 Decoder (Converter for x86 code) -2021-02-09 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include "Bcj2.h" -#include "CpuArch.h" - -#define CProb UInt16 - -#define kTopValue ((UInt32)1 << 24) -#define kNumModelBits 11 -#define kBitModelTotal (1 << kNumModelBits) -#define kNumMoveBits 5 - -#define _IF_BIT_0 ttt = *prob; bound = (p->range >> kNumModelBits) * ttt; if (p->code < bound) -#define _UPDATE_0 p->range = bound; *prob = (CProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); -#define _UPDATE_1 p->range -= bound; p->code -= bound; *prob = (CProb)(ttt - (ttt >> kNumMoveBits)); - -void Bcj2Dec_Init(CBcj2Dec *p) -{ - unsigned i; - - p->state = BCJ2_DEC_STATE_OK; - p->ip = 0; - p->temp[3] = 0; - p->range = 0; - p->code = 0; - for (i = 0; i < sizeof(p->probs) / sizeof(p->probs[0]); i++) - p->probs[i] = kBitModelTotal >> 1; -} - -SRes Bcj2Dec_Decode(CBcj2Dec *p) -{ - if (p->range <= 5) - { - p->state = BCJ2_DEC_STATE_OK; - for (; p->range != 5; p->range++) - { - if (p->range == 1 && p->code != 0) - return SZ_ERROR_DATA; - - if (p->bufs[BCJ2_STREAM_RC] == p->lims[BCJ2_STREAM_RC]) - { - p->state = BCJ2_STREAM_RC; - return SZ_OK; - } - - p->code = (p->code << 8) | *(p->bufs[BCJ2_STREAM_RC])++; - } - - if (p->code == 0xFFFFFFFF) - return SZ_ERROR_DATA; - - p->range = 0xFFFFFFFF; - } - else if (p->state >= BCJ2_DEC_STATE_ORIG_0) - { - while (p->state <= BCJ2_DEC_STATE_ORIG_3) - { - Byte *dest = p->dest; - if (dest == p->destLim) - return SZ_OK; - *dest = p->temp[(size_t)p->state - BCJ2_DEC_STATE_ORIG_0]; - p->state++; - p->dest = dest + 1; - } - } - - /* - if (BCJ2_IS_32BIT_STREAM(p->state)) - { - const Byte *cur = p->bufs[p->state]; - if (cur == p->lims[p->state]) - return SZ_OK; - p->bufs[p->state] = cur + 4; - - { - UInt32 val; - Byte *dest; - SizeT rem; - - p->ip += 4; - val = GetBe32(cur) - p->ip; - dest = p->dest; - rem = p->destLim - dest; - if (rem < 4) - { - SizeT i; - SetUi32(p->temp, val); - for (i = 0; i < rem; i++) - dest[i] = p->temp[i]; - p->dest = dest + rem; - p->state = BCJ2_DEC_STATE_ORIG_0 + (unsigned)rem; - return SZ_OK; - } - SetUi32(dest, val); - p->temp[3] = (Byte)(val >> 24); - p->dest = dest + 4; - p->state = BCJ2_DEC_STATE_OK; - } - } - */ - - for (;;) - { - if (BCJ2_IS_32BIT_STREAM(p->state)) - p->state = BCJ2_DEC_STATE_OK; - else - { - if (p->range < kTopValue) - { - if (p->bufs[BCJ2_STREAM_RC] == p->lims[BCJ2_STREAM_RC]) - { - p->state = BCJ2_STREAM_RC; - return SZ_OK; - } - p->range <<= 8; - p->code = (p->code << 8) | *(p->bufs[BCJ2_STREAM_RC])++; - } - - { - const Byte *src = p->bufs[BCJ2_STREAM_MAIN]; - const Byte *srcLim; - Byte *dest; - SizeT num = (SizeT)(p->lims[BCJ2_STREAM_MAIN] - src); - - if (num == 0) - { - p->state = BCJ2_STREAM_MAIN; - return SZ_OK; - } - - dest = p->dest; - if (num > (SizeT)(p->destLim - dest)) - { - num = (SizeT)(p->destLim - dest); - if (num == 0) - { - p->state = BCJ2_DEC_STATE_ORIG; - return SZ_OK; - } - } - - srcLim = src + num; - - if (p->temp[3] == 0x0F && (src[0] & 0xF0) == 0x80) - *dest = src[0]; - else for (;;) - { - Byte b = *src; - *dest = b; - if (b != 0x0F) - { - if ((b & 0xFE) == 0xE8) - break; - dest++; - if (++src != srcLim) - continue; - break; - } - dest++; - if (++src == srcLim) - break; - if ((*src & 0xF0) != 0x80) - continue; - *dest = *src; - break; - } - - num = (SizeT)(src - p->bufs[BCJ2_STREAM_MAIN]); - - if (src == srcLim) - { - p->temp[3] = src[-1]; - p->bufs[BCJ2_STREAM_MAIN] = src; - p->ip += (UInt32)num; - p->dest += num; - p->state = - p->bufs[BCJ2_STREAM_MAIN] == - p->lims[BCJ2_STREAM_MAIN] ? - (unsigned)BCJ2_STREAM_MAIN : - (unsigned)BCJ2_DEC_STATE_ORIG; - return SZ_OK; - } - - { - UInt32 bound, ttt; - CProb *prob; - Byte b = src[0]; - Byte prev = (Byte)(num == 0 ? p->temp[3] : src[-1]); - - p->temp[3] = b; - p->bufs[BCJ2_STREAM_MAIN] = src + 1; - num++; - p->ip += (UInt32)num; - p->dest += num; - - prob = p->probs + (unsigned)(b == 0xE8 ? 2 + (unsigned)prev : (b == 0xE9 ? 1 : 0)); - - _IF_BIT_0 - { - _UPDATE_0 - continue; - } - _UPDATE_1 - - } - } - } - - { - UInt32 val; - unsigned cj = (p->temp[3] == 0xE8) ? BCJ2_STREAM_CALL : BCJ2_STREAM_JUMP; - const Byte *cur = p->bufs[cj]; - Byte *dest; - SizeT rem; - - if (cur == p->lims[cj]) - { - p->state = cj; - break; - } - - val = GetBe32(cur); - p->bufs[cj] = cur + 4; - - p->ip += 4; - val -= p->ip; - dest = p->dest; - rem = (SizeT)(p->destLim - dest); - - if (rem < 4) - { - p->temp[0] = (Byte)val; if (rem > 0) dest[0] = (Byte)val; val >>= 8; - p->temp[1] = (Byte)val; if (rem > 1) dest[1] = (Byte)val; val >>= 8; - p->temp[2] = (Byte)val; if (rem > 2) dest[2] = (Byte)val; val >>= 8; - p->temp[3] = (Byte)val; - p->dest = dest + rem; - p->state = BCJ2_DEC_STATE_ORIG_0 + (unsigned)rem; - break; - } - - SetUi32(dest, val); - p->temp[3] = (Byte)(val >> 24); - p->dest = dest + 4; - } - } - - if (p->range < kTopValue && p->bufs[BCJ2_STREAM_RC] != p->lims[BCJ2_STREAM_RC]) - { - p->range <<= 8; - p->code = (p->code << 8) | *(p->bufs[BCJ2_STREAM_RC])++; - } - - return SZ_OK; -} +/* Bcj2.c -- BCJ2 Decoder (Converter for x86 code) +2021-02-09 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "Bcj2.h" +#include "CpuArch.h" + +#define CProb UInt16 + +#define kTopValue ((UInt32)1 << 24) +#define kNumModelBits 11 +#define kBitModelTotal (1 << kNumModelBits) +#define kNumMoveBits 5 + +#define _IF_BIT_0 ttt = *prob; bound = (p->range >> kNumModelBits) * ttt; if (p->code < bound) +#define _UPDATE_0 p->range = bound; *prob = (CProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); +#define _UPDATE_1 p->range -= bound; p->code -= bound; *prob = (CProb)(ttt - (ttt >> kNumMoveBits)); + +void Bcj2Dec_Init(CBcj2Dec *p) +{ + unsigned i; + + p->state = BCJ2_DEC_STATE_OK; + p->ip = 0; + p->temp[3] = 0; + p->range = 0; + p->code = 0; + for (i = 0; i < sizeof(p->probs) / sizeof(p->probs[0]); i++) + p->probs[i] = kBitModelTotal >> 1; +} + +SRes Bcj2Dec_Decode(CBcj2Dec *p) +{ + if (p->range <= 5) + { + p->state = BCJ2_DEC_STATE_OK; + for (; p->range != 5; p->range++) + { + if (p->range == 1 && p->code != 0) + return SZ_ERROR_DATA; + + if (p->bufs[BCJ2_STREAM_RC] == p->lims[BCJ2_STREAM_RC]) + { + p->state = BCJ2_STREAM_RC; + return SZ_OK; + } + + p->code = (p->code << 8) | *(p->bufs[BCJ2_STREAM_RC])++; + } + + if (p->code == 0xFFFFFFFF) + return SZ_ERROR_DATA; + + p->range = 0xFFFFFFFF; + } + else if (p->state >= BCJ2_DEC_STATE_ORIG_0) + { + while (p->state <= BCJ2_DEC_STATE_ORIG_3) + { + Byte *dest = p->dest; + if (dest == p->destLim) + return SZ_OK; + *dest = p->temp[(size_t)p->state - BCJ2_DEC_STATE_ORIG_0]; + p->state++; + p->dest = dest + 1; + } + } + + /* + if (BCJ2_IS_32BIT_STREAM(p->state)) + { + const Byte *cur = p->bufs[p->state]; + if (cur == p->lims[p->state]) + return SZ_OK; + p->bufs[p->state] = cur + 4; + + { + UInt32 val; + Byte *dest; + SizeT rem; + + p->ip += 4; + val = GetBe32(cur) - p->ip; + dest = p->dest; + rem = p->destLim - dest; + if (rem < 4) + { + SizeT i; + SetUi32(p->temp, val); + for (i = 0; i < rem; i++) + dest[i] = p->temp[i]; + p->dest = dest + rem; + p->state = BCJ2_DEC_STATE_ORIG_0 + (unsigned)rem; + return SZ_OK; + } + SetUi32(dest, val); + p->temp[3] = (Byte)(val >> 24); + p->dest = dest + 4; + p->state = BCJ2_DEC_STATE_OK; + } + } + */ + + for (;;) + { + if (BCJ2_IS_32BIT_STREAM(p->state)) + p->state = BCJ2_DEC_STATE_OK; + else + { + if (p->range < kTopValue) + { + if (p->bufs[BCJ2_STREAM_RC] == p->lims[BCJ2_STREAM_RC]) + { + p->state = BCJ2_STREAM_RC; + return SZ_OK; + } + p->range <<= 8; + p->code = (p->code << 8) | *(p->bufs[BCJ2_STREAM_RC])++; + } + + { + const Byte *src = p->bufs[BCJ2_STREAM_MAIN]; + const Byte *srcLim; + Byte *dest; + SizeT num = (SizeT)(p->lims[BCJ2_STREAM_MAIN] - src); + + if (num == 0) + { + p->state = BCJ2_STREAM_MAIN; + return SZ_OK; + } + + dest = p->dest; + if (num > (SizeT)(p->destLim - dest)) + { + num = (SizeT)(p->destLim - dest); + if (num == 0) + { + p->state = BCJ2_DEC_STATE_ORIG; + return SZ_OK; + } + } + + srcLim = src + num; + + if (p->temp[3] == 0x0F && (src[0] & 0xF0) == 0x80) + *dest = src[0]; + else for (;;) + { + Byte b = *src; + *dest = b; + if (b != 0x0F) + { + if ((b & 0xFE) == 0xE8) + break; + dest++; + if (++src != srcLim) + continue; + break; + } + dest++; + if (++src == srcLim) + break; + if ((*src & 0xF0) != 0x80) + continue; + *dest = *src; + break; + } + + num = (SizeT)(src - p->bufs[BCJ2_STREAM_MAIN]); + + if (src == srcLim) + { + p->temp[3] = src[-1]; + p->bufs[BCJ2_STREAM_MAIN] = src; + p->ip += (UInt32)num; + p->dest += num; + p->state = + p->bufs[BCJ2_STREAM_MAIN] == + p->lims[BCJ2_STREAM_MAIN] ? + (unsigned)BCJ2_STREAM_MAIN : + (unsigned)BCJ2_DEC_STATE_ORIG; + return SZ_OK; + } + + { + UInt32 bound, ttt; + CProb *prob; + Byte b = src[0]; + Byte prev = (Byte)(num == 0 ? p->temp[3] : src[-1]); + + p->temp[3] = b; + p->bufs[BCJ2_STREAM_MAIN] = src + 1; + num++; + p->ip += (UInt32)num; + p->dest += num; + + prob = p->probs + (unsigned)(b == 0xE8 ? 2 + (unsigned)prev : (b == 0xE9 ? 1 : 0)); + + _IF_BIT_0 + { + _UPDATE_0 + continue; + } + _UPDATE_1 + + } + } + } + + { + UInt32 val; + unsigned cj = (p->temp[3] == 0xE8) ? BCJ2_STREAM_CALL : BCJ2_STREAM_JUMP; + const Byte *cur = p->bufs[cj]; + Byte *dest; + SizeT rem; + + if (cur == p->lims[cj]) + { + p->state = cj; + break; + } + + val = GetBe32(cur); + p->bufs[cj] = cur + 4; + + p->ip += 4; + val -= p->ip; + dest = p->dest; + rem = (SizeT)(p->destLim - dest); + + if (rem < 4) + { + p->temp[0] = (Byte)val; if (rem > 0) dest[0] = (Byte)val; val >>= 8; + p->temp[1] = (Byte)val; if (rem > 1) dest[1] = (Byte)val; val >>= 8; + p->temp[2] = (Byte)val; if (rem > 2) dest[2] = (Byte)val; val >>= 8; + p->temp[3] = (Byte)val; + p->dest = dest + rem; + p->state = BCJ2_DEC_STATE_ORIG_0 + (unsigned)rem; + break; + } + + SetUi32(dest, val); + p->temp[3] = (Byte)(val >> 24); + p->dest = dest + 4; + } + } + + if (p->range < kTopValue && p->bufs[BCJ2_STREAM_RC] != p->lims[BCJ2_STREAM_RC]) + { + p->range <<= 8; + p->code = (p->code << 8) | *(p->bufs[BCJ2_STREAM_RC])++; + } + + return SZ_OK; +} diff --git a/deps/LZMA-SDK/C/Bcj2.h b/deps/LZMA-SDK/C/Bcj2.h index 68893d2d1..8824080ac 100644 --- a/deps/LZMA-SDK/C/Bcj2.h +++ b/deps/LZMA-SDK/C/Bcj2.h @@ -1,146 +1,146 @@ -/* Bcj2.h -- BCJ2 Converter for x86 code -2014-11-10 : Igor Pavlov : Public domain */ - -#ifndef __BCJ2_H -#define __BCJ2_H - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -#define BCJ2_NUM_STREAMS 4 - -enum -{ - BCJ2_STREAM_MAIN, - BCJ2_STREAM_CALL, - BCJ2_STREAM_JUMP, - BCJ2_STREAM_RC -}; - -enum -{ - BCJ2_DEC_STATE_ORIG_0 = BCJ2_NUM_STREAMS, - BCJ2_DEC_STATE_ORIG_1, - BCJ2_DEC_STATE_ORIG_2, - BCJ2_DEC_STATE_ORIG_3, - - BCJ2_DEC_STATE_ORIG, - BCJ2_DEC_STATE_OK -}; - -enum -{ - BCJ2_ENC_STATE_ORIG = BCJ2_NUM_STREAMS, - BCJ2_ENC_STATE_OK -}; - - -#define BCJ2_IS_32BIT_STREAM(s) ((s) == BCJ2_STREAM_CALL || (s) == BCJ2_STREAM_JUMP) - -/* -CBcj2Dec / CBcj2Enc -bufs sizes: - BUF_SIZE(n) = lims[n] - bufs[n] -bufs sizes for BCJ2_STREAM_CALL and BCJ2_STREAM_JUMP must be mutliply of 4: - (BUF_SIZE(BCJ2_STREAM_CALL) & 3) == 0 - (BUF_SIZE(BCJ2_STREAM_JUMP) & 3) == 0 -*/ - -/* -CBcj2Dec: -dest is allowed to overlap with bufs[BCJ2_STREAM_MAIN], with the following conditions: - bufs[BCJ2_STREAM_MAIN] >= dest && - bufs[BCJ2_STREAM_MAIN] - dest >= tempReserv + - BUF_SIZE(BCJ2_STREAM_CALL) + - BUF_SIZE(BCJ2_STREAM_JUMP) - tempReserv = 0 : for first call of Bcj2Dec_Decode - tempReserv = 4 : for any other calls of Bcj2Dec_Decode - overlap with offset = 1 is not allowed -*/ - -typedef struct -{ - const Byte *bufs[BCJ2_NUM_STREAMS]; - const Byte *lims[BCJ2_NUM_STREAMS]; - Byte *dest; - const Byte *destLim; - - unsigned state; /* BCJ2_STREAM_MAIN has more priority than BCJ2_STATE_ORIG */ - - UInt32 ip; - Byte temp[4]; - UInt32 range; - UInt32 code; - UInt16 probs[2 + 256]; -} CBcj2Dec; - -void Bcj2Dec_Init(CBcj2Dec *p); - -/* Returns: SZ_OK or SZ_ERROR_DATA */ -SRes Bcj2Dec_Decode(CBcj2Dec *p); - -#define Bcj2Dec_IsFinished(_p_) ((_p_)->code == 0) - - - -typedef enum -{ - BCJ2_ENC_FINISH_MODE_CONTINUE, - BCJ2_ENC_FINISH_MODE_END_BLOCK, - BCJ2_ENC_FINISH_MODE_END_STREAM -} EBcj2Enc_FinishMode; - -typedef struct -{ - Byte *bufs[BCJ2_NUM_STREAMS]; - const Byte *lims[BCJ2_NUM_STREAMS]; - const Byte *src; - const Byte *srcLim; - - unsigned state; - EBcj2Enc_FinishMode finishMode; - - Byte prevByte; - - Byte cache; - UInt32 range; - UInt64 low; - UInt64 cacheSize; - - UInt32 ip; - - /* 32-bit ralative offset in JUMP/CALL commands is - - (mod 4 GB) in 32-bit mode - - signed Int32 in 64-bit mode - We use (mod 4 GB) check for fileSize. - Use fileSize up to 2 GB, if you want to support 32-bit and 64-bit code conversion. */ - UInt32 fileIp; - UInt32 fileSize; /* (fileSize <= ((UInt32)1 << 31)), 0 means no_limit */ - UInt32 relatLimit; /* (relatLimit <= ((UInt32)1 << 31)), 0 means desable_conversion */ - - UInt32 tempTarget; - unsigned tempPos; - Byte temp[4 * 2]; - - unsigned flushPos; - - UInt16 probs[2 + 256]; -} CBcj2Enc; - -void Bcj2Enc_Init(CBcj2Enc *p); -void Bcj2Enc_Encode(CBcj2Enc *p); - -#define Bcj2Enc_Get_InputData_Size(p) ((SizeT)((p)->srcLim - (p)->src) + (p)->tempPos) -#define Bcj2Enc_IsFinished(p) ((p)->flushPos == 5) - - -#define BCJ2_RELAT_LIMIT_NUM_BITS 26 -#define BCJ2_RELAT_LIMIT ((UInt32)1 << BCJ2_RELAT_LIMIT_NUM_BITS) - -/* limit for CBcj2Enc::fileSize variable */ -#define BCJ2_FileSize_MAX ((UInt32)1 << 31) - -EXTERN_C_END - -#endif +/* Bcj2.h -- BCJ2 Converter for x86 code +2014-11-10 : Igor Pavlov : Public domain */ + +#ifndef __BCJ2_H +#define __BCJ2_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +#define BCJ2_NUM_STREAMS 4 + +enum +{ + BCJ2_STREAM_MAIN, + BCJ2_STREAM_CALL, + BCJ2_STREAM_JUMP, + BCJ2_STREAM_RC +}; + +enum +{ + BCJ2_DEC_STATE_ORIG_0 = BCJ2_NUM_STREAMS, + BCJ2_DEC_STATE_ORIG_1, + BCJ2_DEC_STATE_ORIG_2, + BCJ2_DEC_STATE_ORIG_3, + + BCJ2_DEC_STATE_ORIG, + BCJ2_DEC_STATE_OK +}; + +enum +{ + BCJ2_ENC_STATE_ORIG = BCJ2_NUM_STREAMS, + BCJ2_ENC_STATE_OK +}; + + +#define BCJ2_IS_32BIT_STREAM(s) ((s) == BCJ2_STREAM_CALL || (s) == BCJ2_STREAM_JUMP) + +/* +CBcj2Dec / CBcj2Enc +bufs sizes: + BUF_SIZE(n) = lims[n] - bufs[n] +bufs sizes for BCJ2_STREAM_CALL and BCJ2_STREAM_JUMP must be mutliply of 4: + (BUF_SIZE(BCJ2_STREAM_CALL) & 3) == 0 + (BUF_SIZE(BCJ2_STREAM_JUMP) & 3) == 0 +*/ + +/* +CBcj2Dec: +dest is allowed to overlap with bufs[BCJ2_STREAM_MAIN], with the following conditions: + bufs[BCJ2_STREAM_MAIN] >= dest && + bufs[BCJ2_STREAM_MAIN] - dest >= tempReserv + + BUF_SIZE(BCJ2_STREAM_CALL) + + BUF_SIZE(BCJ2_STREAM_JUMP) + tempReserv = 0 : for first call of Bcj2Dec_Decode + tempReserv = 4 : for any other calls of Bcj2Dec_Decode + overlap with offset = 1 is not allowed +*/ + +typedef struct +{ + const Byte *bufs[BCJ2_NUM_STREAMS]; + const Byte *lims[BCJ2_NUM_STREAMS]; + Byte *dest; + const Byte *destLim; + + unsigned state; /* BCJ2_STREAM_MAIN has more priority than BCJ2_STATE_ORIG */ + + UInt32 ip; + Byte temp[4]; + UInt32 range; + UInt32 code; + UInt16 probs[2 + 256]; +} CBcj2Dec; + +void Bcj2Dec_Init(CBcj2Dec *p); + +/* Returns: SZ_OK or SZ_ERROR_DATA */ +SRes Bcj2Dec_Decode(CBcj2Dec *p); + +#define Bcj2Dec_IsFinished(_p_) ((_p_)->code == 0) + + + +typedef enum +{ + BCJ2_ENC_FINISH_MODE_CONTINUE, + BCJ2_ENC_FINISH_MODE_END_BLOCK, + BCJ2_ENC_FINISH_MODE_END_STREAM +} EBcj2Enc_FinishMode; + +typedef struct +{ + Byte *bufs[BCJ2_NUM_STREAMS]; + const Byte *lims[BCJ2_NUM_STREAMS]; + const Byte *src; + const Byte *srcLim; + + unsigned state; + EBcj2Enc_FinishMode finishMode; + + Byte prevByte; + + Byte cache; + UInt32 range; + UInt64 low; + UInt64 cacheSize; + + UInt32 ip; + + /* 32-bit ralative offset in JUMP/CALL commands is + - (mod 4 GB) in 32-bit mode + - signed Int32 in 64-bit mode + We use (mod 4 GB) check for fileSize. + Use fileSize up to 2 GB, if you want to support 32-bit and 64-bit code conversion. */ + UInt32 fileIp; + UInt32 fileSize; /* (fileSize <= ((UInt32)1 << 31)), 0 means no_limit */ + UInt32 relatLimit; /* (relatLimit <= ((UInt32)1 << 31)), 0 means desable_conversion */ + + UInt32 tempTarget; + unsigned tempPos; + Byte temp[4 * 2]; + + unsigned flushPos; + + UInt16 probs[2 + 256]; +} CBcj2Enc; + +void Bcj2Enc_Init(CBcj2Enc *p); +void Bcj2Enc_Encode(CBcj2Enc *p); + +#define Bcj2Enc_Get_InputData_Size(p) ((SizeT)((p)->srcLim - (p)->src) + (p)->tempPos) +#define Bcj2Enc_IsFinished(p) ((p)->flushPos == 5) + + +#define BCJ2_RELAT_LIMIT_NUM_BITS 26 +#define BCJ2_RELAT_LIMIT ((UInt32)1 << BCJ2_RELAT_LIMIT_NUM_BITS) + +/* limit for CBcj2Enc::fileSize variable */ +#define BCJ2_FileSize_MAX ((UInt32)1 << 31) + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/Bcj2Enc.c b/deps/LZMA-SDK/C/Bcj2Enc.c index 71ac5091d..682362a15 100644 --- a/deps/LZMA-SDK/C/Bcj2Enc.c +++ b/deps/LZMA-SDK/C/Bcj2Enc.c @@ -1,311 +1,311 @@ -/* Bcj2Enc.c -- BCJ2 Encoder (Converter for x86 code) -2021-02-09 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -/* #define SHOW_STAT */ - -#ifdef SHOW_STAT -#include -#define PRF(x) x -#else -#define PRF(x) -#endif - -#include - -#include "Bcj2.h" -#include "CpuArch.h" - -#define CProb UInt16 - -#define kTopValue ((UInt32)1 << 24) -#define kNumModelBits 11 -#define kBitModelTotal (1 << kNumModelBits) -#define kNumMoveBits 5 - -void Bcj2Enc_Init(CBcj2Enc *p) -{ - unsigned i; - - p->state = BCJ2_ENC_STATE_OK; - p->finishMode = BCJ2_ENC_FINISH_MODE_CONTINUE; - - p->prevByte = 0; - - p->cache = 0; - p->range = 0xFFFFFFFF; - p->low = 0; - p->cacheSize = 1; - - p->ip = 0; - - p->fileIp = 0; - p->fileSize = 0; - p->relatLimit = BCJ2_RELAT_LIMIT; - - p->tempPos = 0; - - p->flushPos = 0; - - for (i = 0; i < sizeof(p->probs) / sizeof(p->probs[0]); i++) - p->probs[i] = kBitModelTotal >> 1; -} - -static BoolInt MY_FAST_CALL RangeEnc_ShiftLow(CBcj2Enc *p) -{ - if ((UInt32)p->low < (UInt32)0xFF000000 || (UInt32)(p->low >> 32) != 0) - { - Byte *buf = p->bufs[BCJ2_STREAM_RC]; - do - { - if (buf == p->lims[BCJ2_STREAM_RC]) - { - p->state = BCJ2_STREAM_RC; - p->bufs[BCJ2_STREAM_RC] = buf; - return True; - } - *buf++ = (Byte)(p->cache + (Byte)(p->low >> 32)); - p->cache = 0xFF; - } - while (--p->cacheSize); - p->bufs[BCJ2_STREAM_RC] = buf; - p->cache = (Byte)((UInt32)p->low >> 24); - } - p->cacheSize++; - p->low = (UInt32)p->low << 8; - return False; -} - -static void Bcj2Enc_Encode_2(CBcj2Enc *p) -{ - if (BCJ2_IS_32BIT_STREAM(p->state)) - { - Byte *cur = p->bufs[p->state]; - if (cur == p->lims[p->state]) - return; - SetBe32(cur, p->tempTarget); - p->bufs[p->state] = cur + 4; - } - - p->state = BCJ2_ENC_STATE_ORIG; - - for (;;) - { - if (p->range < kTopValue) - { - if (RangeEnc_ShiftLow(p)) - return; - p->range <<= 8; - } - - { - { - const Byte *src = p->src; - const Byte *srcLim; - Byte *dest; - SizeT num = (SizeT)(p->srcLim - src); - - if (p->finishMode == BCJ2_ENC_FINISH_MODE_CONTINUE) - { - if (num <= 4) - return; - num -= 4; - } - else if (num == 0) - break; - - dest = p->bufs[BCJ2_STREAM_MAIN]; - if (num > (SizeT)(p->lims[BCJ2_STREAM_MAIN] - dest)) - { - num = (SizeT)(p->lims[BCJ2_STREAM_MAIN] - dest); - if (num == 0) - { - p->state = BCJ2_STREAM_MAIN; - return; - } - } - - srcLim = src + num; - - if (p->prevByte == 0x0F && (src[0] & 0xF0) == 0x80) - *dest = src[0]; - else for (;;) - { - Byte b = *src; - *dest = b; - if (b != 0x0F) - { - if ((b & 0xFE) == 0xE8) - break; - dest++; - if (++src != srcLim) - continue; - break; - } - dest++; - if (++src == srcLim) - break; - if ((*src & 0xF0) != 0x80) - continue; - *dest = *src; - break; - } - - num = (SizeT)(src - p->src); - - if (src == srcLim) - { - p->prevByte = src[-1]; - p->bufs[BCJ2_STREAM_MAIN] = dest; - p->src = src; - p->ip += (UInt32)num; - continue; - } - - { - Byte context = (Byte)(num == 0 ? p->prevByte : src[-1]); - BoolInt needConvert; - - p->bufs[BCJ2_STREAM_MAIN] = dest + 1; - p->ip += (UInt32)num + 1; - src++; - - needConvert = False; - - if ((SizeT)(p->srcLim - src) >= 4) - { - UInt32 relatVal = GetUi32(src); - if ((p->fileSize == 0 || (UInt32)(p->ip + 4 + relatVal - p->fileIp) < p->fileSize) - && ((relatVal + p->relatLimit) >> 1) < p->relatLimit) - needConvert = True; - } - - { - UInt32 bound; - unsigned ttt; - Byte b = src[-1]; - CProb *prob = p->probs + (unsigned)(b == 0xE8 ? 2 + (unsigned)context : (b == 0xE9 ? 1 : 0)); - - ttt = *prob; - bound = (p->range >> kNumModelBits) * ttt; - - if (!needConvert) - { - p->range = bound; - *prob = (CProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); - p->src = src; - p->prevByte = b; - continue; - } - - p->low += bound; - p->range -= bound; - *prob = (CProb)(ttt - (ttt >> kNumMoveBits)); - - { - UInt32 relatVal = GetUi32(src); - UInt32 absVal; - p->ip += 4; - absVal = p->ip + relatVal; - p->prevByte = src[3]; - src += 4; - p->src = src; - { - unsigned cj = (b == 0xE8) ? BCJ2_STREAM_CALL : BCJ2_STREAM_JUMP; - Byte *cur = p->bufs[cj]; - if (cur == p->lims[cj]) - { - p->state = cj; - p->tempTarget = absVal; - return; - } - SetBe32(cur, absVal); - p->bufs[cj] = cur + 4; - } - } - } - } - } - } - } - - if (p->finishMode != BCJ2_ENC_FINISH_MODE_END_STREAM) - return; - - for (; p->flushPos < 5; p->flushPos++) - if (RangeEnc_ShiftLow(p)) - return; - p->state = BCJ2_ENC_STATE_OK; -} - - -void Bcj2Enc_Encode(CBcj2Enc *p) -{ - PRF(printf("\n")); - PRF(printf("---- ip = %8d tempPos = %8d src = %8d\n", p->ip, p->tempPos, p->srcLim - p->src)); - - if (p->tempPos != 0) - { - unsigned extra = 0; - - for (;;) - { - const Byte *src = p->src; - const Byte *srcLim = p->srcLim; - EBcj2Enc_FinishMode finishMode = p->finishMode; - - p->src = p->temp; - p->srcLim = p->temp + p->tempPos; - if (src != srcLim) - p->finishMode = BCJ2_ENC_FINISH_MODE_CONTINUE; - - PRF(printf(" ip = %8d tempPos = %8d src = %8d\n", p->ip, p->tempPos, p->srcLim - p->src)); - - Bcj2Enc_Encode_2(p); - - { - unsigned num = (unsigned)(p->src - p->temp); - unsigned tempPos = p->tempPos - num; - unsigned i; - p->tempPos = tempPos; - for (i = 0; i < tempPos; i++) - p->temp[i] = p->temp[(size_t)i + num]; - - p->src = src; - p->srcLim = srcLim; - p->finishMode = finishMode; - - if (p->state != BCJ2_ENC_STATE_ORIG || src == srcLim) - return; - - if (extra >= tempPos) - { - p->src = src - tempPos; - p->tempPos = 0; - break; - } - - p->temp[tempPos] = src[0]; - p->tempPos = tempPos + 1; - p->src = src + 1; - extra++; - } - } - } - - PRF(printf("++++ ip = %8d tempPos = %8d src = %8d\n", p->ip, p->tempPos, p->srcLim - p->src)); - - Bcj2Enc_Encode_2(p); - - if (p->state == BCJ2_ENC_STATE_ORIG) - { - const Byte *src = p->src; - unsigned rem = (unsigned)(p->srcLim - src); - unsigned i; - for (i = 0; i < rem; i++) - p->temp[i] = src[i]; - p->tempPos = rem; - p->src = src + rem; - } -} +/* Bcj2Enc.c -- BCJ2 Encoder (Converter for x86 code) +2021-02-09 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +/* #define SHOW_STAT */ + +#ifdef SHOW_STAT +#include +#define PRF(x) x +#else +#define PRF(x) +#endif + +#include + +#include "Bcj2.h" +#include "CpuArch.h" + +#define CProb UInt16 + +#define kTopValue ((UInt32)1 << 24) +#define kNumModelBits 11 +#define kBitModelTotal (1 << kNumModelBits) +#define kNumMoveBits 5 + +void Bcj2Enc_Init(CBcj2Enc *p) +{ + unsigned i; + + p->state = BCJ2_ENC_STATE_OK; + p->finishMode = BCJ2_ENC_FINISH_MODE_CONTINUE; + + p->prevByte = 0; + + p->cache = 0; + p->range = 0xFFFFFFFF; + p->low = 0; + p->cacheSize = 1; + + p->ip = 0; + + p->fileIp = 0; + p->fileSize = 0; + p->relatLimit = BCJ2_RELAT_LIMIT; + + p->tempPos = 0; + + p->flushPos = 0; + + for (i = 0; i < sizeof(p->probs) / sizeof(p->probs[0]); i++) + p->probs[i] = kBitModelTotal >> 1; +} + +static BoolInt MY_FAST_CALL RangeEnc_ShiftLow(CBcj2Enc *p) +{ + if ((UInt32)p->low < (UInt32)0xFF000000 || (UInt32)(p->low >> 32) != 0) + { + Byte *buf = p->bufs[BCJ2_STREAM_RC]; + do + { + if (buf == p->lims[BCJ2_STREAM_RC]) + { + p->state = BCJ2_STREAM_RC; + p->bufs[BCJ2_STREAM_RC] = buf; + return True; + } + *buf++ = (Byte)(p->cache + (Byte)(p->low >> 32)); + p->cache = 0xFF; + } + while (--p->cacheSize); + p->bufs[BCJ2_STREAM_RC] = buf; + p->cache = (Byte)((UInt32)p->low >> 24); + } + p->cacheSize++; + p->low = (UInt32)p->low << 8; + return False; +} + +static void Bcj2Enc_Encode_2(CBcj2Enc *p) +{ + if (BCJ2_IS_32BIT_STREAM(p->state)) + { + Byte *cur = p->bufs[p->state]; + if (cur == p->lims[p->state]) + return; + SetBe32(cur, p->tempTarget); + p->bufs[p->state] = cur + 4; + } + + p->state = BCJ2_ENC_STATE_ORIG; + + for (;;) + { + if (p->range < kTopValue) + { + if (RangeEnc_ShiftLow(p)) + return; + p->range <<= 8; + } + + { + { + const Byte *src = p->src; + const Byte *srcLim; + Byte *dest; + SizeT num = (SizeT)(p->srcLim - src); + + if (p->finishMode == BCJ2_ENC_FINISH_MODE_CONTINUE) + { + if (num <= 4) + return; + num -= 4; + } + else if (num == 0) + break; + + dest = p->bufs[BCJ2_STREAM_MAIN]; + if (num > (SizeT)(p->lims[BCJ2_STREAM_MAIN] - dest)) + { + num = (SizeT)(p->lims[BCJ2_STREAM_MAIN] - dest); + if (num == 0) + { + p->state = BCJ2_STREAM_MAIN; + return; + } + } + + srcLim = src + num; + + if (p->prevByte == 0x0F && (src[0] & 0xF0) == 0x80) + *dest = src[0]; + else for (;;) + { + Byte b = *src; + *dest = b; + if (b != 0x0F) + { + if ((b & 0xFE) == 0xE8) + break; + dest++; + if (++src != srcLim) + continue; + break; + } + dest++; + if (++src == srcLim) + break; + if ((*src & 0xF0) != 0x80) + continue; + *dest = *src; + break; + } + + num = (SizeT)(src - p->src); + + if (src == srcLim) + { + p->prevByte = src[-1]; + p->bufs[BCJ2_STREAM_MAIN] = dest; + p->src = src; + p->ip += (UInt32)num; + continue; + } + + { + Byte context = (Byte)(num == 0 ? p->prevByte : src[-1]); + BoolInt needConvert; + + p->bufs[BCJ2_STREAM_MAIN] = dest + 1; + p->ip += (UInt32)num + 1; + src++; + + needConvert = False; + + if ((SizeT)(p->srcLim - src) >= 4) + { + UInt32 relatVal = GetUi32(src); + if ((p->fileSize == 0 || (UInt32)(p->ip + 4 + relatVal - p->fileIp) < p->fileSize) + && ((relatVal + p->relatLimit) >> 1) < p->relatLimit) + needConvert = True; + } + + { + UInt32 bound; + unsigned ttt; + Byte b = src[-1]; + CProb *prob = p->probs + (unsigned)(b == 0xE8 ? 2 + (unsigned)context : (b == 0xE9 ? 1 : 0)); + + ttt = *prob; + bound = (p->range >> kNumModelBits) * ttt; + + if (!needConvert) + { + p->range = bound; + *prob = (CProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); + p->src = src; + p->prevByte = b; + continue; + } + + p->low += bound; + p->range -= bound; + *prob = (CProb)(ttt - (ttt >> kNumMoveBits)); + + { + UInt32 relatVal = GetUi32(src); + UInt32 absVal; + p->ip += 4; + absVal = p->ip + relatVal; + p->prevByte = src[3]; + src += 4; + p->src = src; + { + unsigned cj = (b == 0xE8) ? BCJ2_STREAM_CALL : BCJ2_STREAM_JUMP; + Byte *cur = p->bufs[cj]; + if (cur == p->lims[cj]) + { + p->state = cj; + p->tempTarget = absVal; + return; + } + SetBe32(cur, absVal); + p->bufs[cj] = cur + 4; + } + } + } + } + } + } + } + + if (p->finishMode != BCJ2_ENC_FINISH_MODE_END_STREAM) + return; + + for (; p->flushPos < 5; p->flushPos++) + if (RangeEnc_ShiftLow(p)) + return; + p->state = BCJ2_ENC_STATE_OK; +} + + +void Bcj2Enc_Encode(CBcj2Enc *p) +{ + PRF(printf("\n")); + PRF(printf("---- ip = %8d tempPos = %8d src = %8d\n", p->ip, p->tempPos, p->srcLim - p->src)); + + if (p->tempPos != 0) + { + unsigned extra = 0; + + for (;;) + { + const Byte *src = p->src; + const Byte *srcLim = p->srcLim; + EBcj2Enc_FinishMode finishMode = p->finishMode; + + p->src = p->temp; + p->srcLim = p->temp + p->tempPos; + if (src != srcLim) + p->finishMode = BCJ2_ENC_FINISH_MODE_CONTINUE; + + PRF(printf(" ip = %8d tempPos = %8d src = %8d\n", p->ip, p->tempPos, p->srcLim - p->src)); + + Bcj2Enc_Encode_2(p); + + { + unsigned num = (unsigned)(p->src - p->temp); + unsigned tempPos = p->tempPos - num; + unsigned i; + p->tempPos = tempPos; + for (i = 0; i < tempPos; i++) + p->temp[i] = p->temp[(size_t)i + num]; + + p->src = src; + p->srcLim = srcLim; + p->finishMode = finishMode; + + if (p->state != BCJ2_ENC_STATE_ORIG || src == srcLim) + return; + + if (extra >= tempPos) + { + p->src = src - tempPos; + p->tempPos = 0; + break; + } + + p->temp[tempPos] = src[0]; + p->tempPos = tempPos + 1; + p->src = src + 1; + extra++; + } + } + } + + PRF(printf("++++ ip = %8d tempPos = %8d src = %8d\n", p->ip, p->tempPos, p->srcLim - p->src)); + + Bcj2Enc_Encode_2(p); + + if (p->state == BCJ2_ENC_STATE_ORIG) + { + const Byte *src = p->src; + unsigned rem = (unsigned)(p->srcLim - src); + unsigned i; + for (i = 0; i < rem; i++) + p->temp[i] = src[i]; + p->tempPos = rem; + p->src = src + rem; + } +} diff --git a/deps/LZMA-SDK/C/Bra.c b/deps/LZMA-SDK/C/Bra.c index cdefa4d2e..3b854d9ca 100644 --- a/deps/LZMA-SDK/C/Bra.c +++ b/deps/LZMA-SDK/C/Bra.c @@ -1,230 +1,230 @@ -/* Bra.c -- Converters for RISC code -2021-02-09 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include "CpuArch.h" -#include "Bra.h" - -SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) -{ - Byte *p; - const Byte *lim; - size &= ~(size_t)3; - ip += 4; - p = data; - lim = data + size; - - if (encoding) - - for (;;) - { - for (;;) - { - if (p >= lim) - return (SizeT)(p - data); - p += 4; - if (p[-1] == 0xEB) - break; - } - { - UInt32 v = GetUi32(p - 4); - v <<= 2; - v += ip + (UInt32)(p - data); - v >>= 2; - v &= 0x00FFFFFF; - v |= 0xEB000000; - SetUi32(p - 4, v); - } - } - - for (;;) - { - for (;;) - { - if (p >= lim) - return (SizeT)(p - data); - p += 4; - if (p[-1] == 0xEB) - break; - } - { - UInt32 v = GetUi32(p - 4); - v <<= 2; - v -= ip + (UInt32)(p - data); - v >>= 2; - v &= 0x00FFFFFF; - v |= 0xEB000000; - SetUi32(p - 4, v); - } - } -} - - -SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) -{ - Byte *p; - const Byte *lim; - size &= ~(size_t)1; - p = data; - lim = data + size - 4; - - if (encoding) - - for (;;) - { - UInt32 b1; - for (;;) - { - UInt32 b3; - if (p > lim) - return (SizeT)(p - data); - b1 = p[1]; - b3 = p[3]; - p += 2; - b1 ^= 8; - if ((b3 & b1) >= 0xF8) - break; - } - { - UInt32 v = - ((UInt32)b1 << 19) - + (((UInt32)p[1] & 0x7) << 8) - + (((UInt32)p[-2] << 11)) - + (p[0]); - - p += 2; - { - UInt32 cur = (ip + (UInt32)(p - data)) >> 1; - v += cur; - } - - p[-4] = (Byte)(v >> 11); - p[-3] = (Byte)(0xF0 | ((v >> 19) & 0x7)); - p[-2] = (Byte)v; - p[-1] = (Byte)(0xF8 | (v >> 8)); - } - } - - for (;;) - { - UInt32 b1; - for (;;) - { - UInt32 b3; - if (p > lim) - return (SizeT)(p - data); - b1 = p[1]; - b3 = p[3]; - p += 2; - b1 ^= 8; - if ((b3 & b1) >= 0xF8) - break; - } - { - UInt32 v = - ((UInt32)b1 << 19) - + (((UInt32)p[1] & 0x7) << 8) - + (((UInt32)p[-2] << 11)) - + (p[0]); - - p += 2; - { - UInt32 cur = (ip + (UInt32)(p - data)) >> 1; - v -= cur; - } - - /* - SetUi16(p - 4, (UInt16)(((v >> 11) & 0x7FF) | 0xF000)); - SetUi16(p - 2, (UInt16)(v | 0xF800)); - */ - - p[-4] = (Byte)(v >> 11); - p[-3] = (Byte)(0xF0 | ((v >> 19) & 0x7)); - p[-2] = (Byte)v; - p[-1] = (Byte)(0xF8 | (v >> 8)); - } - } -} - - -SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) -{ - Byte *p; - const Byte *lim; - size &= ~(size_t)3; - ip -= 4; - p = data; - lim = data + size; - - for (;;) - { - for (;;) - { - if (p >= lim) - return (SizeT)(p - data); - p += 4; - /* if ((v & 0xFC000003) == 0x48000001) */ - if ((p[-4] & 0xFC) == 0x48 && (p[-1] & 3) == 1) - break; - } - { - UInt32 v = GetBe32(p - 4); - if (encoding) - v += ip + (UInt32)(p - data); - else - v -= ip + (UInt32)(p - data); - v &= 0x03FFFFFF; - v |= 0x48000000; - SetBe32(p - 4, v); - } - } -} - - -SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) -{ - Byte *p; - const Byte *lim; - size &= ~(size_t)3; - ip -= 4; - p = data; - lim = data + size; - - for (;;) - { - for (;;) - { - if (p >= lim) - return (SizeT)(p - data); - /* - v = GetBe32(p); - p += 4; - m = v + ((UInt32)5 << 29); - m ^= (UInt32)7 << 29; - m += (UInt32)1 << 22; - if ((m & ((UInt32)0x1FF << 23)) == 0) - break; - */ - p += 4; - if ((p[-4] == 0x40 && (p[-3] & 0xC0) == 0) || - (p[-4] == 0x7F && (p[-3] >= 0xC0))) - break; - } - { - UInt32 v = GetBe32(p - 4); - v <<= 2; - if (encoding) - v += ip + (UInt32)(p - data); - else - v -= ip + (UInt32)(p - data); - - v &= 0x01FFFFFF; - v -= (UInt32)1 << 24; - v ^= 0xFF000000; - v >>= 2; - v |= 0x40000000; - SetBe32(p - 4, v); - } - } -} +/* Bra.c -- Converters for RISC code +2021-02-09 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "CpuArch.h" +#include "Bra.h" + +SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) +{ + Byte *p; + const Byte *lim; + size &= ~(size_t)3; + ip += 4; + p = data; + lim = data + size; + + if (encoding) + + for (;;) + { + for (;;) + { + if (p >= lim) + return (SizeT)(p - data); + p += 4; + if (p[-1] == 0xEB) + break; + } + { + UInt32 v = GetUi32(p - 4); + v <<= 2; + v += ip + (UInt32)(p - data); + v >>= 2; + v &= 0x00FFFFFF; + v |= 0xEB000000; + SetUi32(p - 4, v); + } + } + + for (;;) + { + for (;;) + { + if (p >= lim) + return (SizeT)(p - data); + p += 4; + if (p[-1] == 0xEB) + break; + } + { + UInt32 v = GetUi32(p - 4); + v <<= 2; + v -= ip + (UInt32)(p - data); + v >>= 2; + v &= 0x00FFFFFF; + v |= 0xEB000000; + SetUi32(p - 4, v); + } + } +} + + +SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) +{ + Byte *p; + const Byte *lim; + size &= ~(size_t)1; + p = data; + lim = data + size - 4; + + if (encoding) + + for (;;) + { + UInt32 b1; + for (;;) + { + UInt32 b3; + if (p > lim) + return (SizeT)(p - data); + b1 = p[1]; + b3 = p[3]; + p += 2; + b1 ^= 8; + if ((b3 & b1) >= 0xF8) + break; + } + { + UInt32 v = + ((UInt32)b1 << 19) + + (((UInt32)p[1] & 0x7) << 8) + + (((UInt32)p[-2] << 11)) + + (p[0]); + + p += 2; + { + UInt32 cur = (ip + (UInt32)(p - data)) >> 1; + v += cur; + } + + p[-4] = (Byte)(v >> 11); + p[-3] = (Byte)(0xF0 | ((v >> 19) & 0x7)); + p[-2] = (Byte)v; + p[-1] = (Byte)(0xF8 | (v >> 8)); + } + } + + for (;;) + { + UInt32 b1; + for (;;) + { + UInt32 b3; + if (p > lim) + return (SizeT)(p - data); + b1 = p[1]; + b3 = p[3]; + p += 2; + b1 ^= 8; + if ((b3 & b1) >= 0xF8) + break; + } + { + UInt32 v = + ((UInt32)b1 << 19) + + (((UInt32)p[1] & 0x7) << 8) + + (((UInt32)p[-2] << 11)) + + (p[0]); + + p += 2; + { + UInt32 cur = (ip + (UInt32)(p - data)) >> 1; + v -= cur; + } + + /* + SetUi16(p - 4, (UInt16)(((v >> 11) & 0x7FF) | 0xF000)); + SetUi16(p - 2, (UInt16)(v | 0xF800)); + */ + + p[-4] = (Byte)(v >> 11); + p[-3] = (Byte)(0xF0 | ((v >> 19) & 0x7)); + p[-2] = (Byte)v; + p[-1] = (Byte)(0xF8 | (v >> 8)); + } + } +} + + +SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) +{ + Byte *p; + const Byte *lim; + size &= ~(size_t)3; + ip -= 4; + p = data; + lim = data + size; + + for (;;) + { + for (;;) + { + if (p >= lim) + return (SizeT)(p - data); + p += 4; + /* if ((v & 0xFC000003) == 0x48000001) */ + if ((p[-4] & 0xFC) == 0x48 && (p[-1] & 3) == 1) + break; + } + { + UInt32 v = GetBe32(p - 4); + if (encoding) + v += ip + (UInt32)(p - data); + else + v -= ip + (UInt32)(p - data); + v &= 0x03FFFFFF; + v |= 0x48000000; + SetBe32(p - 4, v); + } + } +} + + +SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) +{ + Byte *p; + const Byte *lim; + size &= ~(size_t)3; + ip -= 4; + p = data; + lim = data + size; + + for (;;) + { + for (;;) + { + if (p >= lim) + return (SizeT)(p - data); + /* + v = GetBe32(p); + p += 4; + m = v + ((UInt32)5 << 29); + m ^= (UInt32)7 << 29; + m += (UInt32)1 << 22; + if ((m & ((UInt32)0x1FF << 23)) == 0) + break; + */ + p += 4; + if ((p[-4] == 0x40 && (p[-3] & 0xC0) == 0) || + (p[-4] == 0x7F && (p[-3] >= 0xC0))) + break; + } + { + UInt32 v = GetBe32(p - 4); + v <<= 2; + if (encoding) + v += ip + (UInt32)(p - data); + else + v -= ip + (UInt32)(p - data); + + v &= 0x01FFFFFF; + v -= (UInt32)1 << 24; + v ^= 0xFF000000; + v >>= 2; + v |= 0x40000000; + SetBe32(p - 4, v); + } + } +} diff --git a/deps/LZMA-SDK/C/Bra.h b/deps/LZMA-SDK/C/Bra.h index aba8dce14..855e37a6b 100644 --- a/deps/LZMA-SDK/C/Bra.h +++ b/deps/LZMA-SDK/C/Bra.h @@ -1,64 +1,64 @@ -/* Bra.h -- Branch converters for executables -2013-01-18 : Igor Pavlov : Public domain */ - -#ifndef __BRA_H -#define __BRA_H - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -/* -These functions convert relative addresses to absolute addresses -in CALL instructions to increase the compression ratio. - - In: - data - data buffer - size - size of data - ip - current virtual Instruction Pinter (IP) value - state - state variable for x86 converter - encoding - 0 (for decoding), 1 (for encoding) - - Out: - state - state variable for x86 converter - - Returns: - The number of processed bytes. If you call these functions with multiple calls, - you must start next call with first byte after block of processed bytes. - - Type Endian Alignment LookAhead - - x86 little 1 4 - ARMT little 2 2 - ARM little 4 0 - PPC big 4 0 - SPARC big 4 0 - IA64 little 16 0 - - size must be >= Alignment + LookAhead, if it's not last block. - If (size < Alignment + LookAhead), converter returns 0. - - Example: - - UInt32 ip = 0; - for () - { - ; size must be >= Alignment + LookAhead, if it's not last block - SizeT processed = Convert(data, size, ip, 1); - data += processed; - size -= processed; - ip += processed; - } -*/ - -#define x86_Convert_Init(state) { state = 0; } -SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding); -SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); -SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); -SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); -SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); -SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); - -EXTERN_C_END - -#endif +/* Bra.h -- Branch converters for executables +2013-01-18 : Igor Pavlov : Public domain */ + +#ifndef __BRA_H +#define __BRA_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +/* +These functions convert relative addresses to absolute addresses +in CALL instructions to increase the compression ratio. + + In: + data - data buffer + size - size of data + ip - current virtual Instruction Pinter (IP) value + state - state variable for x86 converter + encoding - 0 (for decoding), 1 (for encoding) + + Out: + state - state variable for x86 converter + + Returns: + The number of processed bytes. If you call these functions with multiple calls, + you must start next call with first byte after block of processed bytes. + + Type Endian Alignment LookAhead + + x86 little 1 4 + ARMT little 2 2 + ARM little 4 0 + PPC big 4 0 + SPARC big 4 0 + IA64 little 16 0 + + size must be >= Alignment + LookAhead, if it's not last block. + If (size < Alignment + LookAhead), converter returns 0. + + Example: + + UInt32 ip = 0; + for () + { + ; size must be >= Alignment + LookAhead, if it's not last block + SizeT processed = Convert(data, size, ip, 1); + data += processed; + size -= processed; + ip += processed; + } +*/ + +#define x86_Convert_Init(state) { state = 0; } +SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding); +SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); +SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); +SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); +SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); +SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding); + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/Bra86.c b/deps/LZMA-SDK/C/Bra86.c index d857dac67..10a0fbd16 100644 --- a/deps/LZMA-SDK/C/Bra86.c +++ b/deps/LZMA-SDK/C/Bra86.c @@ -1,82 +1,82 @@ -/* Bra86.c -- Converter for x86 code (BCJ) -2021-02-09 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include "Bra.h" - -#define Test86MSByte(b) ((((b) + 1) & 0xFE) == 0) - -SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding) -{ - SizeT pos = 0; - UInt32 mask = *state & 7; - if (size < 5) - return 0; - size -= 4; - ip += 5; - - for (;;) - { - Byte *p = data + pos; - const Byte *limit = data + size; - for (; p < limit; p++) - if ((*p & 0xFE) == 0xE8) - break; - - { - SizeT d = (SizeT)(p - data) - pos; - pos = (SizeT)(p - data); - if (p >= limit) - { - *state = (d > 2 ? 0 : mask >> (unsigned)d); - return pos; - } - if (d > 2) - mask = 0; - else - { - mask >>= (unsigned)d; - if (mask != 0 && (mask > 4 || mask == 3 || Test86MSByte(p[(size_t)(mask >> 1) + 1]))) - { - mask = (mask >> 1) | 4; - pos++; - continue; - } - } - } - - if (Test86MSByte(p[4])) - { - UInt32 v = ((UInt32)p[4] << 24) | ((UInt32)p[3] << 16) | ((UInt32)p[2] << 8) | ((UInt32)p[1]); - UInt32 cur = ip + (UInt32)pos; - pos += 5; - if (encoding) - v += cur; - else - v -= cur; - if (mask != 0) - { - unsigned sh = (mask & 6) << 2; - if (Test86MSByte((Byte)(v >> sh))) - { - v ^= (((UInt32)0x100 << sh) - 1); - if (encoding) - v += cur; - else - v -= cur; - } - mask = 0; - } - p[1] = (Byte)v; - p[2] = (Byte)(v >> 8); - p[3] = (Byte)(v >> 16); - p[4] = (Byte)(0 - ((v >> 24) & 1)); - } - else - { - mask = (mask >> 1) | 4; - pos++; - } - } -} +/* Bra86.c -- Converter for x86 code (BCJ) +2021-02-09 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "Bra.h" + +#define Test86MSByte(b) ((((b) + 1) & 0xFE) == 0) + +SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding) +{ + SizeT pos = 0; + UInt32 mask = *state & 7; + if (size < 5) + return 0; + size -= 4; + ip += 5; + + for (;;) + { + Byte *p = data + pos; + const Byte *limit = data + size; + for (; p < limit; p++) + if ((*p & 0xFE) == 0xE8) + break; + + { + SizeT d = (SizeT)(p - data) - pos; + pos = (SizeT)(p - data); + if (p >= limit) + { + *state = (d > 2 ? 0 : mask >> (unsigned)d); + return pos; + } + if (d > 2) + mask = 0; + else + { + mask >>= (unsigned)d; + if (mask != 0 && (mask > 4 || mask == 3 || Test86MSByte(p[(size_t)(mask >> 1) + 1]))) + { + mask = (mask >> 1) | 4; + pos++; + continue; + } + } + } + + if (Test86MSByte(p[4])) + { + UInt32 v = ((UInt32)p[4] << 24) | ((UInt32)p[3] << 16) | ((UInt32)p[2] << 8) | ((UInt32)p[1]); + UInt32 cur = ip + (UInt32)pos; + pos += 5; + if (encoding) + v += cur; + else + v -= cur; + if (mask != 0) + { + unsigned sh = (mask & 6) << 2; + if (Test86MSByte((Byte)(v >> sh))) + { + v ^= (((UInt32)0x100 << sh) - 1); + if (encoding) + v += cur; + else + v -= cur; + } + mask = 0; + } + p[1] = (Byte)v; + p[2] = (Byte)(v >> 8); + p[3] = (Byte)(v >> 16); + p[4] = (Byte)(0 - ((v >> 24) & 1)); + } + else + { + mask = (mask >> 1) | 4; + pos++; + } + } +} diff --git a/deps/LZMA-SDK/C/BraIA64.c b/deps/LZMA-SDK/C/BraIA64.c index 2656907a0..d1dbc62c5 100644 --- a/deps/LZMA-SDK/C/BraIA64.c +++ b/deps/LZMA-SDK/C/BraIA64.c @@ -1,53 +1,53 @@ -/* BraIA64.c -- Converter for IA-64 code -2017-01-26 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include "CpuArch.h" -#include "Bra.h" - -SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) -{ - SizeT i; - if (size < 16) - return 0; - size -= 16; - i = 0; - do - { - unsigned m = ((UInt32)0x334B0000 >> (data[i] & 0x1E)) & 3; - if (m) - { - m++; - do - { - Byte *p = data + (i + (size_t)m * 5 - 8); - if (((p[3] >> m) & 15) == 5 - && (((p[-1] | ((UInt32)p[0] << 8)) >> m) & 0x70) == 0) - { - unsigned raw = GetUi32(p); - unsigned v = raw >> m; - v = (v & 0xFFFFF) | ((v & (1 << 23)) >> 3); - - v <<= 4; - if (encoding) - v += ip + (UInt32)i; - else - v -= ip + (UInt32)i; - v >>= 4; - - v &= 0x1FFFFF; - v += 0x700000; - v &= 0x8FFFFF; - raw &= ~((UInt32)0x8FFFFF << m); - raw |= (v << m); - SetUi32(p, raw); - } - } - while (++m <= 4); - } - i += 16; - } - while (i <= size); - return i; -} +/* BraIA64.c -- Converter for IA-64 code +2017-01-26 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "CpuArch.h" +#include "Bra.h" + +SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding) +{ + SizeT i; + if (size < 16) + return 0; + size -= 16; + i = 0; + do + { + unsigned m = ((UInt32)0x334B0000 >> (data[i] & 0x1E)) & 3; + if (m) + { + m++; + do + { + Byte *p = data + (i + (size_t)m * 5 - 8); + if (((p[3] >> m) & 15) == 5 + && (((p[-1] | ((UInt32)p[0] << 8)) >> m) & 0x70) == 0) + { + unsigned raw = GetUi32(p); + unsigned v = raw >> m; + v = (v & 0xFFFFF) | ((v & (1 << 23)) >> 3); + + v <<= 4; + if (encoding) + v += ip + (UInt32)i; + else + v -= ip + (UInt32)i; + v >>= 4; + + v &= 0x1FFFFF; + v += 0x700000; + v &= 0x8FFFFF; + raw &= ~((UInt32)0x8FFFFF << m); + raw |= (v << m); + SetUi32(p, raw); + } + } + while (++m <= 4); + } + i += 16; + } + while (i <= size); + return i; +} diff --git a/deps/LZMA-SDK/C/Compiler.h b/deps/LZMA-SDK/C/Compiler.h index eba374298..a9816fa5a 100644 --- a/deps/LZMA-SDK/C/Compiler.h +++ b/deps/LZMA-SDK/C/Compiler.h @@ -1,43 +1,43 @@ -/* Compiler.h -2021-01-05 : Igor Pavlov : Public domain */ - -#ifndef __7Z_COMPILER_H -#define __7Z_COMPILER_H - - #ifdef __clang__ - #pragma clang diagnostic ignored "-Wunused-private-field" - #endif - -#ifdef _MSC_VER - - #ifdef UNDER_CE - #define RPC_NO_WINDOWS_H - /* #pragma warning(disable : 4115) // '_RPC_ASYNC_STATE' : named type definition in parentheses */ - #pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union - #pragma warning(disable : 4214) // nonstandard extension used : bit field types other than int - #endif - - #if _MSC_VER >= 1300 - #pragma warning(disable : 4996) // This function or variable may be unsafe - #else - #pragma warning(disable : 4511) // copy constructor could not be generated - #pragma warning(disable : 4512) // assignment operator could not be generated - #pragma warning(disable : 4514) // unreferenced inline function has been removed - #pragma warning(disable : 4702) // unreachable code - #pragma warning(disable : 4710) // not inlined - #pragma warning(disable : 4714) // function marked as __forceinline not inlined - #pragma warning(disable : 4786) // identifier was truncated to '255' characters in the debug information - #endif - - #ifdef __clang__ - #pragma clang diagnostic ignored "-Wdeprecated-declarations" - #pragma clang diagnostic ignored "-Wmicrosoft-exception-spec" - // #pragma clang diagnostic ignored "-Wreserved-id-macro" - #endif - -#endif - -#define UNUSED_VAR(x) (void)x; -/* #define UNUSED_VAR(x) x=x; */ - -#endif +/* Compiler.h +2021-01-05 : Igor Pavlov : Public domain */ + +#ifndef __7Z_COMPILER_H +#define __7Z_COMPILER_H + + #ifdef __clang__ + #pragma clang diagnostic ignored "-Wunused-private-field" + #endif + +#ifdef _MSC_VER + + #ifdef UNDER_CE + #define RPC_NO_WINDOWS_H + /* #pragma warning(disable : 4115) // '_RPC_ASYNC_STATE' : named type definition in parentheses */ + #pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union + #pragma warning(disable : 4214) // nonstandard extension used : bit field types other than int + #endif + + #if _MSC_VER >= 1300 + #pragma warning(disable : 4996) // This function or variable may be unsafe + #else + #pragma warning(disable : 4511) // copy constructor could not be generated + #pragma warning(disable : 4512) // assignment operator could not be generated + #pragma warning(disable : 4514) // unreferenced inline function has been removed + #pragma warning(disable : 4702) // unreachable code + #pragma warning(disable : 4710) // not inlined + #pragma warning(disable : 4714) // function marked as __forceinline not inlined + #pragma warning(disable : 4786) // identifier was truncated to '255' characters in the debug information + #endif + + #ifdef __clang__ + #pragma clang diagnostic ignored "-Wdeprecated-declarations" + #pragma clang diagnostic ignored "-Wmicrosoft-exception-spec" + // #pragma clang diagnostic ignored "-Wreserved-id-macro" + #endif + +#endif + +#define UNUSED_VAR(x) (void)x; +/* #define UNUSED_VAR(x) x=x; */ + +#endif diff --git a/deps/LZMA-SDK/C/CpuArch.c b/deps/LZMA-SDK/C/CpuArch.c index e1443f51b..110ced6d6 100644 --- a/deps/LZMA-SDK/C/CpuArch.c +++ b/deps/LZMA-SDK/C/CpuArch.c @@ -1,438 +1,478 @@ -/* CpuArch.c -- CPU specific code -2021-04-28 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include "CpuArch.h" - -#ifdef MY_CPU_X86_OR_AMD64 - -#if (defined(_MSC_VER) && !defined(MY_CPU_AMD64)) || defined(__GNUC__) -#define USE_ASM -#endif - -#if !defined(USE_ASM) && _MSC_VER >= 1500 -#include -#endif - -#if defined(USE_ASM) && !defined(MY_CPU_AMD64) -static UInt32 CheckFlag(UInt32 flag) -{ - #ifdef _MSC_VER - __asm pushfd; - __asm pop EAX; - __asm mov EDX, EAX; - __asm xor EAX, flag; - __asm push EAX; - __asm popfd; - __asm pushfd; - __asm pop EAX; - __asm xor EAX, EDX; - __asm push EDX; - __asm popfd; - __asm and flag, EAX; - #else - __asm__ __volatile__ ( - "pushf\n\t" - "pop %%EAX\n\t" - "movl %%EAX,%%EDX\n\t" - "xorl %0,%%EAX\n\t" - "push %%EAX\n\t" - "popf\n\t" - "pushf\n\t" - "pop %%EAX\n\t" - "xorl %%EDX,%%EAX\n\t" - "push %%EDX\n\t" - "popf\n\t" - "andl %%EAX, %0\n\t": - "=c" (flag) : "c" (flag) : - "%eax", "%edx"); - #endif - return flag; -} -#define CHECK_CPUID_IS_SUPPORTED if (CheckFlag(1 << 18) == 0 || CheckFlag(1 << 21) == 0) return False; -#else -#define CHECK_CPUID_IS_SUPPORTED -#endif - -#ifndef USE_ASM - #ifdef _MSC_VER - #if _MSC_VER >= 1600 - #define MY__cpuidex __cpuidex - #else - -/* - __cpuid (function == 4) requires subfunction number in ECX. - MSDN: The __cpuid intrinsic clears the ECX register before calling the cpuid instruction. - __cpuid() in new MSVC clears ECX. - __cpuid() in old MSVC (14.00) doesn't clear ECX - We still can use __cpuid for low (function) values that don't require ECX, - but __cpuid() in old MSVC will be incorrect for some function values: (function == 4). - So here we use the hack for old MSVC to send (subFunction) in ECX register to cpuid instruction, - where ECX value is first parameter for FAST_CALL / NO_INLINE function, - So the caller of MY__cpuidex_HACK() sets ECX as subFunction, and - old MSVC for __cpuid() doesn't change ECX and cpuid instruction gets (subFunction) value. - - DON'T remove MY_NO_INLINE and MY_FAST_CALL for MY__cpuidex_HACK() !!! -*/ - -static -MY_NO_INLINE -void MY_FAST_CALL MY__cpuidex_HACK(UInt32 subFunction, int *CPUInfo, UInt32 function) -{ - UNUSED_VAR(subFunction); - __cpuid(CPUInfo, function); -} - - #define MY__cpuidex(info, func, func2) MY__cpuidex_HACK(func2, info, func) - #pragma message("======== MY__cpuidex_HACK WAS USED ========") - #endif - #else - #define MY__cpuidex(info, func, func2) __cpuid(info, func) - #pragma message("======== (INCORRECT ?) cpuid WAS USED ========") - #endif -#endif - - - - -void MyCPUID(UInt32 function, UInt32 *a, UInt32 *b, UInt32 *c, UInt32 *d) -{ - #ifdef USE_ASM - - #ifdef _MSC_VER - - UInt32 a2, b2, c2, d2; - __asm xor EBX, EBX; - __asm xor ECX, ECX; - __asm xor EDX, EDX; - __asm mov EAX, function; - __asm cpuid; - __asm mov a2, EAX; - __asm mov b2, EBX; - __asm mov c2, ECX; - __asm mov d2, EDX; - - *a = a2; - *b = b2; - *c = c2; - *d = d2; - - #else - - __asm__ __volatile__ ( - #if defined(MY_CPU_AMD64) && defined(__PIC__) - "mov %%rbx, %%rdi;" - "cpuid;" - "xchg %%rbx, %%rdi;" - : "=a" (*a) , - "=D" (*b) , - #elif defined(MY_CPU_X86) && defined(__PIC__) - "mov %%ebx, %%edi;" - "cpuid;" - "xchgl %%ebx, %%edi;" - : "=a" (*a) , - "=D" (*b) , - #else - "cpuid" - : "=a" (*a) , - "=b" (*b) , - #endif - "=c" (*c) , - "=d" (*d) - : "0" (function), "c"(0) ) ; - - #endif - - #else - - int CPUInfo[4]; - - MY__cpuidex(CPUInfo, (int)function, 0); - - *a = (UInt32)CPUInfo[0]; - *b = (UInt32)CPUInfo[1]; - *c = (UInt32)CPUInfo[2]; - *d = (UInt32)CPUInfo[3]; - - #endif -} - -BoolInt x86cpuid_CheckAndRead(Cx86cpuid *p) -{ - CHECK_CPUID_IS_SUPPORTED - MyCPUID(0, &p->maxFunc, &p->vendor[0], &p->vendor[2], &p->vendor[1]); - MyCPUID(1, &p->ver, &p->b, &p->c, &p->d); - return True; -} - -static const UInt32 kVendors[][3] = -{ - { 0x756E6547, 0x49656E69, 0x6C65746E}, - { 0x68747541, 0x69746E65, 0x444D4163}, - { 0x746E6543, 0x48727561, 0x736C7561} -}; - -int x86cpuid_GetFirm(const Cx86cpuid *p) -{ - unsigned i; - for (i = 0; i < sizeof(kVendors) / sizeof(kVendors[i]); i++) - { - const UInt32 *v = kVendors[i]; - if (v[0] == p->vendor[0] && - v[1] == p->vendor[1] && - v[2] == p->vendor[2]) - return (int)i; - } - return -1; -} - -BoolInt CPU_Is_InOrder() -{ - Cx86cpuid p; - int firm; - UInt32 family, model; - if (!x86cpuid_CheckAndRead(&p)) - return True; - - family = x86cpuid_GetFamily(p.ver); - model = x86cpuid_GetModel(p.ver); - - firm = x86cpuid_GetFirm(&p); - - switch (firm) - { - case CPU_FIRM_INTEL: return (family < 6 || (family == 6 && ( - /* In-Order Atom CPU */ - model == 0x1C /* 45 nm, N4xx, D4xx, N5xx, D5xx, 230, 330 */ - || model == 0x26 /* 45 nm, Z6xx */ - || model == 0x27 /* 32 nm, Z2460 */ - || model == 0x35 /* 32 nm, Z2760 */ - || model == 0x36 /* 32 nm, N2xxx, D2xxx */ - ))); - case CPU_FIRM_AMD: return (family < 5 || (family == 5 && (model < 6 || model == 0xA))); - case CPU_FIRM_VIA: return (family < 6 || (family == 6 && model < 0xF)); - } - return True; -} - -#if !defined(MY_CPU_AMD64) && defined(_WIN32) -#include -static BoolInt CPU_Sys_Is_SSE_Supported() -{ - OSVERSIONINFO vi; - vi.dwOSVersionInfoSize = sizeof(vi); - if (!GetVersionEx(&vi)) - return False; - return (vi.dwMajorVersion >= 5); -} -#define CHECK_SYS_SSE_SUPPORT if (!CPU_Sys_Is_SSE_Supported()) return False; -#else -#define CHECK_SYS_SSE_SUPPORT -#endif - - -static UInt32 X86_CPUID_ECX_Get_Flags() -{ - Cx86cpuid p; - CHECK_SYS_SSE_SUPPORT - if (!x86cpuid_CheckAndRead(&p)) - return 0; - return p.c; -} - -BoolInt CPU_IsSupported_AES() -{ - return (X86_CPUID_ECX_Get_Flags() >> 25) & 1; -} - -BoolInt CPU_IsSupported_SSSE3() -{ - return (X86_CPUID_ECX_Get_Flags() >> 9) & 1; -} - -BoolInt CPU_IsSupported_SSE41() -{ - return (X86_CPUID_ECX_Get_Flags() >> 19) & 1; -} - -BoolInt CPU_IsSupported_SHA() -{ - Cx86cpuid p; - CHECK_SYS_SSE_SUPPORT - if (!x86cpuid_CheckAndRead(&p)) - return False; - - if (p.maxFunc < 7) - return False; - { - UInt32 d[4] = { 0 }; - MyCPUID(7, &d[0], &d[1], &d[2], &d[3]); - return (d[1] >> 29) & 1; - } -} - -// #include - -#ifdef _WIN32 -#include -#endif - -BoolInt CPU_IsSupported_VAES_AVX2() -{ - Cx86cpuid p; - CHECK_SYS_SSE_SUPPORT - - #ifdef _WIN32 - #define MY__PF_XSAVE_ENABLED 17 - if (!IsProcessorFeaturePresent(MY__PF_XSAVE_ENABLED)) - return False; - #endif - - if (!x86cpuid_CheckAndRead(&p)) - return False; - if (p.maxFunc < 7) - return False; - { - UInt32 d[4] = { 0 }; - MyCPUID(7, &d[0], &d[1], &d[2], &d[3]); - // printf("\ncpuid(7): ebx=%8x ecx=%8x\n", d[1], d[2]); - return 1 - & (d[1] >> 5) // avx2 - // & (d[1] >> 31) // avx512vl - & (d[2] >> 9); // vaes // VEX-256/EVEX - } -} - -BoolInt CPU_IsSupported_PageGB() -{ - Cx86cpuid cpuid; - if (!x86cpuid_CheckAndRead(&cpuid)) - return False; - { - UInt32 d[4] = { 0 }; - MyCPUID(0x80000000, &d[0], &d[1], &d[2], &d[3]); - if (d[0] < 0x80000001) - return False; - } - { - UInt32 d[4] = { 0 }; - MyCPUID(0x80000001, &d[0], &d[1], &d[2], &d[3]); - return (d[3] >> 26) & 1; - } -} - - -#elif defined(MY_CPU_ARM_OR_ARM64) - -#ifdef _WIN32 - -#include - -BoolInt CPU_IsSupported_CRC32() - { return IsProcessorFeaturePresent(PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE) ? 1 : 0; } -BoolInt CPU_IsSupported_CRYPTO() - { return IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE) ? 1 : 0; } - -#else - -#if defined(__APPLE__) - -/* -#include -#include -static void Print_sysctlbyname(const char *name) -{ - size_t bufSize = 256; - char buf[256]; - int res = sysctlbyname(name, &buf, &bufSize, NULL, 0); - { - int i; - printf("\nres = %d : %s : '%s' : bufSize = %d, numeric", res, name, buf, (unsigned)bufSize); - for (i = 0; i < 20; i++) - printf(" %2x", (unsigned)(Byte)buf[i]); - - } -} -*/ - -BoolInt CPU_IsSupported_CRC32(void) -{ - /* - Print_sysctlbyname("hw.pagesize"); - Print_sysctlbyname("machdep.cpu.brand_string"); - */ - - UInt32 val = 0; - if (My_sysctlbyname_Get_UInt32("hw.optional.armv8_crc32", &val) == 0 && val == 1) - return 1; - return 0; -} - -#ifdef MY_CPU_ARM64 -#define APPLE_CRYPTO_SUPPORT_VAL 1 -#else -#define APPLE_CRYPTO_SUPPORT_VAL 0 -#endif - -BoolInt CPU_IsSupported_SHA1(void) { return APPLE_CRYPTO_SUPPORT_VAL; } -BoolInt CPU_IsSupported_SHA2(void) { return APPLE_CRYPTO_SUPPORT_VAL; } -BoolInt CPU_IsSupported_AES (void) { return APPLE_CRYPTO_SUPPORT_VAL; } - - -#else // __APPLE__ - -#include - -#define USE_HWCAP - -#ifdef USE_HWCAP - -#include - -#ifdef MY_CPU_ARM64 - #define MY_HWCAP_CHECK_FUNC(name) \ - BoolInt CPU_IsSupported_ ## name() { return (getauxval(AT_HWCAP) & (HWCAP_ ## name)) ? 1 : 0; } -#elif defined(MY_CPU_ARM) - #define MY_HWCAP_CHECK_FUNC(name) \ - BoolInt CPU_IsSupported_ ## name() { return (getauxval(AT_HWCAP2) & (HWCAP2_ ## name)) ? 1 : 0; } -#endif - -#else // USE_HWCAP - - #define MY_HWCAP_CHECK_FUNC(name) \ - BoolInt CPU_IsSupported_ ## name() { return 0; } - -#endif // USE_HWCAP - -MY_HWCAP_CHECK_FUNC (CRC32) -MY_HWCAP_CHECK_FUNC (SHA1) -MY_HWCAP_CHECK_FUNC (SHA2) -MY_HWCAP_CHECK_FUNC (AES) - -#endif // __APPLE__ -#endif // _WIN32 - -#endif // MY_CPU_ARM_OR_ARM64 - - - -#ifdef __APPLE__ - -#include - -int My_sysctlbyname_Get(const char *name, void *buf, size_t *bufSize) -{ - return sysctlbyname(name, buf, bufSize, NULL, 0); -} - -int My_sysctlbyname_Get_UInt32(const char *name, UInt32 *val) -{ - size_t bufSize = sizeof(*val); - int res = My_sysctlbyname_Get(name, val, &bufSize); - if (res == 0 && bufSize != sizeof(*val)) - return EFAULT; - return res; -} - -#endif +/* CpuArch.c -- CPU specific code +2021-07-13 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "CpuArch.h" + +#ifdef MY_CPU_X86_OR_AMD64 + +#if (defined(_MSC_VER) && !defined(MY_CPU_AMD64)) || defined(__GNUC__) +#define USE_ASM +#endif + +#if !defined(USE_ASM) && _MSC_VER >= 1500 +#include +#endif + +#if defined(USE_ASM) && !defined(MY_CPU_AMD64) +static UInt32 CheckFlag(UInt32 flag) +{ + #ifdef _MSC_VER + __asm pushfd; + __asm pop EAX; + __asm mov EDX, EAX; + __asm xor EAX, flag; + __asm push EAX; + __asm popfd; + __asm pushfd; + __asm pop EAX; + __asm xor EAX, EDX; + __asm push EDX; + __asm popfd; + __asm and flag, EAX; + #else + __asm__ __volatile__ ( + "pushf\n\t" + "pop %%EAX\n\t" + "movl %%EAX,%%EDX\n\t" + "xorl %0,%%EAX\n\t" + "push %%EAX\n\t" + "popf\n\t" + "pushf\n\t" + "pop %%EAX\n\t" + "xorl %%EDX,%%EAX\n\t" + "push %%EDX\n\t" + "popf\n\t" + "andl %%EAX, %0\n\t": + "=c" (flag) : "c" (flag) : + "%eax", "%edx"); + #endif + return flag; +} +#define CHECK_CPUID_IS_SUPPORTED if (CheckFlag(1 << 18) == 0 || CheckFlag(1 << 21) == 0) return False; +#else +#define CHECK_CPUID_IS_SUPPORTED +#endif + +#ifndef USE_ASM + #ifdef _MSC_VER + #if _MSC_VER >= 1600 + #define MY__cpuidex __cpuidex + #else + +/* + __cpuid (function == 4) requires subfunction number in ECX. + MSDN: The __cpuid intrinsic clears the ECX register before calling the cpuid instruction. + __cpuid() in new MSVC clears ECX. + __cpuid() in old MSVC (14.00) doesn't clear ECX + We still can use __cpuid for low (function) values that don't require ECX, + but __cpuid() in old MSVC will be incorrect for some function values: (function == 4). + So here we use the hack for old MSVC to send (subFunction) in ECX register to cpuid instruction, + where ECX value is first parameter for FAST_CALL / NO_INLINE function, + So the caller of MY__cpuidex_HACK() sets ECX as subFunction, and + old MSVC for __cpuid() doesn't change ECX and cpuid instruction gets (subFunction) value. + + DON'T remove MY_NO_INLINE and MY_FAST_CALL for MY__cpuidex_HACK() !!! +*/ + +static +MY_NO_INLINE +void MY_FAST_CALL MY__cpuidex_HACK(UInt32 subFunction, int *CPUInfo, UInt32 function) +{ + UNUSED_VAR(subFunction); + __cpuid(CPUInfo, function); +} + + #define MY__cpuidex(info, func, func2) MY__cpuidex_HACK(func2, info, func) + #pragma message("======== MY__cpuidex_HACK WAS USED ========") + #endif + #else + #define MY__cpuidex(info, func, func2) __cpuid(info, func) + #pragma message("======== (INCORRECT ?) cpuid WAS USED ========") + #endif +#endif + + + + +void MyCPUID(UInt32 function, UInt32 *a, UInt32 *b, UInt32 *c, UInt32 *d) +{ + #ifdef USE_ASM + + #ifdef _MSC_VER + + UInt32 a2, b2, c2, d2; + __asm xor EBX, EBX; + __asm xor ECX, ECX; + __asm xor EDX, EDX; + __asm mov EAX, function; + __asm cpuid; + __asm mov a2, EAX; + __asm mov b2, EBX; + __asm mov c2, ECX; + __asm mov d2, EDX; + + *a = a2; + *b = b2; + *c = c2; + *d = d2; + + #else + + __asm__ __volatile__ ( + #if defined(MY_CPU_AMD64) && defined(__PIC__) + "mov %%rbx, %%rdi;" + "cpuid;" + "xchg %%rbx, %%rdi;" + : "=a" (*a) , + "=D" (*b) , + #elif defined(MY_CPU_X86) && defined(__PIC__) + "mov %%ebx, %%edi;" + "cpuid;" + "xchgl %%ebx, %%edi;" + : "=a" (*a) , + "=D" (*b) , + #else + "cpuid" + : "=a" (*a) , + "=b" (*b) , + #endif + "=c" (*c) , + "=d" (*d) + : "0" (function), "c"(0) ) ; + + #endif + + #else + + int CPUInfo[4]; + + MY__cpuidex(CPUInfo, (int)function, 0); + + *a = (UInt32)CPUInfo[0]; + *b = (UInt32)CPUInfo[1]; + *c = (UInt32)CPUInfo[2]; + *d = (UInt32)CPUInfo[3]; + + #endif +} + +BoolInt x86cpuid_CheckAndRead(Cx86cpuid *p) +{ + CHECK_CPUID_IS_SUPPORTED + MyCPUID(0, &p->maxFunc, &p->vendor[0], &p->vendor[2], &p->vendor[1]); + MyCPUID(1, &p->ver, &p->b, &p->c, &p->d); + return True; +} + +static const UInt32 kVendors[][3] = +{ + { 0x756E6547, 0x49656E69, 0x6C65746E}, + { 0x68747541, 0x69746E65, 0x444D4163}, + { 0x746E6543, 0x48727561, 0x736C7561} +}; + +int x86cpuid_GetFirm(const Cx86cpuid *p) +{ + unsigned i; + for (i = 0; i < sizeof(kVendors) / sizeof(kVendors[i]); i++) + { + const UInt32 *v = kVendors[i]; + if (v[0] == p->vendor[0] && + v[1] == p->vendor[1] && + v[2] == p->vendor[2]) + return (int)i; + } + return -1; +} + +BoolInt CPU_Is_InOrder() +{ + Cx86cpuid p; + int firm; + UInt32 family, model; + if (!x86cpuid_CheckAndRead(&p)) + return True; + + family = x86cpuid_GetFamily(p.ver); + model = x86cpuid_GetModel(p.ver); + + firm = x86cpuid_GetFirm(&p); + + switch (firm) + { + case CPU_FIRM_INTEL: return (family < 6 || (family == 6 && ( + /* In-Order Atom CPU */ + model == 0x1C /* 45 nm, N4xx, D4xx, N5xx, D5xx, 230, 330 */ + || model == 0x26 /* 45 nm, Z6xx */ + || model == 0x27 /* 32 nm, Z2460 */ + || model == 0x35 /* 32 nm, Z2760 */ + || model == 0x36 /* 32 nm, N2xxx, D2xxx */ + ))); + case CPU_FIRM_AMD: return (family < 5 || (family == 5 && (model < 6 || model == 0xA))); + case CPU_FIRM_VIA: return (family < 6 || (family == 6 && model < 0xF)); + } + return True; +} + +#if !defined(MY_CPU_AMD64) && defined(_WIN32) +#include +static BoolInt CPU_Sys_Is_SSE_Supported() +{ + OSVERSIONINFO vi; + vi.dwOSVersionInfoSize = sizeof(vi); + if (!GetVersionEx(&vi)) + return False; + return (vi.dwMajorVersion >= 5); +} +#define CHECK_SYS_SSE_SUPPORT if (!CPU_Sys_Is_SSE_Supported()) return False; +#else +#define CHECK_SYS_SSE_SUPPORT +#endif + + +static UInt32 X86_CPUID_ECX_Get_Flags() +{ + Cx86cpuid p; + CHECK_SYS_SSE_SUPPORT + if (!x86cpuid_CheckAndRead(&p)) + return 0; + return p.c; +} + +BoolInt CPU_IsSupported_AES() +{ + return (X86_CPUID_ECX_Get_Flags() >> 25) & 1; +} + +BoolInt CPU_IsSupported_SSSE3() +{ + return (X86_CPUID_ECX_Get_Flags() >> 9) & 1; +} + +BoolInt CPU_IsSupported_SSE41() +{ + return (X86_CPUID_ECX_Get_Flags() >> 19) & 1; +} + +BoolInt CPU_IsSupported_SHA() +{ + Cx86cpuid p; + CHECK_SYS_SSE_SUPPORT + if (!x86cpuid_CheckAndRead(&p)) + return False; + + if (p.maxFunc < 7) + return False; + { + UInt32 d[4] = { 0 }; + MyCPUID(7, &d[0], &d[1], &d[2], &d[3]); + return (d[1] >> 29) & 1; + } +} + +// #include + +#ifdef _WIN32 +#include +#endif + +BoolInt CPU_IsSupported_AVX2() +{ + Cx86cpuid p; + CHECK_SYS_SSE_SUPPORT + + #ifdef _WIN32 + #define MY__PF_XSAVE_ENABLED 17 + if (!IsProcessorFeaturePresent(MY__PF_XSAVE_ENABLED)) + return False; + #endif + + if (!x86cpuid_CheckAndRead(&p)) + return False; + if (p.maxFunc < 7) + return False; + { + UInt32 d[4] = { 0 }; + MyCPUID(7, &d[0], &d[1], &d[2], &d[3]); + // printf("\ncpuid(7): ebx=%8x ecx=%8x\n", d[1], d[2]); + return 1 + & (d[1] >> 5); // avx2 + } +} + +BoolInt CPU_IsSupported_VAES_AVX2() +{ + Cx86cpuid p; + CHECK_SYS_SSE_SUPPORT + + #ifdef _WIN32 + #define MY__PF_XSAVE_ENABLED 17 + if (!IsProcessorFeaturePresent(MY__PF_XSAVE_ENABLED)) + return False; + #endif + + if (!x86cpuid_CheckAndRead(&p)) + return False; + if (p.maxFunc < 7) + return False; + { + UInt32 d[4] = { 0 }; + MyCPUID(7, &d[0], &d[1], &d[2], &d[3]); + // printf("\ncpuid(7): ebx=%8x ecx=%8x\n", d[1], d[2]); + return 1 + & (d[1] >> 5) // avx2 + // & (d[1] >> 31) // avx512vl + & (d[2] >> 9); // vaes // VEX-256/EVEX + } +} + +BoolInt CPU_IsSupported_PageGB() +{ + Cx86cpuid cpuid; + if (!x86cpuid_CheckAndRead(&cpuid)) + return False; + { + UInt32 d[4] = { 0 }; + MyCPUID(0x80000000, &d[0], &d[1], &d[2], &d[3]); + if (d[0] < 0x80000001) + return False; + } + { + UInt32 d[4] = { 0 }; + MyCPUID(0x80000001, &d[0], &d[1], &d[2], &d[3]); + return (d[3] >> 26) & 1; + } +} + + +#elif defined(MY_CPU_ARM_OR_ARM64) + +#ifdef _WIN32 + +#include + +BoolInt CPU_IsSupported_CRC32() { return IsProcessorFeaturePresent(PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE) ? 1 : 0; } +BoolInt CPU_IsSupported_CRYPTO() { return IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE) ? 1 : 0; } +BoolInt CPU_IsSupported_NEON() { return IsProcessorFeaturePresent(PF_ARM_NEON_INSTRUCTIONS_AVAILABLE) ? 1 : 0; } + +#else + +#if defined(__APPLE__) + +/* +#include +#include +static void Print_sysctlbyname(const char *name) +{ + size_t bufSize = 256; + char buf[256]; + int res = sysctlbyname(name, &buf, &bufSize, NULL, 0); + { + int i; + printf("\nres = %d : %s : '%s' : bufSize = %d, numeric", res, name, buf, (unsigned)bufSize); + for (i = 0; i < 20; i++) + printf(" %2x", (unsigned)(Byte)buf[i]); + + } +} +*/ + +static BoolInt My_sysctlbyname_Get_BoolInt(const char *name) +{ + UInt32 val = 0; + if (My_sysctlbyname_Get_UInt32(name, &val) == 0 && val == 1) + return 1; + return 0; +} + + /* + Print_sysctlbyname("hw.pagesize"); + Print_sysctlbyname("machdep.cpu.brand_string"); + */ + +BoolInt CPU_IsSupported_CRC32(void) +{ + return My_sysctlbyname_Get_BoolInt("hw.optional.armv8_crc32"); +} + +BoolInt CPU_IsSupported_NEON(void) +{ + return My_sysctlbyname_Get_BoolInt("hw.optional.neon"); +} + +#ifdef MY_CPU_ARM64 +#define APPLE_CRYPTO_SUPPORT_VAL 1 +#else +#define APPLE_CRYPTO_SUPPORT_VAL 0 +#endif + +BoolInt CPU_IsSupported_SHA1(void) { return APPLE_CRYPTO_SUPPORT_VAL; } +BoolInt CPU_IsSupported_SHA2(void) { return APPLE_CRYPTO_SUPPORT_VAL; } +BoolInt CPU_IsSupported_AES (void) { return APPLE_CRYPTO_SUPPORT_VAL; } + + +#else // __APPLE__ + +#include + +#define USE_HWCAP + +#ifdef USE_HWCAP + +#include + + #define MY_HWCAP_CHECK_FUNC_2(name1, name2) \ + BoolInt CPU_IsSupported_ ## name1() { return (getauxval(AT_HWCAP) & (HWCAP_ ## name2)) ? 1 : 0; } + +#ifdef MY_CPU_ARM64 + #define MY_HWCAP_CHECK_FUNC(name) \ + MY_HWCAP_CHECK_FUNC_2(name, name) + MY_HWCAP_CHECK_FUNC_2(NEON, ASIMD) +// MY_HWCAP_CHECK_FUNC (ASIMD) +#elif defined(MY_CPU_ARM) + #define MY_HWCAP_CHECK_FUNC(name) \ + BoolInt CPU_IsSupported_ ## name() { return (getauxval(AT_HWCAP2) & (HWCAP2_ ## name)) ? 1 : 0; } + MY_HWCAP_CHECK_FUNC_2(NEON, NEON) +#endif + +#else // USE_HWCAP + + #define MY_HWCAP_CHECK_FUNC(name) \ + BoolInt CPU_IsSupported_ ## name() { return 0; } + MY_HWCAP_CHECK_FUNC(NEON) + +#endif // USE_HWCAP + +MY_HWCAP_CHECK_FUNC (CRC32) +MY_HWCAP_CHECK_FUNC (SHA1) +MY_HWCAP_CHECK_FUNC (SHA2) +MY_HWCAP_CHECK_FUNC (AES) + +#endif // __APPLE__ +#endif // _WIN32 + +#endif // MY_CPU_ARM_OR_ARM64 + + + +#ifdef __APPLE__ + +#include + +int My_sysctlbyname_Get(const char *name, void *buf, size_t *bufSize) +{ + return sysctlbyname(name, buf, bufSize, NULL, 0); +} + +int My_sysctlbyname_Get_UInt32(const char *name, UInt32 *val) +{ + size_t bufSize = sizeof(*val); + int res = My_sysctlbyname_Get(name, val, &bufSize); + if (res == 0 && bufSize != sizeof(*val)) + return EFAULT; + return res; +} + +#endif diff --git a/deps/LZMA-SDK/C/CpuArch.h b/deps/LZMA-SDK/C/CpuArch.h index e1cde536d..4856fbb12 100644 --- a/deps/LZMA-SDK/C/CpuArch.h +++ b/deps/LZMA-SDK/C/CpuArch.h @@ -1,425 +1,445 @@ -/* CpuArch.h -- CPU specific code -2021-04-25 : Igor Pavlov : Public domain */ - -#ifndef __CPU_ARCH_H -#define __CPU_ARCH_H - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -/* -MY_CPU_LE means that CPU is LITTLE ENDIAN. -MY_CPU_BE means that CPU is BIG ENDIAN. -If MY_CPU_LE and MY_CPU_BE are not defined, we don't know about ENDIANNESS of platform. - -MY_CPU_LE_UNALIGN means that CPU is LITTLE ENDIAN and CPU supports unaligned memory accesses. - -MY_CPU_64BIT means that processor can work with 64-bit registers. - MY_CPU_64BIT can be used to select fast code branch - MY_CPU_64BIT doesn't mean that (sizeof(void *) == 8) -*/ - -#if defined(_M_X64) \ - || defined(_M_AMD64) \ - || defined(__x86_64__) \ - || defined(__AMD64__) \ - || defined(__amd64__) - #define MY_CPU_AMD64 - #ifdef __ILP32__ - #define MY_CPU_NAME "x32" - #define MY_CPU_SIZEOF_POINTER 4 - #else - #define MY_CPU_NAME "x64" - #define MY_CPU_SIZEOF_POINTER 8 - #endif - #define MY_CPU_64BIT -#endif - - -#if defined(_M_IX86) \ - || defined(__i386__) - #define MY_CPU_X86 - #define MY_CPU_NAME "x86" - /* #define MY_CPU_32BIT */ - #define MY_CPU_SIZEOF_POINTER 4 -#endif - - -#if defined(_M_ARM64) \ - || defined(__AARCH64EL__) \ - || defined(__AARCH64EB__) \ - || defined(__aarch64__) - #define MY_CPU_ARM64 - #define MY_CPU_NAME "arm64" - #define MY_CPU_64BIT -#endif - - -#if defined(_M_ARM) \ - || defined(_M_ARM_NT) \ - || defined(_M_ARMT) \ - || defined(__arm__) \ - || defined(__thumb__) \ - || defined(__ARMEL__) \ - || defined(__ARMEB__) \ - || defined(__THUMBEL__) \ - || defined(__THUMBEB__) - #define MY_CPU_ARM - - #if defined(__thumb__) || defined(__THUMBEL__) || defined(_M_ARMT) - #define MY_CPU_NAME "armt" - #else - #define MY_CPU_NAME "arm" - #endif - /* #define MY_CPU_32BIT */ - #define MY_CPU_SIZEOF_POINTER 4 -#endif - - -#if defined(_M_IA64) \ - || defined(__ia64__) - #define MY_CPU_IA64 - #define MY_CPU_NAME "ia64" - #define MY_CPU_64BIT -#endif - - -#if defined(__mips64) \ - || defined(__mips64__) \ - || (defined(__mips) && (__mips == 64 || __mips == 4 || __mips == 3)) - #define MY_CPU_NAME "mips64" - #define MY_CPU_64BIT -#elif defined(__mips__) - #define MY_CPU_NAME "mips" - /* #define MY_CPU_32BIT */ -#endif - - -#if defined(__ppc64__) \ - || defined(__powerpc64__) \ - || defined(__ppc__) \ - || defined(__powerpc__) \ - || defined(__PPC__) \ - || defined(_POWER) - -#if defined(__ppc64__) \ - || defined(__powerpc64__) \ - || defined(_LP64) \ - || defined(__64BIT__) - #ifdef __ILP32__ - #define MY_CPU_NAME "ppc64-32" - #define MY_CPU_SIZEOF_POINTER 4 - #else - #define MY_CPU_NAME "ppc64" - #define MY_CPU_SIZEOF_POINTER 8 - #endif - #define MY_CPU_64BIT -#else - #define MY_CPU_NAME "ppc" - #define MY_CPU_SIZEOF_POINTER 4 - /* #define MY_CPU_32BIT */ -#endif -#endif - - -#if defined(__sparc64__) - #define MY_CPU_NAME "sparc64" - #define MY_CPU_64BIT -#elif defined(__sparc__) - #define MY_CPU_NAME "sparc" - /* #define MY_CPU_32BIT */ -#endif - - -#if defined(MY_CPU_X86) || defined(MY_CPU_AMD64) -#define MY_CPU_X86_OR_AMD64 -#endif - -#if defined(MY_CPU_ARM) || defined(MY_CPU_ARM64) -#define MY_CPU_ARM_OR_ARM64 -#endif - - -#ifdef _WIN32 - - #ifdef MY_CPU_ARM - #define MY_CPU_ARM_LE - #endif - - #ifdef MY_CPU_ARM64 - #define MY_CPU_ARM64_LE - #endif - - #ifdef _M_IA64 - #define MY_CPU_IA64_LE - #endif - -#endif - - -#if defined(MY_CPU_X86_OR_AMD64) \ - || defined(MY_CPU_ARM_LE) \ - || defined(MY_CPU_ARM64_LE) \ - || defined(MY_CPU_IA64_LE) \ - || defined(__LITTLE_ENDIAN__) \ - || defined(__ARMEL__) \ - || defined(__THUMBEL__) \ - || defined(__AARCH64EL__) \ - || defined(__MIPSEL__) \ - || defined(__MIPSEL) \ - || defined(_MIPSEL) \ - || defined(__BFIN__) \ - || (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) - #define MY_CPU_LE -#endif - -#if defined(__BIG_ENDIAN__) \ - || defined(__ARMEB__) \ - || defined(__THUMBEB__) \ - || defined(__AARCH64EB__) \ - || defined(__MIPSEB__) \ - || defined(__MIPSEB) \ - || defined(_MIPSEB) \ - || defined(__m68k__) \ - || defined(__s390__) \ - || defined(__s390x__) \ - || defined(__zarch__) \ - || (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) - #define MY_CPU_BE -#endif - - -#if defined(MY_CPU_LE) && defined(MY_CPU_BE) - #error Stop_Compiling_Bad_Endian -#endif - - -#if defined(MY_CPU_32BIT) && defined(MY_CPU_64BIT) - #error Stop_Compiling_Bad_32_64_BIT -#endif - -#ifdef __SIZEOF_POINTER__ - #ifdef MY_CPU_SIZEOF_POINTER - #if MY_CPU_SIZEOF_POINTER != __SIZEOF_POINTER__ - #error Stop_Compiling_Bad_MY_CPU_PTR_SIZE - #endif - #else - #define MY_CPU_SIZEOF_POINTER __SIZEOF_POINTER__ - #endif -#endif - -#if defined(MY_CPU_SIZEOF_POINTER) && (MY_CPU_SIZEOF_POINTER == 4) -#if defined (_LP64) - #error Stop_Compiling_Bad_MY_CPU_PTR_SIZE -#endif -#endif - -#ifdef _MSC_VER - #if _MSC_VER >= 1300 - #define MY_CPU_pragma_pack_push_1 __pragma(pack(push, 1)) - #define MY_CPU_pragma_pop __pragma(pack(pop)) - #else - #define MY_CPU_pragma_pack_push_1 - #define MY_CPU_pragma_pop - #endif -#else - #ifdef __xlC__ - // for XLC compiler: - #define MY_CPU_pragma_pack_push_1 _Pragma("pack(1)") - #define MY_CPU_pragma_pop _Pragma("pack()") - #else - #define MY_CPU_pragma_pack_push_1 _Pragma("pack(push, 1)") - #define MY_CPU_pragma_pop _Pragma("pack(pop)") - #endif -#endif - - -#ifndef MY_CPU_NAME - #ifdef MY_CPU_LE - #define MY_CPU_NAME "LE" - #elif defined(MY_CPU_BE) - #define MY_CPU_NAME "BE" - #else - /* - #define MY_CPU_NAME "" - */ - #endif -#endif - - - - - -#ifdef MY_CPU_LE - #if defined(MY_CPU_X86_OR_AMD64) \ - || defined(MY_CPU_ARM64) \ - || defined(__ARM_FEATURE_UNALIGNED) - #define MY_CPU_LE_UNALIGN - #endif -#endif - - -#ifdef MY_CPU_LE_UNALIGN - -#define GetUi16(p) (*(const UInt16 *)(const void *)(p)) -#define GetUi32(p) (*(const UInt32 *)(const void *)(p)) -#define GetUi64(p) (*(const UInt64 *)(const void *)(p)) - -#define SetUi16(p, v) { *(UInt16 *)(void *)(p) = (v); } -#define SetUi32(p, v) { *(UInt32 *)(void *)(p) = (v); } -#define SetUi64(p, v) { *(UInt64 *)(void *)(p) = (v); } - -#else - -#define GetUi16(p) ( (UInt16) ( \ - ((const Byte *)(p))[0] | \ - ((UInt16)((const Byte *)(p))[1] << 8) )) - -#define GetUi32(p) ( \ - ((const Byte *)(p))[0] | \ - ((UInt32)((const Byte *)(p))[1] << 8) | \ - ((UInt32)((const Byte *)(p))[2] << 16) | \ - ((UInt32)((const Byte *)(p))[3] << 24)) - -#define GetUi64(p) (GetUi32(p) | ((UInt64)GetUi32(((const Byte *)(p)) + 4) << 32)) - -#define SetUi16(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v); \ - _ppp_[0] = (Byte)_vvv_; \ - _ppp_[1] = (Byte)(_vvv_ >> 8); } - -#define SetUi32(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v); \ - _ppp_[0] = (Byte)_vvv_; \ - _ppp_[1] = (Byte)(_vvv_ >> 8); \ - _ppp_[2] = (Byte)(_vvv_ >> 16); \ - _ppp_[3] = (Byte)(_vvv_ >> 24); } - -#define SetUi64(p, v) { Byte *_ppp2_ = (Byte *)(p); UInt64 _vvv2_ = (v); \ - SetUi32(_ppp2_ , (UInt32)_vvv2_); \ - SetUi32(_ppp2_ + 4, (UInt32)(_vvv2_ >> 32)); } - -#endif - -#ifdef __has_builtin - #define MY__has_builtin(x) __has_builtin(x) -#else - #define MY__has_builtin(x) 0 -#endif - -#if defined(MY_CPU_LE_UNALIGN) && /* defined(_WIN64) && */ defined(_MSC_VER) && (_MSC_VER >= 1300) - -/* Note: we use bswap instruction, that is unsupported in 386 cpu */ - -#include - -#pragma intrinsic(_byteswap_ushort) -#pragma intrinsic(_byteswap_ulong) -#pragma intrinsic(_byteswap_uint64) - -/* #define GetBe16(p) _byteswap_ushort(*(const UInt16 *)(const Byte *)(p)) */ -#define GetBe32(p) _byteswap_ulong (*(const UInt32 *)(const void *)(p)) -#define GetBe64(p) _byteswap_uint64(*(const UInt64 *)(const void *)(p)) - -#define SetBe32(p, v) (*(UInt32 *)(void *)(p)) = _byteswap_ulong(v) - -#elif defined(MY_CPU_LE_UNALIGN) && ( \ - (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) \ - || (defined(__clang__) && MY__has_builtin(__builtin_bswap16)) ) - -/* #define GetBe16(p) __builtin_bswap16(*(const UInt16 *)(const void *)(p)) */ -#define GetBe32(p) __builtin_bswap32(*(const UInt32 *)(const void *)(p)) -#define GetBe64(p) __builtin_bswap64(*(const UInt64 *)(const void *)(p)) - -#define SetBe32(p, v) (*(UInt32 *)(void *)(p)) = __builtin_bswap32(v) - -#else - -#define GetBe32(p) ( \ - ((UInt32)((const Byte *)(p))[0] << 24) | \ - ((UInt32)((const Byte *)(p))[1] << 16) | \ - ((UInt32)((const Byte *)(p))[2] << 8) | \ - ((const Byte *)(p))[3] ) - -#define GetBe64(p) (((UInt64)GetBe32(p) << 32) | GetBe32(((const Byte *)(p)) + 4)) - -#define SetBe32(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v); \ - _ppp_[0] = (Byte)(_vvv_ >> 24); \ - _ppp_[1] = (Byte)(_vvv_ >> 16); \ - _ppp_[2] = (Byte)(_vvv_ >> 8); \ - _ppp_[3] = (Byte)_vvv_; } - -#endif - - -#ifndef GetBe16 - -#define GetBe16(p) ( (UInt16) ( \ - ((UInt16)((const Byte *)(p))[0] << 8) | \ - ((const Byte *)(p))[1] )) - -#endif - - - -#ifdef MY_CPU_X86_OR_AMD64 - -typedef struct -{ - UInt32 maxFunc; - UInt32 vendor[3]; - UInt32 ver; - UInt32 b; - UInt32 c; - UInt32 d; -} Cx86cpuid; - -enum -{ - CPU_FIRM_INTEL, - CPU_FIRM_AMD, - CPU_FIRM_VIA -}; - -void MyCPUID(UInt32 function, UInt32 *a, UInt32 *b, UInt32 *c, UInt32 *d); - -BoolInt x86cpuid_CheckAndRead(Cx86cpuid *p); -int x86cpuid_GetFirm(const Cx86cpuid *p); - -#define x86cpuid_GetFamily(ver) (((ver >> 16) & 0xFF0) | ((ver >> 8) & 0xF)) -#define x86cpuid_GetModel(ver) (((ver >> 12) & 0xF0) | ((ver >> 4) & 0xF)) -#define x86cpuid_GetStepping(ver) (ver & 0xF) - -BoolInt CPU_Is_InOrder(void); - -BoolInt CPU_IsSupported_AES(void); -BoolInt CPU_IsSupported_VAES_AVX2(void); -BoolInt CPU_IsSupported_SSSE3(void); -BoolInt CPU_IsSupported_SSE41(void); -BoolInt CPU_IsSupported_SHA(void); -BoolInt CPU_IsSupported_PageGB(void); - -#elif defined(MY_CPU_ARM_OR_ARM64) - -BoolInt CPU_IsSupported_CRC32(void); - -#if defined(_WIN32) -BoolInt CPU_IsSupported_CRYPTO(void); -#define CPU_IsSupported_SHA1 CPU_IsSupported_CRYPTO -#define CPU_IsSupported_SHA2 CPU_IsSupported_CRYPTO -#define CPU_IsSupported_AES CPU_IsSupported_CRYPTO -#else -BoolInt CPU_IsSupported_SHA1(void); -BoolInt CPU_IsSupported_SHA2(void); -BoolInt CPU_IsSupported_AES(void); -#endif - -#endif - -#if defined(__APPLE__) -int My_sysctlbyname_Get(const char *name, void *buf, size_t *bufSize); -int My_sysctlbyname_Get_UInt32(const char *name, UInt32 *val); -#endif - -EXTERN_C_END - -#endif +/* CpuArch.h -- CPU specific code +2022-07-15 : Igor Pavlov : Public domain */ + +#ifndef __CPU_ARCH_H +#define __CPU_ARCH_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +/* +MY_CPU_LE means that CPU is LITTLE ENDIAN. +MY_CPU_BE means that CPU is BIG ENDIAN. +If MY_CPU_LE and MY_CPU_BE are not defined, we don't know about ENDIANNESS of platform. + +MY_CPU_LE_UNALIGN means that CPU is LITTLE ENDIAN and CPU supports unaligned memory accesses. + +MY_CPU_64BIT means that processor can work with 64-bit registers. + MY_CPU_64BIT can be used to select fast code branch + MY_CPU_64BIT doesn't mean that (sizeof(void *) == 8) +*/ + +#if defined(_M_X64) \ + || defined(_M_AMD64) \ + || defined(__x86_64__) \ + || defined(__AMD64__) \ + || defined(__amd64__) + #define MY_CPU_AMD64 + #ifdef __ILP32__ + #define MY_CPU_NAME "x32" + #define MY_CPU_SIZEOF_POINTER 4 + #else + #define MY_CPU_NAME "x64" + #define MY_CPU_SIZEOF_POINTER 8 + #endif + #define MY_CPU_64BIT +#endif + + +#if defined(_M_IX86) \ + || defined(__i386__) + #define MY_CPU_X86 + #define MY_CPU_NAME "x86" + /* #define MY_CPU_32BIT */ + #define MY_CPU_SIZEOF_POINTER 4 +#endif + + +#if defined(_M_ARM64) \ + || defined(__AARCH64EL__) \ + || defined(__AARCH64EB__) \ + || defined(__aarch64__) + #define MY_CPU_ARM64 + #define MY_CPU_NAME "arm64" + #define MY_CPU_64BIT +#endif + + +#if defined(_M_ARM) \ + || defined(_M_ARM_NT) \ + || defined(_M_ARMT) \ + || defined(__arm__) \ + || defined(__thumb__) \ + || defined(__ARMEL__) \ + || defined(__ARMEB__) \ + || defined(__THUMBEL__) \ + || defined(__THUMBEB__) + #define MY_CPU_ARM + + #if defined(__thumb__) || defined(__THUMBEL__) || defined(_M_ARMT) + #define MY_CPU_NAME "armt" + #else + #define MY_CPU_NAME "arm" + #endif + /* #define MY_CPU_32BIT */ + #define MY_CPU_SIZEOF_POINTER 4 +#endif + + +#if defined(_M_IA64) \ + || defined(__ia64__) + #define MY_CPU_IA64 + #define MY_CPU_NAME "ia64" + #define MY_CPU_64BIT +#endif + + +#if defined(__mips64) \ + || defined(__mips64__) \ + || (defined(__mips) && (__mips == 64 || __mips == 4 || __mips == 3)) + #define MY_CPU_NAME "mips64" + #define MY_CPU_64BIT +#elif defined(__mips__) + #define MY_CPU_NAME "mips" + /* #define MY_CPU_32BIT */ +#endif + + +#if defined(__ppc64__) \ + || defined(__powerpc64__) \ + || defined(__ppc__) \ + || defined(__powerpc__) \ + || defined(__PPC__) \ + || defined(_POWER) + +#if defined(__ppc64__) \ + || defined(__powerpc64__) \ + || defined(_LP64) \ + || defined(__64BIT__) + #ifdef __ILP32__ + #define MY_CPU_NAME "ppc64-32" + #define MY_CPU_SIZEOF_POINTER 4 + #else + #define MY_CPU_NAME "ppc64" + #define MY_CPU_SIZEOF_POINTER 8 + #endif + #define MY_CPU_64BIT +#else + #define MY_CPU_NAME "ppc" + #define MY_CPU_SIZEOF_POINTER 4 + /* #define MY_CPU_32BIT */ +#endif +#endif + + +#if defined(__riscv) \ + || defined(__riscv__) + #if __riscv_xlen == 32 + #define MY_CPU_NAME "riscv32" + #elif __riscv_xlen == 64 + #define MY_CPU_NAME "riscv64" + #else + #define MY_CPU_NAME "riscv" + #endif +#endif + + +#if defined(MY_CPU_X86) || defined(MY_CPU_AMD64) +#define MY_CPU_X86_OR_AMD64 +#endif + +#if defined(MY_CPU_ARM) || defined(MY_CPU_ARM64) +#define MY_CPU_ARM_OR_ARM64 +#endif + + +#ifdef _WIN32 + + #ifdef MY_CPU_ARM + #define MY_CPU_ARM_LE + #endif + + #ifdef MY_CPU_ARM64 + #define MY_CPU_ARM64_LE + #endif + + #ifdef _M_IA64 + #define MY_CPU_IA64_LE + #endif + +#endif + + +#if defined(MY_CPU_X86_OR_AMD64) \ + || defined(MY_CPU_ARM_LE) \ + || defined(MY_CPU_ARM64_LE) \ + || defined(MY_CPU_IA64_LE) \ + || defined(__LITTLE_ENDIAN__) \ + || defined(__ARMEL__) \ + || defined(__THUMBEL__) \ + || defined(__AARCH64EL__) \ + || defined(__MIPSEL__) \ + || defined(__MIPSEL) \ + || defined(_MIPSEL) \ + || defined(__BFIN__) \ + || (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) + #define MY_CPU_LE +#endif + +#if defined(__BIG_ENDIAN__) \ + || defined(__ARMEB__) \ + || defined(__THUMBEB__) \ + || defined(__AARCH64EB__) \ + || defined(__MIPSEB__) \ + || defined(__MIPSEB) \ + || defined(_MIPSEB) \ + || defined(__m68k__) \ + || defined(__s390__) \ + || defined(__s390x__) \ + || defined(__zarch__) \ + || (defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) + #define MY_CPU_BE +#endif + + +#if defined(MY_CPU_LE) && defined(MY_CPU_BE) + #error Stop_Compiling_Bad_Endian +#endif + + +#if defined(MY_CPU_32BIT) && defined(MY_CPU_64BIT) + #error Stop_Compiling_Bad_32_64_BIT +#endif + +#ifdef __SIZEOF_POINTER__ + #ifdef MY_CPU_SIZEOF_POINTER + #if MY_CPU_SIZEOF_POINTER != __SIZEOF_POINTER__ + #error Stop_Compiling_Bad_MY_CPU_PTR_SIZE + #endif + #else + #define MY_CPU_SIZEOF_POINTER __SIZEOF_POINTER__ + #endif +#endif + +#if defined(MY_CPU_SIZEOF_POINTER) && (MY_CPU_SIZEOF_POINTER == 4) +#if defined (_LP64) + #error Stop_Compiling_Bad_MY_CPU_PTR_SIZE +#endif +#endif + +#ifdef _MSC_VER + #if _MSC_VER >= 1300 + #define MY_CPU_pragma_pack_push_1 __pragma(pack(push, 1)) + #define MY_CPU_pragma_pop __pragma(pack(pop)) + #else + #define MY_CPU_pragma_pack_push_1 + #define MY_CPU_pragma_pop + #endif +#else + #ifdef __xlC__ + #define MY_CPU_pragma_pack_push_1 _Pragma("pack(1)") + #define MY_CPU_pragma_pop _Pragma("pack()") + #else + #define MY_CPU_pragma_pack_push_1 _Pragma("pack(push, 1)") + #define MY_CPU_pragma_pop _Pragma("pack(pop)") + #endif +#endif + + +#ifndef MY_CPU_NAME + #ifdef MY_CPU_LE + #define MY_CPU_NAME "LE" + #elif defined(MY_CPU_BE) + #define MY_CPU_NAME "BE" + #else + /* + #define MY_CPU_NAME "" + */ + #endif +#endif + + + + + +#ifdef MY_CPU_LE + #if defined(MY_CPU_X86_OR_AMD64) \ + || defined(MY_CPU_ARM64) + #define MY_CPU_LE_UNALIGN + #define MY_CPU_LE_UNALIGN_64 + #elif defined(__ARM_FEATURE_UNALIGNED) + /* gcc9 for 32-bit arm can use LDRD instruction that requires 32-bit alignment. + So we can't use unaligned 64-bit operations. */ + #define MY_CPU_LE_UNALIGN + #endif +#endif + + +#ifdef MY_CPU_LE_UNALIGN + +#define GetUi16(p) (*(const UInt16 *)(const void *)(p)) +#define GetUi32(p) (*(const UInt32 *)(const void *)(p)) +#ifdef MY_CPU_LE_UNALIGN_64 +#define GetUi64(p) (*(const UInt64 *)(const void *)(p)) +#endif + +#define SetUi16(p, v) { *(UInt16 *)(void *)(p) = (v); } +#define SetUi32(p, v) { *(UInt32 *)(void *)(p) = (v); } +#ifdef MY_CPU_LE_UNALIGN_64 +#define SetUi64(p, v) { *(UInt64 *)(void *)(p) = (v); } +#endif + +#else + +#define GetUi16(p) ( (UInt16) ( \ + ((const Byte *)(p))[0] | \ + ((UInt16)((const Byte *)(p))[1] << 8) )) + +#define GetUi32(p) ( \ + ((const Byte *)(p))[0] | \ + ((UInt32)((const Byte *)(p))[1] << 8) | \ + ((UInt32)((const Byte *)(p))[2] << 16) | \ + ((UInt32)((const Byte *)(p))[3] << 24)) + +#define SetUi16(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v); \ + _ppp_[0] = (Byte)_vvv_; \ + _ppp_[1] = (Byte)(_vvv_ >> 8); } + +#define SetUi32(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v); \ + _ppp_[0] = (Byte)_vvv_; \ + _ppp_[1] = (Byte)(_vvv_ >> 8); \ + _ppp_[2] = (Byte)(_vvv_ >> 16); \ + _ppp_[3] = (Byte)(_vvv_ >> 24); } + +#endif + + +#ifndef MY_CPU_LE_UNALIGN_64 + +#define GetUi64(p) (GetUi32(p) | ((UInt64)GetUi32(((const Byte *)(p)) + 4) << 32)) + +#define SetUi64(p, v) { Byte *_ppp2_ = (Byte *)(p); UInt64 _vvv2_ = (v); \ + SetUi32(_ppp2_ , (UInt32)_vvv2_); \ + SetUi32(_ppp2_ + 4, (UInt32)(_vvv2_ >> 32)); } + +#endif + + + + +#ifdef __has_builtin + #define MY__has_builtin(x) __has_builtin(x) +#else + #define MY__has_builtin(x) 0 +#endif + +#if defined(MY_CPU_LE_UNALIGN) && /* defined(_WIN64) && */ defined(_MSC_VER) && (_MSC_VER >= 1300) + +/* Note: we use bswap instruction, that is unsupported in 386 cpu */ + +#include + +#pragma intrinsic(_byteswap_ushort) +#pragma intrinsic(_byteswap_ulong) +#pragma intrinsic(_byteswap_uint64) + +/* #define GetBe16(p) _byteswap_ushort(*(const UInt16 *)(const Byte *)(p)) */ +#define GetBe32(p) _byteswap_ulong (*(const UInt32 *)(const void *)(p)) +#define GetBe64(p) _byteswap_uint64(*(const UInt64 *)(const void *)(p)) + +#define SetBe32(p, v) (*(UInt32 *)(void *)(p)) = _byteswap_ulong(v) + +#elif defined(MY_CPU_LE_UNALIGN) && ( \ + (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))) \ + || (defined(__clang__) && MY__has_builtin(__builtin_bswap16)) ) + +/* #define GetBe16(p) __builtin_bswap16(*(const UInt16 *)(const void *)(p)) */ +#define GetBe32(p) __builtin_bswap32(*(const UInt32 *)(const void *)(p)) +#define GetBe64(p) __builtin_bswap64(*(const UInt64 *)(const void *)(p)) + +#define SetBe32(p, v) (*(UInt32 *)(void *)(p)) = __builtin_bswap32(v) + +#else + +#define GetBe32(p) ( \ + ((UInt32)((const Byte *)(p))[0] << 24) | \ + ((UInt32)((const Byte *)(p))[1] << 16) | \ + ((UInt32)((const Byte *)(p))[2] << 8) | \ + ((const Byte *)(p))[3] ) + +#define GetBe64(p) (((UInt64)GetBe32(p) << 32) | GetBe32(((const Byte *)(p)) + 4)) + +#define SetBe32(p, v) { Byte *_ppp_ = (Byte *)(p); UInt32 _vvv_ = (v); \ + _ppp_[0] = (Byte)(_vvv_ >> 24); \ + _ppp_[1] = (Byte)(_vvv_ >> 16); \ + _ppp_[2] = (Byte)(_vvv_ >> 8); \ + _ppp_[3] = (Byte)_vvv_; } + +#endif + + +#ifndef GetBe16 + +#define GetBe16(p) ( (UInt16) ( \ + ((UInt16)((const Byte *)(p))[0] << 8) | \ + ((const Byte *)(p))[1] )) + +#endif + + + +#ifdef MY_CPU_X86_OR_AMD64 + +typedef struct +{ + UInt32 maxFunc; + UInt32 vendor[3]; + UInt32 ver; + UInt32 b; + UInt32 c; + UInt32 d; +} Cx86cpuid; + +enum +{ + CPU_FIRM_INTEL, + CPU_FIRM_AMD, + CPU_FIRM_VIA +}; + +void MyCPUID(UInt32 function, UInt32 *a, UInt32 *b, UInt32 *c, UInt32 *d); + +BoolInt x86cpuid_CheckAndRead(Cx86cpuid *p); +int x86cpuid_GetFirm(const Cx86cpuid *p); + +#define x86cpuid_GetFamily(ver) (((ver >> 16) & 0xFF0) | ((ver >> 8) & 0xF)) +#define x86cpuid_GetModel(ver) (((ver >> 12) & 0xF0) | ((ver >> 4) & 0xF)) +#define x86cpuid_GetStepping(ver) (ver & 0xF) + +BoolInt CPU_Is_InOrder(void); + +BoolInt CPU_IsSupported_AES(void); +BoolInt CPU_IsSupported_AVX2(void); +BoolInt CPU_IsSupported_VAES_AVX2(void); +BoolInt CPU_IsSupported_SSSE3(void); +BoolInt CPU_IsSupported_SSE41(void); +BoolInt CPU_IsSupported_SHA(void); +BoolInt CPU_IsSupported_PageGB(void); + +#elif defined(MY_CPU_ARM_OR_ARM64) + +BoolInt CPU_IsSupported_CRC32(void); +BoolInt CPU_IsSupported_NEON(void); + +#if defined(_WIN32) +BoolInt CPU_IsSupported_CRYPTO(void); +#define CPU_IsSupported_SHA1 CPU_IsSupported_CRYPTO +#define CPU_IsSupported_SHA2 CPU_IsSupported_CRYPTO +#define CPU_IsSupported_AES CPU_IsSupported_CRYPTO +#else +BoolInt CPU_IsSupported_SHA1(void); +BoolInt CPU_IsSupported_SHA2(void); +BoolInt CPU_IsSupported_AES(void); +#endif + +#endif + +#if defined(__APPLE__) +int My_sysctlbyname_Get(const char *name, void *buf, size_t *bufSize); +int My_sysctlbyname_Get_UInt32(const char *name, UInt32 *val); +#endif + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/Delta.c b/deps/LZMA-SDK/C/Delta.c index fc7e9fe96..c4a4499fe 100644 --- a/deps/LZMA-SDK/C/Delta.c +++ b/deps/LZMA-SDK/C/Delta.c @@ -1,169 +1,169 @@ -/* Delta.c -- Delta converter -2021-02-09 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include "Delta.h" - -void Delta_Init(Byte *state) -{ - unsigned i; - for (i = 0; i < DELTA_STATE_SIZE; i++) - state[i] = 0; -} - - -void Delta_Encode(Byte *state, unsigned delta, Byte *data, SizeT size) -{ - Byte temp[DELTA_STATE_SIZE]; - - if (size == 0) - return; - - { - unsigned i = 0; - do - temp[i] = state[i]; - while (++i != delta); - } - - if (size <= delta) - { - unsigned i = 0, k; - do - { - Byte b = *data; - *data++ = (Byte)(b - temp[i]); - temp[i] = b; - } - while (++i != size); - - k = 0; - - do - { - if (i == delta) - i = 0; - state[k] = temp[i++]; - } - while (++k != delta); - - return; - } - - { - Byte *p = data + size - delta; - { - unsigned i = 0; - do - state[i] = *p++; - while (++i != delta); - } - { - const Byte *lim = data + delta; - ptrdiff_t dif = -(ptrdiff_t)delta; - - if (((ptrdiff_t)size + dif) & 1) - { - --p; *p = (Byte)(*p - p[dif]); - } - - while (p != lim) - { - --p; *p = (Byte)(*p - p[dif]); - --p; *p = (Byte)(*p - p[dif]); - } - - dif = -dif; - - do - { - --p; *p = (Byte)(*p - temp[--dif]); - } - while (dif != 0); - } - } -} - - -void Delta_Decode(Byte *state, unsigned delta, Byte *data, SizeT size) -{ - unsigned i; - const Byte *lim; - - if (size == 0) - return; - - i = 0; - lim = data + size; - - if (size <= delta) - { - do - *data = (Byte)(*data + state[i++]); - while (++data != lim); - - for (; delta != i; state++, delta--) - *state = state[i]; - data -= i; - } - else - { - /* - #define B(n) b ## n - #define I(n) Byte B(n) = state[n]; - #define U(n) { B(n) = (Byte)((B(n)) + *data++); data[-1] = (B(n)); } - #define F(n) if (data != lim) { U(n) } - - if (delta == 1) - { - I(0) - if ((lim - data) & 1) { U(0) } - while (data != lim) { U(0) U(0) } - data -= 1; - } - else if (delta == 2) - { - I(0) I(1) - lim -= 1; while (data < lim) { U(0) U(1) } - lim += 1; F(0) - data -= 2; - } - else if (delta == 3) - { - I(0) I(1) I(2) - lim -= 2; while (data < lim) { U(0) U(1) U(2) } - lim += 2; F(0) F(1) - data -= 3; - } - else if (delta == 4) - { - I(0) I(1) I(2) I(3) - lim -= 3; while (data < lim) { U(0) U(1) U(2) U(3) } - lim += 3; F(0) F(1) F(2) - data -= 4; - } - else - */ - { - do - { - *data = (Byte)(*data + state[i++]); - data++; - } - while (i != delta); - - { - ptrdiff_t dif = -(ptrdiff_t)delta; - do - *data = (Byte)(*data + data[dif]); - while (++data != lim); - data += dif; - } - } - } - - do - *state++ = *data; - while (++data != lim); -} +/* Delta.c -- Delta converter +2021-02-09 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "Delta.h" + +void Delta_Init(Byte *state) +{ + unsigned i; + for (i = 0; i < DELTA_STATE_SIZE; i++) + state[i] = 0; +} + + +void Delta_Encode(Byte *state, unsigned delta, Byte *data, SizeT size) +{ + Byte temp[DELTA_STATE_SIZE]; + + if (size == 0) + return; + + { + unsigned i = 0; + do + temp[i] = state[i]; + while (++i != delta); + } + + if (size <= delta) + { + unsigned i = 0, k; + do + { + Byte b = *data; + *data++ = (Byte)(b - temp[i]); + temp[i] = b; + } + while (++i != size); + + k = 0; + + do + { + if (i == delta) + i = 0; + state[k] = temp[i++]; + } + while (++k != delta); + + return; + } + + { + Byte *p = data + size - delta; + { + unsigned i = 0; + do + state[i] = *p++; + while (++i != delta); + } + { + const Byte *lim = data + delta; + ptrdiff_t dif = -(ptrdiff_t)delta; + + if (((ptrdiff_t)size + dif) & 1) + { + --p; *p = (Byte)(*p - p[dif]); + } + + while (p != lim) + { + --p; *p = (Byte)(*p - p[dif]); + --p; *p = (Byte)(*p - p[dif]); + } + + dif = -dif; + + do + { + --p; *p = (Byte)(*p - temp[--dif]); + } + while (dif != 0); + } + } +} + + +void Delta_Decode(Byte *state, unsigned delta, Byte *data, SizeT size) +{ + unsigned i; + const Byte *lim; + + if (size == 0) + return; + + i = 0; + lim = data + size; + + if (size <= delta) + { + do + *data = (Byte)(*data + state[i++]); + while (++data != lim); + + for (; delta != i; state++, delta--) + *state = state[i]; + data -= i; + } + else + { + /* + #define B(n) b ## n + #define I(n) Byte B(n) = state[n]; + #define U(n) { B(n) = (Byte)((B(n)) + *data++); data[-1] = (B(n)); } + #define F(n) if (data != lim) { U(n) } + + if (delta == 1) + { + I(0) + if ((lim - data) & 1) { U(0) } + while (data != lim) { U(0) U(0) } + data -= 1; + } + else if (delta == 2) + { + I(0) I(1) + lim -= 1; while (data < lim) { U(0) U(1) } + lim += 1; F(0) + data -= 2; + } + else if (delta == 3) + { + I(0) I(1) I(2) + lim -= 2; while (data < lim) { U(0) U(1) U(2) } + lim += 2; F(0) F(1) + data -= 3; + } + else if (delta == 4) + { + I(0) I(1) I(2) I(3) + lim -= 3; while (data < lim) { U(0) U(1) U(2) U(3) } + lim += 3; F(0) F(1) F(2) + data -= 4; + } + else + */ + { + do + { + *data = (Byte)(*data + state[i++]); + data++; + } + while (i != delta); + + { + ptrdiff_t dif = -(ptrdiff_t)delta; + do + *data = (Byte)(*data + data[dif]); + while (++data != lim); + data += dif; + } + } + } + + do + *state++ = *data; + while (++data != lim); +} diff --git a/deps/LZMA-SDK/C/Delta.h b/deps/LZMA-SDK/C/Delta.h index e59d5a252..2fa54ad67 100644 --- a/deps/LZMA-SDK/C/Delta.h +++ b/deps/LZMA-SDK/C/Delta.h @@ -1,19 +1,19 @@ -/* Delta.h -- Delta converter -2013-01-18 : Igor Pavlov : Public domain */ - -#ifndef __DELTA_H -#define __DELTA_H - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -#define DELTA_STATE_SIZE 256 - -void Delta_Init(Byte *state); -void Delta_Encode(Byte *state, unsigned delta, Byte *data, SizeT size); -void Delta_Decode(Byte *state, unsigned delta, Byte *data, SizeT size); - -EXTERN_C_END - -#endif +/* Delta.h -- Delta converter +2013-01-18 : Igor Pavlov : Public domain */ + +#ifndef __DELTA_H +#define __DELTA_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +#define DELTA_STATE_SIZE 256 + +void Delta_Init(Byte *state); +void Delta_Encode(Byte *state, unsigned delta, Byte *data, SizeT size); +void Delta_Decode(Byte *state, unsigned delta, Byte *data, SizeT size); + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/DllSecur.c b/deps/LZMA-SDK/C/DllSecur.c index 19a22a9f0..a3c294bfe 100644 --- a/deps/LZMA-SDK/C/DllSecur.c +++ b/deps/LZMA-SDK/C/DllSecur.c @@ -1,108 +1,114 @@ -/* DllSecur.c -- DLL loading security -2018-02-21 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#ifdef _WIN32 - -#include - -#include "DllSecur.h" - -#ifndef UNDER_CE - -typedef BOOL (WINAPI *Func_SetDefaultDllDirectories)(DWORD DirectoryFlags); - -#define MY_LOAD_LIBRARY_SEARCH_USER_DIRS 0x400 -#define MY_LOAD_LIBRARY_SEARCH_SYSTEM32 0x800 - -static const char * const g_Dlls = - #ifndef _CONSOLE - "UXTHEME\0" - #endif - "USERENV\0" - "SETUPAPI\0" - "APPHELP\0" - "PROPSYS\0" - "DWMAPI\0" - "CRYPTBASE\0" - "OLEACC\0" - "CLBCATQ\0" - "VERSION\0" - ; - -#endif - -void My_SetDefaultDllDirectories() -{ - #ifndef UNDER_CE - - OSVERSIONINFO vi; - vi.dwOSVersionInfoSize = sizeof(vi); - GetVersionEx(&vi); - if (!GetVersionEx(&vi) || vi.dwMajorVersion != 6 || vi.dwMinorVersion != 0) - { - Func_SetDefaultDllDirectories setDllDirs = (Func_SetDefaultDllDirectories) - GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "SetDefaultDllDirectories"); - if (setDllDirs) - if (setDllDirs(MY_LOAD_LIBRARY_SEARCH_SYSTEM32 | MY_LOAD_LIBRARY_SEARCH_USER_DIRS)) - return; - } - - #endif -} - - -void LoadSecurityDlls() -{ - #ifndef UNDER_CE - - wchar_t buf[MAX_PATH + 100]; - - { - // at Vista (ver 6.0) : CoCreateInstance(CLSID_ShellLink, ...) doesn't work after SetDefaultDllDirectories() : Check it ??? - OSVERSIONINFO vi; - vi.dwOSVersionInfoSize = sizeof(vi); - if (!GetVersionEx(&vi) || vi.dwMajorVersion != 6 || vi.dwMinorVersion != 0) - { - Func_SetDefaultDllDirectories setDllDirs = (Func_SetDefaultDllDirectories) - GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "SetDefaultDllDirectories"); - if (setDllDirs) - if (setDllDirs(MY_LOAD_LIBRARY_SEARCH_SYSTEM32 | MY_LOAD_LIBRARY_SEARCH_USER_DIRS)) - return; - } - } - - { - unsigned len = GetSystemDirectoryW(buf, MAX_PATH + 2); - if (len == 0 || len > MAX_PATH) - return; - } - { - const char *dll; - unsigned pos = (unsigned)lstrlenW(buf); - - if (buf[pos - 1] != '\\') - buf[pos++] = '\\'; - - for (dll = g_Dlls; dll[0] != 0;) - { - unsigned k = 0; - for (;;) - { - char c = *dll++; - buf[pos + k] = (Byte)c; - k++; - if (c == 0) - break; - } - - lstrcatW(buf, L".dll"); - LoadLibraryExW(buf, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); - } - } - - #endif -} - -#endif +/* DllSecur.c -- DLL loading security +2022-07-15 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#ifdef _WIN32 + +#include + +#include "DllSecur.h" + +#ifndef UNDER_CE + +#if defined(__GNUC__) && (__GNUC__ >= 8) + #pragma GCC diagnostic ignored "-Wcast-function-type" +#endif + +typedef BOOL (WINAPI *Func_SetDefaultDllDirectories)(DWORD DirectoryFlags); + +#define MY_LOAD_LIBRARY_SEARCH_USER_DIRS 0x400 +#define MY_LOAD_LIBRARY_SEARCH_SYSTEM32 0x800 + +static const char * const g_Dlls = + #ifndef _CONSOLE + "UXTHEME\0" + #endif + "USERENV\0" + "SETUPAPI\0" + "APPHELP\0" + "PROPSYS\0" + "DWMAPI\0" + "CRYPTBASE\0" + "OLEACC\0" + "CLBCATQ\0" + "VERSION\0" + ; + +#endif + +// #define MY_CAST_FUNC (void(*)()) +#define MY_CAST_FUNC + +void My_SetDefaultDllDirectories() +{ + #ifndef UNDER_CE + + OSVERSIONINFO vi; + vi.dwOSVersionInfoSize = sizeof(vi); + if (!GetVersionEx(&vi) || vi.dwMajorVersion != 6 || vi.dwMinorVersion != 0) + { + Func_SetDefaultDllDirectories setDllDirs = (Func_SetDefaultDllDirectories) + MY_CAST_FUNC GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "SetDefaultDllDirectories"); + if (setDllDirs) + if (setDllDirs(MY_LOAD_LIBRARY_SEARCH_SYSTEM32 | MY_LOAD_LIBRARY_SEARCH_USER_DIRS)) + return; + } + + #endif +} + + +void LoadSecurityDlls() +{ + #ifndef UNDER_CE + + wchar_t buf[MAX_PATH + 100]; + + { + // at Vista (ver 6.0) : CoCreateInstance(CLSID_ShellLink, ...) doesn't work after SetDefaultDllDirectories() : Check it ??? + OSVERSIONINFO vi; + vi.dwOSVersionInfoSize = sizeof(vi); + if (!GetVersionEx(&vi) || vi.dwMajorVersion != 6 || vi.dwMinorVersion != 0) + { + Func_SetDefaultDllDirectories setDllDirs = (Func_SetDefaultDllDirectories) + MY_CAST_FUNC GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "SetDefaultDllDirectories"); + if (setDllDirs) + if (setDllDirs(MY_LOAD_LIBRARY_SEARCH_SYSTEM32 | MY_LOAD_LIBRARY_SEARCH_USER_DIRS)) + return; + } + } + + { + unsigned len = GetSystemDirectoryW(buf, MAX_PATH + 2); + if (len == 0 || len > MAX_PATH) + return; + } + { + const char *dll; + unsigned pos = (unsigned)lstrlenW(buf); + + if (buf[pos - 1] != '\\') + buf[pos++] = '\\'; + + for (dll = g_Dlls; dll[0] != 0;) + { + unsigned k = 0; + for (;;) + { + char c = *dll++; + buf[pos + k] = (Byte)c; + k++; + if (c == 0) + break; + } + + lstrcatW(buf, L".dll"); + LoadLibraryExW(buf, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); + } + } + + #endif +} + +#endif diff --git a/deps/LZMA-SDK/C/DllSecur.h b/deps/LZMA-SDK/C/DllSecur.h index 0fd8070e5..64ff26cd9 100644 --- a/deps/LZMA-SDK/C/DllSecur.h +++ b/deps/LZMA-SDK/C/DllSecur.h @@ -1,20 +1,20 @@ -/* DllSecur.h -- DLL loading for security -2018-02-19 : Igor Pavlov : Public domain */ - -#ifndef __DLL_SECUR_H -#define __DLL_SECUR_H - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -#ifdef _WIN32 - -void My_SetDefaultDllDirectories(void); -void LoadSecurityDlls(void); - -#endif - -EXTERN_C_END - -#endif +/* DllSecur.h -- DLL loading for security +2018-02-19 : Igor Pavlov : Public domain */ + +#ifndef __DLL_SECUR_H +#define __DLL_SECUR_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +#ifdef _WIN32 + +void My_SetDefaultDllDirectories(void); +void LoadSecurityDlls(void); + +#endif + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/LzFind.c b/deps/LZMA-SDK/C/LzFind.c index 18ec00ef5..1b73c2848 100644 --- a/deps/LZMA-SDK/C/LzFind.c +++ b/deps/LZMA-SDK/C/LzFind.c @@ -1,1197 +1,1628 @@ -/* LzFind.c -- Match finder for LZ algorithms -2021-04-01 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include - -#include "CpuArch.h" -#include "LzFind.h" -#include "LzHash.h" - -#define kEmptyHashValue 0 -#define kMaxValForNormalize ((UInt32)0xFFFFFFFF) -#define kNormalizeStepMin (1 << 10) /* it must be power of 2 */ -#define kNormalizeMask (~(UInt32)(kNormalizeStepMin - 1)) -#define kMaxHistorySize ((UInt32)7 << 29) - -// #define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size) -#define kFix5HashSize kFix4HashSize - -/* - HASH2_CALC: - if (hv) match, then cur[0] and cur[1] also match -*/ -#define HASH2_CALC hv = GetUi16(cur); - -// (crc[0 ... 255] & 0xFF) provides one-to-one correspondence to [0 ... 255] - -/* - HASH3_CALC: - if (cur[0]) and (h2) match, then cur[1] also match - if (cur[0]) and (hv) match, then cur[1] and cur[2] also match -*/ -#define HASH3_CALC { \ - UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ - h2 = temp & (kHash2Size - 1); \ - hv = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; } - -#define HASH4_CALC { \ - UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ - h2 = temp & (kHash2Size - 1); \ - temp ^= ((UInt32)cur[2] << 8); \ - h3 = temp & (kHash3Size - 1); \ - hv = (temp ^ (p->crc[cur[3]] << kLzHash_CrcShift_1)) & p->hashMask; } - -#define HASH5_CALC { \ - UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ - h2 = temp & (kHash2Size - 1); \ - temp ^= ((UInt32)cur[2] << 8); \ - h3 = temp & (kHash3Size - 1); \ - temp ^= (p->crc[cur[3]] << kLzHash_CrcShift_1); \ - /* h4 = temp & p->hash4Mask; */ /* (kHash4Size - 1); */ \ - hv = (temp ^ (p->crc[cur[4]] << kLzHash_CrcShift_2)) & p->hashMask; } - -#define HASH_ZIP_CALC hv = ((cur[2] | ((UInt32)cur[0] << 8)) ^ p->crc[cur[1]]) & 0xFFFF; - - -static void LzInWindow_Free(CMatchFinder *p, ISzAllocPtr alloc) -{ - if (!p->directInput) - { - ISzAlloc_Free(alloc, p->bufferBase); - p->bufferBase = NULL; - } -} - -/* keepSizeBefore + keepSizeAfter + keepSizeReserv must be < 4G) */ - -static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAllocPtr alloc) -{ - UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv; - if (p->directInput) - { - p->blockSize = blockSize; - return 1; - } - if (!p->bufferBase || p->blockSize != blockSize) - { - LzInWindow_Free(p, alloc); - p->blockSize = blockSize; - p->bufferBase = (Byte *)ISzAlloc_Alloc(alloc, (size_t)blockSize); - } - return (p->bufferBase != NULL); -} - -static Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; } - -static UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; } - -void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue) -{ - p->posLimit -= subValue; - p->pos -= subValue; - p->streamPos -= subValue; -} - -static void MatchFinder_ReadBlock(CMatchFinder *p) -{ - if (p->streamEndWasReached || p->result != SZ_OK) - return; - - /* We use (p->streamPos - p->pos) value. (p->streamPos < p->pos) is allowed. */ - - if (p->directInput) - { - UInt32 curSize = 0xFFFFFFFF - (p->streamPos - p->pos); - if (curSize > p->directInputRem) - curSize = (UInt32)p->directInputRem; - p->directInputRem -= curSize; - p->streamPos += curSize; - if (p->directInputRem == 0) - p->streamEndWasReached = 1; - return; - } - - for (;;) - { - Byte *dest = p->buffer + (p->streamPos - p->pos); - size_t size = (size_t)(p->bufferBase + p->blockSize - dest); - if (size == 0) - return; - - p->result = ISeqInStream_Read(p->stream, dest, &size); - if (p->result != SZ_OK) - return; - if (size == 0) - { - p->streamEndWasReached = 1; - return; - } - p->streamPos += (UInt32)size; - if (p->streamPos - p->pos > p->keepSizeAfter) - return; - } -} - -void MatchFinder_MoveBlock(CMatchFinder *p) -{ - memmove(p->bufferBase, - p->buffer - p->keepSizeBefore, - (size_t)(p->streamPos - p->pos) + p->keepSizeBefore); - p->buffer = p->bufferBase + p->keepSizeBefore; -} - -int MatchFinder_NeedMove(CMatchFinder *p) -{ - if (p->directInput) - return 0; - /* if (p->streamEndWasReached) return 0; */ - return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter); -} - -void MatchFinder_ReadIfRequired(CMatchFinder *p) -{ - if (p->streamEndWasReached) - return; - if (p->keepSizeAfter >= p->streamPos - p->pos) - MatchFinder_ReadBlock(p); -} - -static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p) -{ - if (MatchFinder_NeedMove(p)) - MatchFinder_MoveBlock(p); - MatchFinder_ReadBlock(p); -} - -static void MatchFinder_SetDefaultSettings(CMatchFinder *p) -{ - p->cutValue = 32; - p->btMode = 1; - p->numHashBytes = 4; - p->bigHash = 0; -} - -#define kCrcPoly 0xEDB88320 - -void MatchFinder_Construct(CMatchFinder *p) -{ - unsigned i; - p->bufferBase = NULL; - p->directInput = 0; - p->hash = NULL; - p->expectedDataSize = (UInt64)(Int64)-1; - MatchFinder_SetDefaultSettings(p); - - for (i = 0; i < 256; i++) - { - UInt32 r = (UInt32)i; - unsigned j; - for (j = 0; j < 8; j++) - r = (r >> 1) ^ (kCrcPoly & ((UInt32)0 - (r & 1))); - p->crc[i] = r; - } -} - -static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAllocPtr alloc) -{ - ISzAlloc_Free(alloc, p->hash); - p->hash = NULL; -} - -void MatchFinder_Free(CMatchFinder *p, ISzAllocPtr alloc) -{ - MatchFinder_FreeThisClassMemory(p, alloc); - LzInWindow_Free(p, alloc); -} - -static CLzRef* AllocRefs(size_t num, ISzAllocPtr alloc) -{ - size_t sizeInBytes = (size_t)num * sizeof(CLzRef); - if (sizeInBytes / sizeof(CLzRef) != num) - return NULL; - return (CLzRef *)ISzAlloc_Alloc(alloc, sizeInBytes); -} - -int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, - UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, - ISzAllocPtr alloc) -{ - UInt32 sizeReserv; - - if (historySize > kMaxHistorySize) - { - MatchFinder_Free(p, alloc); - return 0; - } - - sizeReserv = historySize >> 1; - if (historySize >= ((UInt32)3 << 30)) sizeReserv = historySize >> 3; - else if (historySize >= ((UInt32)2 << 30)) sizeReserv = historySize >> 2; - - sizeReserv += (keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + (1 << 19); - - p->keepSizeBefore = historySize + keepAddBufferBefore + 1; - p->keepSizeAfter = matchMaxLen + keepAddBufferAfter; - - /* we need one additional byte, since we use MoveBlock after pos++ and before dictionary using */ - - if (LzInWindow_Create(p, sizeReserv, alloc)) - { - UInt32 newCyclicBufferSize = historySize + 1; - UInt32 hs; - p->matchMaxLen = matchMaxLen; - { - // UInt32 hs4; - p->fixedHashSize = 0; - hs = (1 << 16) - 1; - if (p->numHashBytes != 2) - { - hs = historySize; - if (hs > p->expectedDataSize) - hs = (UInt32)p->expectedDataSize; - if (hs != 0) - hs--; - hs |= (hs >> 1); - hs |= (hs >> 2); - hs |= (hs >> 4); - hs |= (hs >> 8); - // we propagated 16 bits in (hs). Low 16 bits must be set later - hs >>= 1; - if (hs >= (1 << 24)) - { - if (p->numHashBytes == 3) - hs = (1 << 24) - 1; - else - hs >>= 1; - /* if (bigHash) mode, GetHeads4b() in LzFindMt.c needs (hs >= ((1 << 24) - 1))) */ - } - - // hs = ((UInt32)1 << 25) - 1; // for test - - // (hash_size >= (1 << 16)) : Required for (numHashBytes > 2) - hs |= (1 << 16) - 1; /* don't change it! */ - - // bt5: we adjust the size with recommended minimum size - if (p->numHashBytes >= 5) - hs |= (256 << kLzHash_CrcShift_2) - 1; - } - p->hashMask = hs; - hs++; - - /* - hs4 = (1 << 20); - if (hs4 > hs) - hs4 = hs; - // hs4 = (1 << 16); // for test - p->hash4Mask = hs4 - 1; - */ - - if (p->numHashBytes > 2) p->fixedHashSize += kHash2Size; - if (p->numHashBytes > 3) p->fixedHashSize += kHash3Size; - // if (p->numHashBytes > 4) p->fixedHashSize += hs4; // kHash4Size; - hs += p->fixedHashSize; - } - - { - size_t newSize; - size_t numSons; - p->historySize = historySize; - p->hashSizeSum = hs; - p->cyclicBufferSize = newCyclicBufferSize; - - numSons = newCyclicBufferSize; - if (p->btMode) - numSons <<= 1; - newSize = hs + numSons; - - // aligned size is not required here, but it can be better for some loops - #define NUM_REFS_ALIGN_MASK 0xF - newSize = (newSize + NUM_REFS_ALIGN_MASK) & ~(size_t)NUM_REFS_ALIGN_MASK; - - if (p->hash && p->numRefs == newSize) - return 1; - - MatchFinder_FreeThisClassMemory(p, alloc); - p->numRefs = newSize; - p->hash = AllocRefs(newSize, alloc); - - if (p->hash) - { - p->son = p->hash + p->hashSizeSum; - return 1; - } - } - } - - MatchFinder_Free(p, alloc); - return 0; -} - -static void MatchFinder_SetLimits(CMatchFinder *p) -{ - UInt32 limit = kMaxValForNormalize - p->pos; - UInt32 limit2 = p->cyclicBufferSize - p->cyclicBufferPos; - - if (limit2 < limit) - limit = limit2; - limit2 = p->streamPos - p->pos; - - if (limit2 <= p->keepSizeAfter) - { - if (limit2 > 0) - limit2 = 1; - } - else - limit2 -= p->keepSizeAfter; - - if (limit2 < limit) - limit = limit2; - - { - UInt32 lenLimit = p->streamPos - p->pos; - if (lenLimit > p->matchMaxLen) - lenLimit = p->matchMaxLen; - p->lenLimit = lenLimit; - } - p->posLimit = p->pos + limit; -} - - -void MatchFinder_Init_LowHash(CMatchFinder *p) -{ - size_t i; - CLzRef *items = p->hash; - size_t numItems = p->fixedHashSize; - for (i = 0; i < numItems; i++) - items[i] = kEmptyHashValue; -} - - -void MatchFinder_Init_HighHash(CMatchFinder *p) -{ - size_t i; - CLzRef *items = p->hash + p->fixedHashSize; - size_t numItems = (size_t)p->hashMask + 1; - for (i = 0; i < numItems; i++) - items[i] = kEmptyHashValue; -} - - -void MatchFinder_Init_3(CMatchFinder *p, int readData) -{ - p->cyclicBufferPos = 0; - p->buffer = p->bufferBase; - p->pos = - p->streamPos = p->cyclicBufferSize; - p->result = SZ_OK; - p->streamEndWasReached = 0; - - if (readData) - MatchFinder_ReadBlock(p); - - MatchFinder_SetLimits(p); -} - - -void MatchFinder_Init(CMatchFinder *p) -{ - MatchFinder_Init_HighHash(p); - MatchFinder_Init_LowHash(p); - MatchFinder_Init_3(p, True); -} - - -static UInt32 MatchFinder_GetSubValue(CMatchFinder *p) -{ - return (p->pos - p->historySize - 1) & kNormalizeMask; -} - -void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, size_t numItems) -{ - if (numItems == 0) - return; - { - const CLzRef *lim = items + numItems - 1; - for (; items < lim; items += 2) - { - UInt32 v, m; - v = items[0]; m = v - subValue; if (v < subValue) m = kEmptyHashValue; - v = items[1]; items[0] = m; m = v - subValue; if (v < subValue) m = kEmptyHashValue; - items[1] = m; - } - if (items == lim) - { - UInt32 v, m; - v = items[0]; m = v - subValue; if (v < subValue) m = kEmptyHashValue; - items[0] = m; - } - } -} - -static void MatchFinder_Normalize(CMatchFinder *p) -{ - UInt32 subValue = MatchFinder_GetSubValue(p); - MatchFinder_Normalize3(subValue, p->hash, p->numRefs); - MatchFinder_ReduceOffsets(p, subValue); -} - - -MY_NO_INLINE -static void MatchFinder_CheckLimits(CMatchFinder *p) -{ - if (p->pos == kMaxValForNormalize) - MatchFinder_Normalize(p); - if (!p->streamEndWasReached && p->keepSizeAfter == p->streamPos - p->pos) - MatchFinder_CheckAndMoveAndRead(p); - if (p->cyclicBufferPos == p->cyclicBufferSize) - p->cyclicBufferPos = 0; - MatchFinder_SetLimits(p); -} - - -/* - (lenLimit > maxLen) -*/ -MY_FORCE_INLINE -static UInt32 * Hc_GetMatchesSpec(unsigned lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, - UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, - UInt32 *distances, unsigned maxLen) -{ - /* - son[_cyclicBufferPos] = curMatch; - for (;;) - { - UInt32 delta = pos - curMatch; - if (cutValue-- == 0 || delta >= _cyclicBufferSize) - return distances; - { - const Byte *pb = cur - delta; - curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)]; - if (pb[maxLen] == cur[maxLen] && *pb == *cur) - { - UInt32 len = 0; - while (++len != lenLimit) - if (pb[len] != cur[len]) - break; - if (maxLen < len) - { - maxLen = len; - *distances++ = len; - *distances++ = delta - 1; - if (len == lenLimit) - return distances; - } - } - } - } - */ - - const Byte *lim = cur + lenLimit; - son[_cyclicBufferPos] = curMatch; - do - { - UInt32 delta = pos - curMatch; - if (delta >= _cyclicBufferSize) - break; - { - ptrdiff_t diff; - curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)]; - diff = (ptrdiff_t)0 - (ptrdiff_t)delta; - if (cur[maxLen] == cur[(ptrdiff_t)maxLen + diff]) - { - const Byte *c = cur; - while (*c == c[diff]) - { - if (++c == lim) - { - distances[0] = (UInt32)(lim - cur); - distances[1] = delta - 1; - return distances + 2; - } - } - { - unsigned len = (unsigned)(c - cur); - if (maxLen < len) - { - maxLen = len; - distances[0] = (UInt32)len; - distances[1] = delta - 1; - distances += 2; - } - } - } - } - } - while (--cutValue); - - return distances; -} - - -MY_FORCE_INLINE -UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, - UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, - UInt32 *distances, UInt32 maxLen) -{ - CLzRef *ptr0 = son + ((size_t)_cyclicBufferPos << 1) + 1; - CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1); - unsigned len0 = 0, len1 = 0; - for (;;) - { - UInt32 delta = pos - curMatch; - if (cutValue-- == 0 || delta >= _cyclicBufferSize) - { - *ptr0 = *ptr1 = kEmptyHashValue; - return distances; - } - { - CLzRef *pair = son + ((size_t)(_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); - const Byte *pb = cur - delta; - unsigned len = (len0 < len1 ? len0 : len1); - UInt32 pair0 = pair[0]; - if (pb[len] == cur[len]) - { - if (++len != lenLimit && pb[len] == cur[len]) - while (++len != lenLimit) - if (pb[len] != cur[len]) - break; - if (maxLen < len) - { - maxLen = (UInt32)len; - *distances++ = (UInt32)len; - *distances++ = delta - 1; - if (len == lenLimit) - { - *ptr1 = pair0; - *ptr0 = pair[1]; - return distances; - } - } - } - if (pb[len] < cur[len]) - { - *ptr1 = curMatch; - ptr1 = pair + 1; - curMatch = *ptr1; - len1 = len; - } - else - { - *ptr0 = curMatch; - ptr0 = pair; - curMatch = *ptr0; - len0 = len; - } - } - } -} - -static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, - UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue) -{ - CLzRef *ptr0 = son + ((size_t)_cyclicBufferPos << 1) + 1; - CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1); - unsigned len0 = 0, len1 = 0; - for (;;) - { - UInt32 delta = pos - curMatch; - if (cutValue-- == 0 || delta >= _cyclicBufferSize) - { - *ptr0 = *ptr1 = kEmptyHashValue; - return; - } - { - CLzRef *pair = son + ((size_t)(_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); - const Byte *pb = cur - delta; - unsigned len = (len0 < len1 ? len0 : len1); - if (pb[len] == cur[len]) - { - while (++len != lenLimit) - if (pb[len] != cur[len]) - break; - { - if (len == lenLimit) - { - *ptr1 = pair[0]; - *ptr0 = pair[1]; - return; - } - } - } - if (pb[len] < cur[len]) - { - *ptr1 = curMatch; - ptr1 = pair + 1; - curMatch = *ptr1; - len1 = len; - } - else - { - *ptr0 = curMatch; - ptr0 = pair; - curMatch = *ptr0; - len0 = len; - } - } - } -} - -#define MOVE_POS \ - ++p->cyclicBufferPos; \ - p->buffer++; \ - if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p); - -#define MOVE_POS_RET MOVE_POS return (UInt32)offset; - -static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; } - -#define GET_MATCHES_HEADER2(minLen, ret_op) \ - unsigned lenLimit; UInt32 hv; const Byte *cur; UInt32 curMatch; \ - lenLimit = (unsigned)p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \ - cur = p->buffer; - -#define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return 0) -#define SKIP_HEADER(minLen) GET_MATCHES_HEADER2(minLen, continue) - -#define MF_PARAMS(p) p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue - -#define GET_MATCHES_FOOTER_BASE(_maxLen_, func) \ - offset = (unsigned)(func((UInt32)lenLimit, curMatch, MF_PARAMS(p), \ - distances + offset, (UInt32)(_maxLen_)) - distances); MOVE_POS_RET; - -#define GET_MATCHES_FOOTER_BT(_maxLen_) \ - GET_MATCHES_FOOTER_BASE(_maxLen_, GetMatchesSpec1) - -#define GET_MATCHES_FOOTER_HC(_maxLen_) \ - GET_MATCHES_FOOTER_BASE(_maxLen_, Hc_GetMatchesSpec) - -#define SKIP_FOOTER \ - SkipMatchesSpec((UInt32)lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS; - -#define UPDATE_maxLen { \ - ptrdiff_t diff = (ptrdiff_t)0 - (ptrdiff_t)d2; \ - const Byte *c = cur + maxLen; \ - const Byte *lim = cur + lenLimit; \ - for (; c != lim; c++) if (*(c + diff) != *c) break; \ - maxLen = (unsigned)(c - cur); } - -static UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -{ - unsigned offset; - GET_MATCHES_HEADER(2) - HASH2_CALC; - curMatch = p->hash[hv]; - p->hash[hv] = p->pos; - offset = 0; - GET_MATCHES_FOOTER_BT(1) -} - -UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -{ - unsigned offset; - GET_MATCHES_HEADER(3) - HASH_ZIP_CALC; - curMatch = p->hash[hv]; - p->hash[hv] = p->pos; - offset = 0; - GET_MATCHES_FOOTER_BT(2) -} - -static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -{ - UInt32 h2, d2, pos; - unsigned maxLen, offset; - UInt32 *hash; - GET_MATCHES_HEADER(3) - - HASH3_CALC; - - hash = p->hash; - pos = p->pos; - - d2 = pos - hash[h2]; - - curMatch = (hash + kFix3HashSize)[hv]; - - hash[h2] = pos; - (hash + kFix3HashSize)[hv] = pos; - - maxLen = 2; - offset = 0; - - if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur) - { - UPDATE_maxLen - distances[0] = (UInt32)maxLen; - distances[1] = d2 - 1; - offset = 2; - if (maxLen == lenLimit) - { - SkipMatchesSpec((UInt32)lenLimit, curMatch, MF_PARAMS(p)); - MOVE_POS_RET; - } - } - - GET_MATCHES_FOOTER_BT(maxLen) -} - - -static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -{ - UInt32 h2, h3, d2, d3, pos; - unsigned maxLen, offset; - UInt32 *hash; - GET_MATCHES_HEADER(4) - - HASH4_CALC; - - hash = p->hash; - pos = p->pos; - - d2 = pos - hash [h2]; - d3 = pos - (hash + kFix3HashSize)[h3]; - curMatch = (hash + kFix4HashSize)[hv]; - - hash [h2] = pos; - (hash + kFix3HashSize)[h3] = pos; - (hash + kFix4HashSize)[hv] = pos; - - maxLen = 3; - offset = 0; - - for (;;) - { - if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur) - { - distances[0] = 2; - distances[1] = d2 - 1; - offset = 2; - if (*(cur - d2 + 2) == cur[2]) - { - // distances[0] = 3; - } - else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur) - { - d2 = d3; - distances[2 + 1] = d3 - 1; - offset = 4; - } - else - break; - } - else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur) - { - d2 = d3; - distances[1] = d3 - 1; - offset = 2; - } - else - break; - - UPDATE_maxLen - distances[(size_t)offset - 2] = (UInt32)maxLen; - if (maxLen == lenLimit) - { - SkipMatchesSpec((UInt32)lenLimit, curMatch, MF_PARAMS(p)); - MOVE_POS_RET - } - break; - } - - GET_MATCHES_FOOTER_BT(maxLen) -} - - -static UInt32 Bt5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -{ - UInt32 h2, h3, d2, d3, maxLen, offset, pos; - UInt32 *hash; - GET_MATCHES_HEADER(5) - - HASH5_CALC; - - hash = p->hash; - pos = p->pos; - - d2 = pos - hash [h2]; - d3 = pos - (hash + kFix3HashSize)[h3]; - // d4 = pos - (hash + kFix4HashSize)[h4]; - - curMatch = (hash + kFix5HashSize)[hv]; - - hash [h2] = pos; - (hash + kFix3HashSize)[h3] = pos; - // (hash + kFix4HashSize)[h4] = pos; - (hash + kFix5HashSize)[hv] = pos; - - maxLen = 4; - offset = 0; - - for (;;) - { - if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur) - { - distances[0] = 2; - distances[1] = d2 - 1; - offset = 2; - if (*(cur - d2 + 2) == cur[2]) - { - } - else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur) - { - distances[3] = d3 - 1; - offset = 4; - d2 = d3; - } - else - break; - } - else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur) - { - distances[1] = d3 - 1; - offset = 2; - d2 = d3; - } - else - break; - - distances[(size_t)offset - 2] = 3; - if (*(cur - d2 + 3) != cur[3]) - break; - UPDATE_maxLen - distances[(size_t)offset - 2] = maxLen; - if (maxLen == lenLimit) - { - SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); - MOVE_POS_RET; - } - break; - } - - GET_MATCHES_FOOTER_BT(maxLen) -} - - -static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -{ - UInt32 h2, h3, d2, d3, pos; - unsigned maxLen, offset; - UInt32 *hash; - GET_MATCHES_HEADER(4) - - HASH4_CALC; - - hash = p->hash; - pos = p->pos; - - d2 = pos - hash [h2]; - d3 = pos - (hash + kFix3HashSize)[h3]; - curMatch = (hash + kFix4HashSize)[hv]; - - hash [h2] = pos; - (hash + kFix3HashSize)[h3] = pos; - (hash + kFix4HashSize)[hv] = pos; - - maxLen = 3; - offset = 0; - - for (;;) - { - if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur) - { - distances[0] = 2; - distances[1] = d2 - 1; - offset = 2; - if (*(cur - d2 + 2) == cur[2]) - { - // distances[0] = 3; - } - else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur) - { - d2 = d3; - distances[2 + 1] = d3 - 1; - offset = 4; - } - else - break; - } - else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur) - { - d2 = d3; - distances[1] = d3 - 1; - offset = 2; - } - else - break; - - UPDATE_maxLen - distances[(size_t)offset - 2] = (UInt32)maxLen; - if (maxLen == lenLimit) - { - p->son[p->cyclicBufferPos] = curMatch; - MOVE_POS_RET; - } - break; - } - - GET_MATCHES_FOOTER_HC(maxLen); -} - - -static UInt32 Hc5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -{ - UInt32 h2, h3, d2, d3, maxLen, offset, pos; - UInt32 *hash; - GET_MATCHES_HEADER(5) - - HASH5_CALC; - - hash = p->hash; - pos = p->pos; - - d2 = pos - hash [h2]; - d3 = pos - (hash + kFix3HashSize)[h3]; - // d4 = pos - (hash + kFix4HashSize)[h4]; - - curMatch = (hash + kFix5HashSize)[hv]; - - hash [h2] = pos; - (hash + kFix3HashSize)[h3] = pos; - // (hash + kFix4HashSize)[h4] = pos; - (hash + kFix5HashSize)[hv] = pos; - - maxLen = 4; - offset = 0; - - for (;;) - { - if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur) - { - distances[0] = 2; - distances[1] = d2 - 1; - offset = 2; - if (*(cur - d2 + 2) == cur[2]) - { - } - else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur) - { - distances[3] = d3 - 1; - offset = 4; - d2 = d3; - } - else - break; - } - else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur) - { - distances[1] = d3 - 1; - offset = 2; - d2 = d3; - } - else - break; - - distances[(size_t)offset - 2] = 3; - if (*(cur - d2 + 3) != cur[3]) - break; - UPDATE_maxLen - distances[(size_t)offset - 2] = maxLen; - if (maxLen == lenLimit) - { - p->son[p->cyclicBufferPos] = curMatch; - MOVE_POS_RET; - } - break; - } - - GET_MATCHES_FOOTER_HC(maxLen); -} - - -UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) -{ - unsigned offset; - GET_MATCHES_HEADER(3) - HASH_ZIP_CALC; - curMatch = p->hash[hv]; - p->hash[hv] = p->pos; - offset = 0; - GET_MATCHES_FOOTER_HC(2) -} - - -static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -{ - do - { - SKIP_HEADER(2) - HASH2_CALC; - curMatch = p->hash[hv]; - p->hash[hv] = p->pos; - SKIP_FOOTER - } - while (--num != 0); -} - -void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -{ - do - { - SKIP_HEADER(3) - HASH_ZIP_CALC; - curMatch = p->hash[hv]; - p->hash[hv] = p->pos; - SKIP_FOOTER - } - while (--num != 0); -} - -static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -{ - do - { - UInt32 h2; - UInt32 *hash; - SKIP_HEADER(3) - HASH3_CALC; - hash = p->hash; - curMatch = (hash + kFix3HashSize)[hv]; - hash[h2] = - (hash + kFix3HashSize)[hv] = p->pos; - SKIP_FOOTER - } - while (--num != 0); -} - -static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -{ - do - { - UInt32 h2, h3; - UInt32 *hash; - SKIP_HEADER(4) - HASH4_CALC; - hash = p->hash; - curMatch = (hash + kFix4HashSize)[hv]; - hash [h2] = - (hash + kFix3HashSize)[h3] = - (hash + kFix4HashSize)[hv] = p->pos; - SKIP_FOOTER - } - while (--num != 0); -} - -static void Bt5_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -{ - do - { - UInt32 h2, h3; - UInt32 *hash; - SKIP_HEADER(5) - HASH5_CALC; - hash = p->hash; - curMatch = (hash + kFix5HashSize)[hv]; - hash [h2] = - (hash + kFix3HashSize)[h3] = - // (hash + kFix4HashSize)[h4] = - (hash + kFix5HashSize)[hv] = p->pos; - SKIP_FOOTER - } - while (--num != 0); -} - -static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -{ - do - { - UInt32 h2, h3; - UInt32 *hash; - SKIP_HEADER(4) - HASH4_CALC; - hash = p->hash; - curMatch = (hash + kFix4HashSize)[hv]; - hash [h2] = - (hash + kFix3HashSize)[h3] = - (hash + kFix4HashSize)[hv] = p->pos; - p->son[p->cyclicBufferPos] = curMatch; - MOVE_POS - } - while (--num != 0); -} - -static void Hc5_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -{ - do - { - UInt32 h2, h3; - UInt32 *hash; - SKIP_HEADER(5) - HASH5_CALC; - hash = p->hash; - curMatch = (hash + kFix5HashSize)[hv]; - hash [h2] = - (hash + kFix3HashSize)[h3] = - // (hash + kFix4HashSize)[h4] = - (hash + kFix5HashSize)[hv] = p->pos; - p->son[p->cyclicBufferPos] = curMatch; - MOVE_POS - } - while (--num != 0); -} - - -void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num) -{ - do - { - SKIP_HEADER(3) - HASH_ZIP_CALC; - curMatch = p->hash[hv]; - p->hash[hv] = p->pos; - p->son[p->cyclicBufferPos] = curMatch; - MOVE_POS - } - while (--num != 0); -} - -void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable) -{ - vTable->Init = (Mf_Init_Func)MatchFinder_Init; - vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes; - vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos; - if (!p->btMode) - { - if (p->numHashBytes <= 4) - { - vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches; - vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip; - } - else - { - vTable->GetMatches = (Mf_GetMatches_Func)Hc5_MatchFinder_GetMatches; - vTable->Skip = (Mf_Skip_Func)Hc5_MatchFinder_Skip; - } - } - else if (p->numHashBytes == 2) - { - vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches; - vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip; - } - else if (p->numHashBytes == 3) - { - vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches; - vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip; - } - else if (p->numHashBytes == 4) - { - vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches; - vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip; - } - else - { - vTable->GetMatches = (Mf_GetMatches_Func)Bt5_MatchFinder_GetMatches; - vTable->Skip = (Mf_Skip_Func)Bt5_MatchFinder_Skip; - } -} +/* LzFind.c -- Match finder for LZ algorithms +2021-11-29 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include +// #include + +#include "CpuArch.h" +#include "LzFind.h" +#include "LzHash.h" + +#define kBlockMoveAlign (1 << 7) // alignment for memmove() +#define kBlockSizeAlign (1 << 16) // alignment for block allocation +#define kBlockSizeReserveMin (1 << 24) // it's 1/256 from 4 GB dictinary + +#define kEmptyHashValue 0 + +#define kMaxValForNormalize ((UInt32)0) +// #define kMaxValForNormalize ((UInt32)(1 << 20) + 0xFFF) // for debug + +// #define kNormalizeAlign (1 << 7) // alignment for speculated accesses + +#define GET_AVAIL_BYTES(p) \ + Inline_MatchFinder_GetNumAvailableBytes(p) + + +// #define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size) +#define kFix5HashSize kFix4HashSize + +/* + HASH2_CALC: + if (hv) match, then cur[0] and cur[1] also match +*/ +#define HASH2_CALC hv = GetUi16(cur); + +// (crc[0 ... 255] & 0xFF) provides one-to-one correspondence to [0 ... 255] + +/* + HASH3_CALC: + if (cur[0]) and (h2) match, then cur[1] also match + if (cur[0]) and (hv) match, then cur[1] and cur[2] also match +*/ +#define HASH3_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + h2 = temp & (kHash2Size - 1); \ + hv = (temp ^ ((UInt32)cur[2] << 8)) & p->hashMask; } + +#define HASH4_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + h2 = temp & (kHash2Size - 1); \ + temp ^= ((UInt32)cur[2] << 8); \ + h3 = temp & (kHash3Size - 1); \ + hv = (temp ^ (p->crc[cur[3]] << kLzHash_CrcShift_1)) & p->hashMask; } + +#define HASH5_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + h2 = temp & (kHash2Size - 1); \ + temp ^= ((UInt32)cur[2] << 8); \ + h3 = temp & (kHash3Size - 1); \ + temp ^= (p->crc[cur[3]] << kLzHash_CrcShift_1); \ + /* h4 = temp & p->hash4Mask; */ /* (kHash4Size - 1); */ \ + hv = (temp ^ (p->crc[cur[4]] << kLzHash_CrcShift_2)) & p->hashMask; } + +#define HASH_ZIP_CALC hv = ((cur[2] | ((UInt32)cur[0] << 8)) ^ p->crc[cur[1]]) & 0xFFFF; + + +static void LzInWindow_Free(CMatchFinder *p, ISzAllocPtr alloc) +{ + if (!p->directInput) + { + ISzAlloc_Free(alloc, p->bufferBase); + p->bufferBase = NULL; + } +} + + +static int LzInWindow_Create2(CMatchFinder *p, UInt32 blockSize, ISzAllocPtr alloc) +{ + if (blockSize == 0) + return 0; + if (!p->bufferBase || p->blockSize != blockSize) + { + // size_t blockSizeT; + LzInWindow_Free(p, alloc); + p->blockSize = blockSize; + // blockSizeT = blockSize; + + // printf("\nblockSize = 0x%x\n", blockSize); + /* + #if defined _WIN64 + // we can allocate 4GiB, but still use UInt32 for (p->blockSize) + // we use UInt32 type for (p->blockSize), because + // we don't want to wrap over 4 GiB, + // when we use (p->streamPos - p->pos) that is UInt32. + if (blockSize >= (UInt32)0 - (UInt32)kBlockSizeAlign) + { + blockSizeT = ((size_t)1 << 32); + printf("\nchanged to blockSizeT = 4GiB\n"); + } + #endif + */ + + p->bufferBase = (Byte *)ISzAlloc_Alloc(alloc, blockSize); + // printf("\nbufferBase = %p\n", p->bufferBase); + // return 0; // for debug + } + return (p->bufferBase != NULL); +} + +static const Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; } + +static UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return GET_AVAIL_BYTES(p); } + + +MY_NO_INLINE +static void MatchFinder_ReadBlock(CMatchFinder *p) +{ + if (p->streamEndWasReached || p->result != SZ_OK) + return; + + /* We use (p->streamPos - p->pos) value. + (p->streamPos < p->pos) is allowed. */ + + if (p->directInput) + { + UInt32 curSize = 0xFFFFFFFF - GET_AVAIL_BYTES(p); + if (curSize > p->directInputRem) + curSize = (UInt32)p->directInputRem; + p->directInputRem -= curSize; + p->streamPos += curSize; + if (p->directInputRem == 0) + p->streamEndWasReached = 1; + return; + } + + for (;;) + { + Byte *dest = p->buffer + GET_AVAIL_BYTES(p); + size_t size = (size_t)(p->bufferBase + p->blockSize - dest); + if (size == 0) + { + /* we call ReadBlock() after NeedMove() and MoveBlock(). + NeedMove() and MoveBlock() povide more than (keepSizeAfter) + to the end of (blockSize). + So we don't execute this branch in normal code flow. + We can go here, if we will call ReadBlock() before NeedMove(), MoveBlock(). + */ + // p->result = SZ_ERROR_FAIL; // we can show error here + return; + } + + // #define kRead 3 + // if (size > kRead) size = kRead; // for debug + + p->result = ISeqInStream_Read(p->stream, dest, &size); + if (p->result != SZ_OK) + return; + if (size == 0) + { + p->streamEndWasReached = 1; + return; + } + p->streamPos += (UInt32)size; + if (GET_AVAIL_BYTES(p) > p->keepSizeAfter) + return; + /* here and in another (p->keepSizeAfter) checks we keep on 1 byte more than was requested by Create() function + (GET_AVAIL_BYTES(p) >= p->keepSizeAfter) - minimal required size */ + } + + // on exit: (p->result != SZ_OK || p->streamEndWasReached || GET_AVAIL_BYTES(p) > p->keepSizeAfter) +} + + + +MY_NO_INLINE +void MatchFinder_MoveBlock(CMatchFinder *p) +{ + const size_t offset = (size_t)(p->buffer - p->bufferBase) - p->keepSizeBefore; + const size_t keepBefore = (offset & (kBlockMoveAlign - 1)) + p->keepSizeBefore; + p->buffer = p->bufferBase + keepBefore; + memmove(p->bufferBase, + p->bufferBase + (offset & ~((size_t)kBlockMoveAlign - 1)), + keepBefore + (size_t)GET_AVAIL_BYTES(p)); +} + +/* We call MoveBlock() before ReadBlock(). + So MoveBlock() can be wasteful operation, if the whole input data + can fit in current block even without calling MoveBlock(). + in important case where (dataSize <= historySize) + condition (p->blockSize > dataSize + p->keepSizeAfter) is met + So there is no MoveBlock() in that case case. +*/ + +int MatchFinder_NeedMove(CMatchFinder *p) +{ + if (p->directInput) + return 0; + if (p->streamEndWasReached || p->result != SZ_OK) + return 0; + return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter); +} + +void MatchFinder_ReadIfRequired(CMatchFinder *p) +{ + if (p->keepSizeAfter >= GET_AVAIL_BYTES(p)) + MatchFinder_ReadBlock(p); +} + + + +static void MatchFinder_SetDefaultSettings(CMatchFinder *p) +{ + p->cutValue = 32; + p->btMode = 1; + p->numHashBytes = 4; + p->bigHash = 0; +} + +#define kCrcPoly 0xEDB88320 + +void MatchFinder_Construct(CMatchFinder *p) +{ + unsigned i; + p->bufferBase = NULL; + p->directInput = 0; + p->hash = NULL; + p->expectedDataSize = (UInt64)(Int64)-1; + MatchFinder_SetDefaultSettings(p); + + for (i = 0; i < 256; i++) + { + UInt32 r = (UInt32)i; + unsigned j; + for (j = 0; j < 8; j++) + r = (r >> 1) ^ (kCrcPoly & ((UInt32)0 - (r & 1))); + p->crc[i] = r; + } +} + +static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAllocPtr alloc) +{ + ISzAlloc_Free(alloc, p->hash); + p->hash = NULL; +} + +void MatchFinder_Free(CMatchFinder *p, ISzAllocPtr alloc) +{ + MatchFinder_FreeThisClassMemory(p, alloc); + LzInWindow_Free(p, alloc); +} + +static CLzRef* AllocRefs(size_t num, ISzAllocPtr alloc) +{ + size_t sizeInBytes = (size_t)num * sizeof(CLzRef); + if (sizeInBytes / sizeof(CLzRef) != num) + return NULL; + return (CLzRef *)ISzAlloc_Alloc(alloc, sizeInBytes); +} + +#if (kBlockSizeReserveMin < kBlockSizeAlign * 2) + #error Stop_Compiling_Bad_Reserve +#endif + + + +static UInt32 GetBlockSize(CMatchFinder *p, UInt32 historySize) +{ + UInt32 blockSize = (p->keepSizeBefore + p->keepSizeAfter); + /* + if (historySize > kMaxHistorySize) + return 0; + */ + // printf("\nhistorySize == 0x%x\n", historySize); + + if (p->keepSizeBefore < historySize || blockSize < p->keepSizeBefore) // if 32-bit overflow + return 0; + + { + const UInt32 kBlockSizeMax = (UInt32)0 - (UInt32)kBlockSizeAlign; + const UInt32 rem = kBlockSizeMax - blockSize; + const UInt32 reserve = (blockSize >> (blockSize < ((UInt32)1 << 30) ? 1 : 2)) + + (1 << 12) + kBlockMoveAlign + kBlockSizeAlign; // do not overflow 32-bit here + if (blockSize >= kBlockSizeMax + || rem < kBlockSizeReserveMin) // we reject settings that will be slow + return 0; + if (reserve >= rem) + blockSize = kBlockSizeMax; + else + { + blockSize += reserve; + blockSize &= ~(UInt32)(kBlockSizeAlign - 1); + } + } + // printf("\n LzFind_blockSize = %x\n", blockSize); + // printf("\n LzFind_blockSize = %d\n", blockSize >> 20); + return blockSize; +} + + +int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, + UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, + ISzAllocPtr alloc) +{ + /* we need one additional byte in (p->keepSizeBefore), + since we use MoveBlock() after (p->pos++) and before dictionary using */ + // keepAddBufferBefore = (UInt32)0xFFFFFFFF - (1 << 22); // for debug + p->keepSizeBefore = historySize + keepAddBufferBefore + 1; + + keepAddBufferAfter += matchMaxLen; + /* we need (p->keepSizeAfter >= p->numHashBytes) */ + if (keepAddBufferAfter < p->numHashBytes) + keepAddBufferAfter = p->numHashBytes; + // keepAddBufferAfter -= 2; // for debug + p->keepSizeAfter = keepAddBufferAfter; + + if (p->directInput) + p->blockSize = 0; + if (p->directInput || LzInWindow_Create2(p, GetBlockSize(p, historySize), alloc)) + { + const UInt32 newCyclicBufferSize = historySize + 1; // do not change it + UInt32 hs; + p->matchMaxLen = matchMaxLen; + { + // UInt32 hs4; + p->fixedHashSize = 0; + hs = (1 << 16) - 1; + if (p->numHashBytes != 2) + { + hs = historySize; + if (hs > p->expectedDataSize) + hs = (UInt32)p->expectedDataSize; + if (hs != 0) + hs--; + hs |= (hs >> 1); + hs |= (hs >> 2); + hs |= (hs >> 4); + hs |= (hs >> 8); + // we propagated 16 bits in (hs). Low 16 bits must be set later + hs >>= 1; + if (hs >= (1 << 24)) + { + if (p->numHashBytes == 3) + hs = (1 << 24) - 1; + else + hs >>= 1; + /* if (bigHash) mode, GetHeads4b() in LzFindMt.c needs (hs >= ((1 << 24) - 1))) */ + } + + // hs = ((UInt32)1 << 25) - 1; // for test + + // (hash_size >= (1 << 16)) : Required for (numHashBytes > 2) + hs |= (1 << 16) - 1; /* don't change it! */ + + // bt5: we adjust the size with recommended minimum size + if (p->numHashBytes >= 5) + hs |= (256 << kLzHash_CrcShift_2) - 1; + } + p->hashMask = hs; + hs++; + + /* + hs4 = (1 << 20); + if (hs4 > hs) + hs4 = hs; + // hs4 = (1 << 16); // for test + p->hash4Mask = hs4 - 1; + */ + + if (p->numHashBytes > 2) p->fixedHashSize += kHash2Size; + if (p->numHashBytes > 3) p->fixedHashSize += kHash3Size; + // if (p->numHashBytes > 4) p->fixedHashSize += hs4; // kHash4Size; + hs += p->fixedHashSize; + } + + { + size_t newSize; + size_t numSons; + p->historySize = historySize; + p->hashSizeSum = hs; + p->cyclicBufferSize = newCyclicBufferSize; // it must be = (historySize + 1) + + numSons = newCyclicBufferSize; + if (p->btMode) + numSons <<= 1; + newSize = hs + numSons; + + // aligned size is not required here, but it can be better for some loops + #define NUM_REFS_ALIGN_MASK 0xF + newSize = (newSize + NUM_REFS_ALIGN_MASK) & ~(size_t)NUM_REFS_ALIGN_MASK; + + if (p->hash && p->numRefs == newSize) + return 1; + + MatchFinder_FreeThisClassMemory(p, alloc); + p->numRefs = newSize; + p->hash = AllocRefs(newSize, alloc); + + if (p->hash) + { + p->son = p->hash + p->hashSizeSum; + return 1; + } + } + } + + MatchFinder_Free(p, alloc); + return 0; +} + + +static void MatchFinder_SetLimits(CMatchFinder *p) +{ + UInt32 k; + UInt32 n = kMaxValForNormalize - p->pos; + if (n == 0) + n = (UInt32)(Int32)-1; // we allow (pos == 0) at start even with (kMaxValForNormalize == 0) + + k = p->cyclicBufferSize - p->cyclicBufferPos; + if (k < n) + n = k; + + k = GET_AVAIL_BYTES(p); + { + const UInt32 ksa = p->keepSizeAfter; + UInt32 mm = p->matchMaxLen; + if (k > ksa) + k -= ksa; // we must limit exactly to keepSizeAfter for ReadBlock + else if (k >= mm) + { + // the limitation for (p->lenLimit) update + k -= mm; // optimization : to reduce the number of checks + k++; + // k = 1; // non-optimized version : for debug + } + else + { + mm = k; + if (k != 0) + k = 1; + } + p->lenLimit = mm; + } + if (k < n) + n = k; + + p->posLimit = p->pos + n; +} + + +void MatchFinder_Init_LowHash(CMatchFinder *p) +{ + size_t i; + CLzRef *items = p->hash; + const size_t numItems = p->fixedHashSize; + for (i = 0; i < numItems; i++) + items[i] = kEmptyHashValue; +} + + +void MatchFinder_Init_HighHash(CMatchFinder *p) +{ + size_t i; + CLzRef *items = p->hash + p->fixedHashSize; + const size_t numItems = (size_t)p->hashMask + 1; + for (i = 0; i < numItems; i++) + items[i] = kEmptyHashValue; +} + + +void MatchFinder_Init_4(CMatchFinder *p) +{ + p->buffer = p->bufferBase; + { + /* kEmptyHashValue = 0 (Zero) is used in hash tables as NO-VALUE marker. + the code in CMatchFinderMt expects (pos = 1) */ + p->pos = + p->streamPos = + 1; // it's smallest optimal value. do not change it + // 0; // for debug + } + p->result = SZ_OK; + p->streamEndWasReached = 0; +} + + +// (CYC_TO_POS_OFFSET == 0) is expected by some optimized code +#define CYC_TO_POS_OFFSET 0 +// #define CYC_TO_POS_OFFSET 1 // for debug + +void MatchFinder_Init(CMatchFinder *p) +{ + MatchFinder_Init_HighHash(p); + MatchFinder_Init_LowHash(p); + MatchFinder_Init_4(p); + // if (readData) + MatchFinder_ReadBlock(p); + + /* if we init (cyclicBufferPos = pos), then we can use one variable + instead of both (cyclicBufferPos) and (pos) : only before (cyclicBufferPos) wrapping */ + p->cyclicBufferPos = (p->pos - CYC_TO_POS_OFFSET); // init with relation to (pos) + // p->cyclicBufferPos = 0; // smallest value + // p->son[0] = p->son[1] = 0; // unused: we can init skipped record for speculated accesses. + MatchFinder_SetLimits(p); +} + + + +#ifdef MY_CPU_X86_OR_AMD64 + #if defined(__clang__) && (__clang_major__ >= 8) \ + || defined(__GNUC__) && (__GNUC__ >= 8) \ + || defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1900) + #define USE_SATUR_SUB_128 + #define USE_AVX2 + #define ATTRIB_SSE41 __attribute__((__target__("sse4.1"))) + #define ATTRIB_AVX2 __attribute__((__target__("avx2"))) + #elif defined(_MSC_VER) + #if (_MSC_VER >= 1600) + #define USE_SATUR_SUB_128 + #if (_MSC_VER >= 1900) + #define USE_AVX2 + #include // avx + #endif + #endif + #endif + +// #elif defined(MY_CPU_ARM_OR_ARM64) +#elif defined(MY_CPU_ARM64) + + #if defined(__clang__) && (__clang_major__ >= 8) \ + || defined(__GNUC__) && (__GNUC__ >= 8) + #define USE_SATUR_SUB_128 + #ifdef MY_CPU_ARM64 + // #define ATTRIB_SSE41 __attribute__((__target__(""))) + #else + // #define ATTRIB_SSE41 __attribute__((__target__("fpu=crypto-neon-fp-armv8"))) + #endif + + #elif defined(_MSC_VER) + #if (_MSC_VER >= 1910) + #define USE_SATUR_SUB_128 + #endif + #endif + + #if defined(_MSC_VER) && defined(MY_CPU_ARM64) + #include + #else + #include + #endif + +#endif + +/* +#ifndef ATTRIB_SSE41 + #define ATTRIB_SSE41 +#endif +#ifndef ATTRIB_AVX2 + #define ATTRIB_AVX2 +#endif +*/ + +#ifdef USE_SATUR_SUB_128 + +// #define _SHOW_HW_STATUS + +#ifdef _SHOW_HW_STATUS +#include +#define _PRF(x) x +_PRF(;) +#else +#define _PRF(x) +#endif + +#ifdef MY_CPU_ARM_OR_ARM64 + +#ifdef MY_CPU_ARM64 +// #define FORCE_SATUR_SUB_128 +#endif + +typedef uint32x4_t v128; +#define SASUB_128(i) \ + *(v128 *)(void *)(items + (i) * 4) = \ + vsubq_u32(vmaxq_u32(*(const v128 *)(const void *)(items + (i) * 4), sub2), sub2); + +#else + +#include // sse4.1 + +typedef __m128i v128; +#define SASUB_128(i) \ + *(v128 *)(void *)(items + (i) * 4) = \ + _mm_sub_epi32(_mm_max_epu32(*(const v128 *)(const void *)(items + (i) * 4), sub2), sub2); // SSE 4.1 + +#endif + + + +MY_NO_INLINE +static +#ifdef ATTRIB_SSE41 +ATTRIB_SSE41 +#endif +void +MY_FAST_CALL +LzFind_SaturSub_128(UInt32 subValue, CLzRef *items, const CLzRef *lim) +{ + v128 sub2 = + #ifdef MY_CPU_ARM_OR_ARM64 + vdupq_n_u32(subValue); + #else + _mm_set_epi32((Int32)subValue, (Int32)subValue, (Int32)subValue, (Int32)subValue); + #endif + do + { + SASUB_128(0) + SASUB_128(1) + SASUB_128(2) + SASUB_128(3) + items += 4 * 4; + } + while (items != lim); +} + + + +#ifdef USE_AVX2 + +#include // avx + +#define SASUB_256(i) *(__m256i *)(void *)(items + (i) * 8) = _mm256_sub_epi32(_mm256_max_epu32(*(const __m256i *)(const void *)(items + (i) * 8), sub2), sub2); // AVX2 + +MY_NO_INLINE +static +#ifdef ATTRIB_AVX2 +ATTRIB_AVX2 +#endif +void +MY_FAST_CALL +LzFind_SaturSub_256(UInt32 subValue, CLzRef *items, const CLzRef *lim) +{ + __m256i sub2 = _mm256_set_epi32( + (Int32)subValue, (Int32)subValue, (Int32)subValue, (Int32)subValue, + (Int32)subValue, (Int32)subValue, (Int32)subValue, (Int32)subValue); + do + { + SASUB_256(0) + SASUB_256(1) + items += 2 * 8; + } + while (items != lim); +} +#endif // USE_AVX2 + +#ifndef FORCE_SATUR_SUB_128 +typedef void (MY_FAST_CALL *LZFIND_SATUR_SUB_CODE_FUNC)( + UInt32 subValue, CLzRef *items, const CLzRef *lim); +static LZFIND_SATUR_SUB_CODE_FUNC g_LzFind_SaturSub; +#endif // FORCE_SATUR_SUB_128 + +#endif // USE_SATUR_SUB_128 + + +// kEmptyHashValue must be zero +// #define SASUB_32(i) v = items[i]; m = v - subValue; if (v < subValue) m = kEmptyHashValue; items[i] = m; +#define SASUB_32(i) v = items[i]; if (v < subValue) v = subValue; items[i] = v - subValue; + +#ifdef FORCE_SATUR_SUB_128 + +#define DEFAULT_SaturSub LzFind_SaturSub_128 + +#else + +#define DEFAULT_SaturSub LzFind_SaturSub_32 + +MY_NO_INLINE +static +void +MY_FAST_CALL +LzFind_SaturSub_32(UInt32 subValue, CLzRef *items, const CLzRef *lim) +{ + do + { + UInt32 v; + SASUB_32(0) + SASUB_32(1) + SASUB_32(2) + SASUB_32(3) + SASUB_32(4) + SASUB_32(5) + SASUB_32(6) + SASUB_32(7) + items += 8; + } + while (items != lim); +} + +#endif + + +MY_NO_INLINE +void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, size_t numItems) +{ + #define K_NORM_ALIGN_BLOCK_SIZE (1 << 6) + + CLzRef *lim; + + for (; numItems != 0 && ((unsigned)(ptrdiff_t)items & (K_NORM_ALIGN_BLOCK_SIZE - 1)) != 0; numItems--) + { + UInt32 v; + SASUB_32(0); + items++; + } + + { + #define K_NORM_ALIGN_MASK (K_NORM_ALIGN_BLOCK_SIZE / 4 - 1) + lim = items + (numItems & ~(size_t)K_NORM_ALIGN_MASK); + numItems &= K_NORM_ALIGN_MASK; + if (items != lim) + { + #if defined(USE_SATUR_SUB_128) && !defined(FORCE_SATUR_SUB_128) + if (g_LzFind_SaturSub) + g_LzFind_SaturSub(subValue, items, lim); + else + #endif + DEFAULT_SaturSub(subValue, items, lim); + } + items = lim; + } + + + for (; numItems != 0; numItems--) + { + UInt32 v; + SASUB_32(0); + items++; + } +} + + + +// call MatchFinder_CheckLimits() only after (p->pos++) update + +MY_NO_INLINE +static void MatchFinder_CheckLimits(CMatchFinder *p) +{ + if (// !p->streamEndWasReached && p->result == SZ_OK && + p->keepSizeAfter == GET_AVAIL_BYTES(p)) + { + // we try to read only in exact state (p->keepSizeAfter == GET_AVAIL_BYTES(p)) + if (MatchFinder_NeedMove(p)) + MatchFinder_MoveBlock(p); + MatchFinder_ReadBlock(p); + } + + if (p->pos == kMaxValForNormalize) + if (GET_AVAIL_BYTES(p) >= p->numHashBytes) // optional optimization for last bytes of data. + /* + if we disable normalization for last bytes of data, and + if (data_size == 4 GiB), we don't call wastfull normalization, + but (pos) will be wrapped over Zero (0) in that case. + And we cannot resume later to normal operation + */ + { + // MatchFinder_Normalize(p); + /* after normalization we need (p->pos >= p->historySize + 1); */ + /* we can reduce subValue to aligned value, if want to keep alignment + of (p->pos) and (p->buffer) for speculated accesses. */ + const UInt32 subValue = (p->pos - p->historySize - 1) /* & ~(UInt32)(kNormalizeAlign - 1) */; + // const UInt32 subValue = (1 << 15); // for debug + // printf("\nMatchFinder_Normalize() subValue == 0x%x\n", subValue); + size_t numSonRefs = p->cyclicBufferSize; + if (p->btMode) + numSonRefs <<= 1; + Inline_MatchFinder_ReduceOffsets(p, subValue); + MatchFinder_Normalize3(subValue, p->hash, (size_t)p->hashSizeSum + numSonRefs); + } + + if (p->cyclicBufferPos == p->cyclicBufferSize) + p->cyclicBufferPos = 0; + + MatchFinder_SetLimits(p); +} + + +/* + (lenLimit > maxLen) +*/ +MY_FORCE_INLINE +static UInt32 * Hc_GetMatchesSpec(size_t lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, + size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, + UInt32 *d, unsigned maxLen) +{ + /* + son[_cyclicBufferPos] = curMatch; + for (;;) + { + UInt32 delta = pos - curMatch; + if (cutValue-- == 0 || delta >= _cyclicBufferSize) + return d; + { + const Byte *pb = cur - delta; + curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)]; + if (pb[maxLen] == cur[maxLen] && *pb == *cur) + { + UInt32 len = 0; + while (++len != lenLimit) + if (pb[len] != cur[len]) + break; + if (maxLen < len) + { + maxLen = len; + *d++ = len; + *d++ = delta - 1; + if (len == lenLimit) + return d; + } + } + } + } + */ + + const Byte *lim = cur + lenLimit; + son[_cyclicBufferPos] = curMatch; + + do + { + UInt32 delta; + + if (curMatch == 0) + break; + // if (curMatch2 >= curMatch) return NULL; + delta = pos - curMatch; + if (delta >= _cyclicBufferSize) + break; + { + ptrdiff_t diff; + curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)]; + diff = (ptrdiff_t)0 - (ptrdiff_t)delta; + if (cur[maxLen] == cur[(ptrdiff_t)maxLen + diff]) + { + const Byte *c = cur; + while (*c == c[diff]) + { + if (++c == lim) + { + d[0] = (UInt32)(lim - cur); + d[1] = delta - 1; + return d + 2; + } + } + { + const unsigned len = (unsigned)(c - cur); + if (maxLen < len) + { + maxLen = len; + d[0] = (UInt32)len; + d[1] = delta - 1; + d += 2; + } + } + } + } + } + while (--cutValue); + + return d; +} + + +MY_FORCE_INLINE +UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, + size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue, + UInt32 *d, UInt32 maxLen) +{ + CLzRef *ptr0 = son + ((size_t)_cyclicBufferPos << 1) + 1; + CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1); + unsigned len0 = 0, len1 = 0; + + UInt32 cmCheck; + + // if (curMatch >= pos) { *ptr0 = *ptr1 = kEmptyHashValue; return NULL; } + + cmCheck = (UInt32)(pos - _cyclicBufferSize); + if ((UInt32)pos <= _cyclicBufferSize) + cmCheck = 0; + + if (cmCheck < curMatch) + do + { + const UInt32 delta = pos - curMatch; + { + CLzRef *pair = son + ((size_t)(_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); + const Byte *pb = cur - delta; + unsigned len = (len0 < len1 ? len0 : len1); + const UInt32 pair0 = pair[0]; + if (pb[len] == cur[len]) + { + if (++len != lenLimit && pb[len] == cur[len]) + while (++len != lenLimit) + if (pb[len] != cur[len]) + break; + if (maxLen < len) + { + maxLen = (UInt32)len; + *d++ = (UInt32)len; + *d++ = delta - 1; + if (len == lenLimit) + { + *ptr1 = pair0; + *ptr0 = pair[1]; + return d; + } + } + } + if (pb[len] < cur[len]) + { + *ptr1 = curMatch; + // const UInt32 curMatch2 = pair[1]; + // if (curMatch2 >= curMatch) { *ptr0 = *ptr1 = kEmptyHashValue; return NULL; } + // curMatch = curMatch2; + curMatch = pair[1]; + ptr1 = pair + 1; + len1 = len; + } + else + { + *ptr0 = curMatch; + curMatch = pair[0]; + ptr0 = pair; + len0 = len; + } + } + } + while(--cutValue && cmCheck < curMatch); + + *ptr0 = *ptr1 = kEmptyHashValue; + return d; +} + + +static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son, + size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue) +{ + CLzRef *ptr0 = son + ((size_t)_cyclicBufferPos << 1) + 1; + CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1); + unsigned len0 = 0, len1 = 0; + + UInt32 cmCheck; + + cmCheck = (UInt32)(pos - _cyclicBufferSize); + if ((UInt32)pos <= _cyclicBufferSize) + cmCheck = 0; + + if (// curMatch >= pos || // failure + cmCheck < curMatch) + do + { + const UInt32 delta = pos - curMatch; + { + CLzRef *pair = son + ((size_t)(_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1); + const Byte *pb = cur - delta; + unsigned len = (len0 < len1 ? len0 : len1); + if (pb[len] == cur[len]) + { + while (++len != lenLimit) + if (pb[len] != cur[len]) + break; + { + if (len == lenLimit) + { + *ptr1 = pair[0]; + *ptr0 = pair[1]; + return; + } + } + } + if (pb[len] < cur[len]) + { + *ptr1 = curMatch; + curMatch = pair[1]; + ptr1 = pair + 1; + len1 = len; + } + else + { + *ptr0 = curMatch; + curMatch = pair[0]; + ptr0 = pair; + len0 = len; + } + } + } + while(--cutValue && cmCheck < curMatch); + + *ptr0 = *ptr1 = kEmptyHashValue; + return; +} + + +#define MOVE_POS \ + ++p->cyclicBufferPos; \ + p->buffer++; \ + { const UInt32 pos1 = p->pos + 1; p->pos = pos1; if (pos1 == p->posLimit) MatchFinder_CheckLimits(p); } + +#define MOVE_POS_RET MOVE_POS return distances; + +MY_NO_INLINE +static void MatchFinder_MovePos(CMatchFinder *p) +{ + /* we go here at the end of stream data, when (avail < num_hash_bytes) + We don't update sons[cyclicBufferPos << btMode]. + So (sons) record will contain junk. And we cannot resume match searching + to normal operation, even if we will provide more input data in buffer. + p->sons[p->cyclicBufferPos << p->btMode] = 0; // kEmptyHashValue + if (p->btMode) + p->sons[(p->cyclicBufferPos << p->btMode) + 1] = 0; // kEmptyHashValue + */ + MOVE_POS; +} + +#define GET_MATCHES_HEADER2(minLen, ret_op) \ + unsigned lenLimit; UInt32 hv; Byte *cur; UInt32 curMatch; \ + lenLimit = (unsigned)p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \ + cur = p->buffer; + +#define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return distances) +#define SKIP_HEADER(minLen) do { GET_MATCHES_HEADER2(minLen, continue) + +#define MF_PARAMS(p) lenLimit, curMatch, p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue + +#define SKIP_FOOTER SkipMatchesSpec(MF_PARAMS(p)); MOVE_POS; } while (--num); + +#define GET_MATCHES_FOOTER_BASE(_maxLen_, func) \ + distances = func(MF_PARAMS(p), \ + distances, (UInt32)_maxLen_); MOVE_POS_RET; + +#define GET_MATCHES_FOOTER_BT(_maxLen_) \ + GET_MATCHES_FOOTER_BASE(_maxLen_, GetMatchesSpec1) + +#define GET_MATCHES_FOOTER_HC(_maxLen_) \ + GET_MATCHES_FOOTER_BASE(_maxLen_, Hc_GetMatchesSpec) + + + +#define UPDATE_maxLen { \ + const ptrdiff_t diff = (ptrdiff_t)0 - (ptrdiff_t)d2; \ + const Byte *c = cur + maxLen; \ + const Byte *lim = cur + lenLimit; \ + for (; c != lim; c++) if (*(c + diff) != *c) break; \ + maxLen = (unsigned)(c - cur); } + +static UInt32* Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + GET_MATCHES_HEADER(2) + HASH2_CALC; + curMatch = p->hash[hv]; + p->hash[hv] = p->pos; + GET_MATCHES_FOOTER_BT(1) +} + +UInt32* Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + GET_MATCHES_HEADER(3) + HASH_ZIP_CALC; + curMatch = p->hash[hv]; + p->hash[hv] = p->pos; + GET_MATCHES_FOOTER_BT(2) +} + + +#define SET_mmm \ + mmm = p->cyclicBufferSize; \ + if (pos < mmm) \ + mmm = pos; + + +static UInt32* Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 mmm; + UInt32 h2, d2, pos; + unsigned maxLen; + UInt32 *hash; + GET_MATCHES_HEADER(3) + + HASH3_CALC; + + hash = p->hash; + pos = p->pos; + + d2 = pos - hash[h2]; + + curMatch = (hash + kFix3HashSize)[hv]; + + hash[h2] = pos; + (hash + kFix3HashSize)[hv] = pos; + + SET_mmm + + maxLen = 2; + + if (d2 < mmm && *(cur - d2) == *cur) + { + UPDATE_maxLen + distances[0] = (UInt32)maxLen; + distances[1] = d2 - 1; + distances += 2; + if (maxLen == lenLimit) + { + SkipMatchesSpec(MF_PARAMS(p)); + MOVE_POS_RET; + } + } + + GET_MATCHES_FOOTER_BT(maxLen) +} + + +static UInt32* Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 mmm; + UInt32 h2, h3, d2, d3, pos; + unsigned maxLen; + UInt32 *hash; + GET_MATCHES_HEADER(4) + + HASH4_CALC; + + hash = p->hash; + pos = p->pos; + + d2 = pos - hash [h2]; + d3 = pos - (hash + kFix3HashSize)[h3]; + curMatch = (hash + kFix4HashSize)[hv]; + + hash [h2] = pos; + (hash + kFix3HashSize)[h3] = pos; + (hash + kFix4HashSize)[hv] = pos; + + SET_mmm + + maxLen = 3; + + for (;;) + { + if (d2 < mmm && *(cur - d2) == *cur) + { + distances[0] = 2; + distances[1] = d2 - 1; + distances += 2; + if (*(cur - d2 + 2) == cur[2]) + { + // distances[-2] = 3; + } + else if (d3 < mmm && *(cur - d3) == *cur) + { + d2 = d3; + distances[1] = d3 - 1; + distances += 2; + } + else + break; + } + else if (d3 < mmm && *(cur - d3) == *cur) + { + d2 = d3; + distances[1] = d3 - 1; + distances += 2; + } + else + break; + + UPDATE_maxLen + distances[-2] = (UInt32)maxLen; + if (maxLen == lenLimit) + { + SkipMatchesSpec(MF_PARAMS(p)); + MOVE_POS_RET + } + break; + } + + GET_MATCHES_FOOTER_BT(maxLen) +} + + +static UInt32* Bt5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 mmm; + UInt32 h2, h3, d2, d3, maxLen, pos; + UInt32 *hash; + GET_MATCHES_HEADER(5) + + HASH5_CALC; + + hash = p->hash; + pos = p->pos; + + d2 = pos - hash [h2]; + d3 = pos - (hash + kFix3HashSize)[h3]; + // d4 = pos - (hash + kFix4HashSize)[h4]; + + curMatch = (hash + kFix5HashSize)[hv]; + + hash [h2] = pos; + (hash + kFix3HashSize)[h3] = pos; + // (hash + kFix4HashSize)[h4] = pos; + (hash + kFix5HashSize)[hv] = pos; + + SET_mmm + + maxLen = 4; + + for (;;) + { + if (d2 < mmm && *(cur - d2) == *cur) + { + distances[0] = 2; + distances[1] = d2 - 1; + distances += 2; + if (*(cur - d2 + 2) == cur[2]) + { + } + else if (d3 < mmm && *(cur - d3) == *cur) + { + distances[1] = d3 - 1; + distances += 2; + d2 = d3; + } + else + break; + } + else if (d3 < mmm && *(cur - d3) == *cur) + { + distances[1] = d3 - 1; + distances += 2; + d2 = d3; + } + else + break; + + distances[-2] = 3; + if (*(cur - d2 + 3) != cur[3]) + break; + UPDATE_maxLen + distances[-2] = (UInt32)maxLen; + if (maxLen == lenLimit) + { + SkipMatchesSpec(MF_PARAMS(p)); + MOVE_POS_RET; + } + break; + } + + GET_MATCHES_FOOTER_BT(maxLen) +} + + +static UInt32* Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 mmm; + UInt32 h2, h3, d2, d3, pos; + unsigned maxLen; + UInt32 *hash; + GET_MATCHES_HEADER(4) + + HASH4_CALC; + + hash = p->hash; + pos = p->pos; + + d2 = pos - hash [h2]; + d3 = pos - (hash + kFix3HashSize)[h3]; + curMatch = (hash + kFix4HashSize)[hv]; + + hash [h2] = pos; + (hash + kFix3HashSize)[h3] = pos; + (hash + kFix4HashSize)[hv] = pos; + + SET_mmm + + maxLen = 3; + + for (;;) + { + if (d2 < mmm && *(cur - d2) == *cur) + { + distances[0] = 2; + distances[1] = d2 - 1; + distances += 2; + if (*(cur - d2 + 2) == cur[2]) + { + // distances[-2] = 3; + } + else if (d3 < mmm && *(cur - d3) == *cur) + { + d2 = d3; + distances[1] = d3 - 1; + distances += 2; + } + else + break; + } + else if (d3 < mmm && *(cur - d3) == *cur) + { + d2 = d3; + distances[1] = d3 - 1; + distances += 2; + } + else + break; + + UPDATE_maxLen + distances[-2] = (UInt32)maxLen; + if (maxLen == lenLimit) + { + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS_RET; + } + break; + } + + GET_MATCHES_FOOTER_HC(maxLen); +} + + +static UInt32 * Hc5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + UInt32 mmm; + UInt32 h2, h3, d2, d3, maxLen, pos; + UInt32 *hash; + GET_MATCHES_HEADER(5) + + HASH5_CALC; + + hash = p->hash; + pos = p->pos; + + d2 = pos - hash [h2]; + d3 = pos - (hash + kFix3HashSize)[h3]; + // d4 = pos - (hash + kFix4HashSize)[h4]; + + curMatch = (hash + kFix5HashSize)[hv]; + + hash [h2] = pos; + (hash + kFix3HashSize)[h3] = pos; + // (hash + kFix4HashSize)[h4] = pos; + (hash + kFix5HashSize)[hv] = pos; + + SET_mmm + + maxLen = 4; + + for (;;) + { + if (d2 < mmm && *(cur - d2) == *cur) + { + distances[0] = 2; + distances[1] = d2 - 1; + distances += 2; + if (*(cur - d2 + 2) == cur[2]) + { + } + else if (d3 < mmm && *(cur - d3) == *cur) + { + distances[1] = d3 - 1; + distances += 2; + d2 = d3; + } + else + break; + } + else if (d3 < mmm && *(cur - d3) == *cur) + { + distances[1] = d3 - 1; + distances += 2; + d2 = d3; + } + else + break; + + distances[-2] = 3; + if (*(cur - d2 + 3) != cur[3]) + break; + UPDATE_maxLen + distances[-2] = maxLen; + if (maxLen == lenLimit) + { + p->son[p->cyclicBufferPos] = curMatch; + MOVE_POS_RET; + } + break; + } + + GET_MATCHES_FOOTER_HC(maxLen); +} + + +UInt32* Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances) +{ + GET_MATCHES_HEADER(3) + HASH_ZIP_CALC; + curMatch = p->hash[hv]; + p->hash[hv] = p->pos; + GET_MATCHES_FOOTER_HC(2) +} + + +static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + SKIP_HEADER(2) + { + HASH2_CALC; + curMatch = p->hash[hv]; + p->hash[hv] = p->pos; + } + SKIP_FOOTER +} + +void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + SKIP_HEADER(3) + { + HASH_ZIP_CALC; + curMatch = p->hash[hv]; + p->hash[hv] = p->pos; + } + SKIP_FOOTER +} + +static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + SKIP_HEADER(3) + { + UInt32 h2; + UInt32 *hash; + HASH3_CALC; + hash = p->hash; + curMatch = (hash + kFix3HashSize)[hv]; + hash[h2] = + (hash + kFix3HashSize)[hv] = p->pos; + } + SKIP_FOOTER +} + +static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + SKIP_HEADER(4) + { + UInt32 h2, h3; + UInt32 *hash; + HASH4_CALC; + hash = p->hash; + curMatch = (hash + kFix4HashSize)[hv]; + hash [h2] = + (hash + kFix3HashSize)[h3] = + (hash + kFix4HashSize)[hv] = p->pos; + } + SKIP_FOOTER +} + +static void Bt5_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + SKIP_HEADER(5) + { + UInt32 h2, h3; + UInt32 *hash; + HASH5_CALC; + hash = p->hash; + curMatch = (hash + kFix5HashSize)[hv]; + hash [h2] = + (hash + kFix3HashSize)[h3] = + // (hash + kFix4HashSize)[h4] = + (hash + kFix5HashSize)[hv] = p->pos; + } + SKIP_FOOTER +} + + +#define HC_SKIP_HEADER(minLen) \ + do { if (p->lenLimit < minLen) { MatchFinder_MovePos(p); num--; continue; } { \ + Byte *cur; \ + UInt32 *hash; \ + UInt32 *son; \ + UInt32 pos = p->pos; \ + UInt32 num2 = num; \ + /* (p->pos == p->posLimit) is not allowed here !!! */ \ + { const UInt32 rem = p->posLimit - pos; if (num2 > rem) num2 = rem; } \ + num -= num2; \ + { const UInt32 cycPos = p->cyclicBufferPos; \ + son = p->son + cycPos; \ + p->cyclicBufferPos = cycPos + num2; } \ + cur = p->buffer; \ + hash = p->hash; \ + do { \ + UInt32 curMatch; \ + UInt32 hv; + + +#define HC_SKIP_FOOTER \ + cur++; pos++; *son++ = curMatch; \ + } while (--num2); \ + p->buffer = cur; \ + p->pos = pos; \ + if (pos == p->posLimit) MatchFinder_CheckLimits(p); \ + }} while(num); \ + + +static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + HC_SKIP_HEADER(4) + + UInt32 h2, h3; + HASH4_CALC; + curMatch = (hash + kFix4HashSize)[hv]; + hash [h2] = + (hash + kFix3HashSize)[h3] = + (hash + kFix4HashSize)[hv] = pos; + + HC_SKIP_FOOTER +} + + +static void Hc5_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + HC_SKIP_HEADER(5) + + UInt32 h2, h3; + HASH5_CALC + curMatch = (hash + kFix5HashSize)[hv]; + hash [h2] = + (hash + kFix3HashSize)[h3] = + // (hash + kFix4HashSize)[h4] = + (hash + kFix5HashSize)[hv] = pos; + + HC_SKIP_FOOTER +} + + +void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num) +{ + HC_SKIP_HEADER(3) + + HASH_ZIP_CALC; + curMatch = hash[hv]; + hash[hv] = pos; + + HC_SKIP_FOOTER +} + + +void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder2 *vTable) +{ + vTable->Init = (Mf_Init_Func)MatchFinder_Init; + vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes; + vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos; + if (!p->btMode) + { + if (p->numHashBytes <= 4) + { + vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip; + } + else + { + vTable->GetMatches = (Mf_GetMatches_Func)Hc5_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Hc5_MatchFinder_Skip; + } + } + else if (p->numHashBytes == 2) + { + vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip; + } + else if (p->numHashBytes == 3) + { + vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip; + } + else if (p->numHashBytes == 4) + { + vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip; + } + else + { + vTable->GetMatches = (Mf_GetMatches_Func)Bt5_MatchFinder_GetMatches; + vTable->Skip = (Mf_Skip_Func)Bt5_MatchFinder_Skip; + } +} + + + +void LzFindPrepare() +{ + #ifndef FORCE_SATUR_SUB_128 + #ifdef USE_SATUR_SUB_128 + LZFIND_SATUR_SUB_CODE_FUNC f = NULL; + #ifdef MY_CPU_ARM_OR_ARM64 + { + if (CPU_IsSupported_NEON()) + { + // #pragma message ("=== LzFind NEON") + _PRF(printf("\n=== LzFind NEON\n")); + f = LzFind_SaturSub_128; + } + // f = 0; // for debug + } + #else // MY_CPU_ARM_OR_ARM64 + if (CPU_IsSupported_SSE41()) + { + // #pragma message ("=== LzFind SSE41") + _PRF(printf("\n=== LzFind SSE41\n")); + f = LzFind_SaturSub_128; + + #ifdef USE_AVX2 + if (CPU_IsSupported_AVX2()) + { + // #pragma message ("=== LzFind AVX2") + _PRF(printf("\n=== LzFind AVX2\n")); + f = LzFind_SaturSub_256; + } + #endif + } + #endif // MY_CPU_ARM_OR_ARM64 + g_LzFind_SaturSub = f; + #endif // USE_SATUR_SUB_128 + #endif // FORCE_SATUR_SUB_128 +} diff --git a/deps/LZMA-SDK/C/LzFind.h b/deps/LZMA-SDK/C/LzFind.h index 3e2248e7d..eea873ff6 100644 --- a/deps/LZMA-SDK/C/LzFind.h +++ b/deps/LZMA-SDK/C/LzFind.h @@ -1,121 +1,136 @@ -/* LzFind.h -- Match finder for LZ algorithms -2021-02-09 : Igor Pavlov : Public domain */ - -#ifndef __LZ_FIND_H -#define __LZ_FIND_H - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -typedef UInt32 CLzRef; - -typedef struct _CMatchFinder -{ - Byte *buffer; - UInt32 pos; - UInt32 posLimit; - UInt32 streamPos; - UInt32 lenLimit; - - UInt32 cyclicBufferPos; - UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */ - - Byte streamEndWasReached; - Byte btMode; - Byte bigHash; - Byte directInput; - - UInt32 matchMaxLen; - CLzRef *hash; - CLzRef *son; - UInt32 hashMask; - UInt32 cutValue; - - Byte *bufferBase; - ISeqInStream *stream; - - UInt32 blockSize; - UInt32 keepSizeBefore; - UInt32 keepSizeAfter; - - UInt32 numHashBytes; - size_t directInputRem; - UInt32 historySize; - UInt32 fixedHashSize; - UInt32 hashSizeSum; - SRes result; - UInt32 crc[256]; - size_t numRefs; - - UInt64 expectedDataSize; -} CMatchFinder; - -#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer) - -#define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos) - -#define Inline_MatchFinder_IsFinishedOK(p) \ - ((p)->streamEndWasReached \ - && (p)->streamPos == (p)->pos \ - && (!(p)->directInput || (p)->directInputRem == 0)) - -int MatchFinder_NeedMove(CMatchFinder *p); -// Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p); -void MatchFinder_MoveBlock(CMatchFinder *p); -void MatchFinder_ReadIfRequired(CMatchFinder *p); - -void MatchFinder_Construct(CMatchFinder *p); - -/* Conditions: - historySize <= 3 GB - keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB -*/ -int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, - UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, - ISzAllocPtr alloc); -void MatchFinder_Free(CMatchFinder *p, ISzAllocPtr alloc); -void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, size_t numItems); -void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue); - -UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son, - UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue, - UInt32 *distances, UInt32 maxLen); - -/* -Conditions: - Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func. - Mf_GetPointerToCurrentPos_Func's result must be used only before any other function -*/ - -typedef void (*Mf_Init_Func)(void *object); -typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(void *object); -typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(void *object); -typedef UInt32 (*Mf_GetMatches_Func)(void *object, UInt32 *distances); -typedef void (*Mf_Skip_Func)(void *object, UInt32); - -typedef struct _IMatchFinder -{ - Mf_Init_Func Init; - Mf_GetNumAvailableBytes_Func GetNumAvailableBytes; - Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos; - Mf_GetMatches_Func GetMatches; - Mf_Skip_Func Skip; -} IMatchFinder; - -void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable); - -void MatchFinder_Init_LowHash(CMatchFinder *p); -void MatchFinder_Init_HighHash(CMatchFinder *p); -void MatchFinder_Init_3(CMatchFinder *p, int readData); -void MatchFinder_Init(CMatchFinder *p); - -UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); -UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); - -void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); -void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); - -EXTERN_C_END - -#endif +/* LzFind.h -- Match finder for LZ algorithms +2021-07-13 : Igor Pavlov : Public domain */ + +#ifndef __LZ_FIND_H +#define __LZ_FIND_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +typedef UInt32 CLzRef; + +typedef struct _CMatchFinder +{ + Byte *buffer; + UInt32 pos; + UInt32 posLimit; + UInt32 streamPos; /* wrap over Zero is allowed (streamPos < pos). Use (UInt32)(streamPos - pos) */ + UInt32 lenLimit; + + UInt32 cyclicBufferPos; + UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */ + + Byte streamEndWasReached; + Byte btMode; + Byte bigHash; + Byte directInput; + + UInt32 matchMaxLen; + CLzRef *hash; + CLzRef *son; + UInt32 hashMask; + UInt32 cutValue; + + Byte *bufferBase; + ISeqInStream *stream; + + UInt32 blockSize; + UInt32 keepSizeBefore; + UInt32 keepSizeAfter; + + UInt32 numHashBytes; + size_t directInputRem; + UInt32 historySize; + UInt32 fixedHashSize; + UInt32 hashSizeSum; + SRes result; + UInt32 crc[256]; + size_t numRefs; + + UInt64 expectedDataSize; +} CMatchFinder; + +#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((const Byte *)(p)->buffer) + +#define Inline_MatchFinder_GetNumAvailableBytes(p) ((UInt32)((p)->streamPos - (p)->pos)) + +/* +#define Inline_MatchFinder_IsFinishedOK(p) \ + ((p)->streamEndWasReached \ + && (p)->streamPos == (p)->pos \ + && (!(p)->directInput || (p)->directInputRem == 0)) +*/ + +int MatchFinder_NeedMove(CMatchFinder *p); +/* Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p); */ +void MatchFinder_MoveBlock(CMatchFinder *p); +void MatchFinder_ReadIfRequired(CMatchFinder *p); + +void MatchFinder_Construct(CMatchFinder *p); + +/* Conditions: + historySize <= 3 GB + keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB +*/ +int MatchFinder_Create(CMatchFinder *p, UInt32 historySize, + UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter, + ISzAllocPtr alloc); +void MatchFinder_Free(CMatchFinder *p, ISzAllocPtr alloc); +void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, size_t numItems); +// void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue); + +/* +#define Inline_MatchFinder_InitPos(p, val) \ + (p)->pos = (val); \ + (p)->streamPos = (val); +*/ + +#define Inline_MatchFinder_ReduceOffsets(p, subValue) \ + (p)->pos -= (subValue); \ + (p)->streamPos -= (subValue); + + +UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son, + size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue, + UInt32 *distances, UInt32 maxLen); + +/* +Conditions: + Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func. + Mf_GetPointerToCurrentPos_Func's result must be used only before any other function +*/ + +typedef void (*Mf_Init_Func)(void *object); +typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(void *object); +typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(void *object); +typedef UInt32 * (*Mf_GetMatches_Func)(void *object, UInt32 *distances); +typedef void (*Mf_Skip_Func)(void *object, UInt32); + +typedef struct _IMatchFinder +{ + Mf_Init_Func Init; + Mf_GetNumAvailableBytes_Func GetNumAvailableBytes; + Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos; + Mf_GetMatches_Func GetMatches; + Mf_Skip_Func Skip; +} IMatchFinder2; + +void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder2 *vTable); + +void MatchFinder_Init_LowHash(CMatchFinder *p); +void MatchFinder_Init_HighHash(CMatchFinder *p); +void MatchFinder_Init_4(CMatchFinder *p); +void MatchFinder_Init(CMatchFinder *p); + +UInt32* Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); +UInt32* Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances); + +void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); +void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num); + +void LzFindPrepare(void); + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/LzFindMt.c b/deps/LZMA-SDK/C/LzFindMt.c index cb29a1eac..4e67fc3f2 100644 --- a/deps/LZMA-SDK/C/LzFindMt.c +++ b/deps/LZMA-SDK/C/LzFindMt.c @@ -1,1182 +1,1400 @@ -/* LzFindMt.c -- multithreaded Match finder for LZ algorithms -2021-04-01 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include "CpuArch.h" - -#include "LzHash.h" -#include "LzFindMt.h" - -// #define LOG_ITERS - -#ifdef LOG_ITERS -#include -static UInt64 g_NumIters_Tree; -static UInt64 g_NumIters_Loop; -#define LOG_ITER(x) x -#else -#define LOG_ITER(x) -#endif - -#define kMtHashBlockSize (1 << 17) -#define kMtHashNumBlocks (1 << 1) -#define kMtHashNumBlocksMask (kMtHashNumBlocks - 1) - -#define kMtBtBlockSize (1 << 16) -#define kMtBtNumBlocks (1 << 4) -#define kMtBtNumBlocksMask (kMtBtNumBlocks - 1) - -/* - HASH functions: - We use raw 8/16 bits from a[1] and a[2], - xored with crc(a[0]) and crc(a[3]). - We check a[0], a[3] only. We don't need to compare a[1] and a[2] in matches. - our crc() function provides one-to-one correspondence for low 8-bit values: - (crc[0...0xFF] & 0xFF) <-> [0...0xFF] -*/ - -#define MT_HASH2_CALC \ - h2 = (p->crc[cur[0]] ^ cur[1]) & (kHash2Size - 1); - -#define MT_HASH3_CALC { \ - UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ - h2 = temp & (kHash2Size - 1); \ - h3 = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); } - -/* -#define MT_HASH3_CALC__NO_2 { \ - UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ - h3 = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); } - -#define __MT_HASH4_CALC { \ - UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ - h2 = temp & (kHash2Size - 1); \ - temp ^= ((UInt32)cur[2] << 8); \ - h3 = temp & (kHash3Size - 1); \ - h4 = (temp ^ (p->crc[cur[3]] << kLzHash_CrcShift_1)) & p->hash4Mask; } - // (kHash4Size - 1); -*/ - - -static void MtSync_Construct(CMtSync *p) -{ - p->wasCreated = False; - p->csWasInitialized = False; - p->csWasEntered = False; - Thread_Construct(&p->thread); - Event_Construct(&p->canStart); - Event_Construct(&p->wasStarted); - Event_Construct(&p->wasStopped); - Semaphore_Construct(&p->freeSemaphore); - Semaphore_Construct(&p->filledSemaphore); - p->affinity = 0; -} - - -MY_NO_INLINE -static void MtSync_GetNextBlock(CMtSync *p) -{ - if (p->needStart) - { - p->numProcessedBlocks = 1; - p->needStart = False; - p->stopWriting = False; - p->exit = False; - Event_Reset(&p->wasStarted); - Event_Reset(&p->wasStopped); - - Event_Set(&p->canStart); - Event_Wait(&p->wasStarted); - - // if (mt) MatchFinder_Init_LowHash(mt->MatchFinder); - } - else - { - CriticalSection_Leave(&p->cs); - p->csWasEntered = False; - p->numProcessedBlocks++; - Semaphore_Release1(&p->freeSemaphore); - } - Semaphore_Wait(&p->filledSemaphore); - CriticalSection_Enter(&p->cs); - p->csWasEntered = True; -} - -/* MtSync_StopWriting must be called if Writing was started */ - -static void MtSync_StopWriting(CMtSync *p) -{ - UInt32 myNumBlocks = p->numProcessedBlocks; - if (!Thread_WasCreated(&p->thread) || p->needStart) - return; - p->stopWriting = True; - if (p->csWasEntered) - { - CriticalSection_Leave(&p->cs); - p->csWasEntered = False; - } - Semaphore_Release1(&p->freeSemaphore); - - Event_Wait(&p->wasStopped); - - while (myNumBlocks++ != p->numProcessedBlocks) - { - Semaphore_Wait(&p->filledSemaphore); - Semaphore_Release1(&p->freeSemaphore); - } - p->needStart = True; -} - -static void MtSync_Destruct(CMtSync *p) -{ - if (Thread_WasCreated(&p->thread)) - { - MtSync_StopWriting(p); - p->exit = True; - if (p->needStart) - Event_Set(&p->canStart); - Thread_Wait_Close(&p->thread); - } - if (p->csWasInitialized) - { - CriticalSection_Delete(&p->cs); - p->csWasInitialized = False; - } - - Event_Close(&p->canStart); - Event_Close(&p->wasStarted); - Event_Close(&p->wasStopped); - Semaphore_Close(&p->freeSemaphore); - Semaphore_Close(&p->filledSemaphore); - - p->wasCreated = False; -} - -#define RINOK_THREAD(x) { if ((x) != 0) return SZ_ERROR_THREAD; } - -static SRes MtSync_Create2(CMtSync *p, THREAD_FUNC_TYPE startAddress, void *obj, UInt32 numBlocks) -{ - WRes wres; - if (p->wasCreated) - return SZ_OK; - - RINOK_THREAD(CriticalSection_Init(&p->cs)); - p->csWasInitialized = True; - - RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->canStart)); - RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->wasStarted)); - RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->wasStopped)); - - RINOK_THREAD(Semaphore_Create(&p->freeSemaphore, numBlocks, numBlocks)); - RINOK_THREAD(Semaphore_Create(&p->filledSemaphore, 0, numBlocks)); - - p->needStart = True; - - if (p->affinity != 0) - wres = Thread_Create_With_Affinity(&p->thread, startAddress, obj, (CAffinityMask)p->affinity); - else - wres = Thread_Create(&p->thread, startAddress, obj); - RINOK_THREAD(wres); - p->wasCreated = True; - return SZ_OK; -} - -static SRes MtSync_Create(CMtSync *p, THREAD_FUNC_TYPE startAddress, void *obj, UInt32 numBlocks) -{ - SRes res = MtSync_Create2(p, startAddress, obj, numBlocks); - if (res != SZ_OK) - MtSync_Destruct(p); - return res; -} - -// static void MtSync_Init(CMtSync *p) { p->needStart = True; } - -#define kMtMaxValForNormalize 0xFFFFFFFF -// #define kMtMaxValForNormalize ((1 << 25) + (1 << 20)) - - -#ifdef MY_CPU_LE_UNALIGN - #define GetUi24hi_from32(p) ((UInt32)GetUi32(p) >> 8) -#else - #define GetUi24hi_from32(p) ((p)[1] ^ ((UInt32)(p)[2] << 8) ^ ((UInt32)(p)[3] << 16)) -#endif - -#define GetHeads_DECL(name) \ - static void GetHeads ## name(const Byte *p, UInt32 pos, \ - UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc) - -#define GetHeads_LOOP(v) \ - for (; numHeads != 0; numHeads--) { \ - const UInt32 value = (v); \ - p++; \ - *heads++ = pos - hash[value]; \ - hash[value] = pos++; } - -#define DEF_GetHeads2(name, v, action) \ - GetHeads_DECL(name) { action \ - GetHeads_LOOP(v) } - -#define DEF_GetHeads(name, v) DEF_GetHeads2(name, v, ;) - -DEF_GetHeads2(2, GetUi16(p), UNUSED_VAR(hashMask); UNUSED_VAR(crc); ) -DEF_GetHeads(3, (crc[p[0]] ^ GetUi16(p + 1)) & hashMask) -DEF_GetHeads2(3b, GetUi16(p) ^ ((UInt32)(p)[2] << 16), UNUSED_VAR(hashMask); UNUSED_VAR(crc); ) -// BT3 is not good for crc collisions for big hashMask values. - -/* -GetHeads_DECL(3b) -{ - UNUSED_VAR(hashMask); - UNUSED_VAR(crc); - { - const Byte *pLim = p + numHeads; - if (numHeads == 0) - return; - pLim--; - while (p < pLim) - { - UInt32 v1 = GetUi32(p); - UInt32 v0 = v1 & 0xFFFFFF; - UInt32 h0, h1; - p += 2; - v1 >>= 8; - h0 = hash[v0]; hash[v0] = pos; heads[0] = pos - h0; pos++; - h1 = hash[v1]; hash[v1] = pos; heads[1] = pos - h1; pos++; - heads += 2; - } - if (p == pLim) - { - UInt32 v0 = GetUi16(p) ^ ((UInt32)(p)[2] << 16); - *heads = pos - hash[v0]; - hash[v0] = pos; - } - } -} -*/ - -/* -GetHeads_DECL(4) -{ - unsigned sh = 0; - UNUSED_VAR(crc) - while ((hashMask & 0x80000000) == 0) - { - hashMask <<= 1; - sh++; - } - GetHeads_LOOP((GetUi32(p) * 0xa54a1) >> sh) -} -#define GetHeads4b GetHeads4 -*/ - -#define USE_GetHeads_LOCAL_CRC - -#ifdef USE_GetHeads_LOCAL_CRC - -GetHeads_DECL(4) -{ - UInt32 crc0[256]; - UInt32 crc1[256]; - { - unsigned i; - for (i = 0; i < 256; i++) - { - UInt32 v = crc[i]; - crc0[i] = v & hashMask; - crc1[i] = (v << kLzHash_CrcShift_1) & hashMask; - // crc1[i] = rotlFixed(v, 8) & hashMask; - } - } - GetHeads_LOOP(crc0[p[0]] ^ crc1[p[3]] ^ (UInt32)GetUi16(p+1)) -} - -GetHeads_DECL(4b) -{ - UInt32 crc0[256]; - { - unsigned i; - for (i = 0; i < 256; i++) - crc0[i] = crc[i] & hashMask; - } - GetHeads_LOOP(crc0[p[0]] ^ GetUi24hi_from32(p)) -} - -GetHeads_DECL(5) -{ - UInt32 crc0[256]; - UInt32 crc1[256]; - UInt32 crc2[256]; - { - unsigned i; - for (i = 0; i < 256; i++) - { - UInt32 v = crc[i]; - crc0[i] = v & hashMask; - crc1[i] = (v << kLzHash_CrcShift_1) & hashMask; - crc2[i] = (v << kLzHash_CrcShift_2) & hashMask; - } - } - GetHeads_LOOP(crc0[p[0]] ^ crc1[p[3]] ^ crc2[p[4]] ^ (UInt32)GetUi16(p+1)) -} - -GetHeads_DECL(5b) -{ - UInt32 crc0[256]; - UInt32 crc1[256]; - { - unsigned i; - for (i = 0; i < 256; i++) - { - UInt32 v = crc[i]; - crc0[i] = v & hashMask; - crc1[i] = (v << kLzHash_CrcShift_1) & hashMask; - } - } - GetHeads_LOOP(crc0[p[0]] ^ crc1[p[4]] ^ GetUi24hi_from32(p)) -} - -#else - -DEF_GetHeads(4, (crc[p[0]] ^ (crc[p[3]] << kLzHash_CrcShift_1) ^ (UInt32)GetUi16(p+1)) & hashMask) -DEF_GetHeads(4b, (crc[p[0]] ^ GetUi24hi_from32(p)) & hashMask) -DEF_GetHeads(5, (crc[p[0]] ^ (crc[p[3]] << kLzHash_CrcShift_1) ^ (crc[p[4]] << kLzHash_CrcShift_2) ^ (UInt32)GetUi16(p + 1)) & hashMask) -DEF_GetHeads(5b, (crc[p[0]] ^ (crc[p[4]] << kLzHash_CrcShift_1) ^ GetUi24hi_from32(p)) & hashMask) - -#endif - - -static void HashThreadFunc(CMatchFinderMt *mt) -{ - CMtSync *p = &mt->hashSync; - for (;;) - { - UInt32 numProcessedBlocks = 0; - Event_Wait(&p->canStart); - Event_Set(&p->wasStarted); - - MatchFinder_Init_HighHash(mt->MatchFinder); - - for (;;) - { - if (p->exit) - return; - if (p->stopWriting) - { - p->numProcessedBlocks = numProcessedBlocks; - Event_Set(&p->wasStopped); - break; - } - - { - CMatchFinder *mf = mt->MatchFinder; - if (MatchFinder_NeedMove(mf)) - { - CriticalSection_Enter(&mt->btSync.cs); - CriticalSection_Enter(&mt->hashSync.cs); - { - const Byte *beforePtr = Inline_MatchFinder_GetPointerToCurrentPos(mf); - ptrdiff_t offset; - MatchFinder_MoveBlock(mf); - offset = beforePtr - Inline_MatchFinder_GetPointerToCurrentPos(mf); - mt->pointerToCurPos -= offset; - mt->buffer -= offset; - } - CriticalSection_Leave(&mt->btSync.cs); - CriticalSection_Leave(&mt->hashSync.cs); - continue; - } - - Semaphore_Wait(&p->freeSemaphore); - - MatchFinder_ReadIfRequired(mf); - if (mf->pos > (kMtMaxValForNormalize - kMtHashBlockSize)) - { - UInt32 subValue = (mf->pos - mf->historySize - 1); - MatchFinder_ReduceOffsets(mf, subValue); - MatchFinder_Normalize3(subValue, mf->hash + mf->fixedHashSize, (size_t)mf->hashMask + 1); - } - { - UInt32 *heads = mt->hashBuf + ((numProcessedBlocks++) & kMtHashNumBlocksMask) * kMtHashBlockSize; - UInt32 num = mf->streamPos - mf->pos; - heads[0] = 2; - heads[1] = num; - if (num >= mf->numHashBytes) - { - num = num - mf->numHashBytes + 1; - if (num > kMtHashBlockSize - 2) - num = kMtHashBlockSize - 2; - mt->GetHeadsFunc(mf->buffer, mf->pos, mf->hash + mf->fixedHashSize, mf->hashMask, heads + 2, num, mf->crc); - heads[0] = 2 + num; - } - mf->pos += num; - mf->buffer += num; - } - } - - Semaphore_Release1(&p->filledSemaphore); - } - } -} - -static void MatchFinderMt_GetNextBlock_Hash(CMatchFinderMt *p) -{ - MtSync_GetNextBlock(&p->hashSync); - p->hashBufPosLimit = p->hashBufPos = ((p->hashSync.numProcessedBlocks - 1) & kMtHashNumBlocksMask) * kMtHashBlockSize; - p->hashBufPosLimit += p->hashBuf[p->hashBufPos++]; - p->hashNumAvail = p->hashBuf[p->hashBufPos++]; -} - -#define kEmptyHashValue 0 - -#define MFMT_GM_INLINE - -#ifdef MFMT_GM_INLINE - -/* - we use size_t for _cyclicBufferPos instead of UInt32 - to eliminate "movsx" BUG in old MSVC x64 compiler. -*/ - -MY_NO_INLINE -static UInt32 *GetMatchesSpecN(UInt32 lenLimit, UInt32 pos, const Byte *cur, CLzRef *son, - size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue, - UInt32 *d, UInt32 _maxLen, const UInt32 *hash, const UInt32 *limit, UInt32 size, UInt32 *posRes) -{ - do - { - UInt32 *_distances = ++d; - UInt32 delta = *hash++; - - CLzRef *ptr0 = son + ((size_t)_cyclicBufferPos << 1) + 1; - CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1); - unsigned len0 = 0, len1 = 0; - UInt32 cutValue = _cutValue; - unsigned maxLen = (unsigned)_maxLen; - - /* - #define PREF_STEP 1 - if (size > PREF_STEP) - { - UInt32 delta = hash[PREF_STEP - 1]; - if (delta < _cyclicBufferSize) - { - size_t cyc1 = _cyclicBufferPos + PREF_STEP; - CLzRef *pair = son + ((size_t)(cyc1 - delta + ((delta > cyc1) ? _cyclicBufferSize : 0)) << 1); - Byte b = *(cur + PREF_STEP - delta); - _distances[0] = pair[0]; - _distances[1] = b; - } - } - */ - if (cutValue == 0 || delta >= _cyclicBufferSize) - { - *ptr0 = *ptr1 = kEmptyHashValue; - } - else - for (LOG_ITER(g_NumIters_Tree++);;) - { - LOG_ITER(g_NumIters_Loop++); - { - CLzRef *pair = son + ((size_t)(_cyclicBufferPos - delta + ((_cyclicBufferPos < delta) ? _cyclicBufferSize : 0)) << 1); - const Byte *pb = cur - delta; - unsigned len = (len0 < len1 ? len0 : len1); - UInt32 pair0 = *pair; - if (pb[len] == cur[len]) - { - if (++len != lenLimit && pb[len] == cur[len]) - while (++len != lenLimit) - if (pb[len] != cur[len]) - break; - if (maxLen < len) - { - maxLen = len; - *d++ = (UInt32)len; - *d++ = delta - 1; - if (len == lenLimit) - { - UInt32 pair1 = pair[1]; - *ptr1 = pair0; - *ptr0 = pair1; - break; - } - } - } - { - UInt32 curMatch = pos - delta; - // delta = pos - *pair; - // delta = pos - pair[((UInt32)pb[len] - (UInt32)cur[len]) >> 31]; - if (pb[len] < cur[len]) - { - delta = pos - pair[1]; - *ptr1 = curMatch; - ptr1 = pair + 1; - len1 = len; - } - else - { - delta = pos - *pair; - *ptr0 = curMatch; - ptr0 = pair; - len0 = len; - } - } - } - if (--cutValue == 0 || delta >= _cyclicBufferSize) - { - *ptr0 = *ptr1 = kEmptyHashValue; - break; - } - } - pos++; - _cyclicBufferPos++; - cur++; - { - UInt32 num = (UInt32)(d - _distances); - _distances[-1] = num; - } - } - while (d < limit && --size != 0); - *posRes = pos; - return d; -} - -#endif - - - -static void BtGetMatches(CMatchFinderMt *p, UInt32 *d) -{ - UInt32 numProcessed = 0; - UInt32 curPos = 2; - UInt32 limit = kMtBtBlockSize - (p->matchMaxLen * 2); // * 2 - - d[1] = p->hashNumAvail; - - while (curPos < limit) - { - if (p->hashBufPos == p->hashBufPosLimit) - { - MatchFinderMt_GetNextBlock_Hash(p); - d[1] = numProcessed + p->hashNumAvail; - if (p->hashNumAvail >= p->numHashBytes) - continue; - d[0] = curPos + p->hashNumAvail; - d += curPos; - for (; p->hashNumAvail != 0; p->hashNumAvail--) - *d++ = 0; - return; - } - { - UInt32 size = p->hashBufPosLimit - p->hashBufPos; - UInt32 lenLimit = p->matchMaxLen; - UInt32 pos = p->pos; - UInt32 cyclicBufferPos = p->cyclicBufferPos; - if (lenLimit >= p->hashNumAvail) - lenLimit = p->hashNumAvail; - { - UInt32 size2 = p->hashNumAvail - lenLimit + 1; - if (size2 < size) - size = size2; - size2 = p->cyclicBufferSize - cyclicBufferPos; - if (size2 < size) - size = size2; - } - - #ifndef MFMT_GM_INLINE - while (curPos < limit && size-- != 0) - { - UInt32 *startDistances = d + curPos; - UInt32 num = (UInt32)(GetMatchesSpec1(lenLimit, pos - p->hashBuf[p->hashBufPos++], - pos, p->buffer, p->son, cyclicBufferPos, p->cyclicBufferSize, p->cutValue, - startDistances + 1, p->numHashBytes - 1) - startDistances); - *startDistances = num - 1; - curPos += num; - cyclicBufferPos++; - pos++; - p->buffer++; - } - #else - { - UInt32 posRes; - curPos = (UInt32)(GetMatchesSpecN(lenLimit, pos, p->buffer, p->son, cyclicBufferPos, p->cyclicBufferSize, p->cutValue, - d + curPos, p->numHashBytes - 1, p->hashBuf + p->hashBufPos, - d + limit, - size, &posRes) - d); - p->hashBufPos += posRes - pos; - cyclicBufferPos += posRes - pos; - p->buffer += posRes - pos; - pos = posRes; - } - #endif - - numProcessed += pos - p->pos; - p->hashNumAvail -= pos - p->pos; - p->pos = pos; - if (cyclicBufferPos == p->cyclicBufferSize) - cyclicBufferPos = 0; - p->cyclicBufferPos = cyclicBufferPos; - } - } - - d[0] = curPos; -} - -static void BtFillBlock(CMatchFinderMt *p, UInt32 globalBlockIndex) -{ - CMtSync *sync = &p->hashSync; - if (!sync->needStart) - { - CriticalSection_Enter(&sync->cs); - sync->csWasEntered = True; - } - - BtGetMatches(p, p->btBuf + (globalBlockIndex & kMtBtNumBlocksMask) * kMtBtBlockSize); - - if (p->pos > kMtMaxValForNormalize - kMtBtBlockSize) - { - UInt32 subValue = p->pos - p->cyclicBufferSize; - MatchFinder_Normalize3(subValue, p->son, (size_t)p->cyclicBufferSize * 2); - p->pos -= subValue; - } - - if (!sync->needStart) - { - CriticalSection_Leave(&sync->cs); - sync->csWasEntered = False; - } -} - -static void BtThreadFunc(CMatchFinderMt *mt) -{ - CMtSync *p = &mt->btSync; - for (;;) - { - UInt32 blockIndex = 0; - Event_Wait(&p->canStart); - Event_Set(&p->wasStarted); - for (;;) - { - if (p->exit) - return; - if (p->stopWriting) - { - p->numProcessedBlocks = blockIndex; - MtSync_StopWriting(&mt->hashSync); - Event_Set(&p->wasStopped); - break; - } - Semaphore_Wait(&p->freeSemaphore); - BtFillBlock(mt, blockIndex++); - Semaphore_Release1(&p->filledSemaphore); - } - } -} - -void MatchFinderMt_Construct(CMatchFinderMt *p) -{ - p->hashBuf = NULL; - MtSync_Construct(&p->hashSync); - MtSync_Construct(&p->btSync); -} - -static void MatchFinderMt_FreeMem(CMatchFinderMt *p, ISzAllocPtr alloc) -{ - ISzAlloc_Free(alloc, p->hashBuf); - p->hashBuf = NULL; -} - -void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAllocPtr alloc) -{ - MtSync_Destruct(&p->hashSync); - MtSync_Destruct(&p->btSync); - - LOG_ITER( - printf("\nTree %9d * %7d iter = %9d sum \n", - (UInt32)(g_NumIters_Tree / 1000), - (UInt32)(((UInt64)g_NumIters_Loop * 1000) / (g_NumIters_Tree + 1)), - (UInt32)(g_NumIters_Loop / 1000) - )); - - MatchFinderMt_FreeMem(p, alloc); -} - -#define kHashBufferSize (kMtHashBlockSize * kMtHashNumBlocks) -#define kBtBufferSize (kMtBtBlockSize * kMtBtNumBlocks) - -static THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE HashThreadFunc2(void *p) { HashThreadFunc((CMatchFinderMt *)p); return 0; } -static THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE BtThreadFunc2(void *p) -{ - Byte allocaDummy[0x180]; - unsigned i = 0; - for (i = 0; i < 16; i++) - allocaDummy[i] = (Byte)0; - if (allocaDummy[0] == 0) - BtThreadFunc((CMatchFinderMt *)p); - return 0; -} - -SRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore, - UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAllocPtr alloc) -{ - CMatchFinder *mf = p->MatchFinder; - p->historySize = historySize; - if (kMtBtBlockSize <= matchMaxLen * 4) - return SZ_ERROR_PARAM; - if (!p->hashBuf) - { - p->hashBuf = (UInt32 *)ISzAlloc_Alloc(alloc, (kHashBufferSize + kBtBufferSize) * sizeof(UInt32)); - if (!p->hashBuf) - return SZ_ERROR_MEM; - p->btBuf = p->hashBuf + kHashBufferSize; - } - keepAddBufferBefore += (kHashBufferSize + kBtBufferSize); - keepAddBufferAfter += kMtHashBlockSize; - if (!MatchFinder_Create(mf, historySize, keepAddBufferBefore, matchMaxLen, keepAddBufferAfter, alloc)) - return SZ_ERROR_MEM; - - RINOK(MtSync_Create(&p->hashSync, HashThreadFunc2, p, kMtHashNumBlocks)); - RINOK(MtSync_Create(&p->btSync, BtThreadFunc2, p, kMtBtNumBlocks)); - return SZ_OK; -} - -/* Call it after ReleaseStream / SetStream */ -static void MatchFinderMt_Init(CMatchFinderMt *p) -{ - CMatchFinder *mf = p->MatchFinder; - - p->btBufPos = - p->btBufPosLimit = 0; - p->hashBufPos = - p->hashBufPosLimit = 0; - - /* Init without data reading. We don't want to read data in this thread */ - MatchFinder_Init_3(mf, False); - MatchFinder_Init_LowHash(mf); - - p->pointerToCurPos = Inline_MatchFinder_GetPointerToCurrentPos(mf); - p->btNumAvailBytes = 0; - p->lzPos = p->historySize + 1; - - p->hash = mf->hash; - p->fixedHashSize = mf->fixedHashSize; - // p->hash4Mask = mf->hash4Mask; - p->crc = mf->crc; - - p->son = mf->son; - p->matchMaxLen = mf->matchMaxLen; - p->numHashBytes = mf->numHashBytes; - p->pos = mf->pos; - p->buffer = mf->buffer; - p->cyclicBufferPos = mf->cyclicBufferPos; - p->cyclicBufferSize = mf->cyclicBufferSize; - p->cutValue = mf->cutValue; -} - -/* ReleaseStream is required to finish multithreading */ -void MatchFinderMt_ReleaseStream(CMatchFinderMt *p) -{ - MtSync_StopWriting(&p->btSync); - /* p->MatchFinder->ReleaseStream(); */ -} - - -MY_NO_INLINE -static void MatchFinderMt_GetNextBlock_Bt(CMatchFinderMt *p) -{ - UInt32 blockIndex, k; - - MtSync_GetNextBlock(&p->btSync); - - blockIndex = ((p->btSync.numProcessedBlocks - 1) & kMtBtNumBlocksMask); - k = blockIndex * kMtBtBlockSize; - p->btBufPosLimit = k + p->btBuf[k]; - p->btNumAvailBytes = p->btBuf[k + 1]; - p->btBufPos = k + 2; - if (p->lzPos >= kMtMaxValForNormalize - kMtBtBlockSize) - { - MatchFinder_Normalize3(p->lzPos - p->historySize - 1, p->hash, p->fixedHashSize); - p->lzPos = p->historySize + 1; - } -} - -static const Byte * MatchFinderMt_GetPointerToCurrentPos(CMatchFinderMt *p) -{ - return p->pointerToCurPos; -} - -#define GET_NEXT_BLOCK_IF_REQUIRED if (p->btBufPos == p->btBufPosLimit) MatchFinderMt_GetNextBlock_Bt(p); - -static UInt32 MatchFinderMt_GetNumAvailableBytes(CMatchFinderMt *p) -{ - GET_NEXT_BLOCK_IF_REQUIRED; - return p->btNumAvailBytes; -} - -static UInt32 * MixMatches2(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *d) -{ - UInt32 h2, c2; - UInt32 *hash = p->hash; - const Byte *cur = p->pointerToCurPos; - UInt32 m = p->lzPos; - MT_HASH2_CALC - - c2 = hash[h2]; - hash[h2] = m; - - if (c2 >= matchMinPos) - if (cur[(ptrdiff_t)c2 - (ptrdiff_t)m] == cur[0]) - { - *d++ = 2; - *d++ = m - c2 - 1; - } - - return d; -} - -static UInt32 * MixMatches3(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *d) -{ - UInt32 h2, h3, c2, c3; - UInt32 *hash = p->hash; - const Byte *cur = p->pointerToCurPos; - UInt32 m = p->lzPos; - MT_HASH3_CALC - - c2 = hash[h2]; - c3 = (hash + kFix3HashSize)[h3]; - - hash[h2] = m; - (hash + kFix3HashSize)[h3] = m; - - if (c2 >= matchMinPos && cur[(ptrdiff_t)c2 - (ptrdiff_t)m] == cur[0]) - { - d[1] = m - c2 - 1; - if (cur[(ptrdiff_t)c2 - (ptrdiff_t)m + 2] == cur[2]) - { - d[0] = 3; - return d + 2; - } - d[0] = 2; - d += 2; - } - - if (c3 >= matchMinPos && cur[(ptrdiff_t)c3 - (ptrdiff_t)m] == cur[0]) - { - *d++ = 3; - *d++ = m - c3 - 1; - } - - return d; -} - - -#define INCREASE_LZ_POS p->lzPos++; p->pointerToCurPos++; - -/* -static -UInt32 MatchFinderMt_GetMatches_Bt4(CMatchFinderMt *p, UInt32 *d) -{ - UInt32 pos = p->btBufPos; - const UInt32 *bt = p->btBuf + pos; - UInt32 len = *bt++; - UInt32 matchMinPos; - const UInt32 *d_base = d; - UInt32 avail = p->btNumAvailBytes - 1; - p->btBufPos = pos + 1 + len; - - { - UInt32 temp1 = p->historySize; - p->btNumAvailBytes = avail; - - #define BT_HASH_BYTES_MAX 5 - - if (len != 0) - temp1 = bt[1]; - else if (avail < (BT_HASH_BYTES_MAX - 2)) - { - INCREASE_LZ_POS - return 0; - } - matchMinPos = p->lzPos - temp1; - } - - for (;;) - { - - UInt32 h2, h3, c2, c3; - UInt32 *hash = p->hash; - const Byte *cur = p->pointerToCurPos; - UInt32 m = p->lzPos; - MT_HASH3_CALC - - c2 = hash[h2]; - c3 = (hash + kFix3HashSize)[h3]; - - hash[h2] = m; - (hash + kFix3HashSize)[h3] = m; - - if (c2 >= matchMinPos && cur[(ptrdiff_t)c2 - (ptrdiff_t)m] == cur[0]) - { - d[1] = m - c2 - 1; - if (cur[(ptrdiff_t)c2 - (ptrdiff_t)m + 2] == cur[2]) - { - d[0] = 3; - d += 2; - break; - } - // else - { - d[0] = 2; - d += 2; - } - } - if (c3 >= matchMinPos && cur[(ptrdiff_t)c3 - (ptrdiff_t)m] == cur[0]) - { - *d++ = 3; - *d++ = m - c3 - 1; - } - break; - } - - if (len != 0) - { - do - { - UInt32 v0 = bt[0]; - UInt32 v1 = bt[1]; - bt += 2; - d[0] = v0; - d[1] = v1; - d += 2; - } - while ((len -= 2) != 0); - } - INCREASE_LZ_POS - return (UInt32)(d - d_base); -} -*/ - - -static UInt32 *MixMatches4(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *d) -{ - UInt32 h2, h3, /* h4, */ c2, c3 /* , c4 */; - UInt32 *hash = p->hash; - const Byte *cur = p->pointerToCurPos; - UInt32 m = p->lzPos; - MT_HASH3_CALC - // MT_HASH4_CALC - c2 = hash[h2]; - c3 = (hash + kFix3HashSize)[h3]; - // c4 = (hash + kFix4HashSize)[h4]; - - hash[h2] = m; - (hash + kFix3HashSize)[h3] = m; - // (hash + kFix4HashSize)[h4] = m; - - #define _USE_H2 - - #ifdef _USE_H2 - if (c2 >= matchMinPos && cur[(ptrdiff_t)c2 - (ptrdiff_t)m] == cur[0]) - { - d[1] = m - c2 - 1; - if (cur[(ptrdiff_t)c2 - (ptrdiff_t)m + 2] == cur[2]) - { - // d[0] = (cur[(ptrdiff_t)c2 - (ptrdiff_t)m + 3] == cur[3]) ? 4 : 3; - // return d + 2; - - if (cur[(ptrdiff_t)c2 - (ptrdiff_t)m + 3] == cur[3]) - { - d[0] = 4; - return d + 2; - } - d[0] = 3; - d += 2; - - #ifdef _USE_H4 - if (c4 >= matchMinPos) - if ( - cur[(ptrdiff_t)c4 - (ptrdiff_t)m] == cur[0] && - cur[(ptrdiff_t)c4 - (ptrdiff_t)m + 3] == cur[3] - ) - { - *d++ = 4; - *d++ = m - c4 - 1; - } - #endif - return d; - } - d[0] = 2; - d += 2; - } - #endif - - if (c3 >= matchMinPos && cur[(ptrdiff_t)c3 - (ptrdiff_t)m] == cur[0]) - { - d[1] = m - c3 - 1; - if (cur[(ptrdiff_t)c3 - (ptrdiff_t)m + 3] == cur[3]) - { - d[0] = 4; - return d + 2; - } - d[0] = 3; - d += 2; - } - - #ifdef _USE_H4 - if (c4 >= matchMinPos) - if ( - cur[(ptrdiff_t)c4 - (ptrdiff_t)m] == cur[0] && - cur[(ptrdiff_t)c4 - (ptrdiff_t)m + 3] == cur[3] - ) - { - *d++ = 4; - *d++ = m - c4 - 1; - } - #endif - - return d; -} - - -static UInt32 MatchFinderMt2_GetMatches(CMatchFinderMt *p, UInt32 *d) -{ - const UInt32 *bt = p->btBuf + p->btBufPos; - UInt32 len = *bt++; - p->btBufPos += 1 + len; - p->btNumAvailBytes--; - { - UInt32 i; - for (i = 0; i < len; i += 2) - { - UInt32 v0 = bt[0]; - UInt32 v1 = bt[1]; - bt += 2; - d[0] = v0; - d[1] = v1; - d += 2; - } - } - INCREASE_LZ_POS - return len; -} - - - -static UInt32 MatchFinderMt_GetMatches(CMatchFinderMt *p, UInt32 *d) -{ - UInt32 pos = p->btBufPos; - const UInt32 *bt = p->btBuf + pos; - UInt32 len = *bt++; - UInt32 avail = p->btNumAvailBytes - 1; - p->btNumAvailBytes = avail; - p->btBufPos = pos + 1 + len; - if (len == 0) - { - #define BT_HASH_BYTES_MAX 5 - if (avail >= (BT_HASH_BYTES_MAX - 1) - 1) - len = (UInt32)(p->MixMatchesFunc(p, p->lzPos - p->historySize, d) - d); - } - else - { - /* - first match pair from BinTree: (match_len, match_dist), - (match_len >= numHashBytes). - MixMatchesFunc() inserts only hash matches that are nearer than (match_dist) - */ - UInt32 *d2; - d2 = p->MixMatchesFunc(p, p->lzPos - bt[1], d); - do - { - UInt32 v0 = bt[0]; - UInt32 v1 = bt[1]; - bt += 2; - d2[0] = v0; - d2[1] = v1; - d2 += 2; - } - while ((len -= 2) != 0); - len = (UInt32)(d2 - d); - } - INCREASE_LZ_POS - return len; -} - -#define SKIP_HEADER2_MT do { GET_NEXT_BLOCK_IF_REQUIRED -#define SKIP_HEADER_MT(n) SKIP_HEADER2_MT if (p->btNumAvailBytes-- >= (n)) { const Byte *cur = p->pointerToCurPos; UInt32 *hash = p->hash; -#define SKIP_FOOTER_MT } INCREASE_LZ_POS p->btBufPos += p->btBuf[p->btBufPos] + 1; } while (--num != 0); - -static void MatchFinderMt0_Skip(CMatchFinderMt *p, UInt32 num) -{ - SKIP_HEADER2_MT { p->btNumAvailBytes--; - SKIP_FOOTER_MT -} - -static void MatchFinderMt2_Skip(CMatchFinderMt *p, UInt32 num) -{ - SKIP_HEADER_MT(2) - UInt32 h2; - MT_HASH2_CALC - hash[h2] = p->lzPos; - SKIP_FOOTER_MT -} - -static void MatchFinderMt3_Skip(CMatchFinderMt *p, UInt32 num) -{ - SKIP_HEADER_MT(3) - UInt32 h2, h3; - MT_HASH3_CALC - (hash + kFix3HashSize)[h3] = - hash[ h2] = - p->lzPos; - SKIP_FOOTER_MT -} - -static void MatchFinderMt4_Skip(CMatchFinderMt *p, UInt32 num) -{ - SKIP_HEADER_MT(4) - UInt32 h2, h3 /*, h4 */; - MT_HASH3_CALC - // MT_HASH4_CALC - // (hash + kFix4HashSize)[h4] = - (hash + kFix3HashSize)[h3] = - hash[ h2] = - p->lzPos; - SKIP_FOOTER_MT -} - -void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder *vTable) -{ - vTable->Init = (Mf_Init_Func)MatchFinderMt_Init; - vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinderMt_GetNumAvailableBytes; - vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinderMt_GetPointerToCurrentPos; - vTable->GetMatches = (Mf_GetMatches_Func)MatchFinderMt_GetMatches; - - switch (p->MatchFinder->numHashBytes) - { - case 2: - p->GetHeadsFunc = GetHeads2; - p->MixMatchesFunc = (Mf_Mix_Matches)NULL; - vTable->Skip = (Mf_Skip_Func)MatchFinderMt0_Skip; - vTable->GetMatches = (Mf_GetMatches_Func)MatchFinderMt2_GetMatches; - break; - case 3: - p->GetHeadsFunc = p->MatchFinder->bigHash ? GetHeads3b : GetHeads3; - p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches2; - vTable->Skip = (Mf_Skip_Func)MatchFinderMt2_Skip; - break; - case 4: - p->GetHeadsFunc = p->MatchFinder->bigHash ? GetHeads4b : GetHeads4; - - // it's fast inline version of GetMatches() - // vTable->GetMatches = (Mf_GetMatches_Func)MatchFinderMt_GetMatches_Bt4; - - p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches3; - vTable->Skip = (Mf_Skip_Func)MatchFinderMt3_Skip; - break; - default: - p->GetHeadsFunc = p->MatchFinder->bigHash ? GetHeads5b : GetHeads5; - p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches4; - vTable->Skip = (Mf_Skip_Func)MatchFinderMt4_Skip; - break; - } -} +/* LzFindMt.c -- multithreaded Match finder for LZ algorithms +2021-12-21 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +// #include + +#include "CpuArch.h" + +#include "LzHash.h" +#include "LzFindMt.h" + +// #define LOG_ITERS + +// #define LOG_THREAD + +#ifdef LOG_THREAD +#include +#define PRF(x) x +#else +#define PRF(x) +#endif + +#ifdef LOG_ITERS +#include +extern UInt64 g_NumIters_Tree; +extern UInt64 g_NumIters_Loop; +extern UInt64 g_NumIters_Bytes; +#define LOG_ITER(x) x +#else +#define LOG_ITER(x) +#endif + +#define kMtHashBlockSize ((UInt32)1 << 17) +#define kMtHashNumBlocks (1 << 1) + +#define GET_HASH_BLOCK_OFFSET(i) (((i) & (kMtHashNumBlocks - 1)) * kMtHashBlockSize) + +#define kMtBtBlockSize ((UInt32)1 << 16) +#define kMtBtNumBlocks (1 << 4) + +#define GET_BT_BLOCK_OFFSET(i) (((i) & (kMtBtNumBlocks - 1)) * (size_t)kMtBtBlockSize) + +/* + HASH functions: + We use raw 8/16 bits from a[1] and a[2], + xored with crc(a[0]) and crc(a[3]). + We check a[0], a[3] only. We don't need to compare a[1] and a[2] in matches. + our crc() function provides one-to-one correspondence for low 8-bit values: + (crc[0...0xFF] & 0xFF) <-> [0...0xFF] +*/ + +#define MF(mt) ((mt)->MatchFinder) +#define MF_CRC (p->crc) + +// #define MF(mt) (&(mt)->MatchFinder) +// #define MF_CRC (p->MatchFinder.crc) + +#define MT_HASH2_CALC \ + h2 = (MF_CRC[cur[0]] ^ cur[1]) & (kHash2Size - 1); + +#define MT_HASH3_CALC { \ + UInt32 temp = MF_CRC[cur[0]] ^ cur[1]; \ + h2 = temp & (kHash2Size - 1); \ + h3 = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); } + +/* +#define MT_HASH3_CALC__NO_2 { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + h3 = (temp ^ ((UInt32)cur[2] << 8)) & (kHash3Size - 1); } + +#define __MT_HASH4_CALC { \ + UInt32 temp = p->crc[cur[0]] ^ cur[1]; \ + h2 = temp & (kHash2Size - 1); \ + temp ^= ((UInt32)cur[2] << 8); \ + h3 = temp & (kHash3Size - 1); \ + h4 = (temp ^ (p->crc[cur[3]] << kLzHash_CrcShift_1)) & p->hash4Mask; } + // (kHash4Size - 1); +*/ + + +MY_NO_INLINE +static void MtSync_Construct(CMtSync *p) +{ + p->affinity = 0; + p->wasCreated = False; + p->csWasInitialized = False; + p->csWasEntered = False; + Thread_Construct(&p->thread); + Event_Construct(&p->canStart); + Event_Construct(&p->wasStopped); + Semaphore_Construct(&p->freeSemaphore); + Semaphore_Construct(&p->filledSemaphore); +} + + +#define DEBUG_BUFFER_LOCK // define it to debug lock state + +#ifdef DEBUG_BUFFER_LOCK +#include +#define BUFFER_MUST_BE_LOCKED(p) if (!(p)->csWasEntered) exit(1); +#define BUFFER_MUST_BE_UNLOCKED(p) if ( (p)->csWasEntered) exit(1); +#else +#define BUFFER_MUST_BE_LOCKED(p) +#define BUFFER_MUST_BE_UNLOCKED(p) +#endif + +#define LOCK_BUFFER(p) { \ + BUFFER_MUST_BE_UNLOCKED(p); \ + CriticalSection_Enter(&(p)->cs); \ + (p)->csWasEntered = True; } + +#define UNLOCK_BUFFER(p) { \ + BUFFER_MUST_BE_LOCKED(p); \ + CriticalSection_Leave(&(p)->cs); \ + (p)->csWasEntered = False; } + + +MY_NO_INLINE +static UInt32 MtSync_GetNextBlock(CMtSync *p) +{ + UInt32 numBlocks = 0; + if (p->needStart) + { + BUFFER_MUST_BE_UNLOCKED(p) + p->numProcessedBlocks = 1; + p->needStart = False; + p->stopWriting = False; + p->exit = False; + Event_Reset(&p->wasStopped); + Event_Set(&p->canStart); + } + else + { + UNLOCK_BUFFER(p) + // we free current block + numBlocks = p->numProcessedBlocks++; + Semaphore_Release1(&p->freeSemaphore); + } + + // buffer is UNLOCKED here + Semaphore_Wait(&p->filledSemaphore); + LOCK_BUFFER(p); + return numBlocks; +} + + +/* if Writing (Processing) thread was started, we must call MtSync_StopWriting() */ + +MY_NO_INLINE +static void MtSync_StopWriting(CMtSync *p) +{ + if (!Thread_WasCreated(&p->thread) || p->needStart) + return; + + PRF(printf("\nMtSync_StopWriting %p\n", p)); + + if (p->csWasEntered) + { + /* we don't use buffer in this thread after StopWriting(). + So we UNLOCK buffer. + And we restore default UNLOCKED state for stopped thread */ + UNLOCK_BUFFER(p) + } + + /* We send (p->stopWriting) message and release freeSemaphore + to free current block. + So the thread will see (p->stopWriting) at some + iteration after Wait(freeSemaphore). + The thread doesn't need to fill all avail free blocks, + so we can get fast thread stop. + */ + + p->stopWriting = True; + Semaphore_Release1(&p->freeSemaphore); // check semaphore count !!! + + PRF(printf("\nMtSync_StopWriting %p : Event_Wait(&p->wasStopped)\n", p)); + Event_Wait(&p->wasStopped); + PRF(printf("\nMtSync_StopWriting %p : Event_Wait() finsihed\n", p)); + + /* 21.03 : we don't restore samaphore counters here. + We will recreate and reinit samaphores in next start */ + + p->needStart = True; +} + + +MY_NO_INLINE +static void MtSync_Destruct(CMtSync *p) +{ + PRF(printf("\nMtSync_Destruct %p\n", p)); + + if (Thread_WasCreated(&p->thread)) + { + /* we want thread to be in Stopped state before sending EXIT command. + note: stop(btSync) will stop (htSync) also */ + MtSync_StopWriting(p); + /* thread in Stopped state here : (p->needStart == true) */ + p->exit = True; + // if (p->needStart) // it's (true) + Event_Set(&p->canStart); // we send EXIT command to thread + Thread_Wait_Close(&p->thread); // we wait thread finishing + } + + if (p->csWasInitialized) + { + CriticalSection_Delete(&p->cs); + p->csWasInitialized = False; + } + p->csWasEntered = False; + + Event_Close(&p->canStart); + Event_Close(&p->wasStopped); + Semaphore_Close(&p->freeSemaphore); + Semaphore_Close(&p->filledSemaphore); + + p->wasCreated = False; +} + + +// #define RINOK_THREAD(x) { if ((x) != 0) return SZ_ERROR_THREAD; } +// we want to get real system error codes here instead of SZ_ERROR_THREAD +#define RINOK_THREAD(x) RINOK(x) + + +// call it before each new file (when new starting is required): +MY_NO_INLINE +static SRes MtSync_Init(CMtSync *p, UInt32 numBlocks) +{ + WRes wres; + // BUFFER_MUST_BE_UNLOCKED(p) + if (!p->needStart || p->csWasEntered) + return SZ_ERROR_FAIL; + wres = Semaphore_OptCreateInit(&p->freeSemaphore, numBlocks, numBlocks); + if (wres == 0) + wres = Semaphore_OptCreateInit(&p->filledSemaphore, 0, numBlocks); + return MY_SRes_HRESULT_FROM_WRes(wres); +} + + +static WRes MtSync_Create_WRes(CMtSync *p, THREAD_FUNC_TYPE startAddress, void *obj) +{ + WRes wres; + + if (p->wasCreated) + return SZ_OK; + + RINOK_THREAD(CriticalSection_Init(&p->cs)); + p->csWasInitialized = True; + p->csWasEntered = False; + + RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->canStart)); + RINOK_THREAD(AutoResetEvent_CreateNotSignaled(&p->wasStopped)); + + p->needStart = True; + p->exit = True; /* p->exit is unused before (canStart) Event. + But in case of some unexpected code failure we will get fast exit from thread */ + + // return ERROR_TOO_MANY_POSTS; // for debug + // return EINVAL; // for debug + + if (p->affinity != 0) + wres = Thread_Create_With_Affinity(&p->thread, startAddress, obj, (CAffinityMask)p->affinity); + else + wres = Thread_Create(&p->thread, startAddress, obj); + + RINOK_THREAD(wres); + p->wasCreated = True; + return SZ_OK; +} + + +MY_NO_INLINE +static SRes MtSync_Create(CMtSync *p, THREAD_FUNC_TYPE startAddress, void *obj) +{ + const WRes wres = MtSync_Create_WRes(p, startAddress, obj); + if (wres == 0) + return 0; + MtSync_Destruct(p); + return MY_SRes_HRESULT_FROM_WRes(wres); +} + + +// ---------- HASH THREAD ---------- + +#define kMtMaxValForNormalize 0xFFFFFFFF +// #define kMtMaxValForNormalize ((1 << 21)) // for debug +// #define kNormalizeAlign (1 << 7) // alignment for speculated accesses + +#ifdef MY_CPU_LE_UNALIGN + #define GetUi24hi_from32(p) ((UInt32)GetUi32(p) >> 8) +#else + #define GetUi24hi_from32(p) ((p)[1] ^ ((UInt32)(p)[2] << 8) ^ ((UInt32)(p)[3] << 16)) +#endif + +#define GetHeads_DECL(name) \ + static void GetHeads ## name(const Byte *p, UInt32 pos, \ + UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc) + +#define GetHeads_LOOP(v) \ + for (; numHeads != 0; numHeads--) { \ + const UInt32 value = (v); \ + p++; \ + *heads++ = pos - hash[value]; \ + hash[value] = pos++; } + +#define DEF_GetHeads2(name, v, action) \ + GetHeads_DECL(name) { action \ + GetHeads_LOOP(v) } + +#define DEF_GetHeads(name, v) DEF_GetHeads2(name, v, ;) + +DEF_GetHeads2(2, GetUi16(p), UNUSED_VAR(hashMask); UNUSED_VAR(crc); ) +DEF_GetHeads(3, (crc[p[0]] ^ GetUi16(p + 1)) & hashMask) +DEF_GetHeads2(3b, GetUi16(p) ^ ((UInt32)(p)[2] << 16), UNUSED_VAR(hashMask); UNUSED_VAR(crc); ) +// BT3 is not good for crc collisions for big hashMask values. + +/* +GetHeads_DECL(3b) +{ + UNUSED_VAR(hashMask); + UNUSED_VAR(crc); + { + const Byte *pLim = p + numHeads; + if (numHeads == 0) + return; + pLim--; + while (p < pLim) + { + UInt32 v1 = GetUi32(p); + UInt32 v0 = v1 & 0xFFFFFF; + UInt32 h0, h1; + p += 2; + v1 >>= 8; + h0 = hash[v0]; hash[v0] = pos; heads[0] = pos - h0; pos++; + h1 = hash[v1]; hash[v1] = pos; heads[1] = pos - h1; pos++; + heads += 2; + } + if (p == pLim) + { + UInt32 v0 = GetUi16(p) ^ ((UInt32)(p)[2] << 16); + *heads = pos - hash[v0]; + hash[v0] = pos; + } + } +} +*/ + +/* +GetHeads_DECL(4) +{ + unsigned sh = 0; + UNUSED_VAR(crc) + while ((hashMask & 0x80000000) == 0) + { + hashMask <<= 1; + sh++; + } + GetHeads_LOOP((GetUi32(p) * 0xa54a1) >> sh) +} +#define GetHeads4b GetHeads4 +*/ + +#define USE_GetHeads_LOCAL_CRC + +#ifdef USE_GetHeads_LOCAL_CRC + +GetHeads_DECL(4) +{ + UInt32 crc0[256]; + UInt32 crc1[256]; + { + unsigned i; + for (i = 0; i < 256; i++) + { + UInt32 v = crc[i]; + crc0[i] = v & hashMask; + crc1[i] = (v << kLzHash_CrcShift_1) & hashMask; + // crc1[i] = rotlFixed(v, 8) & hashMask; + } + } + GetHeads_LOOP(crc0[p[0]] ^ crc1[p[3]] ^ (UInt32)GetUi16(p+1)) +} + +GetHeads_DECL(4b) +{ + UInt32 crc0[256]; + { + unsigned i; + for (i = 0; i < 256; i++) + crc0[i] = crc[i] & hashMask; + } + GetHeads_LOOP(crc0[p[0]] ^ GetUi24hi_from32(p)) +} + +GetHeads_DECL(5) +{ + UInt32 crc0[256]; + UInt32 crc1[256]; + UInt32 crc2[256]; + { + unsigned i; + for (i = 0; i < 256; i++) + { + UInt32 v = crc[i]; + crc0[i] = v & hashMask; + crc1[i] = (v << kLzHash_CrcShift_1) & hashMask; + crc2[i] = (v << kLzHash_CrcShift_2) & hashMask; + } + } + GetHeads_LOOP(crc0[p[0]] ^ crc1[p[3]] ^ crc2[p[4]] ^ (UInt32)GetUi16(p+1)) +} + +GetHeads_DECL(5b) +{ + UInt32 crc0[256]; + UInt32 crc1[256]; + { + unsigned i; + for (i = 0; i < 256; i++) + { + UInt32 v = crc[i]; + crc0[i] = v & hashMask; + crc1[i] = (v << kLzHash_CrcShift_1) & hashMask; + } + } + GetHeads_LOOP(crc0[p[0]] ^ crc1[p[4]] ^ GetUi24hi_from32(p)) +} + +#else + +DEF_GetHeads(4, (crc[p[0]] ^ (crc[p[3]] << kLzHash_CrcShift_1) ^ (UInt32)GetUi16(p+1)) & hashMask) +DEF_GetHeads(4b, (crc[p[0]] ^ GetUi24hi_from32(p)) & hashMask) +DEF_GetHeads(5, (crc[p[0]] ^ (crc[p[3]] << kLzHash_CrcShift_1) ^ (crc[p[4]] << kLzHash_CrcShift_2) ^ (UInt32)GetUi16(p + 1)) & hashMask) +DEF_GetHeads(5b, (crc[p[0]] ^ (crc[p[4]] << kLzHash_CrcShift_1) ^ GetUi24hi_from32(p)) & hashMask) + +#endif + + +static void HashThreadFunc(CMatchFinderMt *mt) +{ + CMtSync *p = &mt->hashSync; + PRF(printf("\nHashThreadFunc\n")); + + for (;;) + { + UInt32 blockIndex = 0; + PRF(printf("\nHashThreadFunc : Event_Wait(&p->canStart)\n")); + Event_Wait(&p->canStart); + PRF(printf("\nHashThreadFunc : Event_Wait(&p->canStart) : after \n")); + if (p->exit) + { + PRF(printf("\nHashThreadFunc : exit \n")); + return; + } + + MatchFinder_Init_HighHash(MF(mt)); + + for (;;) + { + PRF(printf("Hash thread block = %d pos = %d\n", (unsigned)blockIndex, mt->MatchFinder->pos)); + + { + CMatchFinder *mf = MF(mt); + if (MatchFinder_NeedMove(mf)) + { + CriticalSection_Enter(&mt->btSync.cs); + CriticalSection_Enter(&mt->hashSync.cs); + { + const Byte *beforePtr = Inline_MatchFinder_GetPointerToCurrentPos(mf); + ptrdiff_t offset; + MatchFinder_MoveBlock(mf); + offset = beforePtr - Inline_MatchFinder_GetPointerToCurrentPos(mf); + mt->pointerToCurPos -= offset; + mt->buffer -= offset; + } + CriticalSection_Leave(&mt->hashSync.cs); + CriticalSection_Leave(&mt->btSync.cs); + continue; + } + + Semaphore_Wait(&p->freeSemaphore); + + if (p->exit) // exit is unexpected here. But we check it here for some failure case + return; + + // for faster stop : we check (p->stopWriting) after Wait(freeSemaphore) + if (p->stopWriting) + break; + + MatchFinder_ReadIfRequired(mf); + { + UInt32 *heads = mt->hashBuf + GET_HASH_BLOCK_OFFSET(blockIndex++); + UInt32 num = Inline_MatchFinder_GetNumAvailableBytes(mf); + heads[0] = 2; + heads[1] = num; + + /* heads[1] contains the number of avail bytes: + if (avail < mf->numHashBytes) : + { + it means that stream was finished + HASH_THREAD and BT_TREAD must move position for heads[1] (avail) bytes. + HASH_THREAD doesn't stop, + HASH_THREAD fills only the header (2 numbers) for all next blocks: + {2, NumHashBytes - 1}, {2,0}, {2,0}, ... , {2,0} + } + else + { + HASH_THREAD and BT_TREAD must move position for (heads[0] - 2) bytes; + } + */ + + if (num >= mf->numHashBytes) + { + num = num - mf->numHashBytes + 1; + if (num > kMtHashBlockSize - 2) + num = kMtHashBlockSize - 2; + + if (mf->pos > (UInt32)kMtMaxValForNormalize - num) + { + const UInt32 subValue = (mf->pos - mf->historySize - 1); // & ~(UInt32)(kNormalizeAlign - 1); + Inline_MatchFinder_ReduceOffsets(mf, subValue); + MatchFinder_Normalize3(subValue, mf->hash + mf->fixedHashSize, (size_t)mf->hashMask + 1); + } + + heads[0] = 2 + num; + mt->GetHeadsFunc(mf->buffer, mf->pos, mf->hash + mf->fixedHashSize, mf->hashMask, heads + 2, num, mf->crc); + } + + mf->pos += num; // wrap over zero is allowed at the end of stream + mf->buffer += num; + } + } + + Semaphore_Release1(&p->filledSemaphore); + } // for() processing end + + // p->numBlocks_Sent = blockIndex; + Event_Set(&p->wasStopped); + } // for() thread end +} + + + + +// ---------- BT THREAD ---------- + +/* we use one variable instead of two (cyclicBufferPos == pos) before CyclicBuf wrap. + here we define fixed offset of (p->pos) from (p->cyclicBufferPos) */ +#define CYC_TO_POS_OFFSET 0 +// #define CYC_TO_POS_OFFSET 1 // for debug + +#define MFMT_GM_INLINE + +#ifdef MFMT_GM_INLINE + +/* + we use size_t for (pos) instead of UInt32 + to eliminate "movsx" BUG in old MSVC x64 compiler. +*/ + + +UInt32 * MY_FAST_CALL GetMatchesSpecN_2(const Byte *lenLimit, size_t pos, const Byte *cur, CLzRef *son, + UInt32 _cutValue, UInt32 *d, size_t _maxLen, const UInt32 *hash, const UInt32 *limit, const UInt32 *size, + size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, + UInt32 *posRes); + +#endif + + +static void BtGetMatches(CMatchFinderMt *p, UInt32 *d) +{ + UInt32 numProcessed = 0; + UInt32 curPos = 2; + + /* GetMatchesSpec() functions don't create (len = 1) + in [len, dist] match pairs, if (p->numHashBytes >= 2) + Also we suppose here that (matchMaxLen >= 2). + So the following code for (reserve) is not required + UInt32 reserve = (p->matchMaxLen * 2); + const UInt32 kNumHashBytes_Max = 5; // BT_HASH_BYTES_MAX + if (reserve < kNumHashBytes_Max - 1) + reserve = kNumHashBytes_Max - 1; + const UInt32 limit = kMtBtBlockSize - (reserve); + */ + + const UInt32 limit = kMtBtBlockSize - (p->matchMaxLen * 2); + + d[1] = p->hashNumAvail; + + if (p->failure_BT) + { + // printf("\n == 1 BtGetMatches() p->failure_BT\n"); + d[0] = 0; + // d[1] = 0; + return; + } + + while (curPos < limit) + { + if (p->hashBufPos == p->hashBufPosLimit) + { + // MatchFinderMt_GetNextBlock_Hash(p); + UInt32 avail; + { + const UInt32 bi = MtSync_GetNextBlock(&p->hashSync); + const UInt32 k = GET_HASH_BLOCK_OFFSET(bi); + const UInt32 *h = p->hashBuf + k; + avail = h[1]; + p->hashBufPosLimit = k + h[0]; + p->hashNumAvail = avail; + p->hashBufPos = k + 2; + } + + { + /* we must prevent UInt32 overflow for avail total value, + if avail was increased with new hash block */ + UInt32 availSum = numProcessed + avail; + if (availSum < numProcessed) + availSum = (UInt32)(Int32)-1; + d[1] = availSum; + } + + if (avail >= p->numHashBytes) + continue; + + // if (p->hashBufPos != p->hashBufPosLimit) exit(1); + + /* (avail < p->numHashBytes) + It means that stream was finished. + And (avail) - is a number of remaining bytes, + we fill (d) for (avail) bytes for LZ_THREAD (receiver). + but we don't update (p->pos) and (p->cyclicBufferPos) here in BT_THREAD */ + + /* here we suppose that we have space enough: + (kMtBtBlockSize - curPos >= p->hashNumAvail) */ + p->hashNumAvail = 0; + d[0] = curPos + avail; + d += curPos; + for (; avail != 0; avail--) + *d++ = 0; + return; + } + { + UInt32 size = p->hashBufPosLimit - p->hashBufPos; + UInt32 pos = p->pos; + UInt32 cyclicBufferPos = p->cyclicBufferPos; + UInt32 lenLimit = p->matchMaxLen; + if (lenLimit >= p->hashNumAvail) + lenLimit = p->hashNumAvail; + { + UInt32 size2 = p->hashNumAvail - lenLimit + 1; + if (size2 < size) + size = size2; + size2 = p->cyclicBufferSize - cyclicBufferPos; + if (size2 < size) + size = size2; + } + + if (pos > (UInt32)kMtMaxValForNormalize - size) + { + const UInt32 subValue = (pos - p->cyclicBufferSize); // & ~(UInt32)(kNormalizeAlign - 1); + pos -= subValue; + p->pos = pos; + MatchFinder_Normalize3(subValue, p->son, (size_t)p->cyclicBufferSize * 2); + } + + #ifndef MFMT_GM_INLINE + while (curPos < limit && size-- != 0) + { + UInt32 *startDistances = d + curPos; + UInt32 num = (UInt32)(GetMatchesSpec1(lenLimit, pos - p->hashBuf[p->hashBufPos++], + pos, p->buffer, p->son, cyclicBufferPos, p->cyclicBufferSize, p->cutValue, + startDistances + 1, p->numHashBytes - 1) - startDistances); + *startDistances = num - 1; + curPos += num; + cyclicBufferPos++; + pos++; + p->buffer++; + } + #else + { + UInt32 posRes = pos; + const UInt32 *d_end; + { + d_end = GetMatchesSpecN_2( + p->buffer + lenLimit - 1, + pos, p->buffer, p->son, p->cutValue, d + curPos, + p->numHashBytes - 1, p->hashBuf + p->hashBufPos, + d + limit, p->hashBuf + p->hashBufPos + size, + cyclicBufferPos, p->cyclicBufferSize, + &posRes); + } + { + if (!d_end) + { + // printf("\n == 2 BtGetMatches() p->failure_BT\n"); + // internal data failure + p->failure_BT = True; + d[0] = 0; + // d[1] = 0; + return; + } + } + curPos = (UInt32)(d_end - d); + { + const UInt32 processed = posRes - pos; + pos = posRes; + p->hashBufPos += processed; + cyclicBufferPos += processed; + p->buffer += processed; + } + } + #endif + + { + const UInt32 processed = pos - p->pos; + numProcessed += processed; + p->hashNumAvail -= processed; + p->pos = pos; + } + if (cyclicBufferPos == p->cyclicBufferSize) + cyclicBufferPos = 0; + p->cyclicBufferPos = cyclicBufferPos; + } + } + + d[0] = curPos; +} + + +static void BtFillBlock(CMatchFinderMt *p, UInt32 globalBlockIndex) +{ + CMtSync *sync = &p->hashSync; + + BUFFER_MUST_BE_UNLOCKED(sync) + + if (!sync->needStart) + { + LOCK_BUFFER(sync) + } + + BtGetMatches(p, p->btBuf + GET_BT_BLOCK_OFFSET(globalBlockIndex)); + + /* We suppose that we have called GetNextBlock() from start. + So buffer is LOCKED */ + + UNLOCK_BUFFER(sync) +} + + +MY_NO_INLINE +static void BtThreadFunc(CMatchFinderMt *mt) +{ + CMtSync *p = &mt->btSync; + for (;;) + { + UInt32 blockIndex = 0; + Event_Wait(&p->canStart); + + for (;;) + { + PRF(printf(" BT thread block = %d pos = %d\n", (unsigned)blockIndex, mt->pos)); + /* (p->exit == true) is possible after (p->canStart) at first loop iteration + and is unexpected after more Wait(freeSemaphore) iterations */ + if (p->exit) + return; + + Semaphore_Wait(&p->freeSemaphore); + + // for faster stop : we check (p->stopWriting) after Wait(freeSemaphore) + if (p->stopWriting) + break; + + BtFillBlock(mt, blockIndex++); + + Semaphore_Release1(&p->filledSemaphore); + } + + // we stop HASH_THREAD here + MtSync_StopWriting(&mt->hashSync); + + // p->numBlocks_Sent = blockIndex; + Event_Set(&p->wasStopped); + } +} + + +void MatchFinderMt_Construct(CMatchFinderMt *p) +{ + p->hashBuf = NULL; + MtSync_Construct(&p->hashSync); + MtSync_Construct(&p->btSync); +} + +static void MatchFinderMt_FreeMem(CMatchFinderMt *p, ISzAllocPtr alloc) +{ + ISzAlloc_Free(alloc, p->hashBuf); + p->hashBuf = NULL; +} + +void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAllocPtr alloc) +{ + /* + HASH_THREAD can use CriticalSection(s) btSync.cs and hashSync.cs. + So we must be sure that HASH_THREAD will not use CriticalSection(s) + after deleting CriticalSection here. + + we call ReleaseStream(p) + that calls StopWriting(btSync) + that calls StopWriting(hashSync), if it's required to stop HASH_THREAD. + after StopWriting() it's safe to destruct MtSync(s) in any order */ + + MatchFinderMt_ReleaseStream(p); + + MtSync_Destruct(&p->btSync); + MtSync_Destruct(&p->hashSync); + + LOG_ITER( + printf("\nTree %9d * %7d iter = %9d = sum : bytes = %9d\n", + (UInt32)(g_NumIters_Tree / 1000), + (UInt32)(((UInt64)g_NumIters_Loop * 1000) / (g_NumIters_Tree + 1)), + (UInt32)(g_NumIters_Loop / 1000), + (UInt32)(g_NumIters_Bytes / 1000) + )); + + MatchFinderMt_FreeMem(p, alloc); +} + + +#define kHashBufferSize (kMtHashBlockSize * kMtHashNumBlocks) +#define kBtBufferSize (kMtBtBlockSize * kMtBtNumBlocks) + + +static THREAD_FUNC_DECL HashThreadFunc2(void *p) { HashThreadFunc((CMatchFinderMt *)p); return 0; } +static THREAD_FUNC_DECL BtThreadFunc2(void *p) +{ + Byte allocaDummy[0x180]; + unsigned i = 0; + for (i = 0; i < 16; i++) + allocaDummy[i] = (Byte)0; + if (allocaDummy[0] == 0) + BtThreadFunc((CMatchFinderMt *)p); + return 0; +} + + +SRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore, + UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAllocPtr alloc) +{ + CMatchFinder *mf = MF(p); + p->historySize = historySize; + if (kMtBtBlockSize <= matchMaxLen * 4) + return SZ_ERROR_PARAM; + if (!p->hashBuf) + { + p->hashBuf = (UInt32 *)ISzAlloc_Alloc(alloc, ((size_t)kHashBufferSize + (size_t)kBtBufferSize) * sizeof(UInt32)); + if (!p->hashBuf) + return SZ_ERROR_MEM; + p->btBuf = p->hashBuf + kHashBufferSize; + } + keepAddBufferBefore += (kHashBufferSize + kBtBufferSize); + keepAddBufferAfter += kMtHashBlockSize; + if (!MatchFinder_Create(mf, historySize, keepAddBufferBefore, matchMaxLen, keepAddBufferAfter, alloc)) + return SZ_ERROR_MEM; + + RINOK(MtSync_Create(&p->hashSync, HashThreadFunc2, p)); + RINOK(MtSync_Create(&p->btSync, BtThreadFunc2, p)); + return SZ_OK; +} + + +SRes MatchFinderMt_InitMt(CMatchFinderMt *p) +{ + RINOK(MtSync_Init(&p->hashSync, kMtHashNumBlocks)); + return MtSync_Init(&p->btSync, kMtBtNumBlocks); +} + + +static void MatchFinderMt_Init(CMatchFinderMt *p) +{ + CMatchFinder *mf = MF(p); + + p->btBufPos = + p->btBufPosLimit = NULL; + p->hashBufPos = + p->hashBufPosLimit = 0; + p->hashNumAvail = 0; // 21.03 + + p->failure_BT = False; + + /* Init without data reading. We don't want to read data in this thread */ + MatchFinder_Init_4(mf); + + MatchFinder_Init_LowHash(mf); + + p->pointerToCurPos = Inline_MatchFinder_GetPointerToCurrentPos(mf); + p->btNumAvailBytes = 0; + p->failure_LZ_BT = False; + // p->failure_LZ_LZ = False; + + p->lzPos = + 1; // optimal smallest value + // 0; // for debug: ignores match to start + // kNormalizeAlign; // for debug + + p->hash = mf->hash; + p->fixedHashSize = mf->fixedHashSize; + // p->hash4Mask = mf->hash4Mask; + p->crc = mf->crc; + // memcpy(p->crc, mf->crc, sizeof(mf->crc)); + + p->son = mf->son; + p->matchMaxLen = mf->matchMaxLen; + p->numHashBytes = mf->numHashBytes; + + /* (mf->pos) and (mf->streamPos) were already initialized to 1 in MatchFinder_Init_4() */ + // mf->streamPos = mf->pos = 1; // optimal smallest value + // 0; // for debug: ignores match to start + // kNormalizeAlign; // for debug + + /* we must init (p->pos = mf->pos) for BT, because + BT code needs (p->pos == delta_value_for_empty_hash_record == mf->pos) */ + p->pos = mf->pos; // do not change it + + p->cyclicBufferPos = (p->pos - CYC_TO_POS_OFFSET); + p->cyclicBufferSize = mf->cyclicBufferSize; + p->buffer = mf->buffer; + p->cutValue = mf->cutValue; + // p->son[0] = p->son[1] = 0; // unused: to init skipped record for speculated accesses. +} + + +/* ReleaseStream is required to finish multithreading */ +void MatchFinderMt_ReleaseStream(CMatchFinderMt *p) +{ + // Sleep(1); // for debug + MtSync_StopWriting(&p->btSync); + // Sleep(200); // for debug + /* p->MatchFinder->ReleaseStream(); */ +} + + +MY_NO_INLINE +static UInt32 MatchFinderMt_GetNextBlock_Bt(CMatchFinderMt *p) +{ + if (p->failure_LZ_BT) + p->btBufPos = p->failureBuf; + else + { + const UInt32 bi = MtSync_GetNextBlock(&p->btSync); + const UInt32 *bt = p->btBuf + GET_BT_BLOCK_OFFSET(bi); + { + const UInt32 numItems = bt[0]; + p->btBufPosLimit = bt + numItems; + p->btNumAvailBytes = bt[1]; + p->btBufPos = bt + 2; + if (numItems < 2 || numItems > kMtBtBlockSize) + { + p->failureBuf[0] = 0; + p->btBufPos = p->failureBuf; + p->btBufPosLimit = p->failureBuf + 1; + p->failure_LZ_BT = True; + // p->btNumAvailBytes = 0; + /* we don't want to decrease AvailBytes, that was load before. + that can be unxepected for the code that have loaded anopther value before */ + } + } + + if (p->lzPos >= (UInt32)kMtMaxValForNormalize - (UInt32)kMtBtBlockSize) + { + /* we don't check (lzPos) over exact avail bytes in (btBuf). + (fixedHashSize) is small, so normalization is fast */ + const UInt32 subValue = (p->lzPos - p->historySize - 1); // & ~(UInt32)(kNormalizeAlign - 1); + p->lzPos -= subValue; + MatchFinder_Normalize3(subValue, p->hash, p->fixedHashSize); + } + } + return p->btNumAvailBytes; +} + + + +static const Byte * MatchFinderMt_GetPointerToCurrentPos(CMatchFinderMt *p) +{ + return p->pointerToCurPos; +} + + +#define GET_NEXT_BLOCK_IF_REQUIRED if (p->btBufPos == p->btBufPosLimit) MatchFinderMt_GetNextBlock_Bt(p); + + +static UInt32 MatchFinderMt_GetNumAvailableBytes(CMatchFinderMt *p) +{ + if (p->btBufPos != p->btBufPosLimit) + return p->btNumAvailBytes; + return MatchFinderMt_GetNextBlock_Bt(p); +} + + +// #define CHECK_FAILURE_LZ(_match_, _pos_) if (_match_ >= _pos_) { p->failure_LZ_LZ = True; return d; } +#define CHECK_FAILURE_LZ(_match_, _pos_) + +static UInt32 * MixMatches2(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *d) +{ + UInt32 h2, c2; + UInt32 *hash = p->hash; + const Byte *cur = p->pointerToCurPos; + const UInt32 m = p->lzPos; + MT_HASH2_CALC + + c2 = hash[h2]; + hash[h2] = m; + + if (c2 >= matchMinPos) + { + CHECK_FAILURE_LZ(c2, m) + if (cur[(ptrdiff_t)c2 - (ptrdiff_t)m] == cur[0]) + { + *d++ = 2; + *d++ = m - c2 - 1; + } + } + + return d; +} + +static UInt32 * MixMatches3(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *d) +{ + UInt32 h2, h3, c2, c3; + UInt32 *hash = p->hash; + const Byte *cur = p->pointerToCurPos; + const UInt32 m = p->lzPos; + MT_HASH3_CALC + + c2 = hash[h2]; + c3 = (hash + kFix3HashSize)[h3]; + + hash[h2] = m; + (hash + kFix3HashSize)[h3] = m; + + if (c2 >= matchMinPos) + { + CHECK_FAILURE_LZ(c2, m) + if (cur[(ptrdiff_t)c2 - (ptrdiff_t)m] == cur[0]) + { + d[1] = m - c2 - 1; + if (cur[(ptrdiff_t)c2 - (ptrdiff_t)m + 2] == cur[2]) + { + d[0] = 3; + return d + 2; + } + d[0] = 2; + d += 2; + } + } + + if (c3 >= matchMinPos) + { + CHECK_FAILURE_LZ(c3, m) + if (cur[(ptrdiff_t)c3 - (ptrdiff_t)m] == cur[0]) + { + *d++ = 3; + *d++ = m - c3 - 1; + } + } + + return d; +} + + +#define INCREASE_LZ_POS p->lzPos++; p->pointerToCurPos++; + +/* +static +UInt32* MatchFinderMt_GetMatches_Bt4(CMatchFinderMt *p, UInt32 *d) +{ + const UInt32 *bt = p->btBufPos; + const UInt32 len = *bt++; + const UInt32 *btLim = bt + len; + UInt32 matchMinPos; + UInt32 avail = p->btNumAvailBytes - 1; + p->btBufPos = btLim; + + { + p->btNumAvailBytes = avail; + + #define BT_HASH_BYTES_MAX 5 + + matchMinPos = p->lzPos; + + if (len != 0) + matchMinPos -= bt[1]; + else if (avail < (BT_HASH_BYTES_MAX - 1) - 1) + { + INCREASE_LZ_POS + return d; + } + else + { + const UInt32 hs = p->historySize; + if (matchMinPos > hs) + matchMinPos -= hs; + else + matchMinPos = 1; + } + } + + for (;;) + { + + UInt32 h2, h3, c2, c3; + UInt32 *hash = p->hash; + const Byte *cur = p->pointerToCurPos; + UInt32 m = p->lzPos; + MT_HASH3_CALC + + c2 = hash[h2]; + c3 = (hash + kFix3HashSize)[h3]; + + hash[h2] = m; + (hash + kFix3HashSize)[h3] = m; + + if (c2 >= matchMinPos && cur[(ptrdiff_t)c2 - (ptrdiff_t)m] == cur[0]) + { + d[1] = m - c2 - 1; + if (cur[(ptrdiff_t)c2 - (ptrdiff_t)m + 2] == cur[2]) + { + d[0] = 3; + d += 2; + break; + } + // else + { + d[0] = 2; + d += 2; + } + } + if (c3 >= matchMinPos && cur[(ptrdiff_t)c3 - (ptrdiff_t)m] == cur[0]) + { + *d++ = 3; + *d++ = m - c3 - 1; + } + break; + } + + if (len != 0) + { + do + { + const UInt32 v0 = bt[0]; + const UInt32 v1 = bt[1]; + bt += 2; + d[0] = v0; + d[1] = v1; + d += 2; + } + while (bt != btLim); + } + INCREASE_LZ_POS + return d; +} +*/ + + +static UInt32 *MixMatches4(CMatchFinderMt *p, UInt32 matchMinPos, UInt32 *d) +{ + UInt32 h2, h3, /* h4, */ c2, c3 /* , c4 */; + UInt32 *hash = p->hash; + const Byte *cur = p->pointerToCurPos; + const UInt32 m = p->lzPos; + MT_HASH3_CALC + // MT_HASH4_CALC + c2 = hash[h2]; + c3 = (hash + kFix3HashSize)[h3]; + // c4 = (hash + kFix4HashSize)[h4]; + + hash[h2] = m; + (hash + kFix3HashSize)[h3] = m; + // (hash + kFix4HashSize)[h4] = m; + + #define _USE_H2 + + #ifdef _USE_H2 + if (c2 >= matchMinPos && cur[(ptrdiff_t)c2 - (ptrdiff_t)m] == cur[0]) + { + d[1] = m - c2 - 1; + if (cur[(ptrdiff_t)c2 - (ptrdiff_t)m + 2] == cur[2]) + { + // d[0] = (cur[(ptrdiff_t)c2 - (ptrdiff_t)m + 3] == cur[3]) ? 4 : 3; + // return d + 2; + + if (cur[(ptrdiff_t)c2 - (ptrdiff_t)m + 3] == cur[3]) + { + d[0] = 4; + return d + 2; + } + d[0] = 3; + d += 2; + + #ifdef _USE_H4 + if (c4 >= matchMinPos) + if ( + cur[(ptrdiff_t)c4 - (ptrdiff_t)m] == cur[0] && + cur[(ptrdiff_t)c4 - (ptrdiff_t)m + 3] == cur[3] + ) + { + *d++ = 4; + *d++ = m - c4 - 1; + } + #endif + return d; + } + d[0] = 2; + d += 2; + } + #endif + + if (c3 >= matchMinPos && cur[(ptrdiff_t)c3 - (ptrdiff_t)m] == cur[0]) + { + d[1] = m - c3 - 1; + if (cur[(ptrdiff_t)c3 - (ptrdiff_t)m + 3] == cur[3]) + { + d[0] = 4; + return d + 2; + } + d[0] = 3; + d += 2; + } + + #ifdef _USE_H4 + if (c4 >= matchMinPos) + if ( + cur[(ptrdiff_t)c4 - (ptrdiff_t)m] == cur[0] && + cur[(ptrdiff_t)c4 - (ptrdiff_t)m + 3] == cur[3] + ) + { + *d++ = 4; + *d++ = m - c4 - 1; + } + #endif + + return d; +} + + +static UInt32* MatchFinderMt2_GetMatches(CMatchFinderMt *p, UInt32 *d) +{ + const UInt32 *bt = p->btBufPos; + const UInt32 len = *bt++; + const UInt32 *btLim = bt + len; + p->btBufPos = btLim; + p->btNumAvailBytes--; + INCREASE_LZ_POS + { + while (bt != btLim) + { + const UInt32 v0 = bt[0]; + const UInt32 v1 = bt[1]; + bt += 2; + d[0] = v0; + d[1] = v1; + d += 2; + } + } + return d; +} + + + +static UInt32* MatchFinderMt_GetMatches(CMatchFinderMt *p, UInt32 *d) +{ + const UInt32 *bt = p->btBufPos; + UInt32 len = *bt++; + const UInt32 avail = p->btNumAvailBytes - 1; + p->btNumAvailBytes = avail; + p->btBufPos = bt + len; + if (len == 0) + { + #define BT_HASH_BYTES_MAX 5 + if (avail >= (BT_HASH_BYTES_MAX - 1) - 1) + { + UInt32 m = p->lzPos; + if (m > p->historySize) + m -= p->historySize; + else + m = 1; + d = p->MixMatchesFunc(p, m, d); + } + } + else + { + /* + first match pair from BinTree: (match_len, match_dist), + (match_len >= numHashBytes). + MixMatchesFunc() inserts only hash matches that are nearer than (match_dist) + */ + d = p->MixMatchesFunc(p, p->lzPos - bt[1], d); + // if (d) // check for failure + do + { + const UInt32 v0 = bt[0]; + const UInt32 v1 = bt[1]; + bt += 2; + d[0] = v0; + d[1] = v1; + d += 2; + } + while (len -= 2); + } + INCREASE_LZ_POS + return d; +} + +#define SKIP_HEADER2_MT do { GET_NEXT_BLOCK_IF_REQUIRED +#define SKIP_HEADER_MT(n) SKIP_HEADER2_MT if (p->btNumAvailBytes-- >= (n)) { const Byte *cur = p->pointerToCurPos; UInt32 *hash = p->hash; +#define SKIP_FOOTER_MT } INCREASE_LZ_POS p->btBufPos += (size_t)*p->btBufPos + 1; } while (--num != 0); + +static void MatchFinderMt0_Skip(CMatchFinderMt *p, UInt32 num) +{ + SKIP_HEADER2_MT { p->btNumAvailBytes--; + SKIP_FOOTER_MT +} + +static void MatchFinderMt2_Skip(CMatchFinderMt *p, UInt32 num) +{ + SKIP_HEADER_MT(2) + UInt32 h2; + MT_HASH2_CALC + hash[h2] = p->lzPos; + SKIP_FOOTER_MT +} + +static void MatchFinderMt3_Skip(CMatchFinderMt *p, UInt32 num) +{ + SKIP_HEADER_MT(3) + UInt32 h2, h3; + MT_HASH3_CALC + (hash + kFix3HashSize)[h3] = + hash[ h2] = + p->lzPos; + SKIP_FOOTER_MT +} + +/* +// MatchFinderMt4_Skip() is similar to MatchFinderMt3_Skip(). +// The difference is that MatchFinderMt3_Skip() updates hash for last 3 bytes of stream. + +static void MatchFinderMt4_Skip(CMatchFinderMt *p, UInt32 num) +{ + SKIP_HEADER_MT(4) + UInt32 h2, h3; // h4 + MT_HASH3_CALC + // MT_HASH4_CALC + // (hash + kFix4HashSize)[h4] = + (hash + kFix3HashSize)[h3] = + hash[ h2] = + p->lzPos; + SKIP_FOOTER_MT +} +*/ + +void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder2 *vTable) +{ + vTable->Init = (Mf_Init_Func)MatchFinderMt_Init; + vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinderMt_GetNumAvailableBytes; + vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinderMt_GetPointerToCurrentPos; + vTable->GetMatches = (Mf_GetMatches_Func)MatchFinderMt_GetMatches; + + switch (MF(p)->numHashBytes) + { + case 2: + p->GetHeadsFunc = GetHeads2; + p->MixMatchesFunc = (Mf_Mix_Matches)NULL; + vTable->Skip = (Mf_Skip_Func)MatchFinderMt0_Skip; + vTable->GetMatches = (Mf_GetMatches_Func)MatchFinderMt2_GetMatches; + break; + case 3: + p->GetHeadsFunc = MF(p)->bigHash ? GetHeads3b : GetHeads3; + p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches2; + vTable->Skip = (Mf_Skip_Func)MatchFinderMt2_Skip; + break; + case 4: + p->GetHeadsFunc = MF(p)->bigHash ? GetHeads4b : GetHeads4; + + // it's fast inline version of GetMatches() + // vTable->GetMatches = (Mf_GetMatches_Func)MatchFinderMt_GetMatches_Bt4; + + p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches3; + vTable->Skip = (Mf_Skip_Func)MatchFinderMt3_Skip; + break; + default: + p->GetHeadsFunc = MF(p)->bigHash ? GetHeads5b : GetHeads5; + p->MixMatchesFunc = (Mf_Mix_Matches)MixMatches4; + vTable->Skip = + (Mf_Skip_Func)MatchFinderMt3_Skip; + // (Mf_Skip_Func)MatchFinderMt4_Skip; + break; + } +} diff --git a/deps/LZMA-SDK/C/LzFindMt.h b/deps/LZMA-SDK/C/LzFindMt.h index 888c787cb..660b7244d 100644 --- a/deps/LZMA-SDK/C/LzFindMt.h +++ b/deps/LZMA-SDK/C/LzFindMt.h @@ -1,95 +1,109 @@ -/* LzFindMt.h -- multithreaded Match finder for LZ algorithms -2019-11-05 : Igor Pavlov : Public domain */ - -#ifndef __LZ_FIND_MT_H -#define __LZ_FIND_MT_H - -#include "LzFind.h" -#include "Threads.h" - -EXTERN_C_BEGIN - -typedef struct _CMtSync -{ - BoolInt wasCreated; - BoolInt needStart; - BoolInt exit; - BoolInt stopWriting; - - CThread thread; - CAutoResetEvent canStart; - CAutoResetEvent wasStarted; - CAutoResetEvent wasStopped; - CSemaphore freeSemaphore; - CSemaphore filledSemaphore; - BoolInt csWasInitialized; - BoolInt csWasEntered; - CCriticalSection cs; - UInt32 numProcessedBlocks; - UInt64 affinity; -} CMtSync; - -typedef UInt32 * (*Mf_Mix_Matches)(void *p, UInt32 matchMinPos, UInt32 *distances); - -/* kMtCacheLineDummy must be >= size_of_CPU_cache_line */ -#define kMtCacheLineDummy 128 - -typedef void (*Mf_GetHeads)(const Byte *buffer, UInt32 pos, - UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc); - -typedef struct _CMatchFinderMt -{ - /* LZ */ - const Byte *pointerToCurPos; - UInt32 *btBuf; - UInt32 btBufPos; - UInt32 btBufPosLimit; - UInt32 lzPos; - UInt32 btNumAvailBytes; - - UInt32 *hash; - UInt32 fixedHashSize; - // UInt32 hash4Mask; - UInt32 historySize; - const UInt32 *crc; - - Mf_Mix_Matches MixMatchesFunc; - - /* LZ + BT */ - CMtSync btSync; - Byte btDummy[kMtCacheLineDummy]; - - /* BT */ - UInt32 *hashBuf; - UInt32 hashBufPos; - UInt32 hashBufPosLimit; - UInt32 hashNumAvail; - - CLzRef *son; - UInt32 matchMaxLen; - UInt32 numHashBytes; - UInt32 pos; - const Byte *buffer; - UInt32 cyclicBufferPos; - UInt32 cyclicBufferSize; /* it must be historySize + 1 */ - UInt32 cutValue; - - /* BT + Hash */ - CMtSync hashSync; - /* Byte hashDummy[kMtCacheLineDummy]; */ - - /* Hash */ - Mf_GetHeads GetHeadsFunc; - CMatchFinder *MatchFinder; -} CMatchFinderMt; - -void MatchFinderMt_Construct(CMatchFinderMt *p); -void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAllocPtr alloc); -SRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore, - UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAllocPtr alloc); -void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder *vTable); -void MatchFinderMt_ReleaseStream(CMatchFinderMt *p); - -EXTERN_C_END - -#endif +/* LzFindMt.h -- multithreaded Match finder for LZ algorithms +2021-07-12 : Igor Pavlov : Public domain */ + +#ifndef __LZ_FIND_MT_H +#define __LZ_FIND_MT_H + +#include "LzFind.h" +#include "Threads.h" + +EXTERN_C_BEGIN + +typedef struct _CMtSync +{ + UInt32 numProcessedBlocks; + CThread thread; + UInt64 affinity; + + BoolInt wasCreated; + BoolInt needStart; + BoolInt csWasInitialized; + BoolInt csWasEntered; + + BoolInt exit; + BoolInt stopWriting; + + CAutoResetEvent canStart; + CAutoResetEvent wasStopped; + CSemaphore freeSemaphore; + CSemaphore filledSemaphore; + CCriticalSection cs; + // UInt32 numBlocks_Sent; +} CMtSync; + +typedef UInt32 * (*Mf_Mix_Matches)(void *p, UInt32 matchMinPos, UInt32 *distances); + +/* kMtCacheLineDummy must be >= size_of_CPU_cache_line */ +#define kMtCacheLineDummy 128 + +typedef void (*Mf_GetHeads)(const Byte *buffer, UInt32 pos, + UInt32 *hash, UInt32 hashMask, UInt32 *heads, UInt32 numHeads, const UInt32 *crc); + +typedef struct _CMatchFinderMt +{ + /* LZ */ + const Byte *pointerToCurPos; + UInt32 *btBuf; + const UInt32 *btBufPos; + const UInt32 *btBufPosLimit; + UInt32 lzPos; + UInt32 btNumAvailBytes; + + UInt32 *hash; + UInt32 fixedHashSize; + // UInt32 hash4Mask; + UInt32 historySize; + const UInt32 *crc; + + Mf_Mix_Matches MixMatchesFunc; + UInt32 failure_LZ_BT; // failure in BT transfered to LZ + // UInt32 failure_LZ_LZ; // failure in LZ tables + UInt32 failureBuf[1]; + // UInt32 crc[256]; + + /* LZ + BT */ + CMtSync btSync; + Byte btDummy[kMtCacheLineDummy]; + + /* BT */ + UInt32 *hashBuf; + UInt32 hashBufPos; + UInt32 hashBufPosLimit; + UInt32 hashNumAvail; + UInt32 failure_BT; + + + CLzRef *son; + UInt32 matchMaxLen; + UInt32 numHashBytes; + UInt32 pos; + const Byte *buffer; + UInt32 cyclicBufferPos; + UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */ + UInt32 cutValue; + + /* BT + Hash */ + CMtSync hashSync; + /* Byte hashDummy[kMtCacheLineDummy]; */ + + /* Hash */ + Mf_GetHeads GetHeadsFunc; + CMatchFinder *MatchFinder; + // CMatchFinder MatchFinder; +} CMatchFinderMt; + +// only for Mt part +void MatchFinderMt_Construct(CMatchFinderMt *p); +void MatchFinderMt_Destruct(CMatchFinderMt *p, ISzAllocPtr alloc); + +SRes MatchFinderMt_Create(CMatchFinderMt *p, UInt32 historySize, UInt32 keepAddBufferBefore, + UInt32 matchMaxLen, UInt32 keepAddBufferAfter, ISzAllocPtr alloc); +void MatchFinderMt_CreateVTable(CMatchFinderMt *p, IMatchFinder2 *vTable); + +/* call MatchFinderMt_InitMt() before IMatchFinder::Init() */ +SRes MatchFinderMt_InitMt(CMatchFinderMt *p); +void MatchFinderMt_ReleaseStream(CMatchFinderMt *p); + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/LzFindOpt.c b/deps/LZMA-SDK/C/LzFindOpt.c new file mode 100644 index 000000000..8ff006e07 --- /dev/null +++ b/deps/LZMA-SDK/C/LzFindOpt.c @@ -0,0 +1,578 @@ +/* LzFindOpt.c -- multithreaded Match finder for LZ algorithms +2021-07-13 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "CpuArch.h" +#include "LzFind.h" + +// #include "LzFindMt.h" + +// #define LOG_ITERS + +// #define LOG_THREAD + +#ifdef LOG_THREAD +#include +#define PRF(x) x +#else +// #define PRF(x) +#endif + +#ifdef LOG_ITERS +#include +UInt64 g_NumIters_Tree; +UInt64 g_NumIters_Loop; +UInt64 g_NumIters_Bytes; +#define LOG_ITER(x) x +#else +#define LOG_ITER(x) +#endif + +// ---------- BT THREAD ---------- + +#define USE_SON_PREFETCH +#define USE_LONG_MATCH_OPT + +#define kEmptyHashValue 0 + +// #define CYC_TO_POS_OFFSET 0 + +// #define CYC_TO_POS_OFFSET 1 // for debug + +/* +MY_NO_INLINE +UInt32 * MY_FAST_CALL GetMatchesSpecN_1(const Byte *lenLimit, size_t pos, const Byte *cur, CLzRef *son, + UInt32 _cutValue, UInt32 *d, size_t _maxLen, const UInt32 *hash, const UInt32 *limit, const UInt32 *size, UInt32 *posRes) +{ + do + { + UInt32 delta; + if (hash == size) + break; + delta = *hash++; + + if (delta == 0 || delta > (UInt32)pos) + return NULL; + + lenLimit++; + + if (delta == (UInt32)pos) + { + CLzRef *ptr1 = son + ((size_t)pos << 1) - CYC_TO_POS_OFFSET * 2; + *d++ = 0; + ptr1[0] = kEmptyHashValue; + ptr1[1] = kEmptyHashValue; + } +else +{ + UInt32 *_distances = ++d; + + CLzRef *ptr0 = son + ((size_t)(pos) << 1) - CYC_TO_POS_OFFSET * 2 + 1; + CLzRef *ptr1 = son + ((size_t)(pos) << 1) - CYC_TO_POS_OFFSET * 2; + + const Byte *len0 = cur, *len1 = cur; + UInt32 cutValue = _cutValue; + const Byte *maxLen = cur + _maxLen; + + for (LOG_ITER(g_NumIters_Tree++);;) + { + LOG_ITER(g_NumIters_Loop++); + { + const ptrdiff_t diff = (ptrdiff_t)0 - (ptrdiff_t)delta; + CLzRef *pair = son + ((size_t)(((ptrdiff_t)pos - CYC_TO_POS_OFFSET) + diff) << 1); + const Byte *len = (len0 < len1 ? len0 : len1); + + #ifdef USE_SON_PREFETCH + const UInt32 pair0 = *pair; + #endif + + if (len[diff] == len[0]) + { + if (++len != lenLimit && len[diff] == len[0]) + while (++len != lenLimit) + { + LOG_ITER(g_NumIters_Bytes++); + if (len[diff] != len[0]) + break; + } + if (maxLen < len) + { + maxLen = len; + *d++ = (UInt32)(len - cur); + *d++ = delta - 1; + + if (len == lenLimit) + { + const UInt32 pair1 = pair[1]; + *ptr1 = + #ifdef USE_SON_PREFETCH + pair0; + #else + pair[0]; + #endif + *ptr0 = pair1; + + _distances[-1] = (UInt32)(d - _distances); + + #ifdef USE_LONG_MATCH_OPT + + if (hash == size || *hash != delta || lenLimit[diff] != lenLimit[0] || d >= limit) + break; + + { + for (;;) + { + hash++; + pos++; + cur++; + lenLimit++; + { + CLzRef *ptr = son + ((size_t)(pos) << 1) - CYC_TO_POS_OFFSET * 2; + #if 0 + *(UInt64 *)(void *)ptr = ((const UInt64 *)(const void *)ptr)[diff]; + #else + const UInt32 p0 = ptr[0 + (diff * 2)]; + const UInt32 p1 = ptr[1 + (diff * 2)]; + ptr[0] = p0; + ptr[1] = p1; + // ptr[0] = ptr[0 + (diff * 2)]; + // ptr[1] = ptr[1 + (diff * 2)]; + #endif + } + // PrintSon(son + 2, pos - 1); + // printf("\npos = %x delta = %x\n", pos, delta); + len++; + *d++ = 2; + *d++ = (UInt32)(len - cur); + *d++ = delta - 1; + if (hash == size || *hash != delta || lenLimit[diff] != lenLimit[0] || d >= limit) + break; + } + } + #endif + + break; + } + } + } + + { + const UInt32 curMatch = (UInt32)pos - delta; // (UInt32)(pos + diff); + if (len[diff] < len[0]) + { + delta = pair[1]; + if (delta >= curMatch) + return NULL; + *ptr1 = curMatch; + ptr1 = pair + 1; + len1 = len; + } + else + { + delta = *pair; + if (delta >= curMatch) + return NULL; + *ptr0 = curMatch; + ptr0 = pair; + len0 = len; + } + + delta = (UInt32)pos - delta; + + if (--cutValue == 0 || delta >= pos) + { + *ptr0 = *ptr1 = kEmptyHashValue; + _distances[-1] = (UInt32)(d - _distances); + break; + } + } + } + } // for (tree iterations) +} + pos++; + cur++; + } + while (d < limit); + *posRes = (UInt32)pos; + return d; +} +*/ + +/* define cbs if you use 2 functions. + GetMatchesSpecN_1() : (pos < _cyclicBufferSize) + GetMatchesSpecN_2() : (pos >= _cyclicBufferSize) + + do not define cbs if you use 1 function: + GetMatchesSpecN_2() +*/ + +// #define cbs _cyclicBufferSize + +/* + we use size_t for (pos) and (_cyclicBufferPos_ instead of UInt32 + to eliminate "movsx" BUG in old MSVC x64 compiler. +*/ + +UInt32 * MY_FAST_CALL GetMatchesSpecN_2(const Byte *lenLimit, size_t pos, const Byte *cur, CLzRef *son, + UInt32 _cutValue, UInt32 *d, size_t _maxLen, const UInt32 *hash, const UInt32 *limit, const UInt32 *size, + size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, + UInt32 *posRes); + +MY_NO_INLINE +UInt32 * MY_FAST_CALL GetMatchesSpecN_2(const Byte *lenLimit, size_t pos, const Byte *cur, CLzRef *son, + UInt32 _cutValue, UInt32 *d, size_t _maxLen, const UInt32 *hash, const UInt32 *limit, const UInt32 *size, + size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, + UInt32 *posRes) +{ + do // while (hash != size) + { + UInt32 delta; + + #ifndef cbs + UInt32 cbs; + #endif + + if (hash == size) + break; + + delta = *hash++; + + if (delta == 0) + return NULL; + + lenLimit++; + + #ifndef cbs + cbs = _cyclicBufferSize; + if ((UInt32)pos < cbs) + { + if (delta > (UInt32)pos) + return NULL; + cbs = (UInt32)pos; + } + #endif + + if (delta >= cbs) + { + CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1); + *d++ = 0; + ptr1[0] = kEmptyHashValue; + ptr1[1] = kEmptyHashValue; + } +else +{ + UInt32 *_distances = ++d; + + CLzRef *ptr0 = son + ((size_t)_cyclicBufferPos << 1) + 1; + CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1); + + UInt32 cutValue = _cutValue; + const Byte *len0 = cur, *len1 = cur; + const Byte *maxLen = cur + _maxLen; + + // if (cutValue == 0) { *ptr0 = *ptr1 = kEmptyHashValue; } else + for (LOG_ITER(g_NumIters_Tree++);;) + { + LOG_ITER(g_NumIters_Loop++); + { + // SPEC code + CLzRef *pair = son + ((size_t)((ptrdiff_t)_cyclicBufferPos - (ptrdiff_t)delta + + (ptrdiff_t)(UInt32)(_cyclicBufferPos < delta ? cbs : 0) + ) << 1); + + const ptrdiff_t diff = (ptrdiff_t)0 - (ptrdiff_t)delta; + const Byte *len = (len0 < len1 ? len0 : len1); + + #ifdef USE_SON_PREFETCH + const UInt32 pair0 = *pair; + #endif + + if (len[diff] == len[0]) + { + if (++len != lenLimit && len[diff] == len[0]) + while (++len != lenLimit) + { + LOG_ITER(g_NumIters_Bytes++); + if (len[diff] != len[0]) + break; + } + if (maxLen < len) + { + maxLen = len; + *d++ = (UInt32)(len - cur); + *d++ = delta - 1; + + if (len == lenLimit) + { + const UInt32 pair1 = pair[1]; + *ptr1 = + #ifdef USE_SON_PREFETCH + pair0; + #else + pair[0]; + #endif + *ptr0 = pair1; + + _distances[-1] = (UInt32)(d - _distances); + + #ifdef USE_LONG_MATCH_OPT + + if (hash == size || *hash != delta || lenLimit[diff] != lenLimit[0] || d >= limit) + break; + + { + for (;;) + { + *d++ = 2; + *d++ = (UInt32)(lenLimit - cur); + *d++ = delta - 1; + cur++; + lenLimit++; + // SPEC + _cyclicBufferPos++; + { + // SPEC code + CLzRef *dest = son + ((size_t)(_cyclicBufferPos) << 1); + const CLzRef *src = dest + ((diff + + (ptrdiff_t)(UInt32)((_cyclicBufferPos < delta) ? cbs : 0)) << 1); + // CLzRef *ptr = son + ((size_t)(pos) << 1) - CYC_TO_POS_OFFSET * 2; + #if 0 + *(UInt64 *)(void *)dest = *((const UInt64 *)(const void *)src); + #else + const UInt32 p0 = src[0]; + const UInt32 p1 = src[1]; + dest[0] = p0; + dest[1] = p1; + #endif + } + pos++; + hash++; + if (hash == size || *hash != delta || lenLimit[diff] != lenLimit[0] || d >= limit) + break; + } // for() end for long matches + } + #endif + + break; // break from TREE iterations + } + } + } + { + const UInt32 curMatch = (UInt32)pos - delta; // (UInt32)(pos + diff); + if (len[diff] < len[0]) + { + delta = pair[1]; + *ptr1 = curMatch; + ptr1 = pair + 1; + len1 = len; + if (delta >= curMatch) + return NULL; + } + else + { + delta = *pair; + *ptr0 = curMatch; + ptr0 = pair; + len0 = len; + if (delta >= curMatch) + return NULL; + } + delta = (UInt32)pos - delta; + + if (--cutValue == 0 || delta >= cbs) + { + *ptr0 = *ptr1 = kEmptyHashValue; + _distances[-1] = (UInt32)(d - _distances); + break; + } + } + } + } // for (tree iterations) +} + pos++; + _cyclicBufferPos++; + cur++; + } + while (d < limit); + *posRes = (UInt32)pos; + return d; +} + + + +/* +typedef UInt32 uint32plus; // size_t + +UInt32 * MY_FAST_CALL GetMatchesSpecN_3(uint32plus lenLimit, size_t pos, const Byte *cur, CLzRef *son, + UInt32 _cutValue, UInt32 *d, uint32plus _maxLen, const UInt32 *hash, const UInt32 *limit, const UInt32 *size, + size_t _cyclicBufferPos, UInt32 _cyclicBufferSize, + UInt32 *posRes) +{ + do // while (hash != size) + { + UInt32 delta; + + #ifndef cbs + UInt32 cbs; + #endif + + if (hash == size) + break; + + delta = *hash++; + + if (delta == 0) + return NULL; + + #ifndef cbs + cbs = _cyclicBufferSize; + if ((UInt32)pos < cbs) + { + if (delta > (UInt32)pos) + return NULL; + cbs = (UInt32)pos; + } + #endif + + if (delta >= cbs) + { + CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1); + *d++ = 0; + ptr1[0] = kEmptyHashValue; + ptr1[1] = kEmptyHashValue; + } +else +{ + CLzRef *ptr0 = son + ((size_t)_cyclicBufferPos << 1) + 1; + CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1); + UInt32 *_distances = ++d; + uint32plus len0 = 0, len1 = 0; + UInt32 cutValue = _cutValue; + uint32plus maxLen = _maxLen; + // lenLimit++; // const Byte *lenLimit = cur + _lenLimit; + + for (LOG_ITER(g_NumIters_Tree++);;) + { + LOG_ITER(g_NumIters_Loop++); + { + // const ptrdiff_t diff = (ptrdiff_t)0 - (ptrdiff_t)delta; + CLzRef *pair = son + ((size_t)((ptrdiff_t)_cyclicBufferPos - delta + + (ptrdiff_t)(UInt32)(_cyclicBufferPos < delta ? cbs : 0) + ) << 1); + const Byte *pb = cur - delta; + uint32plus len = (len0 < len1 ? len0 : len1); + + #ifdef USE_SON_PREFETCH + const UInt32 pair0 = *pair; + #endif + + if (pb[len] == cur[len]) + { + if (++len != lenLimit && pb[len] == cur[len]) + while (++len != lenLimit) + if (pb[len] != cur[len]) + break; + if (maxLen < len) + { + maxLen = len; + *d++ = (UInt32)len; + *d++ = delta - 1; + if (len == lenLimit) + { + { + const UInt32 pair1 = pair[1]; + *ptr0 = pair1; + *ptr1 = + #ifdef USE_SON_PREFETCH + pair0; + #else + pair[0]; + #endif + } + + _distances[-1] = (UInt32)(d - _distances); + + #ifdef USE_LONG_MATCH_OPT + + if (hash == size || *hash != delta || pb[lenLimit] != cur[lenLimit] || d >= limit) + break; + + { + const ptrdiff_t diff = (ptrdiff_t)0 - (ptrdiff_t)delta; + for (;;) + { + *d++ = 2; + *d++ = (UInt32)lenLimit; + *d++ = delta - 1; + _cyclicBufferPos++; + { + CLzRef *dest = son + ((size_t)_cyclicBufferPos << 1); + const CLzRef *src = dest + ((diff + + (ptrdiff_t)(UInt32)(_cyclicBufferPos < delta ? cbs : 0)) << 1); + #if 0 + *(UInt64 *)(void *)dest = *((const UInt64 *)(const void *)src); + #else + const UInt32 p0 = src[0]; + const UInt32 p1 = src[1]; + dest[0] = p0; + dest[1] = p1; + #endif + } + hash++; + pos++; + cur++; + pb++; + if (hash == size || *hash != delta || pb[lenLimit] != cur[lenLimit] || d >= limit) + break; + } + } + #endif + + break; + } + } + } + { + const UInt32 curMatch = (UInt32)pos - delta; + if (pb[len] < cur[len]) + { + delta = pair[1]; + *ptr1 = curMatch; + ptr1 = pair + 1; + len1 = len; + } + else + { + delta = *pair; + *ptr0 = curMatch; + ptr0 = pair; + len0 = len; + } + + { + if (delta >= curMatch) + return NULL; + delta = (UInt32)pos - delta; + if (delta >= cbs + // delta >= _cyclicBufferSize || delta >= pos + || --cutValue == 0) + { + *ptr0 = *ptr1 = kEmptyHashValue; + _distances[-1] = (UInt32)(d - _distances); + break; + } + } + } + } + } // for (tree iterations) +} + pos++; + _cyclicBufferPos++; + cur++; + } + while (d < limit); + *posRes = (UInt32)pos; + return d; +} +*/ diff --git a/deps/LZMA-SDK/C/LzHash.h b/deps/LZMA-SDK/C/LzHash.h index a682f83be..77b898cfa 100644 --- a/deps/LZMA-SDK/C/LzHash.h +++ b/deps/LZMA-SDK/C/LzHash.h @@ -1,34 +1,34 @@ -/* LzHash.h -- HASH functions for LZ algorithms -2019-10-30 : Igor Pavlov : Public domain */ - -#ifndef __LZ_HASH_H -#define __LZ_HASH_H - -/* - (kHash2Size >= (1 << 8)) : Required - (kHash3Size >= (1 << 16)) : Required -*/ - -#define kHash2Size (1 << 10) -#define kHash3Size (1 << 16) -// #define kHash4Size (1 << 20) - -#define kFix3HashSize (kHash2Size) -#define kFix4HashSize (kHash2Size + kHash3Size) -// #define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size) - -/* - We use up to 3 crc values for hash: - crc0 - crc1 << Shift_1 - crc2 << Shift_2 - (Shift_1 = 5) and (Shift_2 = 10) is good tradeoff. - Small values for Shift are not good for collision rate. - Big value for Shift_2 increases the minimum size - of hash table, that will be slow for small files. -*/ - -#define kLzHash_CrcShift_1 5 -#define kLzHash_CrcShift_2 10 - -#endif +/* LzHash.h -- HASH functions for LZ algorithms +2019-10-30 : Igor Pavlov : Public domain */ + +#ifndef __LZ_HASH_H +#define __LZ_HASH_H + +/* + (kHash2Size >= (1 << 8)) : Required + (kHash3Size >= (1 << 16)) : Required +*/ + +#define kHash2Size (1 << 10) +#define kHash3Size (1 << 16) +// #define kHash4Size (1 << 20) + +#define kFix3HashSize (kHash2Size) +#define kFix4HashSize (kHash2Size + kHash3Size) +// #define kFix5HashSize (kHash2Size + kHash3Size + kHash4Size) + +/* + We use up to 3 crc values for hash: + crc0 + crc1 << Shift_1 + crc2 << Shift_2 + (Shift_1 = 5) and (Shift_2 = 10) is good tradeoff. + Small values for Shift are not good for collision rate. + Big value for Shift_2 increases the minimum size + of hash table, that will be slow for small files. +*/ + +#define kLzHash_CrcShift_1 5 +#define kLzHash_CrcShift_2 10 + +#endif diff --git a/deps/LZMA-SDK/C/Lzma2Dec.c b/deps/LZMA-SDK/C/Lzma2Dec.c index f9f98095d..ac970a843 100644 --- a/deps/LZMA-SDK/C/Lzma2Dec.c +++ b/deps/LZMA-SDK/C/Lzma2Dec.c @@ -1,489 +1,489 @@ -/* Lzma2Dec.c -- LZMA2 Decoder -2021-02-09 : Igor Pavlov : Public domain */ - -/* #define SHOW_DEBUG_INFO */ - -#include "Precomp.h" - -#ifdef SHOW_DEBUG_INFO -#include -#endif - -#include - -#include "Lzma2Dec.h" - -/* -00000000 - End of data -00000001 U U - Uncompressed, reset dic, need reset state and set new prop -00000010 U U - Uncompressed, no reset -100uuuuu U U P P - LZMA, no reset -101uuuuu U U P P - LZMA, reset state -110uuuuu U U P P S - LZMA, reset state + set new prop -111uuuuu U U P P S - LZMA, reset state + set new prop, reset dic - - u, U - Unpack Size - P - Pack Size - S - Props -*/ - -#define LZMA2_CONTROL_COPY_RESET_DIC 1 - -#define LZMA2_IS_UNCOMPRESSED_STATE(p) (((p)->control & (1 << 7)) == 0) - -#define LZMA2_LCLP_MAX 4 -#define LZMA2_DIC_SIZE_FROM_PROP(p) (((UInt32)2 | ((p) & 1)) << ((p) / 2 + 11)) - -#ifdef SHOW_DEBUG_INFO -#define PRF(x) x -#else -#define PRF(x) -#endif - -typedef enum -{ - LZMA2_STATE_CONTROL, - LZMA2_STATE_UNPACK0, - LZMA2_STATE_UNPACK1, - LZMA2_STATE_PACK0, - LZMA2_STATE_PACK1, - LZMA2_STATE_PROP, - LZMA2_STATE_DATA, - LZMA2_STATE_DATA_CONT, - LZMA2_STATE_FINISHED, - LZMA2_STATE_ERROR -} ELzma2State; - -static SRes Lzma2Dec_GetOldProps(Byte prop, Byte *props) -{ - UInt32 dicSize; - if (prop > 40) - return SZ_ERROR_UNSUPPORTED; - dicSize = (prop == 40) ? 0xFFFFFFFF : LZMA2_DIC_SIZE_FROM_PROP(prop); - props[0] = (Byte)LZMA2_LCLP_MAX; - props[1] = (Byte)(dicSize); - props[2] = (Byte)(dicSize >> 8); - props[3] = (Byte)(dicSize >> 16); - props[4] = (Byte)(dicSize >> 24); - return SZ_OK; -} - -SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc) -{ - Byte props[LZMA_PROPS_SIZE]; - RINOK(Lzma2Dec_GetOldProps(prop, props)); - return LzmaDec_AllocateProbs(&p->decoder, props, LZMA_PROPS_SIZE, alloc); -} - -SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc) -{ - Byte props[LZMA_PROPS_SIZE]; - RINOK(Lzma2Dec_GetOldProps(prop, props)); - return LzmaDec_Allocate(&p->decoder, props, LZMA_PROPS_SIZE, alloc); -} - -void Lzma2Dec_Init(CLzma2Dec *p) -{ - p->state = LZMA2_STATE_CONTROL; - p->needInitLevel = 0xE0; - p->isExtraMode = False; - p->unpackSize = 0; - - // p->decoder.dicPos = 0; // we can use it instead of full init - LzmaDec_Init(&p->decoder); -} - -// ELzma2State -static unsigned Lzma2Dec_UpdateState(CLzma2Dec *p, Byte b) -{ - switch (p->state) - { - case LZMA2_STATE_CONTROL: - p->isExtraMode = False; - p->control = b; - PRF(printf("\n %8X", (unsigned)p->decoder.dicPos)); - PRF(printf(" %02X", (unsigned)b)); - if (b == 0) - return LZMA2_STATE_FINISHED; - if (LZMA2_IS_UNCOMPRESSED_STATE(p)) - { - if (b == LZMA2_CONTROL_COPY_RESET_DIC) - p->needInitLevel = 0xC0; - else if (b > 2 || p->needInitLevel == 0xE0) - return LZMA2_STATE_ERROR; - } - else - { - if (b < p->needInitLevel) - return LZMA2_STATE_ERROR; - p->needInitLevel = 0; - p->unpackSize = (UInt32)(b & 0x1F) << 16; - } - return LZMA2_STATE_UNPACK0; - - case LZMA2_STATE_UNPACK0: - p->unpackSize |= (UInt32)b << 8; - return LZMA2_STATE_UNPACK1; - - case LZMA2_STATE_UNPACK1: - p->unpackSize |= (UInt32)b; - p->unpackSize++; - PRF(printf(" %7u", (unsigned)p->unpackSize)); - return LZMA2_IS_UNCOMPRESSED_STATE(p) ? LZMA2_STATE_DATA : LZMA2_STATE_PACK0; - - case LZMA2_STATE_PACK0: - p->packSize = (UInt32)b << 8; - return LZMA2_STATE_PACK1; - - case LZMA2_STATE_PACK1: - p->packSize |= (UInt32)b; - p->packSize++; - // if (p->packSize < 5) return LZMA2_STATE_ERROR; - PRF(printf(" %5u", (unsigned)p->packSize)); - return (p->control & 0x40) ? LZMA2_STATE_PROP : LZMA2_STATE_DATA; - - case LZMA2_STATE_PROP: - { - unsigned lc, lp; - if (b >= (9 * 5 * 5)) - return LZMA2_STATE_ERROR; - lc = b % 9; - b /= 9; - p->decoder.prop.pb = (Byte)(b / 5); - lp = b % 5; - if (lc + lp > LZMA2_LCLP_MAX) - return LZMA2_STATE_ERROR; - p->decoder.prop.lc = (Byte)lc; - p->decoder.prop.lp = (Byte)lp; - return LZMA2_STATE_DATA; - } - } - return LZMA2_STATE_ERROR; -} - -static void LzmaDec_UpdateWithUncompressed(CLzmaDec *p, const Byte *src, SizeT size) -{ - memcpy(p->dic + p->dicPos, src, size); - p->dicPos += size; - if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= size) - p->checkDicSize = p->prop.dicSize; - p->processedPos += (UInt32)size; -} - -void LzmaDec_InitDicAndState(CLzmaDec *p, BoolInt initDic, BoolInt initState); - - -SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit, - const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) -{ - SizeT inSize = *srcLen; - *srcLen = 0; - *status = LZMA_STATUS_NOT_SPECIFIED; - - while (p->state != LZMA2_STATE_ERROR) - { - SizeT dicPos; - - if (p->state == LZMA2_STATE_FINISHED) - { - *status = LZMA_STATUS_FINISHED_WITH_MARK; - return SZ_OK; - } - - dicPos = p->decoder.dicPos; - - if (dicPos == dicLimit && finishMode == LZMA_FINISH_ANY) - { - *status = LZMA_STATUS_NOT_FINISHED; - return SZ_OK; - } - - if (p->state != LZMA2_STATE_DATA && p->state != LZMA2_STATE_DATA_CONT) - { - if (*srcLen == inSize) - { - *status = LZMA_STATUS_NEEDS_MORE_INPUT; - return SZ_OK; - } - (*srcLen)++; - p->state = Lzma2Dec_UpdateState(p, *src++); - if (dicPos == dicLimit && p->state != LZMA2_STATE_FINISHED) - break; - continue; - } - - { - SizeT inCur = inSize - *srcLen; - SizeT outCur = dicLimit - dicPos; - ELzmaFinishMode curFinishMode = LZMA_FINISH_ANY; - - if (outCur >= p->unpackSize) - { - outCur = (SizeT)p->unpackSize; - curFinishMode = LZMA_FINISH_END; - } - - if (LZMA2_IS_UNCOMPRESSED_STATE(p)) - { - if (inCur == 0) - { - *status = LZMA_STATUS_NEEDS_MORE_INPUT; - return SZ_OK; - } - - if (p->state == LZMA2_STATE_DATA) - { - BoolInt initDic = (p->control == LZMA2_CONTROL_COPY_RESET_DIC); - LzmaDec_InitDicAndState(&p->decoder, initDic, False); - } - - if (inCur > outCur) - inCur = outCur; - if (inCur == 0) - break; - - LzmaDec_UpdateWithUncompressed(&p->decoder, src, inCur); - - src += inCur; - *srcLen += inCur; - p->unpackSize -= (UInt32)inCur; - p->state = (p->unpackSize == 0) ? LZMA2_STATE_CONTROL : LZMA2_STATE_DATA_CONT; - } - else - { - SRes res; - - if (p->state == LZMA2_STATE_DATA) - { - BoolInt initDic = (p->control >= 0xE0); - BoolInt initState = (p->control >= 0xA0); - LzmaDec_InitDicAndState(&p->decoder, initDic, initState); - p->state = LZMA2_STATE_DATA_CONT; - } - - if (inCur > p->packSize) - inCur = (SizeT)p->packSize; - - res = LzmaDec_DecodeToDic(&p->decoder, dicPos + outCur, src, &inCur, curFinishMode, status); - - src += inCur; - *srcLen += inCur; - p->packSize -= (UInt32)inCur; - outCur = p->decoder.dicPos - dicPos; - p->unpackSize -= (UInt32)outCur; - - if (res != 0) - break; - - if (*status == LZMA_STATUS_NEEDS_MORE_INPUT) - { - if (p->packSize == 0) - break; - return SZ_OK; - } - - if (inCur == 0 && outCur == 0) - { - if (*status != LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK - || p->unpackSize != 0 - || p->packSize != 0) - break; - p->state = LZMA2_STATE_CONTROL; - } - - *status = LZMA_STATUS_NOT_SPECIFIED; - } - } - } - - *status = LZMA_STATUS_NOT_SPECIFIED; - p->state = LZMA2_STATE_ERROR; - return SZ_ERROR_DATA; -} - - - - -ELzma2ParseStatus Lzma2Dec_Parse(CLzma2Dec *p, - SizeT outSize, - const Byte *src, SizeT *srcLen, - int checkFinishBlock) -{ - SizeT inSize = *srcLen; - *srcLen = 0; - - while (p->state != LZMA2_STATE_ERROR) - { - if (p->state == LZMA2_STATE_FINISHED) - return (ELzma2ParseStatus)LZMA_STATUS_FINISHED_WITH_MARK; - - if (outSize == 0 && !checkFinishBlock) - return (ELzma2ParseStatus)LZMA_STATUS_NOT_FINISHED; - - if (p->state != LZMA2_STATE_DATA && p->state != LZMA2_STATE_DATA_CONT) - { - if (*srcLen == inSize) - return (ELzma2ParseStatus)LZMA_STATUS_NEEDS_MORE_INPUT; - (*srcLen)++; - - p->state = Lzma2Dec_UpdateState(p, *src++); - - if (p->state == LZMA2_STATE_UNPACK0) - { - // if (p->decoder.dicPos != 0) - if (p->control == LZMA2_CONTROL_COPY_RESET_DIC || p->control >= 0xE0) - return LZMA2_PARSE_STATUS_NEW_BLOCK; - // if (outSize == 0) return LZMA_STATUS_NOT_FINISHED; - } - - // The following code can be commented. - // It's not big problem, if we read additional input bytes. - // It will be stopped later in LZMA2_STATE_DATA / LZMA2_STATE_DATA_CONT state. - - if (outSize == 0 && p->state != LZMA2_STATE_FINISHED) - { - // checkFinishBlock is true. So we expect that block must be finished, - // We can return LZMA_STATUS_NOT_SPECIFIED or LZMA_STATUS_NOT_FINISHED here - // break; - return (ELzma2ParseStatus)LZMA_STATUS_NOT_FINISHED; - } - - if (p->state == LZMA2_STATE_DATA) - return LZMA2_PARSE_STATUS_NEW_CHUNK; - - continue; - } - - if (outSize == 0) - return (ELzma2ParseStatus)LZMA_STATUS_NOT_FINISHED; - - { - SizeT inCur = inSize - *srcLen; - - if (LZMA2_IS_UNCOMPRESSED_STATE(p)) - { - if (inCur == 0) - return (ELzma2ParseStatus)LZMA_STATUS_NEEDS_MORE_INPUT; - if (inCur > p->unpackSize) - inCur = p->unpackSize; - if (inCur > outSize) - inCur = outSize; - p->decoder.dicPos += inCur; - src += inCur; - *srcLen += inCur; - outSize -= inCur; - p->unpackSize -= (UInt32)inCur; - p->state = (p->unpackSize == 0) ? LZMA2_STATE_CONTROL : LZMA2_STATE_DATA_CONT; - } - else - { - p->isExtraMode = True; - - if (inCur == 0) - { - if (p->packSize != 0) - return (ELzma2ParseStatus)LZMA_STATUS_NEEDS_MORE_INPUT; - } - else if (p->state == LZMA2_STATE_DATA) - { - p->state = LZMA2_STATE_DATA_CONT; - if (*src != 0) - { - // first byte of lzma chunk must be Zero - *srcLen += 1; - p->packSize--; - break; - } - } - - if (inCur > p->packSize) - inCur = (SizeT)p->packSize; - - src += inCur; - *srcLen += inCur; - p->packSize -= (UInt32)inCur; - - if (p->packSize == 0) - { - SizeT rem = outSize; - if (rem > p->unpackSize) - rem = p->unpackSize; - p->decoder.dicPos += rem; - p->unpackSize -= (UInt32)rem; - outSize -= rem; - if (p->unpackSize == 0) - p->state = LZMA2_STATE_CONTROL; - } - } - } - } - - p->state = LZMA2_STATE_ERROR; - return (ELzma2ParseStatus)LZMA_STATUS_NOT_SPECIFIED; -} - - - - -SRes Lzma2Dec_DecodeToBuf(CLzma2Dec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) -{ - SizeT outSize = *destLen, inSize = *srcLen; - *srcLen = *destLen = 0; - - for (;;) - { - SizeT inCur = inSize, outCur, dicPos; - ELzmaFinishMode curFinishMode; - SRes res; - - if (p->decoder.dicPos == p->decoder.dicBufSize) - p->decoder.dicPos = 0; - dicPos = p->decoder.dicPos; - curFinishMode = LZMA_FINISH_ANY; - outCur = p->decoder.dicBufSize - dicPos; - - if (outCur >= outSize) - { - outCur = outSize; - curFinishMode = finishMode; - } - - res = Lzma2Dec_DecodeToDic(p, dicPos + outCur, src, &inCur, curFinishMode, status); - - src += inCur; - inSize -= inCur; - *srcLen += inCur; - outCur = p->decoder.dicPos - dicPos; - memcpy(dest, p->decoder.dic + dicPos, outCur); - dest += outCur; - outSize -= outCur; - *destLen += outCur; - if (res != 0) - return res; - if (outCur == 0 || outSize == 0) - return SZ_OK; - } -} - - -SRes Lzma2Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, - Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAllocPtr alloc) -{ - CLzma2Dec p; - SRes res; - SizeT outSize = *destLen, inSize = *srcLen; - *destLen = *srcLen = 0; - *status = LZMA_STATUS_NOT_SPECIFIED; - Lzma2Dec_Construct(&p); - RINOK(Lzma2Dec_AllocateProbs(&p, prop, alloc)); - p.decoder.dic = dest; - p.decoder.dicBufSize = outSize; - Lzma2Dec_Init(&p); - *srcLen = inSize; - res = Lzma2Dec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status); - *destLen = p.decoder.dicPos; - if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT) - res = SZ_ERROR_INPUT_EOF; - Lzma2Dec_FreeProbs(&p, alloc); - return res; -} +/* Lzma2Dec.c -- LZMA2 Decoder +2021-02-09 : Igor Pavlov : Public domain */ + +/* #define SHOW_DEBUG_INFO */ + +#include "Precomp.h" + +#ifdef SHOW_DEBUG_INFO +#include +#endif + +#include + +#include "Lzma2Dec.h" + +/* +00000000 - End of data +00000001 U U - Uncompressed, reset dic, need reset state and set new prop +00000010 U U - Uncompressed, no reset +100uuuuu U U P P - LZMA, no reset +101uuuuu U U P P - LZMA, reset state +110uuuuu U U P P S - LZMA, reset state + set new prop +111uuuuu U U P P S - LZMA, reset state + set new prop, reset dic + + u, U - Unpack Size + P - Pack Size + S - Props +*/ + +#define LZMA2_CONTROL_COPY_RESET_DIC 1 + +#define LZMA2_IS_UNCOMPRESSED_STATE(p) (((p)->control & (1 << 7)) == 0) + +#define LZMA2_LCLP_MAX 4 +#define LZMA2_DIC_SIZE_FROM_PROP(p) (((UInt32)2 | ((p) & 1)) << ((p) / 2 + 11)) + +#ifdef SHOW_DEBUG_INFO +#define PRF(x) x +#else +#define PRF(x) +#endif + +typedef enum +{ + LZMA2_STATE_CONTROL, + LZMA2_STATE_UNPACK0, + LZMA2_STATE_UNPACK1, + LZMA2_STATE_PACK0, + LZMA2_STATE_PACK1, + LZMA2_STATE_PROP, + LZMA2_STATE_DATA, + LZMA2_STATE_DATA_CONT, + LZMA2_STATE_FINISHED, + LZMA2_STATE_ERROR +} ELzma2State; + +static SRes Lzma2Dec_GetOldProps(Byte prop, Byte *props) +{ + UInt32 dicSize; + if (prop > 40) + return SZ_ERROR_UNSUPPORTED; + dicSize = (prop == 40) ? 0xFFFFFFFF : LZMA2_DIC_SIZE_FROM_PROP(prop); + props[0] = (Byte)LZMA2_LCLP_MAX; + props[1] = (Byte)(dicSize); + props[2] = (Byte)(dicSize >> 8); + props[3] = (Byte)(dicSize >> 16); + props[4] = (Byte)(dicSize >> 24); + return SZ_OK; +} + +SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc) +{ + Byte props[LZMA_PROPS_SIZE]; + RINOK(Lzma2Dec_GetOldProps(prop, props)); + return LzmaDec_AllocateProbs(&p->decoder, props, LZMA_PROPS_SIZE, alloc); +} + +SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc) +{ + Byte props[LZMA_PROPS_SIZE]; + RINOK(Lzma2Dec_GetOldProps(prop, props)); + return LzmaDec_Allocate(&p->decoder, props, LZMA_PROPS_SIZE, alloc); +} + +void Lzma2Dec_Init(CLzma2Dec *p) +{ + p->state = LZMA2_STATE_CONTROL; + p->needInitLevel = 0xE0; + p->isExtraMode = False; + p->unpackSize = 0; + + // p->decoder.dicPos = 0; // we can use it instead of full init + LzmaDec_Init(&p->decoder); +} + +// ELzma2State +static unsigned Lzma2Dec_UpdateState(CLzma2Dec *p, Byte b) +{ + switch (p->state) + { + case LZMA2_STATE_CONTROL: + p->isExtraMode = False; + p->control = b; + PRF(printf("\n %8X", (unsigned)p->decoder.dicPos)); + PRF(printf(" %02X", (unsigned)b)); + if (b == 0) + return LZMA2_STATE_FINISHED; + if (LZMA2_IS_UNCOMPRESSED_STATE(p)) + { + if (b == LZMA2_CONTROL_COPY_RESET_DIC) + p->needInitLevel = 0xC0; + else if (b > 2 || p->needInitLevel == 0xE0) + return LZMA2_STATE_ERROR; + } + else + { + if (b < p->needInitLevel) + return LZMA2_STATE_ERROR; + p->needInitLevel = 0; + p->unpackSize = (UInt32)(b & 0x1F) << 16; + } + return LZMA2_STATE_UNPACK0; + + case LZMA2_STATE_UNPACK0: + p->unpackSize |= (UInt32)b << 8; + return LZMA2_STATE_UNPACK1; + + case LZMA2_STATE_UNPACK1: + p->unpackSize |= (UInt32)b; + p->unpackSize++; + PRF(printf(" %7u", (unsigned)p->unpackSize)); + return LZMA2_IS_UNCOMPRESSED_STATE(p) ? LZMA2_STATE_DATA : LZMA2_STATE_PACK0; + + case LZMA2_STATE_PACK0: + p->packSize = (UInt32)b << 8; + return LZMA2_STATE_PACK1; + + case LZMA2_STATE_PACK1: + p->packSize |= (UInt32)b; + p->packSize++; + // if (p->packSize < 5) return LZMA2_STATE_ERROR; + PRF(printf(" %5u", (unsigned)p->packSize)); + return (p->control & 0x40) ? LZMA2_STATE_PROP : LZMA2_STATE_DATA; + + case LZMA2_STATE_PROP: + { + unsigned lc, lp; + if (b >= (9 * 5 * 5)) + return LZMA2_STATE_ERROR; + lc = b % 9; + b /= 9; + p->decoder.prop.pb = (Byte)(b / 5); + lp = b % 5; + if (lc + lp > LZMA2_LCLP_MAX) + return LZMA2_STATE_ERROR; + p->decoder.prop.lc = (Byte)lc; + p->decoder.prop.lp = (Byte)lp; + return LZMA2_STATE_DATA; + } + } + return LZMA2_STATE_ERROR; +} + +static void LzmaDec_UpdateWithUncompressed(CLzmaDec *p, const Byte *src, SizeT size) +{ + memcpy(p->dic + p->dicPos, src, size); + p->dicPos += size; + if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= size) + p->checkDicSize = p->prop.dicSize; + p->processedPos += (UInt32)size; +} + +void LzmaDec_InitDicAndState(CLzmaDec *p, BoolInt initDic, BoolInt initState); + + +SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) +{ + SizeT inSize = *srcLen; + *srcLen = 0; + *status = LZMA_STATUS_NOT_SPECIFIED; + + while (p->state != LZMA2_STATE_ERROR) + { + SizeT dicPos; + + if (p->state == LZMA2_STATE_FINISHED) + { + *status = LZMA_STATUS_FINISHED_WITH_MARK; + return SZ_OK; + } + + dicPos = p->decoder.dicPos; + + if (dicPos == dicLimit && finishMode == LZMA_FINISH_ANY) + { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_OK; + } + + if (p->state != LZMA2_STATE_DATA && p->state != LZMA2_STATE_DATA_CONT) + { + if (*srcLen == inSize) + { + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + (*srcLen)++; + p->state = Lzma2Dec_UpdateState(p, *src++); + if (dicPos == dicLimit && p->state != LZMA2_STATE_FINISHED) + break; + continue; + } + + { + SizeT inCur = inSize - *srcLen; + SizeT outCur = dicLimit - dicPos; + ELzmaFinishMode curFinishMode = LZMA_FINISH_ANY; + + if (outCur >= p->unpackSize) + { + outCur = (SizeT)p->unpackSize; + curFinishMode = LZMA_FINISH_END; + } + + if (LZMA2_IS_UNCOMPRESSED_STATE(p)) + { + if (inCur == 0) + { + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + + if (p->state == LZMA2_STATE_DATA) + { + BoolInt initDic = (p->control == LZMA2_CONTROL_COPY_RESET_DIC); + LzmaDec_InitDicAndState(&p->decoder, initDic, False); + } + + if (inCur > outCur) + inCur = outCur; + if (inCur == 0) + break; + + LzmaDec_UpdateWithUncompressed(&p->decoder, src, inCur); + + src += inCur; + *srcLen += inCur; + p->unpackSize -= (UInt32)inCur; + p->state = (p->unpackSize == 0) ? LZMA2_STATE_CONTROL : LZMA2_STATE_DATA_CONT; + } + else + { + SRes res; + + if (p->state == LZMA2_STATE_DATA) + { + BoolInt initDic = (p->control >= 0xE0); + BoolInt initState = (p->control >= 0xA0); + LzmaDec_InitDicAndState(&p->decoder, initDic, initState); + p->state = LZMA2_STATE_DATA_CONT; + } + + if (inCur > p->packSize) + inCur = (SizeT)p->packSize; + + res = LzmaDec_DecodeToDic(&p->decoder, dicPos + outCur, src, &inCur, curFinishMode, status); + + src += inCur; + *srcLen += inCur; + p->packSize -= (UInt32)inCur; + outCur = p->decoder.dicPos - dicPos; + p->unpackSize -= (UInt32)outCur; + + if (res != 0) + break; + + if (*status == LZMA_STATUS_NEEDS_MORE_INPUT) + { + if (p->packSize == 0) + break; + return SZ_OK; + } + + if (inCur == 0 && outCur == 0) + { + if (*status != LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + || p->unpackSize != 0 + || p->packSize != 0) + break; + p->state = LZMA2_STATE_CONTROL; + } + + *status = LZMA_STATUS_NOT_SPECIFIED; + } + } + } + + *status = LZMA_STATUS_NOT_SPECIFIED; + p->state = LZMA2_STATE_ERROR; + return SZ_ERROR_DATA; +} + + + + +ELzma2ParseStatus Lzma2Dec_Parse(CLzma2Dec *p, + SizeT outSize, + const Byte *src, SizeT *srcLen, + int checkFinishBlock) +{ + SizeT inSize = *srcLen; + *srcLen = 0; + + while (p->state != LZMA2_STATE_ERROR) + { + if (p->state == LZMA2_STATE_FINISHED) + return (ELzma2ParseStatus)LZMA_STATUS_FINISHED_WITH_MARK; + + if (outSize == 0 && !checkFinishBlock) + return (ELzma2ParseStatus)LZMA_STATUS_NOT_FINISHED; + + if (p->state != LZMA2_STATE_DATA && p->state != LZMA2_STATE_DATA_CONT) + { + if (*srcLen == inSize) + return (ELzma2ParseStatus)LZMA_STATUS_NEEDS_MORE_INPUT; + (*srcLen)++; + + p->state = Lzma2Dec_UpdateState(p, *src++); + + if (p->state == LZMA2_STATE_UNPACK0) + { + // if (p->decoder.dicPos != 0) + if (p->control == LZMA2_CONTROL_COPY_RESET_DIC || p->control >= 0xE0) + return LZMA2_PARSE_STATUS_NEW_BLOCK; + // if (outSize == 0) return LZMA_STATUS_NOT_FINISHED; + } + + // The following code can be commented. + // It's not big problem, if we read additional input bytes. + // It will be stopped later in LZMA2_STATE_DATA / LZMA2_STATE_DATA_CONT state. + + if (outSize == 0 && p->state != LZMA2_STATE_FINISHED) + { + // checkFinishBlock is true. So we expect that block must be finished, + // We can return LZMA_STATUS_NOT_SPECIFIED or LZMA_STATUS_NOT_FINISHED here + // break; + return (ELzma2ParseStatus)LZMA_STATUS_NOT_FINISHED; + } + + if (p->state == LZMA2_STATE_DATA) + return LZMA2_PARSE_STATUS_NEW_CHUNK; + + continue; + } + + if (outSize == 0) + return (ELzma2ParseStatus)LZMA_STATUS_NOT_FINISHED; + + { + SizeT inCur = inSize - *srcLen; + + if (LZMA2_IS_UNCOMPRESSED_STATE(p)) + { + if (inCur == 0) + return (ELzma2ParseStatus)LZMA_STATUS_NEEDS_MORE_INPUT; + if (inCur > p->unpackSize) + inCur = p->unpackSize; + if (inCur > outSize) + inCur = outSize; + p->decoder.dicPos += inCur; + src += inCur; + *srcLen += inCur; + outSize -= inCur; + p->unpackSize -= (UInt32)inCur; + p->state = (p->unpackSize == 0) ? LZMA2_STATE_CONTROL : LZMA2_STATE_DATA_CONT; + } + else + { + p->isExtraMode = True; + + if (inCur == 0) + { + if (p->packSize != 0) + return (ELzma2ParseStatus)LZMA_STATUS_NEEDS_MORE_INPUT; + } + else if (p->state == LZMA2_STATE_DATA) + { + p->state = LZMA2_STATE_DATA_CONT; + if (*src != 0) + { + // first byte of lzma chunk must be Zero + *srcLen += 1; + p->packSize--; + break; + } + } + + if (inCur > p->packSize) + inCur = (SizeT)p->packSize; + + src += inCur; + *srcLen += inCur; + p->packSize -= (UInt32)inCur; + + if (p->packSize == 0) + { + SizeT rem = outSize; + if (rem > p->unpackSize) + rem = p->unpackSize; + p->decoder.dicPos += rem; + p->unpackSize -= (UInt32)rem; + outSize -= rem; + if (p->unpackSize == 0) + p->state = LZMA2_STATE_CONTROL; + } + } + } + } + + p->state = LZMA2_STATE_ERROR; + return (ELzma2ParseStatus)LZMA_STATUS_NOT_SPECIFIED; +} + + + + +SRes Lzma2Dec_DecodeToBuf(CLzma2Dec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) +{ + SizeT outSize = *destLen, inSize = *srcLen; + *srcLen = *destLen = 0; + + for (;;) + { + SizeT inCur = inSize, outCur, dicPos; + ELzmaFinishMode curFinishMode; + SRes res; + + if (p->decoder.dicPos == p->decoder.dicBufSize) + p->decoder.dicPos = 0; + dicPos = p->decoder.dicPos; + curFinishMode = LZMA_FINISH_ANY; + outCur = p->decoder.dicBufSize - dicPos; + + if (outCur >= outSize) + { + outCur = outSize; + curFinishMode = finishMode; + } + + res = Lzma2Dec_DecodeToDic(p, dicPos + outCur, src, &inCur, curFinishMode, status); + + src += inCur; + inSize -= inCur; + *srcLen += inCur; + outCur = p->decoder.dicPos - dicPos; + memcpy(dest, p->decoder.dic + dicPos, outCur); + dest += outCur; + outSize -= outCur; + *destLen += outCur; + if (res != 0) + return res; + if (outCur == 0 || outSize == 0) + return SZ_OK; + } +} + + +SRes Lzma2Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAllocPtr alloc) +{ + CLzma2Dec p; + SRes res; + SizeT outSize = *destLen, inSize = *srcLen; + *destLen = *srcLen = 0; + *status = LZMA_STATUS_NOT_SPECIFIED; + Lzma2Dec_Construct(&p); + RINOK(Lzma2Dec_AllocateProbs(&p, prop, alloc)); + p.decoder.dic = dest; + p.decoder.dicBufSize = outSize; + Lzma2Dec_Init(&p); + *srcLen = inSize; + res = Lzma2Dec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status); + *destLen = p.decoder.dicPos; + if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT) + res = SZ_ERROR_INPUT_EOF; + Lzma2Dec_FreeProbs(&p, alloc); + return res; +} diff --git a/deps/LZMA-SDK/C/Lzma2Dec.h b/deps/LZMA-SDK/C/Lzma2Dec.h index da5038725..b8ddeac89 100644 --- a/deps/LZMA-SDK/C/Lzma2Dec.h +++ b/deps/LZMA-SDK/C/Lzma2Dec.h @@ -1,120 +1,120 @@ -/* Lzma2Dec.h -- LZMA2 Decoder -2018-02-19 : Igor Pavlov : Public domain */ - -#ifndef __LZMA2_DEC_H -#define __LZMA2_DEC_H - -#include "LzmaDec.h" - -EXTERN_C_BEGIN - -/* ---------- State Interface ---------- */ - -typedef struct -{ - unsigned state; - Byte control; - Byte needInitLevel; - Byte isExtraMode; - Byte _pad_; - UInt32 packSize; - UInt32 unpackSize; - CLzmaDec decoder; -} CLzma2Dec; - -#define Lzma2Dec_Construct(p) LzmaDec_Construct(&(p)->decoder) -#define Lzma2Dec_FreeProbs(p, alloc) LzmaDec_FreeProbs(&(p)->decoder, alloc) -#define Lzma2Dec_Free(p, alloc) LzmaDec_Free(&(p)->decoder, alloc) - -SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc); -SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc); -void Lzma2Dec_Init(CLzma2Dec *p); - -/* -finishMode: - It has meaning only if the decoding reaches output limit (*destLen or dicLimit). - LZMA_FINISH_ANY - use smallest number of input bytes - LZMA_FINISH_END - read EndOfStream marker after decoding - -Returns: - SZ_OK - status: - LZMA_STATUS_FINISHED_WITH_MARK - LZMA_STATUS_NOT_FINISHED - LZMA_STATUS_NEEDS_MORE_INPUT - SZ_ERROR_DATA - Data error -*/ - -SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit, - const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); - -SRes Lzma2Dec_DecodeToBuf(CLzma2Dec *p, Byte *dest, SizeT *destLen, - const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); - - -/* ---------- LZMA2 block and chunk parsing ---------- */ - -/* -Lzma2Dec_Parse() parses compressed data stream up to next independent block or next chunk data. -It can return LZMA_STATUS_* code or LZMA2_PARSE_STATUS_* code: - - LZMA2_PARSE_STATUS_NEW_BLOCK - there is new block, and 1 additional byte (control byte of next block header) was read from input. - - LZMA2_PARSE_STATUS_NEW_CHUNK - there is new chunk, and only lzma2 header of new chunk was read. - CLzma2Dec::unpackSize contains unpack size of that chunk -*/ - -typedef enum -{ -/* - LZMA_STATUS_NOT_SPECIFIED // data error - LZMA_STATUS_FINISHED_WITH_MARK - LZMA_STATUS_NOT_FINISHED // - LZMA_STATUS_NEEDS_MORE_INPUT - LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK // unused -*/ - LZMA2_PARSE_STATUS_NEW_BLOCK = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + 1, - LZMA2_PARSE_STATUS_NEW_CHUNK -} ELzma2ParseStatus; - -ELzma2ParseStatus Lzma2Dec_Parse(CLzma2Dec *p, - SizeT outSize, // output size - const Byte *src, SizeT *srcLen, - int checkFinishBlock // set (checkFinishBlock = 1), if it must read full input data, if decoder.dicPos reaches blockMax position. - ); - -/* -LZMA2 parser doesn't decode LZMA chunks, so we must read - full input LZMA chunk to decode some part of LZMA chunk. - -Lzma2Dec_GetUnpackExtra() returns the value that shows - max possible number of output bytes that can be output by decoder - at current input positon. -*/ - -#define Lzma2Dec_GetUnpackExtra(p) ((p)->isExtraMode ? (p)->unpackSize : 0); - - -/* ---------- One Call Interface ---------- */ - -/* -finishMode: - It has meaning only if the decoding reaches output limit (*destLen). - LZMA_FINISH_ANY - use smallest number of input bytes - LZMA_FINISH_END - read EndOfStream marker after decoding - -Returns: - SZ_OK - status: - LZMA_STATUS_FINISHED_WITH_MARK - LZMA_STATUS_NOT_FINISHED - SZ_ERROR_DATA - Data error - SZ_ERROR_MEM - Memory allocation error - SZ_ERROR_UNSUPPORTED - Unsupported properties - SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). -*/ - -SRes Lzma2Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, - Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAllocPtr alloc); - -EXTERN_C_END - -#endif +/* Lzma2Dec.h -- LZMA2 Decoder +2018-02-19 : Igor Pavlov : Public domain */ + +#ifndef __LZMA2_DEC_H +#define __LZMA2_DEC_H + +#include "LzmaDec.h" + +EXTERN_C_BEGIN + +/* ---------- State Interface ---------- */ + +typedef struct +{ + unsigned state; + Byte control; + Byte needInitLevel; + Byte isExtraMode; + Byte _pad_; + UInt32 packSize; + UInt32 unpackSize; + CLzmaDec decoder; +} CLzma2Dec; + +#define Lzma2Dec_Construct(p) LzmaDec_Construct(&(p)->decoder) +#define Lzma2Dec_FreeProbs(p, alloc) LzmaDec_FreeProbs(&(p)->decoder, alloc) +#define Lzma2Dec_Free(p, alloc) LzmaDec_Free(&(p)->decoder, alloc) + +SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc); +SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAllocPtr alloc); +void Lzma2Dec_Init(CLzma2Dec *p); + +/* +finishMode: + It has meaning only if the decoding reaches output limit (*destLen or dicLimit). + LZMA_FINISH_ANY - use smallest number of input bytes + LZMA_FINISH_END - read EndOfStream marker after decoding + +Returns: + SZ_OK + status: + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED + LZMA_STATUS_NEEDS_MORE_INPUT + SZ_ERROR_DATA - Data error +*/ + +SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); + +SRes Lzma2Dec_DecodeToBuf(CLzma2Dec *p, Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); + + +/* ---------- LZMA2 block and chunk parsing ---------- */ + +/* +Lzma2Dec_Parse() parses compressed data stream up to next independent block or next chunk data. +It can return LZMA_STATUS_* code or LZMA2_PARSE_STATUS_* code: + - LZMA2_PARSE_STATUS_NEW_BLOCK - there is new block, and 1 additional byte (control byte of next block header) was read from input. + - LZMA2_PARSE_STATUS_NEW_CHUNK - there is new chunk, and only lzma2 header of new chunk was read. + CLzma2Dec::unpackSize contains unpack size of that chunk +*/ + +typedef enum +{ +/* + LZMA_STATUS_NOT_SPECIFIED // data error + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED // + LZMA_STATUS_NEEDS_MORE_INPUT + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK // unused +*/ + LZMA2_PARSE_STATUS_NEW_BLOCK = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + 1, + LZMA2_PARSE_STATUS_NEW_CHUNK +} ELzma2ParseStatus; + +ELzma2ParseStatus Lzma2Dec_Parse(CLzma2Dec *p, + SizeT outSize, // output size + const Byte *src, SizeT *srcLen, + int checkFinishBlock // set (checkFinishBlock = 1), if it must read full input data, if decoder.dicPos reaches blockMax position. + ); + +/* +LZMA2 parser doesn't decode LZMA chunks, so we must read + full input LZMA chunk to decode some part of LZMA chunk. + +Lzma2Dec_GetUnpackExtra() returns the value that shows + max possible number of output bytes that can be output by decoder + at current input positon. +*/ + +#define Lzma2Dec_GetUnpackExtra(p) ((p)->isExtraMode ? (p)->unpackSize : 0); + + +/* ---------- One Call Interface ---------- */ + +/* +finishMode: + It has meaning only if the decoding reaches output limit (*destLen). + LZMA_FINISH_ANY - use smallest number of input bytes + LZMA_FINISH_END - read EndOfStream marker after decoding + +Returns: + SZ_OK + status: + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED + SZ_ERROR_DATA - Data error + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_UNSUPPORTED - Unsupported properties + SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). +*/ + +SRes Lzma2Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAllocPtr alloc); + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/Lzma2DecMt.c b/deps/LZMA-SDK/C/Lzma2DecMt.c index 252b5be49..9f1dc52ba 100644 --- a/deps/LZMA-SDK/C/Lzma2DecMt.c +++ b/deps/LZMA-SDK/C/Lzma2DecMt.c @@ -1,1090 +1,1090 @@ -/* Lzma2DecMt.c -- LZMA2 Decoder Multi-thread -2021-04-01 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -// #define SHOW_DEBUG_INFO - -// #define _7ZIP_ST - -#ifdef SHOW_DEBUG_INFO -#include -#endif - -#ifndef _7ZIP_ST -#ifdef SHOW_DEBUG_INFO -#define PRF(x) x -#else -#define PRF(x) -#endif -#define PRF_STR(s) PRF(printf("\n" s "\n")) -#define PRF_STR_INT_2(s, d1, d2) PRF(printf("\n" s " %d %d\n", (unsigned)d1, (unsigned)d2)) -#endif - -#include "Alloc.h" - -#include "Lzma2Dec.h" -#include "Lzma2DecMt.h" - -#ifndef _7ZIP_ST -#include "MtDec.h" - -#define LZMA2DECMT_OUT_BLOCK_MAX_DEFAULT (1 << 28) -#endif - - -void Lzma2DecMtProps_Init(CLzma2DecMtProps *p) -{ - p->inBufSize_ST = 1 << 20; - p->outStep_ST = 1 << 20; - - #ifndef _7ZIP_ST - p->numThreads = 1; - p->inBufSize_MT = 1 << 18; - p->outBlockMax = LZMA2DECMT_OUT_BLOCK_MAX_DEFAULT; - p->inBlockMax = p->outBlockMax + p->outBlockMax / 16; - #endif -} - - - -#ifndef _7ZIP_ST - -/* ---------- CLzma2DecMtThread ---------- */ - -typedef struct -{ - CLzma2Dec dec; - Byte dec_created; - Byte needInit; - - Byte *outBuf; - size_t outBufSize; - - EMtDecParseState state; - ELzma2ParseStatus parseStatus; - - size_t inPreSize; - size_t outPreSize; - - size_t inCodeSize; - size_t outCodeSize; - SRes codeRes; - - CAlignOffsetAlloc alloc; - - Byte mtPad[1 << 7]; -} CLzma2DecMtThread; - -#endif - - -/* ---------- CLzma2DecMt ---------- */ - -typedef struct -{ - // ISzAllocPtr alloc; - ISzAllocPtr allocMid; - - CAlignOffsetAlloc alignOffsetAlloc; - CLzma2DecMtProps props; - Byte prop; - - ISeqInStream *inStream; - ISeqOutStream *outStream; - ICompressProgress *progress; - - BoolInt finishMode; - BoolInt outSize_Defined; - UInt64 outSize; - - UInt64 outProcessed; - UInt64 inProcessed; - BoolInt readWasFinished; - SRes readRes; - - Byte *inBuf; - size_t inBufSize; - Byte dec_created; - CLzma2Dec dec; - - size_t inPos; - size_t inLim; - - #ifndef _7ZIP_ST - UInt64 outProcessed_Parse; - BoolInt mtc_WasConstructed; - CMtDec mtc; - CLzma2DecMtThread coders[MTDEC__THREADS_MAX]; - #endif - -} CLzma2DecMt; - - - -CLzma2DecMtHandle Lzma2DecMt_Create(ISzAllocPtr alloc, ISzAllocPtr allocMid) -{ - CLzma2DecMt *p = (CLzma2DecMt *)ISzAlloc_Alloc(alloc, sizeof(CLzma2DecMt)); - if (!p) - return NULL; - - // p->alloc = alloc; - p->allocMid = allocMid; - - AlignOffsetAlloc_CreateVTable(&p->alignOffsetAlloc); - p->alignOffsetAlloc.numAlignBits = 7; - p->alignOffsetAlloc.offset = 0; - p->alignOffsetAlloc.baseAlloc = alloc; - - p->inBuf = NULL; - p->inBufSize = 0; - p->dec_created = False; - - // Lzma2DecMtProps_Init(&p->props); - - #ifndef _7ZIP_ST - p->mtc_WasConstructed = False; - { - unsigned i; - for (i = 0; i < MTDEC__THREADS_MAX; i++) - { - CLzma2DecMtThread *t = &p->coders[i]; - t->dec_created = False; - t->outBuf = NULL; - t->outBufSize = 0; - } - } - #endif - - return p; -} - - -#ifndef _7ZIP_ST - -static void Lzma2DecMt_FreeOutBufs(CLzma2DecMt *p) -{ - unsigned i; - for (i = 0; i < MTDEC__THREADS_MAX; i++) - { - CLzma2DecMtThread *t = &p->coders[i]; - if (t->outBuf) - { - ISzAlloc_Free(p->allocMid, t->outBuf); - t->outBuf = NULL; - t->outBufSize = 0; - } - } -} - -#endif - - -static void Lzma2DecMt_FreeSt(CLzma2DecMt *p) -{ - if (p->dec_created) - { - Lzma2Dec_Free(&p->dec, &p->alignOffsetAlloc.vt); - p->dec_created = False; - } - if (p->inBuf) - { - ISzAlloc_Free(p->allocMid, p->inBuf); - p->inBuf = NULL; - } - p->inBufSize = 0; -} - - -void Lzma2DecMt_Destroy(CLzma2DecMtHandle pp) -{ - CLzma2DecMt *p = (CLzma2DecMt *)pp; - - Lzma2DecMt_FreeSt(p); - - #ifndef _7ZIP_ST - - if (p->mtc_WasConstructed) - { - MtDec_Destruct(&p->mtc); - p->mtc_WasConstructed = False; - } - { - unsigned i; - for (i = 0; i < MTDEC__THREADS_MAX; i++) - { - CLzma2DecMtThread *t = &p->coders[i]; - if (t->dec_created) - { - // we don't need to free dict here - Lzma2Dec_FreeProbs(&t->dec, &t->alloc.vt); // p->alloc !!! - t->dec_created = False; - } - } - } - Lzma2DecMt_FreeOutBufs(p); - - #endif - - ISzAlloc_Free(p->alignOffsetAlloc.baseAlloc, pp); -} - - - -#ifndef _7ZIP_ST - -static void Lzma2DecMt_MtCallback_Parse(void *obj, unsigned coderIndex, CMtDecCallbackInfo *cc) -{ - CLzma2DecMt *me = (CLzma2DecMt *)obj; - CLzma2DecMtThread *t = &me->coders[coderIndex]; - - PRF_STR_INT_2("Parse", coderIndex, cc->srcSize); - - cc->state = MTDEC_PARSE_CONTINUE; - - if (cc->startCall) - { - if (!t->dec_created) - { - Lzma2Dec_Construct(&t->dec); - t->dec_created = True; - AlignOffsetAlloc_CreateVTable(&t->alloc); - { - /* (1 << 12) is expected size of one way in data cache. - We optimize alignment for cache line size of 128 bytes and smaller */ - const unsigned kNumAlignBits = 12; - const unsigned kNumCacheLineBits = 7; /* <= kNumAlignBits */ - t->alloc.numAlignBits = kNumAlignBits; - t->alloc.offset = ((UInt32)coderIndex * (((unsigned)1 << 11) + (1 << 8) + (1 << 6))) & (((unsigned)1 << kNumAlignBits) - ((unsigned)1 << kNumCacheLineBits)); - t->alloc.baseAlloc = me->alignOffsetAlloc.baseAlloc; - } - } - Lzma2Dec_Init(&t->dec); - - t->inPreSize = 0; - t->outPreSize = 0; - // t->blockWasFinished = False; - // t->finishedWithMark = False; - t->parseStatus = (ELzma2ParseStatus)LZMA_STATUS_NOT_SPECIFIED; - t->state = MTDEC_PARSE_CONTINUE; - - t->inCodeSize = 0; - t->outCodeSize = 0; - t->codeRes = SZ_OK; - - // (cc->srcSize == 0) is allowed - } - - { - ELzma2ParseStatus status; - BoolInt overflow; - UInt32 unpackRem = 0; - - int checkFinishBlock = True; - size_t limit = me->props.outBlockMax; - if (me->outSize_Defined) - { - UInt64 rem = me->outSize - me->outProcessed_Parse; - if (limit >= rem) - { - limit = (size_t)rem; - if (!me->finishMode) - checkFinishBlock = False; - } - } - - // checkFinishBlock = False, if we want to decode partial data - // that must be finished at position <= outBlockMax. - - { - const SizeT srcOrig = cc->srcSize; - SizeT srcSize_Point = 0; - SizeT dicPos_Point = 0; - - cc->srcSize = 0; - overflow = False; - - for (;;) - { - SizeT srcCur = srcOrig - cc->srcSize; - - status = Lzma2Dec_Parse(&t->dec, - limit - t->dec.decoder.dicPos, - cc->src + cc->srcSize, &srcCur, - checkFinishBlock); - - cc->srcSize += srcCur; - - if (status == LZMA2_PARSE_STATUS_NEW_CHUNK) - { - if (t->dec.unpackSize > me->props.outBlockMax - t->dec.decoder.dicPos) - { - overflow = True; - break; - } - continue; - } - - if (status == LZMA2_PARSE_STATUS_NEW_BLOCK) - { - if (t->dec.decoder.dicPos == 0) - continue; - // we decode small blocks in one thread - if (t->dec.decoder.dicPos >= (1 << 14)) - break; - dicPos_Point = t->dec.decoder.dicPos; - srcSize_Point = cc->srcSize; - continue; - } - - if ((int)status == LZMA_STATUS_NOT_FINISHED && checkFinishBlock - // && limit == t->dec.decoder.dicPos - // && limit == me->props.outBlockMax - ) - { - overflow = True; - break; - } - - unpackRem = Lzma2Dec_GetUnpackExtra(&t->dec); - break; - } - - if (dicPos_Point != 0 - && (int)status != LZMA2_PARSE_STATUS_NEW_BLOCK - && (int)status != LZMA_STATUS_FINISHED_WITH_MARK - && (int)status != LZMA_STATUS_NOT_SPECIFIED) - { - // we revert to latest newBlock state - status = LZMA2_PARSE_STATUS_NEW_BLOCK; - unpackRem = 0; - t->dec.decoder.dicPos = dicPos_Point; - cc->srcSize = srcSize_Point; - overflow = False; - } - } - - t->inPreSize += cc->srcSize; - t->parseStatus = status; - - if (overflow) - cc->state = MTDEC_PARSE_OVERFLOW; - else - { - size_t dicPos = t->dec.decoder.dicPos; - - if ((int)status != LZMA_STATUS_NEEDS_MORE_INPUT) - { - if (status == LZMA2_PARSE_STATUS_NEW_BLOCK) - { - cc->state = MTDEC_PARSE_NEW; - cc->srcSize--; // we don't need control byte of next block - t->inPreSize--; - } - else - { - cc->state = MTDEC_PARSE_END; - if ((int)status != LZMA_STATUS_FINISHED_WITH_MARK) - { - // (status == LZMA_STATUS_NOT_SPECIFIED) - // (status == LZMA_STATUS_NOT_FINISHED) - if (unpackRem != 0) - { - /* we also reserve space for max possible number of output bytes of current LZMA chunk */ - SizeT rem = limit - dicPos; - if (rem > unpackRem) - rem = unpackRem; - dicPos += rem; - } - } - } - - me->outProcessed_Parse += dicPos; - } - - cc->outPos = dicPos; - t->outPreSize = (size_t)dicPos; - } - - t->state = cc->state; - return; - } -} - - -static SRes Lzma2DecMt_MtCallback_PreCode(void *pp, unsigned coderIndex) -{ - CLzma2DecMt *me = (CLzma2DecMt *)pp; - CLzma2DecMtThread *t = &me->coders[coderIndex]; - Byte *dest = t->outBuf; - - if (t->inPreSize == 0) - { - t->codeRes = SZ_ERROR_DATA; - return t->codeRes; - } - - if (!dest || t->outBufSize < t->outPreSize) - { - if (dest) - { - ISzAlloc_Free(me->allocMid, dest); - t->outBuf = NULL; - t->outBufSize = 0; - } - - dest = (Byte *)ISzAlloc_Alloc(me->allocMid, t->outPreSize - // + (1 << 28) - ); - // Sleep(200); - if (!dest) - return SZ_ERROR_MEM; - t->outBuf = dest; - t->outBufSize = t->outPreSize; - } - - t->dec.decoder.dic = dest; - t->dec.decoder.dicBufSize = t->outPreSize; - - t->needInit = True; - - return Lzma2Dec_AllocateProbs(&t->dec, me->prop, &t->alloc.vt); // alloc.vt -} - - -static SRes Lzma2DecMt_MtCallback_Code(void *pp, unsigned coderIndex, - const Byte *src, size_t srcSize, int srcFinished, - // int finished, int blockFinished, - UInt64 *inCodePos, UInt64 *outCodePos, int *stop) -{ - CLzma2DecMt *me = (CLzma2DecMt *)pp; - CLzma2DecMtThread *t = &me->coders[coderIndex]; - - UNUSED_VAR(srcFinished) - - PRF_STR_INT_2("Code", coderIndex, srcSize); - - *inCodePos = t->inCodeSize; - *outCodePos = 0; - *stop = True; - - if (t->needInit) - { - Lzma2Dec_Init(&t->dec); - t->needInit = False; - } - - { - ELzmaStatus status; - size_t srcProcessed = srcSize; - BoolInt blockWasFinished = - ((int)t->parseStatus == LZMA_STATUS_FINISHED_WITH_MARK - || t->parseStatus == LZMA2_PARSE_STATUS_NEW_BLOCK); - - SRes res = Lzma2Dec_DecodeToDic(&t->dec, - t->outPreSize, - src, &srcProcessed, - blockWasFinished ? LZMA_FINISH_END : LZMA_FINISH_ANY, - &status); - - t->codeRes = res; - - t->inCodeSize += srcProcessed; - *inCodePos = t->inCodeSize; - t->outCodeSize = t->dec.decoder.dicPos; - *outCodePos = t->dec.decoder.dicPos; - - if (res != SZ_OK) - return res; - - if (srcProcessed == srcSize) - *stop = False; - - if (blockWasFinished) - { - if (srcSize != srcProcessed) - return SZ_ERROR_FAIL; - - if (t->inPreSize == t->inCodeSize) - { - if (t->outPreSize != t->outCodeSize) - return SZ_ERROR_FAIL; - *stop = True; - } - } - else - { - if (t->outPreSize == t->outCodeSize) - *stop = True; - } - - return SZ_OK; - } -} - - -#define LZMA2DECMT_STREAM_WRITE_STEP (1 << 24) - -static SRes Lzma2DecMt_MtCallback_Write(void *pp, unsigned coderIndex, - BoolInt needWriteToStream, - const Byte *src, size_t srcSize, BoolInt isCross, - BoolInt *needContinue, BoolInt *canRecode) -{ - CLzma2DecMt *me = (CLzma2DecMt *)pp; - const CLzma2DecMtThread *t = &me->coders[coderIndex]; - size_t size = t->outCodeSize; - const Byte *data = t->outBuf; - BoolInt needContinue2 = True; - - UNUSED_VAR(src) - UNUSED_VAR(srcSize) - UNUSED_VAR(isCross) - - PRF_STR_INT_2("Write", coderIndex, srcSize); - - *needContinue = False; - *canRecode = True; - - if ( - // t->parseStatus == LZMA_STATUS_FINISHED_WITH_MARK - t->state == MTDEC_PARSE_OVERFLOW - || t->state == MTDEC_PARSE_END) - needContinue2 = False; - - - if (!needWriteToStream) - return SZ_OK; - - me->mtc.inProcessed += t->inCodeSize; - - if (t->codeRes == SZ_OK) - if ((int)t->parseStatus == LZMA_STATUS_FINISHED_WITH_MARK - || t->parseStatus == LZMA2_PARSE_STATUS_NEW_BLOCK) - if (t->outPreSize != t->outCodeSize - || t->inPreSize != t->inCodeSize) - return SZ_ERROR_FAIL; - - *canRecode = False; - - if (me->outStream) - { - for (;;) - { - size_t cur = size; - size_t written; - if (cur > LZMA2DECMT_STREAM_WRITE_STEP) - cur = LZMA2DECMT_STREAM_WRITE_STEP; - - written = ISeqOutStream_Write(me->outStream, data, cur); - - me->outProcessed += written; - // me->mtc.writtenTotal += written; - if (written != cur) - return SZ_ERROR_WRITE; - data += cur; - size -= cur; - if (size == 0) - { - *needContinue = needContinue2; - return SZ_OK; - } - RINOK(MtProgress_ProgressAdd(&me->mtc.mtProgress, 0, 0)); - } - } - - return SZ_ERROR_FAIL; - /* - if (size > me->outBufSize) - return SZ_ERROR_OUTPUT_EOF; - memcpy(me->outBuf, data, size); - me->outBufSize -= size; - me->outBuf += size; - *needContinue = needContinue2; - return SZ_OK; - */ -} - -#endif - - -static SRes Lzma2Dec_Prepare_ST(CLzma2DecMt *p) -{ - if (!p->dec_created) - { - Lzma2Dec_Construct(&p->dec); - p->dec_created = True; - } - - RINOK(Lzma2Dec_Allocate(&p->dec, p->prop, &p->alignOffsetAlloc.vt)); - - if (!p->inBuf || p->inBufSize != p->props.inBufSize_ST) - { - ISzAlloc_Free(p->allocMid, p->inBuf); - p->inBufSize = 0; - p->inBuf = (Byte *)ISzAlloc_Alloc(p->allocMid, p->props.inBufSize_ST); - if (!p->inBuf) - return SZ_ERROR_MEM; - p->inBufSize = p->props.inBufSize_ST; - } - - Lzma2Dec_Init(&p->dec); - - return SZ_OK; -} - - -static SRes Lzma2Dec_Decode_ST(CLzma2DecMt *p - #ifndef _7ZIP_ST - , BoolInt tMode - #endif - ) -{ - SizeT wrPos; - size_t inPos, inLim; - const Byte *inData; - UInt64 inPrev, outPrev; - - CLzma2Dec *dec; - - #ifndef _7ZIP_ST - if (tMode) - { - Lzma2DecMt_FreeOutBufs(p); - tMode = MtDec_PrepareRead(&p->mtc); - } - #endif - - RINOK(Lzma2Dec_Prepare_ST(p)); - - dec = &p->dec; - - inPrev = p->inProcessed; - outPrev = p->outProcessed; - - inPos = 0; - inLim = 0; - inData = NULL; - wrPos = dec->decoder.dicPos; - - for (;;) - { - SizeT dicPos; - SizeT size; - ELzmaFinishMode finishMode; - SizeT inProcessed; - ELzmaStatus status; - SRes res; - - SizeT outProcessed; - BoolInt outFinished; - BoolInt needStop; - - if (inPos == inLim) - { - #ifndef _7ZIP_ST - if (tMode) - { - inData = MtDec_Read(&p->mtc, &inLim); - inPos = 0; - if (inData) - continue; - tMode = False; - inLim = 0; - } - #endif - - if (!p->readWasFinished) - { - inPos = 0; - inLim = p->inBufSize; - inData = p->inBuf; - p->readRes = ISeqInStream_Read(p->inStream, (void *)(p->inBuf), &inLim); - // p->readProcessed += inLim; - // inLim -= 5; p->readWasFinished = True; // for test - if (inLim == 0 || p->readRes != SZ_OK) - p->readWasFinished = True; - } - } - - dicPos = dec->decoder.dicPos; - { - SizeT next = dec->decoder.dicBufSize; - if (next - wrPos > p->props.outStep_ST) - next = wrPos + p->props.outStep_ST; - size = next - dicPos; - } - - finishMode = LZMA_FINISH_ANY; - if (p->outSize_Defined) - { - const UInt64 rem = p->outSize - p->outProcessed; - if (size >= rem) - { - size = (SizeT)rem; - if (p->finishMode) - finishMode = LZMA_FINISH_END; - } - } - - inProcessed = inLim - inPos; - - res = Lzma2Dec_DecodeToDic(dec, dicPos + size, inData + inPos, &inProcessed, finishMode, &status); - - inPos += inProcessed; - p->inProcessed += inProcessed; - outProcessed = dec->decoder.dicPos - dicPos; - p->outProcessed += outProcessed; - - outFinished = (p->outSize_Defined && p->outSize <= p->outProcessed); - - needStop = (res != SZ_OK - || (inProcessed == 0 && outProcessed == 0) - || status == LZMA_STATUS_FINISHED_WITH_MARK - || (!p->finishMode && outFinished)); - - if (needStop || outProcessed >= size) - { - SRes res2; - { - size_t writeSize = dec->decoder.dicPos - wrPos; - size_t written = ISeqOutStream_Write(p->outStream, dec->decoder.dic + wrPos, writeSize); - res2 = (written == writeSize) ? SZ_OK : SZ_ERROR_WRITE; - } - - if (dec->decoder.dicPos == dec->decoder.dicBufSize) - dec->decoder.dicPos = 0; - wrPos = dec->decoder.dicPos; - - RINOK(res2); - - if (needStop) - { - if (res != SZ_OK) - return res; - - if (status == LZMA_STATUS_FINISHED_WITH_MARK) - { - if (p->finishMode) - { - if (p->outSize_Defined && p->outSize != p->outProcessed) - return SZ_ERROR_DATA; - } - return SZ_OK; - } - - if (!p->finishMode && outFinished) - return SZ_OK; - - if (status == LZMA_STATUS_NEEDS_MORE_INPUT) - return SZ_ERROR_INPUT_EOF; - - return SZ_ERROR_DATA; - } - } - - if (p->progress) - { - UInt64 inDelta = p->inProcessed - inPrev; - UInt64 outDelta = p->outProcessed - outPrev; - if (inDelta >= (1 << 22) || outDelta >= (1 << 22)) - { - RINOK(ICompressProgress_Progress(p->progress, p->inProcessed, p->outProcessed)); - inPrev = p->inProcessed; - outPrev = p->outProcessed; - } - } - } -} - - - -SRes Lzma2DecMt_Decode(CLzma2DecMtHandle pp, - Byte prop, - const CLzma2DecMtProps *props, - ISeqOutStream *outStream, const UInt64 *outDataSize, int finishMode, - // Byte *outBuf, size_t *outBufSize, - ISeqInStream *inStream, - // const Byte *inData, size_t inDataSize, - UInt64 *inProcessed, - // UInt64 *outProcessed, - int *isMT, - ICompressProgress *progress) -{ - CLzma2DecMt *p = (CLzma2DecMt *)pp; - #ifndef _7ZIP_ST - BoolInt tMode; - #endif - - *inProcessed = 0; - - if (prop > 40) - return SZ_ERROR_UNSUPPORTED; - - p->prop = prop; - p->props = *props; - - p->inStream = inStream; - p->outStream = outStream; - p->progress = progress; - - p->outSize = 0; - p->outSize_Defined = False; - if (outDataSize) - { - p->outSize_Defined = True; - p->outSize = *outDataSize; - } - p->finishMode = finishMode; - - p->outProcessed = 0; - p->inProcessed = 0; - - p->readWasFinished = False; - p->readRes = SZ_OK; - - *isMT = False; - - - #ifndef _7ZIP_ST - - tMode = False; - - // p->mtc.parseRes = SZ_OK; - - // p->mtc.numFilledThreads = 0; - // p->mtc.crossStart = 0; - // p->mtc.crossEnd = 0; - // p->mtc.allocError_for_Read_BlockIndex = 0; - // p->mtc.isAllocError = False; - - if (p->props.numThreads > 1) - { - IMtDecCallback2 vt; - - Lzma2DecMt_FreeSt(p); - - p->outProcessed_Parse = 0; - - if (!p->mtc_WasConstructed) - { - p->mtc_WasConstructed = True; - MtDec_Construct(&p->mtc); - } - - p->mtc.progress = progress; - p->mtc.inStream = inStream; - - // p->outBuf = NULL; - // p->outBufSize = 0; - /* - if (!outStream) - { - // p->outBuf = outBuf; - // p->outBufSize = *outBufSize; - // *outBufSize = 0; - return SZ_ERROR_PARAM; - } - */ - - // p->mtc.inBlockMax = p->props.inBlockMax; - p->mtc.alloc = &p->alignOffsetAlloc.vt; - // p->alignOffsetAlloc.baseAlloc; - // p->mtc.inData = inData; - // p->mtc.inDataSize = inDataSize; - p->mtc.mtCallback = &vt; - p->mtc.mtCallbackObject = p; - - p->mtc.inBufSize = p->props.inBufSize_MT; - - p->mtc.numThreadsMax = p->props.numThreads; - - *isMT = True; - - vt.Parse = Lzma2DecMt_MtCallback_Parse; - vt.PreCode = Lzma2DecMt_MtCallback_PreCode; - vt.Code = Lzma2DecMt_MtCallback_Code; - vt.Write = Lzma2DecMt_MtCallback_Write; - - { - BoolInt needContinue = False; - - SRes res = MtDec_Code(&p->mtc); - - /* - if (!outStream) - *outBufSize = p->outBuf - outBuf; - */ - - *inProcessed = p->mtc.inProcessed; - - needContinue = False; - - if (res == SZ_OK) - { - if (p->mtc.mtProgress.res != SZ_OK) - res = p->mtc.mtProgress.res; - else - needContinue = p->mtc.needContinue; - } - - if (!needContinue) - { - if (res == SZ_OK) - return p->mtc.readRes; - return res; - } - - tMode = True; - p->readRes = p->mtc.readRes; - p->readWasFinished = p->mtc.readWasFinished; - p->inProcessed = p->mtc.inProcessed; - - PRF_STR("----- decoding ST -----"); - } - } - - #endif - - - *isMT = False; - - { - SRes res = Lzma2Dec_Decode_ST(p - #ifndef _7ZIP_ST - , tMode - #endif - ); - - *inProcessed = p->inProcessed; - - // res = SZ_OK; // for test - if (res == SZ_ERROR_INPUT_EOF) - { - if (p->readRes != SZ_OK) - res = p->readRes; - } - else if (res == SZ_OK && p->readRes != SZ_OK) - res = p->readRes; - - /* - #ifndef _7ZIP_ST - if (res == SZ_OK && tMode && p->mtc.parseRes != SZ_OK) - res = p->mtc.parseRes; - #endif - */ - - return res; - } -} - - -/* ---------- Read from CLzma2DecMtHandle Interface ---------- */ - -SRes Lzma2DecMt_Init(CLzma2DecMtHandle pp, - Byte prop, - const CLzma2DecMtProps *props, - const UInt64 *outDataSize, int finishMode, - ISeqInStream *inStream) -{ - CLzma2DecMt *p = (CLzma2DecMt *)pp; - - if (prop > 40) - return SZ_ERROR_UNSUPPORTED; - - p->prop = prop; - p->props = *props; - - p->inStream = inStream; - - p->outSize = 0; - p->outSize_Defined = False; - if (outDataSize) - { - p->outSize_Defined = True; - p->outSize = *outDataSize; - } - p->finishMode = finishMode; - - p->outProcessed = 0; - p->inProcessed = 0; - - p->inPos = 0; - p->inLim = 0; - - return Lzma2Dec_Prepare_ST(p); -} - - -SRes Lzma2DecMt_Read(CLzma2DecMtHandle pp, - Byte *data, size_t *outSize, - UInt64 *inStreamProcessed) -{ - CLzma2DecMt *p = (CLzma2DecMt *)pp; - ELzmaFinishMode finishMode; - SRes readRes; - size_t size = *outSize; - - *outSize = 0; - *inStreamProcessed = 0; - - finishMode = LZMA_FINISH_ANY; - if (p->outSize_Defined) - { - const UInt64 rem = p->outSize - p->outProcessed; - if (size >= rem) - { - size = (size_t)rem; - if (p->finishMode) - finishMode = LZMA_FINISH_END; - } - } - - readRes = SZ_OK; - - for (;;) - { - SizeT inCur; - SizeT outCur; - ELzmaStatus status; - SRes res; - - if (p->inPos == p->inLim && readRes == SZ_OK) - { - p->inPos = 0; - p->inLim = p->props.inBufSize_ST; - readRes = ISeqInStream_Read(p->inStream, p->inBuf, &p->inLim); - } - - inCur = p->inLim - p->inPos; - outCur = size; - - res = Lzma2Dec_DecodeToBuf(&p->dec, data, &outCur, - p->inBuf + p->inPos, &inCur, finishMode, &status); - - p->inPos += inCur; - p->inProcessed += inCur; - *inStreamProcessed += inCur; - p->outProcessed += outCur; - *outSize += outCur; - size -= outCur; - data += outCur; - - if (res != 0) - return res; - - /* - if (status == LZMA_STATUS_FINISHED_WITH_MARK) - return readRes; - - if (size == 0 && status != LZMA_STATUS_NEEDS_MORE_INPUT) - { - if (p->finishMode && p->outSize_Defined && p->outProcessed >= p->outSize) - return SZ_ERROR_DATA; - return readRes; - } - */ - - if (inCur == 0 && outCur == 0) - return readRes; - } -} +/* Lzma2DecMt.c -- LZMA2 Decoder Multi-thread +2021-04-01 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +// #define SHOW_DEBUG_INFO + +// #define _7ZIP_ST + +#ifdef SHOW_DEBUG_INFO +#include +#endif + +#ifndef _7ZIP_ST +#ifdef SHOW_DEBUG_INFO +#define PRF(x) x +#else +#define PRF(x) +#endif +#define PRF_STR(s) PRF(printf("\n" s "\n")) +#define PRF_STR_INT_2(s, d1, d2) PRF(printf("\n" s " %d %d\n", (unsigned)d1, (unsigned)d2)) +#endif + +#include "Alloc.h" + +#include "Lzma2Dec.h" +#include "Lzma2DecMt.h" + +#ifndef _7ZIP_ST +#include "MtDec.h" + +#define LZMA2DECMT_OUT_BLOCK_MAX_DEFAULT (1 << 28) +#endif + + +void Lzma2DecMtProps_Init(CLzma2DecMtProps *p) +{ + p->inBufSize_ST = 1 << 20; + p->outStep_ST = 1 << 20; + + #ifndef _7ZIP_ST + p->numThreads = 1; + p->inBufSize_MT = 1 << 18; + p->outBlockMax = LZMA2DECMT_OUT_BLOCK_MAX_DEFAULT; + p->inBlockMax = p->outBlockMax + p->outBlockMax / 16; + #endif +} + + + +#ifndef _7ZIP_ST + +/* ---------- CLzma2DecMtThread ---------- */ + +typedef struct +{ + CLzma2Dec dec; + Byte dec_created; + Byte needInit; + + Byte *outBuf; + size_t outBufSize; + + EMtDecParseState state; + ELzma2ParseStatus parseStatus; + + size_t inPreSize; + size_t outPreSize; + + size_t inCodeSize; + size_t outCodeSize; + SRes codeRes; + + CAlignOffsetAlloc alloc; + + Byte mtPad[1 << 7]; +} CLzma2DecMtThread; + +#endif + + +/* ---------- CLzma2DecMt ---------- */ + +typedef struct +{ + // ISzAllocPtr alloc; + ISzAllocPtr allocMid; + + CAlignOffsetAlloc alignOffsetAlloc; + CLzma2DecMtProps props; + Byte prop; + + ISeqInStream *inStream; + ISeqOutStream *outStream; + ICompressProgress *progress; + + BoolInt finishMode; + BoolInt outSize_Defined; + UInt64 outSize; + + UInt64 outProcessed; + UInt64 inProcessed; + BoolInt readWasFinished; + SRes readRes; + + Byte *inBuf; + size_t inBufSize; + Byte dec_created; + CLzma2Dec dec; + + size_t inPos; + size_t inLim; + + #ifndef _7ZIP_ST + UInt64 outProcessed_Parse; + BoolInt mtc_WasConstructed; + CMtDec mtc; + CLzma2DecMtThread coders[MTDEC__THREADS_MAX]; + #endif + +} CLzma2DecMt; + + + +CLzma2DecMtHandle Lzma2DecMt_Create(ISzAllocPtr alloc, ISzAllocPtr allocMid) +{ + CLzma2DecMt *p = (CLzma2DecMt *)ISzAlloc_Alloc(alloc, sizeof(CLzma2DecMt)); + if (!p) + return NULL; + + // p->alloc = alloc; + p->allocMid = allocMid; + + AlignOffsetAlloc_CreateVTable(&p->alignOffsetAlloc); + p->alignOffsetAlloc.numAlignBits = 7; + p->alignOffsetAlloc.offset = 0; + p->alignOffsetAlloc.baseAlloc = alloc; + + p->inBuf = NULL; + p->inBufSize = 0; + p->dec_created = False; + + // Lzma2DecMtProps_Init(&p->props); + + #ifndef _7ZIP_ST + p->mtc_WasConstructed = False; + { + unsigned i; + for (i = 0; i < MTDEC__THREADS_MAX; i++) + { + CLzma2DecMtThread *t = &p->coders[i]; + t->dec_created = False; + t->outBuf = NULL; + t->outBufSize = 0; + } + } + #endif + + return p; +} + + +#ifndef _7ZIP_ST + +static void Lzma2DecMt_FreeOutBufs(CLzma2DecMt *p) +{ + unsigned i; + for (i = 0; i < MTDEC__THREADS_MAX; i++) + { + CLzma2DecMtThread *t = &p->coders[i]; + if (t->outBuf) + { + ISzAlloc_Free(p->allocMid, t->outBuf); + t->outBuf = NULL; + t->outBufSize = 0; + } + } +} + +#endif + + +static void Lzma2DecMt_FreeSt(CLzma2DecMt *p) +{ + if (p->dec_created) + { + Lzma2Dec_Free(&p->dec, &p->alignOffsetAlloc.vt); + p->dec_created = False; + } + if (p->inBuf) + { + ISzAlloc_Free(p->allocMid, p->inBuf); + p->inBuf = NULL; + } + p->inBufSize = 0; +} + + +void Lzma2DecMt_Destroy(CLzma2DecMtHandle pp) +{ + CLzma2DecMt *p = (CLzma2DecMt *)pp; + + Lzma2DecMt_FreeSt(p); + + #ifndef _7ZIP_ST + + if (p->mtc_WasConstructed) + { + MtDec_Destruct(&p->mtc); + p->mtc_WasConstructed = False; + } + { + unsigned i; + for (i = 0; i < MTDEC__THREADS_MAX; i++) + { + CLzma2DecMtThread *t = &p->coders[i]; + if (t->dec_created) + { + // we don't need to free dict here + Lzma2Dec_FreeProbs(&t->dec, &t->alloc.vt); // p->alloc !!! + t->dec_created = False; + } + } + } + Lzma2DecMt_FreeOutBufs(p); + + #endif + + ISzAlloc_Free(p->alignOffsetAlloc.baseAlloc, pp); +} + + + +#ifndef _7ZIP_ST + +static void Lzma2DecMt_MtCallback_Parse(void *obj, unsigned coderIndex, CMtDecCallbackInfo *cc) +{ + CLzma2DecMt *me = (CLzma2DecMt *)obj; + CLzma2DecMtThread *t = &me->coders[coderIndex]; + + PRF_STR_INT_2("Parse", coderIndex, cc->srcSize); + + cc->state = MTDEC_PARSE_CONTINUE; + + if (cc->startCall) + { + if (!t->dec_created) + { + Lzma2Dec_Construct(&t->dec); + t->dec_created = True; + AlignOffsetAlloc_CreateVTable(&t->alloc); + { + /* (1 << 12) is expected size of one way in data cache. + We optimize alignment for cache line size of 128 bytes and smaller */ + const unsigned kNumAlignBits = 12; + const unsigned kNumCacheLineBits = 7; /* <= kNumAlignBits */ + t->alloc.numAlignBits = kNumAlignBits; + t->alloc.offset = ((UInt32)coderIndex * (((unsigned)1 << 11) + (1 << 8) + (1 << 6))) & (((unsigned)1 << kNumAlignBits) - ((unsigned)1 << kNumCacheLineBits)); + t->alloc.baseAlloc = me->alignOffsetAlloc.baseAlloc; + } + } + Lzma2Dec_Init(&t->dec); + + t->inPreSize = 0; + t->outPreSize = 0; + // t->blockWasFinished = False; + // t->finishedWithMark = False; + t->parseStatus = (ELzma2ParseStatus)LZMA_STATUS_NOT_SPECIFIED; + t->state = MTDEC_PARSE_CONTINUE; + + t->inCodeSize = 0; + t->outCodeSize = 0; + t->codeRes = SZ_OK; + + // (cc->srcSize == 0) is allowed + } + + { + ELzma2ParseStatus status; + BoolInt overflow; + UInt32 unpackRem = 0; + + int checkFinishBlock = True; + size_t limit = me->props.outBlockMax; + if (me->outSize_Defined) + { + UInt64 rem = me->outSize - me->outProcessed_Parse; + if (limit >= rem) + { + limit = (size_t)rem; + if (!me->finishMode) + checkFinishBlock = False; + } + } + + // checkFinishBlock = False, if we want to decode partial data + // that must be finished at position <= outBlockMax. + + { + const SizeT srcOrig = cc->srcSize; + SizeT srcSize_Point = 0; + SizeT dicPos_Point = 0; + + cc->srcSize = 0; + overflow = False; + + for (;;) + { + SizeT srcCur = srcOrig - cc->srcSize; + + status = Lzma2Dec_Parse(&t->dec, + limit - t->dec.decoder.dicPos, + cc->src + cc->srcSize, &srcCur, + checkFinishBlock); + + cc->srcSize += srcCur; + + if (status == LZMA2_PARSE_STATUS_NEW_CHUNK) + { + if (t->dec.unpackSize > me->props.outBlockMax - t->dec.decoder.dicPos) + { + overflow = True; + break; + } + continue; + } + + if (status == LZMA2_PARSE_STATUS_NEW_BLOCK) + { + if (t->dec.decoder.dicPos == 0) + continue; + // we decode small blocks in one thread + if (t->dec.decoder.dicPos >= (1 << 14)) + break; + dicPos_Point = t->dec.decoder.dicPos; + srcSize_Point = cc->srcSize; + continue; + } + + if ((int)status == LZMA_STATUS_NOT_FINISHED && checkFinishBlock + // && limit == t->dec.decoder.dicPos + // && limit == me->props.outBlockMax + ) + { + overflow = True; + break; + } + + unpackRem = Lzma2Dec_GetUnpackExtra(&t->dec); + break; + } + + if (dicPos_Point != 0 + && (int)status != LZMA2_PARSE_STATUS_NEW_BLOCK + && (int)status != LZMA_STATUS_FINISHED_WITH_MARK + && (int)status != LZMA_STATUS_NOT_SPECIFIED) + { + // we revert to latest newBlock state + status = LZMA2_PARSE_STATUS_NEW_BLOCK; + unpackRem = 0; + t->dec.decoder.dicPos = dicPos_Point; + cc->srcSize = srcSize_Point; + overflow = False; + } + } + + t->inPreSize += cc->srcSize; + t->parseStatus = status; + + if (overflow) + cc->state = MTDEC_PARSE_OVERFLOW; + else + { + size_t dicPos = t->dec.decoder.dicPos; + + if ((int)status != LZMA_STATUS_NEEDS_MORE_INPUT) + { + if (status == LZMA2_PARSE_STATUS_NEW_BLOCK) + { + cc->state = MTDEC_PARSE_NEW; + cc->srcSize--; // we don't need control byte of next block + t->inPreSize--; + } + else + { + cc->state = MTDEC_PARSE_END; + if ((int)status != LZMA_STATUS_FINISHED_WITH_MARK) + { + // (status == LZMA_STATUS_NOT_SPECIFIED) + // (status == LZMA_STATUS_NOT_FINISHED) + if (unpackRem != 0) + { + /* we also reserve space for max possible number of output bytes of current LZMA chunk */ + SizeT rem = limit - dicPos; + if (rem > unpackRem) + rem = unpackRem; + dicPos += rem; + } + } + } + + me->outProcessed_Parse += dicPos; + } + + cc->outPos = dicPos; + t->outPreSize = (size_t)dicPos; + } + + t->state = cc->state; + return; + } +} + + +static SRes Lzma2DecMt_MtCallback_PreCode(void *pp, unsigned coderIndex) +{ + CLzma2DecMt *me = (CLzma2DecMt *)pp; + CLzma2DecMtThread *t = &me->coders[coderIndex]; + Byte *dest = t->outBuf; + + if (t->inPreSize == 0) + { + t->codeRes = SZ_ERROR_DATA; + return t->codeRes; + } + + if (!dest || t->outBufSize < t->outPreSize) + { + if (dest) + { + ISzAlloc_Free(me->allocMid, dest); + t->outBuf = NULL; + t->outBufSize = 0; + } + + dest = (Byte *)ISzAlloc_Alloc(me->allocMid, t->outPreSize + // + (1 << 28) + ); + // Sleep(200); + if (!dest) + return SZ_ERROR_MEM; + t->outBuf = dest; + t->outBufSize = t->outPreSize; + } + + t->dec.decoder.dic = dest; + t->dec.decoder.dicBufSize = t->outPreSize; + + t->needInit = True; + + return Lzma2Dec_AllocateProbs(&t->dec, me->prop, &t->alloc.vt); // alloc.vt +} + + +static SRes Lzma2DecMt_MtCallback_Code(void *pp, unsigned coderIndex, + const Byte *src, size_t srcSize, int srcFinished, + // int finished, int blockFinished, + UInt64 *inCodePos, UInt64 *outCodePos, int *stop) +{ + CLzma2DecMt *me = (CLzma2DecMt *)pp; + CLzma2DecMtThread *t = &me->coders[coderIndex]; + + UNUSED_VAR(srcFinished) + + PRF_STR_INT_2("Code", coderIndex, srcSize); + + *inCodePos = t->inCodeSize; + *outCodePos = 0; + *stop = True; + + if (t->needInit) + { + Lzma2Dec_Init(&t->dec); + t->needInit = False; + } + + { + ELzmaStatus status; + size_t srcProcessed = srcSize; + BoolInt blockWasFinished = + ((int)t->parseStatus == LZMA_STATUS_FINISHED_WITH_MARK + || t->parseStatus == LZMA2_PARSE_STATUS_NEW_BLOCK); + + SRes res = Lzma2Dec_DecodeToDic(&t->dec, + t->outPreSize, + src, &srcProcessed, + blockWasFinished ? LZMA_FINISH_END : LZMA_FINISH_ANY, + &status); + + t->codeRes = res; + + t->inCodeSize += srcProcessed; + *inCodePos = t->inCodeSize; + t->outCodeSize = t->dec.decoder.dicPos; + *outCodePos = t->dec.decoder.dicPos; + + if (res != SZ_OK) + return res; + + if (srcProcessed == srcSize) + *stop = False; + + if (blockWasFinished) + { + if (srcSize != srcProcessed) + return SZ_ERROR_FAIL; + + if (t->inPreSize == t->inCodeSize) + { + if (t->outPreSize != t->outCodeSize) + return SZ_ERROR_FAIL; + *stop = True; + } + } + else + { + if (t->outPreSize == t->outCodeSize) + *stop = True; + } + + return SZ_OK; + } +} + + +#define LZMA2DECMT_STREAM_WRITE_STEP (1 << 24) + +static SRes Lzma2DecMt_MtCallback_Write(void *pp, unsigned coderIndex, + BoolInt needWriteToStream, + const Byte *src, size_t srcSize, BoolInt isCross, + BoolInt *needContinue, BoolInt *canRecode) +{ + CLzma2DecMt *me = (CLzma2DecMt *)pp; + const CLzma2DecMtThread *t = &me->coders[coderIndex]; + size_t size = t->outCodeSize; + const Byte *data = t->outBuf; + BoolInt needContinue2 = True; + + UNUSED_VAR(src) + UNUSED_VAR(srcSize) + UNUSED_VAR(isCross) + + PRF_STR_INT_2("Write", coderIndex, srcSize); + + *needContinue = False; + *canRecode = True; + + if ( + // t->parseStatus == LZMA_STATUS_FINISHED_WITH_MARK + t->state == MTDEC_PARSE_OVERFLOW + || t->state == MTDEC_PARSE_END) + needContinue2 = False; + + + if (!needWriteToStream) + return SZ_OK; + + me->mtc.inProcessed += t->inCodeSize; + + if (t->codeRes == SZ_OK) + if ((int)t->parseStatus == LZMA_STATUS_FINISHED_WITH_MARK + || t->parseStatus == LZMA2_PARSE_STATUS_NEW_BLOCK) + if (t->outPreSize != t->outCodeSize + || t->inPreSize != t->inCodeSize) + return SZ_ERROR_FAIL; + + *canRecode = False; + + if (me->outStream) + { + for (;;) + { + size_t cur = size; + size_t written; + if (cur > LZMA2DECMT_STREAM_WRITE_STEP) + cur = LZMA2DECMT_STREAM_WRITE_STEP; + + written = ISeqOutStream_Write(me->outStream, data, cur); + + me->outProcessed += written; + // me->mtc.writtenTotal += written; + if (written != cur) + return SZ_ERROR_WRITE; + data += cur; + size -= cur; + if (size == 0) + { + *needContinue = needContinue2; + return SZ_OK; + } + RINOK(MtProgress_ProgressAdd(&me->mtc.mtProgress, 0, 0)); + } + } + + return SZ_ERROR_FAIL; + /* + if (size > me->outBufSize) + return SZ_ERROR_OUTPUT_EOF; + memcpy(me->outBuf, data, size); + me->outBufSize -= size; + me->outBuf += size; + *needContinue = needContinue2; + return SZ_OK; + */ +} + +#endif + + +static SRes Lzma2Dec_Prepare_ST(CLzma2DecMt *p) +{ + if (!p->dec_created) + { + Lzma2Dec_Construct(&p->dec); + p->dec_created = True; + } + + RINOK(Lzma2Dec_Allocate(&p->dec, p->prop, &p->alignOffsetAlloc.vt)); + + if (!p->inBuf || p->inBufSize != p->props.inBufSize_ST) + { + ISzAlloc_Free(p->allocMid, p->inBuf); + p->inBufSize = 0; + p->inBuf = (Byte *)ISzAlloc_Alloc(p->allocMid, p->props.inBufSize_ST); + if (!p->inBuf) + return SZ_ERROR_MEM; + p->inBufSize = p->props.inBufSize_ST; + } + + Lzma2Dec_Init(&p->dec); + + return SZ_OK; +} + + +static SRes Lzma2Dec_Decode_ST(CLzma2DecMt *p + #ifndef _7ZIP_ST + , BoolInt tMode + #endif + ) +{ + SizeT wrPos; + size_t inPos, inLim; + const Byte *inData; + UInt64 inPrev, outPrev; + + CLzma2Dec *dec; + + #ifndef _7ZIP_ST + if (tMode) + { + Lzma2DecMt_FreeOutBufs(p); + tMode = MtDec_PrepareRead(&p->mtc); + } + #endif + + RINOK(Lzma2Dec_Prepare_ST(p)); + + dec = &p->dec; + + inPrev = p->inProcessed; + outPrev = p->outProcessed; + + inPos = 0; + inLim = 0; + inData = NULL; + wrPos = dec->decoder.dicPos; + + for (;;) + { + SizeT dicPos; + SizeT size; + ELzmaFinishMode finishMode; + SizeT inProcessed; + ELzmaStatus status; + SRes res; + + SizeT outProcessed; + BoolInt outFinished; + BoolInt needStop; + + if (inPos == inLim) + { + #ifndef _7ZIP_ST + if (tMode) + { + inData = MtDec_Read(&p->mtc, &inLim); + inPos = 0; + if (inData) + continue; + tMode = False; + inLim = 0; + } + #endif + + if (!p->readWasFinished) + { + inPos = 0; + inLim = p->inBufSize; + inData = p->inBuf; + p->readRes = ISeqInStream_Read(p->inStream, (void *)(p->inBuf), &inLim); + // p->readProcessed += inLim; + // inLim -= 5; p->readWasFinished = True; // for test + if (inLim == 0 || p->readRes != SZ_OK) + p->readWasFinished = True; + } + } + + dicPos = dec->decoder.dicPos; + { + SizeT next = dec->decoder.dicBufSize; + if (next - wrPos > p->props.outStep_ST) + next = wrPos + p->props.outStep_ST; + size = next - dicPos; + } + + finishMode = LZMA_FINISH_ANY; + if (p->outSize_Defined) + { + const UInt64 rem = p->outSize - p->outProcessed; + if (size >= rem) + { + size = (SizeT)rem; + if (p->finishMode) + finishMode = LZMA_FINISH_END; + } + } + + inProcessed = inLim - inPos; + + res = Lzma2Dec_DecodeToDic(dec, dicPos + size, inData + inPos, &inProcessed, finishMode, &status); + + inPos += inProcessed; + p->inProcessed += inProcessed; + outProcessed = dec->decoder.dicPos - dicPos; + p->outProcessed += outProcessed; + + outFinished = (p->outSize_Defined && p->outSize <= p->outProcessed); + + needStop = (res != SZ_OK + || (inProcessed == 0 && outProcessed == 0) + || status == LZMA_STATUS_FINISHED_WITH_MARK + || (!p->finishMode && outFinished)); + + if (needStop || outProcessed >= size) + { + SRes res2; + { + size_t writeSize = dec->decoder.dicPos - wrPos; + size_t written = ISeqOutStream_Write(p->outStream, dec->decoder.dic + wrPos, writeSize); + res2 = (written == writeSize) ? SZ_OK : SZ_ERROR_WRITE; + } + + if (dec->decoder.dicPos == dec->decoder.dicBufSize) + dec->decoder.dicPos = 0; + wrPos = dec->decoder.dicPos; + + RINOK(res2); + + if (needStop) + { + if (res != SZ_OK) + return res; + + if (status == LZMA_STATUS_FINISHED_WITH_MARK) + { + if (p->finishMode) + { + if (p->outSize_Defined && p->outSize != p->outProcessed) + return SZ_ERROR_DATA; + } + return SZ_OK; + } + + if (!p->finishMode && outFinished) + return SZ_OK; + + if (status == LZMA_STATUS_NEEDS_MORE_INPUT) + return SZ_ERROR_INPUT_EOF; + + return SZ_ERROR_DATA; + } + } + + if (p->progress) + { + UInt64 inDelta = p->inProcessed - inPrev; + UInt64 outDelta = p->outProcessed - outPrev; + if (inDelta >= (1 << 22) || outDelta >= (1 << 22)) + { + RINOK(ICompressProgress_Progress(p->progress, p->inProcessed, p->outProcessed)); + inPrev = p->inProcessed; + outPrev = p->outProcessed; + } + } + } +} + + + +SRes Lzma2DecMt_Decode(CLzma2DecMtHandle pp, + Byte prop, + const CLzma2DecMtProps *props, + ISeqOutStream *outStream, const UInt64 *outDataSize, int finishMode, + // Byte *outBuf, size_t *outBufSize, + ISeqInStream *inStream, + // const Byte *inData, size_t inDataSize, + UInt64 *inProcessed, + // UInt64 *outProcessed, + int *isMT, + ICompressProgress *progress) +{ + CLzma2DecMt *p = (CLzma2DecMt *)pp; + #ifndef _7ZIP_ST + BoolInt tMode; + #endif + + *inProcessed = 0; + + if (prop > 40) + return SZ_ERROR_UNSUPPORTED; + + p->prop = prop; + p->props = *props; + + p->inStream = inStream; + p->outStream = outStream; + p->progress = progress; + + p->outSize = 0; + p->outSize_Defined = False; + if (outDataSize) + { + p->outSize_Defined = True; + p->outSize = *outDataSize; + } + p->finishMode = finishMode; + + p->outProcessed = 0; + p->inProcessed = 0; + + p->readWasFinished = False; + p->readRes = SZ_OK; + + *isMT = False; + + + #ifndef _7ZIP_ST + + tMode = False; + + // p->mtc.parseRes = SZ_OK; + + // p->mtc.numFilledThreads = 0; + // p->mtc.crossStart = 0; + // p->mtc.crossEnd = 0; + // p->mtc.allocError_for_Read_BlockIndex = 0; + // p->mtc.isAllocError = False; + + if (p->props.numThreads > 1) + { + IMtDecCallback2 vt; + + Lzma2DecMt_FreeSt(p); + + p->outProcessed_Parse = 0; + + if (!p->mtc_WasConstructed) + { + p->mtc_WasConstructed = True; + MtDec_Construct(&p->mtc); + } + + p->mtc.progress = progress; + p->mtc.inStream = inStream; + + // p->outBuf = NULL; + // p->outBufSize = 0; + /* + if (!outStream) + { + // p->outBuf = outBuf; + // p->outBufSize = *outBufSize; + // *outBufSize = 0; + return SZ_ERROR_PARAM; + } + */ + + // p->mtc.inBlockMax = p->props.inBlockMax; + p->mtc.alloc = &p->alignOffsetAlloc.vt; + // p->alignOffsetAlloc.baseAlloc; + // p->mtc.inData = inData; + // p->mtc.inDataSize = inDataSize; + p->mtc.mtCallback = &vt; + p->mtc.mtCallbackObject = p; + + p->mtc.inBufSize = p->props.inBufSize_MT; + + p->mtc.numThreadsMax = p->props.numThreads; + + *isMT = True; + + vt.Parse = Lzma2DecMt_MtCallback_Parse; + vt.PreCode = Lzma2DecMt_MtCallback_PreCode; + vt.Code = Lzma2DecMt_MtCallback_Code; + vt.Write = Lzma2DecMt_MtCallback_Write; + + { + BoolInt needContinue = False; + + SRes res = MtDec_Code(&p->mtc); + + /* + if (!outStream) + *outBufSize = p->outBuf - outBuf; + */ + + *inProcessed = p->mtc.inProcessed; + + needContinue = False; + + if (res == SZ_OK) + { + if (p->mtc.mtProgress.res != SZ_OK) + res = p->mtc.mtProgress.res; + else + needContinue = p->mtc.needContinue; + } + + if (!needContinue) + { + if (res == SZ_OK) + return p->mtc.readRes; + return res; + } + + tMode = True; + p->readRes = p->mtc.readRes; + p->readWasFinished = p->mtc.readWasFinished; + p->inProcessed = p->mtc.inProcessed; + + PRF_STR("----- decoding ST -----"); + } + } + + #endif + + + *isMT = False; + + { + SRes res = Lzma2Dec_Decode_ST(p + #ifndef _7ZIP_ST + , tMode + #endif + ); + + *inProcessed = p->inProcessed; + + // res = SZ_OK; // for test + if (res == SZ_ERROR_INPUT_EOF) + { + if (p->readRes != SZ_OK) + res = p->readRes; + } + else if (res == SZ_OK && p->readRes != SZ_OK) + res = p->readRes; + + /* + #ifndef _7ZIP_ST + if (res == SZ_OK && tMode && p->mtc.parseRes != SZ_OK) + res = p->mtc.parseRes; + #endif + */ + + return res; + } +} + + +/* ---------- Read from CLzma2DecMtHandle Interface ---------- */ + +SRes Lzma2DecMt_Init(CLzma2DecMtHandle pp, + Byte prop, + const CLzma2DecMtProps *props, + const UInt64 *outDataSize, int finishMode, + ISeqInStream *inStream) +{ + CLzma2DecMt *p = (CLzma2DecMt *)pp; + + if (prop > 40) + return SZ_ERROR_UNSUPPORTED; + + p->prop = prop; + p->props = *props; + + p->inStream = inStream; + + p->outSize = 0; + p->outSize_Defined = False; + if (outDataSize) + { + p->outSize_Defined = True; + p->outSize = *outDataSize; + } + p->finishMode = finishMode; + + p->outProcessed = 0; + p->inProcessed = 0; + + p->inPos = 0; + p->inLim = 0; + + return Lzma2Dec_Prepare_ST(p); +} + + +SRes Lzma2DecMt_Read(CLzma2DecMtHandle pp, + Byte *data, size_t *outSize, + UInt64 *inStreamProcessed) +{ + CLzma2DecMt *p = (CLzma2DecMt *)pp; + ELzmaFinishMode finishMode; + SRes readRes; + size_t size = *outSize; + + *outSize = 0; + *inStreamProcessed = 0; + + finishMode = LZMA_FINISH_ANY; + if (p->outSize_Defined) + { + const UInt64 rem = p->outSize - p->outProcessed; + if (size >= rem) + { + size = (size_t)rem; + if (p->finishMode) + finishMode = LZMA_FINISH_END; + } + } + + readRes = SZ_OK; + + for (;;) + { + SizeT inCur; + SizeT outCur; + ELzmaStatus status; + SRes res; + + if (p->inPos == p->inLim && readRes == SZ_OK) + { + p->inPos = 0; + p->inLim = p->props.inBufSize_ST; + readRes = ISeqInStream_Read(p->inStream, p->inBuf, &p->inLim); + } + + inCur = p->inLim - p->inPos; + outCur = size; + + res = Lzma2Dec_DecodeToBuf(&p->dec, data, &outCur, + p->inBuf + p->inPos, &inCur, finishMode, &status); + + p->inPos += inCur; + p->inProcessed += inCur; + *inStreamProcessed += inCur; + p->outProcessed += outCur; + *outSize += outCur; + size -= outCur; + data += outCur; + + if (res != 0) + return res; + + /* + if (status == LZMA_STATUS_FINISHED_WITH_MARK) + return readRes; + + if (size == 0 && status != LZMA_STATUS_NEEDS_MORE_INPUT) + { + if (p->finishMode && p->outSize_Defined && p->outProcessed >= p->outSize) + return SZ_ERROR_DATA; + return readRes; + } + */ + + if (inCur == 0 && outCur == 0) + return readRes; + } +} diff --git a/deps/LZMA-SDK/C/Lzma2DecMt.h b/deps/LZMA-SDK/C/Lzma2DecMt.h index 96f89a3ca..7791c310b 100644 --- a/deps/LZMA-SDK/C/Lzma2DecMt.h +++ b/deps/LZMA-SDK/C/Lzma2DecMt.h @@ -1,79 +1,79 @@ -/* Lzma2DecMt.h -- LZMA2 Decoder Multi-thread -2018-02-17 : Igor Pavlov : Public domain */ - -#ifndef __LZMA2_DEC_MT_H -#define __LZMA2_DEC_MT_H - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -typedef struct -{ - size_t inBufSize_ST; - size_t outStep_ST; - - #ifndef _7ZIP_ST - unsigned numThreads; - size_t inBufSize_MT; - size_t outBlockMax; - size_t inBlockMax; - #endif -} CLzma2DecMtProps; - -/* init to single-thread mode */ -void Lzma2DecMtProps_Init(CLzma2DecMtProps *p); - - -/* ---------- CLzma2DecMtHandle Interface ---------- */ - -/* Lzma2DecMt_ * functions can return the following exit codes: -SRes: - SZ_OK - OK - SZ_ERROR_MEM - Memory allocation error - SZ_ERROR_PARAM - Incorrect paramater in props - SZ_ERROR_WRITE - ISeqOutStream write callback error - // SZ_ERROR_OUTPUT_EOF - output buffer overflow - version with (Byte *) output - SZ_ERROR_PROGRESS - some break from progress callback - SZ_ERROR_THREAD - error in multithreading functions (only for Mt version) -*/ - -typedef void * CLzma2DecMtHandle; - -CLzma2DecMtHandle Lzma2DecMt_Create(ISzAllocPtr alloc, ISzAllocPtr allocMid); -void Lzma2DecMt_Destroy(CLzma2DecMtHandle p); - -SRes Lzma2DecMt_Decode(CLzma2DecMtHandle p, - Byte prop, - const CLzma2DecMtProps *props, - ISeqOutStream *outStream, - const UInt64 *outDataSize, // NULL means undefined - int finishMode, // 0 - partial unpacking is allowed, 1 - if lzma2 stream must be finished - // Byte *outBuf, size_t *outBufSize, - ISeqInStream *inStream, - // const Byte *inData, size_t inDataSize, - - // out variables: - UInt64 *inProcessed, - int *isMT, /* out: (*isMT == 0), if single thread decoding was used */ - - // UInt64 *outProcessed, - ICompressProgress *progress); - - -/* ---------- Read from CLzma2DecMtHandle Interface ---------- */ - -SRes Lzma2DecMt_Init(CLzma2DecMtHandle pp, - Byte prop, - const CLzma2DecMtProps *props, - const UInt64 *outDataSize, int finishMode, - ISeqInStream *inStream); - -SRes Lzma2DecMt_Read(CLzma2DecMtHandle pp, - Byte *data, size_t *outSize, - UInt64 *inStreamProcessed); - - -EXTERN_C_END - -#endif +/* Lzma2DecMt.h -- LZMA2 Decoder Multi-thread +2018-02-17 : Igor Pavlov : Public domain */ + +#ifndef __LZMA2_DEC_MT_H +#define __LZMA2_DEC_MT_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +typedef struct +{ + size_t inBufSize_ST; + size_t outStep_ST; + + #ifndef _7ZIP_ST + unsigned numThreads; + size_t inBufSize_MT; + size_t outBlockMax; + size_t inBlockMax; + #endif +} CLzma2DecMtProps; + +/* init to single-thread mode */ +void Lzma2DecMtProps_Init(CLzma2DecMtProps *p); + + +/* ---------- CLzma2DecMtHandle Interface ---------- */ + +/* Lzma2DecMt_ * functions can return the following exit codes: +SRes: + SZ_OK - OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_PARAM - Incorrect paramater in props + SZ_ERROR_WRITE - ISeqOutStream write callback error + // SZ_ERROR_OUTPUT_EOF - output buffer overflow - version with (Byte *) output + SZ_ERROR_PROGRESS - some break from progress callback + SZ_ERROR_THREAD - error in multithreading functions (only for Mt version) +*/ + +typedef void * CLzma2DecMtHandle; + +CLzma2DecMtHandle Lzma2DecMt_Create(ISzAllocPtr alloc, ISzAllocPtr allocMid); +void Lzma2DecMt_Destroy(CLzma2DecMtHandle p); + +SRes Lzma2DecMt_Decode(CLzma2DecMtHandle p, + Byte prop, + const CLzma2DecMtProps *props, + ISeqOutStream *outStream, + const UInt64 *outDataSize, // NULL means undefined + int finishMode, // 0 - partial unpacking is allowed, 1 - if lzma2 stream must be finished + // Byte *outBuf, size_t *outBufSize, + ISeqInStream *inStream, + // const Byte *inData, size_t inDataSize, + + // out variables: + UInt64 *inProcessed, + int *isMT, /* out: (*isMT == 0), if single thread decoding was used */ + + // UInt64 *outProcessed, + ICompressProgress *progress); + + +/* ---------- Read from CLzma2DecMtHandle Interface ---------- */ + +SRes Lzma2DecMt_Init(CLzma2DecMtHandle pp, + Byte prop, + const CLzma2DecMtProps *props, + const UInt64 *outDataSize, int finishMode, + ISeqInStream *inStream); + +SRes Lzma2DecMt_Read(CLzma2DecMtHandle pp, + Byte *data, size_t *outSize, + UInt64 *inStreamProcessed); + + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/Lzma2Enc.c b/deps/LZMA-SDK/C/Lzma2Enc.c index c8b114cb4..e61a5dfe0 100644 --- a/deps/LZMA-SDK/C/Lzma2Enc.c +++ b/deps/LZMA-SDK/C/Lzma2Enc.c @@ -1,803 +1,803 @@ -/* Lzma2Enc.c -- LZMA2 Encoder -2021-02-09 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include - -/* #define _7ZIP_ST */ - -#include "Lzma2Enc.h" - -#ifndef _7ZIP_ST -#include "MtCoder.h" -#else -#define MTCODER__THREADS_MAX 1 -#endif - -#define LZMA2_CONTROL_LZMA (1 << 7) -#define LZMA2_CONTROL_COPY_NO_RESET 2 -#define LZMA2_CONTROL_COPY_RESET_DIC 1 -#define LZMA2_CONTROL_EOF 0 - -#define LZMA2_LCLP_MAX 4 - -#define LZMA2_DIC_SIZE_FROM_PROP(p) (((UInt32)2 | ((p) & 1)) << ((p) / 2 + 11)) - -#define LZMA2_PACK_SIZE_MAX (1 << 16) -#define LZMA2_COPY_CHUNK_SIZE LZMA2_PACK_SIZE_MAX -#define LZMA2_UNPACK_SIZE_MAX (1 << 21) -#define LZMA2_KEEP_WINDOW_SIZE LZMA2_UNPACK_SIZE_MAX - -#define LZMA2_CHUNK_SIZE_COMPRESSED_MAX ((1 << 16) + 16) - - -#define PRF(x) /* x */ - - -/* ---------- CLimitedSeqInStream ---------- */ - -typedef struct -{ - ISeqInStream vt; - ISeqInStream *realStream; - UInt64 limit; - UInt64 processed; - int finished; -} CLimitedSeqInStream; - -static void LimitedSeqInStream_Init(CLimitedSeqInStream *p) -{ - p->limit = (UInt64)(Int64)-1; - p->processed = 0; - p->finished = 0; -} - -static SRes LimitedSeqInStream_Read(const ISeqInStream *pp, void *data, size_t *size) -{ - CLimitedSeqInStream *p = CONTAINER_FROM_VTBL(pp, CLimitedSeqInStream, vt); - size_t size2 = *size; - SRes res = SZ_OK; - - if (p->limit != (UInt64)(Int64)-1) - { - UInt64 rem = p->limit - p->processed; - if (size2 > rem) - size2 = (size_t)rem; - } - if (size2 != 0) - { - res = ISeqInStream_Read(p->realStream, data, &size2); - p->finished = (size2 == 0 ? 1 : 0); - p->processed += size2; - } - *size = size2; - return res; -} - - -/* ---------- CLzma2EncInt ---------- */ - -typedef struct -{ - CLzmaEncHandle enc; - Byte propsAreSet; - Byte propsByte; - Byte needInitState; - Byte needInitProp; - UInt64 srcPos; -} CLzma2EncInt; - - -static SRes Lzma2EncInt_InitStream(CLzma2EncInt *p, const CLzma2EncProps *props) -{ - if (!p->propsAreSet) - { - SizeT propsSize = LZMA_PROPS_SIZE; - Byte propsEncoded[LZMA_PROPS_SIZE]; - RINOK(LzmaEnc_SetProps(p->enc, &props->lzmaProps)); - RINOK(LzmaEnc_WriteProperties(p->enc, propsEncoded, &propsSize)); - p->propsByte = propsEncoded[0]; - p->propsAreSet = True; - } - return SZ_OK; -} - -static void Lzma2EncInt_InitBlock(CLzma2EncInt *p) -{ - p->srcPos = 0; - p->needInitState = True; - p->needInitProp = True; -} - - -SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp, ISeqInStream *inStream, UInt32 keepWindowSize, - ISzAllocPtr alloc, ISzAllocPtr allocBig); -SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen, - UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig); -SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, BoolInt reInit, - Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize); -const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp); -void LzmaEnc_Finish(CLzmaEncHandle pp); -void LzmaEnc_SaveState(CLzmaEncHandle pp); -void LzmaEnc_RestoreState(CLzmaEncHandle pp); - -/* -UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp); -*/ - -static SRes Lzma2EncInt_EncodeSubblock(CLzma2EncInt *p, Byte *outBuf, - size_t *packSizeRes, ISeqOutStream *outStream) -{ - size_t packSizeLimit = *packSizeRes; - size_t packSize = packSizeLimit; - UInt32 unpackSize = LZMA2_UNPACK_SIZE_MAX; - unsigned lzHeaderSize = 5 + (p->needInitProp ? 1 : 0); - BoolInt useCopyBlock; - SRes res; - - *packSizeRes = 0; - if (packSize < lzHeaderSize) - return SZ_ERROR_OUTPUT_EOF; - packSize -= lzHeaderSize; - - LzmaEnc_SaveState(p->enc); - res = LzmaEnc_CodeOneMemBlock(p->enc, p->needInitState, - outBuf + lzHeaderSize, &packSize, LZMA2_PACK_SIZE_MAX, &unpackSize); - - PRF(printf("\npackSize = %7d unpackSize = %7d ", packSize, unpackSize)); - - if (unpackSize == 0) - return res; - - if (res == SZ_OK) - useCopyBlock = (packSize + 2 >= unpackSize || packSize > (1 << 16)); - else - { - if (res != SZ_ERROR_OUTPUT_EOF) - return res; - res = SZ_OK; - useCopyBlock = True; - } - - if (useCopyBlock) - { - size_t destPos = 0; - PRF(printf("################# COPY ")); - - while (unpackSize > 0) - { - UInt32 u = (unpackSize < LZMA2_COPY_CHUNK_SIZE) ? unpackSize : LZMA2_COPY_CHUNK_SIZE; - if (packSizeLimit - destPos < u + 3) - return SZ_ERROR_OUTPUT_EOF; - outBuf[destPos++] = (Byte)(p->srcPos == 0 ? LZMA2_CONTROL_COPY_RESET_DIC : LZMA2_CONTROL_COPY_NO_RESET); - outBuf[destPos++] = (Byte)((u - 1) >> 8); - outBuf[destPos++] = (Byte)(u - 1); - memcpy(outBuf + destPos, LzmaEnc_GetCurBuf(p->enc) - unpackSize, u); - unpackSize -= u; - destPos += u; - p->srcPos += u; - - if (outStream) - { - *packSizeRes += destPos; - if (ISeqOutStream_Write(outStream, outBuf, destPos) != destPos) - return SZ_ERROR_WRITE; - destPos = 0; - } - else - *packSizeRes = destPos; - /* needInitState = True; */ - } - - LzmaEnc_RestoreState(p->enc); - return SZ_OK; - } - - { - size_t destPos = 0; - UInt32 u = unpackSize - 1; - UInt32 pm = (UInt32)(packSize - 1); - unsigned mode = (p->srcPos == 0) ? 3 : (p->needInitState ? (p->needInitProp ? 2 : 1) : 0); - - PRF(printf(" ")); - - outBuf[destPos++] = (Byte)(LZMA2_CONTROL_LZMA | (mode << 5) | ((u >> 16) & 0x1F)); - outBuf[destPos++] = (Byte)(u >> 8); - outBuf[destPos++] = (Byte)u; - outBuf[destPos++] = (Byte)(pm >> 8); - outBuf[destPos++] = (Byte)pm; - - if (p->needInitProp) - outBuf[destPos++] = p->propsByte; - - p->needInitProp = False; - p->needInitState = False; - destPos += packSize; - p->srcPos += unpackSize; - - if (outStream) - if (ISeqOutStream_Write(outStream, outBuf, destPos) != destPos) - return SZ_ERROR_WRITE; - - *packSizeRes = destPos; - return SZ_OK; - } -} - - -/* ---------- Lzma2 Props ---------- */ - -void Lzma2EncProps_Init(CLzma2EncProps *p) -{ - LzmaEncProps_Init(&p->lzmaProps); - p->blockSize = LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO; - p->numBlockThreads_Reduced = -1; - p->numBlockThreads_Max = -1; - p->numTotalThreads = -1; -} - -void Lzma2EncProps_Normalize(CLzma2EncProps *p) -{ - UInt64 fileSize; - int t1, t1n, t2, t2r, t3; - { - CLzmaEncProps lzmaProps = p->lzmaProps; - LzmaEncProps_Normalize(&lzmaProps); - t1n = lzmaProps.numThreads; - } - - t1 = p->lzmaProps.numThreads; - t2 = p->numBlockThreads_Max; - t3 = p->numTotalThreads; - - if (t2 > MTCODER__THREADS_MAX) - t2 = MTCODER__THREADS_MAX; - - if (t3 <= 0) - { - if (t2 <= 0) - t2 = 1; - t3 = t1n * t2; - } - else if (t2 <= 0) - { - t2 = t3 / t1n; - if (t2 == 0) - { - t1 = 1; - t2 = t3; - } - if (t2 > MTCODER__THREADS_MAX) - t2 = MTCODER__THREADS_MAX; - } - else if (t1 <= 0) - { - t1 = t3 / t2; - if (t1 == 0) - t1 = 1; - } - else - t3 = t1n * t2; - - p->lzmaProps.numThreads = t1; - - t2r = t2; - - fileSize = p->lzmaProps.reduceSize; - - if ( p->blockSize != LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID - && p->blockSize != LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO - && (p->blockSize < fileSize || fileSize == (UInt64)(Int64)-1)) - p->lzmaProps.reduceSize = p->blockSize; - - LzmaEncProps_Normalize(&p->lzmaProps); - - p->lzmaProps.reduceSize = fileSize; - - t1 = p->lzmaProps.numThreads; - - if (p->blockSize == LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID) - { - t2r = t2 = 1; - t3 = t1; - } - else if (p->blockSize == LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO && t2 <= 1) - { - /* if there is no block multi-threading, we use SOLID block */ - p->blockSize = LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID; - } - else - { - if (p->blockSize == LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO) - { - const UInt32 kMinSize = (UInt32)1 << 20; - const UInt32 kMaxSize = (UInt32)1 << 28; - const UInt32 dictSize = p->lzmaProps.dictSize; - UInt64 blockSize = (UInt64)dictSize << 2; - if (blockSize < kMinSize) blockSize = kMinSize; - if (blockSize > kMaxSize) blockSize = kMaxSize; - if (blockSize < dictSize) blockSize = dictSize; - blockSize += (kMinSize - 1); - blockSize &= ~(UInt64)(kMinSize - 1); - p->blockSize = blockSize; - } - - if (t2 > 1 && fileSize != (UInt64)(Int64)-1) - { - UInt64 numBlocks = fileSize / p->blockSize; - if (numBlocks * p->blockSize != fileSize) - numBlocks++; - if (numBlocks < (unsigned)t2) - { - t2r = (int)numBlocks; - if (t2r == 0) - t2r = 1; - t3 = t1 * t2r; - } - } - } - - p->numBlockThreads_Max = t2; - p->numBlockThreads_Reduced = t2r; - p->numTotalThreads = t3; -} - - -static SRes Progress(ICompressProgress *p, UInt64 inSize, UInt64 outSize) -{ - return (p && ICompressProgress_Progress(p, inSize, outSize) != SZ_OK) ? SZ_ERROR_PROGRESS : SZ_OK; -} - - -/* ---------- Lzma2 ---------- */ - -typedef struct -{ - Byte propEncoded; - CLzma2EncProps props; - UInt64 expectedDataSize; - - Byte *tempBufLzma; - - ISzAllocPtr alloc; - ISzAllocPtr allocBig; - - CLzma2EncInt coders[MTCODER__THREADS_MAX]; - - #ifndef _7ZIP_ST - - ISeqOutStream *outStream; - Byte *outBuf; - size_t outBuf_Rem; /* remainder in outBuf */ - - size_t outBufSize; /* size of allocated outBufs[i] */ - size_t outBufsDataSizes[MTCODER__BLOCKS_MAX]; - BoolInt mtCoder_WasConstructed; - CMtCoder mtCoder; - Byte *outBufs[MTCODER__BLOCKS_MAX]; - - #endif - -} CLzma2Enc; - - - -CLzma2EncHandle Lzma2Enc_Create(ISzAllocPtr alloc, ISzAllocPtr allocBig) -{ - CLzma2Enc *p = (CLzma2Enc *)ISzAlloc_Alloc(alloc, sizeof(CLzma2Enc)); - if (!p) - return NULL; - Lzma2EncProps_Init(&p->props); - Lzma2EncProps_Normalize(&p->props); - p->expectedDataSize = (UInt64)(Int64)-1; - p->tempBufLzma = NULL; - p->alloc = alloc; - p->allocBig = allocBig; - { - unsigned i; - for (i = 0; i < MTCODER__THREADS_MAX; i++) - p->coders[i].enc = NULL; - } - - #ifndef _7ZIP_ST - p->mtCoder_WasConstructed = False; - { - unsigned i; - for (i = 0; i < MTCODER__BLOCKS_MAX; i++) - p->outBufs[i] = NULL; - p->outBufSize = 0; - } - #endif - - return p; -} - - -#ifndef _7ZIP_ST - -static void Lzma2Enc_FreeOutBufs(CLzma2Enc *p) -{ - unsigned i; - for (i = 0; i < MTCODER__BLOCKS_MAX; i++) - if (p->outBufs[i]) - { - ISzAlloc_Free(p->alloc, p->outBufs[i]); - p->outBufs[i] = NULL; - } - p->outBufSize = 0; -} - -#endif - - -void Lzma2Enc_Destroy(CLzma2EncHandle pp) -{ - CLzma2Enc *p = (CLzma2Enc *)pp; - unsigned i; - for (i = 0; i < MTCODER__THREADS_MAX; i++) - { - CLzma2EncInt *t = &p->coders[i]; - if (t->enc) - { - LzmaEnc_Destroy(t->enc, p->alloc, p->allocBig); - t->enc = NULL; - } - } - - - #ifndef _7ZIP_ST - if (p->mtCoder_WasConstructed) - { - MtCoder_Destruct(&p->mtCoder); - p->mtCoder_WasConstructed = False; - } - Lzma2Enc_FreeOutBufs(p); - #endif - - ISzAlloc_Free(p->alloc, p->tempBufLzma); - p->tempBufLzma = NULL; - - ISzAlloc_Free(p->alloc, pp); -} - - -SRes Lzma2Enc_SetProps(CLzma2EncHandle pp, const CLzma2EncProps *props) -{ - CLzma2Enc *p = (CLzma2Enc *)pp; - CLzmaEncProps lzmaProps = props->lzmaProps; - LzmaEncProps_Normalize(&lzmaProps); - if (lzmaProps.lc + lzmaProps.lp > LZMA2_LCLP_MAX) - return SZ_ERROR_PARAM; - p->props = *props; - Lzma2EncProps_Normalize(&p->props); - return SZ_OK; -} - - -void Lzma2Enc_SetDataSize(CLzmaEncHandle pp, UInt64 expectedDataSiize) -{ - CLzma2Enc *p = (CLzma2Enc *)pp; - p->expectedDataSize = expectedDataSiize; -} - - -Byte Lzma2Enc_WriteProperties(CLzma2EncHandle pp) -{ - CLzma2Enc *p = (CLzma2Enc *)pp; - unsigned i; - UInt32 dicSize = LzmaEncProps_GetDictSize(&p->props.lzmaProps); - for (i = 0; i < 40; i++) - if (dicSize <= LZMA2_DIC_SIZE_FROM_PROP(i)) - break; - return (Byte)i; -} - - -static SRes Lzma2Enc_EncodeMt1( - CLzma2Enc *me, - CLzma2EncInt *p, - ISeqOutStream *outStream, - Byte *outBuf, size_t *outBufSize, - ISeqInStream *inStream, - const Byte *inData, size_t inDataSize, - int finished, - ICompressProgress *progress) -{ - UInt64 unpackTotal = 0; - UInt64 packTotal = 0; - size_t outLim = 0; - CLimitedSeqInStream limitedInStream; - - if (outBuf) - { - outLim = *outBufSize; - *outBufSize = 0; - } - - if (!p->enc) - { - p->propsAreSet = False; - p->enc = LzmaEnc_Create(me->alloc); - if (!p->enc) - return SZ_ERROR_MEM; - } - - limitedInStream.realStream = inStream; - if (inStream) - { - limitedInStream.vt.Read = LimitedSeqInStream_Read; - } - - if (!outBuf) - { - // outStream version works only in one thread. So we use CLzma2Enc::tempBufLzma - if (!me->tempBufLzma) - { - me->tempBufLzma = (Byte *)ISzAlloc_Alloc(me->alloc, LZMA2_CHUNK_SIZE_COMPRESSED_MAX); - if (!me->tempBufLzma) - return SZ_ERROR_MEM; - } - } - - RINOK(Lzma2EncInt_InitStream(p, &me->props)); - - for (;;) - { - SRes res = SZ_OK; - size_t inSizeCur = 0; - - Lzma2EncInt_InitBlock(p); - - LimitedSeqInStream_Init(&limitedInStream); - limitedInStream.limit = me->props.blockSize; - - if (inStream) - { - UInt64 expected = (UInt64)(Int64)-1; - // inStream version works only in one thread. So we use CLzma2Enc::expectedDataSize - if (me->expectedDataSize != (UInt64)(Int64)-1 - && me->expectedDataSize >= unpackTotal) - expected = me->expectedDataSize - unpackTotal; - if (me->props.blockSize != LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID - && expected > me->props.blockSize) - expected = (size_t)me->props.blockSize; - - LzmaEnc_SetDataSize(p->enc, expected); - - RINOK(LzmaEnc_PrepareForLzma2(p->enc, - &limitedInStream.vt, - LZMA2_KEEP_WINDOW_SIZE, - me->alloc, - me->allocBig)); - } - else - { - inSizeCur = inDataSize - (size_t)unpackTotal; - if (me->props.blockSize != LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID - && inSizeCur > me->props.blockSize) - inSizeCur = (size_t)me->props.blockSize; - - // LzmaEnc_SetDataSize(p->enc, inSizeCur); - - RINOK(LzmaEnc_MemPrepare(p->enc, - inData + (size_t)unpackTotal, inSizeCur, - LZMA2_KEEP_WINDOW_SIZE, - me->alloc, - me->allocBig)); - } - - for (;;) - { - size_t packSize = LZMA2_CHUNK_SIZE_COMPRESSED_MAX; - if (outBuf) - packSize = outLim - (size_t)packTotal; - - res = Lzma2EncInt_EncodeSubblock(p, - outBuf ? outBuf + (size_t)packTotal : me->tempBufLzma, &packSize, - outBuf ? NULL : outStream); - - if (res != SZ_OK) - break; - - packTotal += packSize; - if (outBuf) - *outBufSize = (size_t)packTotal; - - res = Progress(progress, unpackTotal + p->srcPos, packTotal); - if (res != SZ_OK) - break; - - /* - if (LzmaEnc_GetNumAvailableBytes(p->enc) == 0) - break; - */ - - if (packSize == 0) - break; - } - - LzmaEnc_Finish(p->enc); - - unpackTotal += p->srcPos; - - RINOK(res); - - if (p->srcPos != (inStream ? limitedInStream.processed : inSizeCur)) - return SZ_ERROR_FAIL; - - if (inStream ? limitedInStream.finished : (unpackTotal == inDataSize)) - { - if (finished) - { - if (outBuf) - { - const size_t destPos = *outBufSize; - if (destPos >= outLim) - return SZ_ERROR_OUTPUT_EOF; - outBuf[destPos] = LZMA2_CONTROL_EOF; // 0 - *outBufSize = destPos + 1; - } - else - { - const Byte b = LZMA2_CONTROL_EOF; // 0; - if (ISeqOutStream_Write(outStream, &b, 1) != 1) - return SZ_ERROR_WRITE; - } - } - return SZ_OK; - } - } -} - - - -#ifndef _7ZIP_ST - -static SRes Lzma2Enc_MtCallback_Code(void *pp, unsigned coderIndex, unsigned outBufIndex, - const Byte *src, size_t srcSize, int finished) -{ - CLzma2Enc *me = (CLzma2Enc *)pp; - size_t destSize = me->outBufSize; - SRes res; - CMtProgressThunk progressThunk; - - Byte *dest = me->outBufs[outBufIndex]; - - me->outBufsDataSizes[outBufIndex] = 0; - - if (!dest) - { - dest = (Byte *)ISzAlloc_Alloc(me->alloc, me->outBufSize); - if (!dest) - return SZ_ERROR_MEM; - me->outBufs[outBufIndex] = dest; - } - - MtProgressThunk_CreateVTable(&progressThunk); - progressThunk.mtProgress = &me->mtCoder.mtProgress; - progressThunk.inSize = 0; - progressThunk.outSize = 0; - - res = Lzma2Enc_EncodeMt1(me, - &me->coders[coderIndex], - NULL, dest, &destSize, - NULL, src, srcSize, - finished, - &progressThunk.vt); - - me->outBufsDataSizes[outBufIndex] = destSize; - - return res; -} - - -static SRes Lzma2Enc_MtCallback_Write(void *pp, unsigned outBufIndex) -{ - CLzma2Enc *me = (CLzma2Enc *)pp; - size_t size = me->outBufsDataSizes[outBufIndex]; - const Byte *data = me->outBufs[outBufIndex]; - - if (me->outStream) - return ISeqOutStream_Write(me->outStream, data, size) == size ? SZ_OK : SZ_ERROR_WRITE; - - if (size > me->outBuf_Rem) - return SZ_ERROR_OUTPUT_EOF; - memcpy(me->outBuf, data, size); - me->outBuf_Rem -= size; - me->outBuf += size; - return SZ_OK; -} - -#endif - - - -SRes Lzma2Enc_Encode2(CLzma2EncHandle pp, - ISeqOutStream *outStream, - Byte *outBuf, size_t *outBufSize, - ISeqInStream *inStream, - const Byte *inData, size_t inDataSize, - ICompressProgress *progress) -{ - CLzma2Enc *p = (CLzma2Enc *)pp; - - if (inStream && inData) - return SZ_ERROR_PARAM; - - if (outStream && outBuf) - return SZ_ERROR_PARAM; - - { - unsigned i; - for (i = 0; i < MTCODER__THREADS_MAX; i++) - p->coders[i].propsAreSet = False; - } - - #ifndef _7ZIP_ST - - if (p->props.numBlockThreads_Reduced > 1) - { - IMtCoderCallback2 vt; - - if (!p->mtCoder_WasConstructed) - { - p->mtCoder_WasConstructed = True; - MtCoder_Construct(&p->mtCoder); - } - - vt.Code = Lzma2Enc_MtCallback_Code; - vt.Write = Lzma2Enc_MtCallback_Write; - - p->outStream = outStream; - p->outBuf = NULL; - p->outBuf_Rem = 0; - if (!outStream) - { - p->outBuf = outBuf; - p->outBuf_Rem = *outBufSize; - *outBufSize = 0; - } - - p->mtCoder.allocBig = p->allocBig; - p->mtCoder.progress = progress; - p->mtCoder.inStream = inStream; - p->mtCoder.inData = inData; - p->mtCoder.inDataSize = inDataSize; - p->mtCoder.mtCallback = &vt; - p->mtCoder.mtCallbackObject = p; - - p->mtCoder.blockSize = (size_t)p->props.blockSize; - if (p->mtCoder.blockSize != p->props.blockSize) - return SZ_ERROR_PARAM; /* SZ_ERROR_MEM */ - - { - size_t destBlockSize = p->mtCoder.blockSize + (p->mtCoder.blockSize >> 10) + 16; - if (destBlockSize < p->mtCoder.blockSize) - return SZ_ERROR_PARAM; - if (p->outBufSize != destBlockSize) - Lzma2Enc_FreeOutBufs(p); - p->outBufSize = destBlockSize; - } - - p->mtCoder.numThreadsMax = (unsigned)p->props.numBlockThreads_Max; - p->mtCoder.expectedDataSize = p->expectedDataSize; - - { - SRes res = MtCoder_Code(&p->mtCoder); - if (!outStream) - *outBufSize = (size_t)(p->outBuf - outBuf); - return res; - } - } - - #endif - - - return Lzma2Enc_EncodeMt1(p, - &p->coders[0], - outStream, outBuf, outBufSize, - inStream, inData, inDataSize, - True, /* finished */ - progress); -} +/* Lzma2Enc.c -- LZMA2 Encoder +2021-02-09 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include + +/* #define _7ZIP_ST */ + +#include "Lzma2Enc.h" + +#ifndef _7ZIP_ST +#include "MtCoder.h" +#else +#define MTCODER__THREADS_MAX 1 +#endif + +#define LZMA2_CONTROL_LZMA (1 << 7) +#define LZMA2_CONTROL_COPY_NO_RESET 2 +#define LZMA2_CONTROL_COPY_RESET_DIC 1 +#define LZMA2_CONTROL_EOF 0 + +#define LZMA2_LCLP_MAX 4 + +#define LZMA2_DIC_SIZE_FROM_PROP(p) (((UInt32)2 | ((p) & 1)) << ((p) / 2 + 11)) + +#define LZMA2_PACK_SIZE_MAX (1 << 16) +#define LZMA2_COPY_CHUNK_SIZE LZMA2_PACK_SIZE_MAX +#define LZMA2_UNPACK_SIZE_MAX (1 << 21) +#define LZMA2_KEEP_WINDOW_SIZE LZMA2_UNPACK_SIZE_MAX + +#define LZMA2_CHUNK_SIZE_COMPRESSED_MAX ((1 << 16) + 16) + + +#define PRF(x) /* x */ + + +/* ---------- CLimitedSeqInStream ---------- */ + +typedef struct +{ + ISeqInStream vt; + ISeqInStream *realStream; + UInt64 limit; + UInt64 processed; + int finished; +} CLimitedSeqInStream; + +static void LimitedSeqInStream_Init(CLimitedSeqInStream *p) +{ + p->limit = (UInt64)(Int64)-1; + p->processed = 0; + p->finished = 0; +} + +static SRes LimitedSeqInStream_Read(const ISeqInStream *pp, void *data, size_t *size) +{ + CLimitedSeqInStream *p = CONTAINER_FROM_VTBL(pp, CLimitedSeqInStream, vt); + size_t size2 = *size; + SRes res = SZ_OK; + + if (p->limit != (UInt64)(Int64)-1) + { + UInt64 rem = p->limit - p->processed; + if (size2 > rem) + size2 = (size_t)rem; + } + if (size2 != 0) + { + res = ISeqInStream_Read(p->realStream, data, &size2); + p->finished = (size2 == 0 ? 1 : 0); + p->processed += size2; + } + *size = size2; + return res; +} + + +/* ---------- CLzma2EncInt ---------- */ + +typedef struct +{ + CLzmaEncHandle enc; + Byte propsAreSet; + Byte propsByte; + Byte needInitState; + Byte needInitProp; + UInt64 srcPos; +} CLzma2EncInt; + + +static SRes Lzma2EncInt_InitStream(CLzma2EncInt *p, const CLzma2EncProps *props) +{ + if (!p->propsAreSet) + { + SizeT propsSize = LZMA_PROPS_SIZE; + Byte propsEncoded[LZMA_PROPS_SIZE]; + RINOK(LzmaEnc_SetProps(p->enc, &props->lzmaProps)); + RINOK(LzmaEnc_WriteProperties(p->enc, propsEncoded, &propsSize)); + p->propsByte = propsEncoded[0]; + p->propsAreSet = True; + } + return SZ_OK; +} + +static void Lzma2EncInt_InitBlock(CLzma2EncInt *p) +{ + p->srcPos = 0; + p->needInitState = True; + p->needInitProp = True; +} + + +SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp, ISeqInStream *inStream, UInt32 keepWindowSize, + ISzAllocPtr alloc, ISzAllocPtr allocBig); +SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen, + UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig); +SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, BoolInt reInit, + Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize); +const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp); +void LzmaEnc_Finish(CLzmaEncHandle pp); +void LzmaEnc_SaveState(CLzmaEncHandle pp); +void LzmaEnc_RestoreState(CLzmaEncHandle pp); + +/* +UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp); +*/ + +static SRes Lzma2EncInt_EncodeSubblock(CLzma2EncInt *p, Byte *outBuf, + size_t *packSizeRes, ISeqOutStream *outStream) +{ + size_t packSizeLimit = *packSizeRes; + size_t packSize = packSizeLimit; + UInt32 unpackSize = LZMA2_UNPACK_SIZE_MAX; + unsigned lzHeaderSize = 5 + (p->needInitProp ? 1 : 0); + BoolInt useCopyBlock; + SRes res; + + *packSizeRes = 0; + if (packSize < lzHeaderSize) + return SZ_ERROR_OUTPUT_EOF; + packSize -= lzHeaderSize; + + LzmaEnc_SaveState(p->enc); + res = LzmaEnc_CodeOneMemBlock(p->enc, p->needInitState, + outBuf + lzHeaderSize, &packSize, LZMA2_PACK_SIZE_MAX, &unpackSize); + + PRF(printf("\npackSize = %7d unpackSize = %7d ", packSize, unpackSize)); + + if (unpackSize == 0) + return res; + + if (res == SZ_OK) + useCopyBlock = (packSize + 2 >= unpackSize || packSize > (1 << 16)); + else + { + if (res != SZ_ERROR_OUTPUT_EOF) + return res; + res = SZ_OK; + useCopyBlock = True; + } + + if (useCopyBlock) + { + size_t destPos = 0; + PRF(printf("################# COPY ")); + + while (unpackSize > 0) + { + UInt32 u = (unpackSize < LZMA2_COPY_CHUNK_SIZE) ? unpackSize : LZMA2_COPY_CHUNK_SIZE; + if (packSizeLimit - destPos < u + 3) + return SZ_ERROR_OUTPUT_EOF; + outBuf[destPos++] = (Byte)(p->srcPos == 0 ? LZMA2_CONTROL_COPY_RESET_DIC : LZMA2_CONTROL_COPY_NO_RESET); + outBuf[destPos++] = (Byte)((u - 1) >> 8); + outBuf[destPos++] = (Byte)(u - 1); + memcpy(outBuf + destPos, LzmaEnc_GetCurBuf(p->enc) - unpackSize, u); + unpackSize -= u; + destPos += u; + p->srcPos += u; + + if (outStream) + { + *packSizeRes += destPos; + if (ISeqOutStream_Write(outStream, outBuf, destPos) != destPos) + return SZ_ERROR_WRITE; + destPos = 0; + } + else + *packSizeRes = destPos; + /* needInitState = True; */ + } + + LzmaEnc_RestoreState(p->enc); + return SZ_OK; + } + + { + size_t destPos = 0; + UInt32 u = unpackSize - 1; + UInt32 pm = (UInt32)(packSize - 1); + unsigned mode = (p->srcPos == 0) ? 3 : (p->needInitState ? (p->needInitProp ? 2 : 1) : 0); + + PRF(printf(" ")); + + outBuf[destPos++] = (Byte)(LZMA2_CONTROL_LZMA | (mode << 5) | ((u >> 16) & 0x1F)); + outBuf[destPos++] = (Byte)(u >> 8); + outBuf[destPos++] = (Byte)u; + outBuf[destPos++] = (Byte)(pm >> 8); + outBuf[destPos++] = (Byte)pm; + + if (p->needInitProp) + outBuf[destPos++] = p->propsByte; + + p->needInitProp = False; + p->needInitState = False; + destPos += packSize; + p->srcPos += unpackSize; + + if (outStream) + if (ISeqOutStream_Write(outStream, outBuf, destPos) != destPos) + return SZ_ERROR_WRITE; + + *packSizeRes = destPos; + return SZ_OK; + } +} + + +/* ---------- Lzma2 Props ---------- */ + +void Lzma2EncProps_Init(CLzma2EncProps *p) +{ + LzmaEncProps_Init(&p->lzmaProps); + p->blockSize = LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO; + p->numBlockThreads_Reduced = -1; + p->numBlockThreads_Max = -1; + p->numTotalThreads = -1; +} + +void Lzma2EncProps_Normalize(CLzma2EncProps *p) +{ + UInt64 fileSize; + int t1, t1n, t2, t2r, t3; + { + CLzmaEncProps lzmaProps = p->lzmaProps; + LzmaEncProps_Normalize(&lzmaProps); + t1n = lzmaProps.numThreads; + } + + t1 = p->lzmaProps.numThreads; + t2 = p->numBlockThreads_Max; + t3 = p->numTotalThreads; + + if (t2 > MTCODER__THREADS_MAX) + t2 = MTCODER__THREADS_MAX; + + if (t3 <= 0) + { + if (t2 <= 0) + t2 = 1; + t3 = t1n * t2; + } + else if (t2 <= 0) + { + t2 = t3 / t1n; + if (t2 == 0) + { + t1 = 1; + t2 = t3; + } + if (t2 > MTCODER__THREADS_MAX) + t2 = MTCODER__THREADS_MAX; + } + else if (t1 <= 0) + { + t1 = t3 / t2; + if (t1 == 0) + t1 = 1; + } + else + t3 = t1n * t2; + + p->lzmaProps.numThreads = t1; + + t2r = t2; + + fileSize = p->lzmaProps.reduceSize; + + if ( p->blockSize != LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID + && p->blockSize != LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO + && (p->blockSize < fileSize || fileSize == (UInt64)(Int64)-1)) + p->lzmaProps.reduceSize = p->blockSize; + + LzmaEncProps_Normalize(&p->lzmaProps); + + p->lzmaProps.reduceSize = fileSize; + + t1 = p->lzmaProps.numThreads; + + if (p->blockSize == LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID) + { + t2r = t2 = 1; + t3 = t1; + } + else if (p->blockSize == LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO && t2 <= 1) + { + /* if there is no block multi-threading, we use SOLID block */ + p->blockSize = LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID; + } + else + { + if (p->blockSize == LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO) + { + const UInt32 kMinSize = (UInt32)1 << 20; + const UInt32 kMaxSize = (UInt32)1 << 28; + const UInt32 dictSize = p->lzmaProps.dictSize; + UInt64 blockSize = (UInt64)dictSize << 2; + if (blockSize < kMinSize) blockSize = kMinSize; + if (blockSize > kMaxSize) blockSize = kMaxSize; + if (blockSize < dictSize) blockSize = dictSize; + blockSize += (kMinSize - 1); + blockSize &= ~(UInt64)(kMinSize - 1); + p->blockSize = blockSize; + } + + if (t2 > 1 && fileSize != (UInt64)(Int64)-1) + { + UInt64 numBlocks = fileSize / p->blockSize; + if (numBlocks * p->blockSize != fileSize) + numBlocks++; + if (numBlocks < (unsigned)t2) + { + t2r = (int)numBlocks; + if (t2r == 0) + t2r = 1; + t3 = t1 * t2r; + } + } + } + + p->numBlockThreads_Max = t2; + p->numBlockThreads_Reduced = t2r; + p->numTotalThreads = t3; +} + + +static SRes Progress(ICompressProgress *p, UInt64 inSize, UInt64 outSize) +{ + return (p && ICompressProgress_Progress(p, inSize, outSize) != SZ_OK) ? SZ_ERROR_PROGRESS : SZ_OK; +} + + +/* ---------- Lzma2 ---------- */ + +typedef struct +{ + Byte propEncoded; + CLzma2EncProps props; + UInt64 expectedDataSize; + + Byte *tempBufLzma; + + ISzAllocPtr alloc; + ISzAllocPtr allocBig; + + CLzma2EncInt coders[MTCODER__THREADS_MAX]; + + #ifndef _7ZIP_ST + + ISeqOutStream *outStream; + Byte *outBuf; + size_t outBuf_Rem; /* remainder in outBuf */ + + size_t outBufSize; /* size of allocated outBufs[i] */ + size_t outBufsDataSizes[MTCODER__BLOCKS_MAX]; + BoolInt mtCoder_WasConstructed; + CMtCoder mtCoder; + Byte *outBufs[MTCODER__BLOCKS_MAX]; + + #endif + +} CLzma2Enc; + + + +CLzma2EncHandle Lzma2Enc_Create(ISzAllocPtr alloc, ISzAllocPtr allocBig) +{ + CLzma2Enc *p = (CLzma2Enc *)ISzAlloc_Alloc(alloc, sizeof(CLzma2Enc)); + if (!p) + return NULL; + Lzma2EncProps_Init(&p->props); + Lzma2EncProps_Normalize(&p->props); + p->expectedDataSize = (UInt64)(Int64)-1; + p->tempBufLzma = NULL; + p->alloc = alloc; + p->allocBig = allocBig; + { + unsigned i; + for (i = 0; i < MTCODER__THREADS_MAX; i++) + p->coders[i].enc = NULL; + } + + #ifndef _7ZIP_ST + p->mtCoder_WasConstructed = False; + { + unsigned i; + for (i = 0; i < MTCODER__BLOCKS_MAX; i++) + p->outBufs[i] = NULL; + p->outBufSize = 0; + } + #endif + + return p; +} + + +#ifndef _7ZIP_ST + +static void Lzma2Enc_FreeOutBufs(CLzma2Enc *p) +{ + unsigned i; + for (i = 0; i < MTCODER__BLOCKS_MAX; i++) + if (p->outBufs[i]) + { + ISzAlloc_Free(p->alloc, p->outBufs[i]); + p->outBufs[i] = NULL; + } + p->outBufSize = 0; +} + +#endif + + +void Lzma2Enc_Destroy(CLzma2EncHandle pp) +{ + CLzma2Enc *p = (CLzma2Enc *)pp; + unsigned i; + for (i = 0; i < MTCODER__THREADS_MAX; i++) + { + CLzma2EncInt *t = &p->coders[i]; + if (t->enc) + { + LzmaEnc_Destroy(t->enc, p->alloc, p->allocBig); + t->enc = NULL; + } + } + + + #ifndef _7ZIP_ST + if (p->mtCoder_WasConstructed) + { + MtCoder_Destruct(&p->mtCoder); + p->mtCoder_WasConstructed = False; + } + Lzma2Enc_FreeOutBufs(p); + #endif + + ISzAlloc_Free(p->alloc, p->tempBufLzma); + p->tempBufLzma = NULL; + + ISzAlloc_Free(p->alloc, pp); +} + + +SRes Lzma2Enc_SetProps(CLzma2EncHandle pp, const CLzma2EncProps *props) +{ + CLzma2Enc *p = (CLzma2Enc *)pp; + CLzmaEncProps lzmaProps = props->lzmaProps; + LzmaEncProps_Normalize(&lzmaProps); + if (lzmaProps.lc + lzmaProps.lp > LZMA2_LCLP_MAX) + return SZ_ERROR_PARAM; + p->props = *props; + Lzma2EncProps_Normalize(&p->props); + return SZ_OK; +} + + +void Lzma2Enc_SetDataSize(CLzmaEncHandle pp, UInt64 expectedDataSiize) +{ + CLzma2Enc *p = (CLzma2Enc *)pp; + p->expectedDataSize = expectedDataSiize; +} + + +Byte Lzma2Enc_WriteProperties(CLzma2EncHandle pp) +{ + CLzma2Enc *p = (CLzma2Enc *)pp; + unsigned i; + UInt32 dicSize = LzmaEncProps_GetDictSize(&p->props.lzmaProps); + for (i = 0; i < 40; i++) + if (dicSize <= LZMA2_DIC_SIZE_FROM_PROP(i)) + break; + return (Byte)i; +} + + +static SRes Lzma2Enc_EncodeMt1( + CLzma2Enc *me, + CLzma2EncInt *p, + ISeqOutStream *outStream, + Byte *outBuf, size_t *outBufSize, + ISeqInStream *inStream, + const Byte *inData, size_t inDataSize, + int finished, + ICompressProgress *progress) +{ + UInt64 unpackTotal = 0; + UInt64 packTotal = 0; + size_t outLim = 0; + CLimitedSeqInStream limitedInStream; + + if (outBuf) + { + outLim = *outBufSize; + *outBufSize = 0; + } + + if (!p->enc) + { + p->propsAreSet = False; + p->enc = LzmaEnc_Create(me->alloc); + if (!p->enc) + return SZ_ERROR_MEM; + } + + limitedInStream.realStream = inStream; + if (inStream) + { + limitedInStream.vt.Read = LimitedSeqInStream_Read; + } + + if (!outBuf) + { + // outStream version works only in one thread. So we use CLzma2Enc::tempBufLzma + if (!me->tempBufLzma) + { + me->tempBufLzma = (Byte *)ISzAlloc_Alloc(me->alloc, LZMA2_CHUNK_SIZE_COMPRESSED_MAX); + if (!me->tempBufLzma) + return SZ_ERROR_MEM; + } + } + + RINOK(Lzma2EncInt_InitStream(p, &me->props)); + + for (;;) + { + SRes res = SZ_OK; + size_t inSizeCur = 0; + + Lzma2EncInt_InitBlock(p); + + LimitedSeqInStream_Init(&limitedInStream); + limitedInStream.limit = me->props.blockSize; + + if (inStream) + { + UInt64 expected = (UInt64)(Int64)-1; + // inStream version works only in one thread. So we use CLzma2Enc::expectedDataSize + if (me->expectedDataSize != (UInt64)(Int64)-1 + && me->expectedDataSize >= unpackTotal) + expected = me->expectedDataSize - unpackTotal; + if (me->props.blockSize != LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID + && expected > me->props.blockSize) + expected = (size_t)me->props.blockSize; + + LzmaEnc_SetDataSize(p->enc, expected); + + RINOK(LzmaEnc_PrepareForLzma2(p->enc, + &limitedInStream.vt, + LZMA2_KEEP_WINDOW_SIZE, + me->alloc, + me->allocBig)); + } + else + { + inSizeCur = inDataSize - (size_t)unpackTotal; + if (me->props.blockSize != LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID + && inSizeCur > me->props.blockSize) + inSizeCur = (size_t)me->props.blockSize; + + // LzmaEnc_SetDataSize(p->enc, inSizeCur); + + RINOK(LzmaEnc_MemPrepare(p->enc, + inData + (size_t)unpackTotal, inSizeCur, + LZMA2_KEEP_WINDOW_SIZE, + me->alloc, + me->allocBig)); + } + + for (;;) + { + size_t packSize = LZMA2_CHUNK_SIZE_COMPRESSED_MAX; + if (outBuf) + packSize = outLim - (size_t)packTotal; + + res = Lzma2EncInt_EncodeSubblock(p, + outBuf ? outBuf + (size_t)packTotal : me->tempBufLzma, &packSize, + outBuf ? NULL : outStream); + + if (res != SZ_OK) + break; + + packTotal += packSize; + if (outBuf) + *outBufSize = (size_t)packTotal; + + res = Progress(progress, unpackTotal + p->srcPos, packTotal); + if (res != SZ_OK) + break; + + /* + if (LzmaEnc_GetNumAvailableBytes(p->enc) == 0) + break; + */ + + if (packSize == 0) + break; + } + + LzmaEnc_Finish(p->enc); + + unpackTotal += p->srcPos; + + RINOK(res); + + if (p->srcPos != (inStream ? limitedInStream.processed : inSizeCur)) + return SZ_ERROR_FAIL; + + if (inStream ? limitedInStream.finished : (unpackTotal == inDataSize)) + { + if (finished) + { + if (outBuf) + { + const size_t destPos = *outBufSize; + if (destPos >= outLim) + return SZ_ERROR_OUTPUT_EOF; + outBuf[destPos] = LZMA2_CONTROL_EOF; // 0 + *outBufSize = destPos + 1; + } + else + { + const Byte b = LZMA2_CONTROL_EOF; // 0; + if (ISeqOutStream_Write(outStream, &b, 1) != 1) + return SZ_ERROR_WRITE; + } + } + return SZ_OK; + } + } +} + + + +#ifndef _7ZIP_ST + +static SRes Lzma2Enc_MtCallback_Code(void *pp, unsigned coderIndex, unsigned outBufIndex, + const Byte *src, size_t srcSize, int finished) +{ + CLzma2Enc *me = (CLzma2Enc *)pp; + size_t destSize = me->outBufSize; + SRes res; + CMtProgressThunk progressThunk; + + Byte *dest = me->outBufs[outBufIndex]; + + me->outBufsDataSizes[outBufIndex] = 0; + + if (!dest) + { + dest = (Byte *)ISzAlloc_Alloc(me->alloc, me->outBufSize); + if (!dest) + return SZ_ERROR_MEM; + me->outBufs[outBufIndex] = dest; + } + + MtProgressThunk_CreateVTable(&progressThunk); + progressThunk.mtProgress = &me->mtCoder.mtProgress; + progressThunk.inSize = 0; + progressThunk.outSize = 0; + + res = Lzma2Enc_EncodeMt1(me, + &me->coders[coderIndex], + NULL, dest, &destSize, + NULL, src, srcSize, + finished, + &progressThunk.vt); + + me->outBufsDataSizes[outBufIndex] = destSize; + + return res; +} + + +static SRes Lzma2Enc_MtCallback_Write(void *pp, unsigned outBufIndex) +{ + CLzma2Enc *me = (CLzma2Enc *)pp; + size_t size = me->outBufsDataSizes[outBufIndex]; + const Byte *data = me->outBufs[outBufIndex]; + + if (me->outStream) + return ISeqOutStream_Write(me->outStream, data, size) == size ? SZ_OK : SZ_ERROR_WRITE; + + if (size > me->outBuf_Rem) + return SZ_ERROR_OUTPUT_EOF; + memcpy(me->outBuf, data, size); + me->outBuf_Rem -= size; + me->outBuf += size; + return SZ_OK; +} + +#endif + + + +SRes Lzma2Enc_Encode2(CLzma2EncHandle pp, + ISeqOutStream *outStream, + Byte *outBuf, size_t *outBufSize, + ISeqInStream *inStream, + const Byte *inData, size_t inDataSize, + ICompressProgress *progress) +{ + CLzma2Enc *p = (CLzma2Enc *)pp; + + if (inStream && inData) + return SZ_ERROR_PARAM; + + if (outStream && outBuf) + return SZ_ERROR_PARAM; + + { + unsigned i; + for (i = 0; i < MTCODER__THREADS_MAX; i++) + p->coders[i].propsAreSet = False; + } + + #ifndef _7ZIP_ST + + if (p->props.numBlockThreads_Reduced > 1) + { + IMtCoderCallback2 vt; + + if (!p->mtCoder_WasConstructed) + { + p->mtCoder_WasConstructed = True; + MtCoder_Construct(&p->mtCoder); + } + + vt.Code = Lzma2Enc_MtCallback_Code; + vt.Write = Lzma2Enc_MtCallback_Write; + + p->outStream = outStream; + p->outBuf = NULL; + p->outBuf_Rem = 0; + if (!outStream) + { + p->outBuf = outBuf; + p->outBuf_Rem = *outBufSize; + *outBufSize = 0; + } + + p->mtCoder.allocBig = p->allocBig; + p->mtCoder.progress = progress; + p->mtCoder.inStream = inStream; + p->mtCoder.inData = inData; + p->mtCoder.inDataSize = inDataSize; + p->mtCoder.mtCallback = &vt; + p->mtCoder.mtCallbackObject = p; + + p->mtCoder.blockSize = (size_t)p->props.blockSize; + if (p->mtCoder.blockSize != p->props.blockSize) + return SZ_ERROR_PARAM; /* SZ_ERROR_MEM */ + + { + size_t destBlockSize = p->mtCoder.blockSize + (p->mtCoder.blockSize >> 10) + 16; + if (destBlockSize < p->mtCoder.blockSize) + return SZ_ERROR_PARAM; + if (p->outBufSize != destBlockSize) + Lzma2Enc_FreeOutBufs(p); + p->outBufSize = destBlockSize; + } + + p->mtCoder.numThreadsMax = (unsigned)p->props.numBlockThreads_Max; + p->mtCoder.expectedDataSize = p->expectedDataSize; + + { + SRes res = MtCoder_Code(&p->mtCoder); + if (!outStream) + *outBufSize = (size_t)(p->outBuf - outBuf); + return res; + } + } + + #endif + + + return Lzma2Enc_EncodeMt1(p, + &p->coders[0], + outStream, outBuf, outBufSize, + inStream, inData, inDataSize, + True, /* finished */ + progress); +} diff --git a/deps/LZMA-SDK/C/Lzma2Enc.h b/deps/LZMA-SDK/C/Lzma2Enc.h index 65f2dd145..6a6110ff7 100644 --- a/deps/LZMA-SDK/C/Lzma2Enc.h +++ b/deps/LZMA-SDK/C/Lzma2Enc.h @@ -1,55 +1,55 @@ -/* Lzma2Enc.h -- LZMA2 Encoder -2017-07-27 : Igor Pavlov : Public domain */ - -#ifndef __LZMA2_ENC_H -#define __LZMA2_ENC_H - -#include "LzmaEnc.h" - -EXTERN_C_BEGIN - -#define LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO 0 -#define LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID ((UInt64)(Int64)-1) - -typedef struct -{ - CLzmaEncProps lzmaProps; - UInt64 blockSize; - int numBlockThreads_Reduced; - int numBlockThreads_Max; - int numTotalThreads; -} CLzma2EncProps; - -void Lzma2EncProps_Init(CLzma2EncProps *p); -void Lzma2EncProps_Normalize(CLzma2EncProps *p); - -/* ---------- CLzmaEnc2Handle Interface ---------- */ - -/* Lzma2Enc_* functions can return the following exit codes: -SRes: - SZ_OK - OK - SZ_ERROR_MEM - Memory allocation error - SZ_ERROR_PARAM - Incorrect paramater in props - SZ_ERROR_WRITE - ISeqOutStream write callback error - SZ_ERROR_OUTPUT_EOF - output buffer overflow - version with (Byte *) output - SZ_ERROR_PROGRESS - some break from progress callback - SZ_ERROR_THREAD - error in multithreading functions (only for Mt version) -*/ - -typedef void * CLzma2EncHandle; - -CLzma2EncHandle Lzma2Enc_Create(ISzAllocPtr alloc, ISzAllocPtr allocBig); -void Lzma2Enc_Destroy(CLzma2EncHandle p); -SRes Lzma2Enc_SetProps(CLzma2EncHandle p, const CLzma2EncProps *props); -void Lzma2Enc_SetDataSize(CLzma2EncHandle p, UInt64 expectedDataSiize); -Byte Lzma2Enc_WriteProperties(CLzma2EncHandle p); -SRes Lzma2Enc_Encode2(CLzma2EncHandle p, - ISeqOutStream *outStream, - Byte *outBuf, size_t *outBufSize, - ISeqInStream *inStream, - const Byte *inData, size_t inDataSize, - ICompressProgress *progress); - -EXTERN_C_END - -#endif +/* Lzma2Enc.h -- LZMA2 Encoder +2017-07-27 : Igor Pavlov : Public domain */ + +#ifndef __LZMA2_ENC_H +#define __LZMA2_ENC_H + +#include "LzmaEnc.h" + +EXTERN_C_BEGIN + +#define LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO 0 +#define LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID ((UInt64)(Int64)-1) + +typedef struct +{ + CLzmaEncProps lzmaProps; + UInt64 blockSize; + int numBlockThreads_Reduced; + int numBlockThreads_Max; + int numTotalThreads; +} CLzma2EncProps; + +void Lzma2EncProps_Init(CLzma2EncProps *p); +void Lzma2EncProps_Normalize(CLzma2EncProps *p); + +/* ---------- CLzmaEnc2Handle Interface ---------- */ + +/* Lzma2Enc_* functions can return the following exit codes: +SRes: + SZ_OK - OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_PARAM - Incorrect paramater in props + SZ_ERROR_WRITE - ISeqOutStream write callback error + SZ_ERROR_OUTPUT_EOF - output buffer overflow - version with (Byte *) output + SZ_ERROR_PROGRESS - some break from progress callback + SZ_ERROR_THREAD - error in multithreading functions (only for Mt version) +*/ + +typedef void * CLzma2EncHandle; + +CLzma2EncHandle Lzma2Enc_Create(ISzAllocPtr alloc, ISzAllocPtr allocBig); +void Lzma2Enc_Destroy(CLzma2EncHandle p); +SRes Lzma2Enc_SetProps(CLzma2EncHandle p, const CLzma2EncProps *props); +void Lzma2Enc_SetDataSize(CLzma2EncHandle p, UInt64 expectedDataSiize); +Byte Lzma2Enc_WriteProperties(CLzma2EncHandle p); +SRes Lzma2Enc_Encode2(CLzma2EncHandle p, + ISeqOutStream *outStream, + Byte *outBuf, size_t *outBufSize, + ISeqInStream *inStream, + const Byte *inData, size_t inDataSize, + ICompressProgress *progress); + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/Lzma86.h b/deps/LZMA-SDK/C/Lzma86.h index 83057e598..bebed5cb7 100644 --- a/deps/LZMA-SDK/C/Lzma86.h +++ b/deps/LZMA-SDK/C/Lzma86.h @@ -1,111 +1,111 @@ -/* Lzma86.h -- LZMA + x86 (BCJ) Filter -2013-01-18 : Igor Pavlov : Public domain */ - -#ifndef __LZMA86_H -#define __LZMA86_H - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -#define LZMA86_SIZE_OFFSET (1 + 5) -#define LZMA86_HEADER_SIZE (LZMA86_SIZE_OFFSET + 8) - -/* -It's an example for LZMA + x86 Filter use. -You can use .lzma86 extension, if you write that stream to file. -.lzma86 header adds one additional byte to standard .lzma header. -.lzma86 header (14 bytes): - Offset Size Description - 0 1 = 0 - no filter, pure LZMA - = 1 - x86 filter + LZMA - 1 1 lc, lp and pb in encoded form - 2 4 dictSize (little endian) - 6 8 uncompressed size (little endian) - - -Lzma86_Encode -------------- -level - compression level: 0 <= level <= 9, the default value for "level" is 5. - -dictSize - The dictionary size in bytes. The maximum value is - 128 MB = (1 << 27) bytes for 32-bit version - 1 GB = (1 << 30) bytes for 64-bit version - The default value is 16 MB = (1 << 24) bytes, for level = 5. - It's recommended to use the dictionary that is larger than 4 KB and - that can be calculated as (1 << N) or (3 << N) sizes. - For better compression ratio dictSize must be >= inSize. - -filterMode: - SZ_FILTER_NO - no Filter - SZ_FILTER_YES - x86 Filter - SZ_FILTER_AUTO - it tries both alternatives to select best. - Encoder will use 2 or 3 passes: - 2 passes when FILTER_NO provides better compression. - 3 passes when FILTER_YES provides better compression. - -Lzma86Encode allocates Data with MyAlloc functions. -RAM Requirements for compressing: - RamSize = dictionarySize * 11.5 + 6MB + FilterBlockSize - filterMode FilterBlockSize - SZ_FILTER_NO 0 - SZ_FILTER_YES inSize - SZ_FILTER_AUTO inSize - - -Return code: - SZ_OK - OK - SZ_ERROR_MEM - Memory allocation error - SZ_ERROR_PARAM - Incorrect paramater - SZ_ERROR_OUTPUT_EOF - output buffer overflow - SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) -*/ - -enum ESzFilterMode -{ - SZ_FILTER_NO, - SZ_FILTER_YES, - SZ_FILTER_AUTO -}; - -SRes Lzma86_Encode(Byte *dest, size_t *destLen, const Byte *src, size_t srcLen, - int level, UInt32 dictSize, int filterMode); - - -/* -Lzma86_GetUnpackSize: - In: - src - input data - srcLen - input data size - Out: - unpackSize - size of uncompressed stream - Return code: - SZ_OK - OK - SZ_ERROR_INPUT_EOF - Error in headers -*/ - -SRes Lzma86_GetUnpackSize(const Byte *src, SizeT srcLen, UInt64 *unpackSize); - -/* -Lzma86_Decode: - In: - dest - output data - destLen - output data size - src - input data - srcLen - input data size - Out: - destLen - processed output size - srcLen - processed input size - Return code: - SZ_OK - OK - SZ_ERROR_DATA - Data error - SZ_ERROR_MEM - Memory allocation error - SZ_ERROR_UNSUPPORTED - unsupported file - SZ_ERROR_INPUT_EOF - it needs more bytes in input buffer -*/ - -SRes Lzma86_Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen); - -EXTERN_C_END - -#endif +/* Lzma86.h -- LZMA + x86 (BCJ) Filter +2013-01-18 : Igor Pavlov : Public domain */ + +#ifndef __LZMA86_H +#define __LZMA86_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +#define LZMA86_SIZE_OFFSET (1 + 5) +#define LZMA86_HEADER_SIZE (LZMA86_SIZE_OFFSET + 8) + +/* +It's an example for LZMA + x86 Filter use. +You can use .lzma86 extension, if you write that stream to file. +.lzma86 header adds one additional byte to standard .lzma header. +.lzma86 header (14 bytes): + Offset Size Description + 0 1 = 0 - no filter, pure LZMA + = 1 - x86 filter + LZMA + 1 1 lc, lp and pb in encoded form + 2 4 dictSize (little endian) + 6 8 uncompressed size (little endian) + + +Lzma86_Encode +------------- +level - compression level: 0 <= level <= 9, the default value for "level" is 5. + +dictSize - The dictionary size in bytes. The maximum value is + 128 MB = (1 << 27) bytes for 32-bit version + 1 GB = (1 << 30) bytes for 64-bit version + The default value is 16 MB = (1 << 24) bytes, for level = 5. + It's recommended to use the dictionary that is larger than 4 KB and + that can be calculated as (1 << N) or (3 << N) sizes. + For better compression ratio dictSize must be >= inSize. + +filterMode: + SZ_FILTER_NO - no Filter + SZ_FILTER_YES - x86 Filter + SZ_FILTER_AUTO - it tries both alternatives to select best. + Encoder will use 2 or 3 passes: + 2 passes when FILTER_NO provides better compression. + 3 passes when FILTER_YES provides better compression. + +Lzma86Encode allocates Data with MyAlloc functions. +RAM Requirements for compressing: + RamSize = dictionarySize * 11.5 + 6MB + FilterBlockSize + filterMode FilterBlockSize + SZ_FILTER_NO 0 + SZ_FILTER_YES inSize + SZ_FILTER_AUTO inSize + + +Return code: + SZ_OK - OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_PARAM - Incorrect paramater + SZ_ERROR_OUTPUT_EOF - output buffer overflow + SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) +*/ + +enum ESzFilterMode +{ + SZ_FILTER_NO, + SZ_FILTER_YES, + SZ_FILTER_AUTO +}; + +SRes Lzma86_Encode(Byte *dest, size_t *destLen, const Byte *src, size_t srcLen, + int level, UInt32 dictSize, int filterMode); + + +/* +Lzma86_GetUnpackSize: + In: + src - input data + srcLen - input data size + Out: + unpackSize - size of uncompressed stream + Return code: + SZ_OK - OK + SZ_ERROR_INPUT_EOF - Error in headers +*/ + +SRes Lzma86_GetUnpackSize(const Byte *src, SizeT srcLen, UInt64 *unpackSize); + +/* +Lzma86_Decode: + In: + dest - output data + destLen - output data size + src - input data + srcLen - input data size + Out: + destLen - processed output size + srcLen - processed input size + Return code: + SZ_OK - OK + SZ_ERROR_DATA - Data error + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_UNSUPPORTED - unsupported file + SZ_ERROR_INPUT_EOF - it needs more bytes in input buffer +*/ + +SRes Lzma86_Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen); + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/Lzma86Dec.c b/deps/LZMA-SDK/C/Lzma86Dec.c index 20ac5e7a9..21031745c 100644 --- a/deps/LZMA-SDK/C/Lzma86Dec.c +++ b/deps/LZMA-SDK/C/Lzma86Dec.c @@ -1,54 +1,54 @@ -/* Lzma86Dec.c -- LZMA + x86 (BCJ) Filter Decoder -2016-05-16 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include "Lzma86.h" - -#include "Alloc.h" -#include "Bra.h" -#include "LzmaDec.h" - -SRes Lzma86_GetUnpackSize(const Byte *src, SizeT srcLen, UInt64 *unpackSize) -{ - unsigned i; - if (srcLen < LZMA86_HEADER_SIZE) - return SZ_ERROR_INPUT_EOF; - *unpackSize = 0; - for (i = 0; i < sizeof(UInt64); i++) - *unpackSize += ((UInt64)src[LZMA86_SIZE_OFFSET + i]) << (8 * i); - return SZ_OK; -} - -SRes Lzma86_Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen) -{ - SRes res; - int useFilter; - SizeT inSizePure; - ELzmaStatus status; - - if (*srcLen < LZMA86_HEADER_SIZE) - return SZ_ERROR_INPUT_EOF; - - useFilter = src[0]; - - if (useFilter > 1) - { - *destLen = 0; - return SZ_ERROR_UNSUPPORTED; - } - - inSizePure = *srcLen - LZMA86_HEADER_SIZE; - res = LzmaDecode(dest, destLen, src + LZMA86_HEADER_SIZE, &inSizePure, - src + 1, LZMA_PROPS_SIZE, LZMA_FINISH_ANY, &status, &g_Alloc); - *srcLen = inSizePure + LZMA86_HEADER_SIZE; - if (res != SZ_OK) - return res; - if (useFilter == 1) - { - UInt32 x86State; - x86_Convert_Init(x86State); - x86_Convert(dest, *destLen, 0, &x86State, 0); - } - return SZ_OK; -} +/* Lzma86Dec.c -- LZMA + x86 (BCJ) Filter Decoder +2016-05-16 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "Lzma86.h" + +#include "Alloc.h" +#include "Bra.h" +#include "LzmaDec.h" + +SRes Lzma86_GetUnpackSize(const Byte *src, SizeT srcLen, UInt64 *unpackSize) +{ + unsigned i; + if (srcLen < LZMA86_HEADER_SIZE) + return SZ_ERROR_INPUT_EOF; + *unpackSize = 0; + for (i = 0; i < sizeof(UInt64); i++) + *unpackSize += ((UInt64)src[LZMA86_SIZE_OFFSET + i]) << (8 * i); + return SZ_OK; +} + +SRes Lzma86_Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen) +{ + SRes res; + int useFilter; + SizeT inSizePure; + ELzmaStatus status; + + if (*srcLen < LZMA86_HEADER_SIZE) + return SZ_ERROR_INPUT_EOF; + + useFilter = src[0]; + + if (useFilter > 1) + { + *destLen = 0; + return SZ_ERROR_UNSUPPORTED; + } + + inSizePure = *srcLen - LZMA86_HEADER_SIZE; + res = LzmaDecode(dest, destLen, src + LZMA86_HEADER_SIZE, &inSizePure, + src + 1, LZMA_PROPS_SIZE, LZMA_FINISH_ANY, &status, &g_Alloc); + *srcLen = inSizePure + LZMA86_HEADER_SIZE; + if (res != SZ_OK) + return res; + if (useFilter == 1) + { + UInt32 x86State; + x86_Convert_Init(x86State); + x86_Convert(dest, *destLen, 0, &x86State, 0); + } + return SZ_OK; +} diff --git a/deps/LZMA-SDK/C/Lzma86Enc.c b/deps/LZMA-SDK/C/Lzma86Enc.c index 99397bc5e..14fcd65c6 100644 --- a/deps/LZMA-SDK/C/Lzma86Enc.c +++ b/deps/LZMA-SDK/C/Lzma86Enc.c @@ -1,104 +1,104 @@ -/* Lzma86Enc.c -- LZMA + x86 (BCJ) Filter Encoder -2018-07-04 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include - -#include "Lzma86.h" - -#include "Alloc.h" -#include "Bra.h" -#include "LzmaEnc.h" - -int Lzma86_Encode(Byte *dest, size_t *destLen, const Byte *src, size_t srcLen, - int level, UInt32 dictSize, int filterMode) -{ - size_t outSize2 = *destLen; - Byte *filteredStream; - BoolInt useFilter; - int mainResult = SZ_ERROR_OUTPUT_EOF; - CLzmaEncProps props; - LzmaEncProps_Init(&props); - props.level = level; - props.dictSize = dictSize; - - *destLen = 0; - if (outSize2 < LZMA86_HEADER_SIZE) - return SZ_ERROR_OUTPUT_EOF; - - { - int i; - UInt64 t = srcLen; - for (i = 0; i < 8; i++, t >>= 8) - dest[LZMA86_SIZE_OFFSET + i] = (Byte)t; - } - - filteredStream = 0; - useFilter = (filterMode != SZ_FILTER_NO); - if (useFilter) - { - if (srcLen != 0) - { - filteredStream = (Byte *)MyAlloc(srcLen); - if (filteredStream == 0) - return SZ_ERROR_MEM; - memcpy(filteredStream, src, srcLen); - } - { - UInt32 x86State; - x86_Convert_Init(x86State); - x86_Convert(filteredStream, srcLen, 0, &x86State, 1); - } - } - - { - size_t minSize = 0; - BoolInt bestIsFiltered = False; - - /* passes for SZ_FILTER_AUTO: - 0 - BCJ + LZMA - 1 - LZMA - 2 - BCJ + LZMA agaian, if pass 0 (BCJ + LZMA) is better. - */ - int numPasses = (filterMode == SZ_FILTER_AUTO) ? 3 : 1; - - int i; - for (i = 0; i < numPasses; i++) - { - size_t outSizeProcessed = outSize2 - LZMA86_HEADER_SIZE; - size_t outPropsSize = 5; - SRes curRes; - BoolInt curModeIsFiltered = (numPasses > 1 && i == numPasses - 1); - if (curModeIsFiltered && !bestIsFiltered) - break; - if (useFilter && i == 0) - curModeIsFiltered = True; - - curRes = LzmaEncode(dest + LZMA86_HEADER_SIZE, &outSizeProcessed, - curModeIsFiltered ? filteredStream : src, srcLen, - &props, dest + 1, &outPropsSize, 0, - NULL, &g_Alloc, &g_Alloc); - - if (curRes != SZ_ERROR_OUTPUT_EOF) - { - if (curRes != SZ_OK) - { - mainResult = curRes; - break; - } - if (outSizeProcessed <= minSize || mainResult != SZ_OK) - { - minSize = outSizeProcessed; - bestIsFiltered = curModeIsFiltered; - mainResult = SZ_OK; - } - } - } - dest[0] = (Byte)(bestIsFiltered ? 1 : 0); - *destLen = LZMA86_HEADER_SIZE + minSize; - } - if (useFilter) - MyFree(filteredStream); - return mainResult; -} +/* Lzma86Enc.c -- LZMA + x86 (BCJ) Filter Encoder +2018-07-04 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include + +#include "Lzma86.h" + +#include "Alloc.h" +#include "Bra.h" +#include "LzmaEnc.h" + +int Lzma86_Encode(Byte *dest, size_t *destLen, const Byte *src, size_t srcLen, + int level, UInt32 dictSize, int filterMode) +{ + size_t outSize2 = *destLen; + Byte *filteredStream; + BoolInt useFilter; + int mainResult = SZ_ERROR_OUTPUT_EOF; + CLzmaEncProps props; + LzmaEncProps_Init(&props); + props.level = level; + props.dictSize = dictSize; + + *destLen = 0; + if (outSize2 < LZMA86_HEADER_SIZE) + return SZ_ERROR_OUTPUT_EOF; + + { + int i; + UInt64 t = srcLen; + for (i = 0; i < 8; i++, t >>= 8) + dest[LZMA86_SIZE_OFFSET + i] = (Byte)t; + } + + filteredStream = 0; + useFilter = (filterMode != SZ_FILTER_NO); + if (useFilter) + { + if (srcLen != 0) + { + filteredStream = (Byte *)MyAlloc(srcLen); + if (filteredStream == 0) + return SZ_ERROR_MEM; + memcpy(filteredStream, src, srcLen); + } + { + UInt32 x86State; + x86_Convert_Init(x86State); + x86_Convert(filteredStream, srcLen, 0, &x86State, 1); + } + } + + { + size_t minSize = 0; + BoolInt bestIsFiltered = False; + + /* passes for SZ_FILTER_AUTO: + 0 - BCJ + LZMA + 1 - LZMA + 2 - BCJ + LZMA agaian, if pass 0 (BCJ + LZMA) is better. + */ + int numPasses = (filterMode == SZ_FILTER_AUTO) ? 3 : 1; + + int i; + for (i = 0; i < numPasses; i++) + { + size_t outSizeProcessed = outSize2 - LZMA86_HEADER_SIZE; + size_t outPropsSize = 5; + SRes curRes; + BoolInt curModeIsFiltered = (numPasses > 1 && i == numPasses - 1); + if (curModeIsFiltered && !bestIsFiltered) + break; + if (useFilter && i == 0) + curModeIsFiltered = True; + + curRes = LzmaEncode(dest + LZMA86_HEADER_SIZE, &outSizeProcessed, + curModeIsFiltered ? filteredStream : src, srcLen, + &props, dest + 1, &outPropsSize, 0, + NULL, &g_Alloc, &g_Alloc); + + if (curRes != SZ_ERROR_OUTPUT_EOF) + { + if (curRes != SZ_OK) + { + mainResult = curRes; + break; + } + if (outSizeProcessed <= minSize || mainResult != SZ_OK) + { + minSize = outSizeProcessed; + bestIsFiltered = curModeIsFiltered; + mainResult = SZ_OK; + } + } + } + dest[0] = (Byte)(bestIsFiltered ? 1 : 0); + *destLen = LZMA86_HEADER_SIZE + minSize; + } + if (useFilter) + MyFree(filteredStream); + return mainResult; +} diff --git a/deps/LZMA-SDK/C/LzmaDec.c b/deps/LZMA-SDK/C/LzmaDec.c index 80b70a9ee..d6742e5af 100644 --- a/deps/LZMA-SDK/C/LzmaDec.c +++ b/deps/LZMA-SDK/C/LzmaDec.c @@ -1,1363 +1,1363 @@ -/* LzmaDec.c -- LZMA Decoder -2021-04-01 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include - -/* #include "CpuArch.h" */ -#include "LzmaDec.h" - -#define kNumTopBits 24 -#define kTopValue ((UInt32)1 << kNumTopBits) - -#define kNumBitModelTotalBits 11 -#define kBitModelTotal (1 << kNumBitModelTotalBits) - -#define RC_INIT_SIZE 5 - -#ifndef _LZMA_DEC_OPT - -#define kNumMoveBits 5 -#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); } - -#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * (UInt32)ttt; if (code < bound) -#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); -#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits)); -#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \ - { UPDATE_0(p); i = (i + i); A0; } else \ - { UPDATE_1(p); i = (i + i) + 1; A1; } - -#define TREE_GET_BIT(probs, i) { GET_BIT2(probs + i, i, ;, ;); } - -#define REV_BIT(p, i, A0, A1) IF_BIT_0(p + i) \ - { UPDATE_0(p + i); A0; } else \ - { UPDATE_1(p + i); A1; } -#define REV_BIT_VAR( p, i, m) REV_BIT(p, i, i += m; m += m, m += m; i += m; ) -#define REV_BIT_CONST(p, i, m) REV_BIT(p, i, i += m; , i += m * 2; ) -#define REV_BIT_LAST( p, i, m) REV_BIT(p, i, i -= m , ; ) - -#define TREE_DECODE(probs, limit, i) \ - { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; } - -/* #define _LZMA_SIZE_OPT */ - -#ifdef _LZMA_SIZE_OPT -#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i) -#else -#define TREE_6_DECODE(probs, i) \ - { i = 1; \ - TREE_GET_BIT(probs, i); \ - TREE_GET_BIT(probs, i); \ - TREE_GET_BIT(probs, i); \ - TREE_GET_BIT(probs, i); \ - TREE_GET_BIT(probs, i); \ - TREE_GET_BIT(probs, i); \ - i -= 0x40; } -#endif - -#define NORMAL_LITER_DEC TREE_GET_BIT(prob, symbol) -#define MATCHED_LITER_DEC \ - matchByte += matchByte; \ - bit = offs; \ - offs &= matchByte; \ - probLit = prob + (offs + bit + symbol); \ - GET_BIT2(probLit, symbol, offs ^= bit; , ;) - -#endif // _LZMA_DEC_OPT - - -#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_INPUT_EOF; range <<= 8; code = (code << 8) | (*buf++); } - -#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * (UInt32)ttt; if (code < bound) -#define UPDATE_0_CHECK range = bound; -#define UPDATE_1_CHECK range -= bound; code -= bound; -#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \ - { UPDATE_0_CHECK; i = (i + i); A0; } else \ - { UPDATE_1_CHECK; i = (i + i) + 1; A1; } -#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;) -#define TREE_DECODE_CHECK(probs, limit, i) \ - { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; } - - -#define REV_BIT_CHECK(p, i, m) IF_BIT_0_CHECK(p + i) \ - { UPDATE_0_CHECK; i += m; m += m; } else \ - { UPDATE_1_CHECK; m += m; i += m; } - - -#define kNumPosBitsMax 4 -#define kNumPosStatesMax (1 << kNumPosBitsMax) - -#define kLenNumLowBits 3 -#define kLenNumLowSymbols (1 << kLenNumLowBits) -#define kLenNumHighBits 8 -#define kLenNumHighSymbols (1 << kLenNumHighBits) - -#define LenLow 0 -#define LenHigh (LenLow + 2 * (kNumPosStatesMax << kLenNumLowBits)) -#define kNumLenProbs (LenHigh + kLenNumHighSymbols) - -#define LenChoice LenLow -#define LenChoice2 (LenLow + (1 << kLenNumLowBits)) - -#define kNumStates 12 -#define kNumStates2 16 -#define kNumLitStates 7 - -#define kStartPosModelIndex 4 -#define kEndPosModelIndex 14 -#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) - -#define kNumPosSlotBits 6 -#define kNumLenToPosStates 4 - -#define kNumAlignBits 4 -#define kAlignTableSize (1 << kNumAlignBits) - -#define kMatchMinLen 2 -#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols * 2 + kLenNumHighSymbols) - -#define kMatchSpecLen_Error_Data (1 << 9) -#define kMatchSpecLen_Error_Fail (kMatchSpecLen_Error_Data - 1) - -/* External ASM code needs same CLzmaProb array layout. So don't change it. */ - -/* (probs_1664) is faster and better for code size at some platforms */ -/* -#ifdef MY_CPU_X86_OR_AMD64 -*/ -#define kStartOffset 1664 -#define GET_PROBS p->probs_1664 -/* -#define GET_PROBS p->probs + kStartOffset -#else -#define kStartOffset 0 -#define GET_PROBS p->probs -#endif -*/ - -#define SpecPos (-kStartOffset) -#define IsRep0Long (SpecPos + kNumFullDistances) -#define RepLenCoder (IsRep0Long + (kNumStates2 << kNumPosBitsMax)) -#define LenCoder (RepLenCoder + kNumLenProbs) -#define IsMatch (LenCoder + kNumLenProbs) -#define Align (IsMatch + (kNumStates2 << kNumPosBitsMax)) -#define IsRep (Align + kAlignTableSize) -#define IsRepG0 (IsRep + kNumStates) -#define IsRepG1 (IsRepG0 + kNumStates) -#define IsRepG2 (IsRepG1 + kNumStates) -#define PosSlot (IsRepG2 + kNumStates) -#define Literal (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) -#define NUM_BASE_PROBS (Literal + kStartOffset) - -#if Align != 0 && kStartOffset != 0 - #error Stop_Compiling_Bad_LZMA_kAlign -#endif - -#if NUM_BASE_PROBS != 1984 - #error Stop_Compiling_Bad_LZMA_PROBS -#endif - - -#define LZMA_LIT_SIZE 0x300 - -#define LzmaProps_GetNumProbs(p) (NUM_BASE_PROBS + ((UInt32)LZMA_LIT_SIZE << ((p)->lc + (p)->lp))) - - -#define CALC_POS_STATE(processedPos, pbMask) (((processedPos) & (pbMask)) << 4) -#define COMBINED_PS_STATE (posState + state) -#define GET_LEN_STATE (posState) - -#define LZMA_DIC_MIN (1 << 12) - -/* -p->remainLen : shows status of LZMA decoder: - < kMatchSpecLenStart : the number of bytes to be copied with (p->rep0) offset - = kMatchSpecLenStart : the LZMA stream was finished with end mark - = kMatchSpecLenStart + 1 : need init range coder - = kMatchSpecLenStart + 2 : need init range coder and state - = kMatchSpecLen_Error_Fail : Internal Code Failure - = kMatchSpecLen_Error_Data + [0 ... 273] : LZMA Data Error -*/ - -/* ---------- LZMA_DECODE_REAL ---------- */ -/* -LzmaDec_DecodeReal_3() can be implemented in external ASM file. -3 - is the code compatibility version of that function for check at link time. -*/ - -#define LZMA_DECODE_REAL LzmaDec_DecodeReal_3 - -/* -LZMA_DECODE_REAL() -In: - RangeCoder is normalized - if (p->dicPos == limit) - { - LzmaDec_TryDummy() was called before to exclude LITERAL and MATCH-REP cases. - So first symbol can be only MATCH-NON-REP. And if that MATCH-NON-REP symbol - is not END_OF_PAYALOAD_MARKER, then the function doesn't write any byte to dictionary, - the function returns SZ_OK, and the caller can use (p->remainLen) and (p->reps[0]) later. - } - -Processing: - The first LZMA symbol will be decoded in any case. - All main checks for limits are at the end of main loop, - It decodes additional LZMA-symbols while (p->buf < bufLimit && dicPos < limit), - RangeCoder is still without last normalization when (p->buf < bufLimit) is being checked. - But if (p->buf < bufLimit), the caller provided at least (LZMA_REQUIRED_INPUT_MAX + 1) bytes for - next iteration before limit (bufLimit + LZMA_REQUIRED_INPUT_MAX), - that is enough for worst case LZMA symbol with one additional RangeCoder normalization for one bit. - So that function never reads bufLimit [LZMA_REQUIRED_INPUT_MAX] byte. - -Out: - RangeCoder is normalized - Result: - SZ_OK - OK - p->remainLen: - < kMatchSpecLenStart : the number of bytes to be copied with (p->reps[0]) offset - = kMatchSpecLenStart : the LZMA stream was finished with end mark - - SZ_ERROR_DATA - error, when the MATCH-Symbol refers out of dictionary - p->remainLen : undefined - p->reps[*] : undefined -*/ - - -#ifdef _LZMA_DEC_OPT - -int MY_FAST_CALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit); - -#else - -static -int MY_FAST_CALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit) -{ - CLzmaProb *probs = GET_PROBS; - unsigned state = (unsigned)p->state; - UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3]; - unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1; - unsigned lc = p->prop.lc; - unsigned lpMask = ((unsigned)0x100 << p->prop.lp) - ((unsigned)0x100 >> lc); - - Byte *dic = p->dic; - SizeT dicBufSize = p->dicBufSize; - SizeT dicPos = p->dicPos; - - UInt32 processedPos = p->processedPos; - UInt32 checkDicSize = p->checkDicSize; - unsigned len = 0; - - const Byte *buf = p->buf; - UInt32 range = p->range; - UInt32 code = p->code; - - do - { - CLzmaProb *prob; - UInt32 bound; - unsigned ttt; - unsigned posState = CALC_POS_STATE(processedPos, pbMask); - - prob = probs + IsMatch + COMBINED_PS_STATE; - IF_BIT_0(prob) - { - unsigned symbol; - UPDATE_0(prob); - prob = probs + Literal; - if (processedPos != 0 || checkDicSize != 0) - prob += (UInt32)3 * ((((processedPos << 8) + dic[(dicPos == 0 ? dicBufSize : dicPos) - 1]) & lpMask) << lc); - processedPos++; - - if (state < kNumLitStates) - { - state -= (state < 4) ? state : 3; - symbol = 1; - #ifdef _LZMA_SIZE_OPT - do { NORMAL_LITER_DEC } while (symbol < 0x100); - #else - NORMAL_LITER_DEC - NORMAL_LITER_DEC - NORMAL_LITER_DEC - NORMAL_LITER_DEC - NORMAL_LITER_DEC - NORMAL_LITER_DEC - NORMAL_LITER_DEC - NORMAL_LITER_DEC - #endif - } - else - { - unsigned matchByte = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)]; - unsigned offs = 0x100; - state -= (state < 10) ? 3 : 6; - symbol = 1; - #ifdef _LZMA_SIZE_OPT - do - { - unsigned bit; - CLzmaProb *probLit; - MATCHED_LITER_DEC - } - while (symbol < 0x100); - #else - { - unsigned bit; - CLzmaProb *probLit; - MATCHED_LITER_DEC - MATCHED_LITER_DEC - MATCHED_LITER_DEC - MATCHED_LITER_DEC - MATCHED_LITER_DEC - MATCHED_LITER_DEC - MATCHED_LITER_DEC - MATCHED_LITER_DEC - } - #endif - } - - dic[dicPos++] = (Byte)symbol; - continue; - } - - { - UPDATE_1(prob); - prob = probs + IsRep + state; - IF_BIT_0(prob) - { - UPDATE_0(prob); - state += kNumStates; - prob = probs + LenCoder; - } - else - { - UPDATE_1(prob); - prob = probs + IsRepG0 + state; - IF_BIT_0(prob) - { - UPDATE_0(prob); - prob = probs + IsRep0Long + COMBINED_PS_STATE; - IF_BIT_0(prob) - { - UPDATE_0(prob); - - // that case was checked before with kBadRepCode - // if (checkDicSize == 0 && processedPos == 0) { len = kMatchSpecLen_Error_Data + 1; break; } - // The caller doesn't allow (dicPos == limit) case here - // so we don't need the following check: - // if (dicPos == limit) { state = state < kNumLitStates ? 9 : 11; len = 1; break; } - - dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)]; - dicPos++; - processedPos++; - state = state < kNumLitStates ? 9 : 11; - continue; - } - UPDATE_1(prob); - } - else - { - UInt32 distance; - UPDATE_1(prob); - prob = probs + IsRepG1 + state; - IF_BIT_0(prob) - { - UPDATE_0(prob); - distance = rep1; - } - else - { - UPDATE_1(prob); - prob = probs + IsRepG2 + state; - IF_BIT_0(prob) - { - UPDATE_0(prob); - distance = rep2; - } - else - { - UPDATE_1(prob); - distance = rep3; - rep3 = rep2; - } - rep2 = rep1; - } - rep1 = rep0; - rep0 = distance; - } - state = state < kNumLitStates ? 8 : 11; - prob = probs + RepLenCoder; - } - - #ifdef _LZMA_SIZE_OPT - { - unsigned lim, offset; - CLzmaProb *probLen = prob + LenChoice; - IF_BIT_0(probLen) - { - UPDATE_0(probLen); - probLen = prob + LenLow + GET_LEN_STATE; - offset = 0; - lim = (1 << kLenNumLowBits); - } - else - { - UPDATE_1(probLen); - probLen = prob + LenChoice2; - IF_BIT_0(probLen) - { - UPDATE_0(probLen); - probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits); - offset = kLenNumLowSymbols; - lim = (1 << kLenNumLowBits); - } - else - { - UPDATE_1(probLen); - probLen = prob + LenHigh; - offset = kLenNumLowSymbols * 2; - lim = (1 << kLenNumHighBits); - } - } - TREE_DECODE(probLen, lim, len); - len += offset; - } - #else - { - CLzmaProb *probLen = prob + LenChoice; - IF_BIT_0(probLen) - { - UPDATE_0(probLen); - probLen = prob + LenLow + GET_LEN_STATE; - len = 1; - TREE_GET_BIT(probLen, len); - TREE_GET_BIT(probLen, len); - TREE_GET_BIT(probLen, len); - len -= 8; - } - else - { - UPDATE_1(probLen); - probLen = prob + LenChoice2; - IF_BIT_0(probLen) - { - UPDATE_0(probLen); - probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits); - len = 1; - TREE_GET_BIT(probLen, len); - TREE_GET_BIT(probLen, len); - TREE_GET_BIT(probLen, len); - } - else - { - UPDATE_1(probLen); - probLen = prob + LenHigh; - TREE_DECODE(probLen, (1 << kLenNumHighBits), len); - len += kLenNumLowSymbols * 2; - } - } - } - #endif - - if (state >= kNumStates) - { - UInt32 distance; - prob = probs + PosSlot + - ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits); - TREE_6_DECODE(prob, distance); - if (distance >= kStartPosModelIndex) - { - unsigned posSlot = (unsigned)distance; - unsigned numDirectBits = (unsigned)(((distance >> 1) - 1)); - distance = (2 | (distance & 1)); - if (posSlot < kEndPosModelIndex) - { - distance <<= numDirectBits; - prob = probs + SpecPos; - { - UInt32 m = 1; - distance++; - do - { - REV_BIT_VAR(prob, distance, m); - } - while (--numDirectBits); - distance -= m; - } - } - else - { - numDirectBits -= kNumAlignBits; - do - { - NORMALIZE - range >>= 1; - - { - UInt32 t; - code -= range; - t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */ - distance = (distance << 1) + (t + 1); - code += range & t; - } - /* - distance <<= 1; - if (code >= range) - { - code -= range; - distance |= 1; - } - */ - } - while (--numDirectBits); - prob = probs + Align; - distance <<= kNumAlignBits; - { - unsigned i = 1; - REV_BIT_CONST(prob, i, 1); - REV_BIT_CONST(prob, i, 2); - REV_BIT_CONST(prob, i, 4); - REV_BIT_LAST (prob, i, 8); - distance |= i; - } - if (distance == (UInt32)0xFFFFFFFF) - { - len = kMatchSpecLenStart; - state -= kNumStates; - break; - } - } - } - - rep3 = rep2; - rep2 = rep1; - rep1 = rep0; - rep0 = distance + 1; - state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3; - if (distance >= (checkDicSize == 0 ? processedPos: checkDicSize)) - { - len += kMatchSpecLen_Error_Data + kMatchMinLen; - // len = kMatchSpecLen_Error_Data; - // len += kMatchMinLen; - break; - } - } - - len += kMatchMinLen; - - { - SizeT rem; - unsigned curLen; - SizeT pos; - - if ((rem = limit - dicPos) == 0) - { - /* - We stop decoding and return SZ_OK, and we can resume decoding later. - Any error conditions can be tested later in caller code. - For more strict mode we can stop decoding with error - // len += kMatchSpecLen_Error_Data; - */ - break; - } - - curLen = ((rem < len) ? (unsigned)rem : len); - pos = dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0); - - processedPos += (UInt32)curLen; - - len -= curLen; - if (curLen <= dicBufSize - pos) - { - Byte *dest = dic + dicPos; - ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos; - const Byte *lim = dest + curLen; - dicPos += (SizeT)curLen; - do - *(dest) = (Byte)*(dest + src); - while (++dest != lim); - } - else - { - do - { - dic[dicPos++] = dic[pos]; - if (++pos == dicBufSize) - pos = 0; - } - while (--curLen != 0); - } - } - } - } - while (dicPos < limit && buf < bufLimit); - - NORMALIZE; - - p->buf = buf; - p->range = range; - p->code = code; - p->remainLen = (UInt32)len; // & (kMatchSpecLen_Error_Data - 1); // we can write real length for error matches too. - p->dicPos = dicPos; - p->processedPos = processedPos; - p->reps[0] = rep0; - p->reps[1] = rep1; - p->reps[2] = rep2; - p->reps[3] = rep3; - p->state = (UInt32)state; - if (len >= kMatchSpecLen_Error_Data) - return SZ_ERROR_DATA; - return SZ_OK; -} -#endif - - - -static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit) -{ - unsigned len = (unsigned)p->remainLen; - if (len == 0 /* || len >= kMatchSpecLenStart */) - return; - { - SizeT dicPos = p->dicPos; - Byte *dic; - SizeT dicBufSize; - SizeT rep0; /* we use SizeT to avoid the BUG of VC14 for AMD64 */ - { - SizeT rem = limit - dicPos; - if (rem < len) - { - len = (unsigned)(rem); - if (len == 0) - return; - } - } - - if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len) - p->checkDicSize = p->prop.dicSize; - - p->processedPos += (UInt32)len; - p->remainLen -= (UInt32)len; - dic = p->dic; - rep0 = p->reps[0]; - dicBufSize = p->dicBufSize; - do - { - dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)]; - dicPos++; - } - while (--len); - p->dicPos = dicPos; - } -} - - -/* -At staring of new stream we have one of the following symbols: - - Literal - is allowed - - Non-Rep-Match - is allowed only if it's end marker symbol - - Rep-Match - is not allowed -We use early check of (RangeCoder:Code) over kBadRepCode to simplify main decoding code -*/ - -#define kRange0 0xFFFFFFFF -#define kBound0 ((kRange0 >> kNumBitModelTotalBits) << (kNumBitModelTotalBits - 1)) -#define kBadRepCode (kBound0 + (((kRange0 - kBound0) >> kNumBitModelTotalBits) << (kNumBitModelTotalBits - 1))) -#if kBadRepCode != (0xC0000000 - 0x400) - #error Stop_Compiling_Bad_LZMA_Check -#endif - - -/* -LzmaDec_DecodeReal2(): - It calls LZMA_DECODE_REAL() and it adjusts limit according (p->checkDicSize). - -We correct (p->checkDicSize) after LZMA_DECODE_REAL() and in LzmaDec_WriteRem(), -and we support the following state of (p->checkDicSize): - if (total_processed < p->prop.dicSize) then - { - (total_processed == p->processedPos) - (p->checkDicSize == 0) - } - else - (p->checkDicSize == p->prop.dicSize) -*/ - -static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit) -{ - if (p->checkDicSize == 0) - { - UInt32 rem = p->prop.dicSize - p->processedPos; - if (limit - p->dicPos > rem) - limit = p->dicPos + rem; - } - { - int res = LZMA_DECODE_REAL(p, limit, bufLimit); - if (p->checkDicSize == 0 && p->processedPos >= p->prop.dicSize) - p->checkDicSize = p->prop.dicSize; - return res; - } -} - - - -typedef enum -{ - DUMMY_INPUT_EOF, /* need more input data */ - DUMMY_LIT, - DUMMY_MATCH, - DUMMY_REP -} ELzmaDummy; - - -#define IS_DUMMY_END_MARKER_POSSIBLE(dummyRes) ((dummyRes) == DUMMY_MATCH) - -static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, const Byte **bufOut) -{ - UInt32 range = p->range; - UInt32 code = p->code; - const Byte *bufLimit = *bufOut; - const CLzmaProb *probs = GET_PROBS; - unsigned state = (unsigned)p->state; - ELzmaDummy res; - - for (;;) - { - const CLzmaProb *prob; - UInt32 bound; - unsigned ttt; - unsigned posState = CALC_POS_STATE(p->processedPos, ((unsigned)1 << p->prop.pb) - 1); - - prob = probs + IsMatch + COMBINED_PS_STATE; - IF_BIT_0_CHECK(prob) - { - UPDATE_0_CHECK - - prob = probs + Literal; - if (p->checkDicSize != 0 || p->processedPos != 0) - prob += ((UInt32)LZMA_LIT_SIZE * - ((((p->processedPos) & (((unsigned)1 << (p->prop.lp)) - 1)) << p->prop.lc) + - ((unsigned)p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc)))); - - if (state < kNumLitStates) - { - unsigned symbol = 1; - do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100); - } - else - { - unsigned matchByte = p->dic[p->dicPos - p->reps[0] + - (p->dicPos < p->reps[0] ? p->dicBufSize : 0)]; - unsigned offs = 0x100; - unsigned symbol = 1; - do - { - unsigned bit; - const CLzmaProb *probLit; - matchByte += matchByte; - bit = offs; - offs &= matchByte; - probLit = prob + (offs + bit + symbol); - GET_BIT2_CHECK(probLit, symbol, offs ^= bit; , ; ) - } - while (symbol < 0x100); - } - res = DUMMY_LIT; - } - else - { - unsigned len; - UPDATE_1_CHECK; - - prob = probs + IsRep + state; - IF_BIT_0_CHECK(prob) - { - UPDATE_0_CHECK; - state = 0; - prob = probs + LenCoder; - res = DUMMY_MATCH; - } - else - { - UPDATE_1_CHECK; - res = DUMMY_REP; - prob = probs + IsRepG0 + state; - IF_BIT_0_CHECK(prob) - { - UPDATE_0_CHECK; - prob = probs + IsRep0Long + COMBINED_PS_STATE; - IF_BIT_0_CHECK(prob) - { - UPDATE_0_CHECK; - break; - } - else - { - UPDATE_1_CHECK; - } - } - else - { - UPDATE_1_CHECK; - prob = probs + IsRepG1 + state; - IF_BIT_0_CHECK(prob) - { - UPDATE_0_CHECK; - } - else - { - UPDATE_1_CHECK; - prob = probs + IsRepG2 + state; - IF_BIT_0_CHECK(prob) - { - UPDATE_0_CHECK; - } - else - { - UPDATE_1_CHECK; - } - } - } - state = kNumStates; - prob = probs + RepLenCoder; - } - { - unsigned limit, offset; - const CLzmaProb *probLen = prob + LenChoice; - IF_BIT_0_CHECK(probLen) - { - UPDATE_0_CHECK; - probLen = prob + LenLow + GET_LEN_STATE; - offset = 0; - limit = 1 << kLenNumLowBits; - } - else - { - UPDATE_1_CHECK; - probLen = prob + LenChoice2; - IF_BIT_0_CHECK(probLen) - { - UPDATE_0_CHECK; - probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits); - offset = kLenNumLowSymbols; - limit = 1 << kLenNumLowBits; - } - else - { - UPDATE_1_CHECK; - probLen = prob + LenHigh; - offset = kLenNumLowSymbols * 2; - limit = 1 << kLenNumHighBits; - } - } - TREE_DECODE_CHECK(probLen, limit, len); - len += offset; - } - - if (state < 4) - { - unsigned posSlot; - prob = probs + PosSlot + - ((len < kNumLenToPosStates - 1 ? len : kNumLenToPosStates - 1) << - kNumPosSlotBits); - TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot); - if (posSlot >= kStartPosModelIndex) - { - unsigned numDirectBits = ((posSlot >> 1) - 1); - - if (posSlot < kEndPosModelIndex) - { - prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits); - } - else - { - numDirectBits -= kNumAlignBits; - do - { - NORMALIZE_CHECK - range >>= 1; - code -= range & (((code - range) >> 31) - 1); - /* if (code >= range) code -= range; */ - } - while (--numDirectBits); - prob = probs + Align; - numDirectBits = kNumAlignBits; - } - { - unsigned i = 1; - unsigned m = 1; - do - { - REV_BIT_CHECK(prob, i, m); - } - while (--numDirectBits); - } - } - } - } - break; - } - NORMALIZE_CHECK; - - *bufOut = buf; - return res; -} - -void LzmaDec_InitDicAndState(CLzmaDec *p, BoolInt initDic, BoolInt initState); -void LzmaDec_InitDicAndState(CLzmaDec *p, BoolInt initDic, BoolInt initState) -{ - p->remainLen = kMatchSpecLenStart + 1; - p->tempBufSize = 0; - - if (initDic) - { - p->processedPos = 0; - p->checkDicSize = 0; - p->remainLen = kMatchSpecLenStart + 2; - } - if (initState) - p->remainLen = kMatchSpecLenStart + 2; -} - -void LzmaDec_Init(CLzmaDec *p) -{ - p->dicPos = 0; - LzmaDec_InitDicAndState(p, True, True); -} - - -/* -LZMA supports optional end_marker. -So the decoder can lookahead for one additional LZMA-Symbol to check end_marker. -That additional LZMA-Symbol can require up to LZMA_REQUIRED_INPUT_MAX bytes in input stream. -When the decoder reaches dicLimit, it looks (finishMode) parameter: - if (finishMode == LZMA_FINISH_ANY), the decoder doesn't lookahead - if (finishMode != LZMA_FINISH_ANY), the decoder lookahead, if end_marker is possible for current position - -When the decoder lookahead, and the lookahead symbol is not end_marker, we have two ways: - 1) Strict mode (default) : the decoder returns SZ_ERROR_DATA. - 2) The relaxed mode (alternative mode) : we could return SZ_OK, and the caller - must check (status) value. The caller can show the error, - if the end of stream is expected, and the (status) is noit - LZMA_STATUS_FINISHED_WITH_MARK or LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK. -*/ - - -#define RETURN__NOT_FINISHED__FOR_FINISH \ - *status = LZMA_STATUS_NOT_FINISHED; \ - return SZ_ERROR_DATA; // for strict mode - // return SZ_OK; // for relaxed mode - - -SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen, - ELzmaFinishMode finishMode, ELzmaStatus *status) -{ - SizeT inSize = *srcLen; - (*srcLen) = 0; - *status = LZMA_STATUS_NOT_SPECIFIED; - - if (p->remainLen > kMatchSpecLenStart) - { - if (p->remainLen > kMatchSpecLenStart + 2) - return p->remainLen == kMatchSpecLen_Error_Fail ? SZ_ERROR_FAIL : SZ_ERROR_DATA; - - for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--) - p->tempBuf[p->tempBufSize++] = *src++; - if (p->tempBufSize != 0 && p->tempBuf[0] != 0) - return SZ_ERROR_DATA; - if (p->tempBufSize < RC_INIT_SIZE) - { - *status = LZMA_STATUS_NEEDS_MORE_INPUT; - return SZ_OK; - } - p->code = - ((UInt32)p->tempBuf[1] << 24) - | ((UInt32)p->tempBuf[2] << 16) - | ((UInt32)p->tempBuf[3] << 8) - | ((UInt32)p->tempBuf[4]); - - if (p->checkDicSize == 0 - && p->processedPos == 0 - && p->code >= kBadRepCode) - return SZ_ERROR_DATA; - - p->range = 0xFFFFFFFF; - p->tempBufSize = 0; - - if (p->remainLen > kMatchSpecLenStart + 1) - { - SizeT numProbs = LzmaProps_GetNumProbs(&p->prop); - SizeT i; - CLzmaProb *probs = p->probs; - for (i = 0; i < numProbs; i++) - probs[i] = kBitModelTotal >> 1; - p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1; - p->state = 0; - } - - p->remainLen = 0; - } - - for (;;) - { - if (p->remainLen == kMatchSpecLenStart) - { - if (p->code != 0) - return SZ_ERROR_DATA; - *status = LZMA_STATUS_FINISHED_WITH_MARK; - return SZ_OK; - } - - LzmaDec_WriteRem(p, dicLimit); - - { - // (p->remainLen == 0 || p->dicPos == dicLimit) - - int checkEndMarkNow = 0; - - if (p->dicPos >= dicLimit) - { - if (p->remainLen == 0 && p->code == 0) - { - *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK; - return SZ_OK; - } - if (finishMode == LZMA_FINISH_ANY) - { - *status = LZMA_STATUS_NOT_FINISHED; - return SZ_OK; - } - if (p->remainLen != 0) - { - RETURN__NOT_FINISHED__FOR_FINISH; - } - checkEndMarkNow = 1; - } - - // (p->remainLen == 0) - - if (p->tempBufSize == 0) - { - const Byte *bufLimit; - int dummyProcessed = -1; - - if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) - { - const Byte *bufOut = src + inSize; - - ELzmaDummy dummyRes = LzmaDec_TryDummy(p, src, &bufOut); - - if (dummyRes == DUMMY_INPUT_EOF) - { - size_t i; - if (inSize >= LZMA_REQUIRED_INPUT_MAX) - break; - (*srcLen) += inSize; - p->tempBufSize = (unsigned)inSize; - for (i = 0; i < inSize; i++) - p->tempBuf[i] = src[i]; - *status = LZMA_STATUS_NEEDS_MORE_INPUT; - return SZ_OK; - } - - dummyProcessed = (int)(bufOut - src); - if ((unsigned)dummyProcessed > LZMA_REQUIRED_INPUT_MAX) - break; - - if (checkEndMarkNow && !IS_DUMMY_END_MARKER_POSSIBLE(dummyRes)) - { - unsigned i; - (*srcLen) += (unsigned)dummyProcessed; - p->tempBufSize = (unsigned)dummyProcessed; - for (i = 0; i < (unsigned)dummyProcessed; i++) - p->tempBuf[i] = src[i]; - // p->remainLen = kMatchSpecLen_Error_Data; - RETURN__NOT_FINISHED__FOR_FINISH; - } - - bufLimit = src; - // we will decode only one iteration - } - else - bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX; - - p->buf = src; - - { - int res = LzmaDec_DecodeReal2(p, dicLimit, bufLimit); - - SizeT processed = (SizeT)(p->buf - src); - - if (dummyProcessed < 0) - { - if (processed > inSize) - break; - } - else if ((unsigned)dummyProcessed != processed) - break; - - src += processed; - inSize -= processed; - (*srcLen) += processed; - - if (res != SZ_OK) - { - p->remainLen = kMatchSpecLen_Error_Data; - return SZ_ERROR_DATA; - } - } - continue; - } - - { - // we have some data in (p->tempBuf) - // in strict mode: tempBufSize is not enough for one Symbol decoding. - // in relaxed mode: tempBufSize not larger than required for one Symbol decoding. - - unsigned rem = p->tempBufSize; - unsigned ahead = 0; - int dummyProcessed = -1; - - while (rem < LZMA_REQUIRED_INPUT_MAX && ahead < inSize) - p->tempBuf[rem++] = src[ahead++]; - - // ahead - the size of new data copied from (src) to (p->tempBuf) - // rem - the size of temp buffer including new data from (src) - - if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) - { - const Byte *bufOut = p->tempBuf + rem; - - ELzmaDummy dummyRes = LzmaDec_TryDummy(p, p->tempBuf, &bufOut); - - if (dummyRes == DUMMY_INPUT_EOF) - { - if (rem >= LZMA_REQUIRED_INPUT_MAX) - break; - p->tempBufSize = rem; - (*srcLen) += (SizeT)ahead; - *status = LZMA_STATUS_NEEDS_MORE_INPUT; - return SZ_OK; - } - - dummyProcessed = (int)(bufOut - p->tempBuf); - - if ((unsigned)dummyProcessed < p->tempBufSize) - break; - - if (checkEndMarkNow && !IS_DUMMY_END_MARKER_POSSIBLE(dummyRes)) - { - (*srcLen) += (unsigned)dummyProcessed - p->tempBufSize; - p->tempBufSize = (unsigned)dummyProcessed; - // p->remainLen = kMatchSpecLen_Error_Data; - RETURN__NOT_FINISHED__FOR_FINISH; - } - } - - p->buf = p->tempBuf; - - { - // we decode one symbol from (p->tempBuf) here, so the (bufLimit) is equal to (p->buf) - int res = LzmaDec_DecodeReal2(p, dicLimit, p->buf); - - SizeT processed = (SizeT)(p->buf - p->tempBuf); - rem = p->tempBufSize; - - if (dummyProcessed < 0) - { - if (processed > LZMA_REQUIRED_INPUT_MAX) - break; - if (processed < rem) - break; - } - else if ((unsigned)dummyProcessed != processed) - break; - - processed -= rem; - - src += processed; - inSize -= processed; - (*srcLen) += processed; - p->tempBufSize = 0; - - if (res != SZ_OK) - { - p->remainLen = kMatchSpecLen_Error_Data; - return SZ_ERROR_DATA; - } - } - } - } - } - - /* Some unexpected error: internal error of code, memory corruption or hardware failure */ - p->remainLen = kMatchSpecLen_Error_Fail; - return SZ_ERROR_FAIL; -} - - - -SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) -{ - SizeT outSize = *destLen; - SizeT inSize = *srcLen; - *srcLen = *destLen = 0; - for (;;) - { - SizeT inSizeCur = inSize, outSizeCur, dicPos; - ELzmaFinishMode curFinishMode; - SRes res; - if (p->dicPos == p->dicBufSize) - p->dicPos = 0; - dicPos = p->dicPos; - if (outSize > p->dicBufSize - dicPos) - { - outSizeCur = p->dicBufSize; - curFinishMode = LZMA_FINISH_ANY; - } - else - { - outSizeCur = dicPos + outSize; - curFinishMode = finishMode; - } - - res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status); - src += inSizeCur; - inSize -= inSizeCur; - *srcLen += inSizeCur; - outSizeCur = p->dicPos - dicPos; - memcpy(dest, p->dic + dicPos, outSizeCur); - dest += outSizeCur; - outSize -= outSizeCur; - *destLen += outSizeCur; - if (res != 0) - return res; - if (outSizeCur == 0 || outSize == 0) - return SZ_OK; - } -} - -void LzmaDec_FreeProbs(CLzmaDec *p, ISzAllocPtr alloc) -{ - ISzAlloc_Free(alloc, p->probs); - p->probs = NULL; -} - -static void LzmaDec_FreeDict(CLzmaDec *p, ISzAllocPtr alloc) -{ - ISzAlloc_Free(alloc, p->dic); - p->dic = NULL; -} - -void LzmaDec_Free(CLzmaDec *p, ISzAllocPtr alloc) -{ - LzmaDec_FreeProbs(p, alloc); - LzmaDec_FreeDict(p, alloc); -} - -SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size) -{ - UInt32 dicSize; - Byte d; - - if (size < LZMA_PROPS_SIZE) - return SZ_ERROR_UNSUPPORTED; - else - dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24); - - if (dicSize < LZMA_DIC_MIN) - dicSize = LZMA_DIC_MIN; - p->dicSize = dicSize; - - d = data[0]; - if (d >= (9 * 5 * 5)) - return SZ_ERROR_UNSUPPORTED; - - p->lc = (Byte)(d % 9); - d /= 9; - p->pb = (Byte)(d / 5); - p->lp = (Byte)(d % 5); - - return SZ_OK; -} - -static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAllocPtr alloc) -{ - UInt32 numProbs = LzmaProps_GetNumProbs(propNew); - if (!p->probs || numProbs != p->numProbs) - { - LzmaDec_FreeProbs(p, alloc); - p->probs = (CLzmaProb *)ISzAlloc_Alloc(alloc, numProbs * sizeof(CLzmaProb)); - if (!p->probs) - return SZ_ERROR_MEM; - p->probs_1664 = p->probs + 1664; - p->numProbs = numProbs; - } - return SZ_OK; -} - -SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc) -{ - CLzmaProps propNew; - RINOK(LzmaProps_Decode(&propNew, props, propsSize)); - RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); - p->prop = propNew; - return SZ_OK; -} - -SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc) -{ - CLzmaProps propNew; - SizeT dicBufSize; - RINOK(LzmaProps_Decode(&propNew, props, propsSize)); - RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); - - { - UInt32 dictSize = propNew.dicSize; - SizeT mask = ((UInt32)1 << 12) - 1; - if (dictSize >= ((UInt32)1 << 30)) mask = ((UInt32)1 << 22) - 1; - else if (dictSize >= ((UInt32)1 << 22)) mask = ((UInt32)1 << 20) - 1;; - dicBufSize = ((SizeT)dictSize + mask) & ~mask; - if (dicBufSize < dictSize) - dicBufSize = dictSize; - } - - if (!p->dic || dicBufSize != p->dicBufSize) - { - LzmaDec_FreeDict(p, alloc); - p->dic = (Byte *)ISzAlloc_Alloc(alloc, dicBufSize); - if (!p->dic) - { - LzmaDec_FreeProbs(p, alloc); - return SZ_ERROR_MEM; - } - } - p->dicBufSize = dicBufSize; - p->prop = propNew; - return SZ_OK; -} - -SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, - const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, - ELzmaStatus *status, ISzAllocPtr alloc) -{ - CLzmaDec p; - SRes res; - SizeT outSize = *destLen, inSize = *srcLen; - *destLen = *srcLen = 0; - *status = LZMA_STATUS_NOT_SPECIFIED; - if (inSize < RC_INIT_SIZE) - return SZ_ERROR_INPUT_EOF; - LzmaDec_Construct(&p); - RINOK(LzmaDec_AllocateProbs(&p, propData, propSize, alloc)); - p.dic = dest; - p.dicBufSize = outSize; - LzmaDec_Init(&p); - *srcLen = inSize; - res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status); - *destLen = p.dicPos; - if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT) - res = SZ_ERROR_INPUT_EOF; - LzmaDec_FreeProbs(&p, alloc); - return res; -} +/* LzmaDec.c -- LZMA Decoder +2021-04-01 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include + +/* #include "CpuArch.h" */ +#include "LzmaDec.h" + +#define kNumTopBits 24 +#define kTopValue ((UInt32)1 << kNumTopBits) + +#define kNumBitModelTotalBits 11 +#define kBitModelTotal (1 << kNumBitModelTotalBits) + +#define RC_INIT_SIZE 5 + +#ifndef _LZMA_DEC_OPT + +#define kNumMoveBits 5 +#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); } + +#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * (UInt32)ttt; if (code < bound) +#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); +#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits)); +#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \ + { UPDATE_0(p); i = (i + i); A0; } else \ + { UPDATE_1(p); i = (i + i) + 1; A1; } + +#define TREE_GET_BIT(probs, i) { GET_BIT2(probs + i, i, ;, ;); } + +#define REV_BIT(p, i, A0, A1) IF_BIT_0(p + i) \ + { UPDATE_0(p + i); A0; } else \ + { UPDATE_1(p + i); A1; } +#define REV_BIT_VAR( p, i, m) REV_BIT(p, i, i += m; m += m, m += m; i += m; ) +#define REV_BIT_CONST(p, i, m) REV_BIT(p, i, i += m; , i += m * 2; ) +#define REV_BIT_LAST( p, i, m) REV_BIT(p, i, i -= m , ; ) + +#define TREE_DECODE(probs, limit, i) \ + { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; } + +/* #define _LZMA_SIZE_OPT */ + +#ifdef _LZMA_SIZE_OPT +#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i) +#else +#define TREE_6_DECODE(probs, i) \ + { i = 1; \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + TREE_GET_BIT(probs, i); \ + i -= 0x40; } +#endif + +#define NORMAL_LITER_DEC TREE_GET_BIT(prob, symbol) +#define MATCHED_LITER_DEC \ + matchByte += matchByte; \ + bit = offs; \ + offs &= matchByte; \ + probLit = prob + (offs + bit + symbol); \ + GET_BIT2(probLit, symbol, offs ^= bit; , ;) + +#endif // _LZMA_DEC_OPT + + +#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_INPUT_EOF; range <<= 8; code = (code << 8) | (*buf++); } + +#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * (UInt32)ttt; if (code < bound) +#define UPDATE_0_CHECK range = bound; +#define UPDATE_1_CHECK range -= bound; code -= bound; +#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \ + { UPDATE_0_CHECK; i = (i + i); A0; } else \ + { UPDATE_1_CHECK; i = (i + i) + 1; A1; } +#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;) +#define TREE_DECODE_CHECK(probs, limit, i) \ + { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; } + + +#define REV_BIT_CHECK(p, i, m) IF_BIT_0_CHECK(p + i) \ + { UPDATE_0_CHECK; i += m; m += m; } else \ + { UPDATE_1_CHECK; m += m; i += m; } + + +#define kNumPosBitsMax 4 +#define kNumPosStatesMax (1 << kNumPosBitsMax) + +#define kLenNumLowBits 3 +#define kLenNumLowSymbols (1 << kLenNumLowBits) +#define kLenNumHighBits 8 +#define kLenNumHighSymbols (1 << kLenNumHighBits) + +#define LenLow 0 +#define LenHigh (LenLow + 2 * (kNumPosStatesMax << kLenNumLowBits)) +#define kNumLenProbs (LenHigh + kLenNumHighSymbols) + +#define LenChoice LenLow +#define LenChoice2 (LenLow + (1 << kLenNumLowBits)) + +#define kNumStates 12 +#define kNumStates2 16 +#define kNumLitStates 7 + +#define kStartPosModelIndex 4 +#define kEndPosModelIndex 14 +#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) + +#define kNumPosSlotBits 6 +#define kNumLenToPosStates 4 + +#define kNumAlignBits 4 +#define kAlignTableSize (1 << kNumAlignBits) + +#define kMatchMinLen 2 +#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols * 2 + kLenNumHighSymbols) + +#define kMatchSpecLen_Error_Data (1 << 9) +#define kMatchSpecLen_Error_Fail (kMatchSpecLen_Error_Data - 1) + +/* External ASM code needs same CLzmaProb array layout. So don't change it. */ + +/* (probs_1664) is faster and better for code size at some platforms */ +/* +#ifdef MY_CPU_X86_OR_AMD64 +*/ +#define kStartOffset 1664 +#define GET_PROBS p->probs_1664 +/* +#define GET_PROBS p->probs + kStartOffset +#else +#define kStartOffset 0 +#define GET_PROBS p->probs +#endif +*/ + +#define SpecPos (-kStartOffset) +#define IsRep0Long (SpecPos + kNumFullDistances) +#define RepLenCoder (IsRep0Long + (kNumStates2 << kNumPosBitsMax)) +#define LenCoder (RepLenCoder + kNumLenProbs) +#define IsMatch (LenCoder + kNumLenProbs) +#define Align (IsMatch + (kNumStates2 << kNumPosBitsMax)) +#define IsRep (Align + kAlignTableSize) +#define IsRepG0 (IsRep + kNumStates) +#define IsRepG1 (IsRepG0 + kNumStates) +#define IsRepG2 (IsRepG1 + kNumStates) +#define PosSlot (IsRepG2 + kNumStates) +#define Literal (PosSlot + (kNumLenToPosStates << kNumPosSlotBits)) +#define NUM_BASE_PROBS (Literal + kStartOffset) + +#if Align != 0 && kStartOffset != 0 + #error Stop_Compiling_Bad_LZMA_kAlign +#endif + +#if NUM_BASE_PROBS != 1984 + #error Stop_Compiling_Bad_LZMA_PROBS +#endif + + +#define LZMA_LIT_SIZE 0x300 + +#define LzmaProps_GetNumProbs(p) (NUM_BASE_PROBS + ((UInt32)LZMA_LIT_SIZE << ((p)->lc + (p)->lp))) + + +#define CALC_POS_STATE(processedPos, pbMask) (((processedPos) & (pbMask)) << 4) +#define COMBINED_PS_STATE (posState + state) +#define GET_LEN_STATE (posState) + +#define LZMA_DIC_MIN (1 << 12) + +/* +p->remainLen : shows status of LZMA decoder: + < kMatchSpecLenStart : the number of bytes to be copied with (p->rep0) offset + = kMatchSpecLenStart : the LZMA stream was finished with end mark + = kMatchSpecLenStart + 1 : need init range coder + = kMatchSpecLenStart + 2 : need init range coder and state + = kMatchSpecLen_Error_Fail : Internal Code Failure + = kMatchSpecLen_Error_Data + [0 ... 273] : LZMA Data Error +*/ + +/* ---------- LZMA_DECODE_REAL ---------- */ +/* +LzmaDec_DecodeReal_3() can be implemented in external ASM file. +3 - is the code compatibility version of that function for check at link time. +*/ + +#define LZMA_DECODE_REAL LzmaDec_DecodeReal_3 + +/* +LZMA_DECODE_REAL() +In: + RangeCoder is normalized + if (p->dicPos == limit) + { + LzmaDec_TryDummy() was called before to exclude LITERAL and MATCH-REP cases. + So first symbol can be only MATCH-NON-REP. And if that MATCH-NON-REP symbol + is not END_OF_PAYALOAD_MARKER, then the function doesn't write any byte to dictionary, + the function returns SZ_OK, and the caller can use (p->remainLen) and (p->reps[0]) later. + } + +Processing: + The first LZMA symbol will be decoded in any case. + All main checks for limits are at the end of main loop, + It decodes additional LZMA-symbols while (p->buf < bufLimit && dicPos < limit), + RangeCoder is still without last normalization when (p->buf < bufLimit) is being checked. + But if (p->buf < bufLimit), the caller provided at least (LZMA_REQUIRED_INPUT_MAX + 1) bytes for + next iteration before limit (bufLimit + LZMA_REQUIRED_INPUT_MAX), + that is enough for worst case LZMA symbol with one additional RangeCoder normalization for one bit. + So that function never reads bufLimit [LZMA_REQUIRED_INPUT_MAX] byte. + +Out: + RangeCoder is normalized + Result: + SZ_OK - OK + p->remainLen: + < kMatchSpecLenStart : the number of bytes to be copied with (p->reps[0]) offset + = kMatchSpecLenStart : the LZMA stream was finished with end mark + + SZ_ERROR_DATA - error, when the MATCH-Symbol refers out of dictionary + p->remainLen : undefined + p->reps[*] : undefined +*/ + + +#ifdef _LZMA_DEC_OPT + +int MY_FAST_CALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit); + +#else + +static +int MY_FAST_CALL LZMA_DECODE_REAL(CLzmaDec *p, SizeT limit, const Byte *bufLimit) +{ + CLzmaProb *probs = GET_PROBS; + unsigned state = (unsigned)p->state; + UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3]; + unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1; + unsigned lc = p->prop.lc; + unsigned lpMask = ((unsigned)0x100 << p->prop.lp) - ((unsigned)0x100 >> lc); + + Byte *dic = p->dic; + SizeT dicBufSize = p->dicBufSize; + SizeT dicPos = p->dicPos; + + UInt32 processedPos = p->processedPos; + UInt32 checkDicSize = p->checkDicSize; + unsigned len = 0; + + const Byte *buf = p->buf; + UInt32 range = p->range; + UInt32 code = p->code; + + do + { + CLzmaProb *prob; + UInt32 bound; + unsigned ttt; + unsigned posState = CALC_POS_STATE(processedPos, pbMask); + + prob = probs + IsMatch + COMBINED_PS_STATE; + IF_BIT_0(prob) + { + unsigned symbol; + UPDATE_0(prob); + prob = probs + Literal; + if (processedPos != 0 || checkDicSize != 0) + prob += (UInt32)3 * ((((processedPos << 8) + dic[(dicPos == 0 ? dicBufSize : dicPos) - 1]) & lpMask) << lc); + processedPos++; + + if (state < kNumLitStates) + { + state -= (state < 4) ? state : 3; + symbol = 1; + #ifdef _LZMA_SIZE_OPT + do { NORMAL_LITER_DEC } while (symbol < 0x100); + #else + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + NORMAL_LITER_DEC + #endif + } + else + { + unsigned matchByte = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)]; + unsigned offs = 0x100; + state -= (state < 10) ? 3 : 6; + symbol = 1; + #ifdef _LZMA_SIZE_OPT + do + { + unsigned bit; + CLzmaProb *probLit; + MATCHED_LITER_DEC + } + while (symbol < 0x100); + #else + { + unsigned bit; + CLzmaProb *probLit; + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + MATCHED_LITER_DEC + } + #endif + } + + dic[dicPos++] = (Byte)symbol; + continue; + } + + { + UPDATE_1(prob); + prob = probs + IsRep + state; + IF_BIT_0(prob) + { + UPDATE_0(prob); + state += kNumStates; + prob = probs + LenCoder; + } + else + { + UPDATE_1(prob); + prob = probs + IsRepG0 + state; + IF_BIT_0(prob) + { + UPDATE_0(prob); + prob = probs + IsRep0Long + COMBINED_PS_STATE; + IF_BIT_0(prob) + { + UPDATE_0(prob); + + // that case was checked before with kBadRepCode + // if (checkDicSize == 0 && processedPos == 0) { len = kMatchSpecLen_Error_Data + 1; break; } + // The caller doesn't allow (dicPos == limit) case here + // so we don't need the following check: + // if (dicPos == limit) { state = state < kNumLitStates ? 9 : 11; len = 1; break; } + + dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)]; + dicPos++; + processedPos++; + state = state < kNumLitStates ? 9 : 11; + continue; + } + UPDATE_1(prob); + } + else + { + UInt32 distance; + UPDATE_1(prob); + prob = probs + IsRepG1 + state; + IF_BIT_0(prob) + { + UPDATE_0(prob); + distance = rep1; + } + else + { + UPDATE_1(prob); + prob = probs + IsRepG2 + state; + IF_BIT_0(prob) + { + UPDATE_0(prob); + distance = rep2; + } + else + { + UPDATE_1(prob); + distance = rep3; + rep3 = rep2; + } + rep2 = rep1; + } + rep1 = rep0; + rep0 = distance; + } + state = state < kNumLitStates ? 8 : 11; + prob = probs + RepLenCoder; + } + + #ifdef _LZMA_SIZE_OPT + { + unsigned lim, offset; + CLzmaProb *probLen = prob + LenChoice; + IF_BIT_0(probLen) + { + UPDATE_0(probLen); + probLen = prob + LenLow + GET_LEN_STATE; + offset = 0; + lim = (1 << kLenNumLowBits); + } + else + { + UPDATE_1(probLen); + probLen = prob + LenChoice2; + IF_BIT_0(probLen) + { + UPDATE_0(probLen); + probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits); + offset = kLenNumLowSymbols; + lim = (1 << kLenNumLowBits); + } + else + { + UPDATE_1(probLen); + probLen = prob + LenHigh; + offset = kLenNumLowSymbols * 2; + lim = (1 << kLenNumHighBits); + } + } + TREE_DECODE(probLen, lim, len); + len += offset; + } + #else + { + CLzmaProb *probLen = prob + LenChoice; + IF_BIT_0(probLen) + { + UPDATE_0(probLen); + probLen = prob + LenLow + GET_LEN_STATE; + len = 1; + TREE_GET_BIT(probLen, len); + TREE_GET_BIT(probLen, len); + TREE_GET_BIT(probLen, len); + len -= 8; + } + else + { + UPDATE_1(probLen); + probLen = prob + LenChoice2; + IF_BIT_0(probLen) + { + UPDATE_0(probLen); + probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits); + len = 1; + TREE_GET_BIT(probLen, len); + TREE_GET_BIT(probLen, len); + TREE_GET_BIT(probLen, len); + } + else + { + UPDATE_1(probLen); + probLen = prob + LenHigh; + TREE_DECODE(probLen, (1 << kLenNumHighBits), len); + len += kLenNumLowSymbols * 2; + } + } + } + #endif + + if (state >= kNumStates) + { + UInt32 distance; + prob = probs + PosSlot + + ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits); + TREE_6_DECODE(prob, distance); + if (distance >= kStartPosModelIndex) + { + unsigned posSlot = (unsigned)distance; + unsigned numDirectBits = (unsigned)(((distance >> 1) - 1)); + distance = (2 | (distance & 1)); + if (posSlot < kEndPosModelIndex) + { + distance <<= numDirectBits; + prob = probs + SpecPos; + { + UInt32 m = 1; + distance++; + do + { + REV_BIT_VAR(prob, distance, m); + } + while (--numDirectBits); + distance -= m; + } + } + else + { + numDirectBits -= kNumAlignBits; + do + { + NORMALIZE + range >>= 1; + + { + UInt32 t; + code -= range; + t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */ + distance = (distance << 1) + (t + 1); + code += range & t; + } + /* + distance <<= 1; + if (code >= range) + { + code -= range; + distance |= 1; + } + */ + } + while (--numDirectBits); + prob = probs + Align; + distance <<= kNumAlignBits; + { + unsigned i = 1; + REV_BIT_CONST(prob, i, 1); + REV_BIT_CONST(prob, i, 2); + REV_BIT_CONST(prob, i, 4); + REV_BIT_LAST (prob, i, 8); + distance |= i; + } + if (distance == (UInt32)0xFFFFFFFF) + { + len = kMatchSpecLenStart; + state -= kNumStates; + break; + } + } + } + + rep3 = rep2; + rep2 = rep1; + rep1 = rep0; + rep0 = distance + 1; + state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3; + if (distance >= (checkDicSize == 0 ? processedPos: checkDicSize)) + { + len += kMatchSpecLen_Error_Data + kMatchMinLen; + // len = kMatchSpecLen_Error_Data; + // len += kMatchMinLen; + break; + } + } + + len += kMatchMinLen; + + { + SizeT rem; + unsigned curLen; + SizeT pos; + + if ((rem = limit - dicPos) == 0) + { + /* + We stop decoding and return SZ_OK, and we can resume decoding later. + Any error conditions can be tested later in caller code. + For more strict mode we can stop decoding with error + // len += kMatchSpecLen_Error_Data; + */ + break; + } + + curLen = ((rem < len) ? (unsigned)rem : len); + pos = dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0); + + processedPos += (UInt32)curLen; + + len -= curLen; + if (curLen <= dicBufSize - pos) + { + Byte *dest = dic + dicPos; + ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos; + const Byte *lim = dest + curLen; + dicPos += (SizeT)curLen; + do + *(dest) = (Byte)*(dest + src); + while (++dest != lim); + } + else + { + do + { + dic[dicPos++] = dic[pos]; + if (++pos == dicBufSize) + pos = 0; + } + while (--curLen != 0); + } + } + } + } + while (dicPos < limit && buf < bufLimit); + + NORMALIZE; + + p->buf = buf; + p->range = range; + p->code = code; + p->remainLen = (UInt32)len; // & (kMatchSpecLen_Error_Data - 1); // we can write real length for error matches too. + p->dicPos = dicPos; + p->processedPos = processedPos; + p->reps[0] = rep0; + p->reps[1] = rep1; + p->reps[2] = rep2; + p->reps[3] = rep3; + p->state = (UInt32)state; + if (len >= kMatchSpecLen_Error_Data) + return SZ_ERROR_DATA; + return SZ_OK; +} +#endif + + + +static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit) +{ + unsigned len = (unsigned)p->remainLen; + if (len == 0 /* || len >= kMatchSpecLenStart */) + return; + { + SizeT dicPos = p->dicPos; + Byte *dic; + SizeT dicBufSize; + SizeT rep0; /* we use SizeT to avoid the BUG of VC14 for AMD64 */ + { + SizeT rem = limit - dicPos; + if (rem < len) + { + len = (unsigned)(rem); + if (len == 0) + return; + } + } + + if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len) + p->checkDicSize = p->prop.dicSize; + + p->processedPos += (UInt32)len; + p->remainLen -= (UInt32)len; + dic = p->dic; + rep0 = p->reps[0]; + dicBufSize = p->dicBufSize; + do + { + dic[dicPos] = dic[dicPos - rep0 + (dicPos < rep0 ? dicBufSize : 0)]; + dicPos++; + } + while (--len); + p->dicPos = dicPos; + } +} + + +/* +At staring of new stream we have one of the following symbols: + - Literal - is allowed + - Non-Rep-Match - is allowed only if it's end marker symbol + - Rep-Match - is not allowed +We use early check of (RangeCoder:Code) over kBadRepCode to simplify main decoding code +*/ + +#define kRange0 0xFFFFFFFF +#define kBound0 ((kRange0 >> kNumBitModelTotalBits) << (kNumBitModelTotalBits - 1)) +#define kBadRepCode (kBound0 + (((kRange0 - kBound0) >> kNumBitModelTotalBits) << (kNumBitModelTotalBits - 1))) +#if kBadRepCode != (0xC0000000 - 0x400) + #error Stop_Compiling_Bad_LZMA_Check +#endif + + +/* +LzmaDec_DecodeReal2(): + It calls LZMA_DECODE_REAL() and it adjusts limit according (p->checkDicSize). + +We correct (p->checkDicSize) after LZMA_DECODE_REAL() and in LzmaDec_WriteRem(), +and we support the following state of (p->checkDicSize): + if (total_processed < p->prop.dicSize) then + { + (total_processed == p->processedPos) + (p->checkDicSize == 0) + } + else + (p->checkDicSize == p->prop.dicSize) +*/ + +static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit) +{ + if (p->checkDicSize == 0) + { + UInt32 rem = p->prop.dicSize - p->processedPos; + if (limit - p->dicPos > rem) + limit = p->dicPos + rem; + } + { + int res = LZMA_DECODE_REAL(p, limit, bufLimit); + if (p->checkDicSize == 0 && p->processedPos >= p->prop.dicSize) + p->checkDicSize = p->prop.dicSize; + return res; + } +} + + + +typedef enum +{ + DUMMY_INPUT_EOF, /* need more input data */ + DUMMY_LIT, + DUMMY_MATCH, + DUMMY_REP +} ELzmaDummy; + + +#define IS_DUMMY_END_MARKER_POSSIBLE(dummyRes) ((dummyRes) == DUMMY_MATCH) + +static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, const Byte **bufOut) +{ + UInt32 range = p->range; + UInt32 code = p->code; + const Byte *bufLimit = *bufOut; + const CLzmaProb *probs = GET_PROBS; + unsigned state = (unsigned)p->state; + ELzmaDummy res; + + for (;;) + { + const CLzmaProb *prob; + UInt32 bound; + unsigned ttt; + unsigned posState = CALC_POS_STATE(p->processedPos, ((unsigned)1 << p->prop.pb) - 1); + + prob = probs + IsMatch + COMBINED_PS_STATE; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK + + prob = probs + Literal; + if (p->checkDicSize != 0 || p->processedPos != 0) + prob += ((UInt32)LZMA_LIT_SIZE * + ((((p->processedPos) & (((unsigned)1 << (p->prop.lp)) - 1)) << p->prop.lc) + + ((unsigned)p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc)))); + + if (state < kNumLitStates) + { + unsigned symbol = 1; + do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100); + } + else + { + unsigned matchByte = p->dic[p->dicPos - p->reps[0] + + (p->dicPos < p->reps[0] ? p->dicBufSize : 0)]; + unsigned offs = 0x100; + unsigned symbol = 1; + do + { + unsigned bit; + const CLzmaProb *probLit; + matchByte += matchByte; + bit = offs; + offs &= matchByte; + probLit = prob + (offs + bit + symbol); + GET_BIT2_CHECK(probLit, symbol, offs ^= bit; , ; ) + } + while (symbol < 0x100); + } + res = DUMMY_LIT; + } + else + { + unsigned len; + UPDATE_1_CHECK; + + prob = probs + IsRep + state; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + state = 0; + prob = probs + LenCoder; + res = DUMMY_MATCH; + } + else + { + UPDATE_1_CHECK; + res = DUMMY_REP; + prob = probs + IsRepG0 + state; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + prob = probs + IsRep0Long + COMBINED_PS_STATE; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + break; + } + else + { + UPDATE_1_CHECK; + } + } + else + { + UPDATE_1_CHECK; + prob = probs + IsRepG1 + state; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + } + else + { + UPDATE_1_CHECK; + prob = probs + IsRepG2 + state; + IF_BIT_0_CHECK(prob) + { + UPDATE_0_CHECK; + } + else + { + UPDATE_1_CHECK; + } + } + } + state = kNumStates; + prob = probs + RepLenCoder; + } + { + unsigned limit, offset; + const CLzmaProb *probLen = prob + LenChoice; + IF_BIT_0_CHECK(probLen) + { + UPDATE_0_CHECK; + probLen = prob + LenLow + GET_LEN_STATE; + offset = 0; + limit = 1 << kLenNumLowBits; + } + else + { + UPDATE_1_CHECK; + probLen = prob + LenChoice2; + IF_BIT_0_CHECK(probLen) + { + UPDATE_0_CHECK; + probLen = prob + LenLow + GET_LEN_STATE + (1 << kLenNumLowBits); + offset = kLenNumLowSymbols; + limit = 1 << kLenNumLowBits; + } + else + { + UPDATE_1_CHECK; + probLen = prob + LenHigh; + offset = kLenNumLowSymbols * 2; + limit = 1 << kLenNumHighBits; + } + } + TREE_DECODE_CHECK(probLen, limit, len); + len += offset; + } + + if (state < 4) + { + unsigned posSlot; + prob = probs + PosSlot + + ((len < kNumLenToPosStates - 1 ? len : kNumLenToPosStates - 1) << + kNumPosSlotBits); + TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot); + if (posSlot >= kStartPosModelIndex) + { + unsigned numDirectBits = ((posSlot >> 1) - 1); + + if (posSlot < kEndPosModelIndex) + { + prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits); + } + else + { + numDirectBits -= kNumAlignBits; + do + { + NORMALIZE_CHECK + range >>= 1; + code -= range & (((code - range) >> 31) - 1); + /* if (code >= range) code -= range; */ + } + while (--numDirectBits); + prob = probs + Align; + numDirectBits = kNumAlignBits; + } + { + unsigned i = 1; + unsigned m = 1; + do + { + REV_BIT_CHECK(prob, i, m); + } + while (--numDirectBits); + } + } + } + } + break; + } + NORMALIZE_CHECK; + + *bufOut = buf; + return res; +} + +void LzmaDec_InitDicAndState(CLzmaDec *p, BoolInt initDic, BoolInt initState); +void LzmaDec_InitDicAndState(CLzmaDec *p, BoolInt initDic, BoolInt initState) +{ + p->remainLen = kMatchSpecLenStart + 1; + p->tempBufSize = 0; + + if (initDic) + { + p->processedPos = 0; + p->checkDicSize = 0; + p->remainLen = kMatchSpecLenStart + 2; + } + if (initState) + p->remainLen = kMatchSpecLenStart + 2; +} + +void LzmaDec_Init(CLzmaDec *p) +{ + p->dicPos = 0; + LzmaDec_InitDicAndState(p, True, True); +} + + +/* +LZMA supports optional end_marker. +So the decoder can lookahead for one additional LZMA-Symbol to check end_marker. +That additional LZMA-Symbol can require up to LZMA_REQUIRED_INPUT_MAX bytes in input stream. +When the decoder reaches dicLimit, it looks (finishMode) parameter: + if (finishMode == LZMA_FINISH_ANY), the decoder doesn't lookahead + if (finishMode != LZMA_FINISH_ANY), the decoder lookahead, if end_marker is possible for current position + +When the decoder lookahead, and the lookahead symbol is not end_marker, we have two ways: + 1) Strict mode (default) : the decoder returns SZ_ERROR_DATA. + 2) The relaxed mode (alternative mode) : we could return SZ_OK, and the caller + must check (status) value. The caller can show the error, + if the end of stream is expected, and the (status) is noit + LZMA_STATUS_FINISHED_WITH_MARK or LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK. +*/ + + +#define RETURN__NOT_FINISHED__FOR_FINISH \ + *status = LZMA_STATUS_NOT_FINISHED; \ + return SZ_ERROR_DATA; // for strict mode + // return SZ_OK; // for relaxed mode + + +SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen, + ELzmaFinishMode finishMode, ELzmaStatus *status) +{ + SizeT inSize = *srcLen; + (*srcLen) = 0; + *status = LZMA_STATUS_NOT_SPECIFIED; + + if (p->remainLen > kMatchSpecLenStart) + { + if (p->remainLen > kMatchSpecLenStart + 2) + return p->remainLen == kMatchSpecLen_Error_Fail ? SZ_ERROR_FAIL : SZ_ERROR_DATA; + + for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--) + p->tempBuf[p->tempBufSize++] = *src++; + if (p->tempBufSize != 0 && p->tempBuf[0] != 0) + return SZ_ERROR_DATA; + if (p->tempBufSize < RC_INIT_SIZE) + { + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + p->code = + ((UInt32)p->tempBuf[1] << 24) + | ((UInt32)p->tempBuf[2] << 16) + | ((UInt32)p->tempBuf[3] << 8) + | ((UInt32)p->tempBuf[4]); + + if (p->checkDicSize == 0 + && p->processedPos == 0 + && p->code >= kBadRepCode) + return SZ_ERROR_DATA; + + p->range = 0xFFFFFFFF; + p->tempBufSize = 0; + + if (p->remainLen > kMatchSpecLenStart + 1) + { + SizeT numProbs = LzmaProps_GetNumProbs(&p->prop); + SizeT i; + CLzmaProb *probs = p->probs; + for (i = 0; i < numProbs; i++) + probs[i] = kBitModelTotal >> 1; + p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1; + p->state = 0; + } + + p->remainLen = 0; + } + + for (;;) + { + if (p->remainLen == kMatchSpecLenStart) + { + if (p->code != 0) + return SZ_ERROR_DATA; + *status = LZMA_STATUS_FINISHED_WITH_MARK; + return SZ_OK; + } + + LzmaDec_WriteRem(p, dicLimit); + + { + // (p->remainLen == 0 || p->dicPos == dicLimit) + + int checkEndMarkNow = 0; + + if (p->dicPos >= dicLimit) + { + if (p->remainLen == 0 && p->code == 0) + { + *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK; + return SZ_OK; + } + if (finishMode == LZMA_FINISH_ANY) + { + *status = LZMA_STATUS_NOT_FINISHED; + return SZ_OK; + } + if (p->remainLen != 0) + { + RETURN__NOT_FINISHED__FOR_FINISH; + } + checkEndMarkNow = 1; + } + + // (p->remainLen == 0) + + if (p->tempBufSize == 0) + { + const Byte *bufLimit; + int dummyProcessed = -1; + + if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) + { + const Byte *bufOut = src + inSize; + + ELzmaDummy dummyRes = LzmaDec_TryDummy(p, src, &bufOut); + + if (dummyRes == DUMMY_INPUT_EOF) + { + size_t i; + if (inSize >= LZMA_REQUIRED_INPUT_MAX) + break; + (*srcLen) += inSize; + p->tempBufSize = (unsigned)inSize; + for (i = 0; i < inSize; i++) + p->tempBuf[i] = src[i]; + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + + dummyProcessed = (int)(bufOut - src); + if ((unsigned)dummyProcessed > LZMA_REQUIRED_INPUT_MAX) + break; + + if (checkEndMarkNow && !IS_DUMMY_END_MARKER_POSSIBLE(dummyRes)) + { + unsigned i; + (*srcLen) += (unsigned)dummyProcessed; + p->tempBufSize = (unsigned)dummyProcessed; + for (i = 0; i < (unsigned)dummyProcessed; i++) + p->tempBuf[i] = src[i]; + // p->remainLen = kMatchSpecLen_Error_Data; + RETURN__NOT_FINISHED__FOR_FINISH; + } + + bufLimit = src; + // we will decode only one iteration + } + else + bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX; + + p->buf = src; + + { + int res = LzmaDec_DecodeReal2(p, dicLimit, bufLimit); + + SizeT processed = (SizeT)(p->buf - src); + + if (dummyProcessed < 0) + { + if (processed > inSize) + break; + } + else if ((unsigned)dummyProcessed != processed) + break; + + src += processed; + inSize -= processed; + (*srcLen) += processed; + + if (res != SZ_OK) + { + p->remainLen = kMatchSpecLen_Error_Data; + return SZ_ERROR_DATA; + } + } + continue; + } + + { + // we have some data in (p->tempBuf) + // in strict mode: tempBufSize is not enough for one Symbol decoding. + // in relaxed mode: tempBufSize not larger than required for one Symbol decoding. + + unsigned rem = p->tempBufSize; + unsigned ahead = 0; + int dummyProcessed = -1; + + while (rem < LZMA_REQUIRED_INPUT_MAX && ahead < inSize) + p->tempBuf[rem++] = src[ahead++]; + + // ahead - the size of new data copied from (src) to (p->tempBuf) + // rem - the size of temp buffer including new data from (src) + + if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow) + { + const Byte *bufOut = p->tempBuf + rem; + + ELzmaDummy dummyRes = LzmaDec_TryDummy(p, p->tempBuf, &bufOut); + + if (dummyRes == DUMMY_INPUT_EOF) + { + if (rem >= LZMA_REQUIRED_INPUT_MAX) + break; + p->tempBufSize = rem; + (*srcLen) += (SizeT)ahead; + *status = LZMA_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + + dummyProcessed = (int)(bufOut - p->tempBuf); + + if ((unsigned)dummyProcessed < p->tempBufSize) + break; + + if (checkEndMarkNow && !IS_DUMMY_END_MARKER_POSSIBLE(dummyRes)) + { + (*srcLen) += (unsigned)dummyProcessed - p->tempBufSize; + p->tempBufSize = (unsigned)dummyProcessed; + // p->remainLen = kMatchSpecLen_Error_Data; + RETURN__NOT_FINISHED__FOR_FINISH; + } + } + + p->buf = p->tempBuf; + + { + // we decode one symbol from (p->tempBuf) here, so the (bufLimit) is equal to (p->buf) + int res = LzmaDec_DecodeReal2(p, dicLimit, p->buf); + + SizeT processed = (SizeT)(p->buf - p->tempBuf); + rem = p->tempBufSize; + + if (dummyProcessed < 0) + { + if (processed > LZMA_REQUIRED_INPUT_MAX) + break; + if (processed < rem) + break; + } + else if ((unsigned)dummyProcessed != processed) + break; + + processed -= rem; + + src += processed; + inSize -= processed; + (*srcLen) += processed; + p->tempBufSize = 0; + + if (res != SZ_OK) + { + p->remainLen = kMatchSpecLen_Error_Data; + return SZ_ERROR_DATA; + } + } + } + } + } + + /* Some unexpected error: internal error of code, memory corruption or hardware failure */ + p->remainLen = kMatchSpecLen_Error_Fail; + return SZ_ERROR_FAIL; +} + + + +SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) +{ + SizeT outSize = *destLen; + SizeT inSize = *srcLen; + *srcLen = *destLen = 0; + for (;;) + { + SizeT inSizeCur = inSize, outSizeCur, dicPos; + ELzmaFinishMode curFinishMode; + SRes res; + if (p->dicPos == p->dicBufSize) + p->dicPos = 0; + dicPos = p->dicPos; + if (outSize > p->dicBufSize - dicPos) + { + outSizeCur = p->dicBufSize; + curFinishMode = LZMA_FINISH_ANY; + } + else + { + outSizeCur = dicPos + outSize; + curFinishMode = finishMode; + } + + res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status); + src += inSizeCur; + inSize -= inSizeCur; + *srcLen += inSizeCur; + outSizeCur = p->dicPos - dicPos; + memcpy(dest, p->dic + dicPos, outSizeCur); + dest += outSizeCur; + outSize -= outSizeCur; + *destLen += outSizeCur; + if (res != 0) + return res; + if (outSizeCur == 0 || outSize == 0) + return SZ_OK; + } +} + +void LzmaDec_FreeProbs(CLzmaDec *p, ISzAllocPtr alloc) +{ + ISzAlloc_Free(alloc, p->probs); + p->probs = NULL; +} + +static void LzmaDec_FreeDict(CLzmaDec *p, ISzAllocPtr alloc) +{ + ISzAlloc_Free(alloc, p->dic); + p->dic = NULL; +} + +void LzmaDec_Free(CLzmaDec *p, ISzAllocPtr alloc) +{ + LzmaDec_FreeProbs(p, alloc); + LzmaDec_FreeDict(p, alloc); +} + +SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size) +{ + UInt32 dicSize; + Byte d; + + if (size < LZMA_PROPS_SIZE) + return SZ_ERROR_UNSUPPORTED; + else + dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24); + + if (dicSize < LZMA_DIC_MIN) + dicSize = LZMA_DIC_MIN; + p->dicSize = dicSize; + + d = data[0]; + if (d >= (9 * 5 * 5)) + return SZ_ERROR_UNSUPPORTED; + + p->lc = (Byte)(d % 9); + d /= 9; + p->pb = (Byte)(d / 5); + p->lp = (Byte)(d % 5); + + return SZ_OK; +} + +static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAllocPtr alloc) +{ + UInt32 numProbs = LzmaProps_GetNumProbs(propNew); + if (!p->probs || numProbs != p->numProbs) + { + LzmaDec_FreeProbs(p, alloc); + p->probs = (CLzmaProb *)ISzAlloc_Alloc(alloc, numProbs * sizeof(CLzmaProb)); + if (!p->probs) + return SZ_ERROR_MEM; + p->probs_1664 = p->probs + 1664; + p->numProbs = numProbs; + } + return SZ_OK; +} + +SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc) +{ + CLzmaProps propNew; + RINOK(LzmaProps_Decode(&propNew, props, propsSize)); + RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); + p->prop = propNew; + return SZ_OK; +} + +SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc) +{ + CLzmaProps propNew; + SizeT dicBufSize; + RINOK(LzmaProps_Decode(&propNew, props, propsSize)); + RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc)); + + { + UInt32 dictSize = propNew.dicSize; + SizeT mask = ((UInt32)1 << 12) - 1; + if (dictSize >= ((UInt32)1 << 30)) mask = ((UInt32)1 << 22) - 1; + else if (dictSize >= ((UInt32)1 << 22)) mask = ((UInt32)1 << 20) - 1;; + dicBufSize = ((SizeT)dictSize + mask) & ~mask; + if (dicBufSize < dictSize) + dicBufSize = dictSize; + } + + if (!p->dic || dicBufSize != p->dicBufSize) + { + LzmaDec_FreeDict(p, alloc); + p->dic = (Byte *)ISzAlloc_Alloc(alloc, dicBufSize); + if (!p->dic) + { + LzmaDec_FreeProbs(p, alloc); + return SZ_ERROR_MEM; + } + } + p->dicBufSize = dicBufSize; + p->prop = propNew; + return SZ_OK; +} + +SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, + ELzmaStatus *status, ISzAllocPtr alloc) +{ + CLzmaDec p; + SRes res; + SizeT outSize = *destLen, inSize = *srcLen; + *destLen = *srcLen = 0; + *status = LZMA_STATUS_NOT_SPECIFIED; + if (inSize < RC_INIT_SIZE) + return SZ_ERROR_INPUT_EOF; + LzmaDec_Construct(&p); + RINOK(LzmaDec_AllocateProbs(&p, propData, propSize, alloc)); + p.dic = dest; + p.dicBufSize = outSize; + LzmaDec_Init(&p); + *srcLen = inSize; + res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status); + *destLen = p.dicPos; + if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT) + res = SZ_ERROR_INPUT_EOF; + LzmaDec_FreeProbs(&p, alloc); + return res; +} diff --git a/deps/LZMA-SDK/C/LzmaDec.h b/deps/LZMA-SDK/C/LzmaDec.h index 6194b7d12..6f1296250 100644 --- a/deps/LZMA-SDK/C/LzmaDec.h +++ b/deps/LZMA-SDK/C/LzmaDec.h @@ -1,236 +1,236 @@ -/* LzmaDec.h -- LZMA Decoder -2020-03-19 : Igor Pavlov : Public domain */ - -#ifndef __LZMA_DEC_H -#define __LZMA_DEC_H - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -/* #define _LZMA_PROB32 */ -/* _LZMA_PROB32 can increase the speed on some CPUs, - but memory usage for CLzmaDec::probs will be doubled in that case */ - -typedef -#ifdef _LZMA_PROB32 - UInt32 -#else - UInt16 -#endif - CLzmaProb; - - -/* ---------- LZMA Properties ---------- */ - -#define LZMA_PROPS_SIZE 5 - -typedef struct _CLzmaProps -{ - Byte lc; - Byte lp; - Byte pb; - Byte _pad_; - UInt32 dicSize; -} CLzmaProps; - -/* LzmaProps_Decode - decodes properties -Returns: - SZ_OK - SZ_ERROR_UNSUPPORTED - Unsupported properties -*/ - -SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size); - - -/* ---------- LZMA Decoder state ---------- */ - -/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case. - Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */ - -#define LZMA_REQUIRED_INPUT_MAX 20 - -typedef struct -{ - /* Don't change this structure. ASM code can use it. */ - CLzmaProps prop; - CLzmaProb *probs; - CLzmaProb *probs_1664; - Byte *dic; - SizeT dicBufSize; - SizeT dicPos; - const Byte *buf; - UInt32 range; - UInt32 code; - UInt32 processedPos; - UInt32 checkDicSize; - UInt32 reps[4]; - UInt32 state; - UInt32 remainLen; - - UInt32 numProbs; - unsigned tempBufSize; - Byte tempBuf[LZMA_REQUIRED_INPUT_MAX]; -} CLzmaDec; - -#define LzmaDec_Construct(p) { (p)->dic = NULL; (p)->probs = NULL; } - -void LzmaDec_Init(CLzmaDec *p); - -/* There are two types of LZMA streams: - - Stream with end mark. That end mark adds about 6 bytes to compressed size. - - Stream without end mark. You must know exact uncompressed size to decompress such stream. */ - -typedef enum -{ - LZMA_FINISH_ANY, /* finish at any point */ - LZMA_FINISH_END /* block must be finished at the end */ -} ELzmaFinishMode; - -/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!! - - You must use LZMA_FINISH_END, when you know that current output buffer - covers last bytes of block. In other cases you must use LZMA_FINISH_ANY. - - If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK, - and output value of destLen will be less than output buffer size limit. - You can check status result also. - - You can use multiple checks to test data integrity after full decompression: - 1) Check Result and "status" variable. - 2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize. - 3) Check that output(srcLen) = compressedSize, if you know real compressedSize. - You must use correct finish mode in that case. */ - -typedef enum -{ - LZMA_STATUS_NOT_SPECIFIED, /* use main error code instead */ - LZMA_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */ - LZMA_STATUS_NOT_FINISHED, /* stream was not finished */ - LZMA_STATUS_NEEDS_MORE_INPUT, /* you must provide more input bytes */ - LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK /* there is probability that stream was finished without end mark */ -} ELzmaStatus; - -/* ELzmaStatus is used only as output value for function call */ - - -/* ---------- Interfaces ---------- */ - -/* There are 3 levels of interfaces: - 1) Dictionary Interface - 2) Buffer Interface - 3) One Call Interface - You can select any of these interfaces, but don't mix functions from different - groups for same object. */ - - -/* There are two variants to allocate state for Dictionary Interface: - 1) LzmaDec_Allocate / LzmaDec_Free - 2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs - You can use variant 2, if you set dictionary buffer manually. - For Buffer Interface you must always use variant 1. - -LzmaDec_Allocate* can return: - SZ_OK - SZ_ERROR_MEM - Memory allocation error - SZ_ERROR_UNSUPPORTED - Unsupported properties -*/ - -SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc); -void LzmaDec_FreeProbs(CLzmaDec *p, ISzAllocPtr alloc); - -SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc); -void LzmaDec_Free(CLzmaDec *p, ISzAllocPtr alloc); - -/* ---------- Dictionary Interface ---------- */ - -/* You can use it, if you want to eliminate the overhead for data copying from - dictionary to some other external buffer. - You must work with CLzmaDec variables directly in this interface. - - STEPS: - LzmaDec_Construct() - LzmaDec_Allocate() - for (each new stream) - { - LzmaDec_Init() - while (it needs more decompression) - { - LzmaDec_DecodeToDic() - use data from CLzmaDec::dic and update CLzmaDec::dicPos - } - } - LzmaDec_Free() -*/ - -/* LzmaDec_DecodeToDic - - The decoding to internal dictionary buffer (CLzmaDec::dic). - You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!! - -finishMode: - It has meaning only if the decoding reaches output limit (dicLimit). - LZMA_FINISH_ANY - Decode just dicLimit bytes. - LZMA_FINISH_END - Stream must be finished after dicLimit. - -Returns: - SZ_OK - status: - LZMA_STATUS_FINISHED_WITH_MARK - LZMA_STATUS_NOT_FINISHED - LZMA_STATUS_NEEDS_MORE_INPUT - LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK - SZ_ERROR_DATA - Data error - SZ_ERROR_FAIL - Some unexpected error: internal error of code, memory corruption or hardware failure -*/ - -SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, - const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); - - -/* ---------- Buffer Interface ---------- */ - -/* It's zlib-like interface. - See LzmaDec_DecodeToDic description for information about STEPS and return results, - but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need - to work with CLzmaDec variables manually. - -finishMode: - It has meaning only if the decoding reaches output limit (*destLen). - LZMA_FINISH_ANY - Decode just destLen bytes. - LZMA_FINISH_END - Stream must be finished after (*destLen). -*/ - -SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, - const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); - - -/* ---------- One Call Interface ---------- */ - -/* LzmaDecode - -finishMode: - It has meaning only if the decoding reaches output limit (*destLen). - LZMA_FINISH_ANY - Decode just destLen bytes. - LZMA_FINISH_END - Stream must be finished after (*destLen). - -Returns: - SZ_OK - status: - LZMA_STATUS_FINISHED_WITH_MARK - LZMA_STATUS_NOT_FINISHED - LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK - SZ_ERROR_DATA - Data error - SZ_ERROR_MEM - Memory allocation error - SZ_ERROR_UNSUPPORTED - Unsupported properties - SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). - SZ_ERROR_FAIL - Some unexpected error: internal error of code, memory corruption or hardware failure -*/ - -SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, - const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, - ELzmaStatus *status, ISzAllocPtr alloc); - -EXTERN_C_END - -#endif +/* LzmaDec.h -- LZMA Decoder +2020-03-19 : Igor Pavlov : Public domain */ + +#ifndef __LZMA_DEC_H +#define __LZMA_DEC_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +/* #define _LZMA_PROB32 */ +/* _LZMA_PROB32 can increase the speed on some CPUs, + but memory usage for CLzmaDec::probs will be doubled in that case */ + +typedef +#ifdef _LZMA_PROB32 + UInt32 +#else + UInt16 +#endif + CLzmaProb; + + +/* ---------- LZMA Properties ---------- */ + +#define LZMA_PROPS_SIZE 5 + +typedef struct _CLzmaProps +{ + Byte lc; + Byte lp; + Byte pb; + Byte _pad_; + UInt32 dicSize; +} CLzmaProps; + +/* LzmaProps_Decode - decodes properties +Returns: + SZ_OK + SZ_ERROR_UNSUPPORTED - Unsupported properties +*/ + +SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size); + + +/* ---------- LZMA Decoder state ---------- */ + +/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case. + Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */ + +#define LZMA_REQUIRED_INPUT_MAX 20 + +typedef struct +{ + /* Don't change this structure. ASM code can use it. */ + CLzmaProps prop; + CLzmaProb *probs; + CLzmaProb *probs_1664; + Byte *dic; + SizeT dicBufSize; + SizeT dicPos; + const Byte *buf; + UInt32 range; + UInt32 code; + UInt32 processedPos; + UInt32 checkDicSize; + UInt32 reps[4]; + UInt32 state; + UInt32 remainLen; + + UInt32 numProbs; + unsigned tempBufSize; + Byte tempBuf[LZMA_REQUIRED_INPUT_MAX]; +} CLzmaDec; + +#define LzmaDec_Construct(p) { (p)->dic = NULL; (p)->probs = NULL; } + +void LzmaDec_Init(CLzmaDec *p); + +/* There are two types of LZMA streams: + - Stream with end mark. That end mark adds about 6 bytes to compressed size. + - Stream without end mark. You must know exact uncompressed size to decompress such stream. */ + +typedef enum +{ + LZMA_FINISH_ANY, /* finish at any point */ + LZMA_FINISH_END /* block must be finished at the end */ +} ELzmaFinishMode; + +/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!! + + You must use LZMA_FINISH_END, when you know that current output buffer + covers last bytes of block. In other cases you must use LZMA_FINISH_ANY. + + If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK, + and output value of destLen will be less than output buffer size limit. + You can check status result also. + + You can use multiple checks to test data integrity after full decompression: + 1) Check Result and "status" variable. + 2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize. + 3) Check that output(srcLen) = compressedSize, if you know real compressedSize. + You must use correct finish mode in that case. */ + +typedef enum +{ + LZMA_STATUS_NOT_SPECIFIED, /* use main error code instead */ + LZMA_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */ + LZMA_STATUS_NOT_FINISHED, /* stream was not finished */ + LZMA_STATUS_NEEDS_MORE_INPUT, /* you must provide more input bytes */ + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK /* there is probability that stream was finished without end mark */ +} ELzmaStatus; + +/* ELzmaStatus is used only as output value for function call */ + + +/* ---------- Interfaces ---------- */ + +/* There are 3 levels of interfaces: + 1) Dictionary Interface + 2) Buffer Interface + 3) One Call Interface + You can select any of these interfaces, but don't mix functions from different + groups for same object. */ + + +/* There are two variants to allocate state for Dictionary Interface: + 1) LzmaDec_Allocate / LzmaDec_Free + 2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs + You can use variant 2, if you set dictionary buffer manually. + For Buffer Interface you must always use variant 1. + +LzmaDec_Allocate* can return: + SZ_OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_UNSUPPORTED - Unsupported properties +*/ + +SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc); +void LzmaDec_FreeProbs(CLzmaDec *p, ISzAllocPtr alloc); + +SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAllocPtr alloc); +void LzmaDec_Free(CLzmaDec *p, ISzAllocPtr alloc); + +/* ---------- Dictionary Interface ---------- */ + +/* You can use it, if you want to eliminate the overhead for data copying from + dictionary to some other external buffer. + You must work with CLzmaDec variables directly in this interface. + + STEPS: + LzmaDec_Construct() + LzmaDec_Allocate() + for (each new stream) + { + LzmaDec_Init() + while (it needs more decompression) + { + LzmaDec_DecodeToDic() + use data from CLzmaDec::dic and update CLzmaDec::dicPos + } + } + LzmaDec_Free() +*/ + +/* LzmaDec_DecodeToDic + + The decoding to internal dictionary buffer (CLzmaDec::dic). + You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!! + +finishMode: + It has meaning only if the decoding reaches output limit (dicLimit). + LZMA_FINISH_ANY - Decode just dicLimit bytes. + LZMA_FINISH_END - Stream must be finished after dicLimit. + +Returns: + SZ_OK + status: + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED + LZMA_STATUS_NEEDS_MORE_INPUT + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + SZ_ERROR_DATA - Data error + SZ_ERROR_FAIL - Some unexpected error: internal error of code, memory corruption or hardware failure +*/ + +SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); + + +/* ---------- Buffer Interface ---------- */ + +/* It's zlib-like interface. + See LzmaDec_DecodeToDic description for information about STEPS and return results, + but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need + to work with CLzmaDec variables manually. + +finishMode: + It has meaning only if the decoding reaches output limit (*destLen). + LZMA_FINISH_ANY - Decode just destLen bytes. + LZMA_FINISH_END - Stream must be finished after (*destLen). +*/ + +SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status); + + +/* ---------- One Call Interface ---------- */ + +/* LzmaDecode + +finishMode: + It has meaning only if the decoding reaches output limit (*destLen). + LZMA_FINISH_ANY - Decode just destLen bytes. + LZMA_FINISH_END - Stream must be finished after (*destLen). + +Returns: + SZ_OK + status: + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + SZ_ERROR_DATA - Data error + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_UNSUPPORTED - Unsupported properties + SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). + SZ_ERROR_FAIL - Some unexpected error: internal error of code, memory corruption or hardware failure +*/ + +SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, + ELzmaStatus *status, ISzAllocPtr alloc); + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/LzmaEnc.c b/deps/LZMA-SDK/C/LzmaEnc.c index 86dcb1963..c8b31a19e 100644 --- a/deps/LZMA-SDK/C/LzmaEnc.c +++ b/deps/LZMA-SDK/C/LzmaEnc.c @@ -1,3013 +1,3162 @@ -/* LzmaEnc.c -- LZMA Encoder -2021-04-01: Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include - -/* #define SHOW_STAT */ -/* #define SHOW_STAT2 */ - -#if defined(SHOW_STAT) || defined(SHOW_STAT2) -#include -#endif - -#include "LzmaEnc.h" - -#include "LzFind.h" -#ifndef _7ZIP_ST -#include "LzFindMt.h" -#endif - -/* the following LzmaEnc_* declarations is internal LZMA interface for LZMA2 encoder */ - -SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp, ISeqInStream *inStream, UInt32 keepWindowSize, - ISzAllocPtr alloc, ISzAllocPtr allocBig); -SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen, - UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig); -SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, BoolInt reInit, - Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize); -const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp); -void LzmaEnc_Finish(CLzmaEncHandle pp); -void LzmaEnc_SaveState(CLzmaEncHandle pp); -void LzmaEnc_RestoreState(CLzmaEncHandle pp); - -#ifdef SHOW_STAT -static unsigned g_STAT_OFFSET = 0; -#endif - -#define kLzmaMaxHistorySize ((UInt32)3 << 29) -/* #define kLzmaMaxHistorySize ((UInt32)7 << 29) */ - -#define kNumTopBits 24 -#define kTopValue ((UInt32)1 << kNumTopBits) - -#define kNumBitModelTotalBits 11 -#define kBitModelTotal (1 << kNumBitModelTotalBits) -#define kNumMoveBits 5 -#define kProbInitValue (kBitModelTotal >> 1) - -#define kNumMoveReducingBits 4 -#define kNumBitPriceShiftBits 4 -// #define kBitPrice (1 << kNumBitPriceShiftBits) - -#define REP_LEN_COUNT 64 - -void LzmaEncProps_Init(CLzmaEncProps *p) -{ - p->level = 5; - p->dictSize = p->mc = 0; - p->reduceSize = (UInt64)(Int64)-1; - p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1; - p->writeEndMark = 0; - p->affinity = 0; -} - -void LzmaEncProps_Normalize(CLzmaEncProps *p) -{ - int level = p->level; - if (level < 0) level = 5; - p->level = level; - - if (p->dictSize == 0) - p->dictSize = - ( level <= 3 ? ((UInt32)1 << (level * 2 + 16)) : - ( level <= 6 ? ((UInt32)1 << (level + 19)) : - ( level <= 7 ? ((UInt32)1 << 25) : ((UInt32)1 << 26) - ))); - - if (p->dictSize > p->reduceSize) - { - unsigned i; - UInt32 reduceSize = (UInt32)p->reduceSize; - for (i = 11; i <= 30; i++) - { - if (reduceSize <= ((UInt32)2 << i)) { p->dictSize = ((UInt32)2 << i); break; } - if (reduceSize <= ((UInt32)3 << i)) { p->dictSize = ((UInt32)3 << i); break; } - } - } - - if (p->lc < 0) p->lc = 3; - if (p->lp < 0) p->lp = 0; - if (p->pb < 0) p->pb = 2; - - if (p->algo < 0) p->algo = (level < 5 ? 0 : 1); - if (p->fb < 0) p->fb = (level < 7 ? 32 : 64); - if (p->btMode < 0) p->btMode = (p->algo == 0 ? 0 : 1); - if (p->numHashBytes < 0) p->numHashBytes = (p->btMode ? 4 : 5); - if (p->mc == 0) p->mc = (16 + ((unsigned)p->fb >> 1)) >> (p->btMode ? 0 : 1); - - if (p->numThreads < 0) - p->numThreads = - #ifndef _7ZIP_ST - ((p->btMode && p->algo) ? 2 : 1); - #else - 1; - #endif -} - -UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2) -{ - CLzmaEncProps props = *props2; - LzmaEncProps_Normalize(&props); - return props.dictSize; -} - -#if defined(_MSC_VER) && (_MSC_VER >= 1400) -/* BSR code is fast for some new CPUs */ -/* #define LZMA_LOG_BSR */ -#endif - -#ifdef LZMA_LOG_BSR - -#define kDicLogSizeMaxCompress 32 - -#define BSR2_RET(pos, res) { unsigned long zz; _BitScanReverse(&zz, (pos)); res = (zz + zz) + ((pos >> (zz - 1)) & 1); } - -static unsigned GetPosSlot1(UInt32 pos) -{ - unsigned res; - BSR2_RET(pos, res); - return res; -} -#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } -#define GetPosSlot(pos, res) { if (pos < 2) res = pos; else BSR2_RET(pos, res); } - -#else - -#define kNumLogBits (9 + sizeof(size_t) / 2) -/* #define kNumLogBits (11 + sizeof(size_t) / 8 * 3) */ - -#define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7) - -static void LzmaEnc_FastPosInit(Byte *g_FastPos) -{ - unsigned slot; - g_FastPos[0] = 0; - g_FastPos[1] = 1; - g_FastPos += 2; - - for (slot = 2; slot < kNumLogBits * 2; slot++) - { - size_t k = ((size_t)1 << ((slot >> 1) - 1)); - size_t j; - for (j = 0; j < k; j++) - g_FastPos[j] = (Byte)slot; - g_FastPos += k; - } -} - -/* we can use ((limit - pos) >> 31) only if (pos < ((UInt32)1 << 31)) */ -/* -#define BSR2_RET(pos, res) { unsigned zz = 6 + ((kNumLogBits - 1) & \ - (0 - (((((UInt32)1 << (kNumLogBits + 6)) - 1) - pos) >> 31))); \ - res = p->g_FastPos[pos >> zz] + (zz * 2); } -*/ - -/* -#define BSR2_RET(pos, res) { unsigned zz = 6 + ((kNumLogBits - 1) & \ - (0 - (((((UInt32)1 << (kNumLogBits)) - 1) - (pos >> 6)) >> 31))); \ - res = p->g_FastPos[pos >> zz] + (zz * 2); } -*/ - -#define BSR2_RET(pos, res) { unsigned zz = (pos < (1 << (kNumLogBits + 6))) ? 6 : 6 + kNumLogBits - 1; \ - res = p->g_FastPos[pos >> zz] + (zz * 2); } - -/* -#define BSR2_RET(pos, res) { res = (pos < (1 << (kNumLogBits + 6))) ? \ - p->g_FastPos[pos >> 6] + 12 : \ - p->g_FastPos[pos >> (6 + kNumLogBits - 1)] + (6 + (kNumLogBits - 1)) * 2; } -*/ - -#define GetPosSlot1(pos) p->g_FastPos[pos] -#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } -#define GetPosSlot(pos, res) { if (pos < kNumFullDistances) res = p->g_FastPos[pos & (kNumFullDistances - 1)]; else BSR2_RET(pos, res); } - -#endif - - -#define LZMA_NUM_REPS 4 - -typedef UInt16 CState; -typedef UInt16 CExtra; - -typedef struct -{ - UInt32 price; - CState state; - CExtra extra; - // 0 : normal - // 1 : LIT : MATCH - // > 1 : MATCH (extra-1) : LIT : REP0 (len) - UInt32 len; - UInt32 dist; - UInt32 reps[LZMA_NUM_REPS]; -} COptimal; - - -// 18.06 -#define kNumOpts (1 << 11) -#define kPackReserve (kNumOpts * 8) -// #define kNumOpts (1 << 12) -// #define kPackReserve (1 + kNumOpts * 2) - -#define kNumLenToPosStates 4 -#define kNumPosSlotBits 6 -// #define kDicLogSizeMin 0 -#define kDicLogSizeMax 32 -#define kDistTableSizeMax (kDicLogSizeMax * 2) - -#define kNumAlignBits 4 -#define kAlignTableSize (1 << kNumAlignBits) -#define kAlignMask (kAlignTableSize - 1) - -#define kStartPosModelIndex 4 -#define kEndPosModelIndex 14 -#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) - -typedef -#ifdef _LZMA_PROB32 - UInt32 -#else - UInt16 -#endif - CLzmaProb; - -#define LZMA_PB_MAX 4 -#define LZMA_LC_MAX 8 -#define LZMA_LP_MAX 4 - -#define LZMA_NUM_PB_STATES_MAX (1 << LZMA_PB_MAX) - -#define kLenNumLowBits 3 -#define kLenNumLowSymbols (1 << kLenNumLowBits) -#define kLenNumHighBits 8 -#define kLenNumHighSymbols (1 << kLenNumHighBits) -#define kLenNumSymbolsTotal (kLenNumLowSymbols * 2 + kLenNumHighSymbols) - -#define LZMA_MATCH_LEN_MIN 2 -#define LZMA_MATCH_LEN_MAX (LZMA_MATCH_LEN_MIN + kLenNumSymbolsTotal - 1) - -#define kNumStates 12 - - -typedef struct -{ - CLzmaProb low[LZMA_NUM_PB_STATES_MAX << (kLenNumLowBits + 1)]; - CLzmaProb high[kLenNumHighSymbols]; -} CLenEnc; - - -typedef struct -{ - unsigned tableSize; - UInt32 prices[LZMA_NUM_PB_STATES_MAX][kLenNumSymbolsTotal]; - // UInt32 prices1[LZMA_NUM_PB_STATES_MAX][kLenNumLowSymbols * 2]; - // UInt32 prices2[kLenNumSymbolsTotal]; -} CLenPriceEnc; - -#define GET_PRICE_LEN(p, posState, len) \ - ((p)->prices[posState][(size_t)(len) - LZMA_MATCH_LEN_MIN]) - -/* -#define GET_PRICE_LEN(p, posState, len) \ - ((p)->prices2[(size_t)(len) - 2] + ((p)->prices1[posState][((len) - 2) & (kLenNumLowSymbols * 2 - 1)] & (((len) - 2 - kLenNumLowSymbols * 2) >> 9))) -*/ - -typedef struct -{ - UInt32 range; - unsigned cache; - UInt64 low; - UInt64 cacheSize; - Byte *buf; - Byte *bufLim; - Byte *bufBase; - ISeqOutStream *outStream; - UInt64 processed; - SRes res; -} CRangeEnc; - - -typedef struct -{ - CLzmaProb *litProbs; - - unsigned state; - UInt32 reps[LZMA_NUM_REPS]; - - CLzmaProb posAlignEncoder[1 << kNumAlignBits]; - CLzmaProb isRep[kNumStates]; - CLzmaProb isRepG0[kNumStates]; - CLzmaProb isRepG1[kNumStates]; - CLzmaProb isRepG2[kNumStates]; - CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; - CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; - - CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; - CLzmaProb posEncoders[kNumFullDistances]; - - CLenEnc lenProbs; - CLenEnc repLenProbs; - -} CSaveState; - - -typedef UInt32 CProbPrice; - - -typedef struct -{ - void *matchFinderObj; - IMatchFinder matchFinder; - - unsigned optCur; - unsigned optEnd; - - unsigned longestMatchLen; - unsigned numPairs; - UInt32 numAvail; - - unsigned state; - unsigned numFastBytes; - unsigned additionalOffset; - UInt32 reps[LZMA_NUM_REPS]; - unsigned lpMask, pbMask; - CLzmaProb *litProbs; - CRangeEnc rc; - - UInt32 backRes; - - unsigned lc, lp, pb; - unsigned lclp; - - BoolInt fastMode; - BoolInt writeEndMark; - BoolInt finished; - BoolInt multiThread; - BoolInt needInit; - // BoolInt _maxMode; - - UInt64 nowPos64; - - unsigned matchPriceCount; - // unsigned alignPriceCount; - int repLenEncCounter; - - unsigned distTableSize; - - UInt32 dictSize; - SRes result; - - #ifndef _7ZIP_ST - BoolInt mtMode; - // begin of CMatchFinderMt is used in LZ thread - CMatchFinderMt matchFinderMt; - // end of CMatchFinderMt is used in BT and HASH threads - #endif - - CMatchFinder matchFinderBase; - - #ifndef _7ZIP_ST - Byte pad[128]; - #endif - - // LZ thread - CProbPrice ProbPrices[kBitModelTotal >> kNumMoveReducingBits]; - - UInt32 matches[LZMA_MATCH_LEN_MAX * 2 + 2 + 1]; - - UInt32 alignPrices[kAlignTableSize]; - UInt32 posSlotPrices[kNumLenToPosStates][kDistTableSizeMax]; - UInt32 distancesPrices[kNumLenToPosStates][kNumFullDistances]; - - CLzmaProb posAlignEncoder[1 << kNumAlignBits]; - CLzmaProb isRep[kNumStates]; - CLzmaProb isRepG0[kNumStates]; - CLzmaProb isRepG1[kNumStates]; - CLzmaProb isRepG2[kNumStates]; - CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; - CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; - CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; - CLzmaProb posEncoders[kNumFullDistances]; - - CLenEnc lenProbs; - CLenEnc repLenProbs; - - #ifndef LZMA_LOG_BSR - Byte g_FastPos[1 << kNumLogBits]; - #endif - - CLenPriceEnc lenEnc; - CLenPriceEnc repLenEnc; - - COptimal opt[kNumOpts]; - - CSaveState saveState; - - #ifndef _7ZIP_ST - Byte pad2[128]; - #endif -} CLzmaEnc; - - - -#define COPY_ARR(dest, src, arr) memcpy(dest->arr, src->arr, sizeof(src->arr)); - -void LzmaEnc_SaveState(CLzmaEncHandle pp) -{ - CLzmaEnc *p = (CLzmaEnc *)pp; - CSaveState *dest = &p->saveState; - - dest->state = p->state; - - dest->lenProbs = p->lenProbs; - dest->repLenProbs = p->repLenProbs; - - COPY_ARR(dest, p, reps); - - COPY_ARR(dest, p, posAlignEncoder); - COPY_ARR(dest, p, isRep); - COPY_ARR(dest, p, isRepG0); - COPY_ARR(dest, p, isRepG1); - COPY_ARR(dest, p, isRepG2); - COPY_ARR(dest, p, isMatch); - COPY_ARR(dest, p, isRep0Long); - COPY_ARR(dest, p, posSlotEncoder); - COPY_ARR(dest, p, posEncoders); - - memcpy(dest->litProbs, p->litProbs, ((UInt32)0x300 << p->lclp) * sizeof(CLzmaProb)); -} - - -void LzmaEnc_RestoreState(CLzmaEncHandle pp) -{ - CLzmaEnc *dest = (CLzmaEnc *)pp; - const CSaveState *p = &dest->saveState; - - dest->state = p->state; - - dest->lenProbs = p->lenProbs; - dest->repLenProbs = p->repLenProbs; - - COPY_ARR(dest, p, reps); - - COPY_ARR(dest, p, posAlignEncoder); - COPY_ARR(dest, p, isRep); - COPY_ARR(dest, p, isRepG0); - COPY_ARR(dest, p, isRepG1); - COPY_ARR(dest, p, isRepG2); - COPY_ARR(dest, p, isMatch); - COPY_ARR(dest, p, isRep0Long); - COPY_ARR(dest, p, posSlotEncoder); - COPY_ARR(dest, p, posEncoders); - - memcpy(dest->litProbs, p->litProbs, ((UInt32)0x300 << dest->lclp) * sizeof(CLzmaProb)); -} - - - -SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2) -{ - CLzmaEnc *p = (CLzmaEnc *)pp; - CLzmaEncProps props = *props2; - LzmaEncProps_Normalize(&props); - - if (props.lc > LZMA_LC_MAX - || props.lp > LZMA_LP_MAX - || props.pb > LZMA_PB_MAX - || props.dictSize > ((UInt64)1 << kDicLogSizeMaxCompress) - || props.dictSize > kLzmaMaxHistorySize) - return SZ_ERROR_PARAM; - - p->dictSize = props.dictSize; - { - unsigned fb = (unsigned)props.fb; - if (fb < 5) - fb = 5; - if (fb > LZMA_MATCH_LEN_MAX) - fb = LZMA_MATCH_LEN_MAX; - p->numFastBytes = fb; - } - p->lc = (unsigned)props.lc; - p->lp = (unsigned)props.lp; - p->pb = (unsigned)props.pb; - p->fastMode = (props.algo == 0); - // p->_maxMode = True; - p->matchFinderBase.btMode = (Byte)(props.btMode ? 1 : 0); - { - unsigned numHashBytes = 4; - if (props.btMode) - { - if (props.numHashBytes < 2) numHashBytes = 2; - else if (props.numHashBytes < 4) numHashBytes = (unsigned)props.numHashBytes; - } - if (props.numHashBytes >= 5) numHashBytes = 5; - - p->matchFinderBase.numHashBytes = numHashBytes; - } - - p->matchFinderBase.cutValue = props.mc; - - p->writeEndMark = (BoolInt)props.writeEndMark; - - #ifndef _7ZIP_ST - /* - if (newMultiThread != _multiThread) - { - ReleaseMatchFinder(); - _multiThread = newMultiThread; - } - */ - p->multiThread = (props.numThreads > 1); - p->matchFinderMt.btSync.affinity = - p->matchFinderMt.hashSync.affinity = props.affinity; - #endif - - return SZ_OK; -} - - -void LzmaEnc_SetDataSize(CLzmaEncHandle pp, UInt64 expectedDataSiize) -{ - CLzmaEnc *p = (CLzmaEnc *)pp; - p->matchFinderBase.expectedDataSize = expectedDataSiize; -} - - -#define kState_Start 0 -#define kState_LitAfterMatch 4 -#define kState_LitAfterRep 5 -#define kState_MatchAfterLit 7 -#define kState_RepAfterLit 8 - -static const Byte kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; -static const Byte kMatchNextStates[kNumStates] = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; -static const Byte kRepNextStates[kNumStates] = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; -static const Byte kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; - -#define IsLitState(s) ((s) < 7) -#define GetLenToPosState2(len) (((len) < kNumLenToPosStates - 1) ? (len) : kNumLenToPosStates - 1) -#define GetLenToPosState(len) (((len) < kNumLenToPosStates + 1) ? (len) - 2 : kNumLenToPosStates - 1) - -#define kInfinityPrice (1 << 30) - -static void RangeEnc_Construct(CRangeEnc *p) -{ - p->outStream = NULL; - p->bufBase = NULL; -} - -#define RangeEnc_GetProcessed(p) ( (p)->processed + (size_t)((p)->buf - (p)->bufBase) + (p)->cacheSize) -#define RangeEnc_GetProcessed_sizet(p) ((size_t)(p)->processed + (size_t)((p)->buf - (p)->bufBase) + (size_t)(p)->cacheSize) - -#define RC_BUF_SIZE (1 << 16) - -static int RangeEnc_Alloc(CRangeEnc *p, ISzAllocPtr alloc) -{ - if (!p->bufBase) - { - p->bufBase = (Byte *)ISzAlloc_Alloc(alloc, RC_BUF_SIZE); - if (!p->bufBase) - return 0; - p->bufLim = p->bufBase + RC_BUF_SIZE; - } - return 1; -} - -static void RangeEnc_Free(CRangeEnc *p, ISzAllocPtr alloc) -{ - ISzAlloc_Free(alloc, p->bufBase); - p->bufBase = 0; -} - -static void RangeEnc_Init(CRangeEnc *p) -{ - /* Stream.Init(); */ - p->range = 0xFFFFFFFF; - p->cache = 0; - p->low = 0; - p->cacheSize = 0; - - p->buf = p->bufBase; - - p->processed = 0; - p->res = SZ_OK; -} - -MY_NO_INLINE static void RangeEnc_FlushStream(CRangeEnc *p) -{ - size_t num; - if (p->res != SZ_OK) - return; - num = (size_t)(p->buf - p->bufBase); - if (num != ISeqOutStream_Write(p->outStream, p->bufBase, num)) - p->res = SZ_ERROR_WRITE; - p->processed += num; - p->buf = p->bufBase; -} - -MY_NO_INLINE static void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc *p) -{ - UInt32 low = (UInt32)p->low; - unsigned high = (unsigned)(p->low >> 32); - p->low = (UInt32)(low << 8); - if (low < (UInt32)0xFF000000 || high != 0) - { - { - Byte *buf = p->buf; - *buf++ = (Byte)(p->cache + high); - p->cache = (unsigned)(low >> 24); - p->buf = buf; - if (buf == p->bufLim) - RangeEnc_FlushStream(p); - if (p->cacheSize == 0) - return; - } - high += 0xFF; - for (;;) - { - Byte *buf = p->buf; - *buf++ = (Byte)(high); - p->buf = buf; - if (buf == p->bufLim) - RangeEnc_FlushStream(p); - if (--p->cacheSize == 0) - return; - } - } - p->cacheSize++; -} - -static void RangeEnc_FlushData(CRangeEnc *p) -{ - int i; - for (i = 0; i < 5; i++) - RangeEnc_ShiftLow(p); -} - -#define RC_NORM(p) if (range < kTopValue) { range <<= 8; RangeEnc_ShiftLow(p); } - -#define RC_BIT_PRE(p, prob) \ - ttt = *(prob); \ - newBound = (range >> kNumBitModelTotalBits) * ttt; - -// #define _LZMA_ENC_USE_BRANCH - -#ifdef _LZMA_ENC_USE_BRANCH - -#define RC_BIT(p, prob, bit) { \ - RC_BIT_PRE(p, prob) \ - if (bit == 0) { range = newBound; ttt += (kBitModelTotal - ttt) >> kNumMoveBits; } \ - else { (p)->low += newBound; range -= newBound; ttt -= ttt >> kNumMoveBits; } \ - *(prob) = (CLzmaProb)ttt; \ - RC_NORM(p) \ - } - -#else - -#define RC_BIT(p, prob, bit) { \ - UInt32 mask; \ - RC_BIT_PRE(p, prob) \ - mask = 0 - (UInt32)bit; \ - range &= mask; \ - mask &= newBound; \ - range -= mask; \ - (p)->low += mask; \ - mask = (UInt32)bit - 1; \ - range += newBound & mask; \ - mask &= (kBitModelTotal - ((1 << kNumMoveBits) - 1)); \ - mask += ((1 << kNumMoveBits) - 1); \ - ttt += (UInt32)((Int32)(mask - ttt) >> kNumMoveBits); \ - *(prob) = (CLzmaProb)ttt; \ - RC_NORM(p) \ - } - -#endif - - - - -#define RC_BIT_0_BASE(p, prob) \ - range = newBound; *(prob) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); - -#define RC_BIT_1_BASE(p, prob) \ - range -= newBound; (p)->low += newBound; *(prob) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits)); \ - -#define RC_BIT_0(p, prob) \ - RC_BIT_0_BASE(p, prob) \ - RC_NORM(p) - -#define RC_BIT_1(p, prob) \ - RC_BIT_1_BASE(p, prob) \ - RC_NORM(p) - -static void RangeEnc_EncodeBit_0(CRangeEnc *p, CLzmaProb *prob) -{ - UInt32 range, ttt, newBound; - range = p->range; - RC_BIT_PRE(p, prob) - RC_BIT_0(p, prob) - p->range = range; -} - -static void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 sym) -{ - UInt32 range = p->range; - sym |= 0x100; - do - { - UInt32 ttt, newBound; - // RangeEnc_EncodeBit(p, probs + (sym >> 8), (sym >> 7) & 1); - CLzmaProb *prob = probs + (sym >> 8); - UInt32 bit = (sym >> 7) & 1; - sym <<= 1; - RC_BIT(p, prob, bit); - } - while (sym < 0x10000); - p->range = range; -} - -static void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 sym, UInt32 matchByte) -{ - UInt32 range = p->range; - UInt32 offs = 0x100; - sym |= 0x100; - do - { - UInt32 ttt, newBound; - CLzmaProb *prob; - UInt32 bit; - matchByte <<= 1; - // RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (sym >> 8)), (sym >> 7) & 1); - prob = probs + (offs + (matchByte & offs) + (sym >> 8)); - bit = (sym >> 7) & 1; - sym <<= 1; - offs &= ~(matchByte ^ sym); - RC_BIT(p, prob, bit); - } - while (sym < 0x10000); - p->range = range; -} - - - -static void LzmaEnc_InitPriceTables(CProbPrice *ProbPrices) -{ - UInt32 i; - for (i = 0; i < (kBitModelTotal >> kNumMoveReducingBits); i++) - { - const unsigned kCyclesBits = kNumBitPriceShiftBits; - UInt32 w = (i << kNumMoveReducingBits) + (1 << (kNumMoveReducingBits - 1)); - unsigned bitCount = 0; - unsigned j; - for (j = 0; j < kCyclesBits; j++) - { - w = w * w; - bitCount <<= 1; - while (w >= ((UInt32)1 << 16)) - { - w >>= 1; - bitCount++; - } - } - ProbPrices[i] = (CProbPrice)(((unsigned)kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount); - // printf("\n%3d: %5d", i, ProbPrices[i]); - } -} - - -#define GET_PRICE(prob, bit) \ - p->ProbPrices[((prob) ^ (unsigned)(((-(int)(bit))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; - -#define GET_PRICEa(prob, bit) \ - ProbPrices[((prob) ^ (unsigned)((-((int)(bit))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; - -#define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits] -#define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] - -#define GET_PRICEa_0(prob) ProbPrices[(prob) >> kNumMoveReducingBits] -#define GET_PRICEa_1(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] - - -static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 sym, const CProbPrice *ProbPrices) -{ - UInt32 price = 0; - sym |= 0x100; - do - { - unsigned bit = sym & 1; - sym >>= 1; - price += GET_PRICEa(probs[sym], bit); - } - while (sym >= 2); - return price; -} - - -static UInt32 LitEnc_Matched_GetPrice(const CLzmaProb *probs, UInt32 sym, UInt32 matchByte, const CProbPrice *ProbPrices) -{ - UInt32 price = 0; - UInt32 offs = 0x100; - sym |= 0x100; - do - { - matchByte <<= 1; - price += GET_PRICEa(probs[offs + (matchByte & offs) + (sym >> 8)], (sym >> 7) & 1); - sym <<= 1; - offs &= ~(matchByte ^ sym); - } - while (sym < 0x10000); - return price; -} - - -static void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, unsigned numBits, unsigned sym) -{ - UInt32 range = rc->range; - unsigned m = 1; - do - { - UInt32 ttt, newBound; - unsigned bit = sym & 1; - // RangeEnc_EncodeBit(rc, probs + m, bit); - sym >>= 1; - RC_BIT(rc, probs + m, bit); - m = (m << 1) | bit; - } - while (--numBits); - rc->range = range; -} - - - -static void LenEnc_Init(CLenEnc *p) -{ - unsigned i; - for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << (kLenNumLowBits + 1)); i++) - p->low[i] = kProbInitValue; - for (i = 0; i < kLenNumHighSymbols; i++) - p->high[i] = kProbInitValue; -} - -static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, unsigned sym, unsigned posState) -{ - UInt32 range, ttt, newBound; - CLzmaProb *probs = p->low; - range = rc->range; - RC_BIT_PRE(rc, probs); - if (sym >= kLenNumLowSymbols) - { - RC_BIT_1(rc, probs); - probs += kLenNumLowSymbols; - RC_BIT_PRE(rc, probs); - if (sym >= kLenNumLowSymbols * 2) - { - RC_BIT_1(rc, probs); - rc->range = range; - // RcTree_Encode(rc, p->high, kLenNumHighBits, sym - kLenNumLowSymbols * 2); - LitEnc_Encode(rc, p->high, sym - kLenNumLowSymbols * 2); - return; - } - sym -= kLenNumLowSymbols; - } - - // RcTree_Encode(rc, probs + (posState << kLenNumLowBits), kLenNumLowBits, sym); - { - unsigned m; - unsigned bit; - RC_BIT_0(rc, probs); - probs += (posState << (1 + kLenNumLowBits)); - bit = (sym >> 2) ; RC_BIT(rc, probs + 1, bit); m = (1 << 1) + bit; - bit = (sym >> 1) & 1; RC_BIT(rc, probs + m, bit); m = (m << 1) + bit; - bit = sym & 1; RC_BIT(rc, probs + m, bit); - rc->range = range; - } -} - -static void SetPrices_3(const CLzmaProb *probs, UInt32 startPrice, UInt32 *prices, const CProbPrice *ProbPrices) -{ - unsigned i; - for (i = 0; i < 8; i += 2) - { - UInt32 price = startPrice; - UInt32 prob; - price += GET_PRICEa(probs[1 ], (i >> 2)); - price += GET_PRICEa(probs[2 + (i >> 2)], (i >> 1) & 1); - prob = probs[4 + (i >> 1)]; - prices[i ] = price + GET_PRICEa_0(prob); - prices[i + 1] = price + GET_PRICEa_1(prob); - } -} - - -MY_NO_INLINE static void MY_FAST_CALL LenPriceEnc_UpdateTables( - CLenPriceEnc *p, - unsigned numPosStates, - const CLenEnc *enc, - const CProbPrice *ProbPrices) -{ - UInt32 b; - - { - unsigned prob = enc->low[0]; - UInt32 a, c; - unsigned posState; - b = GET_PRICEa_1(prob); - a = GET_PRICEa_0(prob); - c = b + GET_PRICEa_0(enc->low[kLenNumLowSymbols]); - for (posState = 0; posState < numPosStates; posState++) - { - UInt32 *prices = p->prices[posState]; - const CLzmaProb *probs = enc->low + (posState << (1 + kLenNumLowBits)); - SetPrices_3(probs, a, prices, ProbPrices); - SetPrices_3(probs + kLenNumLowSymbols, c, prices + kLenNumLowSymbols, ProbPrices); - } - } - - /* - { - unsigned i; - UInt32 b; - a = GET_PRICEa_0(enc->low[0]); - for (i = 0; i < kLenNumLowSymbols; i++) - p->prices2[i] = a; - a = GET_PRICEa_1(enc->low[0]); - b = a + GET_PRICEa_0(enc->low[kLenNumLowSymbols]); - for (i = kLenNumLowSymbols; i < kLenNumLowSymbols * 2; i++) - p->prices2[i] = b; - a += GET_PRICEa_1(enc->low[kLenNumLowSymbols]); - } - */ - - // p->counter = numSymbols; - // p->counter = 64; - - { - unsigned i = p->tableSize; - - if (i > kLenNumLowSymbols * 2) - { - const CLzmaProb *probs = enc->high; - UInt32 *prices = p->prices[0] + kLenNumLowSymbols * 2; - i -= kLenNumLowSymbols * 2 - 1; - i >>= 1; - b += GET_PRICEa_1(enc->low[kLenNumLowSymbols]); - do - { - /* - p->prices2[i] = a + - // RcTree_GetPrice(enc->high, kLenNumHighBits, i - kLenNumLowSymbols * 2, ProbPrices); - LitEnc_GetPrice(probs, i - kLenNumLowSymbols * 2, ProbPrices); - */ - // UInt32 price = a + RcTree_GetPrice(probs, kLenNumHighBits - 1, sym, ProbPrices); - unsigned sym = --i + (1 << (kLenNumHighBits - 1)); - UInt32 price = b; - do - { - unsigned bit = sym & 1; - sym >>= 1; - price += GET_PRICEa(probs[sym], bit); - } - while (sym >= 2); - - { - unsigned prob = probs[(size_t)i + (1 << (kLenNumHighBits - 1))]; - prices[(size_t)i * 2 ] = price + GET_PRICEa_0(prob); - prices[(size_t)i * 2 + 1] = price + GET_PRICEa_1(prob); - } - } - while (i); - - { - unsigned posState; - size_t num = (p->tableSize - kLenNumLowSymbols * 2) * sizeof(p->prices[0][0]); - for (posState = 1; posState < numPosStates; posState++) - memcpy(p->prices[posState] + kLenNumLowSymbols * 2, p->prices[0] + kLenNumLowSymbols * 2, num); - } - } - } -} - -/* - #ifdef SHOW_STAT - g_STAT_OFFSET += num; - printf("\n MovePos %u", num); - #endif -*/ - -#define MOVE_POS(p, num) { \ - p->additionalOffset += (num); \ - p->matchFinder.Skip(p->matchFinderObj, (UInt32)(num)); } - - -static unsigned ReadMatchDistances(CLzmaEnc *p, unsigned *numPairsRes) -{ - unsigned numPairs; - - p->additionalOffset++; - p->numAvail = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); - numPairs = p->matchFinder.GetMatches(p->matchFinderObj, p->matches); - *numPairsRes = numPairs; - - #ifdef SHOW_STAT - printf("\n i = %u numPairs = %u ", g_STAT_OFFSET, numPairs / 2); - g_STAT_OFFSET++; - { - unsigned i; - for (i = 0; i < numPairs; i += 2) - printf("%2u %6u | ", p->matches[i], p->matches[i + 1]); - } - #endif - - if (numPairs == 0) - return 0; - { - unsigned len = p->matches[(size_t)numPairs - 2]; - if (len != p->numFastBytes) - return len; - { - UInt32 numAvail = p->numAvail; - if (numAvail > LZMA_MATCH_LEN_MAX) - numAvail = LZMA_MATCH_LEN_MAX; - { - const Byte *p1 = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; - const Byte *p2 = p1 + len; - ptrdiff_t dif = (ptrdiff_t)-1 - (ptrdiff_t)p->matches[(size_t)numPairs - 1]; - const Byte *lim = p1 + numAvail; - for (; p2 != lim && *p2 == p2[dif]; p2++) - {} - return (unsigned)(p2 - p1); - } - } - } -} - -#define MARK_LIT ((UInt32)(Int32)-1) - -#define MakeAs_Lit(p) { (p)->dist = MARK_LIT; (p)->extra = 0; } -#define MakeAs_ShortRep(p) { (p)->dist = 0; (p)->extra = 0; } -#define IsShortRep(p) ((p)->dist == 0) - - -#define GetPrice_ShortRep(p, state, posState) \ - ( GET_PRICE_0(p->isRepG0[state]) + GET_PRICE_0(p->isRep0Long[state][posState])) - -#define GetPrice_Rep_0(p, state, posState) ( \ - GET_PRICE_1(p->isMatch[state][posState]) \ - + GET_PRICE_1(p->isRep0Long[state][posState])) \ - + GET_PRICE_1(p->isRep[state]) \ - + GET_PRICE_0(p->isRepG0[state]) - -MY_FORCE_INLINE -static UInt32 GetPrice_PureRep(const CLzmaEnc *p, unsigned repIndex, size_t state, size_t posState) -{ - UInt32 price; - UInt32 prob = p->isRepG0[state]; - if (repIndex == 0) - { - price = GET_PRICE_0(prob); - price += GET_PRICE_1(p->isRep0Long[state][posState]); - } - else - { - price = GET_PRICE_1(prob); - prob = p->isRepG1[state]; - if (repIndex == 1) - price += GET_PRICE_0(prob); - else - { - price += GET_PRICE_1(prob); - price += GET_PRICE(p->isRepG2[state], repIndex - 2); - } - } - return price; -} - - -static unsigned Backward(CLzmaEnc *p, unsigned cur) -{ - unsigned wr = cur + 1; - p->optEnd = wr; - - for (;;) - { - UInt32 dist = p->opt[cur].dist; - unsigned len = (unsigned)p->opt[cur].len; - unsigned extra = (unsigned)p->opt[cur].extra; - cur -= len; - - if (extra) - { - wr--; - p->opt[wr].len = (UInt32)len; - cur -= extra; - len = extra; - if (extra == 1) - { - p->opt[wr].dist = dist; - dist = MARK_LIT; - } - else - { - p->opt[wr].dist = 0; - len--; - wr--; - p->opt[wr].dist = MARK_LIT; - p->opt[wr].len = 1; - } - } - - if (cur == 0) - { - p->backRes = dist; - p->optCur = wr; - return len; - } - - wr--; - p->opt[wr].dist = dist; - p->opt[wr].len = (UInt32)len; - } -} - - - -#define LIT_PROBS(pos, prevByte) \ - (p->litProbs + (UInt32)3 * (((((pos) << 8) + (prevByte)) & p->lpMask) << p->lc)) - - -static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) -{ - unsigned last, cur; - UInt32 reps[LZMA_NUM_REPS]; - unsigned repLens[LZMA_NUM_REPS]; - UInt32 *matches; - - { - UInt32 numAvail; - unsigned numPairs, mainLen, repMaxIndex, i, posState; - UInt32 matchPrice, repMatchPrice; - const Byte *data; - Byte curByte, matchByte; - - p->optCur = p->optEnd = 0; - - if (p->additionalOffset == 0) - mainLen = ReadMatchDistances(p, &numPairs); - else - { - mainLen = p->longestMatchLen; - numPairs = p->numPairs; - } - - numAvail = p->numAvail; - if (numAvail < 2) - { - p->backRes = MARK_LIT; - return 1; - } - if (numAvail > LZMA_MATCH_LEN_MAX) - numAvail = LZMA_MATCH_LEN_MAX; - - data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; - repMaxIndex = 0; - - for (i = 0; i < LZMA_NUM_REPS; i++) - { - unsigned len; - const Byte *data2; - reps[i] = p->reps[i]; - data2 = data - reps[i]; - if (data[0] != data2[0] || data[1] != data2[1]) - { - repLens[i] = 0; - continue; - } - for (len = 2; len < numAvail && data[len] == data2[len]; len++) - {} - repLens[i] = len; - if (len > repLens[repMaxIndex]) - repMaxIndex = i; - } - - if (repLens[repMaxIndex] >= p->numFastBytes) - { - unsigned len; - p->backRes = (UInt32)repMaxIndex; - len = repLens[repMaxIndex]; - MOVE_POS(p, len - 1) - return len; - } - - matches = p->matches; - - if (mainLen >= p->numFastBytes) - { - p->backRes = matches[(size_t)numPairs - 1] + LZMA_NUM_REPS; - MOVE_POS(p, mainLen - 1) - return mainLen; - } - - curByte = *data; - matchByte = *(data - reps[0]); - - last = repLens[repMaxIndex]; - if (last <= mainLen) - last = mainLen; - - if (last < 2 && curByte != matchByte) - { - p->backRes = MARK_LIT; - return 1; - } - - p->opt[0].state = (CState)p->state; - - posState = (position & p->pbMask); - - { - const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); - p->opt[1].price = GET_PRICE_0(p->isMatch[p->state][posState]) + - (!IsLitState(p->state) ? - LitEnc_Matched_GetPrice(probs, curByte, matchByte, p->ProbPrices) : - LitEnc_GetPrice(probs, curByte, p->ProbPrices)); - } - - MakeAs_Lit(&p->opt[1]); - - matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]); - repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]); - - // 18.06 - if (matchByte == curByte && repLens[0] == 0) - { - UInt32 shortRepPrice = repMatchPrice + GetPrice_ShortRep(p, p->state, posState); - if (shortRepPrice < p->opt[1].price) - { - p->opt[1].price = shortRepPrice; - MakeAs_ShortRep(&p->opt[1]); - } - if (last < 2) - { - p->backRes = p->opt[1].dist; - return 1; - } - } - - p->opt[1].len = 1; - - p->opt[0].reps[0] = reps[0]; - p->opt[0].reps[1] = reps[1]; - p->opt[0].reps[2] = reps[2]; - p->opt[0].reps[3] = reps[3]; - - // ---------- REP ---------- - - for (i = 0; i < LZMA_NUM_REPS; i++) - { - unsigned repLen = repLens[i]; - UInt32 price; - if (repLen < 2) - continue; - price = repMatchPrice + GetPrice_PureRep(p, i, p->state, posState); - do - { - UInt32 price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState, repLen); - COptimal *opt = &p->opt[repLen]; - if (price2 < opt->price) - { - opt->price = price2; - opt->len = (UInt32)repLen; - opt->dist = (UInt32)i; - opt->extra = 0; - } - } - while (--repLen >= 2); - } - - - // ---------- MATCH ---------- - { - unsigned len = repLens[0] + 1; - if (len <= mainLen) - { - unsigned offs = 0; - UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]); - - if (len < 2) - len = 2; - else - while (len > matches[offs]) - offs += 2; - - for (; ; len++) - { - COptimal *opt; - UInt32 dist = matches[(size_t)offs + 1]; - UInt32 price = normalMatchPrice + GET_PRICE_LEN(&p->lenEnc, posState, len); - unsigned lenToPosState = GetLenToPosState(len); - - if (dist < kNumFullDistances) - price += p->distancesPrices[lenToPosState][dist & (kNumFullDistances - 1)]; - else - { - unsigned slot; - GetPosSlot2(dist, slot); - price += p->alignPrices[dist & kAlignMask]; - price += p->posSlotPrices[lenToPosState][slot]; - } - - opt = &p->opt[len]; - - if (price < opt->price) - { - opt->price = price; - opt->len = (UInt32)len; - opt->dist = dist + LZMA_NUM_REPS; - opt->extra = 0; - } - - if (len == matches[offs]) - { - offs += 2; - if (offs == numPairs) - break; - } - } - } - } - - - cur = 0; - - #ifdef SHOW_STAT2 - /* if (position >= 0) */ - { - unsigned i; - printf("\n pos = %4X", position); - for (i = cur; i <= last; i++) - printf("\nprice[%4X] = %u", position - cur + i, p->opt[i].price); - } - #endif - } - - - - // ---------- Optimal Parsing ---------- - - for (;;) - { - unsigned numAvail; - UInt32 numAvailFull; - unsigned newLen, numPairs, prev, state, posState, startLen; - UInt32 litPrice, matchPrice, repMatchPrice; - BoolInt nextIsLit; - Byte curByte, matchByte; - const Byte *data; - COptimal *curOpt, *nextOpt; - - if (++cur == last) - break; - - // 18.06 - if (cur >= kNumOpts - 64) - { - unsigned j, best; - UInt32 price = p->opt[cur].price; - best = cur; - for (j = cur + 1; j <= last; j++) - { - UInt32 price2 = p->opt[j].price; - if (price >= price2) - { - price = price2; - best = j; - } - } - { - unsigned delta = best - cur; - if (delta != 0) - { - MOVE_POS(p, delta); - } - } - cur = best; - break; - } - - newLen = ReadMatchDistances(p, &numPairs); - - if (newLen >= p->numFastBytes) - { - p->numPairs = numPairs; - p->longestMatchLen = newLen; - break; - } - - curOpt = &p->opt[cur]; - - position++; - - // we need that check here, if skip_items in p->opt are possible - /* - if (curOpt->price >= kInfinityPrice) - continue; - */ - - prev = cur - curOpt->len; - - if (curOpt->len == 1) - { - state = (unsigned)p->opt[prev].state; - if (IsShortRep(curOpt)) - state = kShortRepNextStates[state]; - else - state = kLiteralNextStates[state]; - } - else - { - const COptimal *prevOpt; - UInt32 b0; - UInt32 dist = curOpt->dist; - - if (curOpt->extra) - { - prev -= (unsigned)curOpt->extra; - state = kState_RepAfterLit; - if (curOpt->extra == 1) - state = (dist < LZMA_NUM_REPS ? kState_RepAfterLit : kState_MatchAfterLit); - } - else - { - state = (unsigned)p->opt[prev].state; - if (dist < LZMA_NUM_REPS) - state = kRepNextStates[state]; - else - state = kMatchNextStates[state]; - } - - prevOpt = &p->opt[prev]; - b0 = prevOpt->reps[0]; - - if (dist < LZMA_NUM_REPS) - { - if (dist == 0) - { - reps[0] = b0; - reps[1] = prevOpt->reps[1]; - reps[2] = prevOpt->reps[2]; - reps[3] = prevOpt->reps[3]; - } - else - { - reps[1] = b0; - b0 = prevOpt->reps[1]; - if (dist == 1) - { - reps[0] = b0; - reps[2] = prevOpt->reps[2]; - reps[3] = prevOpt->reps[3]; - } - else - { - reps[2] = b0; - reps[0] = prevOpt->reps[dist]; - reps[3] = prevOpt->reps[dist ^ 1]; - } - } - } - else - { - reps[0] = (dist - LZMA_NUM_REPS + 1); - reps[1] = b0; - reps[2] = prevOpt->reps[1]; - reps[3] = prevOpt->reps[2]; - } - } - - curOpt->state = (CState)state; - curOpt->reps[0] = reps[0]; - curOpt->reps[1] = reps[1]; - curOpt->reps[2] = reps[2]; - curOpt->reps[3] = reps[3]; - - data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; - curByte = *data; - matchByte = *(data - reps[0]); - - posState = (position & p->pbMask); - - /* - The order of Price checks: - < LIT - <= SHORT_REP - < LIT : REP_0 - < REP [ : LIT : REP_0 ] - < MATCH [ : LIT : REP_0 ] - */ - - { - UInt32 curPrice = curOpt->price; - unsigned prob = p->isMatch[state][posState]; - matchPrice = curPrice + GET_PRICE_1(prob); - litPrice = curPrice + GET_PRICE_0(prob); - } - - nextOpt = &p->opt[(size_t)cur + 1]; - nextIsLit = False; - - // here we can allow skip_items in p->opt, if we don't check (nextOpt->price < kInfinityPrice) - // 18.new.06 - if ((nextOpt->price < kInfinityPrice - // && !IsLitState(state) - && matchByte == curByte) - || litPrice > nextOpt->price - ) - litPrice = 0; - else - { - const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); - litPrice += (!IsLitState(state) ? - LitEnc_Matched_GetPrice(probs, curByte, matchByte, p->ProbPrices) : - LitEnc_GetPrice(probs, curByte, p->ProbPrices)); - - if (litPrice < nextOpt->price) - { - nextOpt->price = litPrice; - nextOpt->len = 1; - MakeAs_Lit(nextOpt); - nextIsLit = True; - } - } - - repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[state]); - - numAvailFull = p->numAvail; - { - unsigned temp = kNumOpts - 1 - cur; - if (numAvailFull > temp) - numAvailFull = (UInt32)temp; - } - - // 18.06 - // ---------- SHORT_REP ---------- - if (IsLitState(state)) // 18.new - if (matchByte == curByte) - if (repMatchPrice < nextOpt->price) // 18.new - // if (numAvailFull < 2 || data[1] != *(data - reps[0] + 1)) - if ( - // nextOpt->price >= kInfinityPrice || - nextOpt->len < 2 // we can check nextOpt->len, if skip items are not allowed in p->opt - || (nextOpt->dist != 0 - // && nextOpt->extra <= 1 // 17.old - ) - ) - { - UInt32 shortRepPrice = repMatchPrice + GetPrice_ShortRep(p, state, posState); - // if (shortRepPrice <= nextOpt->price) // 17.old - if (shortRepPrice < nextOpt->price) // 18.new - { - nextOpt->price = shortRepPrice; - nextOpt->len = 1; - MakeAs_ShortRep(nextOpt); - nextIsLit = False; - } - } - - if (numAvailFull < 2) - continue; - numAvail = (numAvailFull <= p->numFastBytes ? numAvailFull : p->numFastBytes); - - // numAvail <= p->numFastBytes - - // ---------- LIT : REP_0 ---------- - - if (!nextIsLit - && litPrice != 0 // 18.new - && matchByte != curByte - && numAvailFull > 2) - { - const Byte *data2 = data - reps[0]; - if (data[1] == data2[1] && data[2] == data2[2]) - { - unsigned len; - unsigned limit = p->numFastBytes + 1; - if (limit > numAvailFull) - limit = numAvailFull; - for (len = 3; len < limit && data[len] == data2[len]; len++) - {} - - { - unsigned state2 = kLiteralNextStates[state]; - unsigned posState2 = (position + 1) & p->pbMask; - UInt32 price = litPrice + GetPrice_Rep_0(p, state2, posState2); - { - unsigned offset = cur + len; - - if (last < offset) - last = offset; - - // do - { - UInt32 price2; - COptimal *opt; - len--; - // price2 = price + GetPrice_Len_Rep_0(p, len, state2, posState2); - price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState2, len); - - opt = &p->opt[offset]; - // offset--; - if (price2 < opt->price) - { - opt->price = price2; - opt->len = (UInt32)len; - opt->dist = 0; - opt->extra = 1; - } - } - // while (len >= 3); - } - } - } - } - - startLen = 2; /* speed optimization */ - - { - // ---------- REP ---------- - unsigned repIndex = 0; // 17.old - // unsigned repIndex = IsLitState(state) ? 0 : 1; // 18.notused - for (; repIndex < LZMA_NUM_REPS; repIndex++) - { - unsigned len; - UInt32 price; - const Byte *data2 = data - reps[repIndex]; - if (data[0] != data2[0] || data[1] != data2[1]) - continue; - - for (len = 2; len < numAvail && data[len] == data2[len]; len++) - {} - - // if (len < startLen) continue; // 18.new: speed optimization - - { - unsigned offset = cur + len; - if (last < offset) - last = offset; - } - { - unsigned len2 = len; - price = repMatchPrice + GetPrice_PureRep(p, repIndex, state, posState); - do - { - UInt32 price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState, len2); - COptimal *opt = &p->opt[cur + len2]; - if (price2 < opt->price) - { - opt->price = price2; - opt->len = (UInt32)len2; - opt->dist = (UInt32)repIndex; - opt->extra = 0; - } - } - while (--len2 >= 2); - } - - if (repIndex == 0) startLen = len + 1; // 17.old - // startLen = len + 1; // 18.new - - /* if (_maxMode) */ - { - // ---------- REP : LIT : REP_0 ---------- - // numFastBytes + 1 + numFastBytes - - unsigned len2 = len + 1; - unsigned limit = len2 + p->numFastBytes; - if (limit > numAvailFull) - limit = numAvailFull; - - len2 += 2; - if (len2 <= limit) - if (data[len2 - 2] == data2[len2 - 2]) - if (data[len2 - 1] == data2[len2 - 1]) - { - unsigned state2 = kRepNextStates[state]; - unsigned posState2 = (position + len) & p->pbMask; - price += GET_PRICE_LEN(&p->repLenEnc, posState, len) - + GET_PRICE_0(p->isMatch[state2][posState2]) - + LitEnc_Matched_GetPrice(LIT_PROBS(position + len, data[(size_t)len - 1]), - data[len], data2[len], p->ProbPrices); - - // state2 = kLiteralNextStates[state2]; - state2 = kState_LitAfterRep; - posState2 = (posState2 + 1) & p->pbMask; - - - price += GetPrice_Rep_0(p, state2, posState2); - - for (; len2 < limit && data[len2] == data2[len2]; len2++) - {} - - len2 -= len; - // if (len2 >= 3) - { - { - unsigned offset = cur + len + len2; - - if (last < offset) - last = offset; - // do - { - UInt32 price2; - COptimal *opt; - len2--; - // price2 = price + GetPrice_Len_Rep_0(p, len2, state2, posState2); - price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState2, len2); - - opt = &p->opt[offset]; - // offset--; - if (price2 < opt->price) - { - opt->price = price2; - opt->len = (UInt32)len2; - opt->extra = (CExtra)(len + 1); - opt->dist = (UInt32)repIndex; - } - } - // while (len2 >= 3); - } - } - } - } - } - } - - - // ---------- MATCH ---------- - /* for (unsigned len = 2; len <= newLen; len++) */ - if (newLen > numAvail) - { - newLen = numAvail; - for (numPairs = 0; newLen > matches[numPairs]; numPairs += 2); - matches[numPairs] = (UInt32)newLen; - numPairs += 2; - } - - // startLen = 2; /* speed optimization */ - - if (newLen >= startLen) - { - UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[state]); - UInt32 dist; - unsigned offs, posSlot, len; - - { - unsigned offset = cur + newLen; - if (last < offset) - last = offset; - } - - offs = 0; - while (startLen > matches[offs]) - offs += 2; - dist = matches[(size_t)offs + 1]; - - // if (dist >= kNumFullDistances) - GetPosSlot2(dist, posSlot); - - for (len = /*2*/ startLen; ; len++) - { - UInt32 price = normalMatchPrice + GET_PRICE_LEN(&p->lenEnc, posState, len); - { - COptimal *opt; - unsigned lenNorm = len - 2; - lenNorm = GetLenToPosState2(lenNorm); - if (dist < kNumFullDistances) - price += p->distancesPrices[lenNorm][dist & (kNumFullDistances - 1)]; - else - price += p->posSlotPrices[lenNorm][posSlot] + p->alignPrices[dist & kAlignMask]; - - opt = &p->opt[cur + len]; - if (price < opt->price) - { - opt->price = price; - opt->len = (UInt32)len; - opt->dist = dist + LZMA_NUM_REPS; - opt->extra = 0; - } - } - - if (len == matches[offs]) - { - // if (p->_maxMode) { - // MATCH : LIT : REP_0 - - const Byte *data2 = data - dist - 1; - unsigned len2 = len + 1; - unsigned limit = len2 + p->numFastBytes; - if (limit > numAvailFull) - limit = numAvailFull; - - len2 += 2; - if (len2 <= limit) - if (data[len2 - 2] == data2[len2 - 2]) - if (data[len2 - 1] == data2[len2 - 1]) - { - for (; len2 < limit && data[len2] == data2[len2]; len2++) - {} - - len2 -= len; - - // if (len2 >= 3) - { - unsigned state2 = kMatchNextStates[state]; - unsigned posState2 = (position + len) & p->pbMask; - unsigned offset; - price += GET_PRICE_0(p->isMatch[state2][posState2]); - price += LitEnc_Matched_GetPrice(LIT_PROBS(position + len, data[(size_t)len - 1]), - data[len], data2[len], p->ProbPrices); - - // state2 = kLiteralNextStates[state2]; - state2 = kState_LitAfterMatch; - - posState2 = (posState2 + 1) & p->pbMask; - price += GetPrice_Rep_0(p, state2, posState2); - - offset = cur + len + len2; - - if (last < offset) - last = offset; - // do - { - UInt32 price2; - COptimal *opt; - len2--; - // price2 = price + GetPrice_Len_Rep_0(p, len2, state2, posState2); - price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState2, len2); - opt = &p->opt[offset]; - // offset--; - if (price2 < opt->price) - { - opt->price = price2; - opt->len = (UInt32)len2; - opt->extra = (CExtra)(len + 1); - opt->dist = dist + LZMA_NUM_REPS; - } - } - // while (len2 >= 3); - } - - } - - offs += 2; - if (offs == numPairs) - break; - dist = matches[(size_t)offs + 1]; - // if (dist >= kNumFullDistances) - GetPosSlot2(dist, posSlot); - } - } - } - } - - do - p->opt[last].price = kInfinityPrice; - while (--last); - - return Backward(p, cur); -} - - - -#define ChangePair(smallDist, bigDist) (((bigDist) >> 7) > (smallDist)) - - - -static unsigned GetOptimumFast(CLzmaEnc *p) -{ - UInt32 numAvail, mainDist; - unsigned mainLen, numPairs, repIndex, repLen, i; - const Byte *data; - - if (p->additionalOffset == 0) - mainLen = ReadMatchDistances(p, &numPairs); - else - { - mainLen = p->longestMatchLen; - numPairs = p->numPairs; - } - - numAvail = p->numAvail; - p->backRes = MARK_LIT; - if (numAvail < 2) - return 1; - // if (mainLen < 2 && p->state == 0) return 1; // 18.06.notused - if (numAvail > LZMA_MATCH_LEN_MAX) - numAvail = LZMA_MATCH_LEN_MAX; - data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; - repLen = repIndex = 0; - - for (i = 0; i < LZMA_NUM_REPS; i++) - { - unsigned len; - const Byte *data2 = data - p->reps[i]; - if (data[0] != data2[0] || data[1] != data2[1]) - continue; - for (len = 2; len < numAvail && data[len] == data2[len]; len++) - {} - if (len >= p->numFastBytes) - { - p->backRes = (UInt32)i; - MOVE_POS(p, len - 1) - return len; - } - if (len > repLen) - { - repIndex = i; - repLen = len; - } - } - - if (mainLen >= p->numFastBytes) - { - p->backRes = p->matches[(size_t)numPairs - 1] + LZMA_NUM_REPS; - MOVE_POS(p, mainLen - 1) - return mainLen; - } - - mainDist = 0; /* for GCC */ - - if (mainLen >= 2) - { - mainDist = p->matches[(size_t)numPairs - 1]; - while (numPairs > 2) - { - UInt32 dist2; - if (mainLen != p->matches[(size_t)numPairs - 4] + 1) - break; - dist2 = p->matches[(size_t)numPairs - 3]; - if (!ChangePair(dist2, mainDist)) - break; - numPairs -= 2; - mainLen--; - mainDist = dist2; - } - if (mainLen == 2 && mainDist >= 0x80) - mainLen = 1; - } - - if (repLen >= 2) - if ( repLen + 1 >= mainLen - || (repLen + 2 >= mainLen && mainDist >= (1 << 9)) - || (repLen + 3 >= mainLen && mainDist >= (1 << 15))) - { - p->backRes = (UInt32)repIndex; - MOVE_POS(p, repLen - 1) - return repLen; - } - - if (mainLen < 2 || numAvail <= 2) - return 1; - - { - unsigned len1 = ReadMatchDistances(p, &p->numPairs); - p->longestMatchLen = len1; - - if (len1 >= 2) - { - UInt32 newDist = p->matches[(size_t)p->numPairs - 1]; - if ( (len1 >= mainLen && newDist < mainDist) - || (len1 == mainLen + 1 && !ChangePair(mainDist, newDist)) - || (len1 > mainLen + 1) - || (len1 + 1 >= mainLen && mainLen >= 3 && ChangePair(newDist, mainDist))) - return 1; - } - } - - data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; - - for (i = 0; i < LZMA_NUM_REPS; i++) - { - unsigned len, limit; - const Byte *data2 = data - p->reps[i]; - if (data[0] != data2[0] || data[1] != data2[1]) - continue; - limit = mainLen - 1; - for (len = 2;; len++) - { - if (len >= limit) - return 1; - if (data[len] != data2[len]) - break; - } - } - - p->backRes = mainDist + LZMA_NUM_REPS; - if (mainLen != 2) - { - MOVE_POS(p, mainLen - 2) - } - return mainLen; -} - - - - -static void WriteEndMarker(CLzmaEnc *p, unsigned posState) -{ - UInt32 range; - range = p->rc.range; - { - UInt32 ttt, newBound; - CLzmaProb *prob = &p->isMatch[p->state][posState]; - RC_BIT_PRE(&p->rc, prob) - RC_BIT_1(&p->rc, prob) - prob = &p->isRep[p->state]; - RC_BIT_PRE(&p->rc, prob) - RC_BIT_0(&p->rc, prob) - } - p->state = kMatchNextStates[p->state]; - - p->rc.range = range; - LenEnc_Encode(&p->lenProbs, &p->rc, 0, posState); - range = p->rc.range; - - { - // RcTree_Encode_PosSlot(&p->rc, p->posSlotEncoder[0], (1 << kNumPosSlotBits) - 1); - CLzmaProb *probs = p->posSlotEncoder[0]; - unsigned m = 1; - do - { - UInt32 ttt, newBound; - RC_BIT_PRE(p, probs + m) - RC_BIT_1(&p->rc, probs + m); - m = (m << 1) + 1; - } - while (m < (1 << kNumPosSlotBits)); - } - { - // RangeEnc_EncodeDirectBits(&p->rc, ((UInt32)1 << (30 - kNumAlignBits)) - 1, 30 - kNumAlignBits); UInt32 range = p->range; - unsigned numBits = 30 - kNumAlignBits; - do - { - range >>= 1; - p->rc.low += range; - RC_NORM(&p->rc) - } - while (--numBits); - } - - { - // RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, kAlignMask); - CLzmaProb *probs = p->posAlignEncoder; - unsigned m = 1; - do - { - UInt32 ttt, newBound; - RC_BIT_PRE(p, probs + m) - RC_BIT_1(&p->rc, probs + m); - m = (m << 1) + 1; - } - while (m < kAlignTableSize); - } - p->rc.range = range; -} - - -static SRes CheckErrors(CLzmaEnc *p) -{ - if (p->result != SZ_OK) - return p->result; - if (p->rc.res != SZ_OK) - p->result = SZ_ERROR_WRITE; - if (p->matchFinderBase.result != SZ_OK) - p->result = SZ_ERROR_READ; - if (p->result != SZ_OK) - p->finished = True; - return p->result; -} - - -MY_NO_INLINE static SRes Flush(CLzmaEnc *p, UInt32 nowPos) -{ - /* ReleaseMFStream(); */ - p->finished = True; - if (p->writeEndMark) - WriteEndMarker(p, nowPos & p->pbMask); - RangeEnc_FlushData(&p->rc); - RangeEnc_FlushStream(&p->rc); - return CheckErrors(p); -} - - -MY_NO_INLINE static void FillAlignPrices(CLzmaEnc *p) -{ - unsigned i; - const CProbPrice *ProbPrices = p->ProbPrices; - const CLzmaProb *probs = p->posAlignEncoder; - // p->alignPriceCount = 0; - for (i = 0; i < kAlignTableSize / 2; i++) - { - UInt32 price = 0; - unsigned sym = i; - unsigned m = 1; - unsigned bit; - UInt32 prob; - bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[m], bit); m = (m << 1) + bit; - bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[m], bit); m = (m << 1) + bit; - bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[m], bit); m = (m << 1) + bit; - prob = probs[m]; - p->alignPrices[i ] = price + GET_PRICEa_0(prob); - p->alignPrices[i + 8] = price + GET_PRICEa_1(prob); - // p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices); - } -} - - -MY_NO_INLINE static void FillDistancesPrices(CLzmaEnc *p) -{ - // int y; for (y = 0; y < 100; y++) { - - UInt32 tempPrices[kNumFullDistances]; - unsigned i, lps; - - const CProbPrice *ProbPrices = p->ProbPrices; - p->matchPriceCount = 0; - - for (i = kStartPosModelIndex / 2; i < kNumFullDistances / 2; i++) - { - unsigned posSlot = GetPosSlot1(i); - unsigned footerBits = (posSlot >> 1) - 1; - unsigned base = ((2 | (posSlot & 1)) << footerBits); - const CLzmaProb *probs = p->posEncoders + (size_t)base * 2; - // tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base, footerBits, i - base, p->ProbPrices); - UInt32 price = 0; - unsigned m = 1; - unsigned sym = i; - unsigned offset = (unsigned)1 << footerBits; - base += i; - - if (footerBits) - do - { - unsigned bit = sym & 1; - sym >>= 1; - price += GET_PRICEa(probs[m], bit); - m = (m << 1) + bit; - } - while (--footerBits); - - { - unsigned prob = probs[m]; - tempPrices[base ] = price + GET_PRICEa_0(prob); - tempPrices[base + offset] = price + GET_PRICEa_1(prob); - } - } - - for (lps = 0; lps < kNumLenToPosStates; lps++) - { - unsigned slot; - unsigned distTableSize2 = (p->distTableSize + 1) >> 1; - UInt32 *posSlotPrices = p->posSlotPrices[lps]; - const CLzmaProb *probs = p->posSlotEncoder[lps]; - - for (slot = 0; slot < distTableSize2; slot++) - { - // posSlotPrices[slot] = RcTree_GetPrice(encoder, kNumPosSlotBits, slot, p->ProbPrices); - UInt32 price; - unsigned bit; - unsigned sym = slot + (1 << (kNumPosSlotBits - 1)); - unsigned prob; - bit = sym & 1; sym >>= 1; price = GET_PRICEa(probs[sym], bit); - bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[sym], bit); - bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[sym], bit); - bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[sym], bit); - bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[sym], bit); - prob = probs[(size_t)slot + (1 << (kNumPosSlotBits - 1))]; - posSlotPrices[(size_t)slot * 2 ] = price + GET_PRICEa_0(prob); - posSlotPrices[(size_t)slot * 2 + 1] = price + GET_PRICEa_1(prob); - } - - { - UInt32 delta = ((UInt32)((kEndPosModelIndex / 2 - 1) - kNumAlignBits) << kNumBitPriceShiftBits); - for (slot = kEndPosModelIndex / 2; slot < distTableSize2; slot++) - { - posSlotPrices[(size_t)slot * 2 ] += delta; - posSlotPrices[(size_t)slot * 2 + 1] += delta; - delta += ((UInt32)1 << kNumBitPriceShiftBits); - } - } - - { - UInt32 *dp = p->distancesPrices[lps]; - - dp[0] = posSlotPrices[0]; - dp[1] = posSlotPrices[1]; - dp[2] = posSlotPrices[2]; - dp[3] = posSlotPrices[3]; - - for (i = 4; i < kNumFullDistances; i += 2) - { - UInt32 slotPrice = posSlotPrices[GetPosSlot1(i)]; - dp[i ] = slotPrice + tempPrices[i]; - dp[i + 1] = slotPrice + tempPrices[i + 1]; - } - } - } - // } -} - - - -static void LzmaEnc_Construct(CLzmaEnc *p) -{ - RangeEnc_Construct(&p->rc); - MatchFinder_Construct(&p->matchFinderBase); - - #ifndef _7ZIP_ST - MatchFinderMt_Construct(&p->matchFinderMt); - p->matchFinderMt.MatchFinder = &p->matchFinderBase; - #endif - - { - CLzmaEncProps props; - LzmaEncProps_Init(&props); - LzmaEnc_SetProps(p, &props); - } - - #ifndef LZMA_LOG_BSR - LzmaEnc_FastPosInit(p->g_FastPos); - #endif - - LzmaEnc_InitPriceTables(p->ProbPrices); - p->litProbs = NULL; - p->saveState.litProbs = NULL; - -} - -CLzmaEncHandle LzmaEnc_Create(ISzAllocPtr alloc) -{ - void *p; - p = ISzAlloc_Alloc(alloc, sizeof(CLzmaEnc)); - if (p) - LzmaEnc_Construct((CLzmaEnc *)p); - return p; -} - -static void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAllocPtr alloc) -{ - ISzAlloc_Free(alloc, p->litProbs); - ISzAlloc_Free(alloc, p->saveState.litProbs); - p->litProbs = NULL; - p->saveState.litProbs = NULL; -} - -static void LzmaEnc_Destruct(CLzmaEnc *p, ISzAllocPtr alloc, ISzAllocPtr allocBig) -{ - #ifndef _7ZIP_ST - MatchFinderMt_Destruct(&p->matchFinderMt, allocBig); - #endif - - MatchFinder_Free(&p->matchFinderBase, allocBig); - LzmaEnc_FreeLits(p, alloc); - RangeEnc_Free(&p->rc, alloc); -} - -void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAllocPtr alloc, ISzAllocPtr allocBig) -{ - LzmaEnc_Destruct((CLzmaEnc *)p, alloc, allocBig); - ISzAlloc_Free(alloc, p); -} - - -MY_NO_INLINE -static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, UInt32 maxPackSize, UInt32 maxUnpackSize) -{ - UInt32 nowPos32, startPos32; - if (p->needInit) - { - p->matchFinder.Init(p->matchFinderObj); - p->needInit = 0; - } - - if (p->finished) - return p->result; - RINOK(CheckErrors(p)); - - nowPos32 = (UInt32)p->nowPos64; - startPos32 = nowPos32; - - if (p->nowPos64 == 0) - { - unsigned numPairs; - Byte curByte; - if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) - return Flush(p, nowPos32); - ReadMatchDistances(p, &numPairs); - RangeEnc_EncodeBit_0(&p->rc, &p->isMatch[kState_Start][0]); - // p->state = kLiteralNextStates[p->state]; - curByte = *(p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset); - LitEnc_Encode(&p->rc, p->litProbs, curByte); - p->additionalOffset--; - nowPos32++; - } - - if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) != 0) - - for (;;) - { - UInt32 dist; - unsigned len, posState; - UInt32 range, ttt, newBound; - CLzmaProb *probs; - - if (p->fastMode) - len = GetOptimumFast(p); - else - { - unsigned oci = p->optCur; - if (p->optEnd == oci) - len = GetOptimum(p, nowPos32); - else - { - const COptimal *opt = &p->opt[oci]; - len = opt->len; - p->backRes = opt->dist; - p->optCur = oci + 1; - } - } - - posState = (unsigned)nowPos32 & p->pbMask; - range = p->rc.range; - probs = &p->isMatch[p->state][posState]; - - RC_BIT_PRE(&p->rc, probs) - - dist = p->backRes; - - #ifdef SHOW_STAT2 - printf("\n pos = %6X, len = %3u pos = %6u", nowPos32, len, dist); - #endif - - if (dist == MARK_LIT) - { - Byte curByte; - const Byte *data; - unsigned state; - - RC_BIT_0(&p->rc, probs); - p->rc.range = range; - data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; - probs = LIT_PROBS(nowPos32, *(data - 1)); - curByte = *data; - state = p->state; - p->state = kLiteralNextStates[state]; - if (IsLitState(state)) - LitEnc_Encode(&p->rc, probs, curByte); - else - LitEnc_EncodeMatched(&p->rc, probs, curByte, *(data - p->reps[0])); - } - else - { - RC_BIT_1(&p->rc, probs); - probs = &p->isRep[p->state]; - RC_BIT_PRE(&p->rc, probs) - - if (dist < LZMA_NUM_REPS) - { - RC_BIT_1(&p->rc, probs); - probs = &p->isRepG0[p->state]; - RC_BIT_PRE(&p->rc, probs) - if (dist == 0) - { - RC_BIT_0(&p->rc, probs); - probs = &p->isRep0Long[p->state][posState]; - RC_BIT_PRE(&p->rc, probs) - if (len != 1) - { - RC_BIT_1_BASE(&p->rc, probs); - } - else - { - RC_BIT_0_BASE(&p->rc, probs); - p->state = kShortRepNextStates[p->state]; - } - } - else - { - RC_BIT_1(&p->rc, probs); - probs = &p->isRepG1[p->state]; - RC_BIT_PRE(&p->rc, probs) - if (dist == 1) - { - RC_BIT_0_BASE(&p->rc, probs); - dist = p->reps[1]; - } - else - { - RC_BIT_1(&p->rc, probs); - probs = &p->isRepG2[p->state]; - RC_BIT_PRE(&p->rc, probs) - if (dist == 2) - { - RC_BIT_0_BASE(&p->rc, probs); - dist = p->reps[2]; - } - else - { - RC_BIT_1_BASE(&p->rc, probs); - dist = p->reps[3]; - p->reps[3] = p->reps[2]; - } - p->reps[2] = p->reps[1]; - } - p->reps[1] = p->reps[0]; - p->reps[0] = dist; - } - - RC_NORM(&p->rc) - - p->rc.range = range; - - if (len != 1) - { - LenEnc_Encode(&p->repLenProbs, &p->rc, len - LZMA_MATCH_LEN_MIN, posState); - --p->repLenEncCounter; - p->state = kRepNextStates[p->state]; - } - } - else - { - unsigned posSlot; - RC_BIT_0(&p->rc, probs); - p->rc.range = range; - p->state = kMatchNextStates[p->state]; - - LenEnc_Encode(&p->lenProbs, &p->rc, len - LZMA_MATCH_LEN_MIN, posState); - // --p->lenEnc.counter; - - dist -= LZMA_NUM_REPS; - p->reps[3] = p->reps[2]; - p->reps[2] = p->reps[1]; - p->reps[1] = p->reps[0]; - p->reps[0] = dist + 1; - - p->matchPriceCount++; - GetPosSlot(dist, posSlot); - // RcTree_Encode_PosSlot(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], posSlot); - { - UInt32 sym = (UInt32)posSlot + (1 << kNumPosSlotBits); - range = p->rc.range; - probs = p->posSlotEncoder[GetLenToPosState(len)]; - do - { - CLzmaProb *prob = probs + (sym >> kNumPosSlotBits); - UInt32 bit = (sym >> (kNumPosSlotBits - 1)) & 1; - sym <<= 1; - RC_BIT(&p->rc, prob, bit); - } - while (sym < (1 << kNumPosSlotBits * 2)); - p->rc.range = range; - } - - if (dist >= kStartPosModelIndex) - { - unsigned footerBits = ((posSlot >> 1) - 1); - - if (dist < kNumFullDistances) - { - unsigned base = ((2 | (posSlot & 1)) << footerBits); - RcTree_ReverseEncode(&p->rc, p->posEncoders + base, footerBits, (unsigned)(dist /* - base */)); - } - else - { - UInt32 pos2 = (dist | 0xF) << (32 - footerBits); - range = p->rc.range; - // RangeEnc_EncodeDirectBits(&p->rc, posReduced >> kNumAlignBits, footerBits - kNumAlignBits); - /* - do - { - range >>= 1; - p->rc.low += range & (0 - ((dist >> --footerBits) & 1)); - RC_NORM(&p->rc) - } - while (footerBits > kNumAlignBits); - */ - do - { - range >>= 1; - p->rc.low += range & (0 - (pos2 >> 31)); - pos2 += pos2; - RC_NORM(&p->rc) - } - while (pos2 != 0xF0000000); - - - // RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, posReduced & kAlignMask); - - { - unsigned m = 1; - unsigned bit; - bit = dist & 1; dist >>= 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit); m = (m << 1) + bit; - bit = dist & 1; dist >>= 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit); m = (m << 1) + bit; - bit = dist & 1; dist >>= 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit); m = (m << 1) + bit; - bit = dist & 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit); - p->rc.range = range; - // p->alignPriceCount++; - } - } - } - } - } - - nowPos32 += (UInt32)len; - p->additionalOffset -= len; - - if (p->additionalOffset == 0) - { - UInt32 processed; - - if (!p->fastMode) - { - /* - if (p->alignPriceCount >= 16) // kAlignTableSize - FillAlignPrices(p); - if (p->matchPriceCount >= 128) - FillDistancesPrices(p); - if (p->lenEnc.counter <= 0) - LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, &p->lenProbs, p->ProbPrices); - */ - if (p->matchPriceCount >= 64) - { - FillAlignPrices(p); - // { int y; for (y = 0; y < 100; y++) { - FillDistancesPrices(p); - // }} - LenPriceEnc_UpdateTables(&p->lenEnc, (unsigned)1 << p->pb, &p->lenProbs, p->ProbPrices); - } - if (p->repLenEncCounter <= 0) - { - p->repLenEncCounter = REP_LEN_COUNT; - LenPriceEnc_UpdateTables(&p->repLenEnc, (unsigned)1 << p->pb, &p->repLenProbs, p->ProbPrices); - } - } - - if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) - break; - processed = nowPos32 - startPos32; - - if (maxPackSize) - { - if (processed + kNumOpts + 300 >= maxUnpackSize - || RangeEnc_GetProcessed_sizet(&p->rc) + kPackReserve >= maxPackSize) - break; - } - else if (processed >= (1 << 17)) - { - p->nowPos64 += nowPos32 - startPos32; - return CheckErrors(p); - } - } - } - - p->nowPos64 += nowPos32 - startPos32; - return Flush(p, nowPos32); -} - - - -#define kBigHashDicLimit ((UInt32)1 << 24) - -static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig) -{ - UInt32 beforeSize = kNumOpts; - if (!RangeEnc_Alloc(&p->rc, alloc)) - return SZ_ERROR_MEM; - - #ifndef _7ZIP_ST - p->mtMode = (p->multiThread && !p->fastMode && (p->matchFinderBase.btMode != 0)); - #endif - - { - unsigned lclp = p->lc + p->lp; - if (!p->litProbs || !p->saveState.litProbs || p->lclp != lclp) - { - LzmaEnc_FreeLits(p, alloc); - p->litProbs = (CLzmaProb *)ISzAlloc_Alloc(alloc, ((UInt32)0x300 << lclp) * sizeof(CLzmaProb)); - p->saveState.litProbs = (CLzmaProb *)ISzAlloc_Alloc(alloc, ((UInt32)0x300 << lclp) * sizeof(CLzmaProb)); - if (!p->litProbs || !p->saveState.litProbs) - { - LzmaEnc_FreeLits(p, alloc); - return SZ_ERROR_MEM; - } - p->lclp = lclp; - } - } - - p->matchFinderBase.bigHash = (Byte)(p->dictSize > kBigHashDicLimit ? 1 : 0); - - if (beforeSize + p->dictSize < keepWindowSize) - beforeSize = keepWindowSize - p->dictSize; - - #ifndef _7ZIP_ST - if (p->mtMode) - { - RINOK(MatchFinderMt_Create(&p->matchFinderMt, p->dictSize, beforeSize, p->numFastBytes, - LZMA_MATCH_LEN_MAX - + 1 /* 18.04 */ - , allocBig)); - p->matchFinderObj = &p->matchFinderMt; - p->matchFinderBase.bigHash = (Byte)( - (p->dictSize > kBigHashDicLimit && p->matchFinderBase.hashMask >= 0xFFFFFF) ? 1 : 0); - MatchFinderMt_CreateVTable(&p->matchFinderMt, &p->matchFinder); - } - else - #endif - { - if (!MatchFinder_Create(&p->matchFinderBase, p->dictSize, beforeSize, p->numFastBytes, LZMA_MATCH_LEN_MAX, allocBig)) - return SZ_ERROR_MEM; - p->matchFinderObj = &p->matchFinderBase; - MatchFinder_CreateVTable(&p->matchFinderBase, &p->matchFinder); - } - - return SZ_OK; -} - -static void LzmaEnc_Init(CLzmaEnc *p) -{ - unsigned i; - p->state = 0; - p->reps[0] = - p->reps[1] = - p->reps[2] = - p->reps[3] = 1; - - RangeEnc_Init(&p->rc); - - for (i = 0; i < (1 << kNumAlignBits); i++) - p->posAlignEncoder[i] = kProbInitValue; - - for (i = 0; i < kNumStates; i++) - { - unsigned j; - for (j = 0; j < LZMA_NUM_PB_STATES_MAX; j++) - { - p->isMatch[i][j] = kProbInitValue; - p->isRep0Long[i][j] = kProbInitValue; - } - p->isRep[i] = kProbInitValue; - p->isRepG0[i] = kProbInitValue; - p->isRepG1[i] = kProbInitValue; - p->isRepG2[i] = kProbInitValue; - } - - { - for (i = 0; i < kNumLenToPosStates; i++) - { - CLzmaProb *probs = p->posSlotEncoder[i]; - unsigned j; - for (j = 0; j < (1 << kNumPosSlotBits); j++) - probs[j] = kProbInitValue; - } - } - { - for (i = 0; i < kNumFullDistances; i++) - p->posEncoders[i] = kProbInitValue; - } - - { - UInt32 num = (UInt32)0x300 << (p->lp + p->lc); - UInt32 k; - CLzmaProb *probs = p->litProbs; - for (k = 0; k < num; k++) - probs[k] = kProbInitValue; - } - - - LenEnc_Init(&p->lenProbs); - LenEnc_Init(&p->repLenProbs); - - p->optEnd = 0; - p->optCur = 0; - - { - for (i = 0; i < kNumOpts; i++) - p->opt[i].price = kInfinityPrice; - } - - p->additionalOffset = 0; - - p->pbMask = ((unsigned)1 << p->pb) - 1; - p->lpMask = ((UInt32)0x100 << p->lp) - ((unsigned)0x100 >> p->lc); -} - - -static void LzmaEnc_InitPrices(CLzmaEnc *p) -{ - if (!p->fastMode) - { - FillDistancesPrices(p); - FillAlignPrices(p); - } - - p->lenEnc.tableSize = - p->repLenEnc.tableSize = - p->numFastBytes + 1 - LZMA_MATCH_LEN_MIN; - - p->repLenEncCounter = REP_LEN_COUNT; - - LenPriceEnc_UpdateTables(&p->lenEnc, (unsigned)1 << p->pb, &p->lenProbs, p->ProbPrices); - LenPriceEnc_UpdateTables(&p->repLenEnc, (unsigned)1 << p->pb, &p->repLenProbs, p->ProbPrices); -} - -static SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig) -{ - unsigned i; - for (i = kEndPosModelIndex / 2; i < kDicLogSizeMax; i++) - if (p->dictSize <= ((UInt32)1 << i)) - break; - p->distTableSize = i * 2; - - p->finished = False; - p->result = SZ_OK; - RINOK(LzmaEnc_Alloc(p, keepWindowSize, alloc, allocBig)); - LzmaEnc_Init(p); - LzmaEnc_InitPrices(p); - p->nowPos64 = 0; - return SZ_OK; -} - -static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, - ISzAllocPtr alloc, ISzAllocPtr allocBig) -{ - CLzmaEnc *p = (CLzmaEnc *)pp; - p->matchFinderBase.stream = inStream; - p->needInit = 1; - p->rc.outStream = outStream; - return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig); -} - -SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp, - ISeqInStream *inStream, UInt32 keepWindowSize, - ISzAllocPtr alloc, ISzAllocPtr allocBig) -{ - CLzmaEnc *p = (CLzmaEnc *)pp; - p->matchFinderBase.stream = inStream; - p->needInit = 1; - return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); -} - -static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen) -{ - p->matchFinderBase.directInput = 1; - p->matchFinderBase.bufferBase = (Byte *)src; - p->matchFinderBase.directInputRem = srcLen; -} - -SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen, - UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig) -{ - CLzmaEnc *p = (CLzmaEnc *)pp; - LzmaEnc_SetInputBuf(p, src, srcLen); - p->needInit = 1; - - LzmaEnc_SetDataSize(pp, srcLen); - return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); -} - -void LzmaEnc_Finish(CLzmaEncHandle pp) -{ - #ifndef _7ZIP_ST - CLzmaEnc *p = (CLzmaEnc *)pp; - if (p->mtMode) - MatchFinderMt_ReleaseStream(&p->matchFinderMt); - #else - UNUSED_VAR(pp); - #endif -} - - -typedef struct -{ - ISeqOutStream vt; - Byte *data; - SizeT rem; - BoolInt overflow; -} CLzmaEnc_SeqOutStreamBuf; - -static size_t SeqOutStreamBuf_Write(const ISeqOutStream *pp, const void *data, size_t size) -{ - CLzmaEnc_SeqOutStreamBuf *p = CONTAINER_FROM_VTBL(pp, CLzmaEnc_SeqOutStreamBuf, vt); - if (p->rem < size) - { - size = p->rem; - p->overflow = True; - } - memcpy(p->data, data, size); - p->rem -= size; - p->data += size; - return size; -} - - -/* -UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp) -{ - const CLzmaEnc *p = (CLzmaEnc *)pp; - return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); -} -*/ - -const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp) -{ - const CLzmaEnc *p = (CLzmaEnc *)pp; - return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; -} - - -SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, BoolInt reInit, - Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize) -{ - CLzmaEnc *p = (CLzmaEnc *)pp; - UInt64 nowPos64; - SRes res; - CLzmaEnc_SeqOutStreamBuf outStream; - - outStream.vt.Write = SeqOutStreamBuf_Write; - outStream.data = dest; - outStream.rem = *destLen; - outStream.overflow = False; - - p->writeEndMark = False; - p->finished = False; - p->result = SZ_OK; - - if (reInit) - LzmaEnc_Init(p); - LzmaEnc_InitPrices(p); - - nowPos64 = p->nowPos64; - RangeEnc_Init(&p->rc); - p->rc.outStream = &outStream.vt; - - if (desiredPackSize == 0) - return SZ_ERROR_OUTPUT_EOF; - - res = LzmaEnc_CodeOneBlock(p, desiredPackSize, *unpackSize); - - *unpackSize = (UInt32)(p->nowPos64 - nowPos64); - *destLen -= outStream.rem; - if (outStream.overflow) - return SZ_ERROR_OUTPUT_EOF; - - return res; -} - - -MY_NO_INLINE -static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress) -{ - SRes res = SZ_OK; - - #ifndef _7ZIP_ST - Byte allocaDummy[0x300]; - allocaDummy[0] = 0; - allocaDummy[1] = allocaDummy[0]; - #endif - - for (;;) - { - res = LzmaEnc_CodeOneBlock(p, 0, 0); - if (res != SZ_OK || p->finished) - break; - if (progress) - { - res = ICompressProgress_Progress(progress, p->nowPos64, RangeEnc_GetProcessed(&p->rc)); - if (res != SZ_OK) - { - res = SZ_ERROR_PROGRESS; - break; - } - } - } - - LzmaEnc_Finish(p); - - /* - if (res == SZ_OK && !Inline_MatchFinder_IsFinishedOK(&p->matchFinderBase)) - res = SZ_ERROR_FAIL; - } - */ - - return res; -} - - -SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress, - ISzAllocPtr alloc, ISzAllocPtr allocBig) -{ - RINOK(LzmaEnc_Prepare(pp, outStream, inStream, alloc, allocBig)); - return LzmaEnc_Encode2((CLzmaEnc *)pp, progress); -} - - -SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size) -{ - CLzmaEnc *p = (CLzmaEnc *)pp; - unsigned i; - UInt32 dictSize = p->dictSize; - if (*size < LZMA_PROPS_SIZE) - return SZ_ERROR_PARAM; - *size = LZMA_PROPS_SIZE; - props[0] = (Byte)((p->pb * 5 + p->lp) * 9 + p->lc); - - if (dictSize >= ((UInt32)1 << 22)) - { - const UInt32 kDictMask = ((UInt32)1 << 20) - 1; - if (dictSize < (UInt32)0xFFFFFFFF - kDictMask) - dictSize = (dictSize + kDictMask) & ~kDictMask; - } - else for (i = 11; i <= 30; i++) - { - if (dictSize <= ((UInt32)2 << i)) { dictSize = ((UInt32)2 << i); break; } - if (dictSize <= ((UInt32)3 << i)) { dictSize = ((UInt32)3 << i); break; } - } - - for (i = 0; i < 4; i++) - props[1 + i] = (Byte)(dictSize >> (8 * i)); - return SZ_OK; -} - - -unsigned LzmaEnc_IsWriteEndMark(CLzmaEncHandle pp) -{ - return (unsigned)((CLzmaEnc *)pp)->writeEndMark; -} - - -SRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, - int writeEndMark, ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig) -{ - SRes res; - CLzmaEnc *p = (CLzmaEnc *)pp; - - CLzmaEnc_SeqOutStreamBuf outStream; - - outStream.vt.Write = SeqOutStreamBuf_Write; - outStream.data = dest; - outStream.rem = *destLen; - outStream.overflow = False; - - p->writeEndMark = writeEndMark; - p->rc.outStream = &outStream.vt; - - res = LzmaEnc_MemPrepare(pp, src, srcLen, 0, alloc, allocBig); - - if (res == SZ_OK) - { - res = LzmaEnc_Encode2(p, progress); - if (res == SZ_OK && p->nowPos64 != srcLen) - res = SZ_ERROR_FAIL; - } - - *destLen -= outStream.rem; - if (outStream.overflow) - return SZ_ERROR_OUTPUT_EOF; - return res; -} - - -SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, - const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, - ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig) -{ - CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc); - SRes res; - if (!p) - return SZ_ERROR_MEM; - - res = LzmaEnc_SetProps(p, props); - if (res == SZ_OK) - { - res = LzmaEnc_WriteProperties(p, propsEncoded, propsSize); - if (res == SZ_OK) - res = LzmaEnc_MemEncode(p, dest, destLen, src, srcLen, - writeEndMark, progress, alloc, allocBig); - } - - LzmaEnc_Destroy(p, alloc, allocBig); - return res; -} - - -/* -#ifndef _7ZIP_ST -void LzmaEnc_GetLzThreads(CLzmaEncHandle pp, HANDLE lz_threads[2]) -{ - const CLzmaEnc *p = (CLzmaEnc *)pp; - lz_threads[0] = p->matchFinderMt.hashSync.thread; - lz_threads[1] = p->matchFinderMt.btSync.thread; -} -#endif -*/ +/* LzmaEnc.c -- LZMA Encoder +2022-07-15: Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include + +/* #define SHOW_STAT */ +/* #define SHOW_STAT2 */ + +#if defined(SHOW_STAT) || defined(SHOW_STAT2) +#include +#endif + +#include "CpuArch.h" +#include "LzmaEnc.h" + +#include "LzFind.h" +#ifndef _7ZIP_ST +#include "LzFindMt.h" +#endif + +/* the following LzmaEnc_* declarations is internal LZMA interface for LZMA2 encoder */ + +SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp, ISeqInStream *inStream, UInt32 keepWindowSize, + ISzAllocPtr alloc, ISzAllocPtr allocBig); +SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen, + UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig); +SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, BoolInt reInit, + Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize); +const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp); +void LzmaEnc_Finish(CLzmaEncHandle pp); +void LzmaEnc_SaveState(CLzmaEncHandle pp); +void LzmaEnc_RestoreState(CLzmaEncHandle pp); + +#ifdef SHOW_STAT +static unsigned g_STAT_OFFSET = 0; +#endif + +/* for good normalization speed we still reserve 256 MB before 4 GB range */ +#define kLzmaMaxHistorySize ((UInt32)15 << 28) + +#define kNumTopBits 24 +#define kTopValue ((UInt32)1 << kNumTopBits) + +#define kNumBitModelTotalBits 11 +#define kBitModelTotal (1 << kNumBitModelTotalBits) +#define kNumMoveBits 5 +#define kProbInitValue (kBitModelTotal >> 1) + +#define kNumMoveReducingBits 4 +#define kNumBitPriceShiftBits 4 +// #define kBitPrice (1 << kNumBitPriceShiftBits) + +#define REP_LEN_COUNT 64 + +void LzmaEncProps_Init(CLzmaEncProps *p) +{ + p->level = 5; + p->dictSize = p->mc = 0; + p->reduceSize = (UInt64)(Int64)-1; + p->lc = p->lp = p->pb = p->algo = p->fb = p->btMode = p->numHashBytes = p->numThreads = -1; + p->writeEndMark = 0; + p->affinity = 0; +} + +void LzmaEncProps_Normalize(CLzmaEncProps *p) +{ + int level = p->level; + if (level < 0) level = 5; + p->level = level; + + if (p->dictSize == 0) + p->dictSize = + ( level <= 3 ? ((UInt32)1 << (level * 2 + 16)) : + ( level <= 6 ? ((UInt32)1 << (level + 19)) : + ( level <= 7 ? ((UInt32)1 << 25) : ((UInt32)1 << 26) + ))); + + if (p->dictSize > p->reduceSize) + { + UInt32 v = (UInt32)p->reduceSize; + const UInt32 kReduceMin = ((UInt32)1 << 12); + if (v < kReduceMin) + v = kReduceMin; + if (p->dictSize > v) + p->dictSize = v; + } + + if (p->lc < 0) p->lc = 3; + if (p->lp < 0) p->lp = 0; + if (p->pb < 0) p->pb = 2; + + if (p->algo < 0) p->algo = (level < 5 ? 0 : 1); + if (p->fb < 0) p->fb = (level < 7 ? 32 : 64); + if (p->btMode < 0) p->btMode = (p->algo == 0 ? 0 : 1); + if (p->numHashBytes < 0) p->numHashBytes = (p->btMode ? 4 : 5); + if (p->mc == 0) p->mc = (16 + ((unsigned)p->fb >> 1)) >> (p->btMode ? 0 : 1); + + if (p->numThreads < 0) + p->numThreads = + #ifndef _7ZIP_ST + ((p->btMode && p->algo) ? 2 : 1); + #else + 1; + #endif +} + +UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2) +{ + CLzmaEncProps props = *props2; + LzmaEncProps_Normalize(&props); + return props.dictSize; +} + + +/* +x86/x64: + +BSR: + IF (SRC == 0) ZF = 1, DEST is undefined; + AMD : DEST is unchanged; + IF (SRC != 0) ZF = 0; DEST is index of top non-zero bit + BSR is slow in some processors + +LZCNT: + IF (SRC == 0) CF = 1, DEST is size_in_bits_of_register(src) (32 or 64) + IF (SRC != 0) CF = 0, DEST = num_lead_zero_bits + IF (DEST == 0) ZF = 1; + +LZCNT works only in new processors starting from Haswell. +if LZCNT is not supported by processor, then it's executed as BSR. +LZCNT can be faster than BSR, if supported. +*/ + +// #define LZMA_LOG_BSR + +#if defined(MY_CPU_ARM_OR_ARM64) /* || defined(MY_CPU_X86_OR_AMD64) */ + + #if (defined(__clang__) && (__clang_major__ >= 6)) \ + || (defined(__GNUC__) && (__GNUC__ >= 6)) + #define LZMA_LOG_BSR + #elif defined(_MSC_VER) && (_MSC_VER >= 1300) + // #if defined(MY_CPU_ARM_OR_ARM64) + #define LZMA_LOG_BSR + // #endif + #endif +#endif + +// #include + +#ifdef LZMA_LOG_BSR + +#if defined(__clang__) \ + || defined(__GNUC__) + +/* + C code: : (30 - __builtin_clz(x)) + gcc9/gcc10 for x64 /x86 : 30 - (bsr(x) xor 31) + clang10 for x64 : 31 + (bsr(x) xor -32) +*/ + + #define MY_clz(x) ((unsigned)__builtin_clz(x)) + // __lzcnt32 + // __builtin_ia32_lzcnt_u32 + +#else // #if defined(_MSC_VER) + + #ifdef MY_CPU_ARM_OR_ARM64 + + #define MY_clz _CountLeadingZeros + + #else // if defined(MY_CPU_X86_OR_AMD64) + + // #define MY_clz __lzcnt // we can use lzcnt (unsupported by old CPU) + // _BitScanReverse code is not optimal for some MSVC compilers + #define BSR2_RET(pos, res) { unsigned long zz; _BitScanReverse(&zz, (pos)); zz--; \ + res = (zz + zz) + (pos >> zz); } + + #endif // MY_CPU_X86_OR_AMD64 + +#endif // _MSC_VER + + +#ifndef BSR2_RET + + #define BSR2_RET(pos, res) { unsigned zz = 30 - MY_clz(pos); \ + res = (zz + zz) + (pos >> zz); } + +#endif + + +unsigned GetPosSlot1(UInt32 pos); +unsigned GetPosSlot1(UInt32 pos) +{ + unsigned res; + BSR2_RET(pos, res); + return res; +} +#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } +#define GetPosSlot(pos, res) { if (pos < 2) res = pos; else BSR2_RET(pos, res); } + + +#else // ! LZMA_LOG_BSR + +#define kNumLogBits (11 + sizeof(size_t) / 8 * 3) + +#define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7) + +static void LzmaEnc_FastPosInit(Byte *g_FastPos) +{ + unsigned slot; + g_FastPos[0] = 0; + g_FastPos[1] = 1; + g_FastPos += 2; + + for (slot = 2; slot < kNumLogBits * 2; slot++) + { + size_t k = ((size_t)1 << ((slot >> 1) - 1)); + size_t j; + for (j = 0; j < k; j++) + g_FastPos[j] = (Byte)slot; + g_FastPos += k; + } +} + +/* we can use ((limit - pos) >> 31) only if (pos < ((UInt32)1 << 31)) */ +/* +#define BSR2_RET(pos, res) { unsigned zz = 6 + ((kNumLogBits - 1) & \ + (0 - (((((UInt32)1 << (kNumLogBits + 6)) - 1) - pos) >> 31))); \ + res = p->g_FastPos[pos >> zz] + (zz * 2); } +*/ + +/* +#define BSR2_RET(pos, res) { unsigned zz = 6 + ((kNumLogBits - 1) & \ + (0 - (((((UInt32)1 << (kNumLogBits)) - 1) - (pos >> 6)) >> 31))); \ + res = p->g_FastPos[pos >> zz] + (zz * 2); } +*/ + +#define BSR2_RET(pos, res) { unsigned zz = (pos < (1 << (kNumLogBits + 6))) ? 6 : 6 + kNumLogBits - 1; \ + res = p->g_FastPos[pos >> zz] + (zz * 2); } + +/* +#define BSR2_RET(pos, res) { res = (pos < (1 << (kNumLogBits + 6))) ? \ + p->g_FastPos[pos >> 6] + 12 : \ + p->g_FastPos[pos >> (6 + kNumLogBits - 1)] + (6 + (kNumLogBits - 1)) * 2; } +*/ + +#define GetPosSlot1(pos) p->g_FastPos[pos] +#define GetPosSlot2(pos, res) { BSR2_RET(pos, res); } +#define GetPosSlot(pos, res) { if (pos < kNumFullDistances) res = p->g_FastPos[pos & (kNumFullDistances - 1)]; else BSR2_RET(pos, res); } + +#endif // LZMA_LOG_BSR + + +#define LZMA_NUM_REPS 4 + +typedef UInt16 CState; +typedef UInt16 CExtra; + +typedef struct +{ + UInt32 price; + CState state; + CExtra extra; + // 0 : normal + // 1 : LIT : MATCH + // > 1 : MATCH (extra-1) : LIT : REP0 (len) + UInt32 len; + UInt32 dist; + UInt32 reps[LZMA_NUM_REPS]; +} COptimal; + + +// 18.06 +#define kNumOpts (1 << 11) +#define kPackReserve (kNumOpts * 8) +// #define kNumOpts (1 << 12) +// #define kPackReserve (1 + kNumOpts * 2) + +#define kNumLenToPosStates 4 +#define kNumPosSlotBits 6 +// #define kDicLogSizeMin 0 +#define kDicLogSizeMax 32 +#define kDistTableSizeMax (kDicLogSizeMax * 2) + +#define kNumAlignBits 4 +#define kAlignTableSize (1 << kNumAlignBits) +#define kAlignMask (kAlignTableSize - 1) + +#define kStartPosModelIndex 4 +#define kEndPosModelIndex 14 +#define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) + +typedef +#ifdef _LZMA_PROB32 + UInt32 +#else + UInt16 +#endif + CLzmaProb; + +#define LZMA_PB_MAX 4 +#define LZMA_LC_MAX 8 +#define LZMA_LP_MAX 4 + +#define LZMA_NUM_PB_STATES_MAX (1 << LZMA_PB_MAX) + +#define kLenNumLowBits 3 +#define kLenNumLowSymbols (1 << kLenNumLowBits) +#define kLenNumHighBits 8 +#define kLenNumHighSymbols (1 << kLenNumHighBits) +#define kLenNumSymbolsTotal (kLenNumLowSymbols * 2 + kLenNumHighSymbols) + +#define LZMA_MATCH_LEN_MIN 2 +#define LZMA_MATCH_LEN_MAX (LZMA_MATCH_LEN_MIN + kLenNumSymbolsTotal - 1) + +#define kNumStates 12 + + +typedef struct +{ + CLzmaProb low[LZMA_NUM_PB_STATES_MAX << (kLenNumLowBits + 1)]; + CLzmaProb high[kLenNumHighSymbols]; +} CLenEnc; + + +typedef struct +{ + unsigned tableSize; + UInt32 prices[LZMA_NUM_PB_STATES_MAX][kLenNumSymbolsTotal]; + // UInt32 prices1[LZMA_NUM_PB_STATES_MAX][kLenNumLowSymbols * 2]; + // UInt32 prices2[kLenNumSymbolsTotal]; +} CLenPriceEnc; + +#define GET_PRICE_LEN(p, posState, len) \ + ((p)->prices[posState][(size_t)(len) - LZMA_MATCH_LEN_MIN]) + +/* +#define GET_PRICE_LEN(p, posState, len) \ + ((p)->prices2[(size_t)(len) - 2] + ((p)->prices1[posState][((len) - 2) & (kLenNumLowSymbols * 2 - 1)] & (((len) - 2 - kLenNumLowSymbols * 2) >> 9))) +*/ + +typedef struct +{ + UInt32 range; + unsigned cache; + UInt64 low; + UInt64 cacheSize; + Byte *buf; + Byte *bufLim; + Byte *bufBase; + ISeqOutStream *outStream; + UInt64 processed; + SRes res; +} CRangeEnc; + + +typedef struct +{ + CLzmaProb *litProbs; + + unsigned state; + UInt32 reps[LZMA_NUM_REPS]; + + CLzmaProb posAlignEncoder[1 << kNumAlignBits]; + CLzmaProb isRep[kNumStates]; + CLzmaProb isRepG0[kNumStates]; + CLzmaProb isRepG1[kNumStates]; + CLzmaProb isRepG2[kNumStates]; + CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; + CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; + + CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; + CLzmaProb posEncoders[kNumFullDistances]; + + CLenEnc lenProbs; + CLenEnc repLenProbs; + +} CSaveState; + + +typedef UInt32 CProbPrice; + + +typedef struct +{ + void *matchFinderObj; + IMatchFinder2 matchFinder; + + unsigned optCur; + unsigned optEnd; + + unsigned longestMatchLen; + unsigned numPairs; + UInt32 numAvail; + + unsigned state; + unsigned numFastBytes; + unsigned additionalOffset; + UInt32 reps[LZMA_NUM_REPS]; + unsigned lpMask, pbMask; + CLzmaProb *litProbs; + CRangeEnc rc; + + UInt32 backRes; + + unsigned lc, lp, pb; + unsigned lclp; + + BoolInt fastMode; + BoolInt writeEndMark; + BoolInt finished; + BoolInt multiThread; + BoolInt needInit; + // BoolInt _maxMode; + + UInt64 nowPos64; + + unsigned matchPriceCount; + // unsigned alignPriceCount; + int repLenEncCounter; + + unsigned distTableSize; + + UInt32 dictSize; + SRes result; + + #ifndef _7ZIP_ST + BoolInt mtMode; + // begin of CMatchFinderMt is used in LZ thread + CMatchFinderMt matchFinderMt; + // end of CMatchFinderMt is used in BT and HASH threads + // #else + // CMatchFinder matchFinderBase; + #endif + CMatchFinder matchFinderBase; + + + // we suppose that we have 8-bytes alignment after CMatchFinder + + #ifndef _7ZIP_ST + Byte pad[128]; + #endif + + // LZ thread + CProbPrice ProbPrices[kBitModelTotal >> kNumMoveReducingBits]; + + // we want {len , dist} pairs to be 8-bytes aligned in matches array + UInt32 matches[LZMA_MATCH_LEN_MAX * 2 + 2]; + + // we want 8-bytes alignment here + UInt32 alignPrices[kAlignTableSize]; + UInt32 posSlotPrices[kNumLenToPosStates][kDistTableSizeMax]; + UInt32 distancesPrices[kNumLenToPosStates][kNumFullDistances]; + + CLzmaProb posAlignEncoder[1 << kNumAlignBits]; + CLzmaProb isRep[kNumStates]; + CLzmaProb isRepG0[kNumStates]; + CLzmaProb isRepG1[kNumStates]; + CLzmaProb isRepG2[kNumStates]; + CLzmaProb isMatch[kNumStates][LZMA_NUM_PB_STATES_MAX]; + CLzmaProb isRep0Long[kNumStates][LZMA_NUM_PB_STATES_MAX]; + CLzmaProb posSlotEncoder[kNumLenToPosStates][1 << kNumPosSlotBits]; + CLzmaProb posEncoders[kNumFullDistances]; + + CLenEnc lenProbs; + CLenEnc repLenProbs; + + #ifndef LZMA_LOG_BSR + Byte g_FastPos[1 << kNumLogBits]; + #endif + + CLenPriceEnc lenEnc; + CLenPriceEnc repLenEnc; + + COptimal opt[kNumOpts]; + + CSaveState saveState; + + // BoolInt mf_Failure; + #ifndef _7ZIP_ST + Byte pad2[128]; + #endif +} CLzmaEnc; + + +#define MFB (p->matchFinderBase) +/* +#ifndef _7ZIP_ST +#define MFB (p->matchFinderMt.MatchFinder) +#endif +*/ + +#define COPY_ARR(dest, src, arr) memcpy(dest->arr, src->arr, sizeof(src->arr)); + +void LzmaEnc_SaveState(CLzmaEncHandle pp) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + CSaveState *dest = &p->saveState; + + dest->state = p->state; + + dest->lenProbs = p->lenProbs; + dest->repLenProbs = p->repLenProbs; + + COPY_ARR(dest, p, reps); + + COPY_ARR(dest, p, posAlignEncoder); + COPY_ARR(dest, p, isRep); + COPY_ARR(dest, p, isRepG0); + COPY_ARR(dest, p, isRepG1); + COPY_ARR(dest, p, isRepG2); + COPY_ARR(dest, p, isMatch); + COPY_ARR(dest, p, isRep0Long); + COPY_ARR(dest, p, posSlotEncoder); + COPY_ARR(dest, p, posEncoders); + + memcpy(dest->litProbs, p->litProbs, ((UInt32)0x300 << p->lclp) * sizeof(CLzmaProb)); +} + + +void LzmaEnc_RestoreState(CLzmaEncHandle pp) +{ + CLzmaEnc *dest = (CLzmaEnc *)pp; + const CSaveState *p = &dest->saveState; + + dest->state = p->state; + + dest->lenProbs = p->lenProbs; + dest->repLenProbs = p->repLenProbs; + + COPY_ARR(dest, p, reps); + + COPY_ARR(dest, p, posAlignEncoder); + COPY_ARR(dest, p, isRep); + COPY_ARR(dest, p, isRepG0); + COPY_ARR(dest, p, isRepG1); + COPY_ARR(dest, p, isRepG2); + COPY_ARR(dest, p, isMatch); + COPY_ARR(dest, p, isRep0Long); + COPY_ARR(dest, p, posSlotEncoder); + COPY_ARR(dest, p, posEncoders); + + memcpy(dest->litProbs, p->litProbs, ((UInt32)0x300 << dest->lclp) * sizeof(CLzmaProb)); +} + + + +SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + CLzmaEncProps props = *props2; + LzmaEncProps_Normalize(&props); + + if (props.lc > LZMA_LC_MAX + || props.lp > LZMA_LP_MAX + || props.pb > LZMA_PB_MAX) + return SZ_ERROR_PARAM; + + + if (props.dictSize > kLzmaMaxHistorySize) + props.dictSize = kLzmaMaxHistorySize; + + #ifndef LZMA_LOG_BSR + { + const UInt64 dict64 = props.dictSize; + if (dict64 > ((UInt64)1 << kDicLogSizeMaxCompress)) + return SZ_ERROR_PARAM; + } + #endif + + p->dictSize = props.dictSize; + { + unsigned fb = (unsigned)props.fb; + if (fb < 5) + fb = 5; + if (fb > LZMA_MATCH_LEN_MAX) + fb = LZMA_MATCH_LEN_MAX; + p->numFastBytes = fb; + } + p->lc = (unsigned)props.lc; + p->lp = (unsigned)props.lp; + p->pb = (unsigned)props.pb; + p->fastMode = (props.algo == 0); + // p->_maxMode = True; + MFB.btMode = (Byte)(props.btMode ? 1 : 0); + { + unsigned numHashBytes = 4; + if (props.btMode) + { + if (props.numHashBytes < 2) numHashBytes = 2; + else if (props.numHashBytes < 4) numHashBytes = (unsigned)props.numHashBytes; + } + if (props.numHashBytes >= 5) numHashBytes = 5; + + MFB.numHashBytes = numHashBytes; + } + + MFB.cutValue = props.mc; + + p->writeEndMark = (BoolInt)props.writeEndMark; + + #ifndef _7ZIP_ST + /* + if (newMultiThread != _multiThread) + { + ReleaseMatchFinder(); + _multiThread = newMultiThread; + } + */ + p->multiThread = (props.numThreads > 1); + p->matchFinderMt.btSync.affinity = + p->matchFinderMt.hashSync.affinity = props.affinity; + #endif + + return SZ_OK; +} + + +void LzmaEnc_SetDataSize(CLzmaEncHandle pp, UInt64 expectedDataSiize) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + MFB.expectedDataSize = expectedDataSiize; +} + + +#define kState_Start 0 +#define kState_LitAfterMatch 4 +#define kState_LitAfterRep 5 +#define kState_MatchAfterLit 7 +#define kState_RepAfterLit 8 + +static const Byte kLiteralNextStates[kNumStates] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5}; +static const Byte kMatchNextStates[kNumStates] = {7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10}; +static const Byte kRepNextStates[kNumStates] = {8, 8, 8, 8, 8, 8, 8, 11, 11, 11, 11, 11}; +static const Byte kShortRepNextStates[kNumStates]= {9, 9, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11}; + +#define IsLitState(s) ((s) < 7) +#define GetLenToPosState2(len) (((len) < kNumLenToPosStates - 1) ? (len) : kNumLenToPosStates - 1) +#define GetLenToPosState(len) (((len) < kNumLenToPosStates + 1) ? (len) - 2 : kNumLenToPosStates - 1) + +#define kInfinityPrice (1 << 30) + +static void RangeEnc_Construct(CRangeEnc *p) +{ + p->outStream = NULL; + p->bufBase = NULL; +} + +#define RangeEnc_GetProcessed(p) ( (p)->processed + (size_t)((p)->buf - (p)->bufBase) + (p)->cacheSize) +#define RangeEnc_GetProcessed_sizet(p) ((size_t)(p)->processed + (size_t)((p)->buf - (p)->bufBase) + (size_t)(p)->cacheSize) + +#define RC_BUF_SIZE (1 << 16) + +static int RangeEnc_Alloc(CRangeEnc *p, ISzAllocPtr alloc) +{ + if (!p->bufBase) + { + p->bufBase = (Byte *)ISzAlloc_Alloc(alloc, RC_BUF_SIZE); + if (!p->bufBase) + return 0; + p->bufLim = p->bufBase + RC_BUF_SIZE; + } + return 1; +} + +static void RangeEnc_Free(CRangeEnc *p, ISzAllocPtr alloc) +{ + ISzAlloc_Free(alloc, p->bufBase); + p->bufBase = NULL; +} + +static void RangeEnc_Init(CRangeEnc *p) +{ + p->range = 0xFFFFFFFF; + p->cache = 0; + p->low = 0; + p->cacheSize = 0; + + p->buf = p->bufBase; + + p->processed = 0; + p->res = SZ_OK; +} + +MY_NO_INLINE static void RangeEnc_FlushStream(CRangeEnc *p) +{ + const size_t num = (size_t)(p->buf - p->bufBase); + if (p->res == SZ_OK) + { + if (num != ISeqOutStream_Write(p->outStream, p->bufBase, num)) + p->res = SZ_ERROR_WRITE; + } + p->processed += num; + p->buf = p->bufBase; +} + +MY_NO_INLINE static void MY_FAST_CALL RangeEnc_ShiftLow(CRangeEnc *p) +{ + UInt32 low = (UInt32)p->low; + unsigned high = (unsigned)(p->low >> 32); + p->low = (UInt32)(low << 8); + if (low < (UInt32)0xFF000000 || high != 0) + { + { + Byte *buf = p->buf; + *buf++ = (Byte)(p->cache + high); + p->cache = (unsigned)(low >> 24); + p->buf = buf; + if (buf == p->bufLim) + RangeEnc_FlushStream(p); + if (p->cacheSize == 0) + return; + } + high += 0xFF; + for (;;) + { + Byte *buf = p->buf; + *buf++ = (Byte)(high); + p->buf = buf; + if (buf == p->bufLim) + RangeEnc_FlushStream(p); + if (--p->cacheSize == 0) + return; + } + } + p->cacheSize++; +} + +static void RangeEnc_FlushData(CRangeEnc *p) +{ + int i; + for (i = 0; i < 5; i++) + RangeEnc_ShiftLow(p); +} + +#define RC_NORM(p) if (range < kTopValue) { range <<= 8; RangeEnc_ShiftLow(p); } + +#define RC_BIT_PRE(p, prob) \ + ttt = *(prob); \ + newBound = (range >> kNumBitModelTotalBits) * ttt; + +// #define _LZMA_ENC_USE_BRANCH + +#ifdef _LZMA_ENC_USE_BRANCH + +#define RC_BIT(p, prob, bit) { \ + RC_BIT_PRE(p, prob) \ + if (bit == 0) { range = newBound; ttt += (kBitModelTotal - ttt) >> kNumMoveBits; } \ + else { (p)->low += newBound; range -= newBound; ttt -= ttt >> kNumMoveBits; } \ + *(prob) = (CLzmaProb)ttt; \ + RC_NORM(p) \ + } + +#else + +#define RC_BIT(p, prob, bit) { \ + UInt32 mask; \ + RC_BIT_PRE(p, prob) \ + mask = 0 - (UInt32)bit; \ + range &= mask; \ + mask &= newBound; \ + range -= mask; \ + (p)->low += mask; \ + mask = (UInt32)bit - 1; \ + range += newBound & mask; \ + mask &= (kBitModelTotal - ((1 << kNumMoveBits) - 1)); \ + mask += ((1 << kNumMoveBits) - 1); \ + ttt += (UInt32)((Int32)(mask - ttt) >> kNumMoveBits); \ + *(prob) = (CLzmaProb)ttt; \ + RC_NORM(p) \ + } + +#endif + + + + +#define RC_BIT_0_BASE(p, prob) \ + range = newBound; *(prob) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits)); + +#define RC_BIT_1_BASE(p, prob) \ + range -= newBound; (p)->low += newBound; *(prob) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits)); \ + +#define RC_BIT_0(p, prob) \ + RC_BIT_0_BASE(p, prob) \ + RC_NORM(p) + +#define RC_BIT_1(p, prob) \ + RC_BIT_1_BASE(p, prob) \ + RC_NORM(p) + +static void RangeEnc_EncodeBit_0(CRangeEnc *p, CLzmaProb *prob) +{ + UInt32 range, ttt, newBound; + range = p->range; + RC_BIT_PRE(p, prob) + RC_BIT_0(p, prob) + p->range = range; +} + +static void LitEnc_Encode(CRangeEnc *p, CLzmaProb *probs, UInt32 sym) +{ + UInt32 range = p->range; + sym |= 0x100; + do + { + UInt32 ttt, newBound; + // RangeEnc_EncodeBit(p, probs + (sym >> 8), (sym >> 7) & 1); + CLzmaProb *prob = probs + (sym >> 8); + UInt32 bit = (sym >> 7) & 1; + sym <<= 1; + RC_BIT(p, prob, bit); + } + while (sym < 0x10000); + p->range = range; +} + +static void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 sym, UInt32 matchByte) +{ + UInt32 range = p->range; + UInt32 offs = 0x100; + sym |= 0x100; + do + { + UInt32 ttt, newBound; + CLzmaProb *prob; + UInt32 bit; + matchByte <<= 1; + // RangeEnc_EncodeBit(p, probs + (offs + (matchByte & offs) + (sym >> 8)), (sym >> 7) & 1); + prob = probs + (offs + (matchByte & offs) + (sym >> 8)); + bit = (sym >> 7) & 1; + sym <<= 1; + offs &= ~(matchByte ^ sym); + RC_BIT(p, prob, bit); + } + while (sym < 0x10000); + p->range = range; +} + + + +static void LzmaEnc_InitPriceTables(CProbPrice *ProbPrices) +{ + UInt32 i; + for (i = 0; i < (kBitModelTotal >> kNumMoveReducingBits); i++) + { + const unsigned kCyclesBits = kNumBitPriceShiftBits; + UInt32 w = (i << kNumMoveReducingBits) + (1 << (kNumMoveReducingBits - 1)); + unsigned bitCount = 0; + unsigned j; + for (j = 0; j < kCyclesBits; j++) + { + w = w * w; + bitCount <<= 1; + while (w >= ((UInt32)1 << 16)) + { + w >>= 1; + bitCount++; + } + } + ProbPrices[i] = (CProbPrice)(((unsigned)kNumBitModelTotalBits << kCyclesBits) - 15 - bitCount); + // printf("\n%3d: %5d", i, ProbPrices[i]); + } +} + + +#define GET_PRICE(prob, bit) \ + p->ProbPrices[((prob) ^ (unsigned)(((-(int)(bit))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; + +#define GET_PRICEa(prob, bit) \ + ProbPrices[((prob) ^ (unsigned)((-((int)(bit))) & (kBitModelTotal - 1))) >> kNumMoveReducingBits]; + +#define GET_PRICE_0(prob) p->ProbPrices[(prob) >> kNumMoveReducingBits] +#define GET_PRICE_1(prob) p->ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] + +#define GET_PRICEa_0(prob) ProbPrices[(prob) >> kNumMoveReducingBits] +#define GET_PRICEa_1(prob) ProbPrices[((prob) ^ (kBitModelTotal - 1)) >> kNumMoveReducingBits] + + +static UInt32 LitEnc_GetPrice(const CLzmaProb *probs, UInt32 sym, const CProbPrice *ProbPrices) +{ + UInt32 price = 0; + sym |= 0x100; + do + { + unsigned bit = sym & 1; + sym >>= 1; + price += GET_PRICEa(probs[sym], bit); + } + while (sym >= 2); + return price; +} + + +static UInt32 LitEnc_Matched_GetPrice(const CLzmaProb *probs, UInt32 sym, UInt32 matchByte, const CProbPrice *ProbPrices) +{ + UInt32 price = 0; + UInt32 offs = 0x100; + sym |= 0x100; + do + { + matchByte <<= 1; + price += GET_PRICEa(probs[offs + (matchByte & offs) + (sym >> 8)], (sym >> 7) & 1); + sym <<= 1; + offs &= ~(matchByte ^ sym); + } + while (sym < 0x10000); + return price; +} + + +static void RcTree_ReverseEncode(CRangeEnc *rc, CLzmaProb *probs, unsigned numBits, unsigned sym) +{ + UInt32 range = rc->range; + unsigned m = 1; + do + { + UInt32 ttt, newBound; + unsigned bit = sym & 1; + // RangeEnc_EncodeBit(rc, probs + m, bit); + sym >>= 1; + RC_BIT(rc, probs + m, bit); + m = (m << 1) | bit; + } + while (--numBits); + rc->range = range; +} + + + +static void LenEnc_Init(CLenEnc *p) +{ + unsigned i; + for (i = 0; i < (LZMA_NUM_PB_STATES_MAX << (kLenNumLowBits + 1)); i++) + p->low[i] = kProbInitValue; + for (i = 0; i < kLenNumHighSymbols; i++) + p->high[i] = kProbInitValue; +} + +static void LenEnc_Encode(CLenEnc *p, CRangeEnc *rc, unsigned sym, unsigned posState) +{ + UInt32 range, ttt, newBound; + CLzmaProb *probs = p->low; + range = rc->range; + RC_BIT_PRE(rc, probs); + if (sym >= kLenNumLowSymbols) + { + RC_BIT_1(rc, probs); + probs += kLenNumLowSymbols; + RC_BIT_PRE(rc, probs); + if (sym >= kLenNumLowSymbols * 2) + { + RC_BIT_1(rc, probs); + rc->range = range; + // RcTree_Encode(rc, p->high, kLenNumHighBits, sym - kLenNumLowSymbols * 2); + LitEnc_Encode(rc, p->high, sym - kLenNumLowSymbols * 2); + return; + } + sym -= kLenNumLowSymbols; + } + + // RcTree_Encode(rc, probs + (posState << kLenNumLowBits), kLenNumLowBits, sym); + { + unsigned m; + unsigned bit; + RC_BIT_0(rc, probs); + probs += (posState << (1 + kLenNumLowBits)); + bit = (sym >> 2) ; RC_BIT(rc, probs + 1, bit); m = (1 << 1) + bit; + bit = (sym >> 1) & 1; RC_BIT(rc, probs + m, bit); m = (m << 1) + bit; + bit = sym & 1; RC_BIT(rc, probs + m, bit); + rc->range = range; + } +} + +static void SetPrices_3(const CLzmaProb *probs, UInt32 startPrice, UInt32 *prices, const CProbPrice *ProbPrices) +{ + unsigned i; + for (i = 0; i < 8; i += 2) + { + UInt32 price = startPrice; + UInt32 prob; + price += GET_PRICEa(probs[1 ], (i >> 2)); + price += GET_PRICEa(probs[2 + (i >> 2)], (i >> 1) & 1); + prob = probs[4 + (i >> 1)]; + prices[i ] = price + GET_PRICEa_0(prob); + prices[i + 1] = price + GET_PRICEa_1(prob); + } +} + + +MY_NO_INLINE static void MY_FAST_CALL LenPriceEnc_UpdateTables( + CLenPriceEnc *p, + unsigned numPosStates, + const CLenEnc *enc, + const CProbPrice *ProbPrices) +{ + UInt32 b; + + { + unsigned prob = enc->low[0]; + UInt32 a, c; + unsigned posState; + b = GET_PRICEa_1(prob); + a = GET_PRICEa_0(prob); + c = b + GET_PRICEa_0(enc->low[kLenNumLowSymbols]); + for (posState = 0; posState < numPosStates; posState++) + { + UInt32 *prices = p->prices[posState]; + const CLzmaProb *probs = enc->low + (posState << (1 + kLenNumLowBits)); + SetPrices_3(probs, a, prices, ProbPrices); + SetPrices_3(probs + kLenNumLowSymbols, c, prices + kLenNumLowSymbols, ProbPrices); + } + } + + /* + { + unsigned i; + UInt32 b; + a = GET_PRICEa_0(enc->low[0]); + for (i = 0; i < kLenNumLowSymbols; i++) + p->prices2[i] = a; + a = GET_PRICEa_1(enc->low[0]); + b = a + GET_PRICEa_0(enc->low[kLenNumLowSymbols]); + for (i = kLenNumLowSymbols; i < kLenNumLowSymbols * 2; i++) + p->prices2[i] = b; + a += GET_PRICEa_1(enc->low[kLenNumLowSymbols]); + } + */ + + // p->counter = numSymbols; + // p->counter = 64; + + { + unsigned i = p->tableSize; + + if (i > kLenNumLowSymbols * 2) + { + const CLzmaProb *probs = enc->high; + UInt32 *prices = p->prices[0] + kLenNumLowSymbols * 2; + i -= kLenNumLowSymbols * 2 - 1; + i >>= 1; + b += GET_PRICEa_1(enc->low[kLenNumLowSymbols]); + do + { + /* + p->prices2[i] = a + + // RcTree_GetPrice(enc->high, kLenNumHighBits, i - kLenNumLowSymbols * 2, ProbPrices); + LitEnc_GetPrice(probs, i - kLenNumLowSymbols * 2, ProbPrices); + */ + // UInt32 price = a + RcTree_GetPrice(probs, kLenNumHighBits - 1, sym, ProbPrices); + unsigned sym = --i + (1 << (kLenNumHighBits - 1)); + UInt32 price = b; + do + { + unsigned bit = sym & 1; + sym >>= 1; + price += GET_PRICEa(probs[sym], bit); + } + while (sym >= 2); + + { + unsigned prob = probs[(size_t)i + (1 << (kLenNumHighBits - 1))]; + prices[(size_t)i * 2 ] = price + GET_PRICEa_0(prob); + prices[(size_t)i * 2 + 1] = price + GET_PRICEa_1(prob); + } + } + while (i); + + { + unsigned posState; + size_t num = (p->tableSize - kLenNumLowSymbols * 2) * sizeof(p->prices[0][0]); + for (posState = 1; posState < numPosStates; posState++) + memcpy(p->prices[posState] + kLenNumLowSymbols * 2, p->prices[0] + kLenNumLowSymbols * 2, num); + } + } + } +} + +/* + #ifdef SHOW_STAT + g_STAT_OFFSET += num; + printf("\n MovePos %u", num); + #endif +*/ + +#define MOVE_POS(p, num) { \ + p->additionalOffset += (num); \ + p->matchFinder.Skip(p->matchFinderObj, (UInt32)(num)); } + + +static unsigned ReadMatchDistances(CLzmaEnc *p, unsigned *numPairsRes) +{ + unsigned numPairs; + + p->additionalOffset++; + p->numAvail = p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); + { + const UInt32 *d = p->matchFinder.GetMatches(p->matchFinderObj, p->matches); + // if (!d) { p->mf_Failure = True; *numPairsRes = 0; return 0; } + numPairs = (unsigned)(d - p->matches); + } + *numPairsRes = numPairs; + + #ifdef SHOW_STAT + printf("\n i = %u numPairs = %u ", g_STAT_OFFSET, numPairs / 2); + g_STAT_OFFSET++; + { + unsigned i; + for (i = 0; i < numPairs; i += 2) + printf("%2u %6u | ", p->matches[i], p->matches[i + 1]); + } + #endif + + if (numPairs == 0) + return 0; + { + const unsigned len = p->matches[(size_t)numPairs - 2]; + if (len != p->numFastBytes) + return len; + { + UInt32 numAvail = p->numAvail; + if (numAvail > LZMA_MATCH_LEN_MAX) + numAvail = LZMA_MATCH_LEN_MAX; + { + const Byte *p1 = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + const Byte *p2 = p1 + len; + const ptrdiff_t dif = (ptrdiff_t)-1 - (ptrdiff_t)p->matches[(size_t)numPairs - 1]; + const Byte *lim = p1 + numAvail; + for (; p2 != lim && *p2 == p2[dif]; p2++) + {} + return (unsigned)(p2 - p1); + } + } + } +} + +#define MARK_LIT ((UInt32)(Int32)-1) + +#define MakeAs_Lit(p) { (p)->dist = MARK_LIT; (p)->extra = 0; } +#define MakeAs_ShortRep(p) { (p)->dist = 0; (p)->extra = 0; } +#define IsShortRep(p) ((p)->dist == 0) + + +#define GetPrice_ShortRep(p, state, posState) \ + ( GET_PRICE_0(p->isRepG0[state]) + GET_PRICE_0(p->isRep0Long[state][posState])) + +#define GetPrice_Rep_0(p, state, posState) ( \ + GET_PRICE_1(p->isMatch[state][posState]) \ + + GET_PRICE_1(p->isRep0Long[state][posState])) \ + + GET_PRICE_1(p->isRep[state]) \ + + GET_PRICE_0(p->isRepG0[state]) + +MY_FORCE_INLINE +static UInt32 GetPrice_PureRep(const CLzmaEnc *p, unsigned repIndex, size_t state, size_t posState) +{ + UInt32 price; + UInt32 prob = p->isRepG0[state]; + if (repIndex == 0) + { + price = GET_PRICE_0(prob); + price += GET_PRICE_1(p->isRep0Long[state][posState]); + } + else + { + price = GET_PRICE_1(prob); + prob = p->isRepG1[state]; + if (repIndex == 1) + price += GET_PRICE_0(prob); + else + { + price += GET_PRICE_1(prob); + price += GET_PRICE(p->isRepG2[state], repIndex - 2); + } + } + return price; +} + + +static unsigned Backward(CLzmaEnc *p, unsigned cur) +{ + unsigned wr = cur + 1; + p->optEnd = wr; + + for (;;) + { + UInt32 dist = p->opt[cur].dist; + unsigned len = (unsigned)p->opt[cur].len; + unsigned extra = (unsigned)p->opt[cur].extra; + cur -= len; + + if (extra) + { + wr--; + p->opt[wr].len = (UInt32)len; + cur -= extra; + len = extra; + if (extra == 1) + { + p->opt[wr].dist = dist; + dist = MARK_LIT; + } + else + { + p->opt[wr].dist = 0; + len--; + wr--; + p->opt[wr].dist = MARK_LIT; + p->opt[wr].len = 1; + } + } + + if (cur == 0) + { + p->backRes = dist; + p->optCur = wr; + return len; + } + + wr--; + p->opt[wr].dist = dist; + p->opt[wr].len = (UInt32)len; + } +} + + + +#define LIT_PROBS(pos, prevByte) \ + (p->litProbs + (UInt32)3 * (((((pos) << 8) + (prevByte)) & p->lpMask) << p->lc)) + + +static unsigned GetOptimum(CLzmaEnc *p, UInt32 position) +{ + unsigned last, cur; + UInt32 reps[LZMA_NUM_REPS]; + unsigned repLens[LZMA_NUM_REPS]; + UInt32 *matches; + + { + UInt32 numAvail; + unsigned numPairs, mainLen, repMaxIndex, i, posState; + UInt32 matchPrice, repMatchPrice; + const Byte *data; + Byte curByte, matchByte; + + p->optCur = p->optEnd = 0; + + if (p->additionalOffset == 0) + mainLen = ReadMatchDistances(p, &numPairs); + else + { + mainLen = p->longestMatchLen; + numPairs = p->numPairs; + } + + numAvail = p->numAvail; + if (numAvail < 2) + { + p->backRes = MARK_LIT; + return 1; + } + if (numAvail > LZMA_MATCH_LEN_MAX) + numAvail = LZMA_MATCH_LEN_MAX; + + data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + repMaxIndex = 0; + + for (i = 0; i < LZMA_NUM_REPS; i++) + { + unsigned len; + const Byte *data2; + reps[i] = p->reps[i]; + data2 = data - reps[i]; + if (data[0] != data2[0] || data[1] != data2[1]) + { + repLens[i] = 0; + continue; + } + for (len = 2; len < numAvail && data[len] == data2[len]; len++) + {} + repLens[i] = len; + if (len > repLens[repMaxIndex]) + repMaxIndex = i; + if (len == LZMA_MATCH_LEN_MAX) // 21.03 : optimization + break; + } + + if (repLens[repMaxIndex] >= p->numFastBytes) + { + unsigned len; + p->backRes = (UInt32)repMaxIndex; + len = repLens[repMaxIndex]; + MOVE_POS(p, len - 1) + return len; + } + + matches = p->matches; + #define MATCHES matches + // #define MATCHES p->matches + + if (mainLen >= p->numFastBytes) + { + p->backRes = MATCHES[(size_t)numPairs - 1] + LZMA_NUM_REPS; + MOVE_POS(p, mainLen - 1) + return mainLen; + } + + curByte = *data; + matchByte = *(data - reps[0]); + + last = repLens[repMaxIndex]; + if (last <= mainLen) + last = mainLen; + + if (last < 2 && curByte != matchByte) + { + p->backRes = MARK_LIT; + return 1; + } + + p->opt[0].state = (CState)p->state; + + posState = (position & p->pbMask); + + { + const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); + p->opt[1].price = GET_PRICE_0(p->isMatch[p->state][posState]) + + (!IsLitState(p->state) ? + LitEnc_Matched_GetPrice(probs, curByte, matchByte, p->ProbPrices) : + LitEnc_GetPrice(probs, curByte, p->ProbPrices)); + } + + MakeAs_Lit(&p->opt[1]); + + matchPrice = GET_PRICE_1(p->isMatch[p->state][posState]); + repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[p->state]); + + // 18.06 + if (matchByte == curByte && repLens[0] == 0) + { + UInt32 shortRepPrice = repMatchPrice + GetPrice_ShortRep(p, p->state, posState); + if (shortRepPrice < p->opt[1].price) + { + p->opt[1].price = shortRepPrice; + MakeAs_ShortRep(&p->opt[1]); + } + if (last < 2) + { + p->backRes = p->opt[1].dist; + return 1; + } + } + + p->opt[1].len = 1; + + p->opt[0].reps[0] = reps[0]; + p->opt[0].reps[1] = reps[1]; + p->opt[0].reps[2] = reps[2]; + p->opt[0].reps[3] = reps[3]; + + // ---------- REP ---------- + + for (i = 0; i < LZMA_NUM_REPS; i++) + { + unsigned repLen = repLens[i]; + UInt32 price; + if (repLen < 2) + continue; + price = repMatchPrice + GetPrice_PureRep(p, i, p->state, posState); + do + { + UInt32 price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState, repLen); + COptimal *opt = &p->opt[repLen]; + if (price2 < opt->price) + { + opt->price = price2; + opt->len = (UInt32)repLen; + opt->dist = (UInt32)i; + opt->extra = 0; + } + } + while (--repLen >= 2); + } + + + // ---------- MATCH ---------- + { + unsigned len = repLens[0] + 1; + if (len <= mainLen) + { + unsigned offs = 0; + UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[p->state]); + + if (len < 2) + len = 2; + else + while (len > MATCHES[offs]) + offs += 2; + + for (; ; len++) + { + COptimal *opt; + UInt32 dist = MATCHES[(size_t)offs + 1]; + UInt32 price = normalMatchPrice + GET_PRICE_LEN(&p->lenEnc, posState, len); + unsigned lenToPosState = GetLenToPosState(len); + + if (dist < kNumFullDistances) + price += p->distancesPrices[lenToPosState][dist & (kNumFullDistances - 1)]; + else + { + unsigned slot; + GetPosSlot2(dist, slot); + price += p->alignPrices[dist & kAlignMask]; + price += p->posSlotPrices[lenToPosState][slot]; + } + + opt = &p->opt[len]; + + if (price < opt->price) + { + opt->price = price; + opt->len = (UInt32)len; + opt->dist = dist + LZMA_NUM_REPS; + opt->extra = 0; + } + + if (len == MATCHES[offs]) + { + offs += 2; + if (offs == numPairs) + break; + } + } + } + } + + + cur = 0; + + #ifdef SHOW_STAT2 + /* if (position >= 0) */ + { + unsigned i; + printf("\n pos = %4X", position); + for (i = cur; i <= last; i++) + printf("\nprice[%4X] = %u", position - cur + i, p->opt[i].price); + } + #endif + } + + + + // ---------- Optimal Parsing ---------- + + for (;;) + { + unsigned numAvail; + UInt32 numAvailFull; + unsigned newLen, numPairs, prev, state, posState, startLen; + UInt32 litPrice, matchPrice, repMatchPrice; + BoolInt nextIsLit; + Byte curByte, matchByte; + const Byte *data; + COptimal *curOpt, *nextOpt; + + if (++cur == last) + break; + + // 18.06 + if (cur >= kNumOpts - 64) + { + unsigned j, best; + UInt32 price = p->opt[cur].price; + best = cur; + for (j = cur + 1; j <= last; j++) + { + UInt32 price2 = p->opt[j].price; + if (price >= price2) + { + price = price2; + best = j; + } + } + { + unsigned delta = best - cur; + if (delta != 0) + { + MOVE_POS(p, delta); + } + } + cur = best; + break; + } + + newLen = ReadMatchDistances(p, &numPairs); + + if (newLen >= p->numFastBytes) + { + p->numPairs = numPairs; + p->longestMatchLen = newLen; + break; + } + + curOpt = &p->opt[cur]; + + position++; + + // we need that check here, if skip_items in p->opt are possible + /* + if (curOpt->price >= kInfinityPrice) + continue; + */ + + prev = cur - curOpt->len; + + if (curOpt->len == 1) + { + state = (unsigned)p->opt[prev].state; + if (IsShortRep(curOpt)) + state = kShortRepNextStates[state]; + else + state = kLiteralNextStates[state]; + } + else + { + const COptimal *prevOpt; + UInt32 b0; + UInt32 dist = curOpt->dist; + + if (curOpt->extra) + { + prev -= (unsigned)curOpt->extra; + state = kState_RepAfterLit; + if (curOpt->extra == 1) + state = (dist < LZMA_NUM_REPS ? kState_RepAfterLit : kState_MatchAfterLit); + } + else + { + state = (unsigned)p->opt[prev].state; + if (dist < LZMA_NUM_REPS) + state = kRepNextStates[state]; + else + state = kMatchNextStates[state]; + } + + prevOpt = &p->opt[prev]; + b0 = prevOpt->reps[0]; + + if (dist < LZMA_NUM_REPS) + { + if (dist == 0) + { + reps[0] = b0; + reps[1] = prevOpt->reps[1]; + reps[2] = prevOpt->reps[2]; + reps[3] = prevOpt->reps[3]; + } + else + { + reps[1] = b0; + b0 = prevOpt->reps[1]; + if (dist == 1) + { + reps[0] = b0; + reps[2] = prevOpt->reps[2]; + reps[3] = prevOpt->reps[3]; + } + else + { + reps[2] = b0; + reps[0] = prevOpt->reps[dist]; + reps[3] = prevOpt->reps[dist ^ 1]; + } + } + } + else + { + reps[0] = (dist - LZMA_NUM_REPS + 1); + reps[1] = b0; + reps[2] = prevOpt->reps[1]; + reps[3] = prevOpt->reps[2]; + } + } + + curOpt->state = (CState)state; + curOpt->reps[0] = reps[0]; + curOpt->reps[1] = reps[1]; + curOpt->reps[2] = reps[2]; + curOpt->reps[3] = reps[3]; + + data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + curByte = *data; + matchByte = *(data - reps[0]); + + posState = (position & p->pbMask); + + /* + The order of Price checks: + < LIT + <= SHORT_REP + < LIT : REP_0 + < REP [ : LIT : REP_0 ] + < MATCH [ : LIT : REP_0 ] + */ + + { + UInt32 curPrice = curOpt->price; + unsigned prob = p->isMatch[state][posState]; + matchPrice = curPrice + GET_PRICE_1(prob); + litPrice = curPrice + GET_PRICE_0(prob); + } + + nextOpt = &p->opt[(size_t)cur + 1]; + nextIsLit = False; + + // here we can allow skip_items in p->opt, if we don't check (nextOpt->price < kInfinityPrice) + // 18.new.06 + if ((nextOpt->price < kInfinityPrice + // && !IsLitState(state) + && matchByte == curByte) + || litPrice > nextOpt->price + ) + litPrice = 0; + else + { + const CLzmaProb *probs = LIT_PROBS(position, *(data - 1)); + litPrice += (!IsLitState(state) ? + LitEnc_Matched_GetPrice(probs, curByte, matchByte, p->ProbPrices) : + LitEnc_GetPrice(probs, curByte, p->ProbPrices)); + + if (litPrice < nextOpt->price) + { + nextOpt->price = litPrice; + nextOpt->len = 1; + MakeAs_Lit(nextOpt); + nextIsLit = True; + } + } + + repMatchPrice = matchPrice + GET_PRICE_1(p->isRep[state]); + + numAvailFull = p->numAvail; + { + unsigned temp = kNumOpts - 1 - cur; + if (numAvailFull > temp) + numAvailFull = (UInt32)temp; + } + + // 18.06 + // ---------- SHORT_REP ---------- + if (IsLitState(state)) // 18.new + if (matchByte == curByte) + if (repMatchPrice < nextOpt->price) // 18.new + // if (numAvailFull < 2 || data[1] != *(data - reps[0] + 1)) + if ( + // nextOpt->price >= kInfinityPrice || + nextOpt->len < 2 // we can check nextOpt->len, if skip items are not allowed in p->opt + || (nextOpt->dist != 0 + // && nextOpt->extra <= 1 // 17.old + ) + ) + { + UInt32 shortRepPrice = repMatchPrice + GetPrice_ShortRep(p, state, posState); + // if (shortRepPrice <= nextOpt->price) // 17.old + if (shortRepPrice < nextOpt->price) // 18.new + { + nextOpt->price = shortRepPrice; + nextOpt->len = 1; + MakeAs_ShortRep(nextOpt); + nextIsLit = False; + } + } + + if (numAvailFull < 2) + continue; + numAvail = (numAvailFull <= p->numFastBytes ? numAvailFull : p->numFastBytes); + + // numAvail <= p->numFastBytes + + // ---------- LIT : REP_0 ---------- + + if (!nextIsLit + && litPrice != 0 // 18.new + && matchByte != curByte + && numAvailFull > 2) + { + const Byte *data2 = data - reps[0]; + if (data[1] == data2[1] && data[2] == data2[2]) + { + unsigned len; + unsigned limit = p->numFastBytes + 1; + if (limit > numAvailFull) + limit = numAvailFull; + for (len = 3; len < limit && data[len] == data2[len]; len++) + {} + + { + unsigned state2 = kLiteralNextStates[state]; + unsigned posState2 = (position + 1) & p->pbMask; + UInt32 price = litPrice + GetPrice_Rep_0(p, state2, posState2); + { + unsigned offset = cur + len; + + if (last < offset) + last = offset; + + // do + { + UInt32 price2; + COptimal *opt; + len--; + // price2 = price + GetPrice_Len_Rep_0(p, len, state2, posState2); + price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState2, len); + + opt = &p->opt[offset]; + // offset--; + if (price2 < opt->price) + { + opt->price = price2; + opt->len = (UInt32)len; + opt->dist = 0; + opt->extra = 1; + } + } + // while (len >= 3); + } + } + } + } + + startLen = 2; /* speed optimization */ + + { + // ---------- REP ---------- + unsigned repIndex = 0; // 17.old + // unsigned repIndex = IsLitState(state) ? 0 : 1; // 18.notused + for (; repIndex < LZMA_NUM_REPS; repIndex++) + { + unsigned len; + UInt32 price; + const Byte *data2 = data - reps[repIndex]; + if (data[0] != data2[0] || data[1] != data2[1]) + continue; + + for (len = 2; len < numAvail && data[len] == data2[len]; len++) + {} + + // if (len < startLen) continue; // 18.new: speed optimization + + { + unsigned offset = cur + len; + if (last < offset) + last = offset; + } + { + unsigned len2 = len; + price = repMatchPrice + GetPrice_PureRep(p, repIndex, state, posState); + do + { + UInt32 price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState, len2); + COptimal *opt = &p->opt[cur + len2]; + if (price2 < opt->price) + { + opt->price = price2; + opt->len = (UInt32)len2; + opt->dist = (UInt32)repIndex; + opt->extra = 0; + } + } + while (--len2 >= 2); + } + + if (repIndex == 0) startLen = len + 1; // 17.old + // startLen = len + 1; // 18.new + + /* if (_maxMode) */ + { + // ---------- REP : LIT : REP_0 ---------- + // numFastBytes + 1 + numFastBytes + + unsigned len2 = len + 1; + unsigned limit = len2 + p->numFastBytes; + if (limit > numAvailFull) + limit = numAvailFull; + + len2 += 2; + if (len2 <= limit) + if (data[len2 - 2] == data2[len2 - 2]) + if (data[len2 - 1] == data2[len2 - 1]) + { + unsigned state2 = kRepNextStates[state]; + unsigned posState2 = (position + len) & p->pbMask; + price += GET_PRICE_LEN(&p->repLenEnc, posState, len) + + GET_PRICE_0(p->isMatch[state2][posState2]) + + LitEnc_Matched_GetPrice(LIT_PROBS(position + len, data[(size_t)len - 1]), + data[len], data2[len], p->ProbPrices); + + // state2 = kLiteralNextStates[state2]; + state2 = kState_LitAfterRep; + posState2 = (posState2 + 1) & p->pbMask; + + + price += GetPrice_Rep_0(p, state2, posState2); + + for (; len2 < limit && data[len2] == data2[len2]; len2++) + {} + + len2 -= len; + // if (len2 >= 3) + { + { + unsigned offset = cur + len + len2; + + if (last < offset) + last = offset; + // do + { + UInt32 price2; + COptimal *opt; + len2--; + // price2 = price + GetPrice_Len_Rep_0(p, len2, state2, posState2); + price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState2, len2); + + opt = &p->opt[offset]; + // offset--; + if (price2 < opt->price) + { + opt->price = price2; + opt->len = (UInt32)len2; + opt->extra = (CExtra)(len + 1); + opt->dist = (UInt32)repIndex; + } + } + // while (len2 >= 3); + } + } + } + } + } + } + + + // ---------- MATCH ---------- + /* for (unsigned len = 2; len <= newLen; len++) */ + if (newLen > numAvail) + { + newLen = numAvail; + for (numPairs = 0; newLen > MATCHES[numPairs]; numPairs += 2); + MATCHES[numPairs] = (UInt32)newLen; + numPairs += 2; + } + + // startLen = 2; /* speed optimization */ + + if (newLen >= startLen) + { + UInt32 normalMatchPrice = matchPrice + GET_PRICE_0(p->isRep[state]); + UInt32 dist; + unsigned offs, posSlot, len; + + { + unsigned offset = cur + newLen; + if (last < offset) + last = offset; + } + + offs = 0; + while (startLen > MATCHES[offs]) + offs += 2; + dist = MATCHES[(size_t)offs + 1]; + + // if (dist >= kNumFullDistances) + GetPosSlot2(dist, posSlot); + + for (len = /*2*/ startLen; ; len++) + { + UInt32 price = normalMatchPrice + GET_PRICE_LEN(&p->lenEnc, posState, len); + { + COptimal *opt; + unsigned lenNorm = len - 2; + lenNorm = GetLenToPosState2(lenNorm); + if (dist < kNumFullDistances) + price += p->distancesPrices[lenNorm][dist & (kNumFullDistances - 1)]; + else + price += p->posSlotPrices[lenNorm][posSlot] + p->alignPrices[dist & kAlignMask]; + + opt = &p->opt[cur + len]; + if (price < opt->price) + { + opt->price = price; + opt->len = (UInt32)len; + opt->dist = dist + LZMA_NUM_REPS; + opt->extra = 0; + } + } + + if (len == MATCHES[offs]) + { + // if (p->_maxMode) { + // MATCH : LIT : REP_0 + + const Byte *data2 = data - dist - 1; + unsigned len2 = len + 1; + unsigned limit = len2 + p->numFastBytes; + if (limit > numAvailFull) + limit = numAvailFull; + + len2 += 2; + if (len2 <= limit) + if (data[len2 - 2] == data2[len2 - 2]) + if (data[len2 - 1] == data2[len2 - 1]) + { + for (; len2 < limit && data[len2] == data2[len2]; len2++) + {} + + len2 -= len; + + // if (len2 >= 3) + { + unsigned state2 = kMatchNextStates[state]; + unsigned posState2 = (position + len) & p->pbMask; + unsigned offset; + price += GET_PRICE_0(p->isMatch[state2][posState2]); + price += LitEnc_Matched_GetPrice(LIT_PROBS(position + len, data[(size_t)len - 1]), + data[len], data2[len], p->ProbPrices); + + // state2 = kLiteralNextStates[state2]; + state2 = kState_LitAfterMatch; + + posState2 = (posState2 + 1) & p->pbMask; + price += GetPrice_Rep_0(p, state2, posState2); + + offset = cur + len + len2; + + if (last < offset) + last = offset; + // do + { + UInt32 price2; + COptimal *opt; + len2--; + // price2 = price + GetPrice_Len_Rep_0(p, len2, state2, posState2); + price2 = price + GET_PRICE_LEN(&p->repLenEnc, posState2, len2); + opt = &p->opt[offset]; + // offset--; + if (price2 < opt->price) + { + opt->price = price2; + opt->len = (UInt32)len2; + opt->extra = (CExtra)(len + 1); + opt->dist = dist + LZMA_NUM_REPS; + } + } + // while (len2 >= 3); + } + + } + + offs += 2; + if (offs == numPairs) + break; + dist = MATCHES[(size_t)offs + 1]; + // if (dist >= kNumFullDistances) + GetPosSlot2(dist, posSlot); + } + } + } + } + + do + p->opt[last].price = kInfinityPrice; + while (--last); + + return Backward(p, cur); +} + + + +#define ChangePair(smallDist, bigDist) (((bigDist) >> 7) > (smallDist)) + + + +static unsigned GetOptimumFast(CLzmaEnc *p) +{ + UInt32 numAvail, mainDist; + unsigned mainLen, numPairs, repIndex, repLen, i; + const Byte *data; + + if (p->additionalOffset == 0) + mainLen = ReadMatchDistances(p, &numPairs); + else + { + mainLen = p->longestMatchLen; + numPairs = p->numPairs; + } + + numAvail = p->numAvail; + p->backRes = MARK_LIT; + if (numAvail < 2) + return 1; + // if (mainLen < 2 && p->state == 0) return 1; // 18.06.notused + if (numAvail > LZMA_MATCH_LEN_MAX) + numAvail = LZMA_MATCH_LEN_MAX; + data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + repLen = repIndex = 0; + + for (i = 0; i < LZMA_NUM_REPS; i++) + { + unsigned len; + const Byte *data2 = data - p->reps[i]; + if (data[0] != data2[0] || data[1] != data2[1]) + continue; + for (len = 2; len < numAvail && data[len] == data2[len]; len++) + {} + if (len >= p->numFastBytes) + { + p->backRes = (UInt32)i; + MOVE_POS(p, len - 1) + return len; + } + if (len > repLen) + { + repIndex = i; + repLen = len; + } + } + + if (mainLen >= p->numFastBytes) + { + p->backRes = p->matches[(size_t)numPairs - 1] + LZMA_NUM_REPS; + MOVE_POS(p, mainLen - 1) + return mainLen; + } + + mainDist = 0; /* for GCC */ + + if (mainLen >= 2) + { + mainDist = p->matches[(size_t)numPairs - 1]; + while (numPairs > 2) + { + UInt32 dist2; + if (mainLen != p->matches[(size_t)numPairs - 4] + 1) + break; + dist2 = p->matches[(size_t)numPairs - 3]; + if (!ChangePair(dist2, mainDist)) + break; + numPairs -= 2; + mainLen--; + mainDist = dist2; + } + if (mainLen == 2 && mainDist >= 0x80) + mainLen = 1; + } + + if (repLen >= 2) + if ( repLen + 1 >= mainLen + || (repLen + 2 >= mainLen && mainDist >= (1 << 9)) + || (repLen + 3 >= mainLen && mainDist >= (1 << 15))) + { + p->backRes = (UInt32)repIndex; + MOVE_POS(p, repLen - 1) + return repLen; + } + + if (mainLen < 2 || numAvail <= 2) + return 1; + + { + unsigned len1 = ReadMatchDistances(p, &p->numPairs); + p->longestMatchLen = len1; + + if (len1 >= 2) + { + UInt32 newDist = p->matches[(size_t)p->numPairs - 1]; + if ( (len1 >= mainLen && newDist < mainDist) + || (len1 == mainLen + 1 && !ChangePair(mainDist, newDist)) + || (len1 > mainLen + 1) + || (len1 + 1 >= mainLen && mainLen >= 3 && ChangePair(newDist, mainDist))) + return 1; + } + } + + data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - 1; + + for (i = 0; i < LZMA_NUM_REPS; i++) + { + unsigned len, limit; + const Byte *data2 = data - p->reps[i]; + if (data[0] != data2[0] || data[1] != data2[1]) + continue; + limit = mainLen - 1; + for (len = 2;; len++) + { + if (len >= limit) + return 1; + if (data[len] != data2[len]) + break; + } + } + + p->backRes = mainDist + LZMA_NUM_REPS; + if (mainLen != 2) + { + MOVE_POS(p, mainLen - 2) + } + return mainLen; +} + + + + +static void WriteEndMarker(CLzmaEnc *p, unsigned posState) +{ + UInt32 range; + range = p->rc.range; + { + UInt32 ttt, newBound; + CLzmaProb *prob = &p->isMatch[p->state][posState]; + RC_BIT_PRE(&p->rc, prob) + RC_BIT_1(&p->rc, prob) + prob = &p->isRep[p->state]; + RC_BIT_PRE(&p->rc, prob) + RC_BIT_0(&p->rc, prob) + } + p->state = kMatchNextStates[p->state]; + + p->rc.range = range; + LenEnc_Encode(&p->lenProbs, &p->rc, 0, posState); + range = p->rc.range; + + { + // RcTree_Encode_PosSlot(&p->rc, p->posSlotEncoder[0], (1 << kNumPosSlotBits) - 1); + CLzmaProb *probs = p->posSlotEncoder[0]; + unsigned m = 1; + do + { + UInt32 ttt, newBound; + RC_BIT_PRE(p, probs + m) + RC_BIT_1(&p->rc, probs + m); + m = (m << 1) + 1; + } + while (m < (1 << kNumPosSlotBits)); + } + { + // RangeEnc_EncodeDirectBits(&p->rc, ((UInt32)1 << (30 - kNumAlignBits)) - 1, 30 - kNumAlignBits); UInt32 range = p->range; + unsigned numBits = 30 - kNumAlignBits; + do + { + range >>= 1; + p->rc.low += range; + RC_NORM(&p->rc) + } + while (--numBits); + } + + { + // RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, kAlignMask); + CLzmaProb *probs = p->posAlignEncoder; + unsigned m = 1; + do + { + UInt32 ttt, newBound; + RC_BIT_PRE(p, probs + m) + RC_BIT_1(&p->rc, probs + m); + m = (m << 1) + 1; + } + while (m < kAlignTableSize); + } + p->rc.range = range; +} + + +static SRes CheckErrors(CLzmaEnc *p) +{ + if (p->result != SZ_OK) + return p->result; + if (p->rc.res != SZ_OK) + p->result = SZ_ERROR_WRITE; + + #ifndef _7ZIP_ST + if ( + // p->mf_Failure || + (p->mtMode && + ( // p->matchFinderMt.failure_LZ_LZ || + p->matchFinderMt.failure_LZ_BT)) + ) + { + p->result = MY_HRES_ERROR__INTERNAL_ERROR; + // printf("\nCheckErrors p->matchFinderMt.failureLZ\n"); + } + #endif + + if (MFB.result != SZ_OK) + p->result = SZ_ERROR_READ; + + if (p->result != SZ_OK) + p->finished = True; + return p->result; +} + + +MY_NO_INLINE static SRes Flush(CLzmaEnc *p, UInt32 nowPos) +{ + /* ReleaseMFStream(); */ + p->finished = True; + if (p->writeEndMark) + WriteEndMarker(p, nowPos & p->pbMask); + RangeEnc_FlushData(&p->rc); + RangeEnc_FlushStream(&p->rc); + return CheckErrors(p); +} + + +MY_NO_INLINE static void FillAlignPrices(CLzmaEnc *p) +{ + unsigned i; + const CProbPrice *ProbPrices = p->ProbPrices; + const CLzmaProb *probs = p->posAlignEncoder; + // p->alignPriceCount = 0; + for (i = 0; i < kAlignTableSize / 2; i++) + { + UInt32 price = 0; + unsigned sym = i; + unsigned m = 1; + unsigned bit; + UInt32 prob; + bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[m], bit); m = (m << 1) + bit; + bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[m], bit); m = (m << 1) + bit; + bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[m], bit); m = (m << 1) + bit; + prob = probs[m]; + p->alignPrices[i ] = price + GET_PRICEa_0(prob); + p->alignPrices[i + 8] = price + GET_PRICEa_1(prob); + // p->alignPrices[i] = RcTree_ReverseGetPrice(p->posAlignEncoder, kNumAlignBits, i, p->ProbPrices); + } +} + + +MY_NO_INLINE static void FillDistancesPrices(CLzmaEnc *p) +{ + // int y; for (y = 0; y < 100; y++) { + + UInt32 tempPrices[kNumFullDistances]; + unsigned i, lps; + + const CProbPrice *ProbPrices = p->ProbPrices; + p->matchPriceCount = 0; + + for (i = kStartPosModelIndex / 2; i < kNumFullDistances / 2; i++) + { + unsigned posSlot = GetPosSlot1(i); + unsigned footerBits = (posSlot >> 1) - 1; + unsigned base = ((2 | (posSlot & 1)) << footerBits); + const CLzmaProb *probs = p->posEncoders + (size_t)base * 2; + // tempPrices[i] = RcTree_ReverseGetPrice(p->posEncoders + base, footerBits, i - base, p->ProbPrices); + UInt32 price = 0; + unsigned m = 1; + unsigned sym = i; + unsigned offset = (unsigned)1 << footerBits; + base += i; + + if (footerBits) + do + { + unsigned bit = sym & 1; + sym >>= 1; + price += GET_PRICEa(probs[m], bit); + m = (m << 1) + bit; + } + while (--footerBits); + + { + unsigned prob = probs[m]; + tempPrices[base ] = price + GET_PRICEa_0(prob); + tempPrices[base + offset] = price + GET_PRICEa_1(prob); + } + } + + for (lps = 0; lps < kNumLenToPosStates; lps++) + { + unsigned slot; + unsigned distTableSize2 = (p->distTableSize + 1) >> 1; + UInt32 *posSlotPrices = p->posSlotPrices[lps]; + const CLzmaProb *probs = p->posSlotEncoder[lps]; + + for (slot = 0; slot < distTableSize2; slot++) + { + // posSlotPrices[slot] = RcTree_GetPrice(encoder, kNumPosSlotBits, slot, p->ProbPrices); + UInt32 price; + unsigned bit; + unsigned sym = slot + (1 << (kNumPosSlotBits - 1)); + unsigned prob; + bit = sym & 1; sym >>= 1; price = GET_PRICEa(probs[sym], bit); + bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[sym], bit); + bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[sym], bit); + bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[sym], bit); + bit = sym & 1; sym >>= 1; price += GET_PRICEa(probs[sym], bit); + prob = probs[(size_t)slot + (1 << (kNumPosSlotBits - 1))]; + posSlotPrices[(size_t)slot * 2 ] = price + GET_PRICEa_0(prob); + posSlotPrices[(size_t)slot * 2 + 1] = price + GET_PRICEa_1(prob); + } + + { + UInt32 delta = ((UInt32)((kEndPosModelIndex / 2 - 1) - kNumAlignBits) << kNumBitPriceShiftBits); + for (slot = kEndPosModelIndex / 2; slot < distTableSize2; slot++) + { + posSlotPrices[(size_t)slot * 2 ] += delta; + posSlotPrices[(size_t)slot * 2 + 1] += delta; + delta += ((UInt32)1 << kNumBitPriceShiftBits); + } + } + + { + UInt32 *dp = p->distancesPrices[lps]; + + dp[0] = posSlotPrices[0]; + dp[1] = posSlotPrices[1]; + dp[2] = posSlotPrices[2]; + dp[3] = posSlotPrices[3]; + + for (i = 4; i < kNumFullDistances; i += 2) + { + UInt32 slotPrice = posSlotPrices[GetPosSlot1(i)]; + dp[i ] = slotPrice + tempPrices[i]; + dp[i + 1] = slotPrice + tempPrices[i + 1]; + } + } + } + // } +} + + + +static void LzmaEnc_Construct(CLzmaEnc *p) +{ + RangeEnc_Construct(&p->rc); + MatchFinder_Construct(&MFB); + + #ifndef _7ZIP_ST + p->matchFinderMt.MatchFinder = &MFB; + MatchFinderMt_Construct(&p->matchFinderMt); + #endif + + { + CLzmaEncProps props; + LzmaEncProps_Init(&props); + LzmaEnc_SetProps(p, &props); + } + + #ifndef LZMA_LOG_BSR + LzmaEnc_FastPosInit(p->g_FastPos); + #endif + + LzmaEnc_InitPriceTables(p->ProbPrices); + p->litProbs = NULL; + p->saveState.litProbs = NULL; +} + +CLzmaEncHandle LzmaEnc_Create(ISzAllocPtr alloc) +{ + void *p; + p = ISzAlloc_Alloc(alloc, sizeof(CLzmaEnc)); + if (p) + LzmaEnc_Construct((CLzmaEnc *)p); + return p; +} + +static void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAllocPtr alloc) +{ + ISzAlloc_Free(alloc, p->litProbs); + ISzAlloc_Free(alloc, p->saveState.litProbs); + p->litProbs = NULL; + p->saveState.litProbs = NULL; +} + +static void LzmaEnc_Destruct(CLzmaEnc *p, ISzAllocPtr alloc, ISzAllocPtr allocBig) +{ + #ifndef _7ZIP_ST + MatchFinderMt_Destruct(&p->matchFinderMt, allocBig); + #endif + + MatchFinder_Free(&MFB, allocBig); + LzmaEnc_FreeLits(p, alloc); + RangeEnc_Free(&p->rc, alloc); +} + +void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAllocPtr alloc, ISzAllocPtr allocBig) +{ + LzmaEnc_Destruct((CLzmaEnc *)p, alloc, allocBig); + ISzAlloc_Free(alloc, p); +} + + +MY_NO_INLINE +static SRes LzmaEnc_CodeOneBlock(CLzmaEnc *p, UInt32 maxPackSize, UInt32 maxUnpackSize) +{ + UInt32 nowPos32, startPos32; + if (p->needInit) + { + #ifndef _7ZIP_ST + if (p->mtMode) + { + RINOK(MatchFinderMt_InitMt(&p->matchFinderMt)); + } + #endif + p->matchFinder.Init(p->matchFinderObj); + p->needInit = 0; + } + + if (p->finished) + return p->result; + RINOK(CheckErrors(p)); + + nowPos32 = (UInt32)p->nowPos64; + startPos32 = nowPos32; + + if (p->nowPos64 == 0) + { + unsigned numPairs; + Byte curByte; + if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) + return Flush(p, nowPos32); + ReadMatchDistances(p, &numPairs); + RangeEnc_EncodeBit_0(&p->rc, &p->isMatch[kState_Start][0]); + // p->state = kLiteralNextStates[p->state]; + curByte = *(p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset); + LitEnc_Encode(&p->rc, p->litProbs, curByte); + p->additionalOffset--; + nowPos32++; + } + + if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) != 0) + + for (;;) + { + UInt32 dist; + unsigned len, posState; + UInt32 range, ttt, newBound; + CLzmaProb *probs; + + if (p->fastMode) + len = GetOptimumFast(p); + else + { + unsigned oci = p->optCur; + if (p->optEnd == oci) + len = GetOptimum(p, nowPos32); + else + { + const COptimal *opt = &p->opt[oci]; + len = opt->len; + p->backRes = opt->dist; + p->optCur = oci + 1; + } + } + + posState = (unsigned)nowPos32 & p->pbMask; + range = p->rc.range; + probs = &p->isMatch[p->state][posState]; + + RC_BIT_PRE(&p->rc, probs) + + dist = p->backRes; + + #ifdef SHOW_STAT2 + printf("\n pos = %6X, len = %3u pos = %6u", nowPos32, len, dist); + #endif + + if (dist == MARK_LIT) + { + Byte curByte; + const Byte *data; + unsigned state; + + RC_BIT_0(&p->rc, probs); + p->rc.range = range; + data = p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; + probs = LIT_PROBS(nowPos32, *(data - 1)); + curByte = *data; + state = p->state; + p->state = kLiteralNextStates[state]; + if (IsLitState(state)) + LitEnc_Encode(&p->rc, probs, curByte); + else + LitEnc_EncodeMatched(&p->rc, probs, curByte, *(data - p->reps[0])); + } + else + { + RC_BIT_1(&p->rc, probs); + probs = &p->isRep[p->state]; + RC_BIT_PRE(&p->rc, probs) + + if (dist < LZMA_NUM_REPS) + { + RC_BIT_1(&p->rc, probs); + probs = &p->isRepG0[p->state]; + RC_BIT_PRE(&p->rc, probs) + if (dist == 0) + { + RC_BIT_0(&p->rc, probs); + probs = &p->isRep0Long[p->state][posState]; + RC_BIT_PRE(&p->rc, probs) + if (len != 1) + { + RC_BIT_1_BASE(&p->rc, probs); + } + else + { + RC_BIT_0_BASE(&p->rc, probs); + p->state = kShortRepNextStates[p->state]; + } + } + else + { + RC_BIT_1(&p->rc, probs); + probs = &p->isRepG1[p->state]; + RC_BIT_PRE(&p->rc, probs) + if (dist == 1) + { + RC_BIT_0_BASE(&p->rc, probs); + dist = p->reps[1]; + } + else + { + RC_BIT_1(&p->rc, probs); + probs = &p->isRepG2[p->state]; + RC_BIT_PRE(&p->rc, probs) + if (dist == 2) + { + RC_BIT_0_BASE(&p->rc, probs); + dist = p->reps[2]; + } + else + { + RC_BIT_1_BASE(&p->rc, probs); + dist = p->reps[3]; + p->reps[3] = p->reps[2]; + } + p->reps[2] = p->reps[1]; + } + p->reps[1] = p->reps[0]; + p->reps[0] = dist; + } + + RC_NORM(&p->rc) + + p->rc.range = range; + + if (len != 1) + { + LenEnc_Encode(&p->repLenProbs, &p->rc, len - LZMA_MATCH_LEN_MIN, posState); + --p->repLenEncCounter; + p->state = kRepNextStates[p->state]; + } + } + else + { + unsigned posSlot; + RC_BIT_0(&p->rc, probs); + p->rc.range = range; + p->state = kMatchNextStates[p->state]; + + LenEnc_Encode(&p->lenProbs, &p->rc, len - LZMA_MATCH_LEN_MIN, posState); + // --p->lenEnc.counter; + + dist -= LZMA_NUM_REPS; + p->reps[3] = p->reps[2]; + p->reps[2] = p->reps[1]; + p->reps[1] = p->reps[0]; + p->reps[0] = dist + 1; + + p->matchPriceCount++; + GetPosSlot(dist, posSlot); + // RcTree_Encode_PosSlot(&p->rc, p->posSlotEncoder[GetLenToPosState(len)], posSlot); + { + UInt32 sym = (UInt32)posSlot + (1 << kNumPosSlotBits); + range = p->rc.range; + probs = p->posSlotEncoder[GetLenToPosState(len)]; + do + { + CLzmaProb *prob = probs + (sym >> kNumPosSlotBits); + UInt32 bit = (sym >> (kNumPosSlotBits - 1)) & 1; + sym <<= 1; + RC_BIT(&p->rc, prob, bit); + } + while (sym < (1 << kNumPosSlotBits * 2)); + p->rc.range = range; + } + + if (dist >= kStartPosModelIndex) + { + unsigned footerBits = ((posSlot >> 1) - 1); + + if (dist < kNumFullDistances) + { + unsigned base = ((2 | (posSlot & 1)) << footerBits); + RcTree_ReverseEncode(&p->rc, p->posEncoders + base, footerBits, (unsigned)(dist /* - base */)); + } + else + { + UInt32 pos2 = (dist | 0xF) << (32 - footerBits); + range = p->rc.range; + // RangeEnc_EncodeDirectBits(&p->rc, posReduced >> kNumAlignBits, footerBits - kNumAlignBits); + /* + do + { + range >>= 1; + p->rc.low += range & (0 - ((dist >> --footerBits) & 1)); + RC_NORM(&p->rc) + } + while (footerBits > kNumAlignBits); + */ + do + { + range >>= 1; + p->rc.low += range & (0 - (pos2 >> 31)); + pos2 += pos2; + RC_NORM(&p->rc) + } + while (pos2 != 0xF0000000); + + + // RcTree_ReverseEncode(&p->rc, p->posAlignEncoder, kNumAlignBits, posReduced & kAlignMask); + + { + unsigned m = 1; + unsigned bit; + bit = dist & 1; dist >>= 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit); m = (m << 1) + bit; + bit = dist & 1; dist >>= 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit); m = (m << 1) + bit; + bit = dist & 1; dist >>= 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit); m = (m << 1) + bit; + bit = dist & 1; RC_BIT(&p->rc, p->posAlignEncoder + m, bit); + p->rc.range = range; + // p->alignPriceCount++; + } + } + } + } + } + + nowPos32 += (UInt32)len; + p->additionalOffset -= len; + + if (p->additionalOffset == 0) + { + UInt32 processed; + + if (!p->fastMode) + { + /* + if (p->alignPriceCount >= 16) // kAlignTableSize + FillAlignPrices(p); + if (p->matchPriceCount >= 128) + FillDistancesPrices(p); + if (p->lenEnc.counter <= 0) + LenPriceEnc_UpdateTables(&p->lenEnc, 1 << p->pb, &p->lenProbs, p->ProbPrices); + */ + if (p->matchPriceCount >= 64) + { + FillAlignPrices(p); + // { int y; for (y = 0; y < 100; y++) { + FillDistancesPrices(p); + // }} + LenPriceEnc_UpdateTables(&p->lenEnc, (unsigned)1 << p->pb, &p->lenProbs, p->ProbPrices); + } + if (p->repLenEncCounter <= 0) + { + p->repLenEncCounter = REP_LEN_COUNT; + LenPriceEnc_UpdateTables(&p->repLenEnc, (unsigned)1 << p->pb, &p->repLenProbs, p->ProbPrices); + } + } + + if (p->matchFinder.GetNumAvailableBytes(p->matchFinderObj) == 0) + break; + processed = nowPos32 - startPos32; + + if (maxPackSize) + { + if (processed + kNumOpts + 300 >= maxUnpackSize + || RangeEnc_GetProcessed_sizet(&p->rc) + kPackReserve >= maxPackSize) + break; + } + else if (processed >= (1 << 17)) + { + p->nowPos64 += nowPos32 - startPos32; + return CheckErrors(p); + } + } + } + + p->nowPos64 += nowPos32 - startPos32; + return Flush(p, nowPos32); +} + + + +#define kBigHashDicLimit ((UInt32)1 << 24) + +static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig) +{ + UInt32 beforeSize = kNumOpts; + UInt32 dictSize; + + if (!RangeEnc_Alloc(&p->rc, alloc)) + return SZ_ERROR_MEM; + + #ifndef _7ZIP_ST + p->mtMode = (p->multiThread && !p->fastMode && (MFB.btMode != 0)); + #endif + + { + unsigned lclp = p->lc + p->lp; + if (!p->litProbs || !p->saveState.litProbs || p->lclp != lclp) + { + LzmaEnc_FreeLits(p, alloc); + p->litProbs = (CLzmaProb *)ISzAlloc_Alloc(alloc, ((UInt32)0x300 << lclp) * sizeof(CLzmaProb)); + p->saveState.litProbs = (CLzmaProb *)ISzAlloc_Alloc(alloc, ((UInt32)0x300 << lclp) * sizeof(CLzmaProb)); + if (!p->litProbs || !p->saveState.litProbs) + { + LzmaEnc_FreeLits(p, alloc); + return SZ_ERROR_MEM; + } + p->lclp = lclp; + } + } + + MFB.bigHash = (Byte)(p->dictSize > kBigHashDicLimit ? 1 : 0); + + + dictSize = p->dictSize; + if (dictSize == ((UInt32)2 << 30) || + dictSize == ((UInt32)3 << 30)) + { + /* 21.03 : here we reduce the dictionary for 2 reasons: + 1) we don't want 32-bit back_distance matches in decoder for 2 GB dictionary. + 2) we want to elimate useless last MatchFinder_Normalize3() for corner cases, + where data size is aligned for 1 GB: 5/6/8 GB. + That reducing must be >= 1 for such corner cases. */ + dictSize -= 1; + } + + if (beforeSize + dictSize < keepWindowSize) + beforeSize = keepWindowSize - dictSize; + + /* in worst case we can look ahead for + max(LZMA_MATCH_LEN_MAX, numFastBytes + 1 + numFastBytes) bytes. + we send larger value for (keepAfter) to MantchFinder_Create(): + (numFastBytes + LZMA_MATCH_LEN_MAX + 1) + */ + + #ifndef _7ZIP_ST + if (p->mtMode) + { + RINOK(MatchFinderMt_Create(&p->matchFinderMt, dictSize, beforeSize, + p->numFastBytes, LZMA_MATCH_LEN_MAX + 1 /* 18.04 */ + , allocBig)); + p->matchFinderObj = &p->matchFinderMt; + MFB.bigHash = (Byte)( + (p->dictSize > kBigHashDicLimit && MFB.hashMask >= 0xFFFFFF) ? 1 : 0); + MatchFinderMt_CreateVTable(&p->matchFinderMt, &p->matchFinder); + } + else + #endif + { + if (!MatchFinder_Create(&MFB, dictSize, beforeSize, + p->numFastBytes, LZMA_MATCH_LEN_MAX + 1 /* 21.03 */ + , allocBig)) + return SZ_ERROR_MEM; + p->matchFinderObj = &MFB; + MatchFinder_CreateVTable(&MFB, &p->matchFinder); + } + + return SZ_OK; +} + +static void LzmaEnc_Init(CLzmaEnc *p) +{ + unsigned i; + p->state = 0; + p->reps[0] = + p->reps[1] = + p->reps[2] = + p->reps[3] = 1; + + RangeEnc_Init(&p->rc); + + for (i = 0; i < (1 << kNumAlignBits); i++) + p->posAlignEncoder[i] = kProbInitValue; + + for (i = 0; i < kNumStates; i++) + { + unsigned j; + for (j = 0; j < LZMA_NUM_PB_STATES_MAX; j++) + { + p->isMatch[i][j] = kProbInitValue; + p->isRep0Long[i][j] = kProbInitValue; + } + p->isRep[i] = kProbInitValue; + p->isRepG0[i] = kProbInitValue; + p->isRepG1[i] = kProbInitValue; + p->isRepG2[i] = kProbInitValue; + } + + { + for (i = 0; i < kNumLenToPosStates; i++) + { + CLzmaProb *probs = p->posSlotEncoder[i]; + unsigned j; + for (j = 0; j < (1 << kNumPosSlotBits); j++) + probs[j] = kProbInitValue; + } + } + { + for (i = 0; i < kNumFullDistances; i++) + p->posEncoders[i] = kProbInitValue; + } + + { + UInt32 num = (UInt32)0x300 << (p->lp + p->lc); + UInt32 k; + CLzmaProb *probs = p->litProbs; + for (k = 0; k < num; k++) + probs[k] = kProbInitValue; + } + + + LenEnc_Init(&p->lenProbs); + LenEnc_Init(&p->repLenProbs); + + p->optEnd = 0; + p->optCur = 0; + + { + for (i = 0; i < kNumOpts; i++) + p->opt[i].price = kInfinityPrice; + } + + p->additionalOffset = 0; + + p->pbMask = ((unsigned)1 << p->pb) - 1; + p->lpMask = ((UInt32)0x100 << p->lp) - ((unsigned)0x100 >> p->lc); + + // p->mf_Failure = False; +} + + +static void LzmaEnc_InitPrices(CLzmaEnc *p) +{ + if (!p->fastMode) + { + FillDistancesPrices(p); + FillAlignPrices(p); + } + + p->lenEnc.tableSize = + p->repLenEnc.tableSize = + p->numFastBytes + 1 - LZMA_MATCH_LEN_MIN; + + p->repLenEncCounter = REP_LEN_COUNT; + + LenPriceEnc_UpdateTables(&p->lenEnc, (unsigned)1 << p->pb, &p->lenProbs, p->ProbPrices); + LenPriceEnc_UpdateTables(&p->repLenEnc, (unsigned)1 << p->pb, &p->repLenProbs, p->ProbPrices); +} + +static SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig) +{ + unsigned i; + for (i = kEndPosModelIndex / 2; i < kDicLogSizeMax; i++) + if (p->dictSize <= ((UInt32)1 << i)) + break; + p->distTableSize = i * 2; + + p->finished = False; + p->result = SZ_OK; + RINOK(LzmaEnc_Alloc(p, keepWindowSize, alloc, allocBig)); + LzmaEnc_Init(p); + LzmaEnc_InitPrices(p); + p->nowPos64 = 0; + return SZ_OK; +} + +static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, + ISzAllocPtr alloc, ISzAllocPtr allocBig) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + MFB.stream = inStream; + p->needInit = 1; + p->rc.outStream = outStream; + return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig); +} + +SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp, + ISeqInStream *inStream, UInt32 keepWindowSize, + ISzAllocPtr alloc, ISzAllocPtr allocBig) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + MFB.stream = inStream; + p->needInit = 1; + return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); +} + +static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen) +{ + MFB.directInput = 1; + MFB.bufferBase = (Byte *)src; + MFB.directInputRem = srcLen; +} + +SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen, + UInt32 keepWindowSize, ISzAllocPtr alloc, ISzAllocPtr allocBig) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + LzmaEnc_SetInputBuf(p, src, srcLen); + p->needInit = 1; + + LzmaEnc_SetDataSize(pp, srcLen); + return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig); +} + +void LzmaEnc_Finish(CLzmaEncHandle pp) +{ + #ifndef _7ZIP_ST + CLzmaEnc *p = (CLzmaEnc *)pp; + if (p->mtMode) + MatchFinderMt_ReleaseStream(&p->matchFinderMt); + #else + UNUSED_VAR(pp); + #endif +} + + +typedef struct +{ + ISeqOutStream vt; + Byte *data; + SizeT rem; + BoolInt overflow; +} CLzmaEnc_SeqOutStreamBuf; + +static size_t SeqOutStreamBuf_Write(const ISeqOutStream *pp, const void *data, size_t size) +{ + CLzmaEnc_SeqOutStreamBuf *p = CONTAINER_FROM_VTBL(pp, CLzmaEnc_SeqOutStreamBuf, vt); + if (p->rem < size) + { + size = p->rem; + p->overflow = True; + } + if (size != 0) + { + memcpy(p->data, data, size); + p->rem -= size; + p->data += size; + } + return size; +} + + +/* +UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp) +{ + const CLzmaEnc *p = (CLzmaEnc *)pp; + return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj); +} +*/ + +const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp) +{ + const CLzmaEnc *p = (CLzmaEnc *)pp; + return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset; +} + + +// (desiredPackSize == 0) is not allowed +SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, BoolInt reInit, + Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize) +{ + CLzmaEnc *p = (CLzmaEnc *)pp; + UInt64 nowPos64; + SRes res; + CLzmaEnc_SeqOutStreamBuf outStream; + + outStream.vt.Write = SeqOutStreamBuf_Write; + outStream.data = dest; + outStream.rem = *destLen; + outStream.overflow = False; + + p->writeEndMark = False; + p->finished = False; + p->result = SZ_OK; + + if (reInit) + LzmaEnc_Init(p); + LzmaEnc_InitPrices(p); + RangeEnc_Init(&p->rc); + p->rc.outStream = &outStream.vt; + nowPos64 = p->nowPos64; + + res = LzmaEnc_CodeOneBlock(p, desiredPackSize, *unpackSize); + + *unpackSize = (UInt32)(p->nowPos64 - nowPos64); + *destLen -= outStream.rem; + if (outStream.overflow) + return SZ_ERROR_OUTPUT_EOF; + + return res; +} + + +MY_NO_INLINE +static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress) +{ + SRes res = SZ_OK; + + #ifndef _7ZIP_ST + Byte allocaDummy[0x300]; + allocaDummy[0] = 0; + allocaDummy[1] = allocaDummy[0]; + #endif + + for (;;) + { + res = LzmaEnc_CodeOneBlock(p, 0, 0); + if (res != SZ_OK || p->finished) + break; + if (progress) + { + res = ICompressProgress_Progress(progress, p->nowPos64, RangeEnc_GetProcessed(&p->rc)); + if (res != SZ_OK) + { + res = SZ_ERROR_PROGRESS; + break; + } + } + } + + LzmaEnc_Finish(p); + + /* + if (res == SZ_OK && !Inline_MatchFinder_IsFinishedOK(&MFB)) + res = SZ_ERROR_FAIL; + } + */ + + return res; +} + + +SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress, + ISzAllocPtr alloc, ISzAllocPtr allocBig) +{ + RINOK(LzmaEnc_Prepare(pp, outStream, inStream, alloc, allocBig)); + return LzmaEnc_Encode2((CLzmaEnc *)pp, progress); +} + + +SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size) +{ + if (*size < LZMA_PROPS_SIZE) + return SZ_ERROR_PARAM; + *size = LZMA_PROPS_SIZE; + { + const CLzmaEnc *p = (const CLzmaEnc *)pp; + const UInt32 dictSize = p->dictSize; + UInt32 v; + props[0] = (Byte)((p->pb * 5 + p->lp) * 9 + p->lc); + + // we write aligned dictionary value to properties for lzma decoder + if (dictSize >= ((UInt32)1 << 21)) + { + const UInt32 kDictMask = ((UInt32)1 << 20) - 1; + v = (dictSize + kDictMask) & ~kDictMask; + if (v < dictSize) + v = dictSize; + } + else + { + unsigned i = 11 * 2; + do + { + v = (UInt32)(2 + (i & 1)) << (i >> 1); + i++; + } + while (v < dictSize); + } + + SetUi32(props + 1, v); + return SZ_OK; + } +} + + +unsigned LzmaEnc_IsWriteEndMark(CLzmaEncHandle pp) +{ + return (unsigned)((CLzmaEnc *)pp)->writeEndMark; +} + + +SRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, + int writeEndMark, ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig) +{ + SRes res; + CLzmaEnc *p = (CLzmaEnc *)pp; + + CLzmaEnc_SeqOutStreamBuf outStream; + + outStream.vt.Write = SeqOutStreamBuf_Write; + outStream.data = dest; + outStream.rem = *destLen; + outStream.overflow = False; + + p->writeEndMark = writeEndMark; + p->rc.outStream = &outStream.vt; + + res = LzmaEnc_MemPrepare(pp, src, srcLen, 0, alloc, allocBig); + + if (res == SZ_OK) + { + res = LzmaEnc_Encode2(p, progress); + if (res == SZ_OK && p->nowPos64 != srcLen) + res = SZ_ERROR_FAIL; + } + + *destLen -= outStream.rem; + if (outStream.overflow) + return SZ_ERROR_OUTPUT_EOF; + return res; +} + + +SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, + const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, + ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig) +{ + CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc); + SRes res; + if (!p) + return SZ_ERROR_MEM; + + res = LzmaEnc_SetProps(p, props); + if (res == SZ_OK) + { + res = LzmaEnc_WriteProperties(p, propsEncoded, propsSize); + if (res == SZ_OK) + res = LzmaEnc_MemEncode(p, dest, destLen, src, srcLen, + writeEndMark, progress, alloc, allocBig); + } + + LzmaEnc_Destroy(p, alloc, allocBig); + return res; +} + + +/* +#ifndef _7ZIP_ST +void LzmaEnc_GetLzThreads(CLzmaEncHandle pp, HANDLE lz_threads[2]) +{ + const CLzmaEnc *p = (CLzmaEnc *)pp; + lz_threads[0] = p->matchFinderMt.hashSync.thread; + lz_threads[1] = p->matchFinderMt.btSync.thread; +} +#endif +*/ diff --git a/deps/LZMA-SDK/C/LzmaEnc.h b/deps/LZMA-SDK/C/LzmaEnc.h index 26757ba6b..bc2ed5042 100644 --- a/deps/LZMA-SDK/C/LzmaEnc.h +++ b/deps/LZMA-SDK/C/LzmaEnc.h @@ -1,78 +1,78 @@ -/* LzmaEnc.h -- LZMA Encoder -2019-10-30 : Igor Pavlov : Public domain */ - -#ifndef __LZMA_ENC_H -#define __LZMA_ENC_H - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -#define LZMA_PROPS_SIZE 5 - -typedef struct _CLzmaEncProps -{ - int level; /* 0 <= level <= 9 */ - UInt32 dictSize; /* (1 << 12) <= dictSize <= (1 << 27) for 32-bit version - (1 << 12) <= dictSize <= (3 << 29) for 64-bit version - default = (1 << 24) */ - int lc; /* 0 <= lc <= 8, default = 3 */ - int lp; /* 0 <= lp <= 4, default = 0 */ - int pb; /* 0 <= pb <= 4, default = 2 */ - int algo; /* 0 - fast, 1 - normal, default = 1 */ - int fb; /* 5 <= fb <= 273, default = 32 */ - int btMode; /* 0 - hashChain Mode, 1 - binTree mode - normal, default = 1 */ - int numHashBytes; /* 2, 3 or 4, default = 4 */ - UInt32 mc; /* 1 <= mc <= (1 << 30), default = 32 */ - unsigned writeEndMark; /* 0 - do not write EOPM, 1 - write EOPM, default = 0 */ - int numThreads; /* 1 or 2, default = 2 */ - - UInt64 reduceSize; /* estimated size of data that will be compressed. default = (UInt64)(Int64)-1. - Encoder uses this value to reduce dictionary size */ - - UInt64 affinity; -} CLzmaEncProps; - -void LzmaEncProps_Init(CLzmaEncProps *p); -void LzmaEncProps_Normalize(CLzmaEncProps *p); -UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2); - - -/* ---------- CLzmaEncHandle Interface ---------- */ - -/* LzmaEnc* functions can return the following exit codes: -SRes: - SZ_OK - OK - SZ_ERROR_MEM - Memory allocation error - SZ_ERROR_PARAM - Incorrect paramater in props - SZ_ERROR_WRITE - ISeqOutStream write callback error - SZ_ERROR_OUTPUT_EOF - output buffer overflow - version with (Byte *) output - SZ_ERROR_PROGRESS - some break from progress callback - SZ_ERROR_THREAD - error in multithreading functions (only for Mt version) -*/ - -typedef void * CLzmaEncHandle; - -CLzmaEncHandle LzmaEnc_Create(ISzAllocPtr alloc); -void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAllocPtr alloc, ISzAllocPtr allocBig); - -SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props); -void LzmaEnc_SetDataSize(CLzmaEncHandle p, UInt64 expectedDataSiize); -SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size); -unsigned LzmaEnc_IsWriteEndMark(CLzmaEncHandle p); - -SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream, - ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig); -SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, - int writeEndMark, ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig); - - -/* ---------- One Call Interface ---------- */ - -SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, - const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, - ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig); - -EXTERN_C_END - -#endif +/* LzmaEnc.h -- LZMA Encoder +2019-10-30 : Igor Pavlov : Public domain */ + +#ifndef __LZMA_ENC_H +#define __LZMA_ENC_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +#define LZMA_PROPS_SIZE 5 + +typedef struct _CLzmaEncProps +{ + int level; /* 0 <= level <= 9 */ + UInt32 dictSize; /* (1 << 12) <= dictSize <= (1 << 27) for 32-bit version + (1 << 12) <= dictSize <= (3 << 29) for 64-bit version + default = (1 << 24) */ + int lc; /* 0 <= lc <= 8, default = 3 */ + int lp; /* 0 <= lp <= 4, default = 0 */ + int pb; /* 0 <= pb <= 4, default = 2 */ + int algo; /* 0 - fast, 1 - normal, default = 1 */ + int fb; /* 5 <= fb <= 273, default = 32 */ + int btMode; /* 0 - hashChain Mode, 1 - binTree mode - normal, default = 1 */ + int numHashBytes; /* 2, 3 or 4, default = 4 */ + UInt32 mc; /* 1 <= mc <= (1 << 30), default = 32 */ + unsigned writeEndMark; /* 0 - do not write EOPM, 1 - write EOPM, default = 0 */ + int numThreads; /* 1 or 2, default = 2 */ + + UInt64 reduceSize; /* estimated size of data that will be compressed. default = (UInt64)(Int64)-1. + Encoder uses this value to reduce dictionary size */ + + UInt64 affinity; +} CLzmaEncProps; + +void LzmaEncProps_Init(CLzmaEncProps *p); +void LzmaEncProps_Normalize(CLzmaEncProps *p); +UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2); + + +/* ---------- CLzmaEncHandle Interface ---------- */ + +/* LzmaEnc* functions can return the following exit codes: +SRes: + SZ_OK - OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_PARAM - Incorrect paramater in props + SZ_ERROR_WRITE - ISeqOutStream write callback error + SZ_ERROR_OUTPUT_EOF - output buffer overflow - version with (Byte *) output + SZ_ERROR_PROGRESS - some break from progress callback + SZ_ERROR_THREAD - error in multithreading functions (only for Mt version) +*/ + +typedef void * CLzmaEncHandle; + +CLzmaEncHandle LzmaEnc_Create(ISzAllocPtr alloc); +void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAllocPtr alloc, ISzAllocPtr allocBig); + +SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props); +void LzmaEnc_SetDataSize(CLzmaEncHandle p, UInt64 expectedDataSiize); +SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size); +unsigned LzmaEnc_IsWriteEndMark(CLzmaEncHandle p); + +SRes LzmaEnc_Encode(CLzmaEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream, + ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig); +SRes LzmaEnc_MemEncode(CLzmaEncHandle p, Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, + int writeEndMark, ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig); + + +/* ---------- One Call Interface ---------- */ + +SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, + const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, + ICompressProgress *progress, ISzAllocPtr alloc, ISzAllocPtr allocBig); + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/LzmaLib.c b/deps/LZMA-SDK/C/LzmaLib.c index c10cf1a0f..706e9e58c 100644 --- a/deps/LZMA-SDK/C/LzmaLib.c +++ b/deps/LZMA-SDK/C/LzmaLib.c @@ -1,40 +1,40 @@ -/* LzmaLib.c -- LZMA library wrapper -2015-06-13 : Igor Pavlov : Public domain */ - -#include "Alloc.h" -#include "LzmaDec.h" -#include "LzmaEnc.h" -#include "LzmaLib.h" - -MY_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen, - unsigned char *outProps, size_t *outPropsSize, - int level, /* 0 <= level <= 9, default = 5 */ - unsigned dictSize, /* use (1 << N) or (3 << N). 4 KB < dictSize <= 128 MB */ - int lc, /* 0 <= lc <= 8, default = 3 */ - int lp, /* 0 <= lp <= 4, default = 0 */ - int pb, /* 0 <= pb <= 4, default = 2 */ - int fb, /* 5 <= fb <= 273, default = 32 */ - int numThreads /* 1 or 2, default = 2 */ -) -{ - CLzmaEncProps props; - LzmaEncProps_Init(&props); - props.level = level; - props.dictSize = dictSize; - props.lc = lc; - props.lp = lp; - props.pb = pb; - props.fb = fb; - props.numThreads = numThreads; - - return LzmaEncode(dest, destLen, src, srcLen, &props, outProps, outPropsSize, 0, - NULL, &g_Alloc, &g_Alloc); -} - - -MY_STDAPI LzmaUncompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t *srcLen, - const unsigned char *props, size_t propsSize) -{ - ELzmaStatus status; - return LzmaDecode(dest, destLen, src, srcLen, props, (unsigned)propsSize, LZMA_FINISH_ANY, &status, &g_Alloc); -} +/* LzmaLib.c -- LZMA library wrapper +2015-06-13 : Igor Pavlov : Public domain */ + +#include "Alloc.h" +#include "LzmaDec.h" +#include "LzmaEnc.h" +#include "LzmaLib.h" + +MY_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen, + unsigned char *outProps, size_t *outPropsSize, + int level, /* 0 <= level <= 9, default = 5 */ + unsigned dictSize, /* use (1 << N) or (3 << N). 4 KB < dictSize <= 128 MB */ + int lc, /* 0 <= lc <= 8, default = 3 */ + int lp, /* 0 <= lp <= 4, default = 0 */ + int pb, /* 0 <= pb <= 4, default = 2 */ + int fb, /* 5 <= fb <= 273, default = 32 */ + int numThreads /* 1 or 2, default = 2 */ +) +{ + CLzmaEncProps props; + LzmaEncProps_Init(&props); + props.level = level; + props.dictSize = dictSize; + props.lc = lc; + props.lp = lp; + props.pb = pb; + props.fb = fb; + props.numThreads = numThreads; + + return LzmaEncode(dest, destLen, src, srcLen, &props, outProps, outPropsSize, 0, + NULL, &g_Alloc, &g_Alloc); +} + + +MY_STDAPI LzmaUncompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t *srcLen, + const unsigned char *props, size_t propsSize) +{ + ELzmaStatus status; + return LzmaDecode(dest, destLen, src, srcLen, props, (unsigned)propsSize, LZMA_FINISH_ANY, &status, &g_Alloc); +} diff --git a/deps/LZMA-SDK/C/LzmaLib.h b/deps/LZMA-SDK/C/LzmaLib.h index 4103e224a..c343a8596 100644 --- a/deps/LZMA-SDK/C/LzmaLib.h +++ b/deps/LZMA-SDK/C/LzmaLib.h @@ -1,138 +1,138 @@ -/* LzmaLib.h -- LZMA library interface -2021-04-03 : Igor Pavlov : Public domain */ - -#ifndef __LZMA_LIB_H -#define __LZMA_LIB_H - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -#define MY_STDAPI int MY_STD_CALL - -#define LZMA_PROPS_SIZE 5 - -/* -RAM requirements for LZMA: - for compression: (dictSize * 11.5 + 6 MB) + state_size - for decompression: dictSize + state_size - state_size = (4 + (1.5 << (lc + lp))) KB - by default (lc=3, lp=0), state_size = 16 KB. - -LZMA properties (5 bytes) format - Offset Size Description - 0 1 lc, lp and pb in encoded form. - 1 4 dictSize (little endian). -*/ - -/* -LzmaCompress ------------- - -outPropsSize - - In: the pointer to the size of outProps buffer; *outPropsSize = LZMA_PROPS_SIZE = 5. - Out: the pointer to the size of written properties in outProps buffer; *outPropsSize = LZMA_PROPS_SIZE = 5. - - LZMA Encoder will use defult values for any parameter, if it is - -1 for any from: level, loc, lp, pb, fb, numThreads - 0 for dictSize - -level - compression level: 0 <= level <= 9; - - level dictSize algo fb - 0: 64 KB 0 32 - 1: 256 KB 0 32 - 2: 1 MB 0 32 - 3: 4 MB 0 32 - 4: 16 MB 0 32 - 5: 16 MB 1 32 - 6: 32 MB 1 32 - 7: 32 MB 1 64 - 8: 64 MB 1 64 - 9: 64 MB 1 64 - - The default value for "level" is 5. - - algo = 0 means fast method - algo = 1 means normal method - -dictSize - The dictionary size in bytes. The maximum value is - 128 MB = (1 << 27) bytes for 32-bit version - 1 GB = (1 << 30) bytes for 64-bit version - The default value is 16 MB = (1 << 24) bytes. - It's recommended to use the dictionary that is larger than 4 KB and - that can be calculated as (1 << N) or (3 << N) sizes. - -lc - The number of literal context bits (high bits of previous literal). - It can be in the range from 0 to 8. The default value is 3. - Sometimes lc=4 gives the gain for big files. - -lp - The number of literal pos bits (low bits of current position for literals). - It can be in the range from 0 to 4. The default value is 0. - The lp switch is intended for periodical data when the period is equal to 2^lp. - For example, for 32-bit (4 bytes) periodical data you can use lp=2. Often it's - better to set lc=0, if you change lp switch. - -pb - The number of pos bits (low bits of current position). - It can be in the range from 0 to 4. The default value is 2. - The pb switch is intended for periodical data when the period is equal 2^pb. - -fb - Word size (the number of fast bytes). - It can be in the range from 5 to 273. The default value is 32. - Usually, a big number gives a little bit better compression ratio and - slower compression process. - -numThreads - The number of thereads. 1 or 2. The default value is 2. - Fast mode (algo = 0) can use only 1 thread. - -In: - dest - output data buffer - destLen - output data buffer size - src - input data - srcLen - input data size -Out: - destLen - processed output size -Returns: - SZ_OK - OK - SZ_ERROR_MEM - Memory allocation error - SZ_ERROR_PARAM - Incorrect paramater - SZ_ERROR_OUTPUT_EOF - output buffer overflow - SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) -*/ - -MY_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen, - unsigned char *outProps, size_t *outPropsSize, /* *outPropsSize must be = 5 */ - int level, /* 0 <= level <= 9, default = 5 */ - unsigned dictSize, /* default = (1 << 24) */ - int lc, /* 0 <= lc <= 8, default = 3 */ - int lp, /* 0 <= lp <= 4, default = 0 */ - int pb, /* 0 <= pb <= 4, default = 2 */ - int fb, /* 5 <= fb <= 273, default = 32 */ - int numThreads /* 1 or 2, default = 2 */ - ); - -/* -LzmaUncompress --------------- -In: - dest - output data buffer - destLen - output data buffer size - src - input data - srcLen - input data size -Out: - destLen - processed output size - srcLen - processed input size -Returns: - SZ_OK - OK - SZ_ERROR_DATA - Data error - SZ_ERROR_MEM - Memory allocation arror - SZ_ERROR_UNSUPPORTED - Unsupported properties - SZ_ERROR_INPUT_EOF - it needs more bytes in input buffer (src) -*/ - -MY_STDAPI LzmaUncompress(unsigned char *dest, size_t *destLen, const unsigned char *src, SizeT *srcLen, - const unsigned char *props, size_t propsSize); - -EXTERN_C_END - -#endif +/* LzmaLib.h -- LZMA library interface +2021-04-03 : Igor Pavlov : Public domain */ + +#ifndef __LZMA_LIB_H +#define __LZMA_LIB_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +#define MY_STDAPI int MY_STD_CALL + +#define LZMA_PROPS_SIZE 5 + +/* +RAM requirements for LZMA: + for compression: (dictSize * 11.5 + 6 MB) + state_size + for decompression: dictSize + state_size + state_size = (4 + (1.5 << (lc + lp))) KB + by default (lc=3, lp=0), state_size = 16 KB. + +LZMA properties (5 bytes) format + Offset Size Description + 0 1 lc, lp and pb in encoded form. + 1 4 dictSize (little endian). +*/ + +/* +LzmaCompress +------------ + +outPropsSize - + In: the pointer to the size of outProps buffer; *outPropsSize = LZMA_PROPS_SIZE = 5. + Out: the pointer to the size of written properties in outProps buffer; *outPropsSize = LZMA_PROPS_SIZE = 5. + + LZMA Encoder will use defult values for any parameter, if it is + -1 for any from: level, loc, lp, pb, fb, numThreads + 0 for dictSize + +level - compression level: 0 <= level <= 9; + + level dictSize algo fb + 0: 64 KB 0 32 + 1: 256 KB 0 32 + 2: 1 MB 0 32 + 3: 4 MB 0 32 + 4: 16 MB 0 32 + 5: 16 MB 1 32 + 6: 32 MB 1 32 + 7: 32 MB 1 64 + 8: 64 MB 1 64 + 9: 64 MB 1 64 + + The default value for "level" is 5. + + algo = 0 means fast method + algo = 1 means normal method + +dictSize - The dictionary size in bytes. The maximum value is + 128 MB = (1 << 27) bytes for 32-bit version + 1 GB = (1 << 30) bytes for 64-bit version + The default value is 16 MB = (1 << 24) bytes. + It's recommended to use the dictionary that is larger than 4 KB and + that can be calculated as (1 << N) or (3 << N) sizes. + +lc - The number of literal context bits (high bits of previous literal). + It can be in the range from 0 to 8. The default value is 3. + Sometimes lc=4 gives the gain for big files. + +lp - The number of literal pos bits (low bits of current position for literals). + It can be in the range from 0 to 4. The default value is 0. + The lp switch is intended for periodical data when the period is equal to 2^lp. + For example, for 32-bit (4 bytes) periodical data you can use lp=2. Often it's + better to set lc=0, if you change lp switch. + +pb - The number of pos bits (low bits of current position). + It can be in the range from 0 to 4. The default value is 2. + The pb switch is intended for periodical data when the period is equal 2^pb. + +fb - Word size (the number of fast bytes). + It can be in the range from 5 to 273. The default value is 32. + Usually, a big number gives a little bit better compression ratio and + slower compression process. + +numThreads - The number of thereads. 1 or 2. The default value is 2. + Fast mode (algo = 0) can use only 1 thread. + +In: + dest - output data buffer + destLen - output data buffer size + src - input data + srcLen - input data size +Out: + destLen - processed output size +Returns: + SZ_OK - OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_PARAM - Incorrect paramater + SZ_ERROR_OUTPUT_EOF - output buffer overflow + SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) +*/ + +MY_STDAPI LzmaCompress(unsigned char *dest, size_t *destLen, const unsigned char *src, size_t srcLen, + unsigned char *outProps, size_t *outPropsSize, /* *outPropsSize must be = 5 */ + int level, /* 0 <= level <= 9, default = 5 */ + unsigned dictSize, /* default = (1 << 24) */ + int lc, /* 0 <= lc <= 8, default = 3 */ + int lp, /* 0 <= lp <= 4, default = 0 */ + int pb, /* 0 <= pb <= 4, default = 2 */ + int fb, /* 5 <= fb <= 273, default = 32 */ + int numThreads /* 1 or 2, default = 2 */ + ); + +/* +LzmaUncompress +-------------- +In: + dest - output data buffer + destLen - output data buffer size + src - input data + srcLen - input data size +Out: + destLen - processed output size + srcLen - processed input size +Returns: + SZ_OK - OK + SZ_ERROR_DATA - Data error + SZ_ERROR_MEM - Memory allocation arror + SZ_ERROR_UNSUPPORTED - Unsupported properties + SZ_ERROR_INPUT_EOF - it needs more bytes in input buffer (src) +*/ + +MY_STDAPI LzmaUncompress(unsigned char *dest, size_t *destLen, const unsigned char *src, SizeT *srcLen, + const unsigned char *props, size_t propsSize); + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/MtCoder.c b/deps/LZMA-SDK/C/MtCoder.c index 85444f484..99dc9090a 100644 --- a/deps/LZMA-SDK/C/MtCoder.c +++ b/deps/LZMA-SDK/C/MtCoder.c @@ -1,600 +1,595 @@ -/* MtCoder.c -- Multi-thread Coder -2021-02-09 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include "MtCoder.h" - -#ifndef _7ZIP_ST - -static SRes MtProgressThunk_Progress(const ICompressProgress *pp, UInt64 inSize, UInt64 outSize) -{ - CMtProgressThunk *thunk = CONTAINER_FROM_VTBL(pp, CMtProgressThunk, vt); - UInt64 inSize2 = 0; - UInt64 outSize2 = 0; - if (inSize != (UInt64)(Int64)-1) - { - inSize2 = inSize - thunk->inSize; - thunk->inSize = inSize; - } - if (outSize != (UInt64)(Int64)-1) - { - outSize2 = outSize - thunk->outSize; - thunk->outSize = outSize; - } - return MtProgress_ProgressAdd(thunk->mtProgress, inSize2, outSize2); -} - - -void MtProgressThunk_CreateVTable(CMtProgressThunk *p) -{ - p->vt.Progress = MtProgressThunk_Progress; -} - - - -#define RINOK_THREAD(x) { if ((x) != 0) return SZ_ERROR_THREAD; } - - -static WRes ArEvent_OptCreate_And_Reset(CEvent *p) -{ - if (Event_IsCreated(p)) - return Event_Reset(p); - return AutoResetEvent_CreateNotSignaled(p); -} - - -static THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE ThreadFunc(void *pp); - - -static SRes MtCoderThread_CreateAndStart(CMtCoderThread *t) -{ - WRes wres = ArEvent_OptCreate_And_Reset(&t->startEvent); - if (wres == 0) - { - t->stop = False; - if (!Thread_WasCreated(&t->thread)) - wres = Thread_Create(&t->thread, ThreadFunc, t); - if (wres == 0) - wres = Event_Set(&t->startEvent); - } - if (wres == 0) - return SZ_OK; - return MY_SRes_HRESULT_FROM_WRes(wres); -} - - -static void MtCoderThread_Destruct(CMtCoderThread *t) -{ - if (Thread_WasCreated(&t->thread)) - { - t->stop = 1; - Event_Set(&t->startEvent); - Thread_Wait_Close(&t->thread); - } - - Event_Close(&t->startEvent); - - if (t->inBuf) - { - ISzAlloc_Free(t->mtCoder->allocBig, t->inBuf); - t->inBuf = NULL; - } -} - - - -static SRes FullRead(ISeqInStream *stream, Byte *data, size_t *processedSize) -{ - size_t size = *processedSize; - *processedSize = 0; - while (size != 0) - { - size_t cur = size; - SRes res = ISeqInStream_Read(stream, data, &cur); - *processedSize += cur; - data += cur; - size -= cur; - RINOK(res); - if (cur == 0) - return SZ_OK; - } - return SZ_OK; -} - - -/* - ThreadFunc2() returns: - SZ_OK - in all normal cases (even for stream error or memory allocation error) - SZ_ERROR_THREAD - in case of failure in system synch function -*/ - -static SRes ThreadFunc2(CMtCoderThread *t) -{ - CMtCoder *mtc = t->mtCoder; - - for (;;) - { - unsigned bi; - SRes res; - SRes res2; - BoolInt finished; - unsigned bufIndex; - size_t size; - const Byte *inData; - UInt64 readProcessed = 0; - - RINOK_THREAD(Event_Wait(&mtc->readEvent)) - - /* after Event_Wait(&mtc->readEvent) we must call Event_Set(&mtc->readEvent) in any case to unlock another threads */ - - if (mtc->stopReading) - { - return Event_Set(&mtc->readEvent) == 0 ? SZ_OK : SZ_ERROR_THREAD; - } - - res = MtProgress_GetError(&mtc->mtProgress); - - size = 0; - inData = NULL; - finished = True; - - if (res == SZ_OK) - { - size = mtc->blockSize; - if (mtc->inStream) - { - if (!t->inBuf) - { - t->inBuf = (Byte *)ISzAlloc_Alloc(mtc->allocBig, mtc->blockSize); - if (!t->inBuf) - res = SZ_ERROR_MEM; - } - if (res == SZ_OK) - { - res = FullRead(mtc->inStream, t->inBuf, &size); - readProcessed = mtc->readProcessed + size; - mtc->readProcessed = readProcessed; - } - if (res != SZ_OK) - { - mtc->readRes = res; - /* after reading error - we can stop encoding of previous blocks */ - MtProgress_SetError(&mtc->mtProgress, res); - } - else - finished = (size != mtc->blockSize); - } - else - { - size_t rem; - readProcessed = mtc->readProcessed; - rem = mtc->inDataSize - (size_t)readProcessed; - if (size > rem) - size = rem; - inData = mtc->inData + (size_t)readProcessed; - readProcessed += size; - mtc->readProcessed = readProcessed; - finished = (mtc->inDataSize == (size_t)readProcessed); - } - } - - /* we must get some block from blocksSemaphore before Event_Set(&mtc->readEvent) */ - - res2 = SZ_OK; - - if (Semaphore_Wait(&mtc->blocksSemaphore) != 0) - { - res2 = SZ_ERROR_THREAD; - if (res == SZ_OK) - { - res = res2; - // MtProgress_SetError(&mtc->mtProgress, res); - } - } - - bi = mtc->blockIndex; - - if (++mtc->blockIndex >= mtc->numBlocksMax) - mtc->blockIndex = 0; - - bufIndex = (unsigned)(int)-1; - - if (res == SZ_OK) - res = MtProgress_GetError(&mtc->mtProgress); - - if (res != SZ_OK) - finished = True; - - if (!finished) - { - if (mtc->numStartedThreads < mtc->numStartedThreadsLimit - && mtc->expectedDataSize != readProcessed) - { - res = MtCoderThread_CreateAndStart(&mtc->threads[mtc->numStartedThreads]); - if (res == SZ_OK) - mtc->numStartedThreads++; - else - { - MtProgress_SetError(&mtc->mtProgress, res); - finished = True; - } - } - } - - if (finished) - mtc->stopReading = True; - - RINOK_THREAD(Event_Set(&mtc->readEvent)) - - if (res2 != SZ_OK) - return res2; - - if (res == SZ_OK) - { - CriticalSection_Enter(&mtc->cs); - bufIndex = mtc->freeBlockHead; - mtc->freeBlockHead = mtc->freeBlockList[bufIndex]; - CriticalSection_Leave(&mtc->cs); - - res = mtc->mtCallback->Code(mtc->mtCallbackObject, t->index, bufIndex, - mtc->inStream ? t->inBuf : inData, size, finished); - - // MtProgress_Reinit(&mtc->mtProgress, t->index); - - if (res != SZ_OK) - MtProgress_SetError(&mtc->mtProgress, res); - } - - { - CMtCoderBlock *block = &mtc->blocks[bi]; - block->res = res; - block->bufIndex = bufIndex; - block->finished = finished; - } - - #ifdef MTCODER__USE_WRITE_THREAD - RINOK_THREAD(Event_Set(&mtc->writeEvents[bi])) - #else - { - unsigned wi; - { - CriticalSection_Enter(&mtc->cs); - wi = mtc->writeIndex; - if (wi == bi) - mtc->writeIndex = (unsigned)(int)-1; - else - mtc->ReadyBlocks[bi] = True; - CriticalSection_Leave(&mtc->cs); - } - - if (wi != bi) - { - if (res != SZ_OK || finished) - return 0; - continue; - } - - if (mtc->writeRes != SZ_OK) - res = mtc->writeRes; - - for (;;) - { - if (res == SZ_OK && bufIndex != (unsigned)(int)-1) - { - res = mtc->mtCallback->Write(mtc->mtCallbackObject, bufIndex); - if (res != SZ_OK) - { - mtc->writeRes = res; - MtProgress_SetError(&mtc->mtProgress, res); - } - } - - if (++wi >= mtc->numBlocksMax) - wi = 0; - { - BoolInt isReady; - - CriticalSection_Enter(&mtc->cs); - - if (bufIndex != (unsigned)(int)-1) - { - mtc->freeBlockList[bufIndex] = mtc->freeBlockHead; - mtc->freeBlockHead = bufIndex; - } - - isReady = mtc->ReadyBlocks[wi]; - - if (isReady) - mtc->ReadyBlocks[wi] = False; - else - mtc->writeIndex = wi; - - CriticalSection_Leave(&mtc->cs); - - RINOK_THREAD(Semaphore_Release1(&mtc->blocksSemaphore)) - - if (!isReady) - break; - } - - { - CMtCoderBlock *block = &mtc->blocks[wi]; - if (res == SZ_OK && block->res != SZ_OK) - res = block->res; - bufIndex = block->bufIndex; - finished = block->finished; - } - } - } - #endif - - if (finished || res != SZ_OK) - return 0; - } -} - - -static THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE ThreadFunc(void *pp) -{ - CMtCoderThread *t = (CMtCoderThread *)pp; - for (;;) - { - if (Event_Wait(&t->startEvent) != 0) - return (THREAD_FUNC_RET_TYPE)SZ_ERROR_THREAD; - if (t->stop) - return 0; - { - SRes res = ThreadFunc2(t); - CMtCoder *mtc = t->mtCoder; - if (res != SZ_OK) - { - MtProgress_SetError(&mtc->mtProgress, res); - } - - #ifndef MTCODER__USE_WRITE_THREAD - { - unsigned numFinished = (unsigned)InterlockedIncrement(&mtc->numFinishedThreads); - if (numFinished == mtc->numStartedThreads) - if (Event_Set(&mtc->finishedEvent) != 0) - return (THREAD_FUNC_RET_TYPE)SZ_ERROR_THREAD; - } - #endif - } - } -} - - - -void MtCoder_Construct(CMtCoder *p) -{ - unsigned i; - - p->blockSize = 0; - p->numThreadsMax = 0; - p->expectedDataSize = (UInt64)(Int64)-1; - - p->inStream = NULL; - p->inData = NULL; - p->inDataSize = 0; - - p->progress = NULL; - p->allocBig = NULL; - - p->mtCallback = NULL; - p->mtCallbackObject = NULL; - - p->allocatedBufsSize = 0; - - Event_Construct(&p->readEvent); - Semaphore_Construct(&p->blocksSemaphore); - - for (i = 0; i < MTCODER__THREADS_MAX; i++) - { - CMtCoderThread *t = &p->threads[i]; - t->mtCoder = p; - t->index = i; - t->inBuf = NULL; - t->stop = False; - Event_Construct(&t->startEvent); - Thread_Construct(&t->thread); - } - - #ifdef MTCODER__USE_WRITE_THREAD - for (i = 0; i < MTCODER__BLOCKS_MAX; i++) - Event_Construct(&p->writeEvents[i]); - #else - Event_Construct(&p->finishedEvent); - #endif - - CriticalSection_Init(&p->cs); - CriticalSection_Init(&p->mtProgress.cs); -} - - - - -static void MtCoder_Free(CMtCoder *p) -{ - unsigned i; - - /* - p->stopReading = True; - if (Event_IsCreated(&p->readEvent)) - Event_Set(&p->readEvent); - */ - - for (i = 0; i < MTCODER__THREADS_MAX; i++) - MtCoderThread_Destruct(&p->threads[i]); - - Event_Close(&p->readEvent); - Semaphore_Close(&p->blocksSemaphore); - - #ifdef MTCODER__USE_WRITE_THREAD - for (i = 0; i < MTCODER__BLOCKS_MAX; i++) - Event_Close(&p->writeEvents[i]); - #else - Event_Close(&p->finishedEvent); - #endif -} - - -void MtCoder_Destruct(CMtCoder *p) -{ - MtCoder_Free(p); - - CriticalSection_Delete(&p->cs); - CriticalSection_Delete(&p->mtProgress.cs); -} - - -SRes MtCoder_Code(CMtCoder *p) -{ - unsigned numThreads = p->numThreadsMax; - unsigned numBlocksMax; - unsigned i; - SRes res = SZ_OK; - - if (numThreads > MTCODER__THREADS_MAX) - numThreads = MTCODER__THREADS_MAX; - numBlocksMax = MTCODER__GET_NUM_BLOCKS_FROM_THREADS(numThreads); - - if (p->blockSize < ((UInt32)1 << 26)) numBlocksMax++; - if (p->blockSize < ((UInt32)1 << 24)) numBlocksMax++; - if (p->blockSize < ((UInt32)1 << 22)) numBlocksMax++; - - if (numBlocksMax > MTCODER__BLOCKS_MAX) - numBlocksMax = MTCODER__BLOCKS_MAX; - - if (p->blockSize != p->allocatedBufsSize) - { - for (i = 0; i < MTCODER__THREADS_MAX; i++) - { - CMtCoderThread *t = &p->threads[i]; - if (t->inBuf) - { - ISzAlloc_Free(p->allocBig, t->inBuf); - t->inBuf = NULL; - } - } - p->allocatedBufsSize = p->blockSize; - } - - p->readRes = SZ_OK; - - MtProgress_Init(&p->mtProgress, p->progress); - - #ifdef MTCODER__USE_WRITE_THREAD - for (i = 0; i < numBlocksMax; i++) - { - RINOK_THREAD(ArEvent_OptCreate_And_Reset(&p->writeEvents[i])); - } - #else - RINOK_THREAD(ArEvent_OptCreate_And_Reset(&p->finishedEvent)); - #endif - - { - RINOK_THREAD(ArEvent_OptCreate_And_Reset(&p->readEvent)); - - if (Semaphore_IsCreated(&p->blocksSemaphore)) - { - RINOK_THREAD(Semaphore_Close(&p->blocksSemaphore)); - } - RINOK_THREAD(Semaphore_Create(&p->blocksSemaphore, numBlocksMax, numBlocksMax)); - } - - for (i = 0; i < MTCODER__BLOCKS_MAX - 1; i++) - p->freeBlockList[i] = i + 1; - p->freeBlockList[MTCODER__BLOCKS_MAX - 1] = (unsigned)(int)-1; - p->freeBlockHead = 0; - - p->readProcessed = 0; - p->blockIndex = 0; - p->numBlocksMax = numBlocksMax; - p->stopReading = False; - - #ifndef MTCODER__USE_WRITE_THREAD - p->writeIndex = 0; - p->writeRes = SZ_OK; - for (i = 0; i < MTCODER__BLOCKS_MAX; i++) - p->ReadyBlocks[i] = False; - p->numFinishedThreads = 0; - #endif - - p->numStartedThreadsLimit = numThreads; - p->numStartedThreads = 0; - - // for (i = 0; i < numThreads; i++) - { - CMtCoderThread *nextThread = &p->threads[p->numStartedThreads++]; - RINOK(MtCoderThread_CreateAndStart(nextThread)); - } - - RINOK_THREAD(Event_Set(&p->readEvent)) - - #ifdef MTCODER__USE_WRITE_THREAD - { - unsigned bi = 0; - - for (;; bi++) - { - if (bi >= numBlocksMax) - bi = 0; - - RINOK_THREAD(Event_Wait(&p->writeEvents[bi])) - - { - const CMtCoderBlock *block = &p->blocks[bi]; - unsigned bufIndex = block->bufIndex; - BoolInt finished = block->finished; - if (res == SZ_OK && block->res != SZ_OK) - res = block->res; - - if (bufIndex != (unsigned)(int)-1) - { - if (res == SZ_OK) - { - res = p->mtCallback->Write(p->mtCallbackObject, bufIndex); - if (res != SZ_OK) - MtProgress_SetError(&p->mtProgress, res); - } - - CriticalSection_Enter(&p->cs); - { - p->freeBlockList[bufIndex] = p->freeBlockHead; - p->freeBlockHead = bufIndex; - } - CriticalSection_Leave(&p->cs); - } - - RINOK_THREAD(Semaphore_Release1(&p->blocksSemaphore)) - - if (finished) - break; - } - } - } - #else - { - WRes wres = Event_Wait(&p->finishedEvent); - res = MY_SRes_HRESULT_FROM_WRes(wres); - } - #endif - - if (res == SZ_OK) - res = p->readRes; - - if (res == SZ_OK) - res = p->mtProgress.res; - - #ifndef MTCODER__USE_WRITE_THREAD - if (res == SZ_OK) - res = p->writeRes; - #endif - - if (res != SZ_OK) - MtCoder_Free(p); - return res; -} - -#endif +/* MtCoder.c -- Multi-thread Coder +2021-12-21 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "MtCoder.h" + +#ifndef _7ZIP_ST + +static SRes MtProgressThunk_Progress(const ICompressProgress *pp, UInt64 inSize, UInt64 outSize) +{ + CMtProgressThunk *thunk = CONTAINER_FROM_VTBL(pp, CMtProgressThunk, vt); + UInt64 inSize2 = 0; + UInt64 outSize2 = 0; + if (inSize != (UInt64)(Int64)-1) + { + inSize2 = inSize - thunk->inSize; + thunk->inSize = inSize; + } + if (outSize != (UInt64)(Int64)-1) + { + outSize2 = outSize - thunk->outSize; + thunk->outSize = outSize; + } + return MtProgress_ProgressAdd(thunk->mtProgress, inSize2, outSize2); +} + + +void MtProgressThunk_CreateVTable(CMtProgressThunk *p) +{ + p->vt.Progress = MtProgressThunk_Progress; +} + + + +#define RINOK_THREAD(x) { if ((x) != 0) return SZ_ERROR_THREAD; } + + +static WRes ArEvent_OptCreate_And_Reset(CEvent *p) +{ + if (Event_IsCreated(p)) + return Event_Reset(p); + return AutoResetEvent_CreateNotSignaled(p); +} + + +static THREAD_FUNC_DECL ThreadFunc(void *pp); + + +static SRes MtCoderThread_CreateAndStart(CMtCoderThread *t) +{ + WRes wres = ArEvent_OptCreate_And_Reset(&t->startEvent); + if (wres == 0) + { + t->stop = False; + if (!Thread_WasCreated(&t->thread)) + wres = Thread_Create(&t->thread, ThreadFunc, t); + if (wres == 0) + wres = Event_Set(&t->startEvent); + } + if (wres == 0) + return SZ_OK; + return MY_SRes_HRESULT_FROM_WRes(wres); +} + + +static void MtCoderThread_Destruct(CMtCoderThread *t) +{ + if (Thread_WasCreated(&t->thread)) + { + t->stop = 1; + Event_Set(&t->startEvent); + Thread_Wait_Close(&t->thread); + } + + Event_Close(&t->startEvent); + + if (t->inBuf) + { + ISzAlloc_Free(t->mtCoder->allocBig, t->inBuf); + t->inBuf = NULL; + } +} + + + +static SRes FullRead(ISeqInStream *stream, Byte *data, size_t *processedSize) +{ + size_t size = *processedSize; + *processedSize = 0; + while (size != 0) + { + size_t cur = size; + SRes res = ISeqInStream_Read(stream, data, &cur); + *processedSize += cur; + data += cur; + size -= cur; + RINOK(res); + if (cur == 0) + return SZ_OK; + } + return SZ_OK; +} + + +/* + ThreadFunc2() returns: + SZ_OK - in all normal cases (even for stream error or memory allocation error) + SZ_ERROR_THREAD - in case of failure in system synch function +*/ + +static SRes ThreadFunc2(CMtCoderThread *t) +{ + CMtCoder *mtc = t->mtCoder; + + for (;;) + { + unsigned bi; + SRes res; + SRes res2; + BoolInt finished; + unsigned bufIndex; + size_t size; + const Byte *inData; + UInt64 readProcessed = 0; + + RINOK_THREAD(Event_Wait(&mtc->readEvent)) + + /* after Event_Wait(&mtc->readEvent) we must call Event_Set(&mtc->readEvent) in any case to unlock another threads */ + + if (mtc->stopReading) + { + return Event_Set(&mtc->readEvent) == 0 ? SZ_OK : SZ_ERROR_THREAD; + } + + res = MtProgress_GetError(&mtc->mtProgress); + + size = 0; + inData = NULL; + finished = True; + + if (res == SZ_OK) + { + size = mtc->blockSize; + if (mtc->inStream) + { + if (!t->inBuf) + { + t->inBuf = (Byte *)ISzAlloc_Alloc(mtc->allocBig, mtc->blockSize); + if (!t->inBuf) + res = SZ_ERROR_MEM; + } + if (res == SZ_OK) + { + res = FullRead(mtc->inStream, t->inBuf, &size); + readProcessed = mtc->readProcessed + size; + mtc->readProcessed = readProcessed; + } + if (res != SZ_OK) + { + mtc->readRes = res; + /* after reading error - we can stop encoding of previous blocks */ + MtProgress_SetError(&mtc->mtProgress, res); + } + else + finished = (size != mtc->blockSize); + } + else + { + size_t rem; + readProcessed = mtc->readProcessed; + rem = mtc->inDataSize - (size_t)readProcessed; + if (size > rem) + size = rem; + inData = mtc->inData + (size_t)readProcessed; + readProcessed += size; + mtc->readProcessed = readProcessed; + finished = (mtc->inDataSize == (size_t)readProcessed); + } + } + + /* we must get some block from blocksSemaphore before Event_Set(&mtc->readEvent) */ + + res2 = SZ_OK; + + if (Semaphore_Wait(&mtc->blocksSemaphore) != 0) + { + res2 = SZ_ERROR_THREAD; + if (res == SZ_OK) + { + res = res2; + // MtProgress_SetError(&mtc->mtProgress, res); + } + } + + bi = mtc->blockIndex; + + if (++mtc->blockIndex >= mtc->numBlocksMax) + mtc->blockIndex = 0; + + bufIndex = (unsigned)(int)-1; + + if (res == SZ_OK) + res = MtProgress_GetError(&mtc->mtProgress); + + if (res != SZ_OK) + finished = True; + + if (!finished) + { + if (mtc->numStartedThreads < mtc->numStartedThreadsLimit + && mtc->expectedDataSize != readProcessed) + { + res = MtCoderThread_CreateAndStart(&mtc->threads[mtc->numStartedThreads]); + if (res == SZ_OK) + mtc->numStartedThreads++; + else + { + MtProgress_SetError(&mtc->mtProgress, res); + finished = True; + } + } + } + + if (finished) + mtc->stopReading = True; + + RINOK_THREAD(Event_Set(&mtc->readEvent)) + + if (res2 != SZ_OK) + return res2; + + if (res == SZ_OK) + { + CriticalSection_Enter(&mtc->cs); + bufIndex = mtc->freeBlockHead; + mtc->freeBlockHead = mtc->freeBlockList[bufIndex]; + CriticalSection_Leave(&mtc->cs); + + res = mtc->mtCallback->Code(mtc->mtCallbackObject, t->index, bufIndex, + mtc->inStream ? t->inBuf : inData, size, finished); + + // MtProgress_Reinit(&mtc->mtProgress, t->index); + + if (res != SZ_OK) + MtProgress_SetError(&mtc->mtProgress, res); + } + + { + CMtCoderBlock *block = &mtc->blocks[bi]; + block->res = res; + block->bufIndex = bufIndex; + block->finished = finished; + } + + #ifdef MTCODER__USE_WRITE_THREAD + RINOK_THREAD(Event_Set(&mtc->writeEvents[bi])) + #else + { + unsigned wi; + { + CriticalSection_Enter(&mtc->cs); + wi = mtc->writeIndex; + if (wi == bi) + mtc->writeIndex = (unsigned)(int)-1; + else + mtc->ReadyBlocks[bi] = True; + CriticalSection_Leave(&mtc->cs); + } + + if (wi != bi) + { + if (res != SZ_OK || finished) + return 0; + continue; + } + + if (mtc->writeRes != SZ_OK) + res = mtc->writeRes; + + for (;;) + { + if (res == SZ_OK && bufIndex != (unsigned)(int)-1) + { + res = mtc->mtCallback->Write(mtc->mtCallbackObject, bufIndex); + if (res != SZ_OK) + { + mtc->writeRes = res; + MtProgress_SetError(&mtc->mtProgress, res); + } + } + + if (++wi >= mtc->numBlocksMax) + wi = 0; + { + BoolInt isReady; + + CriticalSection_Enter(&mtc->cs); + + if (bufIndex != (unsigned)(int)-1) + { + mtc->freeBlockList[bufIndex] = mtc->freeBlockHead; + mtc->freeBlockHead = bufIndex; + } + + isReady = mtc->ReadyBlocks[wi]; + + if (isReady) + mtc->ReadyBlocks[wi] = False; + else + mtc->writeIndex = wi; + + CriticalSection_Leave(&mtc->cs); + + RINOK_THREAD(Semaphore_Release1(&mtc->blocksSemaphore)) + + if (!isReady) + break; + } + + { + CMtCoderBlock *block = &mtc->blocks[wi]; + if (res == SZ_OK && block->res != SZ_OK) + res = block->res; + bufIndex = block->bufIndex; + finished = block->finished; + } + } + } + #endif + + if (finished || res != SZ_OK) + return 0; + } +} + + +static THREAD_FUNC_DECL ThreadFunc(void *pp) +{ + CMtCoderThread *t = (CMtCoderThread *)pp; + for (;;) + { + if (Event_Wait(&t->startEvent) != 0) + return (THREAD_FUNC_RET_TYPE)SZ_ERROR_THREAD; + if (t->stop) + return 0; + { + SRes res = ThreadFunc2(t); + CMtCoder *mtc = t->mtCoder; + if (res != SZ_OK) + { + MtProgress_SetError(&mtc->mtProgress, res); + } + + #ifndef MTCODER__USE_WRITE_THREAD + { + unsigned numFinished = (unsigned)InterlockedIncrement(&mtc->numFinishedThreads); + if (numFinished == mtc->numStartedThreads) + if (Event_Set(&mtc->finishedEvent) != 0) + return (THREAD_FUNC_RET_TYPE)SZ_ERROR_THREAD; + } + #endif + } + } +} + + + +void MtCoder_Construct(CMtCoder *p) +{ + unsigned i; + + p->blockSize = 0; + p->numThreadsMax = 0; + p->expectedDataSize = (UInt64)(Int64)-1; + + p->inStream = NULL; + p->inData = NULL; + p->inDataSize = 0; + + p->progress = NULL; + p->allocBig = NULL; + + p->mtCallback = NULL; + p->mtCallbackObject = NULL; + + p->allocatedBufsSize = 0; + + Event_Construct(&p->readEvent); + Semaphore_Construct(&p->blocksSemaphore); + + for (i = 0; i < MTCODER__THREADS_MAX; i++) + { + CMtCoderThread *t = &p->threads[i]; + t->mtCoder = p; + t->index = i; + t->inBuf = NULL; + t->stop = False; + Event_Construct(&t->startEvent); + Thread_Construct(&t->thread); + } + + #ifdef MTCODER__USE_WRITE_THREAD + for (i = 0; i < MTCODER__BLOCKS_MAX; i++) + Event_Construct(&p->writeEvents[i]); + #else + Event_Construct(&p->finishedEvent); + #endif + + CriticalSection_Init(&p->cs); + CriticalSection_Init(&p->mtProgress.cs); +} + + + + +static void MtCoder_Free(CMtCoder *p) +{ + unsigned i; + + /* + p->stopReading = True; + if (Event_IsCreated(&p->readEvent)) + Event_Set(&p->readEvent); + */ + + for (i = 0; i < MTCODER__THREADS_MAX; i++) + MtCoderThread_Destruct(&p->threads[i]); + + Event_Close(&p->readEvent); + Semaphore_Close(&p->blocksSemaphore); + + #ifdef MTCODER__USE_WRITE_THREAD + for (i = 0; i < MTCODER__BLOCKS_MAX; i++) + Event_Close(&p->writeEvents[i]); + #else + Event_Close(&p->finishedEvent); + #endif +} + + +void MtCoder_Destruct(CMtCoder *p) +{ + MtCoder_Free(p); + + CriticalSection_Delete(&p->cs); + CriticalSection_Delete(&p->mtProgress.cs); +} + + +SRes MtCoder_Code(CMtCoder *p) +{ + unsigned numThreads = p->numThreadsMax; + unsigned numBlocksMax; + unsigned i; + SRes res = SZ_OK; + + if (numThreads > MTCODER__THREADS_MAX) + numThreads = MTCODER__THREADS_MAX; + numBlocksMax = MTCODER__GET_NUM_BLOCKS_FROM_THREADS(numThreads); + + if (p->blockSize < ((UInt32)1 << 26)) numBlocksMax++; + if (p->blockSize < ((UInt32)1 << 24)) numBlocksMax++; + if (p->blockSize < ((UInt32)1 << 22)) numBlocksMax++; + + if (numBlocksMax > MTCODER__BLOCKS_MAX) + numBlocksMax = MTCODER__BLOCKS_MAX; + + if (p->blockSize != p->allocatedBufsSize) + { + for (i = 0; i < MTCODER__THREADS_MAX; i++) + { + CMtCoderThread *t = &p->threads[i]; + if (t->inBuf) + { + ISzAlloc_Free(p->allocBig, t->inBuf); + t->inBuf = NULL; + } + } + p->allocatedBufsSize = p->blockSize; + } + + p->readRes = SZ_OK; + + MtProgress_Init(&p->mtProgress, p->progress); + + #ifdef MTCODER__USE_WRITE_THREAD + for (i = 0; i < numBlocksMax; i++) + { + RINOK_THREAD(ArEvent_OptCreate_And_Reset(&p->writeEvents[i])); + } + #else + RINOK_THREAD(ArEvent_OptCreate_And_Reset(&p->finishedEvent)); + #endif + + { + RINOK_THREAD(ArEvent_OptCreate_And_Reset(&p->readEvent)); + RINOK_THREAD(Semaphore_OptCreateInit(&p->blocksSemaphore, numBlocksMax, numBlocksMax)); + } + + for (i = 0; i < MTCODER__BLOCKS_MAX - 1; i++) + p->freeBlockList[i] = i + 1; + p->freeBlockList[MTCODER__BLOCKS_MAX - 1] = (unsigned)(int)-1; + p->freeBlockHead = 0; + + p->readProcessed = 0; + p->blockIndex = 0; + p->numBlocksMax = numBlocksMax; + p->stopReading = False; + + #ifndef MTCODER__USE_WRITE_THREAD + p->writeIndex = 0; + p->writeRes = SZ_OK; + for (i = 0; i < MTCODER__BLOCKS_MAX; i++) + p->ReadyBlocks[i] = False; + p->numFinishedThreads = 0; + #endif + + p->numStartedThreadsLimit = numThreads; + p->numStartedThreads = 0; + + // for (i = 0; i < numThreads; i++) + { + CMtCoderThread *nextThread = &p->threads[p->numStartedThreads++]; + RINOK(MtCoderThread_CreateAndStart(nextThread)); + } + + RINOK_THREAD(Event_Set(&p->readEvent)) + + #ifdef MTCODER__USE_WRITE_THREAD + { + unsigned bi = 0; + + for (;; bi++) + { + if (bi >= numBlocksMax) + bi = 0; + + RINOK_THREAD(Event_Wait(&p->writeEvents[bi])) + + { + const CMtCoderBlock *block = &p->blocks[bi]; + unsigned bufIndex = block->bufIndex; + BoolInt finished = block->finished; + if (res == SZ_OK && block->res != SZ_OK) + res = block->res; + + if (bufIndex != (unsigned)(int)-1) + { + if (res == SZ_OK) + { + res = p->mtCallback->Write(p->mtCallbackObject, bufIndex); + if (res != SZ_OK) + MtProgress_SetError(&p->mtProgress, res); + } + + CriticalSection_Enter(&p->cs); + { + p->freeBlockList[bufIndex] = p->freeBlockHead; + p->freeBlockHead = bufIndex; + } + CriticalSection_Leave(&p->cs); + } + + RINOK_THREAD(Semaphore_Release1(&p->blocksSemaphore)) + + if (finished) + break; + } + } + } + #else + { + WRes wres = Event_Wait(&p->finishedEvent); + res = MY_SRes_HRESULT_FROM_WRes(wres); + } + #endif + + if (res == SZ_OK) + res = p->readRes; + + if (res == SZ_OK) + res = p->mtProgress.res; + + #ifndef MTCODER__USE_WRITE_THREAD + if (res == SZ_OK) + res = p->writeRes; + #endif + + if (res != SZ_OK) + MtCoder_Free(p); + return res; +} + +#endif diff --git a/deps/LZMA-SDK/C/MtCoder.h b/deps/LZMA-SDK/C/MtCoder.h index 603329d36..5a5f4d11b 100644 --- a/deps/LZMA-SDK/C/MtCoder.h +++ b/deps/LZMA-SDK/C/MtCoder.h @@ -1,141 +1,141 @@ -/* MtCoder.h -- Multi-thread Coder -2018-07-04 : Igor Pavlov : Public domain */ - -#ifndef __MT_CODER_H -#define __MT_CODER_H - -#include "MtDec.h" - -EXTERN_C_BEGIN - -/* - if ( defined MTCODER__USE_WRITE_THREAD) : main thread writes all data blocks to output stream - if (not defined MTCODER__USE_WRITE_THREAD) : any coder thread can write data blocks to output stream -*/ -/* #define MTCODER__USE_WRITE_THREAD */ - -#ifndef _7ZIP_ST - #define MTCODER__GET_NUM_BLOCKS_FROM_THREADS(numThreads) ((numThreads) + (numThreads) / 8 + 1) - #define MTCODER__THREADS_MAX 64 - #define MTCODER__BLOCKS_MAX (MTCODER__GET_NUM_BLOCKS_FROM_THREADS(MTCODER__THREADS_MAX) + 3) -#else - #define MTCODER__THREADS_MAX 1 - #define MTCODER__BLOCKS_MAX 1 -#endif - - -#ifndef _7ZIP_ST - - -typedef struct -{ - ICompressProgress vt; - CMtProgress *mtProgress; - UInt64 inSize; - UInt64 outSize; -} CMtProgressThunk; - -void MtProgressThunk_CreateVTable(CMtProgressThunk *p); - -#define MtProgressThunk_Init(p) { (p)->inSize = 0; (p)->outSize = 0; } - - -struct _CMtCoder; - - -typedef struct -{ - struct _CMtCoder *mtCoder; - unsigned index; - int stop; - Byte *inBuf; - - CAutoResetEvent startEvent; - CThread thread; -} CMtCoderThread; - - -typedef struct -{ - SRes (*Code)(void *p, unsigned coderIndex, unsigned outBufIndex, - const Byte *src, size_t srcSize, int finished); - SRes (*Write)(void *p, unsigned outBufIndex); -} IMtCoderCallback2; - - -typedef struct -{ - SRes res; - unsigned bufIndex; - BoolInt finished; -} CMtCoderBlock; - - -typedef struct _CMtCoder -{ - /* input variables */ - - size_t blockSize; /* size of input block */ - unsigned numThreadsMax; - UInt64 expectedDataSize; - - ISeqInStream *inStream; - const Byte *inData; - size_t inDataSize; - - ICompressProgress *progress; - ISzAllocPtr allocBig; - - IMtCoderCallback2 *mtCallback; - void *mtCallbackObject; - - - /* internal variables */ - - size_t allocatedBufsSize; - - CAutoResetEvent readEvent; - CSemaphore blocksSemaphore; - - BoolInt stopReading; - SRes readRes; - - #ifdef MTCODER__USE_WRITE_THREAD - CAutoResetEvent writeEvents[MTCODER__BLOCKS_MAX]; - #else - CAutoResetEvent finishedEvent; - SRes writeRes; - unsigned writeIndex; - Byte ReadyBlocks[MTCODER__BLOCKS_MAX]; - LONG numFinishedThreads; - #endif - - unsigned numStartedThreadsLimit; - unsigned numStartedThreads; - - unsigned numBlocksMax; - unsigned blockIndex; - UInt64 readProcessed; - - CCriticalSection cs; - - unsigned freeBlockHead; - unsigned freeBlockList[MTCODER__BLOCKS_MAX]; - - CMtProgress mtProgress; - CMtCoderBlock blocks[MTCODER__BLOCKS_MAX]; - CMtCoderThread threads[MTCODER__THREADS_MAX]; -} CMtCoder; - - -void MtCoder_Construct(CMtCoder *p); -void MtCoder_Destruct(CMtCoder *p); -SRes MtCoder_Code(CMtCoder *p); - - -#endif - - -EXTERN_C_END - -#endif +/* MtCoder.h -- Multi-thread Coder +2018-07-04 : Igor Pavlov : Public domain */ + +#ifndef __MT_CODER_H +#define __MT_CODER_H + +#include "MtDec.h" + +EXTERN_C_BEGIN + +/* + if ( defined MTCODER__USE_WRITE_THREAD) : main thread writes all data blocks to output stream + if (not defined MTCODER__USE_WRITE_THREAD) : any coder thread can write data blocks to output stream +*/ +/* #define MTCODER__USE_WRITE_THREAD */ + +#ifndef _7ZIP_ST + #define MTCODER__GET_NUM_BLOCKS_FROM_THREADS(numThreads) ((numThreads) + (numThreads) / 8 + 1) + #define MTCODER__THREADS_MAX 64 + #define MTCODER__BLOCKS_MAX (MTCODER__GET_NUM_BLOCKS_FROM_THREADS(MTCODER__THREADS_MAX) + 3) +#else + #define MTCODER__THREADS_MAX 1 + #define MTCODER__BLOCKS_MAX 1 +#endif + + +#ifndef _7ZIP_ST + + +typedef struct +{ + ICompressProgress vt; + CMtProgress *mtProgress; + UInt64 inSize; + UInt64 outSize; +} CMtProgressThunk; + +void MtProgressThunk_CreateVTable(CMtProgressThunk *p); + +#define MtProgressThunk_Init(p) { (p)->inSize = 0; (p)->outSize = 0; } + + +struct _CMtCoder; + + +typedef struct +{ + struct _CMtCoder *mtCoder; + unsigned index; + int stop; + Byte *inBuf; + + CAutoResetEvent startEvent; + CThread thread; +} CMtCoderThread; + + +typedef struct +{ + SRes (*Code)(void *p, unsigned coderIndex, unsigned outBufIndex, + const Byte *src, size_t srcSize, int finished); + SRes (*Write)(void *p, unsigned outBufIndex); +} IMtCoderCallback2; + + +typedef struct +{ + SRes res; + unsigned bufIndex; + BoolInt finished; +} CMtCoderBlock; + + +typedef struct _CMtCoder +{ + /* input variables */ + + size_t blockSize; /* size of input block */ + unsigned numThreadsMax; + UInt64 expectedDataSize; + + ISeqInStream *inStream; + const Byte *inData; + size_t inDataSize; + + ICompressProgress *progress; + ISzAllocPtr allocBig; + + IMtCoderCallback2 *mtCallback; + void *mtCallbackObject; + + + /* internal variables */ + + size_t allocatedBufsSize; + + CAutoResetEvent readEvent; + CSemaphore blocksSemaphore; + + BoolInt stopReading; + SRes readRes; + + #ifdef MTCODER__USE_WRITE_THREAD + CAutoResetEvent writeEvents[MTCODER__BLOCKS_MAX]; + #else + CAutoResetEvent finishedEvent; + SRes writeRes; + unsigned writeIndex; + Byte ReadyBlocks[MTCODER__BLOCKS_MAX]; + LONG numFinishedThreads; + #endif + + unsigned numStartedThreadsLimit; + unsigned numStartedThreads; + + unsigned numBlocksMax; + unsigned blockIndex; + UInt64 readProcessed; + + CCriticalSection cs; + + unsigned freeBlockHead; + unsigned freeBlockList[MTCODER__BLOCKS_MAX]; + + CMtProgress mtProgress; + CMtCoderBlock blocks[MTCODER__BLOCKS_MAX]; + CMtCoderThread threads[MTCODER__THREADS_MAX]; +} CMtCoder; + + +void MtCoder_Construct(CMtCoder *p); +void MtCoder_Destruct(CMtCoder *p); +SRes MtCoder_Code(CMtCoder *p); + + +#endif + + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/MtDec.c b/deps/LZMA-SDK/C/MtDec.c index 24441b3a7..45a671396 100644 --- a/deps/LZMA-SDK/C/MtDec.c +++ b/deps/LZMA-SDK/C/MtDec.c @@ -1,1139 +1,1139 @@ -/* MtDec.c -- Multi-thread Decoder -2021-02-27 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -// #define SHOW_DEBUG_INFO - -// #include -#include - -#ifdef SHOW_DEBUG_INFO -#include -#endif - -#include "MtDec.h" - -#ifndef _7ZIP_ST - -#ifdef SHOW_DEBUG_INFO -#define PRF(x) x -#else -#define PRF(x) -#endif - -#define PRF_STR_INT(s, d) PRF(printf("\n" s " %d\n", (unsigned)d)) - -void MtProgress_Init(CMtProgress *p, ICompressProgress *progress) -{ - p->progress = progress; - p->res = SZ_OK; - p->totalInSize = 0; - p->totalOutSize = 0; -} - - -SRes MtProgress_Progress_ST(CMtProgress *p) -{ - if (p->res == SZ_OK && p->progress) - if (ICompressProgress_Progress(p->progress, p->totalInSize, p->totalOutSize) != SZ_OK) - p->res = SZ_ERROR_PROGRESS; - return p->res; -} - - -SRes MtProgress_ProgressAdd(CMtProgress *p, UInt64 inSize, UInt64 outSize) -{ - SRes res; - CriticalSection_Enter(&p->cs); - - p->totalInSize += inSize; - p->totalOutSize += outSize; - if (p->res == SZ_OK && p->progress) - if (ICompressProgress_Progress(p->progress, p->totalInSize, p->totalOutSize) != SZ_OK) - p->res = SZ_ERROR_PROGRESS; - res = p->res; - - CriticalSection_Leave(&p->cs); - return res; -} - - -SRes MtProgress_GetError(CMtProgress *p) -{ - SRes res; - CriticalSection_Enter(&p->cs); - res = p->res; - CriticalSection_Leave(&p->cs); - return res; -} - - -void MtProgress_SetError(CMtProgress *p, SRes res) -{ - CriticalSection_Enter(&p->cs); - if (p->res == SZ_OK) - p->res = res; - CriticalSection_Leave(&p->cs); -} - - -#define RINOK_THREAD(x) RINOK_WRes(x) - - -static WRes ArEvent_OptCreate_And_Reset(CEvent *p) -{ - if (Event_IsCreated(p)) - return Event_Reset(p); - return AutoResetEvent_CreateNotSignaled(p); -} - - -struct __CMtDecBufLink -{ - struct __CMtDecBufLink *next; - void *pad[3]; -}; - -typedef struct __CMtDecBufLink CMtDecBufLink; - -#define MTDEC__LINK_DATA_OFFSET sizeof(CMtDecBufLink) -#define MTDEC__DATA_PTR_FROM_LINK(link) ((Byte *)(link) + MTDEC__LINK_DATA_OFFSET) - - - -static THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE ThreadFunc(void *pp); - - -static WRes MtDecThread_CreateEvents(CMtDecThread *t) -{ - WRes wres = ArEvent_OptCreate_And_Reset(&t->canWrite); - if (wres == 0) - { - wres = ArEvent_OptCreate_And_Reset(&t->canRead); - if (wres == 0) - return SZ_OK; - } - return wres; -} - - -static SRes MtDecThread_CreateAndStart(CMtDecThread *t) -{ - WRes wres = MtDecThread_CreateEvents(t); - // wres = 17; // for test - if (wres == 0) - { - if (Thread_WasCreated(&t->thread)) - return SZ_OK; - wres = Thread_Create(&t->thread, ThreadFunc, t); - if (wres == 0) - return SZ_OK; - } - return MY_SRes_HRESULT_FROM_WRes(wres); -} - - -void MtDecThread_FreeInBufs(CMtDecThread *t) -{ - if (t->inBuf) - { - void *link = t->inBuf; - t->inBuf = NULL; - do - { - void *next = ((CMtDecBufLink *)link)->next; - ISzAlloc_Free(t->mtDec->alloc, link); - link = next; - } - while (link); - } -} - - -static void MtDecThread_CloseThread(CMtDecThread *t) -{ - if (Thread_WasCreated(&t->thread)) - { - Event_Set(&t->canWrite); /* we can disable it. There are no threads waiting canWrite in normal cases */ - Event_Set(&t->canRead); - Thread_Wait_Close(&t->thread); - } - - Event_Close(&t->canRead); - Event_Close(&t->canWrite); -} - -static void MtDec_CloseThreads(CMtDec *p) -{ - unsigned i; - for (i = 0; i < MTDEC__THREADS_MAX; i++) - MtDecThread_CloseThread(&p->threads[i]); -} - -static void MtDecThread_Destruct(CMtDecThread *t) -{ - MtDecThread_CloseThread(t); - MtDecThread_FreeInBufs(t); -} - - - -static SRes FullRead(ISeqInStream *stream, Byte *data, size_t *processedSize) -{ - size_t size = *processedSize; - *processedSize = 0; - while (size != 0) - { - size_t cur = size; - SRes res = ISeqInStream_Read(stream, data, &cur); - *processedSize += cur; - data += cur; - size -= cur; - RINOK(res); - if (cur == 0) - return SZ_OK; - } - return SZ_OK; -} - - -static SRes MtDec_GetError_Spec(CMtDec *p, UInt64 interruptIndex, BoolInt *wasInterrupted) -{ - SRes res; - CriticalSection_Enter(&p->mtProgress.cs); - *wasInterrupted = (p->needInterrupt && interruptIndex > p->interruptIndex); - res = p->mtProgress.res; - CriticalSection_Leave(&p->mtProgress.cs); - return res; -} - -static SRes MtDec_Progress_GetError_Spec(CMtDec *p, UInt64 inSize, UInt64 outSize, UInt64 interruptIndex, BoolInt *wasInterrupted) -{ - SRes res; - CriticalSection_Enter(&p->mtProgress.cs); - - p->mtProgress.totalInSize += inSize; - p->mtProgress.totalOutSize += outSize; - if (p->mtProgress.res == SZ_OK && p->mtProgress.progress) - if (ICompressProgress_Progress(p->mtProgress.progress, p->mtProgress.totalInSize, p->mtProgress.totalOutSize) != SZ_OK) - p->mtProgress.res = SZ_ERROR_PROGRESS; - - *wasInterrupted = (p->needInterrupt && interruptIndex > p->interruptIndex); - res = p->mtProgress.res; - - CriticalSection_Leave(&p->mtProgress.cs); - - return res; -} - -static void MtDec_Interrupt(CMtDec *p, UInt64 interruptIndex) -{ - CriticalSection_Enter(&p->mtProgress.cs); - if (!p->needInterrupt || interruptIndex < p->interruptIndex) - { - p->interruptIndex = interruptIndex; - p->needInterrupt = True; - } - CriticalSection_Leave(&p->mtProgress.cs); -} - -Byte *MtDec_GetCrossBuff(CMtDec *p) -{ - Byte *cr = p->crossBlock; - if (!cr) - { - cr = (Byte *)ISzAlloc_Alloc(p->alloc, MTDEC__LINK_DATA_OFFSET + p->inBufSize); - if (!cr) - return NULL; - p->crossBlock = cr; - } - return MTDEC__DATA_PTR_FROM_LINK(cr); -} - - -/* - ThreadFunc2() returns: - 0 - in all normal cases (even for stream error or memory allocation error) - (!= 0) - WRes error return by system threading function -*/ - -// #define MTDEC_ProgessStep (1 << 22) -#define MTDEC_ProgessStep (1 << 0) - -static WRes ThreadFunc2(CMtDecThread *t) -{ - CMtDec *p = t->mtDec; - - PRF_STR_INT("ThreadFunc2", t->index); - - // SetThreadAffinityMask(GetCurrentThread(), 1 << t->index); - - for (;;) - { - SRes res, codeRes; - BoolInt wasInterrupted, isAllocError, overflow, finish; - SRes threadingErrorSRes; - BoolInt needCode, needWrite, needContinue; - - size_t inDataSize_Start; - UInt64 inDataSize; - // UInt64 inDataSize_Full; - - UInt64 blockIndex; - - UInt64 inPrev = 0; - UInt64 outPrev = 0; - UInt64 inCodePos; - UInt64 outCodePos; - - Byte *afterEndData = NULL; - size_t afterEndData_Size = 0; - BoolInt afterEndData_IsCross = False; - - BoolInt canCreateNewThread = False; - // CMtDecCallbackInfo parse; - CMtDecThread *nextThread; - - PRF_STR_INT("=============== Event_Wait(&t->canRead)", t->index); - - RINOK_THREAD(Event_Wait(&t->canRead)); - if (p->exitThread) - return 0; - - PRF_STR_INT("after Event_Wait(&t->canRead)", t->index); - - // if (t->index == 3) return 19; // for test - - blockIndex = p->blockIndex++; - - // PRF(printf("\ncanRead\n")) - - res = MtDec_Progress_GetError_Spec(p, 0, 0, blockIndex, &wasInterrupted); - - finish = p->readWasFinished; - needCode = False; - needWrite = False; - isAllocError = False; - overflow = False; - - inDataSize_Start = 0; - inDataSize = 0; - // inDataSize_Full = 0; - - if (res == SZ_OK && !wasInterrupted) - { - // if (p->inStream) - { - CMtDecBufLink *prev = NULL; - CMtDecBufLink *link = (CMtDecBufLink *)t->inBuf; - size_t crossSize = p->crossEnd - p->crossStart; - - PRF(printf("\ncrossSize = %d\n", crossSize)); - - for (;;) - { - if (!link) - { - link = (CMtDecBufLink *)ISzAlloc_Alloc(p->alloc, MTDEC__LINK_DATA_OFFSET + p->inBufSize); - if (!link) - { - finish = True; - // p->allocError_for_Read_BlockIndex = blockIndex; - isAllocError = True; - break; - } - link->next = NULL; - if (prev) - { - // static unsigned g_num = 0; - // printf("\n%6d : %x", ++g_num, (unsigned)(size_t)((Byte *)link - (Byte *)prev)); - prev->next = link; - } - else - t->inBuf = (void *)link; - } - - { - Byte *data = MTDEC__DATA_PTR_FROM_LINK(link); - Byte *parseData = data; - size_t size; - - if (crossSize != 0) - { - inDataSize = crossSize; - // inDataSize_Full = inDataSize; - inDataSize_Start = crossSize; - size = crossSize; - parseData = MTDEC__DATA_PTR_FROM_LINK(p->crossBlock) + p->crossStart; - PRF(printf("\ncross : crossStart = %7d crossEnd = %7d finish = %1d", - (int)p->crossStart, (int)p->crossEnd, (int)finish)); - } - else - { - size = p->inBufSize; - - res = FullRead(p->inStream, data, &size); - - // size = 10; // test - - inDataSize += size; - // inDataSize_Full = inDataSize; - if (!prev) - inDataSize_Start = size; - - p->readProcessed += size; - finish = (size != p->inBufSize); - if (finish) - p->readWasFinished = True; - - // res = E_INVALIDARG; // test - - if (res != SZ_OK) - { - // PRF(printf("\nRead error = %d\n", res)) - // we want to decode all data before error - p->readRes = res; - // p->readError_BlockIndex = blockIndex; - p->readWasFinished = True; - finish = True; - res = SZ_OK; - // break; - } - - if (inDataSize - inPrev >= MTDEC_ProgessStep) - { - res = MtDec_Progress_GetError_Spec(p, 0, 0, blockIndex, &wasInterrupted); - if (res != SZ_OK || wasInterrupted) - break; - inPrev = inDataSize; - } - } - - { - CMtDecCallbackInfo parse; - - parse.startCall = (prev == NULL); - parse.src = parseData; - parse.srcSize = size; - parse.srcFinished = finish; - parse.canCreateNewThread = True; - - PRF(printf("\nParse size = %d\n", (unsigned)size)); - - p->mtCallback->Parse(p->mtCallbackObject, t->index, &parse); - - PRF(printf(" Parse processed = %d, state = %d \n", (unsigned)parse.srcSize, (unsigned)parse.state)); - - needWrite = True; - canCreateNewThread = parse.canCreateNewThread; - - // printf("\n\n%12I64u %12I64u", (UInt64)p->mtProgress.totalInSize, (UInt64)p->mtProgress.totalOutSize); - - if ( - // parseRes != SZ_OK || - // inDataSize - (size - parse.srcSize) > p->inBlockMax - // || - parse.state == MTDEC_PARSE_OVERFLOW - // || wasInterrupted - ) - { - // Overflow or Parse error - switch from MT decoding to ST decoding - finish = True; - overflow = True; - - { - PRF(printf("\n Overflow")); - // PRF(printf("\nisBlockFinished = %d", (unsigned)parse.blockWasFinished)); - PRF(printf("\n inDataSize = %d", (unsigned)inDataSize)); - } - - if (crossSize != 0) - memcpy(data, parseData, size); - p->crossStart = 0; - p->crossEnd = 0; - break; - } - - if (crossSize != 0) - { - memcpy(data, parseData, parse.srcSize); - p->crossStart += parse.srcSize; - } - - if (parse.state != MTDEC_PARSE_CONTINUE || finish) - { - // we don't need to parse in current thread anymore - - if (parse.state == MTDEC_PARSE_END) - finish = True; - - needCode = True; - // p->crossFinished = finish; - - if (parse.srcSize == size) - { - // full parsed - no cross transfer - p->crossStart = 0; - p->crossEnd = 0; - break; - } - - if (parse.state == MTDEC_PARSE_END) - { - afterEndData = parseData + parse.srcSize; - afterEndData_Size = size - parse.srcSize; - if (crossSize != 0) - afterEndData_IsCross = True; - // we reduce data size to required bytes (parsed only) - inDataSize -= afterEndData_Size; - if (!prev) - inDataSize_Start = parse.srcSize; - break; - } - - { - // partial parsed - need cross transfer - if (crossSize != 0) - inDataSize = parse.srcSize; // it's only parsed now - else - { - // partial parsed - is not in initial cross block - we need to copy new data to cross block - Byte *cr = MtDec_GetCrossBuff(p); - if (!cr) - { - { - PRF(printf("\ncross alloc error error\n")); - // res = SZ_ERROR_MEM; - finish = True; - // p->allocError_for_Read_BlockIndex = blockIndex; - isAllocError = True; - break; - } - } - - { - size_t crSize = size - parse.srcSize; - inDataSize -= crSize; - p->crossEnd = crSize; - p->crossStart = 0; - memcpy(cr, parseData + parse.srcSize, crSize); - } - } - - // inDataSize_Full = inDataSize; - if (!prev) - inDataSize_Start = parse.srcSize; // it's partial size (parsed only) - - finish = False; - break; - } - } - - if (parse.srcSize != size) - { - res = SZ_ERROR_FAIL; - PRF(printf("\nfinished error SZ_ERROR_FAIL = %d\n", res)); - break; - } - } - } - - prev = link; - link = link->next; - - if (crossSize != 0) - { - crossSize = 0; - p->crossStart = 0; - p->crossEnd = 0; - } - } - } - - if (res == SZ_OK) - res = MtDec_GetError_Spec(p, blockIndex, &wasInterrupted); - } - - codeRes = SZ_OK; - - if (res == SZ_OK && needCode && !wasInterrupted) - { - codeRes = p->mtCallback->PreCode(p->mtCallbackObject, t->index); - if (codeRes != SZ_OK) - { - needCode = False; - finish = True; - // SZ_ERROR_MEM is expected error here. - // if (codeRes == SZ_ERROR_MEM) - we will try single-thread decoding later. - // if (codeRes != SZ_ERROR_MEM) - we can stop decoding or try single-thread decoding. - } - } - - if (res != SZ_OK || wasInterrupted) - finish = True; - - nextThread = NULL; - threadingErrorSRes = SZ_OK; - - if (!finish) - { - if (p->numStartedThreads < p->numStartedThreads_Limit && canCreateNewThread) - { - SRes res2 = MtDecThread_CreateAndStart(&p->threads[p->numStartedThreads]); - if (res2 == SZ_OK) - { - // if (p->numStartedThreads % 1000 == 0) PRF(printf("\n numStartedThreads=%d\n", p->numStartedThreads)); - p->numStartedThreads++; - } - else - { - PRF(printf("\nERROR: numStartedThreads=%d\n", p->numStartedThreads)); - if (p->numStartedThreads == 1) - { - // if only one thread is possible, we leave muti-threading code - finish = True; - needCode = False; - threadingErrorSRes = res2; - } - else - p->numStartedThreads_Limit = p->numStartedThreads; - } - } - - if (!finish) - { - unsigned nextIndex = t->index + 1; - nextThread = &p->threads[nextIndex >= p->numStartedThreads ? 0 : nextIndex]; - RINOK_THREAD(Event_Set(&nextThread->canRead)) - // We have started executing for new iteration (with next thread) - // And that next thread now is responsible for possible exit from decoding (threading_code) - } - } - - // each call of Event_Set(&nextThread->canRead) must be followed by call of Event_Set(&nextThread->canWrite) - // if ( !finish ) we must call Event_Set(&nextThread->canWrite) in any case - // if ( finish ) we switch to single-thread mode and there are 2 ways at the end of current iteration (current block): - // - if (needContinue) after Write(&needContinue), we restore decoding with new iteration - // - otherwise we stop decoding and exit from ThreadFunc2() - - // Don't change (finish) variable in the further code - - - // ---------- CODE ---------- - - inPrev = 0; - outPrev = 0; - inCodePos = 0; - outCodePos = 0; - - if (res == SZ_OK && needCode && codeRes == SZ_OK) - { - BoolInt isStartBlock = True; - CMtDecBufLink *link = (CMtDecBufLink *)t->inBuf; - - for (;;) - { - size_t inSize; - int stop; - - if (isStartBlock) - inSize = inDataSize_Start; - else - { - UInt64 rem = inDataSize - inCodePos; - inSize = p->inBufSize; - if (inSize > rem) - inSize = (size_t)rem; - } - - inCodePos += inSize; - stop = True; - - codeRes = p->mtCallback->Code(p->mtCallbackObject, t->index, - (const Byte *)MTDEC__DATA_PTR_FROM_LINK(link), inSize, - (inCodePos == inDataSize), // srcFinished - &inCodePos, &outCodePos, &stop); - - if (codeRes != SZ_OK) - { - PRF(printf("\nCode Interrupt error = %x\n", codeRes)); - // we interrupt only later blocks - MtDec_Interrupt(p, blockIndex); - break; - } - - if (stop || inCodePos == inDataSize) - break; - - { - const UInt64 inDelta = inCodePos - inPrev; - const UInt64 outDelta = outCodePos - outPrev; - if (inDelta >= MTDEC_ProgessStep || outDelta >= MTDEC_ProgessStep) - { - // Sleep(1); - res = MtDec_Progress_GetError_Spec(p, inDelta, outDelta, blockIndex, &wasInterrupted); - if (res != SZ_OK || wasInterrupted) - break; - inPrev = inCodePos; - outPrev = outCodePos; - } - } - - link = link->next; - isStartBlock = False; - } - } - - - // ---------- WRITE ---------- - - RINOK_THREAD(Event_Wait(&t->canWrite)); - - { - BoolInt isErrorMode = False; - BoolInt canRecode = True; - BoolInt needWriteToStream = needWrite; - - if (p->exitThread) return 0; // it's never executed in normal cases - - if (p->wasInterrupted) - wasInterrupted = True; - else - { - if (codeRes != SZ_OK) // || !needCode // check it !!! - { - p->wasInterrupted = True; - p->codeRes = codeRes; - if (codeRes == SZ_ERROR_MEM) - isAllocError = True; - } - - if (threadingErrorSRes) - { - p->wasInterrupted = True; - p->threadingErrorSRes = threadingErrorSRes; - needWriteToStream = False; - } - if (isAllocError) - { - p->wasInterrupted = True; - p->isAllocError = True; - needWriteToStream = False; - } - if (overflow) - { - p->wasInterrupted = True; - p->overflow = True; - needWriteToStream = False; - } - } - - if (needCode) - { - if (wasInterrupted) - { - inCodePos = 0; - outCodePos = 0; - } - { - const UInt64 inDelta = inCodePos - inPrev; - const UInt64 outDelta = outCodePos - outPrev; - // if (inDelta != 0 || outDelta != 0) - res = MtProgress_ProgressAdd(&p->mtProgress, inDelta, outDelta); - } - } - - needContinue = (!finish); - - // if (res == SZ_OK && needWrite && !wasInterrupted) - if (needWrite) - { - // p->inProcessed += inCodePos; - - PRF(printf("\n--Write afterSize = %d\n", (unsigned)afterEndData_Size)); - - res = p->mtCallback->Write(p->mtCallbackObject, t->index, - res == SZ_OK && needWriteToStream && !wasInterrupted, // needWrite - afterEndData, afterEndData_Size, afterEndData_IsCross, - &needContinue, - &canRecode); - - // res = SZ_ERROR_FAIL; // for test - - PRF(printf("\nAfter Write needContinue = %d\n", (unsigned)needContinue)); - PRF(printf("\nprocessed = %d\n", (unsigned)p->inProcessed)); - - if (res != SZ_OK) - { - PRF(printf("\nWrite error = %d\n", res)); - isErrorMode = True; - p->wasInterrupted = True; - } - if (res != SZ_OK - || (!needContinue && !finish)) - { - PRF(printf("\nWrite Interrupt error = %x\n", res)); - MtDec_Interrupt(p, blockIndex); - } - } - - if (canRecode) - if (!needCode - || res != SZ_OK - || p->wasInterrupted - || codeRes != SZ_OK - || wasInterrupted - || p->numFilledThreads != 0 - || isErrorMode) - { - if (p->numFilledThreads == 0) - p->filledThreadStart = t->index; - if (inDataSize != 0 || !finish) - { - t->inDataSize_Start = inDataSize_Start; - t->inDataSize = inDataSize; - p->numFilledThreads++; - } - PRF(printf("\np->numFilledThreads = %d\n", p->numFilledThreads)); - PRF(printf("p->filledThreadStart = %d\n", p->filledThreadStart)); - } - - if (!finish) - { - RINOK_THREAD(Event_Set(&nextThread->canWrite)); - } - else - { - if (needContinue) - { - // we restore decoding with new iteration - RINOK_THREAD(Event_Set(&p->threads[0].canWrite)); - } - else - { - // we exit from decoding - if (t->index == 0) - return SZ_OK; - p->exitThread = True; - } - RINOK_THREAD(Event_Set(&p->threads[0].canRead)); - } - } - } -} - -#ifdef _WIN32 -#define USE_ALLOCA -#endif - -#ifdef USE_ALLOCA -#ifdef _WIN32 -#include -#else -#include -#endif -#endif - - -static THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE ThreadFunc1(void *pp) -{ - WRes res; - - CMtDecThread *t = (CMtDecThread *)pp; - CMtDec *p; - - // fprintf(stdout, "\n%d = %p\n", t->index, &t); - - res = ThreadFunc2(t); - p = t->mtDec; - if (res == 0) - return (THREAD_FUNC_RET_TYPE)(UINT_PTR)p->exitThreadWRes; - { - // it's unexpected situation for some threading function error - if (p->exitThreadWRes == 0) - p->exitThreadWRes = res; - PRF(printf("\nthread exit error = %d\n", res)); - p->exitThread = True; - Event_Set(&p->threads[0].canRead); - Event_Set(&p->threads[0].canWrite); - MtProgress_SetError(&p->mtProgress, MY_SRes_HRESULT_FROM_WRes(res)); - } - return (THREAD_FUNC_RET_TYPE)(UINT_PTR)res; -} - -static MY_NO_INLINE THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE ThreadFunc(void *pp) -{ - #ifdef USE_ALLOCA - CMtDecThread *t = (CMtDecThread *)pp; - // fprintf(stderr, "\n%d = %p - before", t->index, &t); - t->allocaPtr = alloca(t->index * 128); - #endif - return ThreadFunc1(pp); -} - - -int MtDec_PrepareRead(CMtDec *p) -{ - if (p->crossBlock && p->crossStart == p->crossEnd) - { - ISzAlloc_Free(p->alloc, p->crossBlock); - p->crossBlock = NULL; - } - - { - unsigned i; - for (i = 0; i < MTDEC__THREADS_MAX; i++) - if (i > p->numStartedThreads - || p->numFilledThreads <= - (i >= p->filledThreadStart ? - i - p->filledThreadStart : - i + p->numStartedThreads - p->filledThreadStart)) - MtDecThread_FreeInBufs(&p->threads[i]); - } - - return (p->numFilledThreads != 0) || (p->crossStart != p->crossEnd); -} - - -const Byte *MtDec_Read(CMtDec *p, size_t *inLim) -{ - while (p->numFilledThreads != 0) - { - CMtDecThread *t = &p->threads[p->filledThreadStart]; - - if (*inLim != 0) - { - { - void *link = t->inBuf; - void *next = ((CMtDecBufLink *)link)->next; - ISzAlloc_Free(p->alloc, link); - t->inBuf = next; - } - - if (t->inDataSize == 0) - { - MtDecThread_FreeInBufs(t); - if (--p->numFilledThreads == 0) - break; - if (++p->filledThreadStart == p->numStartedThreads) - p->filledThreadStart = 0; - t = &p->threads[p->filledThreadStart]; - } - } - - { - size_t lim = t->inDataSize_Start; - if (lim != 0) - t->inDataSize_Start = 0; - else - { - UInt64 rem = t->inDataSize; - lim = p->inBufSize; - if (lim > rem) - lim = (size_t)rem; - } - t->inDataSize -= lim; - *inLim = lim; - return (const Byte *)MTDEC__DATA_PTR_FROM_LINK(t->inBuf); - } - } - - { - size_t crossSize = p->crossEnd - p->crossStart; - if (crossSize != 0) - { - const Byte *data = MTDEC__DATA_PTR_FROM_LINK(p->crossBlock) + p->crossStart; - *inLim = crossSize; - p->crossStart = 0; - p->crossEnd = 0; - return data; - } - *inLim = 0; - if (p->crossBlock) - { - ISzAlloc_Free(p->alloc, p->crossBlock); - p->crossBlock = NULL; - } - return NULL; - } -} - - -void MtDec_Construct(CMtDec *p) -{ - unsigned i; - - p->inBufSize = (size_t)1 << 18; - - p->numThreadsMax = 0; - - p->inStream = NULL; - - // p->inData = NULL; - // p->inDataSize = 0; - - p->crossBlock = NULL; - p->crossStart = 0; - p->crossEnd = 0; - - p->numFilledThreads = 0; - - p->progress = NULL; - p->alloc = NULL; - - p->mtCallback = NULL; - p->mtCallbackObject = NULL; - - p->allocatedBufsSize = 0; - - for (i = 0; i < MTDEC__THREADS_MAX; i++) - { - CMtDecThread *t = &p->threads[i]; - t->mtDec = p; - t->index = i; - t->inBuf = NULL; - Event_Construct(&t->canRead); - Event_Construct(&t->canWrite); - Thread_Construct(&t->thread); - } - - // Event_Construct(&p->finishedEvent); - - CriticalSection_Init(&p->mtProgress.cs); -} - - -static void MtDec_Free(CMtDec *p) -{ - unsigned i; - - p->exitThread = True; - - for (i = 0; i < MTDEC__THREADS_MAX; i++) - MtDecThread_Destruct(&p->threads[i]); - - // Event_Close(&p->finishedEvent); - - if (p->crossBlock) - { - ISzAlloc_Free(p->alloc, p->crossBlock); - p->crossBlock = NULL; - } -} - - -void MtDec_Destruct(CMtDec *p) -{ - MtDec_Free(p); - - CriticalSection_Delete(&p->mtProgress.cs); -} - - -SRes MtDec_Code(CMtDec *p) -{ - unsigned i; - - p->inProcessed = 0; - - p->blockIndex = 1; // it must be larger than not_defined index (0) - p->isAllocError = False; - p->overflow = False; - p->threadingErrorSRes = SZ_OK; - - p->needContinue = True; - - p->readWasFinished = False; - p->needInterrupt = False; - p->interruptIndex = (UInt64)(Int64)-1; - - p->readProcessed = 0; - p->readRes = SZ_OK; - p->codeRes = SZ_OK; - p->wasInterrupted = False; - - p->crossStart = 0; - p->crossEnd = 0; - - p->filledThreadStart = 0; - p->numFilledThreads = 0; - - { - unsigned numThreads = p->numThreadsMax; - if (numThreads > MTDEC__THREADS_MAX) - numThreads = MTDEC__THREADS_MAX; - p->numStartedThreads_Limit = numThreads; - p->numStartedThreads = 0; - } - - if (p->inBufSize != p->allocatedBufsSize) - { - for (i = 0; i < MTDEC__THREADS_MAX; i++) - { - CMtDecThread *t = &p->threads[i]; - if (t->inBuf) - MtDecThread_FreeInBufs(t); - } - if (p->crossBlock) - { - ISzAlloc_Free(p->alloc, p->crossBlock); - p->crossBlock = NULL; - } - - p->allocatedBufsSize = p->inBufSize; - } - - MtProgress_Init(&p->mtProgress, p->progress); - - // RINOK_THREAD(ArEvent_OptCreate_And_Reset(&p->finishedEvent)); - p->exitThread = False; - p->exitThreadWRes = 0; - - { - WRes wres; - SRes sres; - CMtDecThread *nextThread = &p->threads[p->numStartedThreads++]; - // wres = MtDecThread_CreateAndStart(nextThread); - wres = MtDecThread_CreateEvents(nextThread); - if (wres == 0) { wres = Event_Set(&nextThread->canWrite); - if (wres == 0) { wres = Event_Set(&nextThread->canRead); - if (wres == 0) { THREAD_FUNC_RET_TYPE res = ThreadFunc(nextThread); - wres = (WRes)(UINT_PTR)res; - if (wres != 0) - { - p->needContinue = False; - MtDec_CloseThreads(p); - }}}} - - // wres = 17; // for test - // wres = Event_Wait(&p->finishedEvent); - - sres = MY_SRes_HRESULT_FROM_WRes(wres); - - if (sres != 0) - p->threadingErrorSRes = sres; - - if ( - // wres == 0 - // wres != 0 - // || p->mtc.codeRes == SZ_ERROR_MEM - p->isAllocError - || p->threadingErrorSRes != SZ_OK - || p->overflow) - { - // p->needContinue = True; - } - else - p->needContinue = False; - - if (p->needContinue) - return SZ_OK; - - // if (sres != SZ_OK) - return sres; - // return SZ_ERROR_FAIL; - } -} - -#endif +/* MtDec.c -- Multi-thread Decoder +2021-12-21 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +// #define SHOW_DEBUG_INFO + +// #include +#include + +#ifdef SHOW_DEBUG_INFO +#include +#endif + +#include "MtDec.h" + +#ifndef _7ZIP_ST + +#ifdef SHOW_DEBUG_INFO +#define PRF(x) x +#else +#define PRF(x) +#endif + +#define PRF_STR_INT(s, d) PRF(printf("\n" s " %d\n", (unsigned)d)) + +void MtProgress_Init(CMtProgress *p, ICompressProgress *progress) +{ + p->progress = progress; + p->res = SZ_OK; + p->totalInSize = 0; + p->totalOutSize = 0; +} + + +SRes MtProgress_Progress_ST(CMtProgress *p) +{ + if (p->res == SZ_OK && p->progress) + if (ICompressProgress_Progress(p->progress, p->totalInSize, p->totalOutSize) != SZ_OK) + p->res = SZ_ERROR_PROGRESS; + return p->res; +} + + +SRes MtProgress_ProgressAdd(CMtProgress *p, UInt64 inSize, UInt64 outSize) +{ + SRes res; + CriticalSection_Enter(&p->cs); + + p->totalInSize += inSize; + p->totalOutSize += outSize; + if (p->res == SZ_OK && p->progress) + if (ICompressProgress_Progress(p->progress, p->totalInSize, p->totalOutSize) != SZ_OK) + p->res = SZ_ERROR_PROGRESS; + res = p->res; + + CriticalSection_Leave(&p->cs); + return res; +} + + +SRes MtProgress_GetError(CMtProgress *p) +{ + SRes res; + CriticalSection_Enter(&p->cs); + res = p->res; + CriticalSection_Leave(&p->cs); + return res; +} + + +void MtProgress_SetError(CMtProgress *p, SRes res) +{ + CriticalSection_Enter(&p->cs); + if (p->res == SZ_OK) + p->res = res; + CriticalSection_Leave(&p->cs); +} + + +#define RINOK_THREAD(x) RINOK_WRes(x) + + +static WRes ArEvent_OptCreate_And_Reset(CEvent *p) +{ + if (Event_IsCreated(p)) + return Event_Reset(p); + return AutoResetEvent_CreateNotSignaled(p); +} + + +struct __CMtDecBufLink +{ + struct __CMtDecBufLink *next; + void *pad[3]; +}; + +typedef struct __CMtDecBufLink CMtDecBufLink; + +#define MTDEC__LINK_DATA_OFFSET sizeof(CMtDecBufLink) +#define MTDEC__DATA_PTR_FROM_LINK(link) ((Byte *)(link) + MTDEC__LINK_DATA_OFFSET) + + + +static THREAD_FUNC_DECL ThreadFunc(void *pp); + + +static WRes MtDecThread_CreateEvents(CMtDecThread *t) +{ + WRes wres = ArEvent_OptCreate_And_Reset(&t->canWrite); + if (wres == 0) + { + wres = ArEvent_OptCreate_And_Reset(&t->canRead); + if (wres == 0) + return SZ_OK; + } + return wres; +} + + +static SRes MtDecThread_CreateAndStart(CMtDecThread *t) +{ + WRes wres = MtDecThread_CreateEvents(t); + // wres = 17; // for test + if (wres == 0) + { + if (Thread_WasCreated(&t->thread)) + return SZ_OK; + wres = Thread_Create(&t->thread, ThreadFunc, t); + if (wres == 0) + return SZ_OK; + } + return MY_SRes_HRESULT_FROM_WRes(wres); +} + + +void MtDecThread_FreeInBufs(CMtDecThread *t) +{ + if (t->inBuf) + { + void *link = t->inBuf; + t->inBuf = NULL; + do + { + void *next = ((CMtDecBufLink *)link)->next; + ISzAlloc_Free(t->mtDec->alloc, link); + link = next; + } + while (link); + } +} + + +static void MtDecThread_CloseThread(CMtDecThread *t) +{ + if (Thread_WasCreated(&t->thread)) + { + Event_Set(&t->canWrite); /* we can disable it. There are no threads waiting canWrite in normal cases */ + Event_Set(&t->canRead); + Thread_Wait_Close(&t->thread); + } + + Event_Close(&t->canRead); + Event_Close(&t->canWrite); +} + +static void MtDec_CloseThreads(CMtDec *p) +{ + unsigned i; + for (i = 0; i < MTDEC__THREADS_MAX; i++) + MtDecThread_CloseThread(&p->threads[i]); +} + +static void MtDecThread_Destruct(CMtDecThread *t) +{ + MtDecThread_CloseThread(t); + MtDecThread_FreeInBufs(t); +} + + + +static SRes FullRead(ISeqInStream *stream, Byte *data, size_t *processedSize) +{ + size_t size = *processedSize; + *processedSize = 0; + while (size != 0) + { + size_t cur = size; + SRes res = ISeqInStream_Read(stream, data, &cur); + *processedSize += cur; + data += cur; + size -= cur; + RINOK(res); + if (cur == 0) + return SZ_OK; + } + return SZ_OK; +} + + +static SRes MtDec_GetError_Spec(CMtDec *p, UInt64 interruptIndex, BoolInt *wasInterrupted) +{ + SRes res; + CriticalSection_Enter(&p->mtProgress.cs); + *wasInterrupted = (p->needInterrupt && interruptIndex > p->interruptIndex); + res = p->mtProgress.res; + CriticalSection_Leave(&p->mtProgress.cs); + return res; +} + +static SRes MtDec_Progress_GetError_Spec(CMtDec *p, UInt64 inSize, UInt64 outSize, UInt64 interruptIndex, BoolInt *wasInterrupted) +{ + SRes res; + CriticalSection_Enter(&p->mtProgress.cs); + + p->mtProgress.totalInSize += inSize; + p->mtProgress.totalOutSize += outSize; + if (p->mtProgress.res == SZ_OK && p->mtProgress.progress) + if (ICompressProgress_Progress(p->mtProgress.progress, p->mtProgress.totalInSize, p->mtProgress.totalOutSize) != SZ_OK) + p->mtProgress.res = SZ_ERROR_PROGRESS; + + *wasInterrupted = (p->needInterrupt && interruptIndex > p->interruptIndex); + res = p->mtProgress.res; + + CriticalSection_Leave(&p->mtProgress.cs); + + return res; +} + +static void MtDec_Interrupt(CMtDec *p, UInt64 interruptIndex) +{ + CriticalSection_Enter(&p->mtProgress.cs); + if (!p->needInterrupt || interruptIndex < p->interruptIndex) + { + p->interruptIndex = interruptIndex; + p->needInterrupt = True; + } + CriticalSection_Leave(&p->mtProgress.cs); +} + +Byte *MtDec_GetCrossBuff(CMtDec *p) +{ + Byte *cr = p->crossBlock; + if (!cr) + { + cr = (Byte *)ISzAlloc_Alloc(p->alloc, MTDEC__LINK_DATA_OFFSET + p->inBufSize); + if (!cr) + return NULL; + p->crossBlock = cr; + } + return MTDEC__DATA_PTR_FROM_LINK(cr); +} + + +/* + ThreadFunc2() returns: + 0 - in all normal cases (even for stream error or memory allocation error) + (!= 0) - WRes error return by system threading function +*/ + +// #define MTDEC_ProgessStep (1 << 22) +#define MTDEC_ProgessStep (1 << 0) + +static WRes ThreadFunc2(CMtDecThread *t) +{ + CMtDec *p = t->mtDec; + + PRF_STR_INT("ThreadFunc2", t->index); + + // SetThreadAffinityMask(GetCurrentThread(), 1 << t->index); + + for (;;) + { + SRes res, codeRes; + BoolInt wasInterrupted, isAllocError, overflow, finish; + SRes threadingErrorSRes; + BoolInt needCode, needWrite, needContinue; + + size_t inDataSize_Start; + UInt64 inDataSize; + // UInt64 inDataSize_Full; + + UInt64 blockIndex; + + UInt64 inPrev = 0; + UInt64 outPrev = 0; + UInt64 inCodePos; + UInt64 outCodePos; + + Byte *afterEndData = NULL; + size_t afterEndData_Size = 0; + BoolInt afterEndData_IsCross = False; + + BoolInt canCreateNewThread = False; + // CMtDecCallbackInfo parse; + CMtDecThread *nextThread; + + PRF_STR_INT("=============== Event_Wait(&t->canRead)", t->index); + + RINOK_THREAD(Event_Wait(&t->canRead)); + if (p->exitThread) + return 0; + + PRF_STR_INT("after Event_Wait(&t->canRead)", t->index); + + // if (t->index == 3) return 19; // for test + + blockIndex = p->blockIndex++; + + // PRF(printf("\ncanRead\n")) + + res = MtDec_Progress_GetError_Spec(p, 0, 0, blockIndex, &wasInterrupted); + + finish = p->readWasFinished; + needCode = False; + needWrite = False; + isAllocError = False; + overflow = False; + + inDataSize_Start = 0; + inDataSize = 0; + // inDataSize_Full = 0; + + if (res == SZ_OK && !wasInterrupted) + { + // if (p->inStream) + { + CMtDecBufLink *prev = NULL; + CMtDecBufLink *link = (CMtDecBufLink *)t->inBuf; + size_t crossSize = p->crossEnd - p->crossStart; + + PRF(printf("\ncrossSize = %d\n", crossSize)); + + for (;;) + { + if (!link) + { + link = (CMtDecBufLink *)ISzAlloc_Alloc(p->alloc, MTDEC__LINK_DATA_OFFSET + p->inBufSize); + if (!link) + { + finish = True; + // p->allocError_for_Read_BlockIndex = blockIndex; + isAllocError = True; + break; + } + link->next = NULL; + if (prev) + { + // static unsigned g_num = 0; + // printf("\n%6d : %x", ++g_num, (unsigned)(size_t)((Byte *)link - (Byte *)prev)); + prev->next = link; + } + else + t->inBuf = (void *)link; + } + + { + Byte *data = MTDEC__DATA_PTR_FROM_LINK(link); + Byte *parseData = data; + size_t size; + + if (crossSize != 0) + { + inDataSize = crossSize; + // inDataSize_Full = inDataSize; + inDataSize_Start = crossSize; + size = crossSize; + parseData = MTDEC__DATA_PTR_FROM_LINK(p->crossBlock) + p->crossStart; + PRF(printf("\ncross : crossStart = %7d crossEnd = %7d finish = %1d", + (int)p->crossStart, (int)p->crossEnd, (int)finish)); + } + else + { + size = p->inBufSize; + + res = FullRead(p->inStream, data, &size); + + // size = 10; // test + + inDataSize += size; + // inDataSize_Full = inDataSize; + if (!prev) + inDataSize_Start = size; + + p->readProcessed += size; + finish = (size != p->inBufSize); + if (finish) + p->readWasFinished = True; + + // res = E_INVALIDARG; // test + + if (res != SZ_OK) + { + // PRF(printf("\nRead error = %d\n", res)) + // we want to decode all data before error + p->readRes = res; + // p->readError_BlockIndex = blockIndex; + p->readWasFinished = True; + finish = True; + res = SZ_OK; + // break; + } + + if (inDataSize - inPrev >= MTDEC_ProgessStep) + { + res = MtDec_Progress_GetError_Spec(p, 0, 0, blockIndex, &wasInterrupted); + if (res != SZ_OK || wasInterrupted) + break; + inPrev = inDataSize; + } + } + + { + CMtDecCallbackInfo parse; + + parse.startCall = (prev == NULL); + parse.src = parseData; + parse.srcSize = size; + parse.srcFinished = finish; + parse.canCreateNewThread = True; + + PRF(printf("\nParse size = %d\n", (unsigned)size)); + + p->mtCallback->Parse(p->mtCallbackObject, t->index, &parse); + + PRF(printf(" Parse processed = %d, state = %d \n", (unsigned)parse.srcSize, (unsigned)parse.state)); + + needWrite = True; + canCreateNewThread = parse.canCreateNewThread; + + // printf("\n\n%12I64u %12I64u", (UInt64)p->mtProgress.totalInSize, (UInt64)p->mtProgress.totalOutSize); + + if ( + // parseRes != SZ_OK || + // inDataSize - (size - parse.srcSize) > p->inBlockMax + // || + parse.state == MTDEC_PARSE_OVERFLOW + // || wasInterrupted + ) + { + // Overflow or Parse error - switch from MT decoding to ST decoding + finish = True; + overflow = True; + + { + PRF(printf("\n Overflow")); + // PRF(printf("\nisBlockFinished = %d", (unsigned)parse.blockWasFinished)); + PRF(printf("\n inDataSize = %d", (unsigned)inDataSize)); + } + + if (crossSize != 0) + memcpy(data, parseData, size); + p->crossStart = 0; + p->crossEnd = 0; + break; + } + + if (crossSize != 0) + { + memcpy(data, parseData, parse.srcSize); + p->crossStart += parse.srcSize; + } + + if (parse.state != MTDEC_PARSE_CONTINUE || finish) + { + // we don't need to parse in current thread anymore + + if (parse.state == MTDEC_PARSE_END) + finish = True; + + needCode = True; + // p->crossFinished = finish; + + if (parse.srcSize == size) + { + // full parsed - no cross transfer + p->crossStart = 0; + p->crossEnd = 0; + break; + } + + if (parse.state == MTDEC_PARSE_END) + { + afterEndData = parseData + parse.srcSize; + afterEndData_Size = size - parse.srcSize; + if (crossSize != 0) + afterEndData_IsCross = True; + // we reduce data size to required bytes (parsed only) + inDataSize -= afterEndData_Size; + if (!prev) + inDataSize_Start = parse.srcSize; + break; + } + + { + // partial parsed - need cross transfer + if (crossSize != 0) + inDataSize = parse.srcSize; // it's only parsed now + else + { + // partial parsed - is not in initial cross block - we need to copy new data to cross block + Byte *cr = MtDec_GetCrossBuff(p); + if (!cr) + { + { + PRF(printf("\ncross alloc error error\n")); + // res = SZ_ERROR_MEM; + finish = True; + // p->allocError_for_Read_BlockIndex = blockIndex; + isAllocError = True; + break; + } + } + + { + size_t crSize = size - parse.srcSize; + inDataSize -= crSize; + p->crossEnd = crSize; + p->crossStart = 0; + memcpy(cr, parseData + parse.srcSize, crSize); + } + } + + // inDataSize_Full = inDataSize; + if (!prev) + inDataSize_Start = parse.srcSize; // it's partial size (parsed only) + + finish = False; + break; + } + } + + if (parse.srcSize != size) + { + res = SZ_ERROR_FAIL; + PRF(printf("\nfinished error SZ_ERROR_FAIL = %d\n", res)); + break; + } + } + } + + prev = link; + link = link->next; + + if (crossSize != 0) + { + crossSize = 0; + p->crossStart = 0; + p->crossEnd = 0; + } + } + } + + if (res == SZ_OK) + res = MtDec_GetError_Spec(p, blockIndex, &wasInterrupted); + } + + codeRes = SZ_OK; + + if (res == SZ_OK && needCode && !wasInterrupted) + { + codeRes = p->mtCallback->PreCode(p->mtCallbackObject, t->index); + if (codeRes != SZ_OK) + { + needCode = False; + finish = True; + // SZ_ERROR_MEM is expected error here. + // if (codeRes == SZ_ERROR_MEM) - we will try single-thread decoding later. + // if (codeRes != SZ_ERROR_MEM) - we can stop decoding or try single-thread decoding. + } + } + + if (res != SZ_OK || wasInterrupted) + finish = True; + + nextThread = NULL; + threadingErrorSRes = SZ_OK; + + if (!finish) + { + if (p->numStartedThreads < p->numStartedThreads_Limit && canCreateNewThread) + { + SRes res2 = MtDecThread_CreateAndStart(&p->threads[p->numStartedThreads]); + if (res2 == SZ_OK) + { + // if (p->numStartedThreads % 1000 == 0) PRF(printf("\n numStartedThreads=%d\n", p->numStartedThreads)); + p->numStartedThreads++; + } + else + { + PRF(printf("\nERROR: numStartedThreads=%d\n", p->numStartedThreads)); + if (p->numStartedThreads == 1) + { + // if only one thread is possible, we leave muti-threading code + finish = True; + needCode = False; + threadingErrorSRes = res2; + } + else + p->numStartedThreads_Limit = p->numStartedThreads; + } + } + + if (!finish) + { + unsigned nextIndex = t->index + 1; + nextThread = &p->threads[nextIndex >= p->numStartedThreads ? 0 : nextIndex]; + RINOK_THREAD(Event_Set(&nextThread->canRead)) + // We have started executing for new iteration (with next thread) + // And that next thread now is responsible for possible exit from decoding (threading_code) + } + } + + // each call of Event_Set(&nextThread->canRead) must be followed by call of Event_Set(&nextThread->canWrite) + // if ( !finish ) we must call Event_Set(&nextThread->canWrite) in any case + // if ( finish ) we switch to single-thread mode and there are 2 ways at the end of current iteration (current block): + // - if (needContinue) after Write(&needContinue), we restore decoding with new iteration + // - otherwise we stop decoding and exit from ThreadFunc2() + + // Don't change (finish) variable in the further code + + + // ---------- CODE ---------- + + inPrev = 0; + outPrev = 0; + inCodePos = 0; + outCodePos = 0; + + if (res == SZ_OK && needCode && codeRes == SZ_OK) + { + BoolInt isStartBlock = True; + CMtDecBufLink *link = (CMtDecBufLink *)t->inBuf; + + for (;;) + { + size_t inSize; + int stop; + + if (isStartBlock) + inSize = inDataSize_Start; + else + { + UInt64 rem = inDataSize - inCodePos; + inSize = p->inBufSize; + if (inSize > rem) + inSize = (size_t)rem; + } + + inCodePos += inSize; + stop = True; + + codeRes = p->mtCallback->Code(p->mtCallbackObject, t->index, + (const Byte *)MTDEC__DATA_PTR_FROM_LINK(link), inSize, + (inCodePos == inDataSize), // srcFinished + &inCodePos, &outCodePos, &stop); + + if (codeRes != SZ_OK) + { + PRF(printf("\nCode Interrupt error = %x\n", codeRes)); + // we interrupt only later blocks + MtDec_Interrupt(p, blockIndex); + break; + } + + if (stop || inCodePos == inDataSize) + break; + + { + const UInt64 inDelta = inCodePos - inPrev; + const UInt64 outDelta = outCodePos - outPrev; + if (inDelta >= MTDEC_ProgessStep || outDelta >= MTDEC_ProgessStep) + { + // Sleep(1); + res = MtDec_Progress_GetError_Spec(p, inDelta, outDelta, blockIndex, &wasInterrupted); + if (res != SZ_OK || wasInterrupted) + break; + inPrev = inCodePos; + outPrev = outCodePos; + } + } + + link = link->next; + isStartBlock = False; + } + } + + + // ---------- WRITE ---------- + + RINOK_THREAD(Event_Wait(&t->canWrite)); + + { + BoolInt isErrorMode = False; + BoolInt canRecode = True; + BoolInt needWriteToStream = needWrite; + + if (p->exitThread) return 0; // it's never executed in normal cases + + if (p->wasInterrupted) + wasInterrupted = True; + else + { + if (codeRes != SZ_OK) // || !needCode // check it !!! + { + p->wasInterrupted = True; + p->codeRes = codeRes; + if (codeRes == SZ_ERROR_MEM) + isAllocError = True; + } + + if (threadingErrorSRes) + { + p->wasInterrupted = True; + p->threadingErrorSRes = threadingErrorSRes; + needWriteToStream = False; + } + if (isAllocError) + { + p->wasInterrupted = True; + p->isAllocError = True; + needWriteToStream = False; + } + if (overflow) + { + p->wasInterrupted = True; + p->overflow = True; + needWriteToStream = False; + } + } + + if (needCode) + { + if (wasInterrupted) + { + inCodePos = 0; + outCodePos = 0; + } + { + const UInt64 inDelta = inCodePos - inPrev; + const UInt64 outDelta = outCodePos - outPrev; + // if (inDelta != 0 || outDelta != 0) + res = MtProgress_ProgressAdd(&p->mtProgress, inDelta, outDelta); + } + } + + needContinue = (!finish); + + // if (res == SZ_OK && needWrite && !wasInterrupted) + if (needWrite) + { + // p->inProcessed += inCodePos; + + PRF(printf("\n--Write afterSize = %d\n", (unsigned)afterEndData_Size)); + + res = p->mtCallback->Write(p->mtCallbackObject, t->index, + res == SZ_OK && needWriteToStream && !wasInterrupted, // needWrite + afterEndData, afterEndData_Size, afterEndData_IsCross, + &needContinue, + &canRecode); + + // res = SZ_ERROR_FAIL; // for test + + PRF(printf("\nAfter Write needContinue = %d\n", (unsigned)needContinue)); + PRF(printf("\nprocessed = %d\n", (unsigned)p->inProcessed)); + + if (res != SZ_OK) + { + PRF(printf("\nWrite error = %d\n", res)); + isErrorMode = True; + p->wasInterrupted = True; + } + if (res != SZ_OK + || (!needContinue && !finish)) + { + PRF(printf("\nWrite Interrupt error = %x\n", res)); + MtDec_Interrupt(p, blockIndex); + } + } + + if (canRecode) + if (!needCode + || res != SZ_OK + || p->wasInterrupted + || codeRes != SZ_OK + || wasInterrupted + || p->numFilledThreads != 0 + || isErrorMode) + { + if (p->numFilledThreads == 0) + p->filledThreadStart = t->index; + if (inDataSize != 0 || !finish) + { + t->inDataSize_Start = inDataSize_Start; + t->inDataSize = inDataSize; + p->numFilledThreads++; + } + PRF(printf("\np->numFilledThreads = %d\n", p->numFilledThreads)); + PRF(printf("p->filledThreadStart = %d\n", p->filledThreadStart)); + } + + if (!finish) + { + RINOK_THREAD(Event_Set(&nextThread->canWrite)); + } + else + { + if (needContinue) + { + // we restore decoding with new iteration + RINOK_THREAD(Event_Set(&p->threads[0].canWrite)); + } + else + { + // we exit from decoding + if (t->index == 0) + return SZ_OK; + p->exitThread = True; + } + RINOK_THREAD(Event_Set(&p->threads[0].canRead)); + } + } + } +} + +#ifdef _WIN32 +#define USE_ALLOCA +#endif + +#ifdef USE_ALLOCA +#ifdef _WIN32 +#include +#else +#include +#endif +#endif + + +static THREAD_FUNC_DECL ThreadFunc1(void *pp) +{ + WRes res; + + CMtDecThread *t = (CMtDecThread *)pp; + CMtDec *p; + + // fprintf(stdout, "\n%d = %p\n", t->index, &t); + + res = ThreadFunc2(t); + p = t->mtDec; + if (res == 0) + return (THREAD_FUNC_RET_TYPE)(UINT_PTR)p->exitThreadWRes; + { + // it's unexpected situation for some threading function error + if (p->exitThreadWRes == 0) + p->exitThreadWRes = res; + PRF(printf("\nthread exit error = %d\n", res)); + p->exitThread = True; + Event_Set(&p->threads[0].canRead); + Event_Set(&p->threads[0].canWrite); + MtProgress_SetError(&p->mtProgress, MY_SRes_HRESULT_FROM_WRes(res)); + } + return (THREAD_FUNC_RET_TYPE)(UINT_PTR)res; +} + +static MY_NO_INLINE THREAD_FUNC_DECL ThreadFunc(void *pp) +{ + #ifdef USE_ALLOCA + CMtDecThread *t = (CMtDecThread *)pp; + // fprintf(stderr, "\n%d = %p - before", t->index, &t); + t->allocaPtr = alloca(t->index * 128); + #endif + return ThreadFunc1(pp); +} + + +int MtDec_PrepareRead(CMtDec *p) +{ + if (p->crossBlock && p->crossStart == p->crossEnd) + { + ISzAlloc_Free(p->alloc, p->crossBlock); + p->crossBlock = NULL; + } + + { + unsigned i; + for (i = 0; i < MTDEC__THREADS_MAX; i++) + if (i > p->numStartedThreads + || p->numFilledThreads <= + (i >= p->filledThreadStart ? + i - p->filledThreadStart : + i + p->numStartedThreads - p->filledThreadStart)) + MtDecThread_FreeInBufs(&p->threads[i]); + } + + return (p->numFilledThreads != 0) || (p->crossStart != p->crossEnd); +} + + +const Byte *MtDec_Read(CMtDec *p, size_t *inLim) +{ + while (p->numFilledThreads != 0) + { + CMtDecThread *t = &p->threads[p->filledThreadStart]; + + if (*inLim != 0) + { + { + void *link = t->inBuf; + void *next = ((CMtDecBufLink *)link)->next; + ISzAlloc_Free(p->alloc, link); + t->inBuf = next; + } + + if (t->inDataSize == 0) + { + MtDecThread_FreeInBufs(t); + if (--p->numFilledThreads == 0) + break; + if (++p->filledThreadStart == p->numStartedThreads) + p->filledThreadStart = 0; + t = &p->threads[p->filledThreadStart]; + } + } + + { + size_t lim = t->inDataSize_Start; + if (lim != 0) + t->inDataSize_Start = 0; + else + { + UInt64 rem = t->inDataSize; + lim = p->inBufSize; + if (lim > rem) + lim = (size_t)rem; + } + t->inDataSize -= lim; + *inLim = lim; + return (const Byte *)MTDEC__DATA_PTR_FROM_LINK(t->inBuf); + } + } + + { + size_t crossSize = p->crossEnd - p->crossStart; + if (crossSize != 0) + { + const Byte *data = MTDEC__DATA_PTR_FROM_LINK(p->crossBlock) + p->crossStart; + *inLim = crossSize; + p->crossStart = 0; + p->crossEnd = 0; + return data; + } + *inLim = 0; + if (p->crossBlock) + { + ISzAlloc_Free(p->alloc, p->crossBlock); + p->crossBlock = NULL; + } + return NULL; + } +} + + +void MtDec_Construct(CMtDec *p) +{ + unsigned i; + + p->inBufSize = (size_t)1 << 18; + + p->numThreadsMax = 0; + + p->inStream = NULL; + + // p->inData = NULL; + // p->inDataSize = 0; + + p->crossBlock = NULL; + p->crossStart = 0; + p->crossEnd = 0; + + p->numFilledThreads = 0; + + p->progress = NULL; + p->alloc = NULL; + + p->mtCallback = NULL; + p->mtCallbackObject = NULL; + + p->allocatedBufsSize = 0; + + for (i = 0; i < MTDEC__THREADS_MAX; i++) + { + CMtDecThread *t = &p->threads[i]; + t->mtDec = p; + t->index = i; + t->inBuf = NULL; + Event_Construct(&t->canRead); + Event_Construct(&t->canWrite); + Thread_Construct(&t->thread); + } + + // Event_Construct(&p->finishedEvent); + + CriticalSection_Init(&p->mtProgress.cs); +} + + +static void MtDec_Free(CMtDec *p) +{ + unsigned i; + + p->exitThread = True; + + for (i = 0; i < MTDEC__THREADS_MAX; i++) + MtDecThread_Destruct(&p->threads[i]); + + // Event_Close(&p->finishedEvent); + + if (p->crossBlock) + { + ISzAlloc_Free(p->alloc, p->crossBlock); + p->crossBlock = NULL; + } +} + + +void MtDec_Destruct(CMtDec *p) +{ + MtDec_Free(p); + + CriticalSection_Delete(&p->mtProgress.cs); +} + + +SRes MtDec_Code(CMtDec *p) +{ + unsigned i; + + p->inProcessed = 0; + + p->blockIndex = 1; // it must be larger than not_defined index (0) + p->isAllocError = False; + p->overflow = False; + p->threadingErrorSRes = SZ_OK; + + p->needContinue = True; + + p->readWasFinished = False; + p->needInterrupt = False; + p->interruptIndex = (UInt64)(Int64)-1; + + p->readProcessed = 0; + p->readRes = SZ_OK; + p->codeRes = SZ_OK; + p->wasInterrupted = False; + + p->crossStart = 0; + p->crossEnd = 0; + + p->filledThreadStart = 0; + p->numFilledThreads = 0; + + { + unsigned numThreads = p->numThreadsMax; + if (numThreads > MTDEC__THREADS_MAX) + numThreads = MTDEC__THREADS_MAX; + p->numStartedThreads_Limit = numThreads; + p->numStartedThreads = 0; + } + + if (p->inBufSize != p->allocatedBufsSize) + { + for (i = 0; i < MTDEC__THREADS_MAX; i++) + { + CMtDecThread *t = &p->threads[i]; + if (t->inBuf) + MtDecThread_FreeInBufs(t); + } + if (p->crossBlock) + { + ISzAlloc_Free(p->alloc, p->crossBlock); + p->crossBlock = NULL; + } + + p->allocatedBufsSize = p->inBufSize; + } + + MtProgress_Init(&p->mtProgress, p->progress); + + // RINOK_THREAD(ArEvent_OptCreate_And_Reset(&p->finishedEvent)); + p->exitThread = False; + p->exitThreadWRes = 0; + + { + WRes wres; + SRes sres; + CMtDecThread *nextThread = &p->threads[p->numStartedThreads++]; + // wres = MtDecThread_CreateAndStart(nextThread); + wres = MtDecThread_CreateEvents(nextThread); + if (wres == 0) { wres = Event_Set(&nextThread->canWrite); + if (wres == 0) { wres = Event_Set(&nextThread->canRead); + if (wres == 0) { THREAD_FUNC_RET_TYPE res = ThreadFunc(nextThread); + wres = (WRes)(UINT_PTR)res; + if (wres != 0) + { + p->needContinue = False; + MtDec_CloseThreads(p); + }}}} + + // wres = 17; // for test + // wres = Event_Wait(&p->finishedEvent); + + sres = MY_SRes_HRESULT_FROM_WRes(wres); + + if (sres != 0) + p->threadingErrorSRes = sres; + + if ( + // wres == 0 + // wres != 0 + // || p->mtc.codeRes == SZ_ERROR_MEM + p->isAllocError + || p->threadingErrorSRes != SZ_OK + || p->overflow) + { + // p->needContinue = True; + } + else + p->needContinue = False; + + if (p->needContinue) + return SZ_OK; + + // if (sres != SZ_OK) + return sres; + // return SZ_ERROR_FAIL; + } +} + +#endif diff --git a/deps/LZMA-SDK/C/MtDec.h b/deps/LZMA-SDK/C/MtDec.h index 7a30b6a9e..c2da46ae2 100644 --- a/deps/LZMA-SDK/C/MtDec.h +++ b/deps/LZMA-SDK/C/MtDec.h @@ -1,202 +1,202 @@ -/* MtDec.h -- Multi-thread Decoder -2020-03-05 : Igor Pavlov : Public domain */ - -#ifndef __MT_DEC_H -#define __MT_DEC_H - -#include "7zTypes.h" - -#ifndef _7ZIP_ST -#include "Threads.h" -#endif - -EXTERN_C_BEGIN - -#ifndef _7ZIP_ST - -#ifndef _7ZIP_ST - #define MTDEC__THREADS_MAX 32 -#else - #define MTDEC__THREADS_MAX 1 -#endif - - -typedef struct -{ - ICompressProgress *progress; - SRes res; - UInt64 totalInSize; - UInt64 totalOutSize; - CCriticalSection cs; -} CMtProgress; - -void MtProgress_Init(CMtProgress *p, ICompressProgress *progress); -SRes MtProgress_Progress_ST(CMtProgress *p); -SRes MtProgress_ProgressAdd(CMtProgress *p, UInt64 inSize, UInt64 outSize); -SRes MtProgress_GetError(CMtProgress *p); -void MtProgress_SetError(CMtProgress *p, SRes res); - -struct _CMtDec; - -typedef struct -{ - struct _CMtDec *mtDec; - unsigned index; - void *inBuf; - - size_t inDataSize_Start; // size of input data in start block - UInt64 inDataSize; // total size of input data in all blocks - - CThread thread; - CAutoResetEvent canRead; - CAutoResetEvent canWrite; - void *allocaPtr; -} CMtDecThread; - -void MtDecThread_FreeInBufs(CMtDecThread *t); - - -typedef enum -{ - MTDEC_PARSE_CONTINUE, // continue this block with more input data - MTDEC_PARSE_OVERFLOW, // MT buffers overflow, need switch to single-thread - MTDEC_PARSE_NEW, // new block - MTDEC_PARSE_END // end of block threading. But we still can return to threading after Write(&needContinue) -} EMtDecParseState; - -typedef struct -{ - // in - int startCall; - const Byte *src; - size_t srcSize; - // in : (srcSize == 0) is allowed - // out : it's allowed to return less that actually was used ? - int srcFinished; - - // out - EMtDecParseState state; - BoolInt canCreateNewThread; - UInt64 outPos; // check it (size_t) -} CMtDecCallbackInfo; - - -typedef struct -{ - void (*Parse)(void *p, unsigned coderIndex, CMtDecCallbackInfo *ci); - - // PreCode() and Code(): - // (SRes_return_result != SZ_OK) means stop decoding, no need another blocks - SRes (*PreCode)(void *p, unsigned coderIndex); - SRes (*Code)(void *p, unsigned coderIndex, - const Byte *src, size_t srcSize, int srcFinished, - UInt64 *inCodePos, UInt64 *outCodePos, int *stop); - // stop - means stop another Code calls - - - /* Write() must be called, if Parse() was called - set (needWrite) if - { - && (was not interrupted by progress) - && (was not interrupted in previous block) - } - - out: - if (*needContinue), decoder still need to continue decoding with new iteration, - even after MTDEC_PARSE_END - if (*canRecode), we didn't flush current block data, so we still can decode current block later. - */ - SRes (*Write)(void *p, unsigned coderIndex, - BoolInt needWriteToStream, - const Byte *src, size_t srcSize, BoolInt isCross, - // int srcFinished, - BoolInt *needContinue, - BoolInt *canRecode); - -} IMtDecCallback2; - - - -typedef struct _CMtDec -{ - /* input variables */ - - size_t inBufSize; /* size of input block */ - unsigned numThreadsMax; - // size_t inBlockMax; - unsigned numThreadsMax_2; - - ISeqInStream *inStream; - // const Byte *inData; - // size_t inDataSize; - - ICompressProgress *progress; - ISzAllocPtr alloc; - - IMtDecCallback2 *mtCallback; - void *mtCallbackObject; - - - /* internal variables */ - - size_t allocatedBufsSize; - - BoolInt exitThread; - WRes exitThreadWRes; - - UInt64 blockIndex; - BoolInt isAllocError; - BoolInt overflow; - SRes threadingErrorSRes; - - BoolInt needContinue; - - // CAutoResetEvent finishedEvent; - - SRes readRes; - SRes codeRes; - - BoolInt wasInterrupted; - - unsigned numStartedThreads_Limit; - unsigned numStartedThreads; - - Byte *crossBlock; - size_t crossStart; - size_t crossEnd; - UInt64 readProcessed; - BoolInt readWasFinished; - UInt64 inProcessed; - - unsigned filledThreadStart; - unsigned numFilledThreads; - - #ifndef _7ZIP_ST - BoolInt needInterrupt; - UInt64 interruptIndex; - CMtProgress mtProgress; - CMtDecThread threads[MTDEC__THREADS_MAX]; - #endif -} CMtDec; - - -void MtDec_Construct(CMtDec *p); -void MtDec_Destruct(CMtDec *p); - -/* -MtDec_Code() returns: - SZ_OK - in most cases - MY_SRes_HRESULT_FROM_WRes(WRes_error) - in case of unexpected error in threading function -*/ - -SRes MtDec_Code(CMtDec *p); -Byte *MtDec_GetCrossBuff(CMtDec *p); - -int MtDec_PrepareRead(CMtDec *p); -const Byte *MtDec_Read(CMtDec *p, size_t *inLim); - -#endif - -EXTERN_C_END - -#endif +/* MtDec.h -- Multi-thread Decoder +2020-03-05 : Igor Pavlov : Public domain */ + +#ifndef __MT_DEC_H +#define __MT_DEC_H + +#include "7zTypes.h" + +#ifndef _7ZIP_ST +#include "Threads.h" +#endif + +EXTERN_C_BEGIN + +#ifndef _7ZIP_ST + +#ifndef _7ZIP_ST + #define MTDEC__THREADS_MAX 32 +#else + #define MTDEC__THREADS_MAX 1 +#endif + + +typedef struct +{ + ICompressProgress *progress; + SRes res; + UInt64 totalInSize; + UInt64 totalOutSize; + CCriticalSection cs; +} CMtProgress; + +void MtProgress_Init(CMtProgress *p, ICompressProgress *progress); +SRes MtProgress_Progress_ST(CMtProgress *p); +SRes MtProgress_ProgressAdd(CMtProgress *p, UInt64 inSize, UInt64 outSize); +SRes MtProgress_GetError(CMtProgress *p); +void MtProgress_SetError(CMtProgress *p, SRes res); + +struct _CMtDec; + +typedef struct +{ + struct _CMtDec *mtDec; + unsigned index; + void *inBuf; + + size_t inDataSize_Start; // size of input data in start block + UInt64 inDataSize; // total size of input data in all blocks + + CThread thread; + CAutoResetEvent canRead; + CAutoResetEvent canWrite; + void *allocaPtr; +} CMtDecThread; + +void MtDecThread_FreeInBufs(CMtDecThread *t); + + +typedef enum +{ + MTDEC_PARSE_CONTINUE, // continue this block with more input data + MTDEC_PARSE_OVERFLOW, // MT buffers overflow, need switch to single-thread + MTDEC_PARSE_NEW, // new block + MTDEC_PARSE_END // end of block threading. But we still can return to threading after Write(&needContinue) +} EMtDecParseState; + +typedef struct +{ + // in + int startCall; + const Byte *src; + size_t srcSize; + // in : (srcSize == 0) is allowed + // out : it's allowed to return less that actually was used ? + int srcFinished; + + // out + EMtDecParseState state; + BoolInt canCreateNewThread; + UInt64 outPos; // check it (size_t) +} CMtDecCallbackInfo; + + +typedef struct +{ + void (*Parse)(void *p, unsigned coderIndex, CMtDecCallbackInfo *ci); + + // PreCode() and Code(): + // (SRes_return_result != SZ_OK) means stop decoding, no need another blocks + SRes (*PreCode)(void *p, unsigned coderIndex); + SRes (*Code)(void *p, unsigned coderIndex, + const Byte *src, size_t srcSize, int srcFinished, + UInt64 *inCodePos, UInt64 *outCodePos, int *stop); + // stop - means stop another Code calls + + + /* Write() must be called, if Parse() was called + set (needWrite) if + { + && (was not interrupted by progress) + && (was not interrupted in previous block) + } + + out: + if (*needContinue), decoder still need to continue decoding with new iteration, + even after MTDEC_PARSE_END + if (*canRecode), we didn't flush current block data, so we still can decode current block later. + */ + SRes (*Write)(void *p, unsigned coderIndex, + BoolInt needWriteToStream, + const Byte *src, size_t srcSize, BoolInt isCross, + // int srcFinished, + BoolInt *needContinue, + BoolInt *canRecode); + +} IMtDecCallback2; + + + +typedef struct _CMtDec +{ + /* input variables */ + + size_t inBufSize; /* size of input block */ + unsigned numThreadsMax; + // size_t inBlockMax; + unsigned numThreadsMax_2; + + ISeqInStream *inStream; + // const Byte *inData; + // size_t inDataSize; + + ICompressProgress *progress; + ISzAllocPtr alloc; + + IMtDecCallback2 *mtCallback; + void *mtCallbackObject; + + + /* internal variables */ + + size_t allocatedBufsSize; + + BoolInt exitThread; + WRes exitThreadWRes; + + UInt64 blockIndex; + BoolInt isAllocError; + BoolInt overflow; + SRes threadingErrorSRes; + + BoolInt needContinue; + + // CAutoResetEvent finishedEvent; + + SRes readRes; + SRes codeRes; + + BoolInt wasInterrupted; + + unsigned numStartedThreads_Limit; + unsigned numStartedThreads; + + Byte *crossBlock; + size_t crossStart; + size_t crossEnd; + UInt64 readProcessed; + BoolInt readWasFinished; + UInt64 inProcessed; + + unsigned filledThreadStart; + unsigned numFilledThreads; + + #ifndef _7ZIP_ST + BoolInt needInterrupt; + UInt64 interruptIndex; + CMtProgress mtProgress; + CMtDecThread threads[MTDEC__THREADS_MAX]; + #endif +} CMtDec; + + +void MtDec_Construct(CMtDec *p); +void MtDec_Destruct(CMtDec *p); + +/* +MtDec_Code() returns: + SZ_OK - in most cases + MY_SRes_HRESULT_FROM_WRes(WRes_error) - in case of unexpected error in threading function +*/ + +SRes MtDec_Code(CMtDec *p); +Byte *MtDec_GetCrossBuff(CMtDec *p); + +int MtDec_PrepareRead(CMtDec *p); +const Byte *MtDec_Read(CMtDec *p, size_t *inLim); + +#endif + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/Ppmd.h b/deps/LZMA-SDK/C/Ppmd.h index ee93ecece..b19879208 100644 --- a/deps/LZMA-SDK/C/Ppmd.h +++ b/deps/LZMA-SDK/C/Ppmd.h @@ -1,167 +1,167 @@ -/* Ppmd.h -- PPMD codec common code -2021-04-13 : Igor Pavlov : Public domain -This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ - -#ifndef __PPMD_H -#define __PPMD_H - -#include "CpuArch.h" - -EXTERN_C_BEGIN - -#if defined(MY_CPU_SIZEOF_POINTER) && (MY_CPU_SIZEOF_POINTER == 4) -/* - PPMD code always uses 32-bit internal fields in PPMD structures to store internal references in main block. - if (PPMD_32BIT is defined), the PPMD code stores internal pointers to 32-bit reference fields. - if (PPMD_32BIT is NOT defined), the PPMD code stores internal UInt32 offsets to reference fields. - if (pointer size is 64-bit), then (PPMD_32BIT) mode is not allowed, - if (pointer size is 32-bit), then (PPMD_32BIT) mode is optional, - and it's allowed to disable PPMD_32BIT mode even if pointer is 32-bit. - PPMD code works slightly faster in (PPMD_32BIT) mode. -*/ - #define PPMD_32BIT -#endif - -#define PPMD_INT_BITS 7 -#define PPMD_PERIOD_BITS 7 -#define PPMD_BIN_SCALE (1 << (PPMD_INT_BITS + PPMD_PERIOD_BITS)) - -#define PPMD_GET_MEAN_SPEC(summ, shift, round) (((summ) + (1 << ((shift) - (round)))) >> (shift)) -#define PPMD_GET_MEAN(summ) PPMD_GET_MEAN_SPEC((summ), PPMD_PERIOD_BITS, 2) -#define PPMD_UPDATE_PROB_0(prob) ((prob) + (1 << PPMD_INT_BITS) - PPMD_GET_MEAN(prob)) -#define PPMD_UPDATE_PROB_1(prob) ((prob) - PPMD_GET_MEAN(prob)) - -#define PPMD_N1 4 -#define PPMD_N2 4 -#define PPMD_N3 4 -#define PPMD_N4 ((128 + 3 - 1 * PPMD_N1 - 2 * PPMD_N2 - 3 * PPMD_N3) / 4) -#define PPMD_NUM_INDEXES (PPMD_N1 + PPMD_N2 + PPMD_N3 + PPMD_N4) - -MY_CPU_pragma_pack_push_1 -/* Most compilers works OK here even without #pragma pack(push, 1), but some GCC compilers need it. */ - -/* SEE-contexts for PPM-contexts with masked symbols */ -typedef struct -{ - UInt16 Summ; /* Freq */ - Byte Shift; /* Speed of Freq change; low Shift is for fast change */ - Byte Count; /* Count to next change of Shift */ -} CPpmd_See; - -#define Ppmd_See_Update(p) if ((p)->Shift < PPMD_PERIOD_BITS && --(p)->Count == 0) \ - { (p)->Summ = (UInt16)((p)->Summ << 1); (p)->Count = (Byte)(3 << (p)->Shift++); } - - -typedef struct -{ - Byte Symbol; - Byte Freq; - UInt16 Successor_0; - UInt16 Successor_1; -} CPpmd_State; - -typedef struct CPpmd_State2_ -{ - Byte Symbol; - Byte Freq; -} CPpmd_State2; - -typedef struct CPpmd_State4_ -{ - UInt16 Successor_0; - UInt16 Successor_1; -} CPpmd_State4; - -MY_CPU_pragma_pop - -/* - PPMD code can write full CPpmd_State structure data to CPpmd*_Context - at (byte offset = 2) instead of some fields of original CPpmd*_Context structure. - - If we use pointers to different types, but that point to shared - memory space, we can have aliasing problem (strict aliasing). - - XLC compiler in -O2 mode can change the order of memory write instructions - in relation to read instructions, if we have use pointers to different types. - - To solve that aliasing problem we use combined CPpmd*_Context structure - with unions that contain the fields from both structures: - the original CPpmd*_Context and CPpmd_State. - So we can access the fields from both structures via one pointer, - and the compiler doesn't change the order of write instructions - in relation to read instructions. - - If we don't use memory write instructions to shared memory in - some local code, and we use only reading instructions (read only), - then probably it's safe to use pointers to different types for reading. -*/ - - - -#ifdef PPMD_32BIT - - #define Ppmd_Ref_Type(type) type * - #define Ppmd_GetRef(p, ptr) (ptr) - #define Ppmd_GetPtr(p, ptr) (ptr) - #define Ppmd_GetPtr_Type(p, ptr, note_type) (ptr) - -#else - - #define Ppmd_Ref_Type(type) UInt32 - #define Ppmd_GetRef(p, ptr) ((UInt32)((Byte *)(ptr) - (p)->Base)) - #define Ppmd_GetPtr(p, offs) ((void *)((p)->Base + (offs))) - #define Ppmd_GetPtr_Type(p, offs, type) ((type *)Ppmd_GetPtr(p, offs)) - -#endif // PPMD_32BIT - - -typedef Ppmd_Ref_Type(CPpmd_State) CPpmd_State_Ref; -typedef Ppmd_Ref_Type(void) CPpmd_Void_Ref; -typedef Ppmd_Ref_Type(Byte) CPpmd_Byte_Ref; - - -/* -#ifdef MY_CPU_LE_UNALIGN -// the unaligned 32-bit access latency can be too large, if the data is not in L1 cache. -#define Ppmd_GET_SUCCESSOR(p) ((CPpmd_Void_Ref)*(const UInt32 *)(const void *)&(p)->Successor_0) -#define Ppmd_SET_SUCCESSOR(p, v) *(UInt32 *)(void *)(void *)&(p)->Successor_0 = (UInt32)(v) - -#else -*/ - -/* - We can write 16-bit halves to 32-bit (Successor) field in any selected order. - But the native order is more consistent way. - So we use the native order, if LE/BE order can be detected here at compile time. -*/ - -#ifdef MY_CPU_BE - - #define Ppmd_GET_SUCCESSOR(p) \ - ( (CPpmd_Void_Ref) (((UInt32)(p)->Successor_0 << 16) | (p)->Successor_1) ) - - #define Ppmd_SET_SUCCESSOR(p, v) { \ - (p)->Successor_0 = (UInt16)(((UInt32)(v) >> 16) /* & 0xFFFF */); \ - (p)->Successor_1 = (UInt16)((UInt32)(v) /* & 0xFFFF */); } - -#else - - #define Ppmd_GET_SUCCESSOR(p) \ - ( (CPpmd_Void_Ref) ((p)->Successor_0 | ((UInt32)(p)->Successor_1 << 16)) ) - - #define Ppmd_SET_SUCCESSOR(p, v) { \ - (p)->Successor_0 = (UInt16)((UInt32)(v) /* & 0xFFFF */); \ - (p)->Successor_1 = (UInt16)(((UInt32)(v) >> 16) /* & 0xFFFF */); } - -#endif - -// #endif - - -#define PPMD_SetAllBitsIn256Bytes(p) \ - { size_t z; for (z = 0; z < 256 / sizeof(p[0]); z += 8) { \ - p[z+7] = p[z+6] = p[z+5] = p[z+4] = p[z+3] = p[z+2] = p[z+1] = p[z+0] = ~(size_t)0; }} - -EXTERN_C_END - -#endif +/* Ppmd.h -- PPMD codec common code +2021-04-13 : Igor Pavlov : Public domain +This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ + +#ifndef __PPMD_H +#define __PPMD_H + +#include "CpuArch.h" + +EXTERN_C_BEGIN + +#if defined(MY_CPU_SIZEOF_POINTER) && (MY_CPU_SIZEOF_POINTER == 4) +/* + PPMD code always uses 32-bit internal fields in PPMD structures to store internal references in main block. + if (PPMD_32BIT is defined), the PPMD code stores internal pointers to 32-bit reference fields. + if (PPMD_32BIT is NOT defined), the PPMD code stores internal UInt32 offsets to reference fields. + if (pointer size is 64-bit), then (PPMD_32BIT) mode is not allowed, + if (pointer size is 32-bit), then (PPMD_32BIT) mode is optional, + and it's allowed to disable PPMD_32BIT mode even if pointer is 32-bit. + PPMD code works slightly faster in (PPMD_32BIT) mode. +*/ + #define PPMD_32BIT +#endif + +#define PPMD_INT_BITS 7 +#define PPMD_PERIOD_BITS 7 +#define PPMD_BIN_SCALE (1 << (PPMD_INT_BITS + PPMD_PERIOD_BITS)) + +#define PPMD_GET_MEAN_SPEC(summ, shift, round) (((summ) + (1 << ((shift) - (round)))) >> (shift)) +#define PPMD_GET_MEAN(summ) PPMD_GET_MEAN_SPEC((summ), PPMD_PERIOD_BITS, 2) +#define PPMD_UPDATE_PROB_0(prob) ((prob) + (1 << PPMD_INT_BITS) - PPMD_GET_MEAN(prob)) +#define PPMD_UPDATE_PROB_1(prob) ((prob) - PPMD_GET_MEAN(prob)) + +#define PPMD_N1 4 +#define PPMD_N2 4 +#define PPMD_N3 4 +#define PPMD_N4 ((128 + 3 - 1 * PPMD_N1 - 2 * PPMD_N2 - 3 * PPMD_N3) / 4) +#define PPMD_NUM_INDEXES (PPMD_N1 + PPMD_N2 + PPMD_N3 + PPMD_N4) + +MY_CPU_pragma_pack_push_1 +/* Most compilers works OK here even without #pragma pack(push, 1), but some GCC compilers need it. */ + +/* SEE-contexts for PPM-contexts with masked symbols */ +typedef struct +{ + UInt16 Summ; /* Freq */ + Byte Shift; /* Speed of Freq change; low Shift is for fast change */ + Byte Count; /* Count to next change of Shift */ +} CPpmd_See; + +#define Ppmd_See_Update(p) if ((p)->Shift < PPMD_PERIOD_BITS && --(p)->Count == 0) \ + { (p)->Summ = (UInt16)((p)->Summ << 1); (p)->Count = (Byte)(3 << (p)->Shift++); } + + +typedef struct +{ + Byte Symbol; + Byte Freq; + UInt16 Successor_0; + UInt16 Successor_1; +} CPpmd_State; + +typedef struct CPpmd_State2_ +{ + Byte Symbol; + Byte Freq; +} CPpmd_State2; + +typedef struct CPpmd_State4_ +{ + UInt16 Successor_0; + UInt16 Successor_1; +} CPpmd_State4; + +MY_CPU_pragma_pop + +/* + PPMD code can write full CPpmd_State structure data to CPpmd*_Context + at (byte offset = 2) instead of some fields of original CPpmd*_Context structure. + + If we use pointers to different types, but that point to shared + memory space, we can have aliasing problem (strict aliasing). + + XLC compiler in -O2 mode can change the order of memory write instructions + in relation to read instructions, if we have use pointers to different types. + + To solve that aliasing problem we use combined CPpmd*_Context structure + with unions that contain the fields from both structures: + the original CPpmd*_Context and CPpmd_State. + So we can access the fields from both structures via one pointer, + and the compiler doesn't change the order of write instructions + in relation to read instructions. + + If we don't use memory write instructions to shared memory in + some local code, and we use only reading instructions (read only), + then probably it's safe to use pointers to different types for reading. +*/ + + + +#ifdef PPMD_32BIT + + #define Ppmd_Ref_Type(type) type * + #define Ppmd_GetRef(p, ptr) (ptr) + #define Ppmd_GetPtr(p, ptr) (ptr) + #define Ppmd_GetPtr_Type(p, ptr, note_type) (ptr) + +#else + + #define Ppmd_Ref_Type(type) UInt32 + #define Ppmd_GetRef(p, ptr) ((UInt32)((Byte *)(ptr) - (p)->Base)) + #define Ppmd_GetPtr(p, offs) ((void *)((p)->Base + (offs))) + #define Ppmd_GetPtr_Type(p, offs, type) ((type *)Ppmd_GetPtr(p, offs)) + +#endif // PPMD_32BIT + + +typedef Ppmd_Ref_Type(CPpmd_State) CPpmd_State_Ref; +typedef Ppmd_Ref_Type(void) CPpmd_Void_Ref; +typedef Ppmd_Ref_Type(Byte) CPpmd_Byte_Ref; + + +/* +#ifdef MY_CPU_LE_UNALIGN +// the unaligned 32-bit access latency can be too large, if the data is not in L1 cache. +#define Ppmd_GET_SUCCESSOR(p) ((CPpmd_Void_Ref)*(const UInt32 *)(const void *)&(p)->Successor_0) +#define Ppmd_SET_SUCCESSOR(p, v) *(UInt32 *)(void *)(void *)&(p)->Successor_0 = (UInt32)(v) + +#else +*/ + +/* + We can write 16-bit halves to 32-bit (Successor) field in any selected order. + But the native order is more consistent way. + So we use the native order, if LE/BE order can be detected here at compile time. +*/ + +#ifdef MY_CPU_BE + + #define Ppmd_GET_SUCCESSOR(p) \ + ( (CPpmd_Void_Ref) (((UInt32)(p)->Successor_0 << 16) | (p)->Successor_1) ) + + #define Ppmd_SET_SUCCESSOR(p, v) { \ + (p)->Successor_0 = (UInt16)(((UInt32)(v) >> 16) /* & 0xFFFF */); \ + (p)->Successor_1 = (UInt16)((UInt32)(v) /* & 0xFFFF */); } + +#else + + #define Ppmd_GET_SUCCESSOR(p) \ + ( (CPpmd_Void_Ref) ((p)->Successor_0 | ((UInt32)(p)->Successor_1 << 16)) ) + + #define Ppmd_SET_SUCCESSOR(p, v) { \ + (p)->Successor_0 = (UInt16)((UInt32)(v) /* & 0xFFFF */); \ + (p)->Successor_1 = (UInt16)(((UInt32)(v) >> 16) /* & 0xFFFF */); } + +#endif + +// #endif + + +#define PPMD_SetAllBitsIn256Bytes(p) \ + { size_t z; for (z = 0; z < 256 / sizeof(p[0]); z += 8) { \ + p[z+7] = p[z+6] = p[z+5] = p[z+4] = p[z+3] = p[z+2] = p[z+1] = p[z+0] = ~(size_t)0; }} + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/Ppmd7.c b/deps/LZMA-SDK/C/Ppmd7.c index b6ecf1430..cf401cb37 100644 --- a/deps/LZMA-SDK/C/Ppmd7.c +++ b/deps/LZMA-SDK/C/Ppmd7.c @@ -1,1104 +1,1104 @@ -/* Ppmd7.c -- PPMdH codec -2021-04-13 : Igor Pavlov : Public domain -This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ - -#include "Precomp.h" - -#include - -#include "Ppmd7.h" - -/* define PPMD7_ORDER_0_SUPPPORT to suport order-0 mode, unsupported by orignal PPMd var.H. code */ -// #define PPMD7_ORDER_0_SUPPPORT - -MY_ALIGN(16) -static const Byte PPMD7_kExpEscape[16] = { 25, 14, 9, 7, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2 }; -MY_ALIGN(16) -static const UInt16 kInitBinEsc[] = { 0x3CDD, 0x1F3F, 0x59BF, 0x48F3, 0x64A1, 0x5ABC, 0x6632, 0x6051}; - -#define MAX_FREQ 124 -#define UNIT_SIZE 12 - -#define U2B(nu) ((UInt32)(nu) * UNIT_SIZE) -#define U2I(nu) (p->Units2Indx[(size_t)(nu) - 1]) -#define I2U(indx) ((unsigned)p->Indx2Units[indx]) -#define I2U_UInt16(indx) ((UInt16)p->Indx2Units[indx]) - -#define REF(ptr) Ppmd_GetRef(p, ptr) - -#define STATS_REF(ptr) ((CPpmd_State_Ref)REF(ptr)) - -#define CTX(ref) ((CPpmd7_Context *)Ppmd7_GetContext(p, ref)) -#define STATS(ctx) Ppmd7_GetStats(p, ctx) -#define ONE_STATE(ctx) Ppmd7Context_OneState(ctx) -#define SUFFIX(ctx) CTX((ctx)->Suffix) - -typedef CPpmd7_Context * CTX_PTR; - -struct CPpmd7_Node_; - -typedef Ppmd_Ref_Type(struct CPpmd7_Node_) CPpmd7_Node_Ref; - -typedef struct CPpmd7_Node_ -{ - UInt16 Stamp; /* must be at offset 0 as CPpmd7_Context::NumStats. Stamp=0 means free */ - UInt16 NU; - CPpmd7_Node_Ref Next; /* must be at offset >= 4 */ - CPpmd7_Node_Ref Prev; -} CPpmd7_Node; - -#define NODE(r) Ppmd_GetPtr_Type(p, r, CPpmd7_Node) - -void Ppmd7_Construct(CPpmd7 *p) -{ - unsigned i, k, m; - - p->Base = NULL; - - for (i = 0, k = 0; i < PPMD_NUM_INDEXES; i++) - { - unsigned step = (i >= 12 ? 4 : (i >> 2) + 1); - do { p->Units2Indx[k++] = (Byte)i; } while (--step); - p->Indx2Units[i] = (Byte)k; - } - - p->NS2BSIndx[0] = (0 << 1); - p->NS2BSIndx[1] = (1 << 1); - memset(p->NS2BSIndx + 2, (2 << 1), 9); - memset(p->NS2BSIndx + 11, (3 << 1), 256 - 11); - - for (i = 0; i < 3; i++) - p->NS2Indx[i] = (Byte)i; - - for (m = i, k = 1; i < 256; i++) - { - p->NS2Indx[i] = (Byte)m; - if (--k == 0) - k = (++m) - 2; - } - - memcpy(p->ExpEscape, PPMD7_kExpEscape, 16); -} - - -void Ppmd7_Free(CPpmd7 *p, ISzAllocPtr alloc) -{ - ISzAlloc_Free(alloc, p->Base); - p->Size = 0; - p->Base = NULL; -} - - -BoolInt Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAllocPtr alloc) -{ - if (!p->Base || p->Size != size) - { - Ppmd7_Free(p, alloc); - p->AlignOffset = (4 - size) & 3; - if ((p->Base = (Byte *)ISzAlloc_Alloc(alloc, p->AlignOffset + size)) == NULL) - return False; - p->Size = size; - } - return True; -} - - - -// ---------- Internal Memory Allocator ---------- - -/* We can use CPpmd7_Node in list of free units (as in Ppmd8) - But we still need one additional list walk pass in GlueFreeBlocks(). - So we use simple CPpmd_Void_Ref instead of CPpmd7_Node in InsertNode() / RemoveNode() -*/ - -#define EMPTY_NODE 0 - - -static void InsertNode(CPpmd7 *p, void *node, unsigned indx) -{ - *((CPpmd_Void_Ref *)node) = p->FreeList[indx]; - // ((CPpmd7_Node *)node)->Next = (CPpmd7_Node_Ref)p->FreeList[indx]; - - p->FreeList[indx] = REF(node); - -} - - -static void *RemoveNode(CPpmd7 *p, unsigned indx) -{ - CPpmd_Void_Ref *node = (CPpmd_Void_Ref *)Ppmd7_GetPtr(p, p->FreeList[indx]); - p->FreeList[indx] = *node; - // CPpmd7_Node *node = NODE((CPpmd7_Node_Ref)p->FreeList[indx]); - // p->FreeList[indx] = node->Next; - return node; -} - - -static void SplitBlock(CPpmd7 *p, void *ptr, unsigned oldIndx, unsigned newIndx) -{ - unsigned i, nu = I2U(oldIndx) - I2U(newIndx); - ptr = (Byte *)ptr + U2B(I2U(newIndx)); - if (I2U(i = U2I(nu)) != nu) - { - unsigned k = I2U(--i); - InsertNode(p, ((Byte *)ptr) + U2B(k), nu - k - 1); - } - InsertNode(p, ptr, i); -} - - -/* we use CPpmd7_Node_Union union to solve XLC -O2 strict pointer aliasing problem */ - -typedef union _CPpmd7_Node_Union -{ - CPpmd7_Node Node; - CPpmd7_Node_Ref NextRef; -} CPpmd7_Node_Union; - -/* Original PPmdH (Ppmd7) code uses doubly linked list in GlueFreeBlocks() - we use single linked list similar to Ppmd8 code */ - - -static void GlueFreeBlocks(CPpmd7 *p) -{ - /* - we use first UInt16 field of 12-bytes UNITs as record type stamp - CPpmd_State { Byte Symbol; Byte Freq; : Freq != 0 - CPpmd7_Context { UInt16 NumStats; : NumStats != 0 - CPpmd7_Node { UInt16 Stamp : Stamp == 0 for free record - : Stamp == 1 for head record and guard - Last 12-bytes UNIT in array is always contains 12-bytes order-0 CPpmd7_Context record. - */ - CPpmd7_Node_Ref head, n = 0; - - p->GlueCount = 255; - - - /* we set guard NODE at LoUnit */ - if (p->LoUnit != p->HiUnit) - ((CPpmd7_Node *)(void *)p->LoUnit)->Stamp = 1; - - { - /* Create list of free blocks. - We still need one additional list walk pass before Glue. */ - unsigned i; - for (i = 0; i < PPMD_NUM_INDEXES; i++) - { - const UInt16 nu = I2U_UInt16(i); - CPpmd7_Node_Ref next = (CPpmd7_Node_Ref)p->FreeList[i]; - p->FreeList[i] = 0; - while (next != 0) - { - /* Don't change the order of the following commands: */ - CPpmd7_Node_Union *un = (CPpmd7_Node_Union *)NODE(next); - const CPpmd7_Node_Ref tmp = next; - next = un->NextRef; - un->Node.Stamp = EMPTY_NODE; - un->Node.NU = nu; - un->Node.Next = n; - n = tmp; - } - } - } - - head = n; - /* Glue and Fill must walk the list in same direction */ - { - /* Glue free blocks */ - CPpmd7_Node_Ref *prev = &head; - while (n) - { - CPpmd7_Node *node = NODE(n); - UInt32 nu = node->NU; - n = node->Next; - if (nu == 0) - { - *prev = n; - continue; - } - prev = &node->Next; - for (;;) - { - CPpmd7_Node *node2 = node + nu; - nu += node2->NU; - if (node2->Stamp != EMPTY_NODE || nu >= 0x10000) - break; - node->NU = (UInt16)nu; - node2->NU = 0; - } - } - } - - /* Fill lists of free blocks */ - for (n = head; n != 0;) - { - CPpmd7_Node *node = NODE(n); - UInt32 nu = node->NU; - unsigned i; - n = node->Next; - if (nu == 0) - continue; - for (; nu > 128; nu -= 128, node += 128) - InsertNode(p, node, PPMD_NUM_INDEXES - 1); - if (I2U(i = U2I(nu)) != nu) - { - unsigned k = I2U(--i); - InsertNode(p, node + k, (unsigned)nu - k - 1); - } - InsertNode(p, node, i); - } -} - - -MY_NO_INLINE -static void *AllocUnitsRare(CPpmd7 *p, unsigned indx) -{ - unsigned i; - - if (p->GlueCount == 0) - { - GlueFreeBlocks(p); - if (p->FreeList[indx] != 0) - return RemoveNode(p, indx); - } - - i = indx; - - do - { - if (++i == PPMD_NUM_INDEXES) - { - UInt32 numBytes = U2B(I2U(indx)); - Byte *us = p->UnitsStart; - p->GlueCount--; - return ((UInt32)(us - p->Text) > numBytes) ? (p->UnitsStart = us - numBytes) : NULL; - } - } - while (p->FreeList[i] == 0); - - { - void *block = RemoveNode(p, i); - SplitBlock(p, block, i, indx); - return block; - } -} - - -static void *AllocUnits(CPpmd7 *p, unsigned indx) -{ - if (p->FreeList[indx] != 0) - return RemoveNode(p, indx); - { - UInt32 numBytes = U2B(I2U(indx)); - Byte *lo = p->LoUnit; - if ((UInt32)(p->HiUnit - lo) >= numBytes) - { - p->LoUnit = lo + numBytes; - return lo; - } - } - return AllocUnitsRare(p, indx); -} - - -#define MyMem12Cpy(dest, src, num) \ - { UInt32 *d = (UInt32 *)dest; const UInt32 *z = (const UInt32 *)src; UInt32 n = num; \ - do { d[0] = z[0]; d[1] = z[1]; d[2] = z[2]; z += 3; d += 3; } while (--n); } - - -/* -static void *ShrinkUnits(CPpmd7 *p, void *oldPtr, unsigned oldNU, unsigned newNU) -{ - unsigned i0 = U2I(oldNU); - unsigned i1 = U2I(newNU); - if (i0 == i1) - return oldPtr; - if (p->FreeList[i1] != 0) - { - void *ptr = RemoveNode(p, i1); - MyMem12Cpy(ptr, oldPtr, newNU); - InsertNode(p, oldPtr, i0); - return ptr; - } - SplitBlock(p, oldPtr, i0, i1); - return oldPtr; -} -*/ - - -#define SUCCESSOR(p) Ppmd_GET_SUCCESSOR(p) -static void SetSuccessor(CPpmd_State *p, CPpmd_Void_Ref v) -{ - Ppmd_SET_SUCCESSOR(p, v); -} - - - -MY_NO_INLINE -static -void RestartModel(CPpmd7 *p) -{ - unsigned i, k; - - memset(p->FreeList, 0, sizeof(p->FreeList)); - - p->Text = p->Base + p->AlignOffset; - p->HiUnit = p->Text + p->Size; - p->LoUnit = p->UnitsStart = p->HiUnit - p->Size / 8 / UNIT_SIZE * 7 * UNIT_SIZE; - p->GlueCount = 0; - - p->OrderFall = p->MaxOrder; - p->RunLength = p->InitRL = -(Int32)((p->MaxOrder < 12) ? p->MaxOrder : 12) - 1; - p->PrevSuccess = 0; - - { - CPpmd7_Context *mc = (CTX_PTR)(void *)(p->HiUnit -= UNIT_SIZE); /* AllocContext(p); */ - CPpmd_State *s = (CPpmd_State *)p->LoUnit; /* AllocUnits(p, PPMD_NUM_INDEXES - 1); */ - - p->LoUnit += U2B(256 / 2); - p->MaxContext = p->MinContext = mc; - p->FoundState = s; - - mc->NumStats = 256; - mc->Union2.SummFreq = 256 + 1; - mc->Union4.Stats = REF(s); - mc->Suffix = 0; - - for (i = 0; i < 256; i++, s++) - { - s->Symbol = (Byte)i; - s->Freq = 1; - SetSuccessor(s, 0); - } - - #ifdef PPMD7_ORDER_0_SUPPPORT - if (p->MaxOrder == 0) - { - CPpmd_Void_Ref r = REF(mc); - s = p->FoundState; - for (i = 0; i < 256; i++, s++) - SetSuccessor(s, r); - return; - } - #endif - } - - for (i = 0; i < 128; i++) - - - - for (k = 0; k < 8; k++) - { - unsigned m; - UInt16 *dest = p->BinSumm[i] + k; - UInt16 val = (UInt16)(PPMD_BIN_SCALE - kInitBinEsc[k] / (i + 2)); - for (m = 0; m < 64; m += 8) - dest[m] = val; - } - - - for (i = 0; i < 25; i++) - { - - CPpmd_See *s = p->See[i]; - - - - unsigned summ = ((5 * i + 10) << (PPMD_PERIOD_BITS - 4)); - for (k = 0; k < 16; k++, s++) - { - s->Summ = (UInt16)summ; - s->Shift = (PPMD_PERIOD_BITS - 4); - s->Count = 4; - } - } - - p->DummySee.Summ = 0; /* unused */ - p->DummySee.Shift = PPMD_PERIOD_BITS; - p->DummySee.Count = 64; /* unused */ -} - - -void Ppmd7_Init(CPpmd7 *p, unsigned maxOrder) -{ - p->MaxOrder = maxOrder; - - RestartModel(p); -} - - - -/* - CreateSuccessors() - It's called when (FoundState->Successor) is RAW-Successor, - that is the link to position in Raw text. - So we create Context records and write the links to - FoundState->Successor and to identical RAW-Successors in suffix - contexts of MinContex. - - The function returns: - if (OrderFall == 0) then MinContext is already at MAX order, - { return pointer to new or existing context of same MAX order } - else - { return pointer to new real context that will be (Order+1) in comparison with MinContext - - also it can return pointer to real context of same order, -*/ - -MY_NO_INLINE -static CTX_PTR CreateSuccessors(CPpmd7 *p) -{ - CTX_PTR c = p->MinContext; - CPpmd_Byte_Ref upBranch = (CPpmd_Byte_Ref)SUCCESSOR(p->FoundState); - Byte newSym, newFreq; - unsigned numPs = 0; - CPpmd_State *ps[PPMD7_MAX_ORDER]; - - if (p->OrderFall != 0) - ps[numPs++] = p->FoundState; - - while (c->Suffix) - { - CPpmd_Void_Ref successor; - CPpmd_State *s; - c = SUFFIX(c); - - - if (c->NumStats != 1) - { - Byte sym = p->FoundState->Symbol; - for (s = STATS(c); s->Symbol != sym; s++); - - } - else - { - s = ONE_STATE(c); - - } - successor = SUCCESSOR(s); - if (successor != upBranch) - { - // (c) is real record Context here, - c = CTX(successor); - if (numPs == 0) - { - // (c) is real record MAX Order Context here, - // So we don't need to create any new contexts. - return c; - } - break; - } - ps[numPs++] = s; - } - - // All created contexts will have single-symbol with new RAW-Successor - // All new RAW-Successors will point to next position in RAW text - // after FoundState->Successor - - newSym = *(const Byte *)Ppmd7_GetPtr(p, upBranch); - upBranch++; - - - if (c->NumStats == 1) - newFreq = ONE_STATE(c)->Freq; - else - { - UInt32 cf, s0; - CPpmd_State *s; - for (s = STATS(c); s->Symbol != newSym; s++); - cf = (UInt32)s->Freq - 1; - s0 = (UInt32)c->Union2.SummFreq - c->NumStats - cf; - /* - cf - is frequency of symbol that will be Successor in new context records. - s0 - is commulative frequency sum of another symbols from parent context. - max(newFreq)= (s->Freq + 1), when (s0 == 1) - we have requirement (Ppmd7Context_OneState()->Freq <= 128) in BinSumm[] - so (s->Freq < 128) - is requirement for multi-symbol contexts - */ - newFreq = (Byte)(1 + ((2 * cf <= s0) ? (5 * cf > s0) : (2 * cf + s0 - 1) / (2 * s0) + 1)); - } - - // Create new single-symbol contexts from low order to high order in loop - - do - { - CTX_PTR c1; - /* = AllocContext(p); */ - if (p->HiUnit != p->LoUnit) - c1 = (CTX_PTR)(void *)(p->HiUnit -= UNIT_SIZE); - else if (p->FreeList[0] != 0) - c1 = (CTX_PTR)RemoveNode(p, 0); - else - { - c1 = (CTX_PTR)AllocUnitsRare(p, 0); - if (!c1) - return NULL; - } - - c1->NumStats = 1; - ONE_STATE(c1)->Symbol = newSym; - ONE_STATE(c1)->Freq = newFreq; - SetSuccessor(ONE_STATE(c1), upBranch); - c1->Suffix = REF(c); - SetSuccessor(ps[--numPs], REF(c1)); - c = c1; - } - while (numPs != 0); - - return c; -} - - - -#define SwapStates(s) \ - { CPpmd_State tmp = s[0]; s[0] = s[-1]; s[-1] = tmp; } - - -void Ppmd7_UpdateModel(CPpmd7 *p); -MY_NO_INLINE -void Ppmd7_UpdateModel(CPpmd7 *p) -{ - CPpmd_Void_Ref maxSuccessor, minSuccessor; - CTX_PTR c, mc; - unsigned s0, ns; - - - - if (p->FoundState->Freq < MAX_FREQ / 4 && p->MinContext->Suffix != 0) - { - /* Update Freqs in Suffix Context */ - - c = SUFFIX(p->MinContext); - - if (c->NumStats == 1) - { - CPpmd_State *s = ONE_STATE(c); - if (s->Freq < 32) - s->Freq++; - } - else - { - CPpmd_State *s = STATS(c); - Byte sym = p->FoundState->Symbol; - - if (s->Symbol != sym) - { - do - { - // s++; if (s->Symbol == sym) break; - s++; - } - while (s->Symbol != sym); - - if (s[0].Freq >= s[-1].Freq) - { - SwapStates(s); - s--; - } - } - - if (s->Freq < MAX_FREQ - 9) - { - s->Freq = (Byte)(s->Freq + 2); - c->Union2.SummFreq = (UInt16)(c->Union2.SummFreq + 2); - } - } - } - - - if (p->OrderFall == 0) - { - /* MAX ORDER context */ - /* (FoundState->Successor) is RAW-Successor. */ - p->MaxContext = p->MinContext = CreateSuccessors(p); - if (!p->MinContext) - { - RestartModel(p); - return; - } - SetSuccessor(p->FoundState, REF(p->MinContext)); - return; - } - - - /* NON-MAX ORDER context */ - - { - Byte *text = p->Text; - *text++ = p->FoundState->Symbol; - p->Text = text; - if (text >= p->UnitsStart) - { - RestartModel(p); - return; - } - maxSuccessor = REF(text); - } - - minSuccessor = SUCCESSOR(p->FoundState); - - if (minSuccessor) - { - // there is Successor for FoundState in MinContext. - // So the next context will be one order higher than MinContext. - - if (minSuccessor <= maxSuccessor) - { - // minSuccessor is RAW-Successor. So we will create real contexts records: - CTX_PTR cs = CreateSuccessors(p); - if (!cs) - { - RestartModel(p); - return; - } - minSuccessor = REF(cs); - } - - // minSuccessor now is real Context pointer that points to existing (Order+1) context - - if (--p->OrderFall == 0) - { - /* - if we move to MaxOrder context, then minSuccessor will be common Succesor for both: - MinContext that is (MaxOrder - 1) - MaxContext that is (MaxOrder) - so we don't need new RAW-Successor, and we can use real minSuccessor - as succssors for both MinContext and MaxContext. - */ - maxSuccessor = minSuccessor; - - /* - if (MaxContext != MinContext) - { - there was order fall from MaxOrder and we don't need current symbol - to transfer some RAW-Succesors to real contexts. - So we roll back pointer in raw data for one position. - } - */ - p->Text -= (p->MaxContext != p->MinContext); - } - } - else - { - /* - FoundState has NULL-Successor here. - And only root 0-order context can contain NULL-Successors. - We change Successor in FoundState to RAW-Successor, - And next context will be same 0-order root Context. - */ - SetSuccessor(p->FoundState, maxSuccessor); - minSuccessor = REF(p->MinContext); - } - - mc = p->MinContext; - c = p->MaxContext; - - p->MaxContext = p->MinContext = CTX(minSuccessor); - - if (c == mc) - return; - - // s0 : is pure Escape Freq - s0 = mc->Union2.SummFreq - (ns = mc->NumStats) - ((unsigned)p->FoundState->Freq - 1); - - do - { - unsigned ns1; - UInt32 sum; - - if ((ns1 = c->NumStats) != 1) - { - if ((ns1 & 1) == 0) - { - /* Expand for one UNIT */ - unsigned oldNU = ns1 >> 1; - unsigned i = U2I(oldNU); - if (i != U2I((size_t)oldNU + 1)) - { - void *ptr = AllocUnits(p, i + 1); - void *oldPtr; - if (!ptr) - { - RestartModel(p); - return; - } - oldPtr = STATS(c); - MyMem12Cpy(ptr, oldPtr, oldNU); - InsertNode(p, oldPtr, i); - c->Union4.Stats = STATS_REF(ptr); - } - } - sum = c->Union2.SummFreq; - /* max increase of Escape_Freq is 3 here. - total increase of Union2.SummFreq for all symbols is less than 256 here */ - sum += (UInt32)(2 * ns1 < ns) + 2 * ((unsigned)(4 * ns1 <= ns) & (sum <= 8 * ns1)); - /* original PPMdH uses 16-bit variable for (sum) here. - But (sum < 0x9000). So we don't truncate (sum) to 16-bit */ - // sum = (UInt16)sum; - } - else - { - // instead of One-symbol context we create 2-symbol context - CPpmd_State *s = (CPpmd_State*)AllocUnits(p, 0); - if (!s) - { - RestartModel(p); - return; - } - { - unsigned freq = c->Union2.State2.Freq; - // s = *ONE_STATE(c); - s->Symbol = c->Union2.State2.Symbol; - s->Successor_0 = c->Union4.State4.Successor_0; - s->Successor_1 = c->Union4.State4.Successor_1; - // SetSuccessor(s, c->Union4.Stats); // call it only for debug purposes to check the order of - // (Successor_0 and Successor_1) in LE/BE. - c->Union4.Stats = REF(s); - if (freq < MAX_FREQ / 4 - 1) - freq <<= 1; - else - freq = MAX_FREQ - 4; - // (max(s->freq) == 120), when we convert from 1-symbol into 2-symbol context - s->Freq = (Byte)freq; - // max(InitEsc = PPMD7_kExpEscape[*]) is 25. So the max(escapeFreq) is 26 here - sum = freq + p->InitEsc + (ns > 3); - } - } - - { - CPpmd_State *s = STATS(c) + ns1; - UInt32 cf = 2 * (sum + 6) * (UInt32)p->FoundState->Freq; - UInt32 sf = (UInt32)s0 + sum; - s->Symbol = p->FoundState->Symbol; - c->NumStats = (UInt16)(ns1 + 1); - SetSuccessor(s, maxSuccessor); - - if (cf < 6 * sf) - { - cf = (UInt32)1 + (cf > sf) + (cf >= 4 * sf); - sum += 3; - /* It can add (0, 1, 2) to Escape_Freq */ - } - else - { - cf = (UInt32)4 + (cf >= 9 * sf) + (cf >= 12 * sf) + (cf >= 15 * sf); - sum += cf; - } - - c->Union2.SummFreq = (UInt16)sum; - s->Freq = (Byte)cf; - } - c = SUFFIX(c); - } - while (c != mc); -} - - - -MY_NO_INLINE -static void Rescale(CPpmd7 *p) -{ - unsigned i, adder, sumFreq, escFreq; - CPpmd_State *stats = STATS(p->MinContext); - CPpmd_State *s = p->FoundState; - - /* Sort the list by Freq */ - if (s != stats) - { - CPpmd_State tmp = *s; - do - s[0] = s[-1]; - while (--s != stats); - *s = tmp; - } - - sumFreq = s->Freq; - escFreq = p->MinContext->Union2.SummFreq - sumFreq; - - /* - if (p->OrderFall == 0), adder = 0 : it's allowed to remove symbol from MAX Order context - if (p->OrderFall != 0), adder = 1 : it's NOT allowed to remove symbol from NON-MAX Order context - */ - - adder = (p->OrderFall != 0); - - #ifdef PPMD7_ORDER_0_SUPPPORT - adder |= (p->MaxOrder == 0); // we don't remove symbols from order-0 context - #endif - - sumFreq = (sumFreq + 4 + adder) >> 1; - i = (unsigned)p->MinContext->NumStats - 1; - s->Freq = (Byte)sumFreq; - - do - { - unsigned freq = (++s)->Freq; - escFreq -= freq; - freq = (freq + adder) >> 1; - sumFreq += freq; - s->Freq = (Byte)freq; - if (freq > s[-1].Freq) - { - CPpmd_State tmp = *s; - CPpmd_State *s1 = s; - do - { - s1[0] = s1[-1]; - } - while (--s1 != stats && freq > s1[-1].Freq); - *s1 = tmp; - } - } - while (--i); - - if (s->Freq == 0) - { - /* Remove all items with Freq == 0 */ - CPpmd7_Context *mc; - unsigned numStats, numStatsNew, n0, n1; - - i = 0; do { i++; } while ((--s)->Freq == 0); - - /* We increase (escFreq) for the number of removed symbols. - So we will have (0.5) increase for Escape_Freq in avarage per - removed symbol after Escape_Freq halving */ - escFreq += i; - mc = p->MinContext; - numStats = mc->NumStats; - numStatsNew = numStats - i; - mc->NumStats = (UInt16)(numStatsNew); - n0 = (numStats + 1) >> 1; - - if (numStatsNew == 1) - { - /* Create Single-Symbol context */ - unsigned freq = stats->Freq; - - do - { - escFreq >>= 1; - freq = (freq + 1) >> 1; - } - while (escFreq > 1); - - s = ONE_STATE(mc); - *s = *stats; - s->Freq = (Byte)freq; // (freq <= 260 / 4) - p->FoundState = s; - InsertNode(p, stats, U2I(n0)); - return; - } - - n1 = (numStatsNew + 1) >> 1; - if (n0 != n1) - { - // p->MinContext->Union4.Stats = STATS_REF(ShrinkUnits(p, stats, n0, n1)); - unsigned i0 = U2I(n0); - unsigned i1 = U2I(n1); - if (i0 != i1) - { - if (p->FreeList[i1] != 0) - { - void *ptr = RemoveNode(p, i1); - p->MinContext->Union4.Stats = STATS_REF(ptr); - MyMem12Cpy(ptr, (const void *)stats, n1); - InsertNode(p, stats, i0); - } - else - SplitBlock(p, stats, i0, i1); - } - } - } - { - CPpmd7_Context *mc = p->MinContext; - mc->Union2.SummFreq = (UInt16)(sumFreq + escFreq - (escFreq >> 1)); - // Escape_Freq halving here - p->FoundState = STATS(mc); - } -} - - -CPpmd_See *Ppmd7_MakeEscFreq(CPpmd7 *p, unsigned numMasked, UInt32 *escFreq) -{ - CPpmd_See *see; - const CPpmd7_Context *mc = p->MinContext; - unsigned numStats = mc->NumStats; - if (numStats != 256) - { - unsigned nonMasked = numStats - numMasked; - see = p->See[(unsigned)p->NS2Indx[(size_t)nonMasked - 1]] - + (nonMasked < (unsigned)SUFFIX(mc)->NumStats - numStats) - + 2 * (unsigned)(mc->Union2.SummFreq < 11 * numStats) - + 4 * (unsigned)(numMasked > nonMasked) + - p->HiBitsFlag; - { - // if (see->Summ) field is larger than 16-bit, we need only low 16 bits of Summ - unsigned summ = (UInt16)see->Summ; // & 0xFFFF - unsigned r = (summ >> see->Shift); - see->Summ = (UInt16)(summ - r); - *escFreq = r + (r == 0); - } - } - else - { - see = &p->DummySee; - *escFreq = 1; - } - return see; -} - - -static void NextContext(CPpmd7 *p) -{ - CTX_PTR c = CTX(SUCCESSOR(p->FoundState)); - if (p->OrderFall == 0 && (const Byte *)c > p->Text) - p->MaxContext = p->MinContext = c; - else - Ppmd7_UpdateModel(p); -} - - -void Ppmd7_Update1(CPpmd7 *p) -{ - CPpmd_State *s = p->FoundState; - unsigned freq = s->Freq; - freq += 4; - p->MinContext->Union2.SummFreq = (UInt16)(p->MinContext->Union2.SummFreq + 4); - s->Freq = (Byte)freq; - if (freq > s[-1].Freq) - { - SwapStates(s); - p->FoundState = --s; - if (freq > MAX_FREQ) - Rescale(p); - } - NextContext(p); -} - - -void Ppmd7_Update1_0(CPpmd7 *p) -{ - CPpmd_State *s = p->FoundState; - CPpmd7_Context *mc = p->MinContext; - unsigned freq = s->Freq; - unsigned summFreq = mc->Union2.SummFreq; - p->PrevSuccess = (2 * freq > summFreq); - p->RunLength += (int)p->PrevSuccess; - mc->Union2.SummFreq = (UInt16)(summFreq + 4); - freq += 4; - s->Freq = (Byte)freq; - if (freq > MAX_FREQ) - Rescale(p); - NextContext(p); -} - - -/* -void Ppmd7_UpdateBin(CPpmd7 *p) -{ - unsigned freq = p->FoundState->Freq; - p->FoundState->Freq = (Byte)(freq + (freq < 128)); - p->PrevSuccess = 1; - p->RunLength++; - NextContext(p); -} -*/ - -void Ppmd7_Update2(CPpmd7 *p) -{ - CPpmd_State *s = p->FoundState; - unsigned freq = s->Freq; - freq += 4; - p->RunLength = p->InitRL; - p->MinContext->Union2.SummFreq = (UInt16)(p->MinContext->Union2.SummFreq + 4); - s->Freq = (Byte)freq; - if (freq > MAX_FREQ) - Rescale(p); - Ppmd7_UpdateModel(p); -} - - - -/* -PPMd Memory Map: -{ - [ 0 ] contains subset of original raw text, that is required to create context - records, Some symbols are not written, when max order context was reached - [ Text ] free area - [ UnitsStart ] CPpmd_State vectors and CPpmd7_Context records - [ LoUnit ] free area for CPpmd_State and CPpmd7_Context items -[ HiUnit ] CPpmd7_Context records - [ Size ] end of array -} - -These addresses don't cross at any time. -And the following condtions is true for addresses: - (0 <= Text < UnitsStart <= LoUnit <= HiUnit <= Size) - -Raw text is BYTE--aligned. -the data in block [ UnitsStart ... Size ] contains 12-bytes aligned UNITs. - -Last UNIT of array at offset (Size - 12) is root order-0 CPpmd7_Context record. -The code can free UNITs memory blocks that were allocated to store CPpmd_State vectors. -The code doesn't free UNITs allocated for CPpmd7_Context records. - -The code calls RestartModel(), when there is no free memory for allocation. -And RestartModel() changes the state to orignal start state, with full free block. - - -The code allocates UNITs with the following order: - -Allocation of 1 UNIT for Context record - - from free space (HiUnit) down to (LoUnit) - - from FreeList[0] - - AllocUnitsRare() - -AllocUnits() for CPpmd_State vectors: - - from FreeList[i] - - from free space (LoUnit) up to (HiUnit) - - AllocUnitsRare() - -AllocUnitsRare() - - if (GlueCount == 0) - { Glue lists, GlueCount = 255, allocate from FreeList[i]] } - - loop for all higher sized FreeList[...] lists - - from (UnitsStart - Text), GlueCount-- - - ERROR - - -Each Record with Context contains the CPpmd_State vector, where each -CPpmd_State contains the link to Successor. -There are 3 types of Successor: - 1) NULL-Successor - NULL pointer. NULL-Successor links can be stored - only in 0-order Root Context Record. - We use 0 value as NULL-Successor - 2) RAW-Successor - the link to position in raw text, - that "RAW-Successor" is being created after first - occurrence of new symbol for some existing context record. - (RAW-Successor > 0). - 3) RECORD-Successor - the link to CPpmd7_Context record of (Order+1), - that record is being created when we go via RAW-Successor again. - -For any successors at any time: the following condtions are true for Successor links: -(NULL-Successor < RAW-Successor < UnitsStart <= RECORD-Successor) - - ----------- Symbol Frequency, SummFreq and Range in Range_Coder ---------- - -CPpmd7_Context::SummFreq = Sum(Stats[].Freq) + Escape_Freq - -The PPMd code tries to fulfill the condition: - (SummFreq <= (256 * 128 = RC::kBot)) - -We have (Sum(Stats[].Freq) <= 256 * 124), because of (MAX_FREQ = 124) -So (4 = 128 - 124) is average reserve for Escape_Freq for each symbol. -If (CPpmd_State::Freq) is not aligned for 4, the reserve can be 5, 6 or 7. -SummFreq and Escape_Freq can be changed in Rescale() and *Update*() functions. -Rescale() can remove symbols only from max-order contexts. So Escape_Freq can increase after multiple calls of Rescale() for -max-order context. - -When the PPMd code still break (Total <= RC::Range) condition in range coder, -we have two ways to resolve that problem: - 1) we can report error, if we want to keep compatibility with original PPMd code that has no fix for such cases. - 2) we can reduce (Total) value to (RC::Range) by reducing (Escape_Freq) part of (Total) value. -*/ +/* Ppmd7.c -- PPMdH codec +2021-04-13 : Igor Pavlov : Public domain +This code is based on PPMd var.H (2001): Dmitry Shkarin : Public domain */ + +#include "Precomp.h" + +#include + +#include "Ppmd7.h" + +/* define PPMD7_ORDER_0_SUPPPORT to suport order-0 mode, unsupported by orignal PPMd var.H. code */ +// #define PPMD7_ORDER_0_SUPPPORT + +MY_ALIGN(16) +static const Byte PPMD7_kExpEscape[16] = { 25, 14, 9, 7, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2 }; +MY_ALIGN(16) +static const UInt16 kInitBinEsc[] = { 0x3CDD, 0x1F3F, 0x59BF, 0x48F3, 0x64A1, 0x5ABC, 0x6632, 0x6051}; + +#define MAX_FREQ 124 +#define UNIT_SIZE 12 + +#define U2B(nu) ((UInt32)(nu) * UNIT_SIZE) +#define U2I(nu) (p->Units2Indx[(size_t)(nu) - 1]) +#define I2U(indx) ((unsigned)p->Indx2Units[indx]) +#define I2U_UInt16(indx) ((UInt16)p->Indx2Units[indx]) + +#define REF(ptr) Ppmd_GetRef(p, ptr) + +#define STATS_REF(ptr) ((CPpmd_State_Ref)REF(ptr)) + +#define CTX(ref) ((CPpmd7_Context *)Ppmd7_GetContext(p, ref)) +#define STATS(ctx) Ppmd7_GetStats(p, ctx) +#define ONE_STATE(ctx) Ppmd7Context_OneState(ctx) +#define SUFFIX(ctx) CTX((ctx)->Suffix) + +typedef CPpmd7_Context * CTX_PTR; + +struct CPpmd7_Node_; + +typedef Ppmd_Ref_Type(struct CPpmd7_Node_) CPpmd7_Node_Ref; + +typedef struct CPpmd7_Node_ +{ + UInt16 Stamp; /* must be at offset 0 as CPpmd7_Context::NumStats. Stamp=0 means free */ + UInt16 NU; + CPpmd7_Node_Ref Next; /* must be at offset >= 4 */ + CPpmd7_Node_Ref Prev; +} CPpmd7_Node; + +#define NODE(r) Ppmd_GetPtr_Type(p, r, CPpmd7_Node) + +void Ppmd7_Construct(CPpmd7 *p) +{ + unsigned i, k, m; + + p->Base = NULL; + + for (i = 0, k = 0; i < PPMD_NUM_INDEXES; i++) + { + unsigned step = (i >= 12 ? 4 : (i >> 2) + 1); + do { p->Units2Indx[k++] = (Byte)i; } while (--step); + p->Indx2Units[i] = (Byte)k; + } + + p->NS2BSIndx[0] = (0 << 1); + p->NS2BSIndx[1] = (1 << 1); + memset(p->NS2BSIndx + 2, (2 << 1), 9); + memset(p->NS2BSIndx + 11, (3 << 1), 256 - 11); + + for (i = 0; i < 3; i++) + p->NS2Indx[i] = (Byte)i; + + for (m = i, k = 1; i < 256; i++) + { + p->NS2Indx[i] = (Byte)m; + if (--k == 0) + k = (++m) - 2; + } + + memcpy(p->ExpEscape, PPMD7_kExpEscape, 16); +} + + +void Ppmd7_Free(CPpmd7 *p, ISzAllocPtr alloc) +{ + ISzAlloc_Free(alloc, p->Base); + p->Size = 0; + p->Base = NULL; +} + + +BoolInt Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAllocPtr alloc) +{ + if (!p->Base || p->Size != size) + { + Ppmd7_Free(p, alloc); + p->AlignOffset = (4 - size) & 3; + if ((p->Base = (Byte *)ISzAlloc_Alloc(alloc, p->AlignOffset + size)) == NULL) + return False; + p->Size = size; + } + return True; +} + + + +// ---------- Internal Memory Allocator ---------- + +/* We can use CPpmd7_Node in list of free units (as in Ppmd8) + But we still need one additional list walk pass in GlueFreeBlocks(). + So we use simple CPpmd_Void_Ref instead of CPpmd7_Node in InsertNode() / RemoveNode() +*/ + +#define EMPTY_NODE 0 + + +static void InsertNode(CPpmd7 *p, void *node, unsigned indx) +{ + *((CPpmd_Void_Ref *)node) = p->FreeList[indx]; + // ((CPpmd7_Node *)node)->Next = (CPpmd7_Node_Ref)p->FreeList[indx]; + + p->FreeList[indx] = REF(node); + +} + + +static void *RemoveNode(CPpmd7 *p, unsigned indx) +{ + CPpmd_Void_Ref *node = (CPpmd_Void_Ref *)Ppmd7_GetPtr(p, p->FreeList[indx]); + p->FreeList[indx] = *node; + // CPpmd7_Node *node = NODE((CPpmd7_Node_Ref)p->FreeList[indx]); + // p->FreeList[indx] = node->Next; + return node; +} + + +static void SplitBlock(CPpmd7 *p, void *ptr, unsigned oldIndx, unsigned newIndx) +{ + unsigned i, nu = I2U(oldIndx) - I2U(newIndx); + ptr = (Byte *)ptr + U2B(I2U(newIndx)); + if (I2U(i = U2I(nu)) != nu) + { + unsigned k = I2U(--i); + InsertNode(p, ((Byte *)ptr) + U2B(k), nu - k - 1); + } + InsertNode(p, ptr, i); +} + + +/* we use CPpmd7_Node_Union union to solve XLC -O2 strict pointer aliasing problem */ + +typedef union _CPpmd7_Node_Union +{ + CPpmd7_Node Node; + CPpmd7_Node_Ref NextRef; +} CPpmd7_Node_Union; + +/* Original PPmdH (Ppmd7) code uses doubly linked list in GlueFreeBlocks() + we use single linked list similar to Ppmd8 code */ + + +static void GlueFreeBlocks(CPpmd7 *p) +{ + /* + we use first UInt16 field of 12-bytes UNITs as record type stamp + CPpmd_State { Byte Symbol; Byte Freq; : Freq != 0 + CPpmd7_Context { UInt16 NumStats; : NumStats != 0 + CPpmd7_Node { UInt16 Stamp : Stamp == 0 for free record + : Stamp == 1 for head record and guard + Last 12-bytes UNIT in array is always contains 12-bytes order-0 CPpmd7_Context record. + */ + CPpmd7_Node_Ref head, n = 0; + + p->GlueCount = 255; + + + /* we set guard NODE at LoUnit */ + if (p->LoUnit != p->HiUnit) + ((CPpmd7_Node *)(void *)p->LoUnit)->Stamp = 1; + + { + /* Create list of free blocks. + We still need one additional list walk pass before Glue. */ + unsigned i; + for (i = 0; i < PPMD_NUM_INDEXES; i++) + { + const UInt16 nu = I2U_UInt16(i); + CPpmd7_Node_Ref next = (CPpmd7_Node_Ref)p->FreeList[i]; + p->FreeList[i] = 0; + while (next != 0) + { + /* Don't change the order of the following commands: */ + CPpmd7_Node_Union *un = (CPpmd7_Node_Union *)NODE(next); + const CPpmd7_Node_Ref tmp = next; + next = un->NextRef; + un->Node.Stamp = EMPTY_NODE; + un->Node.NU = nu; + un->Node.Next = n; + n = tmp; + } + } + } + + head = n; + /* Glue and Fill must walk the list in same direction */ + { + /* Glue free blocks */ + CPpmd7_Node_Ref *prev = &head; + while (n) + { + CPpmd7_Node *node = NODE(n); + UInt32 nu = node->NU; + n = node->Next; + if (nu == 0) + { + *prev = n; + continue; + } + prev = &node->Next; + for (;;) + { + CPpmd7_Node *node2 = node + nu; + nu += node2->NU; + if (node2->Stamp != EMPTY_NODE || nu >= 0x10000) + break; + node->NU = (UInt16)nu; + node2->NU = 0; + } + } + } + + /* Fill lists of free blocks */ + for (n = head; n != 0;) + { + CPpmd7_Node *node = NODE(n); + UInt32 nu = node->NU; + unsigned i; + n = node->Next; + if (nu == 0) + continue; + for (; nu > 128; nu -= 128, node += 128) + InsertNode(p, node, PPMD_NUM_INDEXES - 1); + if (I2U(i = U2I(nu)) != nu) + { + unsigned k = I2U(--i); + InsertNode(p, node + k, (unsigned)nu - k - 1); + } + InsertNode(p, node, i); + } +} + + +MY_NO_INLINE +static void *AllocUnitsRare(CPpmd7 *p, unsigned indx) +{ + unsigned i; + + if (p->GlueCount == 0) + { + GlueFreeBlocks(p); + if (p->FreeList[indx] != 0) + return RemoveNode(p, indx); + } + + i = indx; + + do + { + if (++i == PPMD_NUM_INDEXES) + { + UInt32 numBytes = U2B(I2U(indx)); + Byte *us = p->UnitsStart; + p->GlueCount--; + return ((UInt32)(us - p->Text) > numBytes) ? (p->UnitsStart = us - numBytes) : NULL; + } + } + while (p->FreeList[i] == 0); + + { + void *block = RemoveNode(p, i); + SplitBlock(p, block, i, indx); + return block; + } +} + + +static void *AllocUnits(CPpmd7 *p, unsigned indx) +{ + if (p->FreeList[indx] != 0) + return RemoveNode(p, indx); + { + UInt32 numBytes = U2B(I2U(indx)); + Byte *lo = p->LoUnit; + if ((UInt32)(p->HiUnit - lo) >= numBytes) + { + p->LoUnit = lo + numBytes; + return lo; + } + } + return AllocUnitsRare(p, indx); +} + + +#define MyMem12Cpy(dest, src, num) \ + { UInt32 *d = (UInt32 *)dest; const UInt32 *z = (const UInt32 *)src; UInt32 n = num; \ + do { d[0] = z[0]; d[1] = z[1]; d[2] = z[2]; z += 3; d += 3; } while (--n); } + + +/* +static void *ShrinkUnits(CPpmd7 *p, void *oldPtr, unsigned oldNU, unsigned newNU) +{ + unsigned i0 = U2I(oldNU); + unsigned i1 = U2I(newNU); + if (i0 == i1) + return oldPtr; + if (p->FreeList[i1] != 0) + { + void *ptr = RemoveNode(p, i1); + MyMem12Cpy(ptr, oldPtr, newNU); + InsertNode(p, oldPtr, i0); + return ptr; + } + SplitBlock(p, oldPtr, i0, i1); + return oldPtr; +} +*/ + + +#define SUCCESSOR(p) Ppmd_GET_SUCCESSOR(p) +static void SetSuccessor(CPpmd_State *p, CPpmd_Void_Ref v) +{ + Ppmd_SET_SUCCESSOR(p, v); +} + + + +MY_NO_INLINE +static +void RestartModel(CPpmd7 *p) +{ + unsigned i, k; + + memset(p->FreeList, 0, sizeof(p->FreeList)); + + p->Text = p->Base + p->AlignOffset; + p->HiUnit = p->Text + p->Size; + p->LoUnit = p->UnitsStart = p->HiUnit - p->Size / 8 / UNIT_SIZE * 7 * UNIT_SIZE; + p->GlueCount = 0; + + p->OrderFall = p->MaxOrder; + p->RunLength = p->InitRL = -(Int32)((p->MaxOrder < 12) ? p->MaxOrder : 12) - 1; + p->PrevSuccess = 0; + + { + CPpmd7_Context *mc = (CTX_PTR)(void *)(p->HiUnit -= UNIT_SIZE); /* AllocContext(p); */ + CPpmd_State *s = (CPpmd_State *)p->LoUnit; /* AllocUnits(p, PPMD_NUM_INDEXES - 1); */ + + p->LoUnit += U2B(256 / 2); + p->MaxContext = p->MinContext = mc; + p->FoundState = s; + + mc->NumStats = 256; + mc->Union2.SummFreq = 256 + 1; + mc->Union4.Stats = REF(s); + mc->Suffix = 0; + + for (i = 0; i < 256; i++, s++) + { + s->Symbol = (Byte)i; + s->Freq = 1; + SetSuccessor(s, 0); + } + + #ifdef PPMD7_ORDER_0_SUPPPORT + if (p->MaxOrder == 0) + { + CPpmd_Void_Ref r = REF(mc); + s = p->FoundState; + for (i = 0; i < 256; i++, s++) + SetSuccessor(s, r); + return; + } + #endif + } + + for (i = 0; i < 128; i++) + + + + for (k = 0; k < 8; k++) + { + unsigned m; + UInt16 *dest = p->BinSumm[i] + k; + UInt16 val = (UInt16)(PPMD_BIN_SCALE - kInitBinEsc[k] / (i + 2)); + for (m = 0; m < 64; m += 8) + dest[m] = val; + } + + + for (i = 0; i < 25; i++) + { + + CPpmd_See *s = p->See[i]; + + + + unsigned summ = ((5 * i + 10) << (PPMD_PERIOD_BITS - 4)); + for (k = 0; k < 16; k++, s++) + { + s->Summ = (UInt16)summ; + s->Shift = (PPMD_PERIOD_BITS - 4); + s->Count = 4; + } + } + + p->DummySee.Summ = 0; /* unused */ + p->DummySee.Shift = PPMD_PERIOD_BITS; + p->DummySee.Count = 64; /* unused */ +} + + +void Ppmd7_Init(CPpmd7 *p, unsigned maxOrder) +{ + p->MaxOrder = maxOrder; + + RestartModel(p); +} + + + +/* + CreateSuccessors() + It's called when (FoundState->Successor) is RAW-Successor, + that is the link to position in Raw text. + So we create Context records and write the links to + FoundState->Successor and to identical RAW-Successors in suffix + contexts of MinContex. + + The function returns: + if (OrderFall == 0) then MinContext is already at MAX order, + { return pointer to new or existing context of same MAX order } + else + { return pointer to new real context that will be (Order+1) in comparison with MinContext + + also it can return pointer to real context of same order, +*/ + +MY_NO_INLINE +static CTX_PTR CreateSuccessors(CPpmd7 *p) +{ + CTX_PTR c = p->MinContext; + CPpmd_Byte_Ref upBranch = (CPpmd_Byte_Ref)SUCCESSOR(p->FoundState); + Byte newSym, newFreq; + unsigned numPs = 0; + CPpmd_State *ps[PPMD7_MAX_ORDER]; + + if (p->OrderFall != 0) + ps[numPs++] = p->FoundState; + + while (c->Suffix) + { + CPpmd_Void_Ref successor; + CPpmd_State *s; + c = SUFFIX(c); + + + if (c->NumStats != 1) + { + Byte sym = p->FoundState->Symbol; + for (s = STATS(c); s->Symbol != sym; s++); + + } + else + { + s = ONE_STATE(c); + + } + successor = SUCCESSOR(s); + if (successor != upBranch) + { + // (c) is real record Context here, + c = CTX(successor); + if (numPs == 0) + { + // (c) is real record MAX Order Context here, + // So we don't need to create any new contexts. + return c; + } + break; + } + ps[numPs++] = s; + } + + // All created contexts will have single-symbol with new RAW-Successor + // All new RAW-Successors will point to next position in RAW text + // after FoundState->Successor + + newSym = *(const Byte *)Ppmd7_GetPtr(p, upBranch); + upBranch++; + + + if (c->NumStats == 1) + newFreq = ONE_STATE(c)->Freq; + else + { + UInt32 cf, s0; + CPpmd_State *s; + for (s = STATS(c); s->Symbol != newSym; s++); + cf = (UInt32)s->Freq - 1; + s0 = (UInt32)c->Union2.SummFreq - c->NumStats - cf; + /* + cf - is frequency of symbol that will be Successor in new context records. + s0 - is commulative frequency sum of another symbols from parent context. + max(newFreq)= (s->Freq + 1), when (s0 == 1) + we have requirement (Ppmd7Context_OneState()->Freq <= 128) in BinSumm[] + so (s->Freq < 128) - is requirement for multi-symbol contexts + */ + newFreq = (Byte)(1 + ((2 * cf <= s0) ? (5 * cf > s0) : (2 * cf + s0 - 1) / (2 * s0) + 1)); + } + + // Create new single-symbol contexts from low order to high order in loop + + do + { + CTX_PTR c1; + /* = AllocContext(p); */ + if (p->HiUnit != p->LoUnit) + c1 = (CTX_PTR)(void *)(p->HiUnit -= UNIT_SIZE); + else if (p->FreeList[0] != 0) + c1 = (CTX_PTR)RemoveNode(p, 0); + else + { + c1 = (CTX_PTR)AllocUnitsRare(p, 0); + if (!c1) + return NULL; + } + + c1->NumStats = 1; + ONE_STATE(c1)->Symbol = newSym; + ONE_STATE(c1)->Freq = newFreq; + SetSuccessor(ONE_STATE(c1), upBranch); + c1->Suffix = REF(c); + SetSuccessor(ps[--numPs], REF(c1)); + c = c1; + } + while (numPs != 0); + + return c; +} + + + +#define SwapStates(s) \ + { CPpmd_State tmp = s[0]; s[0] = s[-1]; s[-1] = tmp; } + + +void Ppmd7_UpdateModel(CPpmd7 *p); +MY_NO_INLINE +void Ppmd7_UpdateModel(CPpmd7 *p) +{ + CPpmd_Void_Ref maxSuccessor, minSuccessor; + CTX_PTR c, mc; + unsigned s0, ns; + + + + if (p->FoundState->Freq < MAX_FREQ / 4 && p->MinContext->Suffix != 0) + { + /* Update Freqs in Suffix Context */ + + c = SUFFIX(p->MinContext); + + if (c->NumStats == 1) + { + CPpmd_State *s = ONE_STATE(c); + if (s->Freq < 32) + s->Freq++; + } + else + { + CPpmd_State *s = STATS(c); + Byte sym = p->FoundState->Symbol; + + if (s->Symbol != sym) + { + do + { + // s++; if (s->Symbol == sym) break; + s++; + } + while (s->Symbol != sym); + + if (s[0].Freq >= s[-1].Freq) + { + SwapStates(s); + s--; + } + } + + if (s->Freq < MAX_FREQ - 9) + { + s->Freq = (Byte)(s->Freq + 2); + c->Union2.SummFreq = (UInt16)(c->Union2.SummFreq + 2); + } + } + } + + + if (p->OrderFall == 0) + { + /* MAX ORDER context */ + /* (FoundState->Successor) is RAW-Successor. */ + p->MaxContext = p->MinContext = CreateSuccessors(p); + if (!p->MinContext) + { + RestartModel(p); + return; + } + SetSuccessor(p->FoundState, REF(p->MinContext)); + return; + } + + + /* NON-MAX ORDER context */ + + { + Byte *text = p->Text; + *text++ = p->FoundState->Symbol; + p->Text = text; + if (text >= p->UnitsStart) + { + RestartModel(p); + return; + } + maxSuccessor = REF(text); + } + + minSuccessor = SUCCESSOR(p->FoundState); + + if (minSuccessor) + { + // there is Successor for FoundState in MinContext. + // So the next context will be one order higher than MinContext. + + if (minSuccessor <= maxSuccessor) + { + // minSuccessor is RAW-Successor. So we will create real contexts records: + CTX_PTR cs = CreateSuccessors(p); + if (!cs) + { + RestartModel(p); + return; + } + minSuccessor = REF(cs); + } + + // minSuccessor now is real Context pointer that points to existing (Order+1) context + + if (--p->OrderFall == 0) + { + /* + if we move to MaxOrder context, then minSuccessor will be common Succesor for both: + MinContext that is (MaxOrder - 1) + MaxContext that is (MaxOrder) + so we don't need new RAW-Successor, and we can use real minSuccessor + as succssors for both MinContext and MaxContext. + */ + maxSuccessor = minSuccessor; + + /* + if (MaxContext != MinContext) + { + there was order fall from MaxOrder and we don't need current symbol + to transfer some RAW-Succesors to real contexts. + So we roll back pointer in raw data for one position. + } + */ + p->Text -= (p->MaxContext != p->MinContext); + } + } + else + { + /* + FoundState has NULL-Successor here. + And only root 0-order context can contain NULL-Successors. + We change Successor in FoundState to RAW-Successor, + And next context will be same 0-order root Context. + */ + SetSuccessor(p->FoundState, maxSuccessor); + minSuccessor = REF(p->MinContext); + } + + mc = p->MinContext; + c = p->MaxContext; + + p->MaxContext = p->MinContext = CTX(minSuccessor); + + if (c == mc) + return; + + // s0 : is pure Escape Freq + s0 = mc->Union2.SummFreq - (ns = mc->NumStats) - ((unsigned)p->FoundState->Freq - 1); + + do + { + unsigned ns1; + UInt32 sum; + + if ((ns1 = c->NumStats) != 1) + { + if ((ns1 & 1) == 0) + { + /* Expand for one UNIT */ + unsigned oldNU = ns1 >> 1; + unsigned i = U2I(oldNU); + if (i != U2I((size_t)oldNU + 1)) + { + void *ptr = AllocUnits(p, i + 1); + void *oldPtr; + if (!ptr) + { + RestartModel(p); + return; + } + oldPtr = STATS(c); + MyMem12Cpy(ptr, oldPtr, oldNU); + InsertNode(p, oldPtr, i); + c->Union4.Stats = STATS_REF(ptr); + } + } + sum = c->Union2.SummFreq; + /* max increase of Escape_Freq is 3 here. + total increase of Union2.SummFreq for all symbols is less than 256 here */ + sum += (UInt32)(2 * ns1 < ns) + 2 * ((unsigned)(4 * ns1 <= ns) & (sum <= 8 * ns1)); + /* original PPMdH uses 16-bit variable for (sum) here. + But (sum < 0x9000). So we don't truncate (sum) to 16-bit */ + // sum = (UInt16)sum; + } + else + { + // instead of One-symbol context we create 2-symbol context + CPpmd_State *s = (CPpmd_State*)AllocUnits(p, 0); + if (!s) + { + RestartModel(p); + return; + } + { + unsigned freq = c->Union2.State2.Freq; + // s = *ONE_STATE(c); + s->Symbol = c->Union2.State2.Symbol; + s->Successor_0 = c->Union4.State4.Successor_0; + s->Successor_1 = c->Union4.State4.Successor_1; + // SetSuccessor(s, c->Union4.Stats); // call it only for debug purposes to check the order of + // (Successor_0 and Successor_1) in LE/BE. + c->Union4.Stats = REF(s); + if (freq < MAX_FREQ / 4 - 1) + freq <<= 1; + else + freq = MAX_FREQ - 4; + // (max(s->freq) == 120), when we convert from 1-symbol into 2-symbol context + s->Freq = (Byte)freq; + // max(InitEsc = PPMD7_kExpEscape[*]) is 25. So the max(escapeFreq) is 26 here + sum = freq + p->InitEsc + (ns > 3); + } + } + + { + CPpmd_State *s = STATS(c) + ns1; + UInt32 cf = 2 * (sum + 6) * (UInt32)p->FoundState->Freq; + UInt32 sf = (UInt32)s0 + sum; + s->Symbol = p->FoundState->Symbol; + c->NumStats = (UInt16)(ns1 + 1); + SetSuccessor(s, maxSuccessor); + + if (cf < 6 * sf) + { + cf = (UInt32)1 + (cf > sf) + (cf >= 4 * sf); + sum += 3; + /* It can add (0, 1, 2) to Escape_Freq */ + } + else + { + cf = (UInt32)4 + (cf >= 9 * sf) + (cf >= 12 * sf) + (cf >= 15 * sf); + sum += cf; + } + + c->Union2.SummFreq = (UInt16)sum; + s->Freq = (Byte)cf; + } + c = SUFFIX(c); + } + while (c != mc); +} + + + +MY_NO_INLINE +static void Rescale(CPpmd7 *p) +{ + unsigned i, adder, sumFreq, escFreq; + CPpmd_State *stats = STATS(p->MinContext); + CPpmd_State *s = p->FoundState; + + /* Sort the list by Freq */ + if (s != stats) + { + CPpmd_State tmp = *s; + do + s[0] = s[-1]; + while (--s != stats); + *s = tmp; + } + + sumFreq = s->Freq; + escFreq = p->MinContext->Union2.SummFreq - sumFreq; + + /* + if (p->OrderFall == 0), adder = 0 : it's allowed to remove symbol from MAX Order context + if (p->OrderFall != 0), adder = 1 : it's NOT allowed to remove symbol from NON-MAX Order context + */ + + adder = (p->OrderFall != 0); + + #ifdef PPMD7_ORDER_0_SUPPPORT + adder |= (p->MaxOrder == 0); // we don't remove symbols from order-0 context + #endif + + sumFreq = (sumFreq + 4 + adder) >> 1; + i = (unsigned)p->MinContext->NumStats - 1; + s->Freq = (Byte)sumFreq; + + do + { + unsigned freq = (++s)->Freq; + escFreq -= freq; + freq = (freq + adder) >> 1; + sumFreq += freq; + s->Freq = (Byte)freq; + if (freq > s[-1].Freq) + { + CPpmd_State tmp = *s; + CPpmd_State *s1 = s; + do + { + s1[0] = s1[-1]; + } + while (--s1 != stats && freq > s1[-1].Freq); + *s1 = tmp; + } + } + while (--i); + + if (s->Freq == 0) + { + /* Remove all items with Freq == 0 */ + CPpmd7_Context *mc; + unsigned numStats, numStatsNew, n0, n1; + + i = 0; do { i++; } while ((--s)->Freq == 0); + + /* We increase (escFreq) for the number of removed symbols. + So we will have (0.5) increase for Escape_Freq in avarage per + removed symbol after Escape_Freq halving */ + escFreq += i; + mc = p->MinContext; + numStats = mc->NumStats; + numStatsNew = numStats - i; + mc->NumStats = (UInt16)(numStatsNew); + n0 = (numStats + 1) >> 1; + + if (numStatsNew == 1) + { + /* Create Single-Symbol context */ + unsigned freq = stats->Freq; + + do + { + escFreq >>= 1; + freq = (freq + 1) >> 1; + } + while (escFreq > 1); + + s = ONE_STATE(mc); + *s = *stats; + s->Freq = (Byte)freq; // (freq <= 260 / 4) + p->FoundState = s; + InsertNode(p, stats, U2I(n0)); + return; + } + + n1 = (numStatsNew + 1) >> 1; + if (n0 != n1) + { + // p->MinContext->Union4.Stats = STATS_REF(ShrinkUnits(p, stats, n0, n1)); + unsigned i0 = U2I(n0); + unsigned i1 = U2I(n1); + if (i0 != i1) + { + if (p->FreeList[i1] != 0) + { + void *ptr = RemoveNode(p, i1); + p->MinContext->Union4.Stats = STATS_REF(ptr); + MyMem12Cpy(ptr, (const void *)stats, n1); + InsertNode(p, stats, i0); + } + else + SplitBlock(p, stats, i0, i1); + } + } + } + { + CPpmd7_Context *mc = p->MinContext; + mc->Union2.SummFreq = (UInt16)(sumFreq + escFreq - (escFreq >> 1)); + // Escape_Freq halving here + p->FoundState = STATS(mc); + } +} + + +CPpmd_See *Ppmd7_MakeEscFreq(CPpmd7 *p, unsigned numMasked, UInt32 *escFreq) +{ + CPpmd_See *see; + const CPpmd7_Context *mc = p->MinContext; + unsigned numStats = mc->NumStats; + if (numStats != 256) + { + unsigned nonMasked = numStats - numMasked; + see = p->See[(unsigned)p->NS2Indx[(size_t)nonMasked - 1]] + + (nonMasked < (unsigned)SUFFIX(mc)->NumStats - numStats) + + 2 * (unsigned)(mc->Union2.SummFreq < 11 * numStats) + + 4 * (unsigned)(numMasked > nonMasked) + + p->HiBitsFlag; + { + // if (see->Summ) field is larger than 16-bit, we need only low 16 bits of Summ + unsigned summ = (UInt16)see->Summ; // & 0xFFFF + unsigned r = (summ >> see->Shift); + see->Summ = (UInt16)(summ - r); + *escFreq = r + (r == 0); + } + } + else + { + see = &p->DummySee; + *escFreq = 1; + } + return see; +} + + +static void NextContext(CPpmd7 *p) +{ + CTX_PTR c = CTX(SUCCESSOR(p->FoundState)); + if (p->OrderFall == 0 && (const Byte *)c > p->Text) + p->MaxContext = p->MinContext = c; + else + Ppmd7_UpdateModel(p); +} + + +void Ppmd7_Update1(CPpmd7 *p) +{ + CPpmd_State *s = p->FoundState; + unsigned freq = s->Freq; + freq += 4; + p->MinContext->Union2.SummFreq = (UInt16)(p->MinContext->Union2.SummFreq + 4); + s->Freq = (Byte)freq; + if (freq > s[-1].Freq) + { + SwapStates(s); + p->FoundState = --s; + if (freq > MAX_FREQ) + Rescale(p); + } + NextContext(p); +} + + +void Ppmd7_Update1_0(CPpmd7 *p) +{ + CPpmd_State *s = p->FoundState; + CPpmd7_Context *mc = p->MinContext; + unsigned freq = s->Freq; + unsigned summFreq = mc->Union2.SummFreq; + p->PrevSuccess = (2 * freq > summFreq); + p->RunLength += (int)p->PrevSuccess; + mc->Union2.SummFreq = (UInt16)(summFreq + 4); + freq += 4; + s->Freq = (Byte)freq; + if (freq > MAX_FREQ) + Rescale(p); + NextContext(p); +} + + +/* +void Ppmd7_UpdateBin(CPpmd7 *p) +{ + unsigned freq = p->FoundState->Freq; + p->FoundState->Freq = (Byte)(freq + (freq < 128)); + p->PrevSuccess = 1; + p->RunLength++; + NextContext(p); +} +*/ + +void Ppmd7_Update2(CPpmd7 *p) +{ + CPpmd_State *s = p->FoundState; + unsigned freq = s->Freq; + freq += 4; + p->RunLength = p->InitRL; + p->MinContext->Union2.SummFreq = (UInt16)(p->MinContext->Union2.SummFreq + 4); + s->Freq = (Byte)freq; + if (freq > MAX_FREQ) + Rescale(p); + Ppmd7_UpdateModel(p); +} + + + +/* +PPMd Memory Map: +{ + [ 0 ] contains subset of original raw text, that is required to create context + records, Some symbols are not written, when max order context was reached + [ Text ] free area + [ UnitsStart ] CPpmd_State vectors and CPpmd7_Context records + [ LoUnit ] free area for CPpmd_State and CPpmd7_Context items +[ HiUnit ] CPpmd7_Context records + [ Size ] end of array +} + +These addresses don't cross at any time. +And the following condtions is true for addresses: + (0 <= Text < UnitsStart <= LoUnit <= HiUnit <= Size) + +Raw text is BYTE--aligned. +the data in block [ UnitsStart ... Size ] contains 12-bytes aligned UNITs. + +Last UNIT of array at offset (Size - 12) is root order-0 CPpmd7_Context record. +The code can free UNITs memory blocks that were allocated to store CPpmd_State vectors. +The code doesn't free UNITs allocated for CPpmd7_Context records. + +The code calls RestartModel(), when there is no free memory for allocation. +And RestartModel() changes the state to orignal start state, with full free block. + + +The code allocates UNITs with the following order: + +Allocation of 1 UNIT for Context record + - from free space (HiUnit) down to (LoUnit) + - from FreeList[0] + - AllocUnitsRare() + +AllocUnits() for CPpmd_State vectors: + - from FreeList[i] + - from free space (LoUnit) up to (HiUnit) + - AllocUnitsRare() + +AllocUnitsRare() + - if (GlueCount == 0) + { Glue lists, GlueCount = 255, allocate from FreeList[i]] } + - loop for all higher sized FreeList[...] lists + - from (UnitsStart - Text), GlueCount-- + - ERROR + + +Each Record with Context contains the CPpmd_State vector, where each +CPpmd_State contains the link to Successor. +There are 3 types of Successor: + 1) NULL-Successor - NULL pointer. NULL-Successor links can be stored + only in 0-order Root Context Record. + We use 0 value as NULL-Successor + 2) RAW-Successor - the link to position in raw text, + that "RAW-Successor" is being created after first + occurrence of new symbol for some existing context record. + (RAW-Successor > 0). + 3) RECORD-Successor - the link to CPpmd7_Context record of (Order+1), + that record is being created when we go via RAW-Successor again. + +For any successors at any time: the following condtions are true for Successor links: +(NULL-Successor < RAW-Successor < UnitsStart <= RECORD-Successor) + + +---------- Symbol Frequency, SummFreq and Range in Range_Coder ---------- + +CPpmd7_Context::SummFreq = Sum(Stats[].Freq) + Escape_Freq + +The PPMd code tries to fulfill the condition: + (SummFreq <= (256 * 128 = RC::kBot)) + +We have (Sum(Stats[].Freq) <= 256 * 124), because of (MAX_FREQ = 124) +So (4 = 128 - 124) is average reserve for Escape_Freq for each symbol. +If (CPpmd_State::Freq) is not aligned for 4, the reserve can be 5, 6 or 7. +SummFreq and Escape_Freq can be changed in Rescale() and *Update*() functions. +Rescale() can remove symbols only from max-order contexts. So Escape_Freq can increase after multiple calls of Rescale() for +max-order context. + +When the PPMd code still break (Total <= RC::Range) condition in range coder, +we have two ways to resolve that problem: + 1) we can report error, if we want to keep compatibility with original PPMd code that has no fix for such cases. + 2) we can reduce (Total) value to (RC::Range) by reducing (Escape_Freq) part of (Total) value. +*/ diff --git a/deps/LZMA-SDK/C/Ppmd7.h b/deps/LZMA-SDK/C/Ppmd7.h index 297e35fe9..d31809aeb 100644 --- a/deps/LZMA-SDK/C/Ppmd7.h +++ b/deps/LZMA-SDK/C/Ppmd7.h @@ -1,181 +1,181 @@ -/* Ppmd7.h -- Ppmd7 (PPMdH) compression codec -2021-04-13 : Igor Pavlov : Public domain -This code is based on: - PPMd var.H (2001): Dmitry Shkarin : Public domain */ - - -#ifndef __PPMD7_H -#define __PPMD7_H - -#include "Ppmd.h" - -EXTERN_C_BEGIN - -#define PPMD7_MIN_ORDER 2 -#define PPMD7_MAX_ORDER 64 - -#define PPMD7_MIN_MEM_SIZE (1 << 11) -#define PPMD7_MAX_MEM_SIZE (0xFFFFFFFF - 12 * 3) - -struct CPpmd7_Context_; - -typedef Ppmd_Ref_Type(struct CPpmd7_Context_) CPpmd7_Context_Ref; - -// MY_CPU_pragma_pack_push_1 - -typedef struct CPpmd7_Context_ -{ - UInt16 NumStats; - - - union - { - UInt16 SummFreq; - CPpmd_State2 State2; - } Union2; - - union - { - CPpmd_State_Ref Stats; - CPpmd_State4 State4; - } Union4; - - CPpmd7_Context_Ref Suffix; -} CPpmd7_Context; - -// MY_CPU_pragma_pop - -#define Ppmd7Context_OneState(p) ((CPpmd_State *)&(p)->Union2) - - - - -typedef struct -{ - UInt32 Range; - UInt32 Code; - UInt32 Low; - IByteIn *Stream; -} CPpmd7_RangeDec; - - -typedef struct -{ - UInt32 Range; - Byte Cache; - // Byte _dummy_[3]; - UInt64 Low; - UInt64 CacheSize; - IByteOut *Stream; -} CPpmd7z_RangeEnc; - - -typedef struct -{ - CPpmd7_Context *MinContext, *MaxContext; - CPpmd_State *FoundState; - unsigned OrderFall, InitEsc, PrevSuccess, MaxOrder, HiBitsFlag; - Int32 RunLength, InitRL; /* must be 32-bit at least */ - - UInt32 Size; - UInt32 GlueCount; - UInt32 AlignOffset; - Byte *Base, *LoUnit, *HiUnit, *Text, *UnitsStart; - - - - - union - { - CPpmd7_RangeDec dec; - CPpmd7z_RangeEnc enc; - } rc; - - Byte Indx2Units[PPMD_NUM_INDEXES + 2]; // +2 for alignment - Byte Units2Indx[128]; - CPpmd_Void_Ref FreeList[PPMD_NUM_INDEXES]; - - Byte NS2BSIndx[256], NS2Indx[256]; - Byte ExpEscape[16]; - CPpmd_See DummySee, See[25][16]; - UInt16 BinSumm[128][64]; - // int LastSymbol; -} CPpmd7; - - -void Ppmd7_Construct(CPpmd7 *p); -BoolInt Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAllocPtr alloc); -void Ppmd7_Free(CPpmd7 *p, ISzAllocPtr alloc); -void Ppmd7_Init(CPpmd7 *p, unsigned maxOrder); -#define Ppmd7_WasAllocated(p) ((p)->Base != NULL) - - -/* ---------- Internal Functions ---------- */ - -#define Ppmd7_GetPtr(p, ptr) Ppmd_GetPtr(p, ptr) -#define Ppmd7_GetContext(p, ptr) Ppmd_GetPtr_Type(p, ptr, CPpmd7_Context) -#define Ppmd7_GetStats(p, ctx) Ppmd_GetPtr_Type(p, (ctx)->Union4.Stats, CPpmd_State) - -void Ppmd7_Update1(CPpmd7 *p); -void Ppmd7_Update1_0(CPpmd7 *p); -void Ppmd7_Update2(CPpmd7 *p); - -#define PPMD7_HiBitsFlag_3(sym) ((((unsigned)sym + 0xC0) >> (8 - 3)) & (1 << 3)) -#define PPMD7_HiBitsFlag_4(sym) ((((unsigned)sym + 0xC0) >> (8 - 4)) & (1 << 4)) -// #define PPMD7_HiBitsFlag_3(sym) ((sym) < 0x40 ? 0 : (1 << 3)) -// #define PPMD7_HiBitsFlag_4(sym) ((sym) < 0x40 ? 0 : (1 << 4)) - -#define Ppmd7_GetBinSumm(p) \ - &p->BinSumm[(size_t)(unsigned)Ppmd7Context_OneState(p->MinContext)->Freq - 1] \ - [ p->PrevSuccess + ((p->RunLength >> 26) & 0x20) \ - + p->NS2BSIndx[(size_t)Ppmd7_GetContext(p, p->MinContext->Suffix)->NumStats - 1] \ - + PPMD7_HiBitsFlag_4(Ppmd7Context_OneState(p->MinContext)->Symbol) \ - + (p->HiBitsFlag = PPMD7_HiBitsFlag_3(p->FoundState->Symbol)) ] - -CPpmd_See *Ppmd7_MakeEscFreq(CPpmd7 *p, unsigned numMasked, UInt32 *scale); - - -/* -We support two versions of Ppmd7 (PPMdH) methods that use same CPpmd7 structure: - 1) Ppmd7a_*: original PPMdH - 2) Ppmd7z_*: modified PPMdH with 7z Range Coder -Ppmd7_*: the structures and functions that are common for both versions of PPMd7 (PPMdH) -*/ - -/* ---------- Decode ---------- */ - -#define PPMD7_SYM_END (-1) -#define PPMD7_SYM_ERROR (-2) - -/* -You must set (CPpmd7::rc.dec.Stream) before Ppmd7*_RangeDec_Init() - -Ppmd7*_DecodeSymbol() -out: - >= 0 : decoded byte - -1 : PPMD7_SYM_END : End of payload marker - -2 : PPMD7_SYM_ERROR : Data error -*/ - -/* Ppmd7a_* : original PPMdH */ -BoolInt Ppmd7a_RangeDec_Init(CPpmd7_RangeDec *p); -#define Ppmd7a_RangeDec_IsFinishedOK(p) ((p)->Code == 0) -int Ppmd7a_DecodeSymbol(CPpmd7 *p); - -/* Ppmd7z_* : modified PPMdH with 7z Range Coder */ -BoolInt Ppmd7z_RangeDec_Init(CPpmd7_RangeDec *p); -#define Ppmd7z_RangeDec_IsFinishedOK(p) ((p)->Code == 0) -int Ppmd7z_DecodeSymbol(CPpmd7 *p); -// Byte *Ppmd7z_DecodeSymbols(CPpmd7 *p, Byte *buf, const Byte *lim); - - -/* ---------- Encode ---------- */ - -void Ppmd7z_Init_RangeEnc(CPpmd7 *p); -void Ppmd7z_Flush_RangeEnc(CPpmd7 *p); -// void Ppmd7z_EncodeSymbol(CPpmd7 *p, int symbol); -void Ppmd7z_EncodeSymbols(CPpmd7 *p, const Byte *buf, const Byte *lim); - -EXTERN_C_END - -#endif +/* Ppmd7.h -- Ppmd7 (PPMdH) compression codec +2021-04-13 : Igor Pavlov : Public domain +This code is based on: + PPMd var.H (2001): Dmitry Shkarin : Public domain */ + + +#ifndef __PPMD7_H +#define __PPMD7_H + +#include "Ppmd.h" + +EXTERN_C_BEGIN + +#define PPMD7_MIN_ORDER 2 +#define PPMD7_MAX_ORDER 64 + +#define PPMD7_MIN_MEM_SIZE (1 << 11) +#define PPMD7_MAX_MEM_SIZE (0xFFFFFFFF - 12 * 3) + +struct CPpmd7_Context_; + +typedef Ppmd_Ref_Type(struct CPpmd7_Context_) CPpmd7_Context_Ref; + +// MY_CPU_pragma_pack_push_1 + +typedef struct CPpmd7_Context_ +{ + UInt16 NumStats; + + + union + { + UInt16 SummFreq; + CPpmd_State2 State2; + } Union2; + + union + { + CPpmd_State_Ref Stats; + CPpmd_State4 State4; + } Union4; + + CPpmd7_Context_Ref Suffix; +} CPpmd7_Context; + +// MY_CPU_pragma_pop + +#define Ppmd7Context_OneState(p) ((CPpmd_State *)&(p)->Union2) + + + + +typedef struct +{ + UInt32 Range; + UInt32 Code; + UInt32 Low; + IByteIn *Stream; +} CPpmd7_RangeDec; + + +typedef struct +{ + UInt32 Range; + Byte Cache; + // Byte _dummy_[3]; + UInt64 Low; + UInt64 CacheSize; + IByteOut *Stream; +} CPpmd7z_RangeEnc; + + +typedef struct +{ + CPpmd7_Context *MinContext, *MaxContext; + CPpmd_State *FoundState; + unsigned OrderFall, InitEsc, PrevSuccess, MaxOrder, HiBitsFlag; + Int32 RunLength, InitRL; /* must be 32-bit at least */ + + UInt32 Size; + UInt32 GlueCount; + UInt32 AlignOffset; + Byte *Base, *LoUnit, *HiUnit, *Text, *UnitsStart; + + + + + union + { + CPpmd7_RangeDec dec; + CPpmd7z_RangeEnc enc; + } rc; + + Byte Indx2Units[PPMD_NUM_INDEXES + 2]; // +2 for alignment + Byte Units2Indx[128]; + CPpmd_Void_Ref FreeList[PPMD_NUM_INDEXES]; + + Byte NS2BSIndx[256], NS2Indx[256]; + Byte ExpEscape[16]; + CPpmd_See DummySee, See[25][16]; + UInt16 BinSumm[128][64]; + // int LastSymbol; +} CPpmd7; + + +void Ppmd7_Construct(CPpmd7 *p); +BoolInt Ppmd7_Alloc(CPpmd7 *p, UInt32 size, ISzAllocPtr alloc); +void Ppmd7_Free(CPpmd7 *p, ISzAllocPtr alloc); +void Ppmd7_Init(CPpmd7 *p, unsigned maxOrder); +#define Ppmd7_WasAllocated(p) ((p)->Base != NULL) + + +/* ---------- Internal Functions ---------- */ + +#define Ppmd7_GetPtr(p, ptr) Ppmd_GetPtr(p, ptr) +#define Ppmd7_GetContext(p, ptr) Ppmd_GetPtr_Type(p, ptr, CPpmd7_Context) +#define Ppmd7_GetStats(p, ctx) Ppmd_GetPtr_Type(p, (ctx)->Union4.Stats, CPpmd_State) + +void Ppmd7_Update1(CPpmd7 *p); +void Ppmd7_Update1_0(CPpmd7 *p); +void Ppmd7_Update2(CPpmd7 *p); + +#define PPMD7_HiBitsFlag_3(sym) ((((unsigned)sym + 0xC0) >> (8 - 3)) & (1 << 3)) +#define PPMD7_HiBitsFlag_4(sym) ((((unsigned)sym + 0xC0) >> (8 - 4)) & (1 << 4)) +// #define PPMD7_HiBitsFlag_3(sym) ((sym) < 0x40 ? 0 : (1 << 3)) +// #define PPMD7_HiBitsFlag_4(sym) ((sym) < 0x40 ? 0 : (1 << 4)) + +#define Ppmd7_GetBinSumm(p) \ + &p->BinSumm[(size_t)(unsigned)Ppmd7Context_OneState(p->MinContext)->Freq - 1] \ + [ p->PrevSuccess + ((p->RunLength >> 26) & 0x20) \ + + p->NS2BSIndx[(size_t)Ppmd7_GetContext(p, p->MinContext->Suffix)->NumStats - 1] \ + + PPMD7_HiBitsFlag_4(Ppmd7Context_OneState(p->MinContext)->Symbol) \ + + (p->HiBitsFlag = PPMD7_HiBitsFlag_3(p->FoundState->Symbol)) ] + +CPpmd_See *Ppmd7_MakeEscFreq(CPpmd7 *p, unsigned numMasked, UInt32 *scale); + + +/* +We support two versions of Ppmd7 (PPMdH) methods that use same CPpmd7 structure: + 1) Ppmd7a_*: original PPMdH + 2) Ppmd7z_*: modified PPMdH with 7z Range Coder +Ppmd7_*: the structures and functions that are common for both versions of PPMd7 (PPMdH) +*/ + +/* ---------- Decode ---------- */ + +#define PPMD7_SYM_END (-1) +#define PPMD7_SYM_ERROR (-2) + +/* +You must set (CPpmd7::rc.dec.Stream) before Ppmd7*_RangeDec_Init() + +Ppmd7*_DecodeSymbol() +out: + >= 0 : decoded byte + -1 : PPMD7_SYM_END : End of payload marker + -2 : PPMD7_SYM_ERROR : Data error +*/ + +/* Ppmd7a_* : original PPMdH */ +BoolInt Ppmd7a_RangeDec_Init(CPpmd7_RangeDec *p); +#define Ppmd7a_RangeDec_IsFinishedOK(p) ((p)->Code == 0) +int Ppmd7a_DecodeSymbol(CPpmd7 *p); + +/* Ppmd7z_* : modified PPMdH with 7z Range Coder */ +BoolInt Ppmd7z_RangeDec_Init(CPpmd7_RangeDec *p); +#define Ppmd7z_RangeDec_IsFinishedOK(p) ((p)->Code == 0) +int Ppmd7z_DecodeSymbol(CPpmd7 *p); +// Byte *Ppmd7z_DecodeSymbols(CPpmd7 *p, Byte *buf, const Byte *lim); + + +/* ---------- Encode ---------- */ + +void Ppmd7z_Init_RangeEnc(CPpmd7 *p); +void Ppmd7z_Flush_RangeEnc(CPpmd7 *p); +// void Ppmd7z_EncodeSymbol(CPpmd7 *p, int symbol); +void Ppmd7z_EncodeSymbols(CPpmd7 *p, const Byte *buf, const Byte *lim); + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/Ppmd7Dec.c b/deps/LZMA-SDK/C/Ppmd7Dec.c index a18f0b873..55d74ff9d 100644 --- a/deps/LZMA-SDK/C/Ppmd7Dec.c +++ b/deps/LZMA-SDK/C/Ppmd7Dec.c @@ -1,297 +1,297 @@ -/* Ppmd7Dec.c -- Ppmd7z (PPMdH with 7z Range Coder) Decoder -2021-04-13 : Igor Pavlov : Public domain -This code is based on: - PPMd var.H (2001): Dmitry Shkarin : Public domain */ - - -#include "Precomp.h" - -#include "Ppmd7.h" - -#define kTopValue (1 << 24) - - -#define READ_BYTE(p) IByteIn_Read((p)->Stream) - -BoolInt Ppmd7z_RangeDec_Init(CPpmd7_RangeDec *p) -{ - unsigned i; - p->Code = 0; - p->Range = 0xFFFFFFFF; - if (READ_BYTE(p) != 0) - return False; - for (i = 0; i < 4; i++) - p->Code = (p->Code << 8) | READ_BYTE(p); - return (p->Code < 0xFFFFFFFF); -} - -#define RC_NORM_BASE(p) if ((p)->Range < kTopValue) \ - { (p)->Code = ((p)->Code << 8) | READ_BYTE(p); (p)->Range <<= 8; - -#define RC_NORM_1(p) RC_NORM_BASE(p) } -#define RC_NORM(p) RC_NORM_BASE(p) RC_NORM_BASE(p) }} - -// we must use only one type of Normalization from two: LOCAL or REMOTE -#define RC_NORM_LOCAL(p) // RC_NORM(p) -#define RC_NORM_REMOTE(p) RC_NORM(p) - -#define R (&p->rc.dec) - -MY_FORCE_INLINE -// MY_NO_INLINE -static void RangeDec_Decode(CPpmd7 *p, UInt32 start, UInt32 size) -{ - - - R->Code -= start * R->Range; - R->Range *= size; - RC_NORM_LOCAL(R) -} - -#define RC_Decode(start, size) RangeDec_Decode(p, start, size); -#define RC_DecodeFinal(start, size) RC_Decode(start, size) RC_NORM_REMOTE(R) -#define RC_GetThreshold(total) (R->Code / (R->Range /= (total))) - - -#define CTX(ref) ((CPpmd7_Context *)Ppmd7_GetContext(p, ref)) -typedef CPpmd7_Context * CTX_PTR; -#define SUCCESSOR(p) Ppmd_GET_SUCCESSOR(p) -void Ppmd7_UpdateModel(CPpmd7 *p); - -#define MASK(sym) ((unsigned char *)charMask)[sym] -// MY_FORCE_INLINE -// static -int Ppmd7z_DecodeSymbol(CPpmd7 *p) -{ - size_t charMask[256 / sizeof(size_t)]; - - if (p->MinContext->NumStats != 1) - { - CPpmd_State *s = Ppmd7_GetStats(p, p->MinContext); - unsigned i; - UInt32 count, hiCnt; - UInt32 summFreq = p->MinContext->Union2.SummFreq; - - - - - count = RC_GetThreshold(summFreq); - hiCnt = count; - - if ((Int32)(count -= s->Freq) < 0) - { - Byte sym; - RC_DecodeFinal(0, s->Freq); - p->FoundState = s; - sym = s->Symbol; - Ppmd7_Update1_0(p); - return sym; - } - - p->PrevSuccess = 0; - i = (unsigned)p->MinContext->NumStats - 1; - - do - { - if ((Int32)(count -= (++s)->Freq) < 0) - { - Byte sym; - RC_DecodeFinal((hiCnt - count) - s->Freq, s->Freq); - p->FoundState = s; - sym = s->Symbol; - Ppmd7_Update1(p); - return sym; - } - } - while (--i); - - if (hiCnt >= summFreq) - return PPMD7_SYM_ERROR; - - hiCnt -= count; - RC_Decode(hiCnt, summFreq - hiCnt); - - p->HiBitsFlag = PPMD7_HiBitsFlag_3(p->FoundState->Symbol); - PPMD_SetAllBitsIn256Bytes(charMask); - // i = p->MinContext->NumStats - 1; - // do { MASK((--s)->Symbol) = 0; } while (--i); - { - CPpmd_State *s2 = Ppmd7_GetStats(p, p->MinContext); - MASK(s->Symbol) = 0; - do - { - unsigned sym0 = s2[0].Symbol; - unsigned sym1 = s2[1].Symbol; - s2 += 2; - MASK(sym0) = 0; - MASK(sym1) = 0; - } - while (s2 < s); - } - } - else - { - CPpmd_State *s = Ppmd7Context_OneState(p->MinContext); - UInt16 *prob = Ppmd7_GetBinSumm(p); - UInt32 pr = *prob; - UInt32 size0 = (R->Range >> 14) * pr; - pr = PPMD_UPDATE_PROB_1(pr); - - if (R->Code < size0) - { - Byte sym; - *prob = (UInt16)(pr + (1 << PPMD_INT_BITS)); - - // RangeDec_DecodeBit0(size0); - R->Range = size0; - RC_NORM_1(R) - /* we can use single byte normalization here because of - (min(BinSumm[][]) = 95) > (1 << (14 - 8)) */ - - // sym = (p->FoundState = Ppmd7Context_OneState(p->MinContext))->Symbol; - // Ppmd7_UpdateBin(p); - { - unsigned freq = s->Freq; - CTX_PTR c = CTX(SUCCESSOR(s)); - sym = s->Symbol; - p->FoundState = s; - p->PrevSuccess = 1; - p->RunLength++; - s->Freq = (Byte)(freq + (freq < 128)); - // NextContext(p); - if (p->OrderFall == 0 && (const Byte *)c > p->Text) - p->MaxContext = p->MinContext = c; - else - Ppmd7_UpdateModel(p); - } - return sym; - } - - *prob = (UInt16)pr; - p->InitEsc = p->ExpEscape[pr >> 10]; - - // RangeDec_DecodeBit1(size0); - - R->Code -= size0; - R->Range -= size0; - RC_NORM_LOCAL(R) - - PPMD_SetAllBitsIn256Bytes(charMask); - MASK(Ppmd7Context_OneState(p->MinContext)->Symbol) = 0; - p->PrevSuccess = 0; - } - - for (;;) - { - CPpmd_State *s, *s2; - UInt32 freqSum, count, hiCnt; - - CPpmd_See *see; - CPpmd7_Context *mc; - unsigned numMasked; - RC_NORM_REMOTE(R) - mc = p->MinContext; - numMasked = mc->NumStats; - - do - { - p->OrderFall++; - if (!mc->Suffix) - return PPMD7_SYM_END; - mc = Ppmd7_GetContext(p, mc->Suffix); - } - while (mc->NumStats == numMasked); - - s = Ppmd7_GetStats(p, mc); - - { - unsigned num = mc->NumStats; - unsigned num2 = num / 2; - - num &= 1; - hiCnt = (s->Freq & (unsigned)(MASK(s->Symbol))) & (0 - (UInt32)num); - s += num; - p->MinContext = mc; - - do - { - unsigned sym0 = s[0].Symbol; - unsigned sym1 = s[1].Symbol; - s += 2; - hiCnt += (s[-2].Freq & (unsigned)(MASK(sym0))); - hiCnt += (s[-1].Freq & (unsigned)(MASK(sym1))); - } - while (--num2); - } - - see = Ppmd7_MakeEscFreq(p, numMasked, &freqSum); - freqSum += hiCnt; - - - - - count = RC_GetThreshold(freqSum); - - if (count < hiCnt) - { - Byte sym; - - s = Ppmd7_GetStats(p, p->MinContext); - hiCnt = count; - // count -= s->Freq & (unsigned)(MASK(s->Symbol)); - // if ((Int32)count >= 0) - { - for (;;) - { - count -= s->Freq & (unsigned)(MASK((s)->Symbol)); s++; if ((Int32)count < 0) break; - // count -= s->Freq & (unsigned)(MASK((s)->Symbol)); s++; if ((Int32)count < 0) break; - }; - } - s--; - RC_DecodeFinal((hiCnt - count) - s->Freq, s->Freq); - - // new (see->Summ) value can overflow over 16-bits in some rare cases - Ppmd_See_Update(see); - p->FoundState = s; - sym = s->Symbol; - Ppmd7_Update2(p); - return sym; - } - - if (count >= freqSum) - return PPMD7_SYM_ERROR; - - RC_Decode(hiCnt, freqSum - hiCnt); - - // We increase (see->Summ) for sum of Freqs of all non_Masked symbols. - // new (see->Summ) value can overflow over 16-bits in some rare cases - see->Summ = (UInt16)(see->Summ + freqSum); - - s = Ppmd7_GetStats(p, p->MinContext); - s2 = s + p->MinContext->NumStats; - do - { - MASK(s->Symbol) = 0; - s++; - } - while (s != s2); - } -} - -/* -Byte *Ppmd7z_DecodeSymbols(CPpmd7 *p, Byte *buf, const Byte *lim) -{ - int sym = 0; - if (buf != lim) - do - { - sym = Ppmd7z_DecodeSymbol(p); - if (sym < 0) - break; - *buf = (Byte)sym; - } - while (++buf < lim); - p->LastSymbol = sym; - return buf; -} -*/ +/* Ppmd7Dec.c -- Ppmd7z (PPMdH with 7z Range Coder) Decoder +2021-04-13 : Igor Pavlov : Public domain +This code is based on: + PPMd var.H (2001): Dmitry Shkarin : Public domain */ + + +#include "Precomp.h" + +#include "Ppmd7.h" + +#define kTopValue (1 << 24) + + +#define READ_BYTE(p) IByteIn_Read((p)->Stream) + +BoolInt Ppmd7z_RangeDec_Init(CPpmd7_RangeDec *p) +{ + unsigned i; + p->Code = 0; + p->Range = 0xFFFFFFFF; + if (READ_BYTE(p) != 0) + return False; + for (i = 0; i < 4; i++) + p->Code = (p->Code << 8) | READ_BYTE(p); + return (p->Code < 0xFFFFFFFF); +} + +#define RC_NORM_BASE(p) if ((p)->Range < kTopValue) \ + { (p)->Code = ((p)->Code << 8) | READ_BYTE(p); (p)->Range <<= 8; + +#define RC_NORM_1(p) RC_NORM_BASE(p) } +#define RC_NORM(p) RC_NORM_BASE(p) RC_NORM_BASE(p) }} + +// we must use only one type of Normalization from two: LOCAL or REMOTE +#define RC_NORM_LOCAL(p) // RC_NORM(p) +#define RC_NORM_REMOTE(p) RC_NORM(p) + +#define R (&p->rc.dec) + +MY_FORCE_INLINE +// MY_NO_INLINE +static void RangeDec_Decode(CPpmd7 *p, UInt32 start, UInt32 size) +{ + + + R->Code -= start * R->Range; + R->Range *= size; + RC_NORM_LOCAL(R) +} + +#define RC_Decode(start, size) RangeDec_Decode(p, start, size); +#define RC_DecodeFinal(start, size) RC_Decode(start, size) RC_NORM_REMOTE(R) +#define RC_GetThreshold(total) (R->Code / (R->Range /= (total))) + + +#define CTX(ref) ((CPpmd7_Context *)Ppmd7_GetContext(p, ref)) +typedef CPpmd7_Context * CTX_PTR; +#define SUCCESSOR(p) Ppmd_GET_SUCCESSOR(p) +void Ppmd7_UpdateModel(CPpmd7 *p); + +#define MASK(sym) ((unsigned char *)charMask)[sym] +// MY_FORCE_INLINE +// static +int Ppmd7z_DecodeSymbol(CPpmd7 *p) +{ + size_t charMask[256 / sizeof(size_t)]; + + if (p->MinContext->NumStats != 1) + { + CPpmd_State *s = Ppmd7_GetStats(p, p->MinContext); + unsigned i; + UInt32 count, hiCnt; + UInt32 summFreq = p->MinContext->Union2.SummFreq; + + + + + count = RC_GetThreshold(summFreq); + hiCnt = count; + + if ((Int32)(count -= s->Freq) < 0) + { + Byte sym; + RC_DecodeFinal(0, s->Freq); + p->FoundState = s; + sym = s->Symbol; + Ppmd7_Update1_0(p); + return sym; + } + + p->PrevSuccess = 0; + i = (unsigned)p->MinContext->NumStats - 1; + + do + { + if ((Int32)(count -= (++s)->Freq) < 0) + { + Byte sym; + RC_DecodeFinal((hiCnt - count) - s->Freq, s->Freq); + p->FoundState = s; + sym = s->Symbol; + Ppmd7_Update1(p); + return sym; + } + } + while (--i); + + if (hiCnt >= summFreq) + return PPMD7_SYM_ERROR; + + hiCnt -= count; + RC_Decode(hiCnt, summFreq - hiCnt); + + p->HiBitsFlag = PPMD7_HiBitsFlag_3(p->FoundState->Symbol); + PPMD_SetAllBitsIn256Bytes(charMask); + // i = p->MinContext->NumStats - 1; + // do { MASK((--s)->Symbol) = 0; } while (--i); + { + CPpmd_State *s2 = Ppmd7_GetStats(p, p->MinContext); + MASK(s->Symbol) = 0; + do + { + unsigned sym0 = s2[0].Symbol; + unsigned sym1 = s2[1].Symbol; + s2 += 2; + MASK(sym0) = 0; + MASK(sym1) = 0; + } + while (s2 < s); + } + } + else + { + CPpmd_State *s = Ppmd7Context_OneState(p->MinContext); + UInt16 *prob = Ppmd7_GetBinSumm(p); + UInt32 pr = *prob; + UInt32 size0 = (R->Range >> 14) * pr; + pr = PPMD_UPDATE_PROB_1(pr); + + if (R->Code < size0) + { + Byte sym; + *prob = (UInt16)(pr + (1 << PPMD_INT_BITS)); + + // RangeDec_DecodeBit0(size0); + R->Range = size0; + RC_NORM_1(R) + /* we can use single byte normalization here because of + (min(BinSumm[][]) = 95) > (1 << (14 - 8)) */ + + // sym = (p->FoundState = Ppmd7Context_OneState(p->MinContext))->Symbol; + // Ppmd7_UpdateBin(p); + { + unsigned freq = s->Freq; + CTX_PTR c = CTX(SUCCESSOR(s)); + sym = s->Symbol; + p->FoundState = s; + p->PrevSuccess = 1; + p->RunLength++; + s->Freq = (Byte)(freq + (freq < 128)); + // NextContext(p); + if (p->OrderFall == 0 && (const Byte *)c > p->Text) + p->MaxContext = p->MinContext = c; + else + Ppmd7_UpdateModel(p); + } + return sym; + } + + *prob = (UInt16)pr; + p->InitEsc = p->ExpEscape[pr >> 10]; + + // RangeDec_DecodeBit1(size0); + + R->Code -= size0; + R->Range -= size0; + RC_NORM_LOCAL(R) + + PPMD_SetAllBitsIn256Bytes(charMask); + MASK(Ppmd7Context_OneState(p->MinContext)->Symbol) = 0; + p->PrevSuccess = 0; + } + + for (;;) + { + CPpmd_State *s, *s2; + UInt32 freqSum, count, hiCnt; + + CPpmd_See *see; + CPpmd7_Context *mc; + unsigned numMasked; + RC_NORM_REMOTE(R) + mc = p->MinContext; + numMasked = mc->NumStats; + + do + { + p->OrderFall++; + if (!mc->Suffix) + return PPMD7_SYM_END; + mc = Ppmd7_GetContext(p, mc->Suffix); + } + while (mc->NumStats == numMasked); + + s = Ppmd7_GetStats(p, mc); + + { + unsigned num = mc->NumStats; + unsigned num2 = num / 2; + + num &= 1; + hiCnt = (s->Freq & (unsigned)(MASK(s->Symbol))) & (0 - (UInt32)num); + s += num; + p->MinContext = mc; + + do + { + unsigned sym0 = s[0].Symbol; + unsigned sym1 = s[1].Symbol; + s += 2; + hiCnt += (s[-2].Freq & (unsigned)(MASK(sym0))); + hiCnt += (s[-1].Freq & (unsigned)(MASK(sym1))); + } + while (--num2); + } + + see = Ppmd7_MakeEscFreq(p, numMasked, &freqSum); + freqSum += hiCnt; + + + + + count = RC_GetThreshold(freqSum); + + if (count < hiCnt) + { + Byte sym; + + s = Ppmd7_GetStats(p, p->MinContext); + hiCnt = count; + // count -= s->Freq & (unsigned)(MASK(s->Symbol)); + // if ((Int32)count >= 0) + { + for (;;) + { + count -= s->Freq & (unsigned)(MASK((s)->Symbol)); s++; if ((Int32)count < 0) break; + // count -= s->Freq & (unsigned)(MASK((s)->Symbol)); s++; if ((Int32)count < 0) break; + }; + } + s--; + RC_DecodeFinal((hiCnt - count) - s->Freq, s->Freq); + + // new (see->Summ) value can overflow over 16-bits in some rare cases + Ppmd_See_Update(see); + p->FoundState = s; + sym = s->Symbol; + Ppmd7_Update2(p); + return sym; + } + + if (count >= freqSum) + return PPMD7_SYM_ERROR; + + RC_Decode(hiCnt, freqSum - hiCnt); + + // We increase (see->Summ) for sum of Freqs of all non_Masked symbols. + // new (see->Summ) value can overflow over 16-bits in some rare cases + see->Summ = (UInt16)(see->Summ + freqSum); + + s = Ppmd7_GetStats(p, p->MinContext); + s2 = s + p->MinContext->NumStats; + do + { + MASK(s->Symbol) = 0; + s++; + } + while (s != s2); + } +} + +/* +Byte *Ppmd7z_DecodeSymbols(CPpmd7 *p, Byte *buf, const Byte *lim) +{ + int sym = 0; + if (buf != lim) + do + { + sym = Ppmd7z_DecodeSymbol(p); + if (sym < 0) + break; + *buf = (Byte)sym; + } + while (++buf < lim); + p->LastSymbol = sym; + return buf; +} +*/ diff --git a/deps/LZMA-SDK/C/Ppmd7Enc.c b/deps/LZMA-SDK/C/Ppmd7Enc.c index 6af1ec15e..62139c5b6 100644 --- a/deps/LZMA-SDK/C/Ppmd7Enc.c +++ b/deps/LZMA-SDK/C/Ppmd7Enc.c @@ -1,323 +1,323 @@ -/* Ppmd7Enc.c -- Ppmd7z (PPMdH with 7z Range Coder) Encoder -2021-04-13 : Igor Pavlov : Public domain -This code is based on: - PPMd var.H (2001): Dmitry Shkarin : Public domain */ - - -#include "Precomp.h" - -#include "Ppmd7.h" - -#define kTopValue (1 << 24) - -#define R (&p->rc.enc) - -void Ppmd7z_Init_RangeEnc(CPpmd7 *p) -{ - R->Low = 0; - R->Range = 0xFFFFFFFF; - R->Cache = 0; - R->CacheSize = 1; -} - -MY_NO_INLINE -static void RangeEnc_ShiftLow(CPpmd7 *p) -{ - if ((UInt32)R->Low < (UInt32)0xFF000000 || (unsigned)(R->Low >> 32) != 0) - { - Byte temp = R->Cache; - do - { - IByteOut_Write(R->Stream, (Byte)(temp + (Byte)(R->Low >> 32))); - temp = 0xFF; - } - while (--R->CacheSize != 0); - R->Cache = (Byte)((UInt32)R->Low >> 24); - } - R->CacheSize++; - R->Low = (UInt32)((UInt32)R->Low << 8); -} - -#define RC_NORM_BASE(p) if (R->Range < kTopValue) { R->Range <<= 8; RangeEnc_ShiftLow(p); -#define RC_NORM_1(p) RC_NORM_BASE(p) } -#define RC_NORM(p) RC_NORM_BASE(p) RC_NORM_BASE(p) }} - -// we must use only one type of Normalization from two: LOCAL or REMOTE -#define RC_NORM_LOCAL(p) // RC_NORM(p) -#define RC_NORM_REMOTE(p) RC_NORM(p) - -/* -#define RangeEnc_Encode(p, start, _size_) \ - { UInt32 size = _size_; \ - R->Low += start * R->Range; \ - R->Range *= size; \ - RC_NORM_LOCAL(p); } -*/ - -MY_FORCE_INLINE -// MY_NO_INLINE -static void RangeEnc_Encode(CPpmd7 *p, UInt32 start, UInt32 size) -{ - R->Low += start * R->Range; - R->Range *= size; - RC_NORM_LOCAL(p); -} - -void Ppmd7z_Flush_RangeEnc(CPpmd7 *p) -{ - unsigned i; - for (i = 0; i < 5; i++) - RangeEnc_ShiftLow(p); -} - - - -#define RC_Encode(start, size) RangeEnc_Encode(p, start, size); -#define RC_EncodeFinal(start, size) RC_Encode(start, size); RC_NORM_REMOTE(p); - -#define CTX(ref) ((CPpmd7_Context *)Ppmd7_GetContext(p, ref)) -#define SUFFIX(ctx) CTX((ctx)->Suffix) -typedef CPpmd7_Context * CTX_PTR; -#define SUCCESSOR(p) Ppmd_GET_SUCCESSOR(p) - -void Ppmd7_UpdateModel(CPpmd7 *p); - -#define MASK(sym) ((unsigned char *)charMask)[sym] - -MY_FORCE_INLINE -static -void Ppmd7z_EncodeSymbol(CPpmd7 *p, int symbol) -{ - size_t charMask[256 / sizeof(size_t)]; - - if (p->MinContext->NumStats != 1) - { - CPpmd_State *s = Ppmd7_GetStats(p, p->MinContext); - UInt32 sum; - unsigned i; - - - - - R->Range /= p->MinContext->Union2.SummFreq; - - if (s->Symbol == symbol) - { - // R->Range /= p->MinContext->Union2.SummFreq; - RC_EncodeFinal(0, s->Freq); - p->FoundState = s; - Ppmd7_Update1_0(p); - return; - } - p->PrevSuccess = 0; - sum = s->Freq; - i = (unsigned)p->MinContext->NumStats - 1; - do - { - if ((++s)->Symbol == symbol) - { - // R->Range /= p->MinContext->Union2.SummFreq; - RC_EncodeFinal(sum, s->Freq); - p->FoundState = s; - Ppmd7_Update1(p); - return; - } - sum += s->Freq; - } - while (--i); - - // R->Range /= p->MinContext->Union2.SummFreq; - RC_Encode(sum, p->MinContext->Union2.SummFreq - sum); - - p->HiBitsFlag = PPMD7_HiBitsFlag_3(p->FoundState->Symbol); - PPMD_SetAllBitsIn256Bytes(charMask); - // MASK(s->Symbol) = 0; - // i = p->MinContext->NumStats - 1; - // do { MASK((--s)->Symbol) = 0; } while (--i); - { - CPpmd_State *s2 = Ppmd7_GetStats(p, p->MinContext); - MASK(s->Symbol) = 0; - do - { - unsigned sym0 = s2[0].Symbol; - unsigned sym1 = s2[1].Symbol; - s2 += 2; - MASK(sym0) = 0; - MASK(sym1) = 0; - } - while (s2 < s); - } - } - else - { - UInt16 *prob = Ppmd7_GetBinSumm(p); - CPpmd_State *s = Ppmd7Context_OneState(p->MinContext); - UInt32 pr = *prob; - UInt32 bound = (R->Range >> 14) * pr; - pr = PPMD_UPDATE_PROB_1(pr); - if (s->Symbol == symbol) - { - *prob = (UInt16)(pr + (1 << PPMD_INT_BITS)); - // RangeEnc_EncodeBit_0(p, bound); - R->Range = bound; - RC_NORM_1(p); - - // p->FoundState = s; - // Ppmd7_UpdateBin(p); - { - unsigned freq = s->Freq; - CTX_PTR c = CTX(SUCCESSOR(s)); - p->FoundState = s; - p->PrevSuccess = 1; - p->RunLength++; - s->Freq = (Byte)(freq + (freq < 128)); - // NextContext(p); - if (p->OrderFall == 0 && (const Byte *)c > p->Text) - p->MaxContext = p->MinContext = c; - else - Ppmd7_UpdateModel(p); - } - return; - } - - *prob = (UInt16)pr; - p->InitEsc = p->ExpEscape[pr >> 10]; - // RangeEnc_EncodeBit_1(p, bound); - R->Low += bound; - R->Range -= bound; - RC_NORM_LOCAL(p) - - PPMD_SetAllBitsIn256Bytes(charMask); - MASK(s->Symbol) = 0; - p->PrevSuccess = 0; - } - - for (;;) - { - CPpmd_See *see; - CPpmd_State *s; - UInt32 sum, escFreq; - CPpmd7_Context *mc; - unsigned i, numMasked; - - RC_NORM_REMOTE(p) - - mc = p->MinContext; - numMasked = mc->NumStats; - - do - { - p->OrderFall++; - if (!mc->Suffix) - return; /* EndMarker (symbol = -1) */ - mc = Ppmd7_GetContext(p, mc->Suffix); - i = mc->NumStats; - } - while (i == numMasked); - - p->MinContext = mc; - - // see = Ppmd7_MakeEscFreq(p, numMasked, &escFreq); - { - if (i != 256) - { - unsigned nonMasked = i - numMasked; - see = p->See[(unsigned)p->NS2Indx[(size_t)nonMasked - 1]] - + p->HiBitsFlag - + (nonMasked < (unsigned)SUFFIX(mc)->NumStats - i) - + 2 * (unsigned)(mc->Union2.SummFreq < 11 * i) - + 4 * (unsigned)(numMasked > nonMasked); - { - // if (see->Summ) field is larger than 16-bit, we need only low 16 bits of Summ - unsigned summ = (UInt16)see->Summ; // & 0xFFFF - unsigned r = (summ >> see->Shift); - see->Summ = (UInt16)(summ - r); - escFreq = r + (r == 0); - } - } - else - { - see = &p->DummySee; - escFreq = 1; - } - } - - s = Ppmd7_GetStats(p, mc); - sum = 0; - // i = mc->NumStats; - - do - { - unsigned cur = s->Symbol; - if ((int)cur == symbol) - { - UInt32 low = sum; - UInt32 freq = s->Freq; - unsigned num2; - - Ppmd_See_Update(see); - p->FoundState = s; - sum += escFreq; - - num2 = i / 2; - i &= 1; - sum += freq & (0 - (UInt32)i); - if (num2 != 0) - { - s += i; - for (;;) - { - unsigned sym0 = s[0].Symbol; - unsigned sym1 = s[1].Symbol; - s += 2; - sum += (s[-2].Freq & (unsigned)(MASK(sym0))); - sum += (s[-1].Freq & (unsigned)(MASK(sym1))); - if (--num2 == 0) - break; - } - } - - - R->Range /= sum; - RC_EncodeFinal(low, freq); - Ppmd7_Update2(p); - return; - } - sum += (s->Freq & (unsigned)(MASK(cur))); - s++; - } - while (--i); - - { - UInt32 total = sum + escFreq; - see->Summ = (UInt16)(see->Summ + total); - - R->Range /= total; - RC_Encode(sum, escFreq); - } - - { - CPpmd_State *s2 = Ppmd7_GetStats(p, p->MinContext); - s--; - MASK(s->Symbol) = 0; - do - { - unsigned sym0 = s2[0].Symbol; - unsigned sym1 = s2[1].Symbol; - s2 += 2; - MASK(sym0) = 0; - MASK(sym1) = 0; - } - while (s2 < s); - } - } -} - - -void Ppmd7z_EncodeSymbols(CPpmd7 *p, const Byte *buf, const Byte *lim) -{ - for (; buf < lim; buf++) - { - Ppmd7z_EncodeSymbol(p, *buf); - } -} +/* Ppmd7Enc.c -- Ppmd7z (PPMdH with 7z Range Coder) Encoder +2021-04-13 : Igor Pavlov : Public domain +This code is based on: + PPMd var.H (2001): Dmitry Shkarin : Public domain */ + + +#include "Precomp.h" + +#include "Ppmd7.h" + +#define kTopValue (1 << 24) + +#define R (&p->rc.enc) + +void Ppmd7z_Init_RangeEnc(CPpmd7 *p) +{ + R->Low = 0; + R->Range = 0xFFFFFFFF; + R->Cache = 0; + R->CacheSize = 1; +} + +MY_NO_INLINE +static void RangeEnc_ShiftLow(CPpmd7 *p) +{ + if ((UInt32)R->Low < (UInt32)0xFF000000 || (unsigned)(R->Low >> 32) != 0) + { + Byte temp = R->Cache; + do + { + IByteOut_Write(R->Stream, (Byte)(temp + (Byte)(R->Low >> 32))); + temp = 0xFF; + } + while (--R->CacheSize != 0); + R->Cache = (Byte)((UInt32)R->Low >> 24); + } + R->CacheSize++; + R->Low = (UInt32)((UInt32)R->Low << 8); +} + +#define RC_NORM_BASE(p) if (R->Range < kTopValue) { R->Range <<= 8; RangeEnc_ShiftLow(p); +#define RC_NORM_1(p) RC_NORM_BASE(p) } +#define RC_NORM(p) RC_NORM_BASE(p) RC_NORM_BASE(p) }} + +// we must use only one type of Normalization from two: LOCAL or REMOTE +#define RC_NORM_LOCAL(p) // RC_NORM(p) +#define RC_NORM_REMOTE(p) RC_NORM(p) + +/* +#define RangeEnc_Encode(p, start, _size_) \ + { UInt32 size = _size_; \ + R->Low += start * R->Range; \ + R->Range *= size; \ + RC_NORM_LOCAL(p); } +*/ + +MY_FORCE_INLINE +// MY_NO_INLINE +static void RangeEnc_Encode(CPpmd7 *p, UInt32 start, UInt32 size) +{ + R->Low += start * R->Range; + R->Range *= size; + RC_NORM_LOCAL(p); +} + +void Ppmd7z_Flush_RangeEnc(CPpmd7 *p) +{ + unsigned i; + for (i = 0; i < 5; i++) + RangeEnc_ShiftLow(p); +} + + + +#define RC_Encode(start, size) RangeEnc_Encode(p, start, size); +#define RC_EncodeFinal(start, size) RC_Encode(start, size); RC_NORM_REMOTE(p); + +#define CTX(ref) ((CPpmd7_Context *)Ppmd7_GetContext(p, ref)) +#define SUFFIX(ctx) CTX((ctx)->Suffix) +typedef CPpmd7_Context * CTX_PTR; +#define SUCCESSOR(p) Ppmd_GET_SUCCESSOR(p) + +void Ppmd7_UpdateModel(CPpmd7 *p); + +#define MASK(sym) ((unsigned char *)charMask)[sym] + +MY_FORCE_INLINE +static +void Ppmd7z_EncodeSymbol(CPpmd7 *p, int symbol) +{ + size_t charMask[256 / sizeof(size_t)]; + + if (p->MinContext->NumStats != 1) + { + CPpmd_State *s = Ppmd7_GetStats(p, p->MinContext); + UInt32 sum; + unsigned i; + + + + + R->Range /= p->MinContext->Union2.SummFreq; + + if (s->Symbol == symbol) + { + // R->Range /= p->MinContext->Union2.SummFreq; + RC_EncodeFinal(0, s->Freq); + p->FoundState = s; + Ppmd7_Update1_0(p); + return; + } + p->PrevSuccess = 0; + sum = s->Freq; + i = (unsigned)p->MinContext->NumStats - 1; + do + { + if ((++s)->Symbol == symbol) + { + // R->Range /= p->MinContext->Union2.SummFreq; + RC_EncodeFinal(sum, s->Freq); + p->FoundState = s; + Ppmd7_Update1(p); + return; + } + sum += s->Freq; + } + while (--i); + + // R->Range /= p->MinContext->Union2.SummFreq; + RC_Encode(sum, p->MinContext->Union2.SummFreq - sum); + + p->HiBitsFlag = PPMD7_HiBitsFlag_3(p->FoundState->Symbol); + PPMD_SetAllBitsIn256Bytes(charMask); + // MASK(s->Symbol) = 0; + // i = p->MinContext->NumStats - 1; + // do { MASK((--s)->Symbol) = 0; } while (--i); + { + CPpmd_State *s2 = Ppmd7_GetStats(p, p->MinContext); + MASK(s->Symbol) = 0; + do + { + unsigned sym0 = s2[0].Symbol; + unsigned sym1 = s2[1].Symbol; + s2 += 2; + MASK(sym0) = 0; + MASK(sym1) = 0; + } + while (s2 < s); + } + } + else + { + UInt16 *prob = Ppmd7_GetBinSumm(p); + CPpmd_State *s = Ppmd7Context_OneState(p->MinContext); + UInt32 pr = *prob; + UInt32 bound = (R->Range >> 14) * pr; + pr = PPMD_UPDATE_PROB_1(pr); + if (s->Symbol == symbol) + { + *prob = (UInt16)(pr + (1 << PPMD_INT_BITS)); + // RangeEnc_EncodeBit_0(p, bound); + R->Range = bound; + RC_NORM_1(p); + + // p->FoundState = s; + // Ppmd7_UpdateBin(p); + { + unsigned freq = s->Freq; + CTX_PTR c = CTX(SUCCESSOR(s)); + p->FoundState = s; + p->PrevSuccess = 1; + p->RunLength++; + s->Freq = (Byte)(freq + (freq < 128)); + // NextContext(p); + if (p->OrderFall == 0 && (const Byte *)c > p->Text) + p->MaxContext = p->MinContext = c; + else + Ppmd7_UpdateModel(p); + } + return; + } + + *prob = (UInt16)pr; + p->InitEsc = p->ExpEscape[pr >> 10]; + // RangeEnc_EncodeBit_1(p, bound); + R->Low += bound; + R->Range -= bound; + RC_NORM_LOCAL(p) + + PPMD_SetAllBitsIn256Bytes(charMask); + MASK(s->Symbol) = 0; + p->PrevSuccess = 0; + } + + for (;;) + { + CPpmd_See *see; + CPpmd_State *s; + UInt32 sum, escFreq; + CPpmd7_Context *mc; + unsigned i, numMasked; + + RC_NORM_REMOTE(p) + + mc = p->MinContext; + numMasked = mc->NumStats; + + do + { + p->OrderFall++; + if (!mc->Suffix) + return; /* EndMarker (symbol = -1) */ + mc = Ppmd7_GetContext(p, mc->Suffix); + i = mc->NumStats; + } + while (i == numMasked); + + p->MinContext = mc; + + // see = Ppmd7_MakeEscFreq(p, numMasked, &escFreq); + { + if (i != 256) + { + unsigned nonMasked = i - numMasked; + see = p->See[(unsigned)p->NS2Indx[(size_t)nonMasked - 1]] + + p->HiBitsFlag + + (nonMasked < (unsigned)SUFFIX(mc)->NumStats - i) + + 2 * (unsigned)(mc->Union2.SummFreq < 11 * i) + + 4 * (unsigned)(numMasked > nonMasked); + { + // if (see->Summ) field is larger than 16-bit, we need only low 16 bits of Summ + unsigned summ = (UInt16)see->Summ; // & 0xFFFF + unsigned r = (summ >> see->Shift); + see->Summ = (UInt16)(summ - r); + escFreq = r + (r == 0); + } + } + else + { + see = &p->DummySee; + escFreq = 1; + } + } + + s = Ppmd7_GetStats(p, mc); + sum = 0; + // i = mc->NumStats; + + do + { + unsigned cur = s->Symbol; + if ((int)cur == symbol) + { + UInt32 low = sum; + UInt32 freq = s->Freq; + unsigned num2; + + Ppmd_See_Update(see); + p->FoundState = s; + sum += escFreq; + + num2 = i / 2; + i &= 1; + sum += freq & (0 - (UInt32)i); + if (num2 != 0) + { + s += i; + for (;;) + { + unsigned sym0 = s[0].Symbol; + unsigned sym1 = s[1].Symbol; + s += 2; + sum += (s[-2].Freq & (unsigned)(MASK(sym0))); + sum += (s[-1].Freq & (unsigned)(MASK(sym1))); + if (--num2 == 0) + break; + } + } + + + R->Range /= sum; + RC_EncodeFinal(low, freq); + Ppmd7_Update2(p); + return; + } + sum += (s->Freq & (unsigned)(MASK(cur))); + s++; + } + while (--i); + + { + UInt32 total = sum + escFreq; + see->Summ = (UInt16)(see->Summ + total); + + R->Range /= total; + RC_Encode(sum, escFreq); + } + + { + CPpmd_State *s2 = Ppmd7_GetStats(p, p->MinContext); + s--; + MASK(s->Symbol) = 0; + do + { + unsigned sym0 = s2[0].Symbol; + unsigned sym1 = s2[1].Symbol; + s2 += 2; + MASK(sym0) = 0; + MASK(sym1) = 0; + } + while (s2 < s); + } + } +} + + +void Ppmd7z_EncodeSymbols(CPpmd7 *p, const Byte *buf, const Byte *lim) +{ + for (; buf < lim; buf++) + { + Ppmd7z_EncodeSymbol(p, *buf); + } +} diff --git a/deps/LZMA-SDK/C/Precomp.h b/deps/LZMA-SDK/C/Precomp.h index edb581443..e8ff8b40e 100644 --- a/deps/LZMA-SDK/C/Precomp.h +++ b/deps/LZMA-SDK/C/Precomp.h @@ -1,10 +1,10 @@ -/* Precomp.h -- StdAfx -2013-11-12 : Igor Pavlov : Public domain */ - -#ifndef __7Z_PRECOMP_H -#define __7Z_PRECOMP_H - -#include "Compiler.h" -/* #include "7zTypes.h" */ - -#endif +/* Precomp.h -- StdAfx +2013-11-12 : Igor Pavlov : Public domain */ + +#ifndef __7Z_PRECOMP_H +#define __7Z_PRECOMP_H + +#include "Compiler.h" +/* #include "7zTypes.h" */ + +#endif diff --git a/deps/LZMA-SDK/C/RotateDefs.h b/deps/LZMA-SDK/C/RotateDefs.h index 6c790e791..8f01d1a6c 100644 --- a/deps/LZMA-SDK/C/RotateDefs.h +++ b/deps/LZMA-SDK/C/RotateDefs.h @@ -1,30 +1,30 @@ -/* RotateDefs.h -- Rotate functions -2015-03-25 : Igor Pavlov : Public domain */ - -#ifndef __ROTATE_DEFS_H -#define __ROTATE_DEFS_H - -#ifdef _MSC_VER - -#include - -/* don't use _rotl with MINGW. It can insert slow call to function. */ - -/* #if (_MSC_VER >= 1200) */ -#pragma intrinsic(_rotl) -#pragma intrinsic(_rotr) -/* #endif */ - -#define rotlFixed(x, n) _rotl((x), (n)) -#define rotrFixed(x, n) _rotr((x), (n)) - -#else - -/* new compilers can translate these macros to fast commands. */ - -#define rotlFixed(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) -#define rotrFixed(x, n) (((x) >> (n)) | ((x) << (32 - (n)))) - -#endif - -#endif +/* RotateDefs.h -- Rotate functions +2015-03-25 : Igor Pavlov : Public domain */ + +#ifndef __ROTATE_DEFS_H +#define __ROTATE_DEFS_H + +#ifdef _MSC_VER + +#include + +/* don't use _rotl with MINGW. It can insert slow call to function. */ + +/* #if (_MSC_VER >= 1200) */ +#pragma intrinsic(_rotl) +#pragma intrinsic(_rotr) +/* #endif */ + +#define rotlFixed(x, n) _rotl((x), (n)) +#define rotrFixed(x, n) _rotr((x), (n)) + +#else + +/* new compilers can translate these macros to fast commands. */ + +#define rotlFixed(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) +#define rotrFixed(x, n) (((x) >> (n)) | ((x) << (32 - (n)))) + +#endif + +#endif diff --git a/deps/LZMA-SDK/C/Sha256.c b/deps/LZMA-SDK/C/Sha256.c index c03b75afe..8b3983ea7 100644 --- a/deps/LZMA-SDK/C/Sha256.c +++ b/deps/LZMA-SDK/C/Sha256.c @@ -1,486 +1,486 @@ -/* Sha256.c -- SHA-256 Hash -2021-04-01 : Igor Pavlov : Public domain -This code is based on public domain code from Wei Dai's Crypto++ library. */ - -#include "Precomp.h" - -#include - -#include "CpuArch.h" -#include "RotateDefs.h" -#include "Sha256.h" - -#if defined(_MSC_VER) && (_MSC_VER < 1900) -// #define USE_MY_MM -#endif - -#ifdef MY_CPU_X86_OR_AMD64 - #ifdef _MSC_VER - #if _MSC_VER >= 1200 - #define _SHA_SUPPORTED - #endif - #elif defined(__clang__) - #if (__clang_major__ >= 8) // fix that check - #define _SHA_SUPPORTED - #endif - #elif defined(__GNUC__) - #if (__GNUC__ >= 8) // fix that check - #define _SHA_SUPPORTED - #endif - #elif defined(__INTEL_COMPILER) - #if (__INTEL_COMPILER >= 1800) // fix that check - #define _SHA_SUPPORTED - #endif - #endif -#elif defined(MY_CPU_ARM_OR_ARM64) - #ifdef _MSC_VER - #if _MSC_VER >= 1910 - #define _SHA_SUPPORTED - #endif - #elif defined(__clang__) - #if (__clang_major__ >= 8) // fix that check - #define _SHA_SUPPORTED - #endif - #elif defined(__GNUC__) - #if (__GNUC__ >= 6) // fix that check - #define _SHA_SUPPORTED - #endif - #endif -#endif - -void MY_FAST_CALL Sha256_UpdateBlocks(UInt32 state[8], const Byte *data, size_t numBlocks); - -#ifdef _SHA_SUPPORTED - void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks); - - static SHA256_FUNC_UPDATE_BLOCKS g_FUNC_UPDATE_BLOCKS = Sha256_UpdateBlocks; - static SHA256_FUNC_UPDATE_BLOCKS g_FUNC_UPDATE_BLOCKS_HW; - - #define UPDATE_BLOCKS(p) p->func_UpdateBlocks -#else - #define UPDATE_BLOCKS(p) Sha256_UpdateBlocks -#endif - - -BoolInt Sha256_SetFunction(CSha256 *p, unsigned algo) -{ - SHA256_FUNC_UPDATE_BLOCKS func = Sha256_UpdateBlocks; - - #ifdef _SHA_SUPPORTED - if (algo != SHA256_ALGO_SW) - { - if (algo == SHA256_ALGO_DEFAULT) - func = g_FUNC_UPDATE_BLOCKS; - else - { - if (algo != SHA256_ALGO_HW) - return False; - func = g_FUNC_UPDATE_BLOCKS_HW; - if (!func) - return False; - } - } - #else - if (algo > 1) - return False; - #endif - - p->func_UpdateBlocks = func; - return True; -} - - -/* define it for speed optimization */ - -#ifdef _SFX - #define STEP_PRE 1 - #define STEP_MAIN 1 -#else - #define STEP_PRE 2 - #define STEP_MAIN 4 - // #define _SHA256_UNROLL -#endif - -#if STEP_MAIN != 16 - #define _SHA256_BIG_W -#endif - - - - -void Sha256_InitState(CSha256 *p) -{ - p->count = 0; - p->state[0] = 0x6a09e667; - p->state[1] = 0xbb67ae85; - p->state[2] = 0x3c6ef372; - p->state[3] = 0xa54ff53a; - p->state[4] = 0x510e527f; - p->state[5] = 0x9b05688c; - p->state[6] = 0x1f83d9ab; - p->state[7] = 0x5be0cd19; -} - -void Sha256_Init(CSha256 *p) -{ - p->func_UpdateBlocks = - #ifdef _SHA_SUPPORTED - g_FUNC_UPDATE_BLOCKS; - #else - NULL; - #endif - Sha256_InitState(p); -} - -#define S0(x) (rotrFixed(x, 2) ^ rotrFixed(x,13) ^ rotrFixed(x, 22)) -#define S1(x) (rotrFixed(x, 6) ^ rotrFixed(x,11) ^ rotrFixed(x, 25)) -#define s0(x) (rotrFixed(x, 7) ^ rotrFixed(x,18) ^ (x >> 3)) -#define s1(x) (rotrFixed(x,17) ^ rotrFixed(x,19) ^ (x >> 10)) - -#define Ch(x,y,z) (z^(x&(y^z))) -#define Maj(x,y,z) ((x&y)|(z&(x|y))) - - -#define W_PRE(i) (W[(i) + (size_t)(j)] = GetBe32(data + ((size_t)(j) + i) * 4)) - -#define blk2_main(j, i) s1(w(j, (i)-2)) + w(j, (i)-7) + s0(w(j, (i)-15)) - -#ifdef _SHA256_BIG_W - // we use +i instead of +(i) to change the order to solve CLANG compiler warning for signed/unsigned. - #define w(j, i) W[(size_t)(j) + i] - #define blk2(j, i) (w(j, i) = w(j, (i)-16) + blk2_main(j, i)) -#else - #if STEP_MAIN == 16 - #define w(j, i) W[(i) & 15] - #else - #define w(j, i) W[((size_t)(j) + (i)) & 15] - #endif - #define blk2(j, i) (w(j, i) += blk2_main(j, i)) -#endif - -#define W_MAIN(i) blk2(j, i) - - -#define T1(wx, i) \ - tmp = h + S1(e) + Ch(e,f,g) + K[(i)+(size_t)(j)] + wx(i); \ - h = g; \ - g = f; \ - f = e; \ - e = d + tmp; \ - tmp += S0(a) + Maj(a, b, c); \ - d = c; \ - c = b; \ - b = a; \ - a = tmp; \ - -#define R1_PRE(i) T1( W_PRE, i) -#define R1_MAIN(i) T1( W_MAIN, i) - -#if (!defined(_SHA256_UNROLL) || STEP_MAIN < 8) && (STEP_MAIN >= 4) -#define R2_MAIN(i) \ - R1_MAIN(i) \ - R1_MAIN(i + 1) \ - -#endif - - - -#if defined(_SHA256_UNROLL) && STEP_MAIN >= 8 - -#define T4( a,b,c,d,e,f,g,h, wx, i) \ - h += S1(e) + Ch(e,f,g) + K[(i)+(size_t)(j)] + wx(i); \ - tmp = h; \ - h += d; \ - d = tmp + S0(a) + Maj(a, b, c); \ - -#define R4( wx, i) \ - T4 ( a,b,c,d,e,f,g,h, wx, (i )); \ - T4 ( d,a,b,c,h,e,f,g, wx, (i+1)); \ - T4 ( c,d,a,b,g,h,e,f, wx, (i+2)); \ - T4 ( b,c,d,a,f,g,h,e, wx, (i+3)); \ - -#define R4_PRE(i) R4( W_PRE, i) -#define R4_MAIN(i) R4( W_MAIN, i) - - -#define T8( a,b,c,d,e,f,g,h, wx, i) \ - h += S1(e) + Ch(e,f,g) + K[(i)+(size_t)(j)] + wx(i); \ - d += h; \ - h += S0(a) + Maj(a, b, c); \ - -#define R8( wx, i) \ - T8 ( a,b,c,d,e,f,g,h, wx, i ); \ - T8 ( h,a,b,c,d,e,f,g, wx, i+1); \ - T8 ( g,h,a,b,c,d,e,f, wx, i+2); \ - T8 ( f,g,h,a,b,c,d,e, wx, i+3); \ - T8 ( e,f,g,h,a,b,c,d, wx, i+4); \ - T8 ( d,e,f,g,h,a,b,c, wx, i+5); \ - T8 ( c,d,e,f,g,h,a,b, wx, i+6); \ - T8 ( b,c,d,e,f,g,h,a, wx, i+7); \ - -#define R8_PRE(i) R8( W_PRE, i) -#define R8_MAIN(i) R8( W_MAIN, i) - -#endif - -void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks); - -// static -extern MY_ALIGN(64) -const UInt32 SHA256_K_ARRAY[64]; - -MY_ALIGN(64) -const UInt32 SHA256_K_ARRAY[64] = { - 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, - 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, - 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, - 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, - 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, - 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, - 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, - 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, - 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, - 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, - 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, - 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, - 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, - 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, - 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 -}; - -#define K SHA256_K_ARRAY - - -MY_NO_INLINE -void MY_FAST_CALL Sha256_UpdateBlocks(UInt32 state[8], const Byte *data, size_t numBlocks) -{ - UInt32 W - #ifdef _SHA256_BIG_W - [64]; - #else - [16]; - #endif - - unsigned j; - - UInt32 a,b,c,d,e,f,g,h; - - #if !defined(_SHA256_UNROLL) || (STEP_MAIN <= 4) || (STEP_PRE <= 4) - UInt32 tmp; - #endif - - a = state[0]; - b = state[1]; - c = state[2]; - d = state[3]; - e = state[4]; - f = state[5]; - g = state[6]; - h = state[7]; - - while (numBlocks) - { - - for (j = 0; j < 16; j += STEP_PRE) - { - #if STEP_PRE > 4 - - #if STEP_PRE < 8 - R4_PRE(0); - #else - R8_PRE(0); - #if STEP_PRE == 16 - R8_PRE(8); - #endif - #endif - - #else - - R1_PRE(0); - #if STEP_PRE >= 2 - R1_PRE(1); - #if STEP_PRE >= 4 - R1_PRE(2); - R1_PRE(3); - #endif - #endif - - #endif - } - - for (j = 16; j < 64; j += STEP_MAIN) - { - #if defined(_SHA256_UNROLL) && STEP_MAIN >= 8 - - #if STEP_MAIN < 8 - R4_MAIN(0); - #else - R8_MAIN(0); - #if STEP_MAIN == 16 - R8_MAIN(8); - #endif - #endif - - #else - - R1_MAIN(0); - #if STEP_MAIN >= 2 - R1_MAIN(1); - #if STEP_MAIN >= 4 - R2_MAIN(2); - #if STEP_MAIN >= 8 - R2_MAIN(4); - R2_MAIN(6); - #if STEP_MAIN >= 16 - R2_MAIN(8); - R2_MAIN(10); - R2_MAIN(12); - R2_MAIN(14); - #endif - #endif - #endif - #endif - #endif - } - - a += state[0]; state[0] = a; - b += state[1]; state[1] = b; - c += state[2]; state[2] = c; - d += state[3]; state[3] = d; - e += state[4]; state[4] = e; - f += state[5]; state[5] = f; - g += state[6]; state[6] = g; - h += state[7]; state[7] = h; - - data += 64; - numBlocks--; - } - - /* Wipe variables */ - /* memset(W, 0, sizeof(W)); */ -} - -#undef S0 -#undef S1 -#undef s0 -#undef s1 -#undef K - -#define Sha256_UpdateBlock(p) UPDATE_BLOCKS(p)(p->state, p->buffer, 1) - -void Sha256_Update(CSha256 *p, const Byte *data, size_t size) -{ - if (size == 0) - return; - - { - unsigned pos = (unsigned)p->count & 0x3F; - unsigned num; - - p->count += size; - - num = 64 - pos; - if (num > size) - { - memcpy(p->buffer + pos, data, size); - return; - } - - if (pos != 0) - { - size -= num; - memcpy(p->buffer + pos, data, num); - data += num; - Sha256_UpdateBlock(p); - } - } - { - size_t numBlocks = size >> 6; - UPDATE_BLOCKS(p)(p->state, data, numBlocks); - size &= 0x3F; - if (size == 0) - return; - data += (numBlocks << 6); - memcpy(p->buffer, data, size); - } -} - - -void Sha256_Final(CSha256 *p, Byte *digest) -{ - unsigned pos = (unsigned)p->count & 0x3F; - unsigned i; - - p->buffer[pos++] = 0x80; - - if (pos > (64 - 8)) - { - while (pos != 64) { p->buffer[pos++] = 0; } - // memset(&p->buf.buffer[pos], 0, 64 - pos); - Sha256_UpdateBlock(p); - pos = 0; - } - - /* - if (pos & 3) - { - p->buffer[pos] = 0; - p->buffer[pos + 1] = 0; - p->buffer[pos + 2] = 0; - pos += 3; - pos &= ~3; - } - { - for (; pos < 64 - 8; pos += 4) - *(UInt32 *)(&p->buffer[pos]) = 0; - } - */ - - memset(&p->buffer[pos], 0, (64 - 8) - pos); - - { - UInt64 numBits = (p->count << 3); - SetBe32(p->buffer + 64 - 8, (UInt32)(numBits >> 32)); - SetBe32(p->buffer + 64 - 4, (UInt32)(numBits)); - } - - Sha256_UpdateBlock(p); - - for (i = 0; i < 8; i += 2) - { - UInt32 v0 = p->state[i]; - UInt32 v1 = p->state[(size_t)i + 1]; - SetBe32(digest , v0); - SetBe32(digest + 4, v1); - digest += 8; - } - - Sha256_InitState(p); -} - - -void Sha256Prepare() -{ - #ifdef _SHA_SUPPORTED - SHA256_FUNC_UPDATE_BLOCKS f, f_hw; - f = Sha256_UpdateBlocks; - f_hw = NULL; - #ifdef MY_CPU_X86_OR_AMD64 - #ifndef USE_MY_MM - if (CPU_IsSupported_SHA() - && CPU_IsSupported_SSSE3() - // && CPU_IsSupported_SSE41() - ) - #endif - #else - if (CPU_IsSupported_SHA2()) - #endif - { - // printf("\n========== HW SHA256 ======== \n"); - f = f_hw = Sha256_UpdateBlocks_HW; - } - g_FUNC_UPDATE_BLOCKS = f; - g_FUNC_UPDATE_BLOCKS_HW = f_hw; - #endif -} +/* Sha256.c -- SHA-256 Hash +2021-04-01 : Igor Pavlov : Public domain +This code is based on public domain code from Wei Dai's Crypto++ library. */ + +#include "Precomp.h" + +#include + +#include "CpuArch.h" +#include "RotateDefs.h" +#include "Sha256.h" + +#if defined(_MSC_VER) && (_MSC_VER < 1900) +// #define USE_MY_MM +#endif + +#ifdef MY_CPU_X86_OR_AMD64 + #ifdef _MSC_VER + #if _MSC_VER >= 1200 + #define _SHA_SUPPORTED + #endif + #elif defined(__clang__) + #if (__clang_major__ >= 8) // fix that check + #define _SHA_SUPPORTED + #endif + #elif defined(__GNUC__) + #if (__GNUC__ >= 8) // fix that check + #define _SHA_SUPPORTED + #endif + #elif defined(__INTEL_COMPILER) + #if (__INTEL_COMPILER >= 1800) // fix that check + #define _SHA_SUPPORTED + #endif + #endif +#elif defined(MY_CPU_ARM_OR_ARM64) + #ifdef _MSC_VER + #if _MSC_VER >= 1910 + #define _SHA_SUPPORTED + #endif + #elif defined(__clang__) + #if (__clang_major__ >= 8) // fix that check + #define _SHA_SUPPORTED + #endif + #elif defined(__GNUC__) + #if (__GNUC__ >= 6) // fix that check + #define _SHA_SUPPORTED + #endif + #endif +#endif + +void MY_FAST_CALL Sha256_UpdateBlocks(UInt32 state[8], const Byte *data, size_t numBlocks); + +#ifdef _SHA_SUPPORTED + void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks); + + static SHA256_FUNC_UPDATE_BLOCKS g_FUNC_UPDATE_BLOCKS = Sha256_UpdateBlocks; + static SHA256_FUNC_UPDATE_BLOCKS g_FUNC_UPDATE_BLOCKS_HW; + + #define UPDATE_BLOCKS(p) p->func_UpdateBlocks +#else + #define UPDATE_BLOCKS(p) Sha256_UpdateBlocks +#endif + + +BoolInt Sha256_SetFunction(CSha256 *p, unsigned algo) +{ + SHA256_FUNC_UPDATE_BLOCKS func = Sha256_UpdateBlocks; + + #ifdef _SHA_SUPPORTED + if (algo != SHA256_ALGO_SW) + { + if (algo == SHA256_ALGO_DEFAULT) + func = g_FUNC_UPDATE_BLOCKS; + else + { + if (algo != SHA256_ALGO_HW) + return False; + func = g_FUNC_UPDATE_BLOCKS_HW; + if (!func) + return False; + } + } + #else + if (algo > 1) + return False; + #endif + + p->func_UpdateBlocks = func; + return True; +} + + +/* define it for speed optimization */ + +#ifdef _SFX + #define STEP_PRE 1 + #define STEP_MAIN 1 +#else + #define STEP_PRE 2 + #define STEP_MAIN 4 + // #define _SHA256_UNROLL +#endif + +#if STEP_MAIN != 16 + #define _SHA256_BIG_W +#endif + + + + +void Sha256_InitState(CSha256 *p) +{ + p->count = 0; + p->state[0] = 0x6a09e667; + p->state[1] = 0xbb67ae85; + p->state[2] = 0x3c6ef372; + p->state[3] = 0xa54ff53a; + p->state[4] = 0x510e527f; + p->state[5] = 0x9b05688c; + p->state[6] = 0x1f83d9ab; + p->state[7] = 0x5be0cd19; +} + +void Sha256_Init(CSha256 *p) +{ + p->func_UpdateBlocks = + #ifdef _SHA_SUPPORTED + g_FUNC_UPDATE_BLOCKS; + #else + NULL; + #endif + Sha256_InitState(p); +} + +#define S0(x) (rotrFixed(x, 2) ^ rotrFixed(x,13) ^ rotrFixed(x, 22)) +#define S1(x) (rotrFixed(x, 6) ^ rotrFixed(x,11) ^ rotrFixed(x, 25)) +#define s0(x) (rotrFixed(x, 7) ^ rotrFixed(x,18) ^ (x >> 3)) +#define s1(x) (rotrFixed(x,17) ^ rotrFixed(x,19) ^ (x >> 10)) + +#define Ch(x,y,z) (z^(x&(y^z))) +#define Maj(x,y,z) ((x&y)|(z&(x|y))) + + +#define W_PRE(i) (W[(i) + (size_t)(j)] = GetBe32(data + ((size_t)(j) + i) * 4)) + +#define blk2_main(j, i) s1(w(j, (i)-2)) + w(j, (i)-7) + s0(w(j, (i)-15)) + +#ifdef _SHA256_BIG_W + // we use +i instead of +(i) to change the order to solve CLANG compiler warning for signed/unsigned. + #define w(j, i) W[(size_t)(j) + i] + #define blk2(j, i) (w(j, i) = w(j, (i)-16) + blk2_main(j, i)) +#else + #if STEP_MAIN == 16 + #define w(j, i) W[(i) & 15] + #else + #define w(j, i) W[((size_t)(j) + (i)) & 15] + #endif + #define blk2(j, i) (w(j, i) += blk2_main(j, i)) +#endif + +#define W_MAIN(i) blk2(j, i) + + +#define T1(wx, i) \ + tmp = h + S1(e) + Ch(e,f,g) + K[(i)+(size_t)(j)] + wx(i); \ + h = g; \ + g = f; \ + f = e; \ + e = d + tmp; \ + tmp += S0(a) + Maj(a, b, c); \ + d = c; \ + c = b; \ + b = a; \ + a = tmp; \ + +#define R1_PRE(i) T1( W_PRE, i) +#define R1_MAIN(i) T1( W_MAIN, i) + +#if (!defined(_SHA256_UNROLL) || STEP_MAIN < 8) && (STEP_MAIN >= 4) +#define R2_MAIN(i) \ + R1_MAIN(i) \ + R1_MAIN(i + 1) \ + +#endif + + + +#if defined(_SHA256_UNROLL) && STEP_MAIN >= 8 + +#define T4( a,b,c,d,e,f,g,h, wx, i) \ + h += S1(e) + Ch(e,f,g) + K[(i)+(size_t)(j)] + wx(i); \ + tmp = h; \ + h += d; \ + d = tmp + S0(a) + Maj(a, b, c); \ + +#define R4( wx, i) \ + T4 ( a,b,c,d,e,f,g,h, wx, (i )); \ + T4 ( d,a,b,c,h,e,f,g, wx, (i+1)); \ + T4 ( c,d,a,b,g,h,e,f, wx, (i+2)); \ + T4 ( b,c,d,a,f,g,h,e, wx, (i+3)); \ + +#define R4_PRE(i) R4( W_PRE, i) +#define R4_MAIN(i) R4( W_MAIN, i) + + +#define T8( a,b,c,d,e,f,g,h, wx, i) \ + h += S1(e) + Ch(e,f,g) + K[(i)+(size_t)(j)] + wx(i); \ + d += h; \ + h += S0(a) + Maj(a, b, c); \ + +#define R8( wx, i) \ + T8 ( a,b,c,d,e,f,g,h, wx, i ); \ + T8 ( h,a,b,c,d,e,f,g, wx, i+1); \ + T8 ( g,h,a,b,c,d,e,f, wx, i+2); \ + T8 ( f,g,h,a,b,c,d,e, wx, i+3); \ + T8 ( e,f,g,h,a,b,c,d, wx, i+4); \ + T8 ( d,e,f,g,h,a,b,c, wx, i+5); \ + T8 ( c,d,e,f,g,h,a,b, wx, i+6); \ + T8 ( b,c,d,e,f,g,h,a, wx, i+7); \ + +#define R8_PRE(i) R8( W_PRE, i) +#define R8_MAIN(i) R8( W_MAIN, i) + +#endif + +void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks); + +// static +extern MY_ALIGN(64) +const UInt32 SHA256_K_ARRAY[64]; + +MY_ALIGN(64) +const UInt32 SHA256_K_ARRAY[64] = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +}; + +#define K SHA256_K_ARRAY + + +MY_NO_INLINE +void MY_FAST_CALL Sha256_UpdateBlocks(UInt32 state[8], const Byte *data, size_t numBlocks) +{ + UInt32 W + #ifdef _SHA256_BIG_W + [64]; + #else + [16]; + #endif + + unsigned j; + + UInt32 a,b,c,d,e,f,g,h; + + #if !defined(_SHA256_UNROLL) || (STEP_MAIN <= 4) || (STEP_PRE <= 4) + UInt32 tmp; + #endif + + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + f = state[5]; + g = state[6]; + h = state[7]; + + while (numBlocks) + { + + for (j = 0; j < 16; j += STEP_PRE) + { + #if STEP_PRE > 4 + + #if STEP_PRE < 8 + R4_PRE(0); + #else + R8_PRE(0); + #if STEP_PRE == 16 + R8_PRE(8); + #endif + #endif + + #else + + R1_PRE(0); + #if STEP_PRE >= 2 + R1_PRE(1); + #if STEP_PRE >= 4 + R1_PRE(2); + R1_PRE(3); + #endif + #endif + + #endif + } + + for (j = 16; j < 64; j += STEP_MAIN) + { + #if defined(_SHA256_UNROLL) && STEP_MAIN >= 8 + + #if STEP_MAIN < 8 + R4_MAIN(0); + #else + R8_MAIN(0); + #if STEP_MAIN == 16 + R8_MAIN(8); + #endif + #endif + + #else + + R1_MAIN(0); + #if STEP_MAIN >= 2 + R1_MAIN(1); + #if STEP_MAIN >= 4 + R2_MAIN(2); + #if STEP_MAIN >= 8 + R2_MAIN(4); + R2_MAIN(6); + #if STEP_MAIN >= 16 + R2_MAIN(8); + R2_MAIN(10); + R2_MAIN(12); + R2_MAIN(14); + #endif + #endif + #endif + #endif + #endif + } + + a += state[0]; state[0] = a; + b += state[1]; state[1] = b; + c += state[2]; state[2] = c; + d += state[3]; state[3] = d; + e += state[4]; state[4] = e; + f += state[5]; state[5] = f; + g += state[6]; state[6] = g; + h += state[7]; state[7] = h; + + data += 64; + numBlocks--; + } + + /* Wipe variables */ + /* memset(W, 0, sizeof(W)); */ +} + +#undef S0 +#undef S1 +#undef s0 +#undef s1 +#undef K + +#define Sha256_UpdateBlock(p) UPDATE_BLOCKS(p)(p->state, p->buffer, 1) + +void Sha256_Update(CSha256 *p, const Byte *data, size_t size) +{ + if (size == 0) + return; + + { + unsigned pos = (unsigned)p->count & 0x3F; + unsigned num; + + p->count += size; + + num = 64 - pos; + if (num > size) + { + memcpy(p->buffer + pos, data, size); + return; + } + + if (pos != 0) + { + size -= num; + memcpy(p->buffer + pos, data, num); + data += num; + Sha256_UpdateBlock(p); + } + } + { + size_t numBlocks = size >> 6; + UPDATE_BLOCKS(p)(p->state, data, numBlocks); + size &= 0x3F; + if (size == 0) + return; + data += (numBlocks << 6); + memcpy(p->buffer, data, size); + } +} + + +void Sha256_Final(CSha256 *p, Byte *digest) +{ + unsigned pos = (unsigned)p->count & 0x3F; + unsigned i; + + p->buffer[pos++] = 0x80; + + if (pos > (64 - 8)) + { + while (pos != 64) { p->buffer[pos++] = 0; } + // memset(&p->buf.buffer[pos], 0, 64 - pos); + Sha256_UpdateBlock(p); + pos = 0; + } + + /* + if (pos & 3) + { + p->buffer[pos] = 0; + p->buffer[pos + 1] = 0; + p->buffer[pos + 2] = 0; + pos += 3; + pos &= ~3; + } + { + for (; pos < 64 - 8; pos += 4) + *(UInt32 *)(&p->buffer[pos]) = 0; + } + */ + + memset(&p->buffer[pos], 0, (64 - 8) - pos); + + { + UInt64 numBits = (p->count << 3); + SetBe32(p->buffer + 64 - 8, (UInt32)(numBits >> 32)); + SetBe32(p->buffer + 64 - 4, (UInt32)(numBits)); + } + + Sha256_UpdateBlock(p); + + for (i = 0; i < 8; i += 2) + { + UInt32 v0 = p->state[i]; + UInt32 v1 = p->state[(size_t)i + 1]; + SetBe32(digest , v0); + SetBe32(digest + 4, v1); + digest += 8; + } + + Sha256_InitState(p); +} + + +void Sha256Prepare() +{ + #ifdef _SHA_SUPPORTED + SHA256_FUNC_UPDATE_BLOCKS f, f_hw; + f = Sha256_UpdateBlocks; + f_hw = NULL; + #ifdef MY_CPU_X86_OR_AMD64 + #ifndef USE_MY_MM + if (CPU_IsSupported_SHA() + && CPU_IsSupported_SSSE3() + // && CPU_IsSupported_SSE41() + ) + #endif + #else + if (CPU_IsSupported_SHA2()) + #endif + { + // printf("\n========== HW SHA256 ======== \n"); + f = f_hw = Sha256_UpdateBlocks_HW; + } + g_FUNC_UPDATE_BLOCKS = f; + g_FUNC_UPDATE_BLOCKS_HW = f_hw; + #endif +} diff --git a/deps/LZMA-SDK/C/Sha256.h b/deps/LZMA-SDK/C/Sha256.h index f52933986..aa38501e5 100644 --- a/deps/LZMA-SDK/C/Sha256.h +++ b/deps/LZMA-SDK/C/Sha256.h @@ -1,76 +1,76 @@ -/* Sha256.h -- SHA-256 Hash -2021-01-01 : Igor Pavlov : Public domain */ - -#ifndef __7Z_SHA256_H -#define __7Z_SHA256_H - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -#define SHA256_NUM_BLOCK_WORDS 16 -#define SHA256_NUM_DIGEST_WORDS 8 - -#define SHA256_BLOCK_SIZE (SHA256_NUM_BLOCK_WORDS * 4) -#define SHA256_DIGEST_SIZE (SHA256_NUM_DIGEST_WORDS * 4) - -typedef void (MY_FAST_CALL *SHA256_FUNC_UPDATE_BLOCKS)(UInt32 state[8], const Byte *data, size_t numBlocks); - -/* - if (the system supports different SHA256 code implementations) - { - (CSha256::func_UpdateBlocks) will be used - (CSha256::func_UpdateBlocks) can be set by - Sha256_Init() - to default (fastest) - Sha256_SetFunction() - to any algo - } - else - { - (CSha256::func_UpdateBlocks) is ignored. - } -*/ - -typedef struct -{ - SHA256_FUNC_UPDATE_BLOCKS func_UpdateBlocks; - UInt64 count; - UInt64 __pad_2[2]; - UInt32 state[SHA256_NUM_DIGEST_WORDS]; - - Byte buffer[SHA256_BLOCK_SIZE]; -} CSha256; - - -#define SHA256_ALGO_DEFAULT 0 -#define SHA256_ALGO_SW 1 -#define SHA256_ALGO_HW 2 - -/* -Sha256_SetFunction() -return: - 0 - (algo) value is not supported, and func_UpdateBlocks was not changed - 1 - func_UpdateBlocks was set according (algo) value. -*/ - -BoolInt Sha256_SetFunction(CSha256 *p, unsigned algo); - -void Sha256_InitState(CSha256 *p); -void Sha256_Init(CSha256 *p); -void Sha256_Update(CSha256 *p, const Byte *data, size_t size); -void Sha256_Final(CSha256 *p, Byte *digest); - - - - -// void MY_FAST_CALL Sha256_UpdateBlocks(UInt32 state[8], const Byte *data, size_t numBlocks); - -/* -call Sha256Prepare() once at program start. -It prepares all supported implementations, and detects the fastest implementation. -*/ - -void Sha256Prepare(void); - -EXTERN_C_END - -#endif +/* Sha256.h -- SHA-256 Hash +2021-01-01 : Igor Pavlov : Public domain */ + +#ifndef __7Z_SHA256_H +#define __7Z_SHA256_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +#define SHA256_NUM_BLOCK_WORDS 16 +#define SHA256_NUM_DIGEST_WORDS 8 + +#define SHA256_BLOCK_SIZE (SHA256_NUM_BLOCK_WORDS * 4) +#define SHA256_DIGEST_SIZE (SHA256_NUM_DIGEST_WORDS * 4) + +typedef void (MY_FAST_CALL *SHA256_FUNC_UPDATE_BLOCKS)(UInt32 state[8], const Byte *data, size_t numBlocks); + +/* + if (the system supports different SHA256 code implementations) + { + (CSha256::func_UpdateBlocks) will be used + (CSha256::func_UpdateBlocks) can be set by + Sha256_Init() - to default (fastest) + Sha256_SetFunction() - to any algo + } + else + { + (CSha256::func_UpdateBlocks) is ignored. + } +*/ + +typedef struct +{ + SHA256_FUNC_UPDATE_BLOCKS func_UpdateBlocks; + UInt64 count; + UInt64 __pad_2[2]; + UInt32 state[SHA256_NUM_DIGEST_WORDS]; + + Byte buffer[SHA256_BLOCK_SIZE]; +} CSha256; + + +#define SHA256_ALGO_DEFAULT 0 +#define SHA256_ALGO_SW 1 +#define SHA256_ALGO_HW 2 + +/* +Sha256_SetFunction() +return: + 0 - (algo) value is not supported, and func_UpdateBlocks was not changed + 1 - func_UpdateBlocks was set according (algo) value. +*/ + +BoolInt Sha256_SetFunction(CSha256 *p, unsigned algo); + +void Sha256_InitState(CSha256 *p); +void Sha256_Init(CSha256 *p); +void Sha256_Update(CSha256 *p, const Byte *data, size_t size); +void Sha256_Final(CSha256 *p, Byte *digest); + + + + +// void MY_FAST_CALL Sha256_UpdateBlocks(UInt32 state[8], const Byte *data, size_t numBlocks); + +/* +call Sha256Prepare() once at program start. +It prepares all supported implementations, and detects the fastest implementation. +*/ + +void Sha256Prepare(void); + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/Sha256Opt.c b/deps/LZMA-SDK/C/Sha256Opt.c index cc8c53e1b..decc1382c 100644 --- a/deps/LZMA-SDK/C/Sha256Opt.c +++ b/deps/LZMA-SDK/C/Sha256Opt.c @@ -1,373 +1,373 @@ -/* Sha256Opt.c -- SHA-256 optimized code for SHA-256 hardware instructions -2021-04-01 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#if defined(_MSC_VER) -#if (_MSC_VER < 1900) && (_MSC_VER >= 1200) -// #define USE_MY_MM -#endif -#endif - -#include "CpuArch.h" - -#ifdef MY_CPU_X86_OR_AMD64 - #if defined(__clang__) - #if (__clang_major__ >= 8) // fix that check - #define USE_HW_SHA - #ifndef __SHA__ - #define ATTRIB_SHA __attribute__((__target__("sha,ssse3"))) - #if defined(_MSC_VER) - // SSSE3: for clang-cl: - #include - #define __SHA__ - #endif - #endif - - #endif - #elif defined(__GNUC__) - #if (__GNUC__ >= 8) // fix that check - #define USE_HW_SHA - #ifndef __SHA__ - #define ATTRIB_SHA __attribute__((__target__("sha,ssse3"))) - // #pragma GCC target("sha,ssse3") - #endif - #endif - #elif defined(__INTEL_COMPILER) - #if (__INTEL_COMPILER >= 1800) // fix that check - #define USE_HW_SHA - #endif - #elif defined(_MSC_VER) - #ifdef USE_MY_MM - #define USE_VER_MIN 1300 - #else - #define USE_VER_MIN 1910 - #endif - #if _MSC_VER >= USE_VER_MIN - #define USE_HW_SHA - #endif - #endif -// #endif // MY_CPU_X86_OR_AMD64 - -#ifdef USE_HW_SHA - -// #pragma message("Sha256 HW") -// #include - -#if !defined(_MSC_VER) || (_MSC_VER >= 1900) -#include -#else -#include - -#if defined(_MSC_VER) && (_MSC_VER >= 1600) -// #include -#endif - -#ifdef USE_MY_MM -#include "My_mm.h" -#endif - -#endif - -/* -SHA256 uses: -SSE2: - _mm_loadu_si128 - _mm_storeu_si128 - _mm_set_epi32 - _mm_add_epi32 - _mm_shuffle_epi32 / pshufd - - - -SSSE3: - _mm_shuffle_epi8 / pshufb - _mm_alignr_epi8 -SHA: - _mm_sha256* -*/ - -// K array must be aligned for 16-bytes at least. -// The compiler can look align attribute and selects -// movdqu - for code without align attribute -// movdqa - for code with align attribute -extern -MY_ALIGN(64) -const UInt32 SHA256_K_ARRAY[64]; - -#define K SHA256_K_ARRAY - - -#define ADD_EPI32(dest, src) dest = _mm_add_epi32(dest, src); -#define SHA256_MSG1(dest, src) dest = _mm_sha256msg1_epu32(dest, src); -#define SHA25G_MSG2(dest, src) dest = _mm_sha256msg2_epu32(dest, src); - - -#define LOAD_SHUFFLE(m, k) \ - m = _mm_loadu_si128((const __m128i *)(const void *)(data + (k) * 16)); \ - m = _mm_shuffle_epi8(m, mask); \ - -#define SM1(g0, g1, g2, g3) \ - SHA256_MSG1(g3, g0); \ - -#define SM2(g0, g1, g2, g3) \ - tmp = _mm_alignr_epi8(g1, g0, 4); \ - ADD_EPI32(g2, tmp); \ - SHA25G_MSG2(g2, g1); \ - -// #define LS0(k, g0, g1, g2, g3) LOAD_SHUFFLE(g0, k) -// #define LS1(k, g0, g1, g2, g3) LOAD_SHUFFLE(g1, k+1) - - -#define NNN(g0, g1, g2, g3) - - -#define RND2(t0, t1) \ - t0 = _mm_sha256rnds2_epu32(t0, t1, msg); - -#define RND2_0(m, k) \ - msg = _mm_add_epi32(m, *(const __m128i *) (const void *) &K[(k) * 4]); \ - RND2(state0, state1); \ - msg = _mm_shuffle_epi32(msg, 0x0E); \ - - -#define RND2_1 \ - RND2(state1, state0); \ - - -// We use scheme with 3 rounds ahead for SHA256_MSG1 / 2 rounds ahead for SHA256_MSG2 - -#define R4(k, g0, g1, g2, g3, OP0, OP1) \ - RND2_0(g0, k); \ - OP0(g0, g1, g2, g3); \ - RND2_1; \ - OP1(g0, g1, g2, g3); \ - -#define R16(k, OP0, OP1, OP2, OP3, OP4, OP5, OP6, OP7) \ - R4 ( (k)*4+0, m0, m1, m2, m3, OP0, OP1 ) \ - R4 ( (k)*4+1, m1, m2, m3, m0, OP2, OP3 ) \ - R4 ( (k)*4+2, m2, m3, m0, m1, OP4, OP5 ) \ - R4 ( (k)*4+3, m3, m0, m1, m2, OP6, OP7 ) \ - -#define PREPARE_STATE \ - tmp = _mm_shuffle_epi32(state0, 0x1B); /* abcd */ \ - state0 = _mm_shuffle_epi32(state1, 0x1B); /* efgh */ \ - state1 = state0; \ - state0 = _mm_unpacklo_epi64(state0, tmp); /* cdgh */ \ - state1 = _mm_unpackhi_epi64(state1, tmp); /* abef */ \ - - -void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks); -#ifdef ATTRIB_SHA -ATTRIB_SHA -#endif -void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks) -{ - const __m128i mask = _mm_set_epi32(0x0c0d0e0f, 0x08090a0b, 0x04050607, 0x00010203); - __m128i tmp; - __m128i state0, state1; - - if (numBlocks == 0) - return; - - state0 = _mm_loadu_si128((const __m128i *) (const void *) &state[0]); - state1 = _mm_loadu_si128((const __m128i *) (const void *) &state[4]); - - PREPARE_STATE - - do - { - __m128i state0_save, state1_save; - __m128i m0, m1, m2, m3; - __m128i msg; - // #define msg tmp - - state0_save = state0; - state1_save = state1; - - LOAD_SHUFFLE (m0, 0) - LOAD_SHUFFLE (m1, 1) - LOAD_SHUFFLE (m2, 2) - LOAD_SHUFFLE (m3, 3) - - - - R16 ( 0, NNN, NNN, SM1, NNN, SM1, SM2, SM1, SM2 ); - R16 ( 1, SM1, SM2, SM1, SM2, SM1, SM2, SM1, SM2 ); - R16 ( 2, SM1, SM2, SM1, SM2, SM1, SM2, SM1, SM2 ); - R16 ( 3, SM1, SM2, NNN, SM2, NNN, NNN, NNN, NNN ); - - ADD_EPI32(state0, state0_save); - ADD_EPI32(state1, state1_save); - - data += 64; - } - while (--numBlocks); - - PREPARE_STATE - - _mm_storeu_si128((__m128i *) (void *) &state[0], state0); - _mm_storeu_si128((__m128i *) (void *) &state[4], state1); -} - -#endif // USE_HW_SHA - -#elif defined(MY_CPU_ARM_OR_ARM64) - - #if defined(__clang__) - #if (__clang_major__ >= 8) // fix that check - #define USE_HW_SHA - #endif - #elif defined(__GNUC__) - #if (__GNUC__ >= 6) // fix that check - #define USE_HW_SHA - #endif - #elif defined(_MSC_VER) - #if _MSC_VER >= 1910 - #define USE_HW_SHA - #endif - #endif - -#ifdef USE_HW_SHA - -// #pragma message("=== Sha256 HW === ") - -#if defined(__clang__) || defined(__GNUC__) - #ifdef MY_CPU_ARM64 - #define ATTRIB_SHA __attribute__((__target__("+crypto"))) - #else - #define ATTRIB_SHA __attribute__((__target__("fpu=crypto-neon-fp-armv8"))) - #endif -#else - // _MSC_VER - // for arm32 - #define _ARM_USE_NEW_NEON_INTRINSICS -#endif - -#if defined(_MSC_VER) && defined(MY_CPU_ARM64) -#include -#else -#include -#endif - -typedef uint32x4_t v128; -// typedef __n128 v128; // MSVC - -#ifdef MY_CPU_BE - #define MY_rev32_for_LE(x) -#else - #define MY_rev32_for_LE(x) x = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(x))) -#endif - -#define LOAD_128(_p) (*(const v128 *)(const void *)(_p)) -#define STORE_128(_p, _v) *(v128 *)(void *)(_p) = (_v) - -#define LOAD_SHUFFLE(m, k) \ - m = LOAD_128((data + (k) * 16)); \ - MY_rev32_for_LE(m); \ - -// K array must be aligned for 16-bytes at least. -extern -MY_ALIGN(64) -const UInt32 SHA256_K_ARRAY[64]; - -#define K SHA256_K_ARRAY - - -#define SHA256_SU0(dest, src) dest = vsha256su0q_u32(dest, src); -#define SHA25G_SU1(dest, src2, src3) dest = vsha256su1q_u32(dest, src2, src3); - -#define SM1(g0, g1, g2, g3) SHA256_SU0(g3, g0) -#define SM2(g0, g1, g2, g3) SHA25G_SU1(g2, g0, g1) -#define NNN(g0, g1, g2, g3) - - -#define R4(k, g0, g1, g2, g3, OP0, OP1) \ - msg = vaddq_u32(g0, *(const v128 *) (const void *) &K[(k) * 4]); \ - tmp = state0; \ - state0 = vsha256hq_u32( state0, state1, msg ); \ - state1 = vsha256h2q_u32( state1, tmp, msg ); \ - OP0(g0, g1, g2, g3); \ - OP1(g0, g1, g2, g3); \ - - -#define R16(k, OP0, OP1, OP2, OP3, OP4, OP5, OP6, OP7) \ - R4 ( (k)*4+0, m0, m1, m2, m3, OP0, OP1 ) \ - R4 ( (k)*4+1, m1, m2, m3, m0, OP2, OP3 ) \ - R4 ( (k)*4+2, m2, m3, m0, m1, OP4, OP5 ) \ - R4 ( (k)*4+3, m3, m0, m1, m2, OP6, OP7 ) \ - - -void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks); -#ifdef ATTRIB_SHA -ATTRIB_SHA -#endif -void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks) -{ - v128 state0, state1; - - if (numBlocks == 0) - return; - - state0 = LOAD_128(&state[0]); - state1 = LOAD_128(&state[4]); - - do - { - v128 state0_save, state1_save; - v128 m0, m1, m2, m3; - v128 msg, tmp; - - state0_save = state0; - state1_save = state1; - - LOAD_SHUFFLE (m0, 0) - LOAD_SHUFFLE (m1, 1) - LOAD_SHUFFLE (m2, 2) - LOAD_SHUFFLE (m3, 3) - - R16 ( 0, NNN, NNN, SM1, NNN, SM1, SM2, SM1, SM2 ); - R16 ( 1, SM1, SM2, SM1, SM2, SM1, SM2, SM1, SM2 ); - R16 ( 2, SM1, SM2, SM1, SM2, SM1, SM2, SM1, SM2 ); - R16 ( 3, SM1, SM2, NNN, SM2, NNN, NNN, NNN, NNN ); - - state0 = vaddq_u32(state0, state0_save); - state1 = vaddq_u32(state1, state1_save); - - data += 64; - } - while (--numBlocks); - - STORE_128(&state[0], state0); - STORE_128(&state[4], state1); -} - -#endif // USE_HW_SHA - -#endif // MY_CPU_ARM_OR_ARM64 - - -#ifndef USE_HW_SHA - -// #error Stop_Compiling_UNSUPPORTED_SHA -// #include - -// #include "Sha256.h" -void MY_FAST_CALL Sha256_UpdateBlocks(UInt32 state[8], const Byte *data, size_t numBlocks); - -#pragma message("Sha256 HW-SW stub was used") - -void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks); -void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks) -{ - Sha256_UpdateBlocks(state, data, numBlocks); - /* - UNUSED_VAR(state); - UNUSED_VAR(data); - UNUSED_VAR(numBlocks); - exit(1); - return; - */ -} - -#endif +/* Sha256Opt.c -- SHA-256 optimized code for SHA-256 hardware instructions +2021-04-01 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#if defined(_MSC_VER) +#if (_MSC_VER < 1900) && (_MSC_VER >= 1200) +// #define USE_MY_MM +#endif +#endif + +#include "CpuArch.h" + +#ifdef MY_CPU_X86_OR_AMD64 + #if defined(__clang__) + #if (__clang_major__ >= 8) // fix that check + #define USE_HW_SHA + #ifndef __SHA__ + #define ATTRIB_SHA __attribute__((__target__("sha,ssse3"))) + #if defined(_MSC_VER) + // SSSE3: for clang-cl: + #include + #define __SHA__ + #endif + #endif + + #endif + #elif defined(__GNUC__) + #if (__GNUC__ >= 8) // fix that check + #define USE_HW_SHA + #ifndef __SHA__ + #define ATTRIB_SHA __attribute__((__target__("sha,ssse3"))) + // #pragma GCC target("sha,ssse3") + #endif + #endif + #elif defined(__INTEL_COMPILER) + #if (__INTEL_COMPILER >= 1800) // fix that check + #define USE_HW_SHA + #endif + #elif defined(_MSC_VER) + #ifdef USE_MY_MM + #define USE_VER_MIN 1300 + #else + #define USE_VER_MIN 1910 + #endif + #if _MSC_VER >= USE_VER_MIN + #define USE_HW_SHA + #endif + #endif +// #endif // MY_CPU_X86_OR_AMD64 + +#ifdef USE_HW_SHA + +// #pragma message("Sha256 HW") +// #include + +#if !defined(_MSC_VER) || (_MSC_VER >= 1900) +#include +#else +#include + +#if defined(_MSC_VER) && (_MSC_VER >= 1600) +// #include +#endif + +#ifdef USE_MY_MM +#include "My_mm.h" +#endif + +#endif + +/* +SHA256 uses: +SSE2: + _mm_loadu_si128 + _mm_storeu_si128 + _mm_set_epi32 + _mm_add_epi32 + _mm_shuffle_epi32 / pshufd + + + +SSSE3: + _mm_shuffle_epi8 / pshufb + _mm_alignr_epi8 +SHA: + _mm_sha256* +*/ + +// K array must be aligned for 16-bytes at least. +// The compiler can look align attribute and selects +// movdqu - for code without align attribute +// movdqa - for code with align attribute +extern +MY_ALIGN(64) +const UInt32 SHA256_K_ARRAY[64]; + +#define K SHA256_K_ARRAY + + +#define ADD_EPI32(dest, src) dest = _mm_add_epi32(dest, src); +#define SHA256_MSG1(dest, src) dest = _mm_sha256msg1_epu32(dest, src); +#define SHA25G_MSG2(dest, src) dest = _mm_sha256msg2_epu32(dest, src); + + +#define LOAD_SHUFFLE(m, k) \ + m = _mm_loadu_si128((const __m128i *)(const void *)(data + (k) * 16)); \ + m = _mm_shuffle_epi8(m, mask); \ + +#define SM1(g0, g1, g2, g3) \ + SHA256_MSG1(g3, g0); \ + +#define SM2(g0, g1, g2, g3) \ + tmp = _mm_alignr_epi8(g1, g0, 4); \ + ADD_EPI32(g2, tmp); \ + SHA25G_MSG2(g2, g1); \ + +// #define LS0(k, g0, g1, g2, g3) LOAD_SHUFFLE(g0, k) +// #define LS1(k, g0, g1, g2, g3) LOAD_SHUFFLE(g1, k+1) + + +#define NNN(g0, g1, g2, g3) + + +#define RND2(t0, t1) \ + t0 = _mm_sha256rnds2_epu32(t0, t1, msg); + +#define RND2_0(m, k) \ + msg = _mm_add_epi32(m, *(const __m128i *) (const void *) &K[(k) * 4]); \ + RND2(state0, state1); \ + msg = _mm_shuffle_epi32(msg, 0x0E); \ + + +#define RND2_1 \ + RND2(state1, state0); \ + + +// We use scheme with 3 rounds ahead for SHA256_MSG1 / 2 rounds ahead for SHA256_MSG2 + +#define R4(k, g0, g1, g2, g3, OP0, OP1) \ + RND2_0(g0, k); \ + OP0(g0, g1, g2, g3); \ + RND2_1; \ + OP1(g0, g1, g2, g3); \ + +#define R16(k, OP0, OP1, OP2, OP3, OP4, OP5, OP6, OP7) \ + R4 ( (k)*4+0, m0, m1, m2, m3, OP0, OP1 ) \ + R4 ( (k)*4+1, m1, m2, m3, m0, OP2, OP3 ) \ + R4 ( (k)*4+2, m2, m3, m0, m1, OP4, OP5 ) \ + R4 ( (k)*4+3, m3, m0, m1, m2, OP6, OP7 ) \ + +#define PREPARE_STATE \ + tmp = _mm_shuffle_epi32(state0, 0x1B); /* abcd */ \ + state0 = _mm_shuffle_epi32(state1, 0x1B); /* efgh */ \ + state1 = state0; \ + state0 = _mm_unpacklo_epi64(state0, tmp); /* cdgh */ \ + state1 = _mm_unpackhi_epi64(state1, tmp); /* abef */ \ + + +void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks); +#ifdef ATTRIB_SHA +ATTRIB_SHA +#endif +void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks) +{ + const __m128i mask = _mm_set_epi32(0x0c0d0e0f, 0x08090a0b, 0x04050607, 0x00010203); + __m128i tmp; + __m128i state0, state1; + + if (numBlocks == 0) + return; + + state0 = _mm_loadu_si128((const __m128i *) (const void *) &state[0]); + state1 = _mm_loadu_si128((const __m128i *) (const void *) &state[4]); + + PREPARE_STATE + + do + { + __m128i state0_save, state1_save; + __m128i m0, m1, m2, m3; + __m128i msg; + // #define msg tmp + + state0_save = state0; + state1_save = state1; + + LOAD_SHUFFLE (m0, 0) + LOAD_SHUFFLE (m1, 1) + LOAD_SHUFFLE (m2, 2) + LOAD_SHUFFLE (m3, 3) + + + + R16 ( 0, NNN, NNN, SM1, NNN, SM1, SM2, SM1, SM2 ); + R16 ( 1, SM1, SM2, SM1, SM2, SM1, SM2, SM1, SM2 ); + R16 ( 2, SM1, SM2, SM1, SM2, SM1, SM2, SM1, SM2 ); + R16 ( 3, SM1, SM2, NNN, SM2, NNN, NNN, NNN, NNN ); + + ADD_EPI32(state0, state0_save); + ADD_EPI32(state1, state1_save); + + data += 64; + } + while (--numBlocks); + + PREPARE_STATE + + _mm_storeu_si128((__m128i *) (void *) &state[0], state0); + _mm_storeu_si128((__m128i *) (void *) &state[4], state1); +} + +#endif // USE_HW_SHA + +#elif defined(MY_CPU_ARM_OR_ARM64) + + #if defined(__clang__) + #if (__clang_major__ >= 8) // fix that check + #define USE_HW_SHA + #endif + #elif defined(__GNUC__) + #if (__GNUC__ >= 6) // fix that check + #define USE_HW_SHA + #endif + #elif defined(_MSC_VER) + #if _MSC_VER >= 1910 + #define USE_HW_SHA + #endif + #endif + +#ifdef USE_HW_SHA + +// #pragma message("=== Sha256 HW === ") + +#if defined(__clang__) || defined(__GNUC__) + #ifdef MY_CPU_ARM64 + #define ATTRIB_SHA __attribute__((__target__("+crypto"))) + #else + #define ATTRIB_SHA __attribute__((__target__("fpu=crypto-neon-fp-armv8"))) + #endif +#else + // _MSC_VER + // for arm32 + #define _ARM_USE_NEW_NEON_INTRINSICS +#endif + +#if defined(_MSC_VER) && defined(MY_CPU_ARM64) +#include +#else +#include +#endif + +typedef uint32x4_t v128; +// typedef __n128 v128; // MSVC + +#ifdef MY_CPU_BE + #define MY_rev32_for_LE(x) +#else + #define MY_rev32_for_LE(x) x = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(x))) +#endif + +#define LOAD_128(_p) (*(const v128 *)(const void *)(_p)) +#define STORE_128(_p, _v) *(v128 *)(void *)(_p) = (_v) + +#define LOAD_SHUFFLE(m, k) \ + m = LOAD_128((data + (k) * 16)); \ + MY_rev32_for_LE(m); \ + +// K array must be aligned for 16-bytes at least. +extern +MY_ALIGN(64) +const UInt32 SHA256_K_ARRAY[64]; + +#define K SHA256_K_ARRAY + + +#define SHA256_SU0(dest, src) dest = vsha256su0q_u32(dest, src); +#define SHA25G_SU1(dest, src2, src3) dest = vsha256su1q_u32(dest, src2, src3); + +#define SM1(g0, g1, g2, g3) SHA256_SU0(g3, g0) +#define SM2(g0, g1, g2, g3) SHA25G_SU1(g2, g0, g1) +#define NNN(g0, g1, g2, g3) + + +#define R4(k, g0, g1, g2, g3, OP0, OP1) \ + msg = vaddq_u32(g0, *(const v128 *) (const void *) &K[(k) * 4]); \ + tmp = state0; \ + state0 = vsha256hq_u32( state0, state1, msg ); \ + state1 = vsha256h2q_u32( state1, tmp, msg ); \ + OP0(g0, g1, g2, g3); \ + OP1(g0, g1, g2, g3); \ + + +#define R16(k, OP0, OP1, OP2, OP3, OP4, OP5, OP6, OP7) \ + R4 ( (k)*4+0, m0, m1, m2, m3, OP0, OP1 ) \ + R4 ( (k)*4+1, m1, m2, m3, m0, OP2, OP3 ) \ + R4 ( (k)*4+2, m2, m3, m0, m1, OP4, OP5 ) \ + R4 ( (k)*4+3, m3, m0, m1, m2, OP6, OP7 ) \ + + +void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks); +#ifdef ATTRIB_SHA +ATTRIB_SHA +#endif +void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks) +{ + v128 state0, state1; + + if (numBlocks == 0) + return; + + state0 = LOAD_128(&state[0]); + state1 = LOAD_128(&state[4]); + + do + { + v128 state0_save, state1_save; + v128 m0, m1, m2, m3; + v128 msg, tmp; + + state0_save = state0; + state1_save = state1; + + LOAD_SHUFFLE (m0, 0) + LOAD_SHUFFLE (m1, 1) + LOAD_SHUFFLE (m2, 2) + LOAD_SHUFFLE (m3, 3) + + R16 ( 0, NNN, NNN, SM1, NNN, SM1, SM2, SM1, SM2 ); + R16 ( 1, SM1, SM2, SM1, SM2, SM1, SM2, SM1, SM2 ); + R16 ( 2, SM1, SM2, SM1, SM2, SM1, SM2, SM1, SM2 ); + R16 ( 3, SM1, SM2, NNN, SM2, NNN, NNN, NNN, NNN ); + + state0 = vaddq_u32(state0, state0_save); + state1 = vaddq_u32(state1, state1_save); + + data += 64; + } + while (--numBlocks); + + STORE_128(&state[0], state0); + STORE_128(&state[4], state1); +} + +#endif // USE_HW_SHA + +#endif // MY_CPU_ARM_OR_ARM64 + + +#ifndef USE_HW_SHA + +// #error Stop_Compiling_UNSUPPORTED_SHA +// #include + +// #include "Sha256.h" +void MY_FAST_CALL Sha256_UpdateBlocks(UInt32 state[8], const Byte *data, size_t numBlocks); + +#pragma message("Sha256 HW-SW stub was used") + +void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks); +void MY_FAST_CALL Sha256_UpdateBlocks_HW(UInt32 state[8], const Byte *data, size_t numBlocks) +{ + Sha256_UpdateBlocks(state, data, numBlocks); + /* + UNUSED_VAR(state); + UNUSED_VAR(data); + UNUSED_VAR(numBlocks); + exit(1); + return; + */ +} + +#endif diff --git a/deps/LZMA-SDK/C/Sort.c b/deps/LZMA-SDK/C/Sort.c index 73dcbf059..e1097e380 100644 --- a/deps/LZMA-SDK/C/Sort.c +++ b/deps/LZMA-SDK/C/Sort.c @@ -1,141 +1,141 @@ -/* Sort.c -- Sort functions -2014-04-05 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include "Sort.h" - -#define HeapSortDown(p, k, size, temp) \ - { for (;;) { \ - size_t s = (k << 1); \ - if (s > size) break; \ - if (s < size && p[s + 1] > p[s]) s++; \ - if (temp >= p[s]) break; \ - p[k] = p[s]; k = s; \ - } p[k] = temp; } - -void HeapSort(UInt32 *p, size_t size) -{ - if (size <= 1) - return; - p--; - { - size_t i = size / 2; - do - { - UInt32 temp = p[i]; - size_t k = i; - HeapSortDown(p, k, size, temp) - } - while (--i != 0); - } - /* - do - { - size_t k = 1; - UInt32 temp = p[size]; - p[size--] = p[1]; - HeapSortDown(p, k, size, temp) - } - while (size > 1); - */ - while (size > 3) - { - UInt32 temp = p[size]; - size_t k = (p[3] > p[2]) ? 3 : 2; - p[size--] = p[1]; - p[1] = p[k]; - HeapSortDown(p, k, size, temp) - } - { - UInt32 temp = p[size]; - p[size] = p[1]; - if (size > 2 && p[2] < temp) - { - p[1] = p[2]; - p[2] = temp; - } - else - p[1] = temp; - } -} - -void HeapSort64(UInt64 *p, size_t size) -{ - if (size <= 1) - return; - p--; - { - size_t i = size / 2; - do - { - UInt64 temp = p[i]; - size_t k = i; - HeapSortDown(p, k, size, temp) - } - while (--i != 0); - } - /* - do - { - size_t k = 1; - UInt64 temp = p[size]; - p[size--] = p[1]; - HeapSortDown(p, k, size, temp) - } - while (size > 1); - */ - while (size > 3) - { - UInt64 temp = p[size]; - size_t k = (p[3] > p[2]) ? 3 : 2; - p[size--] = p[1]; - p[1] = p[k]; - HeapSortDown(p, k, size, temp) - } - { - UInt64 temp = p[size]; - p[size] = p[1]; - if (size > 2 && p[2] < temp) - { - p[1] = p[2]; - p[2] = temp; - } - else - p[1] = temp; - } -} - -/* -#define HeapSortRefDown(p, vals, n, size, temp) \ - { size_t k = n; UInt32 val = vals[temp]; for (;;) { \ - size_t s = (k << 1); \ - if (s > size) break; \ - if (s < size && vals[p[s + 1]] > vals[p[s]]) s++; \ - if (val >= vals[p[s]]) break; \ - p[k] = p[s]; k = s; \ - } p[k] = temp; } - -void HeapSortRef(UInt32 *p, UInt32 *vals, size_t size) -{ - if (size <= 1) - return; - p--; - { - size_t i = size / 2; - do - { - UInt32 temp = p[i]; - HeapSortRefDown(p, vals, i, size, temp); - } - while (--i != 0); - } - do - { - UInt32 temp = p[size]; - p[size--] = p[1]; - HeapSortRefDown(p, vals, 1, size, temp); - } - while (size > 1); -} -*/ +/* Sort.c -- Sort functions +2014-04-05 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "Sort.h" + +#define HeapSortDown(p, k, size, temp) \ + { for (;;) { \ + size_t s = (k << 1); \ + if (s > size) break; \ + if (s < size && p[s + 1] > p[s]) s++; \ + if (temp >= p[s]) break; \ + p[k] = p[s]; k = s; \ + } p[k] = temp; } + +void HeapSort(UInt32 *p, size_t size) +{ + if (size <= 1) + return; + p--; + { + size_t i = size / 2; + do + { + UInt32 temp = p[i]; + size_t k = i; + HeapSortDown(p, k, size, temp) + } + while (--i != 0); + } + /* + do + { + size_t k = 1; + UInt32 temp = p[size]; + p[size--] = p[1]; + HeapSortDown(p, k, size, temp) + } + while (size > 1); + */ + while (size > 3) + { + UInt32 temp = p[size]; + size_t k = (p[3] > p[2]) ? 3 : 2; + p[size--] = p[1]; + p[1] = p[k]; + HeapSortDown(p, k, size, temp) + } + { + UInt32 temp = p[size]; + p[size] = p[1]; + if (size > 2 && p[2] < temp) + { + p[1] = p[2]; + p[2] = temp; + } + else + p[1] = temp; + } +} + +void HeapSort64(UInt64 *p, size_t size) +{ + if (size <= 1) + return; + p--; + { + size_t i = size / 2; + do + { + UInt64 temp = p[i]; + size_t k = i; + HeapSortDown(p, k, size, temp) + } + while (--i != 0); + } + /* + do + { + size_t k = 1; + UInt64 temp = p[size]; + p[size--] = p[1]; + HeapSortDown(p, k, size, temp) + } + while (size > 1); + */ + while (size > 3) + { + UInt64 temp = p[size]; + size_t k = (p[3] > p[2]) ? 3 : 2; + p[size--] = p[1]; + p[1] = p[k]; + HeapSortDown(p, k, size, temp) + } + { + UInt64 temp = p[size]; + p[size] = p[1]; + if (size > 2 && p[2] < temp) + { + p[1] = p[2]; + p[2] = temp; + } + else + p[1] = temp; + } +} + +/* +#define HeapSortRefDown(p, vals, n, size, temp) \ + { size_t k = n; UInt32 val = vals[temp]; for (;;) { \ + size_t s = (k << 1); \ + if (s > size) break; \ + if (s < size && vals[p[s + 1]] > vals[p[s]]) s++; \ + if (val >= vals[p[s]]) break; \ + p[k] = p[s]; k = s; \ + } p[k] = temp; } + +void HeapSortRef(UInt32 *p, UInt32 *vals, size_t size) +{ + if (size <= 1) + return; + p--; + { + size_t i = size / 2; + do + { + UInt32 temp = p[i]; + HeapSortRefDown(p, vals, i, size, temp); + } + while (--i != 0); + } + do + { + UInt32 temp = p[size]; + p[size--] = p[1]; + HeapSortRefDown(p, vals, 1, size, temp); + } + while (size > 1); +} +*/ diff --git a/deps/LZMA-SDK/C/Sort.h b/deps/LZMA-SDK/C/Sort.h index 7209d7824..2e2963a23 100644 --- a/deps/LZMA-SDK/C/Sort.h +++ b/deps/LZMA-SDK/C/Sort.h @@ -1,18 +1,18 @@ -/* Sort.h -- Sort functions -2014-04-05 : Igor Pavlov : Public domain */ - -#ifndef __7Z_SORT_H -#define __7Z_SORT_H - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -void HeapSort(UInt32 *p, size_t size); -void HeapSort64(UInt64 *p, size_t size); - -/* void HeapSortRef(UInt32 *p, UInt32 *vals, size_t size); */ - -EXTERN_C_END - -#endif +/* Sort.h -- Sort functions +2014-04-05 : Igor Pavlov : Public domain */ + +#ifndef __7Z_SORT_H +#define __7Z_SORT_H + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +void HeapSort(UInt32 *p, size_t size); +void HeapSort64(UInt64 *p, size_t size); + +/* void HeapSortRef(UInt32 *p, UInt32 *vals, size_t size); */ + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/Threads.c b/deps/LZMA-SDK/C/Threads.c index 402abab01..58eb90ffa 100644 --- a/deps/LZMA-SDK/C/Threads.c +++ b/deps/LZMA-SDK/C/Threads.c @@ -1,506 +1,540 @@ -/* Threads.c -- multithreading library -2021-04-25 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#ifdef _WIN32 - -#ifndef UNDER_CE -#include -#endif - -#include "Threads.h" - -static WRes GetError() -{ - DWORD res = GetLastError(); - return res ? (WRes)res : 1; -} - -static WRes HandleToWRes(HANDLE h) { return (h != NULL) ? 0 : GetError(); } -static WRes BOOLToWRes(BOOL v) { return v ? 0 : GetError(); } - -WRes HandlePtr_Close(HANDLE *p) -{ - if (*p != NULL) - { - if (!CloseHandle(*p)) - return GetError(); - *p = NULL; - } - return 0; -} - -WRes Handle_WaitObject(HANDLE h) -{ - DWORD dw = WaitForSingleObject(h, INFINITE); - /* - (dw) result: - WAIT_OBJECT_0 // 0 - WAIT_ABANDONED // 0x00000080 : is not compatible with Win32 Error space - WAIT_TIMEOUT // 0x00000102 : is compatible with Win32 Error space - WAIT_FAILED // 0xFFFFFFFF - */ - if (dw == WAIT_FAILED) - { - dw = GetLastError(); - if (dw == 0) - return WAIT_FAILED; - } - return (WRes)dw; -} - -#define Thread_Wait(p) Handle_WaitObject(*(p)) - -WRes Thread_Wait_Close(CThread *p) -{ - WRes res = Thread_Wait(p); - WRes res2 = Thread_Close(p); - return (res != 0 ? res : res2); -} - -WRes Thread_Create(CThread *p, THREAD_FUNC_TYPE func, LPVOID param) -{ - /* Windows Me/98/95: threadId parameter may not be NULL in _beginthreadex/CreateThread functions */ - - #ifdef UNDER_CE - - DWORD threadId; - *p = CreateThread(0, 0, func, param, 0, &threadId); - - #else - - unsigned threadId; - *p = (HANDLE)(_beginthreadex(NULL, 0, func, param, 0, &threadId)); - - #endif - - /* maybe we must use errno here, but probably GetLastError() is also OK. */ - return HandleToWRes(*p); -} - - -WRes Thread_Create_With_Affinity(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, CAffinityMask affinity) -{ - #ifdef UNDER_CE - - UNUSED_VAR(affinity) - return Thread_Create(p, func, param); - - #else - - /* Windows Me/98/95: threadId parameter may not be NULL in _beginthreadex/CreateThread functions */ - HANDLE h; - WRes wres; - unsigned threadId; - h = (HANDLE)(_beginthreadex(NULL, 0, func, param, CREATE_SUSPENDED, &threadId)); - *p = h; - wres = HandleToWRes(h); - if (h) - { - { - // DWORD_PTR prevMask = - SetThreadAffinityMask(h, (DWORD_PTR)affinity); - /* - if (prevMask == 0) - { - // affinity change is non-critical error, so we can ignore it - // wres = GetError(); - } - */ - } - { - DWORD prevSuspendCount = ResumeThread(h); - /* ResumeThread() returns: - 0 : was_not_suspended - 1 : was_resumed - -1 : error - */ - if (prevSuspendCount == (DWORD)-1) - wres = GetError(); - } - } - - /* maybe we must use errno here, but probably GetLastError() is also OK. */ - return wres; - - #endif -} - - -static WRes Event_Create(CEvent *p, BOOL manualReset, int signaled) -{ - *p = CreateEvent(NULL, manualReset, (signaled ? TRUE : FALSE), NULL); - return HandleToWRes(*p); -} - -WRes Event_Set(CEvent *p) { return BOOLToWRes(SetEvent(*p)); } -WRes Event_Reset(CEvent *p) { return BOOLToWRes(ResetEvent(*p)); } - -WRes ManualResetEvent_Create(CManualResetEvent *p, int signaled) { return Event_Create(p, TRUE, signaled); } -WRes AutoResetEvent_Create(CAutoResetEvent *p, int signaled) { return Event_Create(p, FALSE, signaled); } -WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p) { return ManualResetEvent_Create(p, 0); } -WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p) { return AutoResetEvent_Create(p, 0); } - - -WRes Semaphore_Create(CSemaphore *p, UInt32 initCount, UInt32 maxCount) -{ - // negative ((LONG)maxCount) is not supported in WIN32::CreateSemaphore() - *p = CreateSemaphore(NULL, (LONG)initCount, (LONG)maxCount, NULL); - return HandleToWRes(*p); -} - -static WRes Semaphore_Release(CSemaphore *p, LONG releaseCount, LONG *previousCount) - { return BOOLToWRes(ReleaseSemaphore(*p, releaseCount, previousCount)); } -WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 num) - { return Semaphore_Release(p, (LONG)num, NULL); } -WRes Semaphore_Release1(CSemaphore *p) { return Semaphore_ReleaseN(p, 1); } - -WRes CriticalSection_Init(CCriticalSection *p) -{ - /* InitializeCriticalSection can raise only STATUS_NO_MEMORY exception */ - #ifdef _MSC_VER - __try - #endif - { - InitializeCriticalSection(p); - /* InitializeCriticalSectionAndSpinCount(p, 0); */ - } - #ifdef _MSC_VER - __except (EXCEPTION_EXECUTE_HANDLER) { return 1; } - #endif - return 0; -} - - - - -#else // _WIN32 - -// ---------- POSIX ---------- - -#ifndef __APPLE__ -#ifndef _7ZIP_AFFINITY_DISABLE -// _GNU_SOURCE can be required for pthread_setaffinity_np() / CPU_ZERO / CPU_SET -#define _GNU_SOURCE -#endif -#endif - -#include "Threads.h" - -#include -#include -#include -#ifdef _7ZIP_AFFINITY_SUPPORTED -// #include -#endif - - -// #include -// #define PRF(p) p -#define PRF(p) - -#define Print(s) PRF(printf("\n%s\n", s)) - -// #include - -WRes Thread_Create_With_CpuSet(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, const CCpuSet *cpuSet) -{ - // new thread in Posix probably inherits affinity from parrent thread - Print("Thread_Create_With_CpuSet"); - - pthread_attr_t attr; - int ret; - // int ret2; - - p->_created = 0; - - RINOK(pthread_attr_init(&attr)); - - ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); - - if (!ret) - { - if (cpuSet) - { - #ifdef _7ZIP_AFFINITY_SUPPORTED - - /* - printf("\n affinity :"); - unsigned i; - for (i = 0; i < sizeof(*cpuSet) && i < 8; i++) - { - Byte b = *((const Byte *)cpuSet + i); - char temp[32]; - #define GET_HEX_CHAR(t) ((char)(((t < 10) ? ('0' + t) : ('A' + (t - 10))))) - temp[0] = GET_HEX_CHAR((b & 0xF)); - temp[1] = GET_HEX_CHAR((b >> 4)); - // temp[0] = GET_HEX_CHAR((b >> 4)); // big-endian - // temp[1] = GET_HEX_CHAR((b & 0xF)); // big-endian - temp[2] = 0; - printf("%s", temp); - } - printf("\n"); - */ - - // ret2 = - pthread_attr_setaffinity_np(&attr, sizeof(*cpuSet), cpuSet); - // if (ret2) ret = ret2; - #endif - } - - ret = pthread_create(&p->_tid, &attr, func, param); - - if (!ret) - { - p->_created = 1; - /* - if (cpuSet) - { - // ret2 = - pthread_setaffinity_np(p->_tid, sizeof(*cpuSet), cpuSet); - // if (ret2) ret = ret2; - } - */ - } - } - // ret2 = - pthread_attr_destroy(&attr); - // if (ret2 != 0) ret = ret2; - return ret; -} - - -WRes Thread_Create(CThread *p, THREAD_FUNC_TYPE func, LPVOID param) -{ - return Thread_Create_With_CpuSet(p, func, param, NULL); -} - - -WRes Thread_Create_With_Affinity(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, CAffinityMask affinity) -{ - Print("Thread_Create_WithAffinity"); - CCpuSet cs; - unsigned i; - CpuSet_Zero(&cs); - for (i = 0; i < sizeof(affinity) * 8; i++) - { - if (affinity == 0) - break; - if (affinity & 1) - { - CpuSet_Set(&cs, i); - } - affinity >>= 1; - } - return Thread_Create_With_CpuSet(p, func, param, &cs); -} - - -WRes Thread_Close(CThread *p) -{ - // Print("Thread_Close"); - int ret; - if (!p->_created) - return 0; - - ret = pthread_detach(p->_tid); - p->_tid = 0; - p->_created = 0; - return ret; -} - - -WRes Thread_Wait_Close(CThread *p) -{ - // Print("Thread_Wait_Close"); - void *thread_return; - int ret; - if (!p->_created) - return EINVAL; - - ret = pthread_join(p->_tid, &thread_return); - // probably we can't use that (_tid) after pthread_join(), so we close thread here - p->_created = 0; - p->_tid = 0; - return ret; -} - - - -static WRes Event_Create(CEvent *p, int manualReset, int signaled) -{ - RINOK(pthread_mutex_init(&p->_mutex, NULL)); - RINOK(pthread_cond_init(&p->_cond, NULL)); - p->_manual_reset = manualReset; - p->_state = (signaled ? True : False); - p->_created = 1; - return 0; -} - -WRes ManualResetEvent_Create(CManualResetEvent *p, int signaled) - { return Event_Create(p, True, signaled); } -WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p) - { return ManualResetEvent_Create(p, 0); } -WRes AutoResetEvent_Create(CAutoResetEvent *p, int signaled) - { return Event_Create(p, False, signaled); } -WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p) - { return AutoResetEvent_Create(p, 0); } - - -WRes Event_Set(CEvent *p) -{ - RINOK(pthread_mutex_lock(&p->_mutex)); - p->_state = True; - int res1 = pthread_cond_broadcast(&p->_cond); - int res2 = pthread_mutex_unlock(&p->_mutex); - return (res2 ? res2 : res1); -} - -WRes Event_Reset(CEvent *p) -{ - RINOK(pthread_mutex_lock(&p->_mutex)); - p->_state = False; - return pthread_mutex_unlock(&p->_mutex); -} - -WRes Event_Wait(CEvent *p) -{ - RINOK(pthread_mutex_lock(&p->_mutex)); - while (p->_state == False) - { - // ETIMEDOUT - // ret = - pthread_cond_wait(&p->_cond, &p->_mutex); - // if (ret != 0) break; - } - if (p->_manual_reset == False) - { - p->_state = False; - } - return pthread_mutex_unlock(&p->_mutex); -} - -WRes Event_Close(CEvent *p) -{ - if (!p->_created) - return 0; - p->_created = 0; - { - int res1 = pthread_mutex_destroy(&p->_mutex); - int res2 = pthread_cond_destroy(&p->_cond); - return (res1 ? res1 : res2); - } -} - - -WRes Semaphore_Create(CSemaphore *p, UInt32 initCount, UInt32 maxCount) -{ - if (initCount > maxCount || maxCount < 1) - return EINVAL; - RINOK(pthread_mutex_init(&p->_mutex, NULL)); - RINOK(pthread_cond_init(&p->_cond, NULL)); - p->_count = initCount; - p->_maxCount = maxCount; - p->_created = 1; - return 0; -} - -WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 releaseCount) -{ - UInt32 newCount; - int ret; - - if (releaseCount < 1) - return EINVAL; - - RINOK(pthread_mutex_lock(&p->_mutex)); - - newCount = p->_count + releaseCount; - if (newCount > p->_maxCount) - ret = ERROR_TOO_MANY_POSTS; // EINVAL; - else - { - p->_count = newCount; - ret = pthread_cond_broadcast(&p->_cond); - } - RINOK(pthread_mutex_unlock(&p->_mutex)); - return ret; -} - -WRes Semaphore_Wait(CSemaphore *p) -{ - RINOK(pthread_mutex_lock(&p->_mutex)); - while (p->_count < 1) - { - pthread_cond_wait(&p->_cond, &p->_mutex); - } - p->_count--; - return pthread_mutex_unlock(&p->_mutex); -} - -WRes Semaphore_Close(CSemaphore *p) -{ - if (!p->_created) - return 0; - p->_created = 0; - { - int res1 = pthread_mutex_destroy(&p->_mutex); - int res2 = pthread_cond_destroy(&p->_cond); - return (res1 ? res1 : res2); - } -} - - - -WRes CriticalSection_Init(CCriticalSection *p) -{ - // Print("CriticalSection_Init"); - if (!p) - return EINTR; - return pthread_mutex_init(&p->_mutex, NULL); -} - -void CriticalSection_Enter(CCriticalSection *p) -{ - // Print("CriticalSection_Enter"); - if (p) - { - // int ret = - pthread_mutex_lock(&p->_mutex); - } -} - -void CriticalSection_Leave(CCriticalSection *p) -{ - // Print("CriticalSection_Leave"); - if (p) - { - // int ret = - pthread_mutex_unlock(&p->_mutex); - } -} - -void CriticalSection_Delete(CCriticalSection *p) -{ - // Print("CriticalSection_Delete"); - if (p) - { - // int ret = - pthread_mutex_destroy(&p->_mutex); - } -} - -LONG InterlockedIncrement(LONG volatile *addend) -{ - // Print("InterlockedIncrement"); - #ifdef USE_HACK_UNSAFE_ATOMIC - LONG val = *addend + 1; - *addend = val; - return val; - #else - return __sync_add_and_fetch(addend, 1); - #endif -} - -#endif // _WIN32 +/* Threads.c -- multithreading library +2021-12-21 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#ifdef _WIN32 + +#ifndef USE_THREADS_CreateThread +#include +#endif + +#include "Threads.h" + +static WRes GetError() +{ + DWORD res = GetLastError(); + return res ? (WRes)res : 1; +} + +static WRes HandleToWRes(HANDLE h) { return (h != NULL) ? 0 : GetError(); } +static WRes BOOLToWRes(BOOL v) { return v ? 0 : GetError(); } + +WRes HandlePtr_Close(HANDLE *p) +{ + if (*p != NULL) + { + if (!CloseHandle(*p)) + return GetError(); + *p = NULL; + } + return 0; +} + +WRes Handle_WaitObject(HANDLE h) +{ + DWORD dw = WaitForSingleObject(h, INFINITE); + /* + (dw) result: + WAIT_OBJECT_0 // 0 + WAIT_ABANDONED // 0x00000080 : is not compatible with Win32 Error space + WAIT_TIMEOUT // 0x00000102 : is compatible with Win32 Error space + WAIT_FAILED // 0xFFFFFFFF + */ + if (dw == WAIT_FAILED) + { + dw = GetLastError(); + if (dw == 0) + return WAIT_FAILED; + } + return (WRes)dw; +} + +#define Thread_Wait(p) Handle_WaitObject(*(p)) + +WRes Thread_Wait_Close(CThread *p) +{ + WRes res = Thread_Wait(p); + WRes res2 = Thread_Close(p); + return (res != 0 ? res : res2); +} + +WRes Thread_Create(CThread *p, THREAD_FUNC_TYPE func, LPVOID param) +{ + /* Windows Me/98/95: threadId parameter may not be NULL in _beginthreadex/CreateThread functions */ + + #ifdef USE_THREADS_CreateThread + + DWORD threadId; + *p = CreateThread(NULL, 0, func, param, 0, &threadId); + + #else + + unsigned threadId; + *p = (HANDLE)(_beginthreadex(NULL, 0, func, param, 0, &threadId)); + + #endif + + /* maybe we must use errno here, but probably GetLastError() is also OK. */ + return HandleToWRes(*p); +} + + +WRes Thread_Create_With_Affinity(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, CAffinityMask affinity) +{ + #ifdef USE_THREADS_CreateThread + + UNUSED_VAR(affinity) + return Thread_Create(p, func, param); + + #else + + /* Windows Me/98/95: threadId parameter may not be NULL in _beginthreadex/CreateThread functions */ + HANDLE h; + WRes wres; + unsigned threadId; + h = (HANDLE)(_beginthreadex(NULL, 0, func, param, CREATE_SUSPENDED, &threadId)); + *p = h; + wres = HandleToWRes(h); + if (h) + { + { + // DWORD_PTR prevMask = + SetThreadAffinityMask(h, (DWORD_PTR)affinity); + /* + if (prevMask == 0) + { + // affinity change is non-critical error, so we can ignore it + // wres = GetError(); + } + */ + } + { + DWORD prevSuspendCount = ResumeThread(h); + /* ResumeThread() returns: + 0 : was_not_suspended + 1 : was_resumed + -1 : error + */ + if (prevSuspendCount == (DWORD)-1) + wres = GetError(); + } + } + + /* maybe we must use errno here, but probably GetLastError() is also OK. */ + return wres; + + #endif +} + + +static WRes Event_Create(CEvent *p, BOOL manualReset, int signaled) +{ + *p = CreateEvent(NULL, manualReset, (signaled ? TRUE : FALSE), NULL); + return HandleToWRes(*p); +} + +WRes Event_Set(CEvent *p) { return BOOLToWRes(SetEvent(*p)); } +WRes Event_Reset(CEvent *p) { return BOOLToWRes(ResetEvent(*p)); } + +WRes ManualResetEvent_Create(CManualResetEvent *p, int signaled) { return Event_Create(p, TRUE, signaled); } +WRes AutoResetEvent_Create(CAutoResetEvent *p, int signaled) { return Event_Create(p, FALSE, signaled); } +WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p) { return ManualResetEvent_Create(p, 0); } +WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p) { return AutoResetEvent_Create(p, 0); } + + +WRes Semaphore_Create(CSemaphore *p, UInt32 initCount, UInt32 maxCount) +{ + // negative ((LONG)maxCount) is not supported in WIN32::CreateSemaphore() + *p = CreateSemaphore(NULL, (LONG)initCount, (LONG)maxCount, NULL); + return HandleToWRes(*p); +} + +WRes Semaphore_OptCreateInit(CSemaphore *p, UInt32 initCount, UInt32 maxCount) +{ + // if (Semaphore_IsCreated(p)) + { + WRes wres = Semaphore_Close(p); + if (wres != 0) + return wres; + } + return Semaphore_Create(p, initCount, maxCount); +} + +static WRes Semaphore_Release(CSemaphore *p, LONG releaseCount, LONG *previousCount) + { return BOOLToWRes(ReleaseSemaphore(*p, releaseCount, previousCount)); } +WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 num) + { return Semaphore_Release(p, (LONG)num, NULL); } +WRes Semaphore_Release1(CSemaphore *p) { return Semaphore_ReleaseN(p, 1); } + +WRes CriticalSection_Init(CCriticalSection *p) +{ + /* InitializeCriticalSection() can raise exception: + Windows XP, 2003 : can raise a STATUS_NO_MEMORY exception + Windows Vista+ : no exceptions */ + #ifdef _MSC_VER + __try + #endif + { + InitializeCriticalSection(p); + /* InitializeCriticalSectionAndSpinCount(p, 0); */ + } + #ifdef _MSC_VER + __except (EXCEPTION_EXECUTE_HANDLER) { return ERROR_NOT_ENOUGH_MEMORY; } + #endif + return 0; +} + + + + +#else // _WIN32 + +// ---------- POSIX ---------- + +#ifndef __APPLE__ +#ifndef _7ZIP_AFFINITY_DISABLE +// _GNU_SOURCE can be required for pthread_setaffinity_np() / CPU_ZERO / CPU_SET +#define _GNU_SOURCE +#endif +#endif + +#include "Threads.h" + +#include +#include +#include +#ifdef _7ZIP_AFFINITY_SUPPORTED +// #include +#endif + + +// #include +// #define PRF(p) p +#define PRF(p) + +#define Print(s) PRF(printf("\n%s\n", s)) + +// #include + +WRes Thread_Create_With_CpuSet(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, const CCpuSet *cpuSet) +{ + // new thread in Posix probably inherits affinity from parrent thread + Print("Thread_Create_With_CpuSet"); + + pthread_attr_t attr; + int ret; + // int ret2; + + p->_created = 0; + + RINOK(pthread_attr_init(&attr)); + + ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); + + if (!ret) + { + if (cpuSet) + { + #ifdef _7ZIP_AFFINITY_SUPPORTED + + /* + printf("\n affinity :"); + unsigned i; + for (i = 0; i < sizeof(*cpuSet) && i < 8; i++) + { + Byte b = *((const Byte *)cpuSet + i); + char temp[32]; + #define GET_HEX_CHAR(t) ((char)(((t < 10) ? ('0' + t) : ('A' + (t - 10))))) + temp[0] = GET_HEX_CHAR((b & 0xF)); + temp[1] = GET_HEX_CHAR((b >> 4)); + // temp[0] = GET_HEX_CHAR((b >> 4)); // big-endian + // temp[1] = GET_HEX_CHAR((b & 0xF)); // big-endian + temp[2] = 0; + printf("%s", temp); + } + printf("\n"); + */ + + // ret2 = + pthread_attr_setaffinity_np(&attr, sizeof(*cpuSet), cpuSet); + // if (ret2) ret = ret2; + #endif + } + + ret = pthread_create(&p->_tid, &attr, func, param); + + if (!ret) + { + p->_created = 1; + /* + if (cpuSet) + { + // ret2 = + pthread_setaffinity_np(p->_tid, sizeof(*cpuSet), cpuSet); + // if (ret2) ret = ret2; + } + */ + } + } + // ret2 = + pthread_attr_destroy(&attr); + // if (ret2 != 0) ret = ret2; + return ret; +} + + +WRes Thread_Create(CThread *p, THREAD_FUNC_TYPE func, LPVOID param) +{ + return Thread_Create_With_CpuSet(p, func, param, NULL); +} + + +WRes Thread_Create_With_Affinity(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, CAffinityMask affinity) +{ + Print("Thread_Create_WithAffinity"); + CCpuSet cs; + unsigned i; + CpuSet_Zero(&cs); + for (i = 0; i < sizeof(affinity) * 8; i++) + { + if (affinity == 0) + break; + if (affinity & 1) + { + CpuSet_Set(&cs, i); + } + affinity >>= 1; + } + return Thread_Create_With_CpuSet(p, func, param, &cs); +} + + +WRes Thread_Close(CThread *p) +{ + // Print("Thread_Close"); + int ret; + if (!p->_created) + return 0; + + ret = pthread_detach(p->_tid); + p->_tid = 0; + p->_created = 0; + return ret; +} + + +WRes Thread_Wait_Close(CThread *p) +{ + // Print("Thread_Wait_Close"); + void *thread_return; + int ret; + if (!p->_created) + return EINVAL; + + ret = pthread_join(p->_tid, &thread_return); + // probably we can't use that (_tid) after pthread_join(), so we close thread here + p->_created = 0; + p->_tid = 0; + return ret; +} + + + +static WRes Event_Create(CEvent *p, int manualReset, int signaled) +{ + RINOK(pthread_mutex_init(&p->_mutex, NULL)); + RINOK(pthread_cond_init(&p->_cond, NULL)); + p->_manual_reset = manualReset; + p->_state = (signaled ? True : False); + p->_created = 1; + return 0; +} + +WRes ManualResetEvent_Create(CManualResetEvent *p, int signaled) + { return Event_Create(p, True, signaled); } +WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p) + { return ManualResetEvent_Create(p, 0); } +WRes AutoResetEvent_Create(CAutoResetEvent *p, int signaled) + { return Event_Create(p, False, signaled); } +WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p) + { return AutoResetEvent_Create(p, 0); } + + +WRes Event_Set(CEvent *p) +{ + RINOK(pthread_mutex_lock(&p->_mutex)); + p->_state = True; + int res1 = pthread_cond_broadcast(&p->_cond); + int res2 = pthread_mutex_unlock(&p->_mutex); + return (res2 ? res2 : res1); +} + +WRes Event_Reset(CEvent *p) +{ + RINOK(pthread_mutex_lock(&p->_mutex)); + p->_state = False; + return pthread_mutex_unlock(&p->_mutex); +} + +WRes Event_Wait(CEvent *p) +{ + RINOK(pthread_mutex_lock(&p->_mutex)); + while (p->_state == False) + { + // ETIMEDOUT + // ret = + pthread_cond_wait(&p->_cond, &p->_mutex); + // if (ret != 0) break; + } + if (p->_manual_reset == False) + { + p->_state = False; + } + return pthread_mutex_unlock(&p->_mutex); +} + +WRes Event_Close(CEvent *p) +{ + if (!p->_created) + return 0; + p->_created = 0; + { + int res1 = pthread_mutex_destroy(&p->_mutex); + int res2 = pthread_cond_destroy(&p->_cond); + return (res1 ? res1 : res2); + } +} + + +WRes Semaphore_Create(CSemaphore *p, UInt32 initCount, UInt32 maxCount) +{ + if (initCount > maxCount || maxCount < 1) + return EINVAL; + RINOK(pthread_mutex_init(&p->_mutex, NULL)); + RINOK(pthread_cond_init(&p->_cond, NULL)); + p->_count = initCount; + p->_maxCount = maxCount; + p->_created = 1; + return 0; +} + + +WRes Semaphore_OptCreateInit(CSemaphore *p, UInt32 initCount, UInt32 maxCount) +{ + if (Semaphore_IsCreated(p)) + { + /* + WRes wres = Semaphore_Close(p); + if (wres != 0) + return wres; + */ + if (initCount > maxCount || maxCount < 1) + return EINVAL; + // return EINVAL; // for debug + p->_count = initCount; + p->_maxCount = maxCount; + return 0; + } + return Semaphore_Create(p, initCount, maxCount); +} + + +WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 releaseCount) +{ + UInt32 newCount; + int ret; + + if (releaseCount < 1) + return EINVAL; + + RINOK(pthread_mutex_lock(&p->_mutex)); + + newCount = p->_count + releaseCount; + if (newCount > p->_maxCount) + ret = ERROR_TOO_MANY_POSTS; // EINVAL; + else + { + p->_count = newCount; + ret = pthread_cond_broadcast(&p->_cond); + } + RINOK(pthread_mutex_unlock(&p->_mutex)); + return ret; +} + +WRes Semaphore_Wait(CSemaphore *p) +{ + RINOK(pthread_mutex_lock(&p->_mutex)); + while (p->_count < 1) + { + pthread_cond_wait(&p->_cond, &p->_mutex); + } + p->_count--; + return pthread_mutex_unlock(&p->_mutex); +} + +WRes Semaphore_Close(CSemaphore *p) +{ + if (!p->_created) + return 0; + p->_created = 0; + { + int res1 = pthread_mutex_destroy(&p->_mutex); + int res2 = pthread_cond_destroy(&p->_cond); + return (res1 ? res1 : res2); + } +} + + + +WRes CriticalSection_Init(CCriticalSection *p) +{ + // Print("CriticalSection_Init"); + if (!p) + return EINTR; + return pthread_mutex_init(&p->_mutex, NULL); +} + +void CriticalSection_Enter(CCriticalSection *p) +{ + // Print("CriticalSection_Enter"); + if (p) + { + // int ret = + pthread_mutex_lock(&p->_mutex); + } +} + +void CriticalSection_Leave(CCriticalSection *p) +{ + // Print("CriticalSection_Leave"); + if (p) + { + // int ret = + pthread_mutex_unlock(&p->_mutex); + } +} + +void CriticalSection_Delete(CCriticalSection *p) +{ + // Print("CriticalSection_Delete"); + if (p) + { + // int ret = + pthread_mutex_destroy(&p->_mutex); + } +} + +LONG InterlockedIncrement(LONG volatile *addend) +{ + // Print("InterlockedIncrement"); + #ifdef USE_HACK_UNSAFE_ATOMIC + LONG val = *addend + 1; + *addend = val; + return val; + #else + return __sync_add_and_fetch(addend, 1); + #endif +} + +#endif // _WIN32 diff --git a/deps/LZMA-SDK/C/Threads.h b/deps/LZMA-SDK/C/Threads.h index c555c8b97..ceb844a23 100644 --- a/deps/LZMA-SDK/C/Threads.h +++ b/deps/LZMA-SDK/C/Threads.h @@ -1,197 +1,232 @@ -/* Threads.h -- multithreading library -2021-04-25 : Igor Pavlov : Public domain */ - -#ifndef __7Z_THREADS_H -#define __7Z_THREADS_H - -#ifdef _WIN32 -#include -#else - -#if !defined(__APPLE__) && !defined(_AIX) -#ifndef _7ZIP_AFFINITY_DISABLE -#define _7ZIP_AFFINITY_SUPPORTED -// #define _GNU_SOURCE -#endif -#endif - -#include -#endif - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -#ifdef _WIN32 - -WRes HandlePtr_Close(HANDLE *h); -WRes Handle_WaitObject(HANDLE h); - -typedef HANDLE CThread; - -#define Thread_Construct(p) { *(p) = NULL; } -#define Thread_WasCreated(p) (*(p) != NULL) -#define Thread_Close(p) HandlePtr_Close(p) -// #define Thread_Wait(p) Handle_WaitObject(*(p)) - -typedef - #ifdef UNDER_CE - DWORD - #else - unsigned - #endif - THREAD_FUNC_RET_TYPE; - -typedef DWORD_PTR CAffinityMask; -typedef DWORD_PTR CCpuSet; - -#define CpuSet_Zero(p) { *(p) = 0; } -#define CpuSet_Set(p, cpu) { *(p) |= ((DWORD_PTR)1 << (cpu)); } - -#else // _WIN32 - -typedef struct _CThread -{ - pthread_t _tid; - int _created; -} CThread; - -#define Thread_Construct(p) { (p)->_tid = 0; (p)->_created = 0; } -#define Thread_WasCreated(p) ((p)->_created != 0) -WRes Thread_Close(CThread *p); -// #define Thread_Wait Thread_Wait_Close - -typedef void * THREAD_FUNC_RET_TYPE; - -typedef UInt64 CAffinityMask; - -#ifdef _7ZIP_AFFINITY_SUPPORTED - -typedef cpu_set_t CCpuSet; -#define CpuSet_Zero(p) CPU_ZERO(p) -#define CpuSet_Set(p, cpu) CPU_SET(cpu, p) -#define CpuSet_IsSet(p, cpu) CPU_ISSET(cpu, p) - -#else - -typedef UInt64 CCpuSet; -#define CpuSet_Zero(p) { *(p) = 0; } -#define CpuSet_Set(p, cpu) { *(p) |= ((UInt64)1 << (cpu)); } -#define CpuSet_IsSet(p, cpu) ((*(p) & ((UInt64)1 << (cpu))) != 0) - -#endif - - -#endif // _WIN32 - - -#define THREAD_FUNC_CALL_TYPE MY_STD_CALL -#define THREAD_FUNC_DECL THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE -typedef THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE * THREAD_FUNC_TYPE)(void *); -WRes Thread_Create(CThread *p, THREAD_FUNC_TYPE func, LPVOID param); -WRes Thread_Create_With_Affinity(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, CAffinityMask affinity); -WRes Thread_Wait_Close(CThread *p); - -#ifdef _WIN32 -#define Thread_Create_With_CpuSet(p, func, param, cs) \ - Thread_Create_With_Affinity(p, func, param, *cs) -#else -WRes Thread_Create_With_CpuSet(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, const CCpuSet *cpuSet); -#endif - - -#ifdef _WIN32 - -typedef HANDLE CEvent; -typedef CEvent CAutoResetEvent; -typedef CEvent CManualResetEvent; -#define Event_Construct(p) *(p) = NULL -#define Event_IsCreated(p) (*(p) != NULL) -#define Event_Close(p) HandlePtr_Close(p) -#define Event_Wait(p) Handle_WaitObject(*(p)) -WRes Event_Set(CEvent *p); -WRes Event_Reset(CEvent *p); -WRes ManualResetEvent_Create(CManualResetEvent *p, int signaled); -WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p); -WRes AutoResetEvent_Create(CAutoResetEvent *p, int signaled); -WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p); - -typedef HANDLE CSemaphore; -#define Semaphore_Construct(p) *(p) = NULL -#define Semaphore_IsCreated(p) (*(p) != NULL) -#define Semaphore_Close(p) HandlePtr_Close(p) -#define Semaphore_Wait(p) Handle_WaitObject(*(p)) -WRes Semaphore_Create(CSemaphore *p, UInt32 initCount, UInt32 maxCount); -WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 num); -WRes Semaphore_Release1(CSemaphore *p); - -typedef CRITICAL_SECTION CCriticalSection; -WRes CriticalSection_Init(CCriticalSection *p); -#define CriticalSection_Delete(p) DeleteCriticalSection(p) -#define CriticalSection_Enter(p) EnterCriticalSection(p) -#define CriticalSection_Leave(p) LeaveCriticalSection(p) - - -#else // _WIN32 - -typedef struct _CEvent -{ - int _created; - int _manual_reset; - int _state; - pthread_mutex_t _mutex; - pthread_cond_t _cond; -} CEvent; - -typedef CEvent CAutoResetEvent; -typedef CEvent CManualResetEvent; - -#define Event_Construct(p) (p)->_created = 0 -#define Event_IsCreated(p) ((p)->_created) - -WRes ManualResetEvent_Create(CManualResetEvent *p, int signaled); -WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p); -WRes AutoResetEvent_Create(CAutoResetEvent *p, int signaled); -WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p); -WRes Event_Set(CEvent *p); -WRes Event_Reset(CEvent *p); -WRes Event_Wait(CEvent *p); -WRes Event_Close(CEvent *p); - - -typedef struct _CSemaphore -{ - int _created; - UInt32 _count; - UInt32 _maxCount; - pthread_mutex_t _mutex; - pthread_cond_t _cond; -} CSemaphore; - -#define Semaphore_Construct(p) (p)->_created = 0 -#define Semaphore_IsCreated(p) ((p)->_created) - -WRes Semaphore_Create(CSemaphore *p, UInt32 initCount, UInt32 maxCount); -WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 num); -#define Semaphore_Release1(p) Semaphore_ReleaseN(p, 1) -WRes Semaphore_Wait(CSemaphore *p); -WRes Semaphore_Close(CSemaphore *p); - - -typedef struct _CCriticalSection -{ - pthread_mutex_t _mutex; -} CCriticalSection; - -WRes CriticalSection_Init(CCriticalSection *p); -void CriticalSection_Delete(CCriticalSection *cs); -void CriticalSection_Enter(CCriticalSection *cs); -void CriticalSection_Leave(CCriticalSection *cs); - -LONG InterlockedIncrement(LONG volatile *addend); - -#endif // _WIN32 - -EXTERN_C_END - -#endif +/* Threads.h -- multithreading library +2021-12-21 : Igor Pavlov : Public domain */ + +#ifndef __7Z_THREADS_H +#define __7Z_THREADS_H + +#ifdef _WIN32 +#include +#else + +#if defined(__linux__) +#if !defined(__APPLE__) && !defined(_AIX) && !defined(__ANDROID__) +#ifndef _7ZIP_AFFINITY_DISABLE +#define _7ZIP_AFFINITY_SUPPORTED +// #pragma message(" ==== _7ZIP_AFFINITY_SUPPORTED") +// #define _GNU_SOURCE +#endif +#endif +#endif + +#include + +#endif + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +#ifdef _WIN32 + +WRes HandlePtr_Close(HANDLE *h); +WRes Handle_WaitObject(HANDLE h); + +typedef HANDLE CThread; + +#define Thread_Construct(p) { *(p) = NULL; } +#define Thread_WasCreated(p) (*(p) != NULL) +#define Thread_Close(p) HandlePtr_Close(p) +// #define Thread_Wait(p) Handle_WaitObject(*(p)) + +#ifdef UNDER_CE + // if (USE_THREADS_CreateThread is defined), we use _beginthreadex() + // if (USE_THREADS_CreateThread is not definned), we use CreateThread() + #define USE_THREADS_CreateThread +#endif + +typedef + #ifdef USE_THREADS_CreateThread + DWORD + #else + unsigned + #endif + THREAD_FUNC_RET_TYPE; + +typedef DWORD_PTR CAffinityMask; +typedef DWORD_PTR CCpuSet; + +#define CpuSet_Zero(p) { *(p) = 0; } +#define CpuSet_Set(p, cpu) { *(p) |= ((DWORD_PTR)1 << (cpu)); } + +#else // _WIN32 + +typedef struct _CThread +{ + pthread_t _tid; + int _created; +} CThread; + +#define Thread_Construct(p) { (p)->_tid = 0; (p)->_created = 0; } +#define Thread_WasCreated(p) ((p)->_created != 0) +WRes Thread_Close(CThread *p); +// #define Thread_Wait Thread_Wait_Close + +typedef void * THREAD_FUNC_RET_TYPE; + +typedef UInt64 CAffinityMask; + +#ifdef _7ZIP_AFFINITY_SUPPORTED + +typedef cpu_set_t CCpuSet; +#define CpuSet_Zero(p) CPU_ZERO(p) +#define CpuSet_Set(p, cpu) CPU_SET(cpu, p) +#define CpuSet_IsSet(p, cpu) CPU_ISSET(cpu, p) + +#else + +typedef UInt64 CCpuSet; +#define CpuSet_Zero(p) { *(p) = 0; } +#define CpuSet_Set(p, cpu) { *(p) |= ((UInt64)1 << (cpu)); } +#define CpuSet_IsSet(p, cpu) ((*(p) & ((UInt64)1 << (cpu))) != 0) + +#endif + + +#endif // _WIN32 + + +#define THREAD_FUNC_CALL_TYPE MY_STD_CALL + +#if defined(_WIN32) && defined(__GNUC__) +/* GCC compiler for x86 32-bit uses the rule: + the stack is 16-byte aligned before CALL instruction for function calling. + But only root function main() contains instructions that + set 16-byte alignment for stack pointer. And another functions + just keep alignment, if it was set in some parent function. + + The problem: + if we create new thread in MinGW (GCC) 32-bit x86 via _beginthreadex() or CreateThread(), + the root function of thread doesn't set 16-byte alignment. + And stack frames in all child functions also will be unaligned in that case. + + Here we set (force_align_arg_pointer) attribute for root function of new thread. + Do we need (force_align_arg_pointer) also for another systems? */ + + #define THREAD_FUNC_ATTRIB_ALIGN_ARG __attribute__((force_align_arg_pointer)) + // #define THREAD_FUNC_ATTRIB_ALIGN_ARG // for debug : bad alignment in SSE functions +#else + #define THREAD_FUNC_ATTRIB_ALIGN_ARG +#endif + +#define THREAD_FUNC_DECL THREAD_FUNC_ATTRIB_ALIGN_ARG THREAD_FUNC_RET_TYPE THREAD_FUNC_CALL_TYPE + +typedef THREAD_FUNC_RET_TYPE (THREAD_FUNC_CALL_TYPE * THREAD_FUNC_TYPE)(void *); +WRes Thread_Create(CThread *p, THREAD_FUNC_TYPE func, LPVOID param); +WRes Thread_Create_With_Affinity(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, CAffinityMask affinity); +WRes Thread_Wait_Close(CThread *p); + +#ifdef _WIN32 +#define Thread_Create_With_CpuSet(p, func, param, cs) \ + Thread_Create_With_Affinity(p, func, param, *cs) +#else +WRes Thread_Create_With_CpuSet(CThread *p, THREAD_FUNC_TYPE func, LPVOID param, const CCpuSet *cpuSet); +#endif + + +#ifdef _WIN32 + +typedef HANDLE CEvent; +typedef CEvent CAutoResetEvent; +typedef CEvent CManualResetEvent; +#define Event_Construct(p) *(p) = NULL +#define Event_IsCreated(p) (*(p) != NULL) +#define Event_Close(p) HandlePtr_Close(p) +#define Event_Wait(p) Handle_WaitObject(*(p)) +WRes Event_Set(CEvent *p); +WRes Event_Reset(CEvent *p); +WRes ManualResetEvent_Create(CManualResetEvent *p, int signaled); +WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p); +WRes AutoResetEvent_Create(CAutoResetEvent *p, int signaled); +WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p); + +typedef HANDLE CSemaphore; +#define Semaphore_Construct(p) *(p) = NULL +#define Semaphore_IsCreated(p) (*(p) != NULL) +#define Semaphore_Close(p) HandlePtr_Close(p) +#define Semaphore_Wait(p) Handle_WaitObject(*(p)) +WRes Semaphore_Create(CSemaphore *p, UInt32 initCount, UInt32 maxCount); +WRes Semaphore_OptCreateInit(CSemaphore *p, UInt32 initCount, UInt32 maxCount); +WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 num); +WRes Semaphore_Release1(CSemaphore *p); + +typedef CRITICAL_SECTION CCriticalSection; +WRes CriticalSection_Init(CCriticalSection *p); +#define CriticalSection_Delete(p) DeleteCriticalSection(p) +#define CriticalSection_Enter(p) EnterCriticalSection(p) +#define CriticalSection_Leave(p) LeaveCriticalSection(p) + + +#else // _WIN32 + +typedef struct _CEvent +{ + int _created; + int _manual_reset; + int _state; + pthread_mutex_t _mutex; + pthread_cond_t _cond; +} CEvent; + +typedef CEvent CAutoResetEvent; +typedef CEvent CManualResetEvent; + +#define Event_Construct(p) (p)->_created = 0 +#define Event_IsCreated(p) ((p)->_created) + +WRes ManualResetEvent_Create(CManualResetEvent *p, int signaled); +WRes ManualResetEvent_CreateNotSignaled(CManualResetEvent *p); +WRes AutoResetEvent_Create(CAutoResetEvent *p, int signaled); +WRes AutoResetEvent_CreateNotSignaled(CAutoResetEvent *p); +WRes Event_Set(CEvent *p); +WRes Event_Reset(CEvent *p); +WRes Event_Wait(CEvent *p); +WRes Event_Close(CEvent *p); + + +typedef struct _CSemaphore +{ + int _created; + UInt32 _count; + UInt32 _maxCount; + pthread_mutex_t _mutex; + pthread_cond_t _cond; +} CSemaphore; + +#define Semaphore_Construct(p) (p)->_created = 0 +#define Semaphore_IsCreated(p) ((p)->_created) + +WRes Semaphore_Create(CSemaphore *p, UInt32 initCount, UInt32 maxCount); +WRes Semaphore_OptCreateInit(CSemaphore *p, UInt32 initCount, UInt32 maxCount); +WRes Semaphore_ReleaseN(CSemaphore *p, UInt32 num); +#define Semaphore_Release1(p) Semaphore_ReleaseN(p, 1) +WRes Semaphore_Wait(CSemaphore *p); +WRes Semaphore_Close(CSemaphore *p); + + +typedef struct _CCriticalSection +{ + pthread_mutex_t _mutex; +} CCriticalSection; + +WRes CriticalSection_Init(CCriticalSection *p); +void CriticalSection_Delete(CCriticalSection *cs); +void CriticalSection_Enter(CCriticalSection *cs); +void CriticalSection_Leave(CCriticalSection *cs); + +LONG InterlockedIncrement(LONG volatile *addend); + +#endif // _WIN32 + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/Util/7z/7z.dsp b/deps/LZMA-SDK/C/Util/7z/7z.dsp index d3bf0fe00..be0f0a743 100644 --- a/deps/LZMA-SDK/C/Util/7z/7z.dsp +++ b/deps/LZMA-SDK/C/Util/7z/7z.dsp @@ -1,241 +1,241 @@ -# Microsoft Developer Studio Project File - Name="7z" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=7z - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "7z.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "7z.mak" CFG="7z - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "7z - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "7z - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "7z - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MD /W4 /WX /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /FAcs /Yu"Precomp.h" /FD /c -# ADD BASE RSC /l 0x419 /d "NDEBUG" -# ADD RSC /l 0x419 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"c:\util\7zDec.exe" /opt:NOWIN98 -# SUBTRACT LINK32 /pdb:none - -!ELSEIF "$(CFG)" == "7z - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /W4 /WX /Gm /GX /ZI /Od /D "_DEBUG" /D "_SZ_ALLOC_DEBUG2" /D "_SZ_NO_INT_64_A" /D "WIN32" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Yu"Precomp.h" /FD /GZ /c -# ADD BASE RSC /l 0x419 /d "_DEBUG" -# ADD RSC /l 0x419 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"c:\util\7zDec.exe" /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "7z - Win32 Release" -# Name "7z - Win32 Debug" -# Begin Group "Common" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\..\7z.h -# End Source File -# Begin Source File - -SOURCE=..\..\7zAlloc.c -# End Source File -# Begin Source File - -SOURCE=..\..\7zAlloc.h -# End Source File -# Begin Source File - -SOURCE=..\..\7zArcIn.c -# End Source File -# Begin Source File - -SOURCE=..\..\7zBuf.c -# End Source File -# Begin Source File - -SOURCE=..\..\7zBuf.h -# End Source File -# Begin Source File - -SOURCE=..\..\7zCrc.c -# End Source File -# Begin Source File - -SOURCE=..\..\7zCrc.h -# End Source File -# Begin Source File - -SOURCE=..\..\7zCrcOpt.c -# End Source File -# Begin Source File - -SOURCE=..\..\7zDec.c -# ADD CPP /D "_7ZIP_PPMD_SUPPPORT" -# End Source File -# Begin Source File - -SOURCE=..\..\7zFile.c -# End Source File -# Begin Source File - -SOURCE=..\..\7zFile.h -# End Source File -# Begin Source File - -SOURCE=..\..\7zStream.c -# End Source File -# Begin Source File - -SOURCE=..\..\7zTypes.h -# End Source File -# Begin Source File - -SOURCE=..\..\Bcj2.c -# End Source File -# Begin Source File - -SOURCE=..\..\Bcj2.h -# End Source File -# Begin Source File - -SOURCE=..\..\Bra.c -# End Source File -# Begin Source File - -SOURCE=..\..\Bra.h -# End Source File -# Begin Source File - -SOURCE=..\..\Bra86.c -# End Source File -# Begin Source File - -SOURCE=..\..\BraIA64.c -# End Source File -# Begin Source File - -SOURCE=..\..\CpuArch.c -# End Source File -# Begin Source File - -SOURCE=..\..\CpuArch.h -# End Source File -# Begin Source File - -SOURCE=..\..\Delta.c -# End Source File -# Begin Source File - -SOURCE=..\..\Delta.h -# End Source File -# Begin Source File - -SOURCE=..\..\Lzma2Dec.c -# End Source File -# Begin Source File - -SOURCE=..\..\Lzma2Dec.h -# End Source File -# Begin Source File - -SOURCE=..\..\LzmaDec.c -# End Source File -# Begin Source File - -SOURCE=..\..\LzmaDec.h -# End Source File -# Begin Source File - -SOURCE=..\..\Ppmd.h -# End Source File -# Begin Source File - -SOURCE=..\..\Ppmd7.c -# End Source File -# Begin Source File - -SOURCE=..\..\Ppmd7.h -# End Source File -# Begin Source File - -SOURCE=..\..\Ppmd7Dec.c -# End Source File -# End Group -# Begin Group "Spec" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\..\Compiler.h -# End Source File -# Begin Source File - -SOURCE=.\Precomp.c -# ADD CPP /Yc"Precomp.h" -# End Source File -# Begin Source File - -SOURCE=.\Precomp.h -# End Source File -# End Group -# Begin Source File - -SOURCE=.\7zMain.c -# End Source File -# End Target -# End Project +# Microsoft Developer Studio Project File - Name="7z" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=7z - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "7z.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "7z.mak" CFG="7z - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "7z - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "7z - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "7z - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MD /W4 /WX /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /FAcs /Yu"Precomp.h" /FD /c +# ADD BASE RSC /l 0x419 /d "NDEBUG" +# ADD RSC /l 0x419 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"c:\util\7zDec.exe" /opt:NOWIN98 +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "7z - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W4 /WX /Gm /GX /ZI /Od /D "_DEBUG" /D "_SZ_ALLOC_DEBUG2" /D "_SZ_NO_INT_64_A" /D "WIN32" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Yu"Precomp.h" /FD /GZ /c +# ADD BASE RSC /l 0x419 /d "_DEBUG" +# ADD RSC /l 0x419 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"c:\util\7zDec.exe" /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "7z - Win32 Release" +# Name "7z - Win32 Debug" +# Begin Group "Common" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\7z.h +# End Source File +# Begin Source File + +SOURCE=..\..\7zAlloc.c +# End Source File +# Begin Source File + +SOURCE=..\..\7zAlloc.h +# End Source File +# Begin Source File + +SOURCE=..\..\7zArcIn.c +# End Source File +# Begin Source File + +SOURCE=..\..\7zBuf.c +# End Source File +# Begin Source File + +SOURCE=..\..\7zBuf.h +# End Source File +# Begin Source File + +SOURCE=..\..\7zCrc.c +# End Source File +# Begin Source File + +SOURCE=..\..\7zCrc.h +# End Source File +# Begin Source File + +SOURCE=..\..\7zCrcOpt.c +# End Source File +# Begin Source File + +SOURCE=..\..\7zDec.c +# ADD CPP /D "_7ZIP_PPMD_SUPPPORT" +# End Source File +# Begin Source File + +SOURCE=..\..\7zFile.c +# End Source File +# Begin Source File + +SOURCE=..\..\7zFile.h +# End Source File +# Begin Source File + +SOURCE=..\..\7zStream.c +# End Source File +# Begin Source File + +SOURCE=..\..\7zTypes.h +# End Source File +# Begin Source File + +SOURCE=..\..\Bcj2.c +# End Source File +# Begin Source File + +SOURCE=..\..\Bcj2.h +# End Source File +# Begin Source File + +SOURCE=..\..\Bra.c +# End Source File +# Begin Source File + +SOURCE=..\..\Bra.h +# End Source File +# Begin Source File + +SOURCE=..\..\Bra86.c +# End Source File +# Begin Source File + +SOURCE=..\..\BraIA64.c +# End Source File +# Begin Source File + +SOURCE=..\..\CpuArch.c +# End Source File +# Begin Source File + +SOURCE=..\..\CpuArch.h +# End Source File +# Begin Source File + +SOURCE=..\..\Delta.c +# End Source File +# Begin Source File + +SOURCE=..\..\Delta.h +# End Source File +# Begin Source File + +SOURCE=..\..\Lzma2Dec.c +# End Source File +# Begin Source File + +SOURCE=..\..\Lzma2Dec.h +# End Source File +# Begin Source File + +SOURCE=..\..\LzmaDec.c +# End Source File +# Begin Source File + +SOURCE=..\..\LzmaDec.h +# End Source File +# Begin Source File + +SOURCE=..\..\Ppmd.h +# End Source File +# Begin Source File + +SOURCE=..\..\Ppmd7.c +# End Source File +# Begin Source File + +SOURCE=..\..\Ppmd7.h +# End Source File +# Begin Source File + +SOURCE=..\..\Ppmd7Dec.c +# End Source File +# End Group +# Begin Group "Spec" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\Compiler.h +# End Source File +# Begin Source File + +SOURCE=.\Precomp.c +# ADD CPP /Yc"Precomp.h" +# End Source File +# Begin Source File + +SOURCE=.\Precomp.h +# End Source File +# End Group +# Begin Source File + +SOURCE=.\7zMain.c +# End Source File +# End Target +# End Project diff --git a/deps/LZMA-SDK/C/Util/7z/7z.dsw b/deps/LZMA-SDK/C/Util/7z/7z.dsw index 23089fb79..848d13cb1 100644 --- a/deps/LZMA-SDK/C/Util/7z/7z.dsw +++ b/deps/LZMA-SDK/C/Util/7z/7z.dsw @@ -1,29 +1,29 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "7z"=.\7z.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "7z"=.\7z.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/deps/LZMA-SDK/C/Util/7z/7zMain.c b/deps/LZMA-SDK/C/Util/7z/7zMain.c index 3ab63a3d9..9d555098e 100644 --- a/deps/LZMA-SDK/C/Util/7z/7zMain.c +++ b/deps/LZMA-SDK/C/Util/7z/7zMain.c @@ -1,887 +1,887 @@ -/* 7zMain.c - Test application for 7z Decoder -2021-04-29 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include -#include - -#include "../../CpuArch.h" - -#include "../../7z.h" -#include "../../7zAlloc.h" -#include "../../7zBuf.h" -#include "../../7zCrc.h" -#include "../../7zFile.h" -#include "../../7zVersion.h" - -#ifndef USE_WINDOWS_FILE -/* for mkdir */ -#ifdef _WIN32 -#include -#else -#include -#include -#ifdef __GNUC__ -#include -#endif -#include -// #include -#include -#include -#endif -#endif - - -#define kInputBufSize ((size_t)1 << 18) - -static const ISzAlloc g_Alloc = { SzAlloc, SzFree }; - - -static void Print(const char *s) -{ - fputs(s, stdout); -} - - -static int Buf_EnsureSize(CBuf *dest, size_t size) -{ - if (dest->size >= size) - return 1; - Buf_Free(dest, &g_Alloc); - return Buf_Create(dest, size, &g_Alloc); -} - -#ifndef _WIN32 -#define _USE_UTF8 -#endif - -/* #define _USE_UTF8 */ - -#ifdef _USE_UTF8 - -#define _UTF8_START(n) (0x100 - (1 << (7 - (n)))) - -#define _UTF8_RANGE(n) (((UInt32)1) << ((n) * 5 + 6)) - -#define _UTF8_HEAD(n, val) ((Byte)(_UTF8_START(n) + (val >> (6 * (n))))) -#define _UTF8_CHAR(n, val) ((Byte)(0x80 + (((val) >> (6 * (n))) & 0x3F))) - -static size_t Utf16_To_Utf8_Calc(const UInt16 *src, const UInt16 *srcLim) -{ - size_t size = 0; - for (;;) - { - UInt32 val; - if (src == srcLim) - return size; - - size++; - val = *src++; - - if (val < 0x80) - continue; - - if (val < _UTF8_RANGE(1)) - { - size++; - continue; - } - - if (val >= 0xD800 && val < 0xDC00 && src != srcLim) - { - UInt32 c2 = *src; - if (c2 >= 0xDC00 && c2 < 0xE000) - { - src++; - size += 3; - continue; - } - } - - size += 2; - } -} - -static Byte *Utf16_To_Utf8(Byte *dest, const UInt16 *src, const UInt16 *srcLim) -{ - for (;;) - { - UInt32 val; - if (src == srcLim) - return dest; - - val = *src++; - - if (val < 0x80) - { - *dest++ = (Byte)val; - continue; - } - - if (val < _UTF8_RANGE(1)) - { - dest[0] = _UTF8_HEAD(1, val); - dest[1] = _UTF8_CHAR(0, val); - dest += 2; - continue; - } - - if (val >= 0xD800 && val < 0xDC00 && src != srcLim) - { - UInt32 c2 = *src; - if (c2 >= 0xDC00 && c2 < 0xE000) - { - src++; - val = (((val - 0xD800) << 10) | (c2 - 0xDC00)) + 0x10000; - dest[0] = _UTF8_HEAD(3, val); - dest[1] = _UTF8_CHAR(2, val); - dest[2] = _UTF8_CHAR(1, val); - dest[3] = _UTF8_CHAR(0, val); - dest += 4; - continue; - } - } - - dest[0] = _UTF8_HEAD(2, val); - dest[1] = _UTF8_CHAR(1, val); - dest[2] = _UTF8_CHAR(0, val); - dest += 3; - } -} - -static SRes Utf16_To_Utf8Buf(CBuf *dest, const UInt16 *src, size_t srcLen) -{ - size_t destLen = Utf16_To_Utf8_Calc(src, src + srcLen); - destLen += 1; - if (!Buf_EnsureSize(dest, destLen)) - return SZ_ERROR_MEM; - *Utf16_To_Utf8(dest->data, src, src + srcLen) = 0; - return SZ_OK; -} - -#endif - -static SRes Utf16_To_Char(CBuf *buf, const UInt16 *s - #ifndef _USE_UTF8 - , UINT codePage - #endif - ) -{ - unsigned len = 0; - for (len = 0; s[len] != 0; len++) {} - - #ifndef _USE_UTF8 - { - const unsigned size = len * 3 + 100; - if (!Buf_EnsureSize(buf, size)) - return SZ_ERROR_MEM; - { - buf->data[0] = 0; - if (len != 0) - { - const char defaultChar = '_'; - BOOL defUsed; - const unsigned numChars = (unsigned)WideCharToMultiByte( - codePage, 0, (LPCWSTR)s, (int)len, (char *)buf->data, (int)size, &defaultChar, &defUsed); - if (numChars == 0 || numChars >= size) - return SZ_ERROR_FAIL; - buf->data[numChars] = 0; - } - return SZ_OK; - } - } - #else - return Utf16_To_Utf8Buf(buf, s, len); - #endif -} - -#ifdef _WIN32 - #ifndef USE_WINDOWS_FILE - static UINT g_FileCodePage = CP_ACP; - #define MY_FILE_CODE_PAGE_PARAM ,g_FileCodePage - #endif -#else - #define MY_FILE_CODE_PAGE_PARAM -#endif - -static WRes MyCreateDir(const UInt16 *name) -{ - #ifdef USE_WINDOWS_FILE - - return CreateDirectoryW((LPCWSTR)name, NULL) ? 0 : GetLastError(); - - #else - - CBuf buf; - WRes res; - Buf_Init(&buf); - RINOK(Utf16_To_Char(&buf, name MY_FILE_CODE_PAGE_PARAM)); - - res = - #ifdef _WIN32 - _mkdir((const char *)buf.data) - #else - mkdir((const char *)buf.data, 0777) - #endif - == 0 ? 0 : errno; - Buf_Free(&buf, &g_Alloc); - return res; - - #endif -} - -static WRes OutFile_OpenUtf16(CSzFile *p, const UInt16 *name) -{ - #ifdef USE_WINDOWS_FILE - return OutFile_OpenW(p, (LPCWSTR)name); - #else - CBuf buf; - WRes res; - Buf_Init(&buf); - RINOK(Utf16_To_Char(&buf, name MY_FILE_CODE_PAGE_PARAM)); - res = OutFile_Open(p, (const char *)buf.data); - Buf_Free(&buf, &g_Alloc); - return res; - #endif -} - - -static SRes PrintString(const UInt16 *s) -{ - CBuf buf; - SRes res; - Buf_Init(&buf); - res = Utf16_To_Char(&buf, s - #ifndef _USE_UTF8 - , CP_OEMCP - #endif - ); - if (res == SZ_OK) - Print((const char *)buf.data); - Buf_Free(&buf, &g_Alloc); - return res; -} - -static void UInt64ToStr(UInt64 value, char *s, int numDigits) -{ - char temp[32]; - int pos = 0; - do - { - temp[pos++] = (char)('0' + (unsigned)(value % 10)); - value /= 10; - } - while (value != 0); - - for (numDigits -= pos; numDigits > 0; numDigits--) - *s++ = ' '; - - do - *s++ = temp[--pos]; - while (pos); - *s = '\0'; -} - -static char *UIntToStr(char *s, unsigned value, int numDigits) -{ - char temp[16]; - int pos = 0; - do - temp[pos++] = (char)('0' + (value % 10)); - while (value /= 10); - - for (numDigits -= pos; numDigits > 0; numDigits--) - *s++ = '0'; - - do - *s++ = temp[--pos]; - while (pos); - *s = '\0'; - return s; -} - -static void UIntToStr_2(char *s, unsigned value) -{ - s[0] = (char)('0' + (value / 10)); - s[1] = (char)('0' + (value % 10)); -} - - -#define PERIOD_4 (4 * 365 + 1) -#define PERIOD_100 (PERIOD_4 * 25 - 1) -#define PERIOD_400 (PERIOD_100 * 4 + 1) - - - -#ifndef _WIN32 - -// MS uses long for BOOL, but long is 32-bit in MS. So we use int. -// typedef long BOOL; -typedef int BOOL; - -typedef struct _FILETIME -{ - DWORD dwLowDateTime; - DWORD dwHighDateTime; -} FILETIME; - -static LONG TIME_GetBias() -{ - time_t utc = time(NULL); - struct tm *ptm = localtime(&utc); - int localdaylight = ptm->tm_isdst; /* daylight for local timezone */ - ptm = gmtime(&utc); - ptm->tm_isdst = localdaylight; /* use local daylight, not that of Greenwich */ - LONG bias = (int)(mktime(ptm)-utc); - return bias; -} - -#define TICKS_PER_SEC 10000000 - -#define GET_TIME_64(pft) ((pft)->dwLowDateTime | ((UInt64)(pft)->dwHighDateTime << 32)) - -#define SET_FILETIME(ft, v64) \ - (ft)->dwLowDateTime = (DWORD)v64; \ - (ft)->dwHighDateTime = (DWORD)(v64 >> 32); - -#define WINAPI -#define TRUE 1 - -static BOOL WINAPI FileTimeToLocalFileTime(const FILETIME *fileTime, FILETIME *localFileTime) -{ - UInt64 v = GET_TIME_64(fileTime); - v = (UInt64)((Int64)v - (Int64)TIME_GetBias() * TICKS_PER_SEC); - SET_FILETIME(localFileTime, v); - return TRUE; -} - -static const UInt32 kNumTimeQuantumsInSecond = 10000000; -static const UInt32 kFileTimeStartYear = 1601; -static const UInt32 kUnixTimeStartYear = 1970; -static const UInt64 kUnixTimeOffset = - (UInt64)60 * 60 * 24 * (89 + 365 * (kUnixTimeStartYear - kFileTimeStartYear)); - -static Int64 Time_FileTimeToUnixTime64(const FILETIME *ft) -{ - UInt64 winTime = GET_TIME_64(ft); - return (Int64)(winTime / kNumTimeQuantumsInSecond) - (Int64)kUnixTimeOffset; -} - -#if defined(_AIX) - #define MY_ST_TIMESPEC st_timespec -#else - #define MY_ST_TIMESPEC timespec -#endif - -static void FILETIME_To_timespec(const FILETIME *ft, struct MY_ST_TIMESPEC *ts) -{ - if (ft) - { - const Int64 sec = Time_FileTimeToUnixTime64(ft); - // time_t is long - const time_t sec2 = (time_t)sec; - if (sec2 == sec) - { - ts->tv_sec = sec2; - UInt64 winTime = GET_TIME_64(ft); - ts->tv_nsec = (long)((winTime % 10000000) * 100);; - return; - } - } - // else - { - ts->tv_sec = 0; - // ts.tv_nsec = UTIME_NOW; // set to the current time - ts->tv_nsec = UTIME_OMIT; // keep old timesptamp - } -} - -static WRes Set_File_FILETIME(const UInt16 *name, const FILETIME *mTime) -{ - struct timespec times[2]; - - const int flags = 0; // follow link - // = AT_SYMLINK_NOFOLLOW; // don't follow link - - CBuf buf; - int res; - Buf_Init(&buf); - RINOK(Utf16_To_Char(&buf, name MY_FILE_CODE_PAGE_PARAM)); - FILETIME_To_timespec(NULL, ×[0]); - FILETIME_To_timespec(mTime, ×[1]); - res = utimensat(AT_FDCWD, (const char *)buf.data, times, flags); - Buf_Free(&buf, &g_Alloc); - if (res == 0) - return 0; - return errno; -} - -#endif - -static void NtfsFileTime_to_FILETIME(const CNtfsFileTime *t, FILETIME *ft) -{ - ft->dwLowDateTime = (DWORD)(t->Low); - ft->dwHighDateTime = (DWORD)(t->High); -} - -static void ConvertFileTimeToString(const CNtfsFileTime *nTime, char *s) -{ - unsigned year, mon, hour, min, sec; - Byte ms[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; - unsigned t; - UInt32 v; - // UInt64 v64 = nt->Low | ((UInt64)nt->High << 32); - UInt64 v64; - { - FILETIME fileTime, locTime; - NtfsFileTime_to_FILETIME(nTime, &fileTime); - if (!FileTimeToLocalFileTime(&fileTime, &locTime)) - { - locTime.dwHighDateTime = - locTime.dwLowDateTime = 0; - } - v64 = locTime.dwLowDateTime | ((UInt64)locTime.dwHighDateTime << 32); - } - v64 /= 10000000; - sec = (unsigned)(v64 % 60); v64 /= 60; - min = (unsigned)(v64 % 60); v64 /= 60; - hour = (unsigned)(v64 % 24); v64 /= 24; - - v = (UInt32)v64; - - year = (unsigned)(1601 + v / PERIOD_400 * 400); - v %= PERIOD_400; - - t = v / PERIOD_100; if (t == 4) t = 3; year += t * 100; v -= t * PERIOD_100; - t = v / PERIOD_4; if (t == 25) t = 24; year += t * 4; v -= t * PERIOD_4; - t = v / 365; if (t == 4) t = 3; year += t; v -= t * 365; - - if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) - ms[1] = 29; - for (mon = 0;; mon++) - { - unsigned d = ms[mon]; - if (v < d) - break; - v -= d; - } - s = UIntToStr(s, year, 4); *s++ = '-'; - UIntToStr_2(s, mon + 1); s[2] = '-'; s += 3; - UIntToStr_2(s, (unsigned)v + 1); s[2] = ' '; s += 3; - UIntToStr_2(s, hour); s[2] = ':'; s += 3; - UIntToStr_2(s, min); s[2] = ':'; s += 3; - UIntToStr_2(s, sec); s[2] = 0; -} - -static void PrintLF() -{ - Print("\n"); -} - -static void PrintError(char *s) -{ - Print("\nERROR: "); - Print(s); - PrintLF(); -} - -static void PrintError_WRes(const char *message, WRes wres) -{ - Print("\nERROR: "); - Print(message); - PrintLF(); - { - char s[32]; - UIntToStr(s, (unsigned)wres, 1); - Print("System error code: "); - Print(s); - } - // sprintf(buffer + strlen(buffer), "\nSystem error code: %d", (unsigned)wres); - #ifdef _WIN32 - { - char *s = NULL; - if (FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, wres, 0, (LPSTR) &s, 0, NULL) != 0 && s) - { - Print(" : "); - Print(s); - LocalFree(s); - } - } - #else - { - const char *s = strerror(wres); - if (s) - { - Print(" : "); - Print(s); - } - } - #endif - PrintLF(); -} - -static void GetAttribString(UInt32 wa, BoolInt isDir, char *s) -{ - #ifdef USE_WINDOWS_FILE - s[0] = (char)(((wa & FILE_ATTRIBUTE_DIRECTORY) != 0 || isDir) ? 'D' : '.'); - s[1] = (char)(((wa & FILE_ATTRIBUTE_READONLY ) != 0) ? 'R': '.'); - s[2] = (char)(((wa & FILE_ATTRIBUTE_HIDDEN ) != 0) ? 'H': '.'); - s[3] = (char)(((wa & FILE_ATTRIBUTE_SYSTEM ) != 0) ? 'S': '.'); - s[4] = (char)(((wa & FILE_ATTRIBUTE_ARCHIVE ) != 0) ? 'A': '.'); - s[5] = 0; - #else - s[0] = (char)(((wa & (1 << 4)) != 0 || isDir) ? 'D' : '.'); - s[1] = 0; - #endif -} - - -// #define NUM_PARENTS_MAX 128 - -int MY_CDECL main(int numargs, char *args[]) -{ - ISzAlloc allocImp; - ISzAlloc allocTempImp; - - CFileInStream archiveStream; - CLookToRead2 lookStream; - CSzArEx db; - SRes res; - UInt16 *temp = NULL; - size_t tempSize = 0; - // UInt32 parents[NUM_PARENTS_MAX]; - - Print("\n7z Decoder " MY_VERSION_CPU " : " MY_COPYRIGHT_DATE "\n\n"); - - if (numargs == 1) - { - Print( - "Usage: 7zDec \n\n" - "\n" - " e: Extract files from archive (without using directory names)\n" - " l: List contents of archive\n" - " t: Test integrity of archive\n" - " x: eXtract files with full paths\n"); - return 0; - } - - if (numargs < 3) - { - PrintError("incorrect command"); - return 1; - } - - #if defined(_WIN32) && !defined(USE_WINDOWS_FILE) && !defined(UNDER_CE) - g_FileCodePage = AreFileApisANSI() ? CP_ACP : CP_OEMCP; - #endif - - - allocImp = g_Alloc; - allocTempImp = g_Alloc; - - { - WRes wres = - #ifdef UNDER_CE - InFile_OpenW(&archiveStream.file, L"\test.7z"); // change it - #else - InFile_Open(&archiveStream.file, args[2]); - #endif - if (wres != 0) - { - PrintError_WRes("cannot open input file", wres); - return 1; - } - } - - FileInStream_CreateVTable(&archiveStream); - archiveStream.wres = 0; - LookToRead2_CreateVTable(&lookStream, False); - lookStream.buf = NULL; - - res = SZ_OK; - - { - lookStream.buf = (Byte *)ISzAlloc_Alloc(&allocImp, kInputBufSize); - if (!lookStream.buf) - res = SZ_ERROR_MEM; - else - { - lookStream.bufSize = kInputBufSize; - lookStream.realStream = &archiveStream.vt; - LookToRead2_Init(&lookStream); - } - } - - CrcGenerateTable(); - - SzArEx_Init(&db); - - if (res == SZ_OK) - { - res = SzArEx_Open(&db, &lookStream.vt, &allocImp, &allocTempImp); - } - - if (res == SZ_OK) - { - char *command = args[1]; - int listCommand = 0, testCommand = 0, fullPaths = 0; - - if (strcmp(command, "l") == 0) listCommand = 1; - else if (strcmp(command, "t") == 0) testCommand = 1; - else if (strcmp(command, "e") == 0) { } - else if (strcmp(command, "x") == 0) { fullPaths = 1; } - else - { - PrintError("incorrect command"); - res = SZ_ERROR_FAIL; - } - - if (res == SZ_OK) - { - UInt32 i; - - /* - if you need cache, use these 3 variables. - if you use external function, you can make these variable as static. - */ - UInt32 blockIndex = 0xFFFFFFFF; /* it can have any value before first call (if outBuffer = 0) */ - Byte *outBuffer = 0; /* it must be 0 before first call for each new archive. */ - size_t outBufferSize = 0; /* it can have any value before first call (if outBuffer = 0) */ - - for (i = 0; i < db.NumFiles; i++) - { - size_t offset = 0; - size_t outSizeProcessed = 0; - // const CSzFileItem *f = db.Files + i; - size_t len; - const BoolInt isDir = SzArEx_IsDir(&db, i); - if (listCommand == 0 && isDir && !fullPaths) - continue; - len = SzArEx_GetFileNameUtf16(&db, i, NULL); - // len = SzArEx_GetFullNameLen(&db, i); - - if (len > tempSize) - { - SzFree(NULL, temp); - tempSize = len; - temp = (UInt16 *)SzAlloc(NULL, tempSize * sizeof(temp[0])); - if (!temp) - { - res = SZ_ERROR_MEM; - break; - } - } - - SzArEx_GetFileNameUtf16(&db, i, temp); - /* - if (SzArEx_GetFullNameUtf16_Back(&db, i, temp + len) != temp) - { - res = SZ_ERROR_FAIL; - break; - } - */ - - if (listCommand) - { - char attr[8], s[32], t[32]; - UInt64 fileSize; - - GetAttribString(SzBitWithVals_Check(&db.Attribs, i) ? db.Attribs.Vals[i] : 0, isDir, attr); - - fileSize = SzArEx_GetFileSize(&db, i); - UInt64ToStr(fileSize, s, 10); - - if (SzBitWithVals_Check(&db.MTime, i)) - ConvertFileTimeToString(&db.MTime.Vals[i], t); - else - { - size_t j; - for (j = 0; j < 19; j++) - t[j] = ' '; - t[j] = '\0'; - } - - Print(t); - Print(" "); - Print(attr); - Print(" "); - Print(s); - Print(" "); - res = PrintString(temp); - if (res != SZ_OK) - break; - if (isDir) - Print("/"); - PrintLF(); - continue; - } - - Print(testCommand ? - "T ": - "- "); - res = PrintString(temp); - if (res != SZ_OK) - break; - - if (isDir) - Print("/"); - else - { - res = SzArEx_Extract(&db, &lookStream.vt, i, - &blockIndex, &outBuffer, &outBufferSize, - &offset, &outSizeProcessed, - &allocImp, &allocTempImp); - if (res != SZ_OK) - break; - } - - if (!testCommand) - { - CSzFile outFile; - size_t processedSize; - size_t j; - UInt16 *name = (UInt16 *)temp; - const UInt16 *destPath = (const UInt16 *)name; - - for (j = 0; name[j] != 0; j++) - if (name[j] == '/') - { - if (fullPaths) - { - name[j] = 0; - MyCreateDir(name); - name[j] = CHAR_PATH_SEPARATOR; - } - else - destPath = name + j + 1; - } - - if (isDir) - { - MyCreateDir(destPath); - PrintLF(); - continue; - } - else - { - WRes wres = OutFile_OpenUtf16(&outFile, destPath); - if (wres != 0) - { - PrintError_WRes("cannot open output file", wres); - res = SZ_ERROR_FAIL; - break; - } - } - - processedSize = outSizeProcessed; - - { - WRes wres = File_Write(&outFile, outBuffer + offset, &processedSize); - if (wres != 0 || processedSize != outSizeProcessed) - { - PrintError_WRes("cannot write output file", wres); - res = SZ_ERROR_FAIL; - break; - } - } - - { - FILETIME mtime; - FILETIME *mtimePtr = NULL; - - #ifdef USE_WINDOWS_FILE - FILETIME ctime; - FILETIME *ctimePtr = NULL; - #endif - - if (SzBitWithVals_Check(&db.MTime, i)) - { - const CNtfsFileTime *t = &db.MTime.Vals[i]; - mtime.dwLowDateTime = (DWORD)(t->Low); - mtime.dwHighDateTime = (DWORD)(t->High); - mtimePtr = &mtime; - } - - #ifdef USE_WINDOWS_FILE - if (SzBitWithVals_Check(&db.CTime, i)) - { - const CNtfsFileTime *t = &db.CTime.Vals[i]; - ctime.dwLowDateTime = (DWORD)(t->Low); - ctime.dwHighDateTime = (DWORD)(t->High); - ctimePtr = &ctime; - } - - if (mtimePtr || ctimePtr) - SetFileTime(outFile.handle, ctimePtr, NULL, mtimePtr); - #endif - - { - WRes wres = File_Close(&outFile); - if (wres != 0) - { - PrintError_WRes("cannot close output file", wres); - res = SZ_ERROR_FAIL; - break; - } - } - - #ifndef USE_WINDOWS_FILE - #ifdef _WIN32 - mtimePtr = mtimePtr; - #else - if (mtimePtr) - Set_File_FILETIME(destPath, mtimePtr); - #endif - #endif - } - - #ifdef USE_WINDOWS_FILE - if (SzBitWithVals_Check(&db.Attribs, i)) - { - UInt32 attrib = db.Attribs.Vals[i]; - /* p7zip stores posix attributes in high 16 bits and adds 0x8000 as marker. - We remove posix bits, if we detect posix mode field */ - if ((attrib & 0xF0000000) != 0) - attrib &= 0x7FFF; - SetFileAttributesW((LPCWSTR)destPath, attrib); - } - #endif - } - PrintLF(); - } - ISzAlloc_Free(&allocImp, outBuffer); - } - } - - SzFree(NULL, temp); - SzArEx_Free(&db, &allocImp); - ISzAlloc_Free(&allocImp, lookStream.buf); - - File_Close(&archiveStream.file); - - if (res == SZ_OK) - { - Print("\nEverything is Ok\n"); - return 0; - } - - if (res == SZ_ERROR_UNSUPPORTED) - PrintError("decoder doesn't support this archive"); - else if (res == SZ_ERROR_MEM) - PrintError("cannot allocate memory"); - else if (res == SZ_ERROR_CRC) - PrintError("CRC error"); - else if (res == SZ_ERROR_READ /* || archiveStream.Res != 0 */) - PrintError_WRes("Read Error", archiveStream.wres); - else - { - char s[32]; - UInt64ToStr((unsigned)res, s, 0); - PrintError(s); - } - - return 1; -} +/* 7zMain.c - Test application for 7z Decoder +2021-04-29 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include +#include + +#include "../../CpuArch.h" + +#include "../../7z.h" +#include "../../7zAlloc.h" +#include "../../7zBuf.h" +#include "../../7zCrc.h" +#include "../../7zFile.h" +#include "../../7zVersion.h" + +#ifndef USE_WINDOWS_FILE +/* for mkdir */ +#ifdef _WIN32 +#include +#else +#include +#include +#ifdef __GNUC__ +#include +#endif +#include +// #include +#include +#include +#endif +#endif + + +#define kInputBufSize ((size_t)1 << 18) + +static const ISzAlloc g_Alloc = { SzAlloc, SzFree }; + + +static void Print(const char *s) +{ + fputs(s, stdout); +} + + +static int Buf_EnsureSize(CBuf *dest, size_t size) +{ + if (dest->size >= size) + return 1; + Buf_Free(dest, &g_Alloc); + return Buf_Create(dest, size, &g_Alloc); +} + +#ifndef _WIN32 +#define _USE_UTF8 +#endif + +/* #define _USE_UTF8 */ + +#ifdef _USE_UTF8 + +#define _UTF8_START(n) (0x100 - (1 << (7 - (n)))) + +#define _UTF8_RANGE(n) (((UInt32)1) << ((n) * 5 + 6)) + +#define _UTF8_HEAD(n, val) ((Byte)(_UTF8_START(n) + (val >> (6 * (n))))) +#define _UTF8_CHAR(n, val) ((Byte)(0x80 + (((val) >> (6 * (n))) & 0x3F))) + +static size_t Utf16_To_Utf8_Calc(const UInt16 *src, const UInt16 *srcLim) +{ + size_t size = 0; + for (;;) + { + UInt32 val; + if (src == srcLim) + return size; + + size++; + val = *src++; + + if (val < 0x80) + continue; + + if (val < _UTF8_RANGE(1)) + { + size++; + continue; + } + + if (val >= 0xD800 && val < 0xDC00 && src != srcLim) + { + UInt32 c2 = *src; + if (c2 >= 0xDC00 && c2 < 0xE000) + { + src++; + size += 3; + continue; + } + } + + size += 2; + } +} + +static Byte *Utf16_To_Utf8(Byte *dest, const UInt16 *src, const UInt16 *srcLim) +{ + for (;;) + { + UInt32 val; + if (src == srcLim) + return dest; + + val = *src++; + + if (val < 0x80) + { + *dest++ = (Byte)val; + continue; + } + + if (val < _UTF8_RANGE(1)) + { + dest[0] = _UTF8_HEAD(1, val); + dest[1] = _UTF8_CHAR(0, val); + dest += 2; + continue; + } + + if (val >= 0xD800 && val < 0xDC00 && src != srcLim) + { + UInt32 c2 = *src; + if (c2 >= 0xDC00 && c2 < 0xE000) + { + src++; + val = (((val - 0xD800) << 10) | (c2 - 0xDC00)) + 0x10000; + dest[0] = _UTF8_HEAD(3, val); + dest[1] = _UTF8_CHAR(2, val); + dest[2] = _UTF8_CHAR(1, val); + dest[3] = _UTF8_CHAR(0, val); + dest += 4; + continue; + } + } + + dest[0] = _UTF8_HEAD(2, val); + dest[1] = _UTF8_CHAR(1, val); + dest[2] = _UTF8_CHAR(0, val); + dest += 3; + } +} + +static SRes Utf16_To_Utf8Buf(CBuf *dest, const UInt16 *src, size_t srcLen) +{ + size_t destLen = Utf16_To_Utf8_Calc(src, src + srcLen); + destLen += 1; + if (!Buf_EnsureSize(dest, destLen)) + return SZ_ERROR_MEM; + *Utf16_To_Utf8(dest->data, src, src + srcLen) = 0; + return SZ_OK; +} + +#endif + +static SRes Utf16_To_Char(CBuf *buf, const UInt16 *s + #ifndef _USE_UTF8 + , UINT codePage + #endif + ) +{ + unsigned len = 0; + for (len = 0; s[len] != 0; len++) {} + + #ifndef _USE_UTF8 + { + const unsigned size = len * 3 + 100; + if (!Buf_EnsureSize(buf, size)) + return SZ_ERROR_MEM; + { + buf->data[0] = 0; + if (len != 0) + { + const char defaultChar = '_'; + BOOL defUsed; + const unsigned numChars = (unsigned)WideCharToMultiByte( + codePage, 0, (LPCWSTR)s, (int)len, (char *)buf->data, (int)size, &defaultChar, &defUsed); + if (numChars == 0 || numChars >= size) + return SZ_ERROR_FAIL; + buf->data[numChars] = 0; + } + return SZ_OK; + } + } + #else + return Utf16_To_Utf8Buf(buf, s, len); + #endif +} + +#ifdef _WIN32 + #ifndef USE_WINDOWS_FILE + static UINT g_FileCodePage = CP_ACP; + #define MY_FILE_CODE_PAGE_PARAM ,g_FileCodePage + #endif +#else + #define MY_FILE_CODE_PAGE_PARAM +#endif + +static WRes MyCreateDir(const UInt16 *name) +{ + #ifdef USE_WINDOWS_FILE + + return CreateDirectoryW((LPCWSTR)name, NULL) ? 0 : GetLastError(); + + #else + + CBuf buf; + WRes res; + Buf_Init(&buf); + RINOK(Utf16_To_Char(&buf, name MY_FILE_CODE_PAGE_PARAM)); + + res = + #ifdef _WIN32 + _mkdir((const char *)buf.data) + #else + mkdir((const char *)buf.data, 0777) + #endif + == 0 ? 0 : errno; + Buf_Free(&buf, &g_Alloc); + return res; + + #endif +} + +static WRes OutFile_OpenUtf16(CSzFile *p, const UInt16 *name) +{ + #ifdef USE_WINDOWS_FILE + return OutFile_OpenW(p, (LPCWSTR)name); + #else + CBuf buf; + WRes res; + Buf_Init(&buf); + RINOK(Utf16_To_Char(&buf, name MY_FILE_CODE_PAGE_PARAM)); + res = OutFile_Open(p, (const char *)buf.data); + Buf_Free(&buf, &g_Alloc); + return res; + #endif +} + + +static SRes PrintString(const UInt16 *s) +{ + CBuf buf; + SRes res; + Buf_Init(&buf); + res = Utf16_To_Char(&buf, s + #ifndef _USE_UTF8 + , CP_OEMCP + #endif + ); + if (res == SZ_OK) + Print((const char *)buf.data); + Buf_Free(&buf, &g_Alloc); + return res; +} + +static void UInt64ToStr(UInt64 value, char *s, int numDigits) +{ + char temp[32]; + int pos = 0; + do + { + temp[pos++] = (char)('0' + (unsigned)(value % 10)); + value /= 10; + } + while (value != 0); + + for (numDigits -= pos; numDigits > 0; numDigits--) + *s++ = ' '; + + do + *s++ = temp[--pos]; + while (pos); + *s = '\0'; +} + +static char *UIntToStr(char *s, unsigned value, int numDigits) +{ + char temp[16]; + int pos = 0; + do + temp[pos++] = (char)('0' + (value % 10)); + while (value /= 10); + + for (numDigits -= pos; numDigits > 0; numDigits--) + *s++ = '0'; + + do + *s++ = temp[--pos]; + while (pos); + *s = '\0'; + return s; +} + +static void UIntToStr_2(char *s, unsigned value) +{ + s[0] = (char)('0' + (value / 10)); + s[1] = (char)('0' + (value % 10)); +} + + +#define PERIOD_4 (4 * 365 + 1) +#define PERIOD_100 (PERIOD_4 * 25 - 1) +#define PERIOD_400 (PERIOD_100 * 4 + 1) + + + +#ifndef _WIN32 + +// MS uses long for BOOL, but long is 32-bit in MS. So we use int. +// typedef long BOOL; +typedef int BOOL; + +typedef struct _FILETIME +{ + DWORD dwLowDateTime; + DWORD dwHighDateTime; +} FILETIME; + +static LONG TIME_GetBias() +{ + time_t utc = time(NULL); + struct tm *ptm = localtime(&utc); + int localdaylight = ptm->tm_isdst; /* daylight for local timezone */ + ptm = gmtime(&utc); + ptm->tm_isdst = localdaylight; /* use local daylight, not that of Greenwich */ + LONG bias = (int)(mktime(ptm)-utc); + return bias; +} + +#define TICKS_PER_SEC 10000000 + +#define GET_TIME_64(pft) ((pft)->dwLowDateTime | ((UInt64)(pft)->dwHighDateTime << 32)) + +#define SET_FILETIME(ft, v64) \ + (ft)->dwLowDateTime = (DWORD)v64; \ + (ft)->dwHighDateTime = (DWORD)(v64 >> 32); + +#define WINAPI +#define TRUE 1 + +static BOOL WINAPI FileTimeToLocalFileTime(const FILETIME *fileTime, FILETIME *localFileTime) +{ + UInt64 v = GET_TIME_64(fileTime); + v = (UInt64)((Int64)v - (Int64)TIME_GetBias() * TICKS_PER_SEC); + SET_FILETIME(localFileTime, v); + return TRUE; +} + +static const UInt32 kNumTimeQuantumsInSecond = 10000000; +static const UInt32 kFileTimeStartYear = 1601; +static const UInt32 kUnixTimeStartYear = 1970; +static const UInt64 kUnixTimeOffset = + (UInt64)60 * 60 * 24 * (89 + 365 * (kUnixTimeStartYear - kFileTimeStartYear)); + +static Int64 Time_FileTimeToUnixTime64(const FILETIME *ft) +{ + UInt64 winTime = GET_TIME_64(ft); + return (Int64)(winTime / kNumTimeQuantumsInSecond) - (Int64)kUnixTimeOffset; +} + +#if defined(_AIX) + #define MY_ST_TIMESPEC st_timespec +#else + #define MY_ST_TIMESPEC timespec +#endif + +static void FILETIME_To_timespec(const FILETIME *ft, struct MY_ST_TIMESPEC *ts) +{ + if (ft) + { + const Int64 sec = Time_FileTimeToUnixTime64(ft); + // time_t is long + const time_t sec2 = (time_t)sec; + if (sec2 == sec) + { + ts->tv_sec = sec2; + UInt64 winTime = GET_TIME_64(ft); + ts->tv_nsec = (long)((winTime % 10000000) * 100);; + return; + } + } + // else + { + ts->tv_sec = 0; + // ts.tv_nsec = UTIME_NOW; // set to the current time + ts->tv_nsec = UTIME_OMIT; // keep old timesptamp + } +} + +static WRes Set_File_FILETIME(const UInt16 *name, const FILETIME *mTime) +{ + struct timespec times[2]; + + const int flags = 0; // follow link + // = AT_SYMLINK_NOFOLLOW; // don't follow link + + CBuf buf; + int res; + Buf_Init(&buf); + RINOK(Utf16_To_Char(&buf, name MY_FILE_CODE_PAGE_PARAM)); + FILETIME_To_timespec(NULL, ×[0]); + FILETIME_To_timespec(mTime, ×[1]); + res = utimensat(AT_FDCWD, (const char *)buf.data, times, flags); + Buf_Free(&buf, &g_Alloc); + if (res == 0) + return 0; + return errno; +} + +#endif + +static void NtfsFileTime_to_FILETIME(const CNtfsFileTime *t, FILETIME *ft) +{ + ft->dwLowDateTime = (DWORD)(t->Low); + ft->dwHighDateTime = (DWORD)(t->High); +} + +static void ConvertFileTimeToString(const CNtfsFileTime *nTime, char *s) +{ + unsigned year, mon, hour, min, sec; + Byte ms[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + unsigned t; + UInt32 v; + // UInt64 v64 = nt->Low | ((UInt64)nt->High << 32); + UInt64 v64; + { + FILETIME fileTime, locTime; + NtfsFileTime_to_FILETIME(nTime, &fileTime); + if (!FileTimeToLocalFileTime(&fileTime, &locTime)) + { + locTime.dwHighDateTime = + locTime.dwLowDateTime = 0; + } + v64 = locTime.dwLowDateTime | ((UInt64)locTime.dwHighDateTime << 32); + } + v64 /= 10000000; + sec = (unsigned)(v64 % 60); v64 /= 60; + min = (unsigned)(v64 % 60); v64 /= 60; + hour = (unsigned)(v64 % 24); v64 /= 24; + + v = (UInt32)v64; + + year = (unsigned)(1601 + v / PERIOD_400 * 400); + v %= PERIOD_400; + + t = v / PERIOD_100; if (t == 4) t = 3; year += t * 100; v -= t * PERIOD_100; + t = v / PERIOD_4; if (t == 25) t = 24; year += t * 4; v -= t * PERIOD_4; + t = v / 365; if (t == 4) t = 3; year += t; v -= t * 365; + + if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) + ms[1] = 29; + for (mon = 0;; mon++) + { + unsigned d = ms[mon]; + if (v < d) + break; + v -= d; + } + s = UIntToStr(s, year, 4); *s++ = '-'; + UIntToStr_2(s, mon + 1); s[2] = '-'; s += 3; + UIntToStr_2(s, (unsigned)v + 1); s[2] = ' '; s += 3; + UIntToStr_2(s, hour); s[2] = ':'; s += 3; + UIntToStr_2(s, min); s[2] = ':'; s += 3; + UIntToStr_2(s, sec); s[2] = 0; +} + +static void PrintLF() +{ + Print("\n"); +} + +static void PrintError(char *s) +{ + Print("\nERROR: "); + Print(s); + PrintLF(); +} + +static void PrintError_WRes(const char *message, WRes wres) +{ + Print("\nERROR: "); + Print(message); + PrintLF(); + { + char s[32]; + UIntToStr(s, (unsigned)wres, 1); + Print("System error code: "); + Print(s); + } + // sprintf(buffer + strlen(buffer), "\nSystem error code: %d", (unsigned)wres); + #ifdef _WIN32 + { + char *s = NULL; + if (FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, wres, 0, (LPSTR) &s, 0, NULL) != 0 && s) + { + Print(" : "); + Print(s); + LocalFree(s); + } + } + #else + { + const char *s = strerror(wres); + if (s) + { + Print(" : "); + Print(s); + } + } + #endif + PrintLF(); +} + +static void GetAttribString(UInt32 wa, BoolInt isDir, char *s) +{ + #ifdef USE_WINDOWS_FILE + s[0] = (char)(((wa & FILE_ATTRIBUTE_DIRECTORY) != 0 || isDir) ? 'D' : '.'); + s[1] = (char)(((wa & FILE_ATTRIBUTE_READONLY ) != 0) ? 'R': '.'); + s[2] = (char)(((wa & FILE_ATTRIBUTE_HIDDEN ) != 0) ? 'H': '.'); + s[3] = (char)(((wa & FILE_ATTRIBUTE_SYSTEM ) != 0) ? 'S': '.'); + s[4] = (char)(((wa & FILE_ATTRIBUTE_ARCHIVE ) != 0) ? 'A': '.'); + s[5] = 0; + #else + s[0] = (char)(((wa & (1 << 4)) != 0 || isDir) ? 'D' : '.'); + s[1] = 0; + #endif +} + + +// #define NUM_PARENTS_MAX 128 + +int MY_CDECL main(int numargs, char *args[]) +{ + ISzAlloc allocImp; + ISzAlloc allocTempImp; + + CFileInStream archiveStream; + CLookToRead2 lookStream; + CSzArEx db; + SRes res; + UInt16 *temp = NULL; + size_t tempSize = 0; + // UInt32 parents[NUM_PARENTS_MAX]; + + Print("\n7z Decoder " MY_VERSION_CPU " : " MY_COPYRIGHT_DATE "\n\n"); + + if (numargs == 1) + { + Print( + "Usage: 7zDec \n\n" + "\n" + " e: Extract files from archive (without using directory names)\n" + " l: List contents of archive\n" + " t: Test integrity of archive\n" + " x: eXtract files with full paths\n"); + return 0; + } + + if (numargs < 3) + { + PrintError("incorrect command"); + return 1; + } + + #if defined(_WIN32) && !defined(USE_WINDOWS_FILE) && !defined(UNDER_CE) + g_FileCodePage = AreFileApisANSI() ? CP_ACP : CP_OEMCP; + #endif + + + allocImp = g_Alloc; + allocTempImp = g_Alloc; + + { + WRes wres = + #ifdef UNDER_CE + InFile_OpenW(&archiveStream.file, L"\test.7z"); // change it + #else + InFile_Open(&archiveStream.file, args[2]); + #endif + if (wres != 0) + { + PrintError_WRes("cannot open input file", wres); + return 1; + } + } + + FileInStream_CreateVTable(&archiveStream); + archiveStream.wres = 0; + LookToRead2_CreateVTable(&lookStream, False); + lookStream.buf = NULL; + + res = SZ_OK; + + { + lookStream.buf = (Byte *)ISzAlloc_Alloc(&allocImp, kInputBufSize); + if (!lookStream.buf) + res = SZ_ERROR_MEM; + else + { + lookStream.bufSize = kInputBufSize; + lookStream.realStream = &archiveStream.vt; + LookToRead2_Init(&lookStream); + } + } + + CrcGenerateTable(); + + SzArEx_Init(&db); + + if (res == SZ_OK) + { + res = SzArEx_Open(&db, &lookStream.vt, &allocImp, &allocTempImp); + } + + if (res == SZ_OK) + { + char *command = args[1]; + int listCommand = 0, testCommand = 0, fullPaths = 0; + + if (strcmp(command, "l") == 0) listCommand = 1; + else if (strcmp(command, "t") == 0) testCommand = 1; + else if (strcmp(command, "e") == 0) { } + else if (strcmp(command, "x") == 0) { fullPaths = 1; } + else + { + PrintError("incorrect command"); + res = SZ_ERROR_FAIL; + } + + if (res == SZ_OK) + { + UInt32 i; + + /* + if you need cache, use these 3 variables. + if you use external function, you can make these variable as static. + */ + UInt32 blockIndex = 0xFFFFFFFF; /* it can have any value before first call (if outBuffer = 0) */ + Byte *outBuffer = 0; /* it must be 0 before first call for each new archive. */ + size_t outBufferSize = 0; /* it can have any value before first call (if outBuffer = 0) */ + + for (i = 0; i < db.NumFiles; i++) + { + size_t offset = 0; + size_t outSizeProcessed = 0; + // const CSzFileItem *f = db.Files + i; + size_t len; + const BoolInt isDir = SzArEx_IsDir(&db, i); + if (listCommand == 0 && isDir && !fullPaths) + continue; + len = SzArEx_GetFileNameUtf16(&db, i, NULL); + // len = SzArEx_GetFullNameLen(&db, i); + + if (len > tempSize) + { + SzFree(NULL, temp); + tempSize = len; + temp = (UInt16 *)SzAlloc(NULL, tempSize * sizeof(temp[0])); + if (!temp) + { + res = SZ_ERROR_MEM; + break; + } + } + + SzArEx_GetFileNameUtf16(&db, i, temp); + /* + if (SzArEx_GetFullNameUtf16_Back(&db, i, temp + len) != temp) + { + res = SZ_ERROR_FAIL; + break; + } + */ + + if (listCommand) + { + char attr[8], s[32], t[32]; + UInt64 fileSize; + + GetAttribString(SzBitWithVals_Check(&db.Attribs, i) ? db.Attribs.Vals[i] : 0, isDir, attr); + + fileSize = SzArEx_GetFileSize(&db, i); + UInt64ToStr(fileSize, s, 10); + + if (SzBitWithVals_Check(&db.MTime, i)) + ConvertFileTimeToString(&db.MTime.Vals[i], t); + else + { + size_t j; + for (j = 0; j < 19; j++) + t[j] = ' '; + t[j] = '\0'; + } + + Print(t); + Print(" "); + Print(attr); + Print(" "); + Print(s); + Print(" "); + res = PrintString(temp); + if (res != SZ_OK) + break; + if (isDir) + Print("/"); + PrintLF(); + continue; + } + + Print(testCommand ? + "T ": + "- "); + res = PrintString(temp); + if (res != SZ_OK) + break; + + if (isDir) + Print("/"); + else + { + res = SzArEx_Extract(&db, &lookStream.vt, i, + &blockIndex, &outBuffer, &outBufferSize, + &offset, &outSizeProcessed, + &allocImp, &allocTempImp); + if (res != SZ_OK) + break; + } + + if (!testCommand) + { + CSzFile outFile; + size_t processedSize; + size_t j; + UInt16 *name = (UInt16 *)temp; + const UInt16 *destPath = (const UInt16 *)name; + + for (j = 0; name[j] != 0; j++) + if (name[j] == '/') + { + if (fullPaths) + { + name[j] = 0; + MyCreateDir(name); + name[j] = CHAR_PATH_SEPARATOR; + } + else + destPath = name + j + 1; + } + + if (isDir) + { + MyCreateDir(destPath); + PrintLF(); + continue; + } + else + { + WRes wres = OutFile_OpenUtf16(&outFile, destPath); + if (wres != 0) + { + PrintError_WRes("cannot open output file", wres); + res = SZ_ERROR_FAIL; + break; + } + } + + processedSize = outSizeProcessed; + + { + WRes wres = File_Write(&outFile, outBuffer + offset, &processedSize); + if (wres != 0 || processedSize != outSizeProcessed) + { + PrintError_WRes("cannot write output file", wres); + res = SZ_ERROR_FAIL; + break; + } + } + + { + FILETIME mtime; + FILETIME *mtimePtr = NULL; + + #ifdef USE_WINDOWS_FILE + FILETIME ctime; + FILETIME *ctimePtr = NULL; + #endif + + if (SzBitWithVals_Check(&db.MTime, i)) + { + const CNtfsFileTime *t = &db.MTime.Vals[i]; + mtime.dwLowDateTime = (DWORD)(t->Low); + mtime.dwHighDateTime = (DWORD)(t->High); + mtimePtr = &mtime; + } + + #ifdef USE_WINDOWS_FILE + if (SzBitWithVals_Check(&db.CTime, i)) + { + const CNtfsFileTime *t = &db.CTime.Vals[i]; + ctime.dwLowDateTime = (DWORD)(t->Low); + ctime.dwHighDateTime = (DWORD)(t->High); + ctimePtr = &ctime; + } + + if (mtimePtr || ctimePtr) + SetFileTime(outFile.handle, ctimePtr, NULL, mtimePtr); + #endif + + { + WRes wres = File_Close(&outFile); + if (wres != 0) + { + PrintError_WRes("cannot close output file", wres); + res = SZ_ERROR_FAIL; + break; + } + } + + #ifndef USE_WINDOWS_FILE + #ifdef _WIN32 + mtimePtr = mtimePtr; + #else + if (mtimePtr) + Set_File_FILETIME(destPath, mtimePtr); + #endif + #endif + } + + #ifdef USE_WINDOWS_FILE + if (SzBitWithVals_Check(&db.Attribs, i)) + { + UInt32 attrib = db.Attribs.Vals[i]; + /* p7zip stores posix attributes in high 16 bits and adds 0x8000 as marker. + We remove posix bits, if we detect posix mode field */ + if ((attrib & 0xF0000000) != 0) + attrib &= 0x7FFF; + SetFileAttributesW((LPCWSTR)destPath, attrib); + } + #endif + } + PrintLF(); + } + ISzAlloc_Free(&allocImp, outBuffer); + } + } + + SzFree(NULL, temp); + SzArEx_Free(&db, &allocImp); + ISzAlloc_Free(&allocImp, lookStream.buf); + + File_Close(&archiveStream.file); + + if (res == SZ_OK) + { + Print("\nEverything is Ok\n"); + return 0; + } + + if (res == SZ_ERROR_UNSUPPORTED) + PrintError("decoder doesn't support this archive"); + else if (res == SZ_ERROR_MEM) + PrintError("cannot allocate memory"); + else if (res == SZ_ERROR_CRC) + PrintError("CRC error"); + else if (res == SZ_ERROR_READ /* || archiveStream.Res != 0 */) + PrintError_WRes("Read Error", archiveStream.wres); + else + { + char s[32]; + UInt64ToStr((unsigned)res, s, 0); + PrintError(s); + } + + return 1; +} diff --git a/deps/LZMA-SDK/C/Util/7z/Precomp.c b/deps/LZMA-SDK/C/Util/7z/Precomp.c index 34b60f8fc..01605e3c2 100644 --- a/deps/LZMA-SDK/C/Util/7z/Precomp.c +++ b/deps/LZMA-SDK/C/Util/7z/Precomp.c @@ -1,4 +1,4 @@ -/* Precomp.c -- StdAfx -2013-01-21 : Igor Pavlov : Public domain */ - -#include "Precomp.h" +/* Precomp.c -- StdAfx +2013-01-21 : Igor Pavlov : Public domain */ + +#include "Precomp.h" diff --git a/deps/LZMA-SDK/C/Util/7z/Precomp.h b/deps/LZMA-SDK/C/Util/7z/Precomp.h index 9f398d08f..588a66f7e 100644 --- a/deps/LZMA-SDK/C/Util/7z/Precomp.h +++ b/deps/LZMA-SDK/C/Util/7z/Precomp.h @@ -1,10 +1,10 @@ -/* Precomp.h -- StdAfx -2013-06-16 : Igor Pavlov : Public domain */ - -#ifndef __7Z_PRECOMP_H -#define __7Z_PRECOMP_H - -#include "../../Compiler.h" -#include "../../7zTypes.h" - -#endif +/* Precomp.h -- StdAfx +2013-06-16 : Igor Pavlov : Public domain */ + +#ifndef __7Z_PRECOMP_H +#define __7Z_PRECOMP_H + +#include "../../Compiler.h" +#include "../../7zTypes.h" + +#endif diff --git a/deps/LZMA-SDK/C/Util/7z/makefile b/deps/LZMA-SDK/C/Util/7z/makefile index f4a54af73..9a49fd515 100644 --- a/deps/LZMA-SDK/C/Util/7z/makefile +++ b/deps/LZMA-SDK/C/Util/7z/makefile @@ -1,40 +1,40 @@ -CFLAGS = $(CFLAGS) -D_7ZIP_PPMD_SUPPPORT - -PROG = 7zDec.exe - -C_OBJS = \ - $O\7zAlloc.obj \ - $O\7zBuf.obj \ - $O\7zCrc.obj \ - $O\7zCrcOpt.obj \ - $O\7zFile.obj \ - $O\7zDec.obj \ - $O\7zArcIn.obj \ - $O\7zStream.obj \ - $O\Bcj2.obj \ - $O\Bra.obj \ - $O\Bra86.obj \ - $O\BraIA64.obj \ - $O\CpuArch.obj \ - $O\Delta.obj \ - $O\Lzma2Dec.obj \ - $O\LzmaDec.obj \ - $O\Ppmd7.obj \ - $O\Ppmd7Dec.obj \ - -7Z_OBJS = \ - $O\7zMain.obj \ - -OBJS = \ - $O\Precomp.obj \ - $(7Z_OBJS) \ - $(C_OBJS) \ - -!include "../../../CPP/Build.mak" - -$(7Z_OBJS): $(*B).c - $(CCOMPL_USE) -$(C_OBJS): ../../$(*B).c - $(CCOMPL_USE) -$O\Precomp.obj: Precomp.c - $(CCOMPL_PCH) +CFLAGS = $(CFLAGS) -D_7ZIP_PPMD_SUPPPORT + +PROG = 7zDec.exe + +C_OBJS = \ + $O\7zAlloc.obj \ + $O\7zBuf.obj \ + $O\7zCrc.obj \ + $O\7zCrcOpt.obj \ + $O\7zFile.obj \ + $O\7zDec.obj \ + $O\7zArcIn.obj \ + $O\7zStream.obj \ + $O\Bcj2.obj \ + $O\Bra.obj \ + $O\Bra86.obj \ + $O\BraIA64.obj \ + $O\CpuArch.obj \ + $O\Delta.obj \ + $O\Lzma2Dec.obj \ + $O\LzmaDec.obj \ + $O\Ppmd7.obj \ + $O\Ppmd7Dec.obj \ + +7Z_OBJS = \ + $O\7zMain.obj \ + +OBJS = \ + $O\Precomp.obj \ + $(7Z_OBJS) \ + $(C_OBJS) \ + +!include "../../../CPP/Build.mak" + +$(7Z_OBJS): $(*B).c + $(CCOMPL_USE) +$(C_OBJS): ../../$(*B).c + $(CCOMPL_USE) +$O\Precomp.obj: Precomp.c + $(CCOMPL_PCH) diff --git a/deps/LZMA-SDK/C/Util/7z/makefile.gcc b/deps/LZMA-SDK/C/Util/7z/makefile.gcc index d6ef9b2a7..4263d6755 100644 --- a/deps/LZMA-SDK/C/Util/7z/makefile.gcc +++ b/deps/LZMA-SDK/C/Util/7z/makefile.gcc @@ -1,34 +1,34 @@ -PROG = 7zdec - -LOCAL_FLAGS = -D_7ZIP_PPMD_SUPPPORT - -include ../../../CPP/7zip/LzmaDec_gcc.mak - - -OBJS = \ - $(LZMA_DEC_OPT_OBJS) \ - $O/Bcj2.o \ - $O/Bra.o \ - $O/Bra86.o \ - $O/BraIA64.o \ - $O/CpuArch.o \ - $O/Delta.o \ - $O/Lzma2Dec.o \ - $O/LzmaDec.o \ - $O/Ppmd7.o \ - $O/Ppmd7Dec.o \ - $O/7zCrc.o \ - $O/7zCrcOpt.o \ - $O/Sha256.o \ - $O/Sha256Opt.o \ - $O/7zAlloc.o \ - $O/7zArcIn.o \ - $O/7zBuf.o \ - $O/7zBuf2.o \ - $O/7zDec.o \ - $O/7zMain.o \ - $O/7zFile.o \ - $O/7zStream.o \ - - -include ../../7zip_gcc_c.mak +PROG = 7zdec + +LOCAL_FLAGS = -D_7ZIP_PPMD_SUPPPORT + +include ../../../CPP/7zip/LzmaDec_gcc.mak + + +OBJS = \ + $(LZMA_DEC_OPT_OBJS) \ + $O/Bcj2.o \ + $O/Bra.o \ + $O/Bra86.o \ + $O/BraIA64.o \ + $O/CpuArch.o \ + $O/Delta.o \ + $O/Lzma2Dec.o \ + $O/LzmaDec.o \ + $O/Ppmd7.o \ + $O/Ppmd7Dec.o \ + $O/7zCrc.o \ + $O/7zCrcOpt.o \ + $O/Sha256.o \ + $O/Sha256Opt.o \ + $O/7zAlloc.o \ + $O/7zArcIn.o \ + $O/7zBuf.o \ + $O/7zBuf2.o \ + $O/7zDec.o \ + $O/7zMain.o \ + $O/7zFile.o \ + $O/7zStream.o \ + + +include ../../7zip_gcc_c.mak diff --git a/deps/LZMA-SDK/C/Util/Lzma/LzmaUtil.c b/deps/LZMA-SDK/C/Util/Lzma/LzmaUtil.c index 6b4293e33..62a59079f 100644 --- a/deps/LZMA-SDK/C/Util/Lzma/LzmaUtil.c +++ b/deps/LZMA-SDK/C/Util/Lzma/LzmaUtil.c @@ -1,283 +1,286 @@ -/* LzmaUtil.c -- Test application for LZMA compression -2021-02-15 : Igor Pavlov : Public domain */ - -#include "../../Precomp.h" - -#include -#include -#include - -#include "../../CpuArch.h" - -#include "../../Alloc.h" -#include "../../7zFile.h" -#include "../../7zVersion.h" -#include "../../LzmaDec.h" -#include "../../LzmaEnc.h" - -static const char * const kCantReadMessage = "Cannot read input file"; -static const char * const kCantWriteMessage = "Cannot write output file"; -static const char * const kCantAllocateMessage = "Cannot allocate memory"; -static const char * const kDataErrorMessage = "Data error"; - -static void PrintHelp(char *buffer) -{ - strcat(buffer, - "\nLZMA-C " MY_VERSION_CPU " : " MY_COPYRIGHT_DATE "\n\n" - "Usage: lzma inputFile outputFile\n" - " e: encode file\n" - " d: decode file\n"); -} - -static int PrintError(char *buffer, const char *message) -{ - strcat(buffer, "\nError: "); - strcat(buffer, message); - strcat(buffer, "\n"); - return 1; -} - -static int PrintError_WRes(char *buffer, const char *message, WRes wres) -{ - strcat(buffer, "\nError: "); - strcat(buffer, message); - sprintf(buffer + strlen(buffer), "\nSystem error code: %d", (unsigned)wres); - #ifndef _WIN32 - { - const char *s = strerror(wres); - if (s) - sprintf(buffer + strlen(buffer), " : %s", s); - } - #endif - strcat(buffer, "\n"); - return 1; -} - -static int PrintErrorNumber(char *buffer, SRes val) -{ - sprintf(buffer + strlen(buffer), "\n7-Zip error code: %d\n", (unsigned)val); - return 1; -} - -static int PrintUserError(char *buffer) -{ - return PrintError(buffer, "Incorrect command"); -} - - -#define IN_BUF_SIZE (1 << 16) -#define OUT_BUF_SIZE (1 << 16) - - -static SRes Decode2(CLzmaDec *state, ISeqOutStream *outStream, ISeqInStream *inStream, - UInt64 unpackSize) -{ - int thereIsSize = (unpackSize != (UInt64)(Int64)-1); - Byte inBuf[IN_BUF_SIZE]; - Byte outBuf[OUT_BUF_SIZE]; - size_t inPos = 0, inSize = 0, outPos = 0; - LzmaDec_Init(state); - for (;;) - { - if (inPos == inSize) - { - inSize = IN_BUF_SIZE; - RINOK(inStream->Read(inStream, inBuf, &inSize)); - inPos = 0; - } - { - SRes res; - SizeT inProcessed = inSize - inPos; - SizeT outProcessed = OUT_BUF_SIZE - outPos; - ELzmaFinishMode finishMode = LZMA_FINISH_ANY; - ELzmaStatus status; - if (thereIsSize && outProcessed > unpackSize) - { - outProcessed = (SizeT)unpackSize; - finishMode = LZMA_FINISH_END; - } - - res = LzmaDec_DecodeToBuf(state, outBuf + outPos, &outProcessed, - inBuf + inPos, &inProcessed, finishMode, &status); - inPos += inProcessed; - outPos += outProcessed; - unpackSize -= outProcessed; - - if (outStream) - if (outStream->Write(outStream, outBuf, outPos) != outPos) - return SZ_ERROR_WRITE; - - outPos = 0; - - if (res != SZ_OK || (thereIsSize && unpackSize == 0)) - return res; - - if (inProcessed == 0 && outProcessed == 0) - { - if (thereIsSize || status != LZMA_STATUS_FINISHED_WITH_MARK) - return SZ_ERROR_DATA; - return res; - } - } - } -} - - -static SRes Decode(ISeqOutStream *outStream, ISeqInStream *inStream) -{ - UInt64 unpackSize; - int i; - SRes res = 0; - - CLzmaDec state; - - /* header: 5 bytes of LZMA properties and 8 bytes of uncompressed size */ - unsigned char header[LZMA_PROPS_SIZE + 8]; - - /* Read and parse header */ - - RINOK(SeqInStream_Read(inStream, header, sizeof(header))); - - unpackSize = 0; - for (i = 0; i < 8; i++) - unpackSize += (UInt64)header[LZMA_PROPS_SIZE + i] << (i * 8); - - LzmaDec_Construct(&state); - RINOK(LzmaDec_Allocate(&state, header, LZMA_PROPS_SIZE, &g_Alloc)); - res = Decode2(&state, outStream, inStream, unpackSize); - LzmaDec_Free(&state, &g_Alloc); - return res; -} - -static SRes Encode(ISeqOutStream *outStream, ISeqInStream *inStream, UInt64 fileSize, char *rs) -{ - CLzmaEncHandle enc; - SRes res; - CLzmaEncProps props; - - UNUSED_VAR(rs); - - enc = LzmaEnc_Create(&g_Alloc); - if (enc == 0) - return SZ_ERROR_MEM; - - LzmaEncProps_Init(&props); - res = LzmaEnc_SetProps(enc, &props); - - if (res == SZ_OK) - { - Byte header[LZMA_PROPS_SIZE + 8]; - size_t headerSize = LZMA_PROPS_SIZE; - int i; - - res = LzmaEnc_WriteProperties(enc, header, &headerSize); - for (i = 0; i < 8; i++) - header[headerSize++] = (Byte)(fileSize >> (8 * i)); - if (outStream->Write(outStream, header, headerSize) != headerSize) - res = SZ_ERROR_WRITE; - else - { - if (res == SZ_OK) - res = LzmaEnc_Encode(enc, outStream, inStream, NULL, &g_Alloc, &g_Alloc); - } - } - LzmaEnc_Destroy(enc, &g_Alloc, &g_Alloc); - return res; -} - - -static int main2(int numArgs, const char *args[], char *rs) -{ - CFileSeqInStream inStream; - CFileOutStream outStream; - char c; - int res; - int encodeMode; - BoolInt useOutFile = False; - - FileSeqInStream_CreateVTable(&inStream); - File_Construct(&inStream.file); - inStream.wres = 0; - - FileOutStream_CreateVTable(&outStream); - File_Construct(&outStream.file); - outStream.wres = 0; - - if (numArgs == 1) - { - PrintHelp(rs); - return 0; - } - - if (numArgs < 3 || numArgs > 4 || strlen(args[1]) != 1) - return PrintUserError(rs); - - c = args[1][0]; - encodeMode = (c == 'e' || c == 'E'); - if (!encodeMode && c != 'd' && c != 'D') - return PrintUserError(rs); - - { - size_t t4 = sizeof(UInt32); - size_t t8 = sizeof(UInt64); - if (t4 != 4 || t8 != 8) - return PrintError(rs, "Incorrect UInt32 or UInt64"); - } - - { - WRes wres = InFile_Open(&inStream.file, args[2]); - if (wres != 0) - return PrintError_WRes(rs, "Cannot open input file", wres); - } - - if (numArgs > 3) - { - WRes wres; - useOutFile = True; - wres = OutFile_Open(&outStream.file, args[3]); - if (wres != 0) - return PrintError_WRes(rs, "Cannot open output file", wres); - } - else if (encodeMode) - PrintUserError(rs); - - if (encodeMode) - { - UInt64 fileSize; - WRes wres = File_GetLength(&inStream.file, &fileSize); - if (wres != 0) - return PrintError_WRes(rs, "Cannot get file length", wres); - res = Encode(&outStream.vt, &inStream.vt, fileSize, rs); - } - else - { - res = Decode(&outStream.vt, useOutFile ? &inStream.vt : NULL); - } - - if (useOutFile) - File_Close(&outStream.file); - File_Close(&inStream.file); - - if (res != SZ_OK) - { - if (res == SZ_ERROR_MEM) - return PrintError(rs, kCantAllocateMessage); - else if (res == SZ_ERROR_DATA) - return PrintError(rs, kDataErrorMessage); - else if (res == SZ_ERROR_WRITE) - return PrintError_WRes(rs, kCantWriteMessage, outStream.wres); - else if (res == SZ_ERROR_READ) - return PrintError_WRes(rs, kCantReadMessage, inStream.wres); - return PrintErrorNumber(rs, res); - } - return 0; -} - - -int MY_CDECL main(int numArgs, const char *args[]) -{ - char rs[800] = { 0 }; - int res = main2(numArgs, args, rs); - fputs(rs, stdout); - return res; -} +/* LzmaUtil.c -- Test application for LZMA compression +2021-11-01 : Igor Pavlov : Public domain */ + +#include "../../Precomp.h" + +#include +#include +#include + +#include "../../CpuArch.h" + +#include "../../Alloc.h" +#include "../../7zFile.h" +#include "../../7zVersion.h" +#include "../../LzFind.h" +#include "../../LzmaDec.h" +#include "../../LzmaEnc.h" + +static const char * const kCantReadMessage = "Cannot read input file"; +static const char * const kCantWriteMessage = "Cannot write output file"; +static const char * const kCantAllocateMessage = "Cannot allocate memory"; +static const char * const kDataErrorMessage = "Data error"; + +static void PrintHelp(char *buffer) +{ + strcat(buffer, + "\nLZMA-C " MY_VERSION_CPU " : " MY_COPYRIGHT_DATE "\n\n" + "Usage: lzma inputFile outputFile\n" + " e: encode file\n" + " d: decode file\n"); +} + +static int PrintError(char *buffer, const char *message) +{ + strcat(buffer, "\nError: "); + strcat(buffer, message); + strcat(buffer, "\n"); + return 1; +} + +static int PrintError_WRes(char *buffer, const char *message, WRes wres) +{ + strcat(buffer, "\nError: "); + strcat(buffer, message); + sprintf(buffer + strlen(buffer), "\nSystem error code: %d", (unsigned)wres); + #ifndef _WIN32 + { + const char *s = strerror(wres); + if (s) + sprintf(buffer + strlen(buffer), " : %s", s); + } + #endif + strcat(buffer, "\n"); + return 1; +} + +static int PrintErrorNumber(char *buffer, SRes val) +{ + sprintf(buffer + strlen(buffer), "\n7-Zip error code: %d\n", (unsigned)val); + return 1; +} + +static int PrintUserError(char *buffer) +{ + return PrintError(buffer, "Incorrect command"); +} + + +#define IN_BUF_SIZE (1 << 16) +#define OUT_BUF_SIZE (1 << 16) + + +static SRes Decode2(CLzmaDec *state, ISeqOutStream *outStream, ISeqInStream *inStream, + UInt64 unpackSize) +{ + int thereIsSize = (unpackSize != (UInt64)(Int64)-1); + Byte inBuf[IN_BUF_SIZE]; + Byte outBuf[OUT_BUF_SIZE]; + size_t inPos = 0, inSize = 0, outPos = 0; + LzmaDec_Init(state); + for (;;) + { + if (inPos == inSize) + { + inSize = IN_BUF_SIZE; + RINOK(inStream->Read(inStream, inBuf, &inSize)); + inPos = 0; + } + { + SRes res; + SizeT inProcessed = inSize - inPos; + SizeT outProcessed = OUT_BUF_SIZE - outPos; + ELzmaFinishMode finishMode = LZMA_FINISH_ANY; + ELzmaStatus status; + if (thereIsSize && outProcessed > unpackSize) + { + outProcessed = (SizeT)unpackSize; + finishMode = LZMA_FINISH_END; + } + + res = LzmaDec_DecodeToBuf(state, outBuf + outPos, &outProcessed, + inBuf + inPos, &inProcessed, finishMode, &status); + inPos += inProcessed; + outPos += outProcessed; + unpackSize -= outProcessed; + + if (outStream) + if (outStream->Write(outStream, outBuf, outPos) != outPos) + return SZ_ERROR_WRITE; + + outPos = 0; + + if (res != SZ_OK || (thereIsSize && unpackSize == 0)) + return res; + + if (inProcessed == 0 && outProcessed == 0) + { + if (thereIsSize || status != LZMA_STATUS_FINISHED_WITH_MARK) + return SZ_ERROR_DATA; + return res; + } + } + } +} + + +static SRes Decode(ISeqOutStream *outStream, ISeqInStream *inStream) +{ + UInt64 unpackSize; + int i; + SRes res = 0; + + CLzmaDec state; + + /* header: 5 bytes of LZMA properties and 8 bytes of uncompressed size */ + unsigned char header[LZMA_PROPS_SIZE + 8]; + + /* Read and parse header */ + + RINOK(SeqInStream_Read(inStream, header, sizeof(header))); + + unpackSize = 0; + for (i = 0; i < 8; i++) + unpackSize += (UInt64)header[LZMA_PROPS_SIZE + i] << (i * 8); + + LzmaDec_Construct(&state); + RINOK(LzmaDec_Allocate(&state, header, LZMA_PROPS_SIZE, &g_Alloc)); + res = Decode2(&state, outStream, inStream, unpackSize); + LzmaDec_Free(&state, &g_Alloc); + return res; +} + +static SRes Encode(ISeqOutStream *outStream, ISeqInStream *inStream, UInt64 fileSize, char *rs) +{ + CLzmaEncHandle enc; + SRes res; + CLzmaEncProps props; + + UNUSED_VAR(rs); + + enc = LzmaEnc_Create(&g_Alloc); + if (enc == 0) + return SZ_ERROR_MEM; + + LzmaEncProps_Init(&props); + res = LzmaEnc_SetProps(enc, &props); + + if (res == SZ_OK) + { + Byte header[LZMA_PROPS_SIZE + 8]; + size_t headerSize = LZMA_PROPS_SIZE; + int i; + + res = LzmaEnc_WriteProperties(enc, header, &headerSize); + for (i = 0; i < 8; i++) + header[headerSize++] = (Byte)(fileSize >> (8 * i)); + if (outStream->Write(outStream, header, headerSize) != headerSize) + res = SZ_ERROR_WRITE; + else + { + if (res == SZ_OK) + res = LzmaEnc_Encode(enc, outStream, inStream, NULL, &g_Alloc, &g_Alloc); + } + } + LzmaEnc_Destroy(enc, &g_Alloc, &g_Alloc); + return res; +} + + +static int main2(int numArgs, const char *args[], char *rs) +{ + CFileSeqInStream inStream; + CFileOutStream outStream; + char c; + int res; + int encodeMode; + BoolInt useOutFile = False; + + LzFindPrepare(); + + FileSeqInStream_CreateVTable(&inStream); + File_Construct(&inStream.file); + inStream.wres = 0; + + FileOutStream_CreateVTable(&outStream); + File_Construct(&outStream.file); + outStream.wres = 0; + + if (numArgs == 1) + { + PrintHelp(rs); + return 0; + } + + if (numArgs < 3 || numArgs > 4 || strlen(args[1]) != 1) + return PrintUserError(rs); + + c = args[1][0]; + encodeMode = (c == 'e' || c == 'E'); + if (!encodeMode && c != 'd' && c != 'D') + return PrintUserError(rs); + + { + size_t t4 = sizeof(UInt32); + size_t t8 = sizeof(UInt64); + if (t4 != 4 || t8 != 8) + return PrintError(rs, "Incorrect UInt32 or UInt64"); + } + + { + WRes wres = InFile_Open(&inStream.file, args[2]); + if (wres != 0) + return PrintError_WRes(rs, "Cannot open input file", wres); + } + + if (numArgs > 3) + { + WRes wres; + useOutFile = True; + wres = OutFile_Open(&outStream.file, args[3]); + if (wres != 0) + return PrintError_WRes(rs, "Cannot open output file", wres); + } + else if (encodeMode) + PrintUserError(rs); + + if (encodeMode) + { + UInt64 fileSize; + WRes wres = File_GetLength(&inStream.file, &fileSize); + if (wres != 0) + return PrintError_WRes(rs, "Cannot get file length", wres); + res = Encode(&outStream.vt, &inStream.vt, fileSize, rs); + } + else + { + res = Decode(&outStream.vt, useOutFile ? &inStream.vt : NULL); + } + + if (useOutFile) + File_Close(&outStream.file); + File_Close(&inStream.file); + + if (res != SZ_OK) + { + if (res == SZ_ERROR_MEM) + return PrintError(rs, kCantAllocateMessage); + else if (res == SZ_ERROR_DATA) + return PrintError(rs, kDataErrorMessage); + else if (res == SZ_ERROR_WRITE) + return PrintError_WRes(rs, kCantWriteMessage, outStream.wres); + else if (res == SZ_ERROR_READ) + return PrintError_WRes(rs, kCantReadMessage, inStream.wres); + return PrintErrorNumber(rs, res); + } + return 0; +} + + +int MY_CDECL main(int numArgs, const char *args[]) +{ + char rs[1000] = { 0 }; + int res = main2(numArgs, args, rs); + fputs(rs, stdout); + return res; +} diff --git a/deps/LZMA-SDK/C/Util/Lzma/LzmaUtil.dsp b/deps/LZMA-SDK/C/Util/Lzma/LzmaUtil.dsp index eedde07d8..4e38e4a65 100644 --- a/deps/LZMA-SDK/C/Util/Lzma/LzmaUtil.dsp +++ b/deps/LZMA-SDK/C/Util/Lzma/LzmaUtil.dsp @@ -1,168 +1,172 @@ -# Microsoft Developer Studio Project File - Name="LzmaUtil" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=LzmaUtil - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "LzmaUtil.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "LzmaUtil.mak" CFG="LzmaUtil - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "LzmaUtil - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "LzmaUtil - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "LzmaUtil - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MT /W4 /WX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x419 /d "NDEBUG" -# ADD RSC /l 0x419 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"c:\util\7lzma.exe" - -!ELSEIF "$(CFG)" == "LzmaUtil - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W4 /WX /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x419 /d "_DEBUG" -# ADD RSC /l 0x419 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"c:\util\7lzma.exe" /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "LzmaUtil - Win32 Release" -# Name "LzmaUtil - Win32 Debug" -# Begin Source File - -SOURCE=..\..\7zFile.c -# End Source File -# Begin Source File - -SOURCE=..\..\7zFile.h -# End Source File -# Begin Source File - -SOURCE=..\..\7zStream.c -# End Source File -# Begin Source File - -SOURCE=..\..\7zTypes.h -# End Source File -# Begin Source File - -SOURCE=..\..\7zVersion.h -# End Source File -# Begin Source File - -SOURCE=..\..\Alloc.c -# End Source File -# Begin Source File - -SOURCE=..\..\Alloc.h -# End Source File -# Begin Source File - -SOURCE=..\..\CpuArch.h -# End Source File -# Begin Source File - -SOURCE=..\..\LzFind.c -# End Source File -# Begin Source File - -SOURCE=..\..\LzFind.h -# End Source File -# Begin Source File - -SOURCE=..\..\LzFindMt.c -# End Source File -# Begin Source File - -SOURCE=..\..\LzFindMt.h -# End Source File -# Begin Source File - -SOURCE=..\..\LzHash.h -# End Source File -# Begin Source File - -SOURCE=..\..\LzmaDec.c -# End Source File -# Begin Source File - -SOURCE=..\..\LzmaDec.h -# End Source File -# Begin Source File - -SOURCE=..\..\LzmaEnc.c -# End Source File -# Begin Source File - -SOURCE=..\..\LzmaEnc.h -# End Source File -# Begin Source File - -SOURCE=.\LzmaUtil.c -# End Source File -# Begin Source File - -SOURCE=..\..\Threads.c -# End Source File -# Begin Source File - -SOURCE=..\..\Threads.h -# End Source File -# End Target -# End Project +# Microsoft Developer Studio Project File - Name="LzmaUtil" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=LzmaUtil - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "LzmaUtil.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "LzmaUtil.mak" CFG="LzmaUtil - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "LzmaUtil - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "LzmaUtil - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "LzmaUtil - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /MT /W4 /WX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x419 /d "NDEBUG" +# ADD RSC /l 0x419 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"c:\util\7lzma.exe" + +!ELSEIF "$(CFG)" == "LzmaUtil - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W4 /WX /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x419 /d "_DEBUG" +# ADD RSC /l 0x419 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"c:\util\7lzma.exe" /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "LzmaUtil - Win32 Release" +# Name "LzmaUtil - Win32 Debug" +# Begin Source File + +SOURCE=..\..\7zFile.c +# End Source File +# Begin Source File + +SOURCE=..\..\7zFile.h +# End Source File +# Begin Source File + +SOURCE=..\..\7zStream.c +# End Source File +# Begin Source File + +SOURCE=..\..\7zTypes.h +# End Source File +# Begin Source File + +SOURCE=..\..\7zVersion.h +# End Source File +# Begin Source File + +SOURCE=..\..\Alloc.c +# End Source File +# Begin Source File + +SOURCE=..\..\Alloc.h +# End Source File +# Begin Source File + +SOURCE=..\..\CpuArch.h +# End Source File +# Begin Source File + +SOURCE=..\..\LzFind.c +# End Source File +# Begin Source File + +SOURCE=..\..\LzFind.h +# End Source File +# Begin Source File + +SOURCE=..\..\LzFindMt.c +# End Source File +# Begin Source File + +SOURCE=..\..\LzFindMt.h +# End Source File +# Begin Source File + +SOURCE=..\..\LzFindOpt.c +# End Source File +# Begin Source File + +SOURCE=..\..\LzHash.h +# End Source File +# Begin Source File + +SOURCE=..\..\LzmaDec.c +# End Source File +# Begin Source File + +SOURCE=..\..\LzmaDec.h +# End Source File +# Begin Source File + +SOURCE=..\..\LzmaEnc.c +# End Source File +# Begin Source File + +SOURCE=..\..\LzmaEnc.h +# End Source File +# Begin Source File + +SOURCE=.\LzmaUtil.c +# End Source File +# Begin Source File + +SOURCE=..\..\Threads.c +# End Source File +# Begin Source File + +SOURCE=..\..\Threads.h +# End Source File +# End Target +# End Project diff --git a/deps/LZMA-SDK/C/Util/Lzma/LzmaUtil.dsw b/deps/LZMA-SDK/C/Util/Lzma/LzmaUtil.dsw index f43548752..c52eaf6d0 100644 --- a/deps/LZMA-SDK/C/Util/Lzma/LzmaUtil.dsw +++ b/deps/LZMA-SDK/C/Util/Lzma/LzmaUtil.dsw @@ -1,29 +1,29 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "LzmaUtil"=.\LzmaUtil.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "LzmaUtil"=.\LzmaUtil.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/deps/LZMA-SDK/C/Util/Lzma/makefile b/deps/LZMA-SDK/C/Util/Lzma/makefile index 3b825f21a..7813bdb05 100644 --- a/deps/LZMA-SDK/C/Util/Lzma/makefile +++ b/deps/LZMA-SDK/C/Util/Lzma/makefile @@ -1,28 +1,30 @@ -# MY_STATIC_LINK=1 -PROG = LZMAc.exe - -CFLAGS = $(CFLAGS) \ - -LIB_OBJS = \ - $O\LzmaUtil.obj \ - -C_OBJS = \ - $O\Alloc.obj \ - $O\LzFind.obj \ - $O\LzFindMt.obj \ - $O\LzmaDec.obj \ - $O\LzmaEnc.obj \ - $O\7zFile.obj \ - $O\7zStream.obj \ - $O\Threads.obj \ - -OBJS = \ - $(LIB_OBJS) \ - $(C_OBJS) \ - -!include "../../../CPP/Build.mak" - -$(LIB_OBJS): $(*B).c - $(COMPL_O2) -$(C_OBJS): ../../$(*B).c - $(COMPL_O2) +# MY_STATIC_LINK=1 +PROG = LZMAc.exe + +CFLAGS = $(CFLAGS) \ + +LIB_OBJS = \ + $O\LzmaUtil.obj \ + +C_OBJS = \ + $O\Alloc.obj \ + $O\CpuArch.obj \ + $O\LzFind.obj \ + $O\LzFindMt.obj \ + $O\LzFindOpt.obj \ + $O\LzmaDec.obj \ + $O\LzmaEnc.obj \ + $O\7zFile.obj \ + $O\7zStream.obj \ + $O\Threads.obj \ + +OBJS = \ + $(LIB_OBJS) \ + $(C_OBJS) \ + +!include "../../../CPP/Build.mak" + +$(LIB_OBJS): $(*B).c + $(COMPL_O2) +$(C_OBJS): ../../$(*B).c + $(COMPL_O2) diff --git a/deps/LZMA-SDK/C/Util/Lzma/makefile.gcc b/deps/LZMA-SDK/C/Util/Lzma/makefile.gcc index 89b3e11f7..2acb0b808 100644 --- a/deps/LZMA-SDK/C/Util/Lzma/makefile.gcc +++ b/deps/LZMA-SDK/C/Util/Lzma/makefile.gcc @@ -1,19 +1,21 @@ -PROG = 7lzma - -include ../../../CPP/7zip/LzmaDec_gcc.mak - - -OBJS = \ - $(LZMA_DEC_OPT_OBJS) \ - $O/7zFile.o \ - $O/7zStream.o \ - $O/Alloc.o \ - $O/LzFind.o \ - $O/LzFindMt.o \ - $O/LzmaDec.o \ - $O/LzmaEnc.o \ - $O/LzmaUtil.o \ - $O/Threads.o \ - - -include ../../7zip_gcc_c.mak +PROG = 7lzma + +include ../../../CPP/7zip/LzmaDec_gcc.mak + + +OBJS = \ + $(LZMA_DEC_OPT_OBJS) \ + $O/7zFile.o \ + $O/7zStream.o \ + $O/Alloc.o \ + $O/CpuArch.o \ + $O/LzFind.o \ + $O/LzFindMt.o \ + $O/LzFindOpt.o \ + $O/LzmaDec.o \ + $O/LzmaEnc.o \ + $O/LzmaUtil.o \ + $O/Threads.o \ + + +include ../../7zip_gcc_c.mak diff --git a/deps/LZMA-SDK/C/Util/LzmaLib/LzmaLib.def b/deps/LZMA-SDK/C/Util/LzmaLib/LzmaLib.def index 43b959778..8bc6add93 100644 --- a/deps/LZMA-SDK/C/Util/LzmaLib/LzmaLib.def +++ b/deps/LZMA-SDK/C/Util/LzmaLib/LzmaLib.def @@ -1,4 +1,4 @@ -EXPORTS - LzmaCompress - LzmaUncompress - +EXPORTS + LzmaCompress + LzmaUncompress + diff --git a/deps/LZMA-SDK/C/Util/LzmaLib/LzmaLib.dsp b/deps/LZMA-SDK/C/Util/LzmaLib/LzmaLib.dsp index 0d4c981c4..6ce91dcd2 100644 --- a/deps/LZMA-SDK/C/Util/LzmaLib/LzmaLib.dsp +++ b/deps/LZMA-SDK/C/Util/LzmaLib/LzmaLib.dsp @@ -1,178 +1,182 @@ -# Microsoft Developer Studio Project File - Name="LzmaLib" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=LzmaLib - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "LzmaLib.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "LzmaLib.mak" CFG="LzmaLib - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "LzmaLib - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "LzmaLib - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "LzmaLib - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LZMALIB_EXPORTS" /YX /FD /c -# ADD CPP /nologo /Gr /MT /W3 /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LZMALIB_EXPORTS" /FD /c -# SUBTRACT CPP /YX -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x419 /d "NDEBUG" -# ADD RSC /l 0x419 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"C:\Util\LZMA.dll" /opt:NOWIN98 -# SUBTRACT LINK32 /pdb:none - -!ELSEIF "$(CFG)" == "LzmaLib - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LZMALIB_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /ZI /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LZMALIB_EXPORTS" /D "COMPRESS_MF_MT" /FD /GZ /c -# SUBTRACT CPP /YX -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x419 /d "_DEBUG" -# ADD RSC /l 0x419 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"C:\Util\LZMA.dll" /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "LzmaLib - Win32 Release" -# Name "LzmaLib - Win32 Debug" -# Begin Group "Spec" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\LzmaLib.def -# End Source File -# Begin Source File - -SOURCE=.\LzmaLibExports.c -# End Source File -# End Group -# Begin Source File - -SOURCE=..\..\7zTypes.h -# End Source File -# Begin Source File - -SOURCE=..\..\Alloc.c -# End Source File -# Begin Source File - -SOURCE=..\..\Alloc.h -# End Source File -# Begin Source File - -SOURCE=..\..\IStream.h -# End Source File -# Begin Source File - -SOURCE=..\..\LzFind.c -# End Source File -# Begin Source File - -SOURCE=..\..\LzFind.h -# End Source File -# Begin Source File - -SOURCE=..\..\LzFindMt.c -# End Source File -# Begin Source File - -SOURCE=..\..\LzFindMt.h -# End Source File -# Begin Source File - -SOURCE=..\..\LzHash.h -# End Source File -# Begin Source File - -SOURCE=..\..\LzmaDec.c -# End Source File -# Begin Source File - -SOURCE=..\..\LzmaDec.h -# End Source File -# Begin Source File - -SOURCE=..\..\LzmaEnc.c -# End Source File -# Begin Source File - -SOURCE=..\..\LzmaEnc.h -# End Source File -# Begin Source File - -SOURCE=..\..\LzmaLib.c -# End Source File -# Begin Source File - -SOURCE=..\..\LzmaLib.h -# End Source File -# Begin Source File - -SOURCE=.\resource.rc -# End Source File -# Begin Source File - -SOURCE=..\..\Threads.c -# End Source File -# Begin Source File - -SOURCE=..\..\Threads.h -# End Source File -# End Target -# End Project +# Microsoft Developer Studio Project File - Name="LzmaLib" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=LzmaLib - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "LzmaLib.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "LzmaLib.mak" CFG="LzmaLib - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "LzmaLib - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "LzmaLib - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "LzmaLib - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LZMALIB_EXPORTS" /YX /FD /c +# ADD CPP /nologo /Gr /MT /W3 /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LZMALIB_EXPORTS" /FD /c +# SUBTRACT CPP /YX +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x419 /d "NDEBUG" +# ADD RSC /l 0x419 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"C:\Util\LZMA.dll" /opt:NOWIN98 +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "LzmaLib - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LZMALIB_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /ZI /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LZMALIB_EXPORTS" /D "COMPRESS_MF_MT" /FD /GZ /c +# SUBTRACT CPP /YX +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x419 /d "_DEBUG" +# ADD RSC /l 0x419 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"C:\Util\LZMA.dll" /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "LzmaLib - Win32 Release" +# Name "LzmaLib - Win32 Debug" +# Begin Group "Spec" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\LzmaLib.def +# End Source File +# Begin Source File + +SOURCE=.\LzmaLibExports.c +# End Source File +# End Group +# Begin Source File + +SOURCE=..\..\7zTypes.h +# End Source File +# Begin Source File + +SOURCE=..\..\Alloc.c +# End Source File +# Begin Source File + +SOURCE=..\..\Alloc.h +# End Source File +# Begin Source File + +SOURCE=..\..\IStream.h +# End Source File +# Begin Source File + +SOURCE=..\..\LzFind.c +# End Source File +# Begin Source File + +SOURCE=..\..\LzFind.h +# End Source File +# Begin Source File + +SOURCE=..\..\LzFindMt.c +# End Source File +# Begin Source File + +SOURCE=..\..\LzFindMt.h +# End Source File +# Begin Source File + +SOURCE=..\..\LzFindOpt.c +# End Source File +# Begin Source File + +SOURCE=..\..\LzHash.h +# End Source File +# Begin Source File + +SOURCE=..\..\LzmaDec.c +# End Source File +# Begin Source File + +SOURCE=..\..\LzmaDec.h +# End Source File +# Begin Source File + +SOURCE=..\..\LzmaEnc.c +# End Source File +# Begin Source File + +SOURCE=..\..\LzmaEnc.h +# End Source File +# Begin Source File + +SOURCE=..\..\LzmaLib.c +# End Source File +# Begin Source File + +SOURCE=..\..\LzmaLib.h +# End Source File +# Begin Source File + +SOURCE=.\resource.rc +# End Source File +# Begin Source File + +SOURCE=..\..\Threads.c +# End Source File +# Begin Source File + +SOURCE=..\..\Threads.h +# End Source File +# End Target +# End Project diff --git a/deps/LZMA-SDK/C/Util/LzmaLib/LzmaLib.dsw b/deps/LZMA-SDK/C/Util/LzmaLib/LzmaLib.dsw index f6c55593f..6faf33365 100644 --- a/deps/LZMA-SDK/C/Util/LzmaLib/LzmaLib.dsw +++ b/deps/LZMA-SDK/C/Util/LzmaLib/LzmaLib.dsw @@ -1,29 +1,29 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "LzmaLib"=.\LzmaLib.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "LzmaLib"=.\LzmaLib.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/deps/LZMA-SDK/C/Util/LzmaLib/LzmaLibExports.c b/deps/LZMA-SDK/C/Util/LzmaLib/LzmaLibExports.c index 02600c724..4a28a9a6b 100644 --- a/deps/LZMA-SDK/C/Util/LzmaLib/LzmaLibExports.c +++ b/deps/LZMA-SDK/C/Util/LzmaLib/LzmaLibExports.c @@ -1,14 +1,14 @@ -/* LzmaLibExports.c -- LZMA library DLL Entry point -2015-11-08 : Igor Pavlov : Public domain */ - -#include "../../Precomp.h" - -#include - -BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) -{ - UNUSED_VAR(hInstance); - UNUSED_VAR(dwReason); - UNUSED_VAR(lpReserved); - return TRUE; -} +/* LzmaLibExports.c -- LZMA library DLL Entry point +2015-11-08 : Igor Pavlov : Public domain */ + +#include "../../Precomp.h" + +#include + +BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) +{ + UNUSED_VAR(hInstance); + UNUSED_VAR(dwReason); + UNUSED_VAR(lpReserved); + return TRUE; +} diff --git a/deps/LZMA-SDK/C/Util/LzmaLib/makefile b/deps/LZMA-SDK/C/Util/LzmaLib/makefile index e0f311471..b36f1de09 100644 --- a/deps/LZMA-SDK/C/Util/LzmaLib/makefile +++ b/deps/LZMA-SDK/C/Util/LzmaLib/makefile @@ -1,34 +1,36 @@ -MY_STATIC_LINK=1 -SLIB = sLZMA.lib -PROG = LZMA.dll -SLIBPATH = $O\$(SLIB) - -DEF_FILE = LzmaLib.def -CFLAGS = $(CFLAGS) \ - -LIB_OBJS = \ - $O\LzmaLibExports.obj \ - -C_OBJS = \ - $O\Alloc.obj \ - $O\LzFind.obj \ - $O\LzFindMt.obj \ - $O\LzmaDec.obj \ - $O\LzmaEnc.obj \ - $O\LzmaLib.obj \ - $O\Threads.obj \ - -OBJS = \ - $(LIB_OBJS) \ - $(C_OBJS) \ - $O\resource.res - -!include "../../../CPP/Build.mak" - -$(SLIBPATH): $O $(OBJS) - lib -out:$(SLIBPATH) $(OBJS) $(LIBS) - -$(LIB_OBJS): $(*B).c - $(COMPL_O2) -$(C_OBJS): ../../$(*B).c - $(COMPL_O2) +MY_STATIC_LINK=1 +SLIB = sLZMA.lib +PROG = LZMA.dll +SLIBPATH = $O\$(SLIB) + +DEF_FILE = LzmaLib.def +CFLAGS = $(CFLAGS) \ + +LIB_OBJS = \ + $O\LzmaLibExports.obj \ + +C_OBJS = \ + $O\Alloc.obj \ + $O\CpuArch.obj \ + $O\LzFind.obj \ + $O\LzFindMt.obj \ + $O\LzFindOpt.obj \ + $O\LzmaDec.obj \ + $O\LzmaEnc.obj \ + $O\LzmaLib.obj \ + $O\Threads.obj \ + +OBJS = \ + $(LIB_OBJS) \ + $(C_OBJS) \ + $O\resource.res + +!include "../../../CPP/Build.mak" + +$(SLIBPATH): $O $(OBJS) + lib -out:$(SLIBPATH) $(OBJS) $(LIBS) + +$(LIB_OBJS): $(*B).c + $(COMPL_O2) +$(C_OBJS): ../../$(*B).c + $(COMPL_O2) diff --git a/deps/LZMA-SDK/C/Util/LzmaLib/resource.rc b/deps/LZMA-SDK/C/Util/LzmaLib/resource.rc index d95e3f358..674832e05 100644 --- a/deps/LZMA-SDK/C/Util/LzmaLib/resource.rc +++ b/deps/LZMA-SDK/C/Util/LzmaLib/resource.rc @@ -1,3 +1,3 @@ -#include "../../7zVersion.rc" - -MY_VERSION_INFO_DLL("LZMA library", "LZMA") +#include "../../7zVersion.rc" + +MY_VERSION_INFO_DLL("LZMA library", "LZMA") diff --git a/deps/LZMA-SDK/C/Util/SfxSetup/Precomp.c b/deps/LZMA-SDK/C/Util/SfxSetup/Precomp.c index 34b60f8fc..01605e3c2 100644 --- a/deps/LZMA-SDK/C/Util/SfxSetup/Precomp.c +++ b/deps/LZMA-SDK/C/Util/SfxSetup/Precomp.c @@ -1,4 +1,4 @@ -/* Precomp.c -- StdAfx -2013-01-21 : Igor Pavlov : Public domain */ - -#include "Precomp.h" +/* Precomp.c -- StdAfx +2013-01-21 : Igor Pavlov : Public domain */ + +#include "Precomp.h" diff --git a/deps/LZMA-SDK/C/Util/SfxSetup/Precomp.h b/deps/LZMA-SDK/C/Util/SfxSetup/Precomp.h index 9f398d08f..588a66f7e 100644 --- a/deps/LZMA-SDK/C/Util/SfxSetup/Precomp.h +++ b/deps/LZMA-SDK/C/Util/SfxSetup/Precomp.h @@ -1,10 +1,10 @@ -/* Precomp.h -- StdAfx -2013-06-16 : Igor Pavlov : Public domain */ - -#ifndef __7Z_PRECOMP_H -#define __7Z_PRECOMP_H - -#include "../../Compiler.h" -#include "../../7zTypes.h" - -#endif +/* Precomp.h -- StdAfx +2013-06-16 : Igor Pavlov : Public domain */ + +#ifndef __7Z_PRECOMP_H +#define __7Z_PRECOMP_H + +#include "../../Compiler.h" +#include "../../7zTypes.h" + +#endif diff --git a/deps/LZMA-SDK/C/Util/SfxSetup/SfxSetup.c b/deps/LZMA-SDK/C/Util/SfxSetup/SfxSetup.c index 394369abd..ef19aeac5 100644 --- a/deps/LZMA-SDK/C/Util/SfxSetup/SfxSetup.c +++ b/deps/LZMA-SDK/C/Util/SfxSetup/SfxSetup.c @@ -1,640 +1,640 @@ -/* SfxSetup.c - 7z SFX Setup -2019-02-02 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#ifndef UNICODE -#define UNICODE -#endif - -#ifndef _UNICODE -#define _UNICODE -#endif - -#ifdef _CONSOLE -#include -#endif - -#include "../../7z.h" -#include "../../7zAlloc.h" -#include "../../7zCrc.h" -#include "../../7zFile.h" -#include "../../CpuArch.h" -#include "../../DllSecur.h" - -#define k_EXE_ExtIndex 2 - -#define kInputBufSize ((size_t)1 << 18) - -static const char * const kExts[] = -{ - "bat" - , "cmd" - , "exe" - , "inf" - , "msi" - #ifdef UNDER_CE - , "cab" - #endif - , "html" - , "htm" -}; - -static const char * const kNames[] = -{ - "setup" - , "install" - , "run" - , "start" -}; - -static unsigned FindExt(const wchar_t *s, unsigned *extLen) -{ - unsigned len = (unsigned)wcslen(s); - unsigned i; - for (i = len; i > 0; i--) - { - if (s[i - 1] == '.') - { - *extLen = len - i; - return i - 1; - } - } - *extLen = 0; - return len; -} - -#define MAKE_CHAR_UPPER(c) ((((c) >= 'a' && (c) <= 'z') ? (c) -= 0x20 : (c))) - -static unsigned FindItem(const char * const *items, unsigned num, const wchar_t *s, unsigned len) -{ - unsigned i; - for (i = 0; i < num; i++) - { - const char *item = items[i]; - unsigned itemLen = (unsigned)strlen(item); - unsigned j; - if (len != itemLen) - continue; - for (j = 0; j < len; j++) - { - unsigned c = (Byte)item[j]; - if (c != s[j] && MAKE_CHAR_UPPER(c) != s[j]) - break; - } - if (j == len) - return i; - } - return i; -} - -#ifdef _CONSOLE -static BOOL WINAPI HandlerRoutine(DWORD ctrlType) -{ - UNUSED_VAR(ctrlType); - return TRUE; -} -#endif - -static void PrintErrorMessage(const char *message) -{ - #ifdef _CONSOLE - printf("\n7-Zip Error: %s\n", message); - #else - #ifdef UNDER_CE - WCHAR messageW[256 + 4]; - unsigned i; - for (i = 0; i < 256 && message[i] != 0; i++) - messageW[i] = message[i]; - messageW[i] = 0; - MessageBoxW(0, messageW, L"7-Zip Error", MB_ICONERROR); - #else - MessageBoxA(0, message, "7-Zip Error", MB_ICONERROR); - #endif - #endif -} - -static WRes MyCreateDir(const WCHAR *name) -{ - return CreateDirectoryW(name, NULL) ? 0 : GetLastError(); -} - -#ifdef UNDER_CE -#define kBufferSize (1 << 13) -#else -#define kBufferSize (1 << 15) -#endif - -#define kSignatureSearchLimit (1 << 22) - -static BoolInt FindSignature(CSzFile *stream, UInt64 *resPos) -{ - Byte buf[kBufferSize]; - size_t numPrevBytes = 0; - *resPos = 0; - for (;;) - { - size_t processed, pos; - if (*resPos > kSignatureSearchLimit) - return False; - processed = kBufferSize - numPrevBytes; - if (File_Read(stream, buf + numPrevBytes, &processed) != 0) - return False; - processed += numPrevBytes; - if (processed < k7zStartHeaderSize || - (processed == k7zStartHeaderSize && numPrevBytes != 0)) - return False; - processed -= k7zStartHeaderSize; - for (pos = 0; pos <= processed; pos++) - { - for (; pos <= processed && buf[pos] != '7'; pos++); - if (pos > processed) - break; - if (memcmp(buf + pos, k7zSignature, k7zSignatureSize) == 0) - if (CrcCalc(buf + pos + 12, 20) == GetUi32(buf + pos + 8)) - { - *resPos += pos; - return True; - } - } - *resPos += processed; - numPrevBytes = k7zStartHeaderSize; - memmove(buf, buf + processed, k7zStartHeaderSize); - } -} - -static BoolInt DoesFileOrDirExist(const WCHAR *path) -{ - WIN32_FIND_DATAW fd; - HANDLE handle; - handle = FindFirstFileW(path, &fd); - if (handle == INVALID_HANDLE_VALUE) - return False; - FindClose(handle); - return True; -} - -static WRes RemoveDirWithSubItems(WCHAR *path) -{ - WIN32_FIND_DATAW fd; - HANDLE handle; - WRes res = 0; - size_t len = wcslen(path); - wcscpy(path + len, L"*"); - handle = FindFirstFileW(path, &fd); - path[len] = L'\0'; - if (handle == INVALID_HANDLE_VALUE) - return GetLastError(); - - for (;;) - { - if (wcscmp(fd.cFileName, L".") != 0 && - wcscmp(fd.cFileName, L"..") != 0) - { - wcscpy(path + len, fd.cFileName); - if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) - { - wcscat(path, WSTRING_PATH_SEPARATOR); - res = RemoveDirWithSubItems(path); - } - else - { - SetFileAttributesW(path, 0); - if (DeleteFileW(path) == 0) - res = GetLastError(); - } - - if (res != 0) - break; - } - - if (!FindNextFileW(handle, &fd)) - { - res = GetLastError(); - if (res == ERROR_NO_MORE_FILES) - res = 0; - break; - } - } - - path[len] = L'\0'; - FindClose(handle); - if (res == 0) - { - if (!RemoveDirectoryW(path)) - res = GetLastError(); - } - return res; -} - -#ifdef _CONSOLE -int MY_CDECL main() -#else -int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, - #ifdef UNDER_CE - LPWSTR - #else - LPSTR - #endif - lpCmdLine, int nCmdShow) -#endif -{ - CFileInStream archiveStream; - CLookToRead2 lookStream; - CSzArEx db; - SRes res = SZ_OK; - ISzAlloc allocImp; - ISzAlloc allocTempImp; - WCHAR sfxPath[MAX_PATH + 2]; - WCHAR path[MAX_PATH * 3 + 2]; - #ifndef UNDER_CE - WCHAR workCurDir[MAX_PATH + 32]; - #endif - size_t pathLen; - DWORD winRes; - const wchar_t *cmdLineParams; - const char *errorMessage = NULL; - BoolInt useShellExecute = True; - DWORD exitCode = 0; - - LoadSecurityDlls(); - - #ifdef _CONSOLE - SetConsoleCtrlHandler(HandlerRoutine, TRUE); - #else - UNUSED_VAR(hInstance); - UNUSED_VAR(hPrevInstance); - UNUSED_VAR(lpCmdLine); - UNUSED_VAR(nCmdShow); - #endif - - CrcGenerateTable(); - - allocImp.Alloc = SzAlloc; - allocImp.Free = SzFree; - - allocTempImp.Alloc = SzAllocTemp; - allocTempImp.Free = SzFreeTemp; - - FileInStream_CreateVTable(&archiveStream); - LookToRead2_CreateVTable(&lookStream, False); - lookStream.buf = NULL; - - winRes = GetModuleFileNameW(NULL, sfxPath, MAX_PATH); - if (winRes == 0 || winRes > MAX_PATH) - return 1; - { - cmdLineParams = GetCommandLineW(); - #ifndef UNDER_CE - { - BoolInt quoteMode = False; - for (;; cmdLineParams++) - { - wchar_t c = *cmdLineParams; - if (c == L'\"') - quoteMode = !quoteMode; - else if (c == 0 || (c == L' ' && !quoteMode)) - break; - } - } - #endif - } - - { - unsigned i; - DWORD d; - winRes = GetTempPathW(MAX_PATH, path); - if (winRes == 0 || winRes > MAX_PATH) - return 1; - pathLen = wcslen(path); - d = (GetTickCount() << 12) ^ (GetCurrentThreadId() << 14) ^ GetCurrentProcessId(); - - for (i = 0;; i++, d += GetTickCount()) - { - if (i >= 100) - { - res = SZ_ERROR_FAIL; - break; - } - wcscpy(path + pathLen, L"7z"); - - { - wchar_t *s = path + wcslen(path); - UInt32 value = d; - unsigned k; - for (k = 0; k < 8; k++) - { - unsigned t = value & 0xF; - value >>= 4; - s[7 - k] = (wchar_t)((t < 10) ? ('0' + t) : ('A' + (t - 10))); - } - s[k] = '\0'; - } - - if (DoesFileOrDirExist(path)) - continue; - if (CreateDirectoryW(path, NULL)) - { - wcscat(path, WSTRING_PATH_SEPARATOR); - pathLen = wcslen(path); - break; - } - if (GetLastError() != ERROR_ALREADY_EXISTS) - { - res = SZ_ERROR_FAIL; - break; - } - } - - #ifndef UNDER_CE - wcscpy(workCurDir, path); - #endif - if (res != SZ_OK) - errorMessage = "Can't create temp folder"; - } - - if (res != SZ_OK) - { - if (!errorMessage) - errorMessage = "Error"; - PrintErrorMessage(errorMessage); - return 1; - } - - if (InFile_OpenW(&archiveStream.file, sfxPath) != 0) - { - errorMessage = "can not open input file"; - res = SZ_ERROR_FAIL; - } - else - { - UInt64 pos = 0; - if (!FindSignature(&archiveStream.file, &pos)) - res = SZ_ERROR_FAIL; - else if (File_Seek(&archiveStream.file, (Int64 *)&pos, SZ_SEEK_SET) != 0) - res = SZ_ERROR_FAIL; - if (res != 0) - errorMessage = "Can't find 7z archive"; - } - - if (res == SZ_OK) - { - lookStream.buf = (Byte *)ISzAlloc_Alloc(&allocImp, kInputBufSize); - if (!lookStream.buf) - res = SZ_ERROR_MEM; - else - { - lookStream.bufSize = kInputBufSize; - lookStream.realStream = &archiveStream.vt; - LookToRead2_Init(&lookStream); - } - } - - SzArEx_Init(&db); - - if (res == SZ_OK) - { - res = SzArEx_Open(&db, &lookStream.vt, &allocImp, &allocTempImp); - } - - if (res == SZ_OK) - { - UInt32 executeFileIndex = (UInt32)(Int32)-1; - UInt32 minPrice = 1 << 30; - UInt32 i; - UInt32 blockIndex = 0xFFFFFFFF; /* it can have any value before first call (if outBuffer = 0) */ - Byte *outBuffer = 0; /* it must be 0 before first call for each new archive. */ - size_t outBufferSize = 0; /* it can have any value before first call (if outBuffer = 0) */ - - for (i = 0; i < db.NumFiles; i++) - { - size_t offset = 0; - size_t outSizeProcessed = 0; - WCHAR *temp; - - if (SzArEx_GetFileNameUtf16(&db, i, NULL) >= MAX_PATH) - { - res = SZ_ERROR_FAIL; - break; - } - - temp = path + pathLen; - - SzArEx_GetFileNameUtf16(&db, i, (UInt16 *)temp); - { - res = SzArEx_Extract(&db, &lookStream.vt, i, - &blockIndex, &outBuffer, &outBufferSize, - &offset, &outSizeProcessed, - &allocImp, &allocTempImp); - if (res != SZ_OK) - break; - } - { - CSzFile outFile; - size_t processedSize; - size_t j; - size_t nameStartPos = 0; - for (j = 0; temp[j] != 0; j++) - { - if (temp[j] == '/') - { - temp[j] = 0; - MyCreateDir(path); - temp[j] = CHAR_PATH_SEPARATOR; - nameStartPos = j + 1; - } - } - - if (SzArEx_IsDir(&db, i)) - { - MyCreateDir(path); - continue; - } - else - { - unsigned extLen; - const WCHAR *name = temp + nameStartPos; - unsigned len = (unsigned)wcslen(name); - unsigned nameLen = FindExt(temp + nameStartPos, &extLen); - unsigned extPrice = FindItem(kExts, sizeof(kExts) / sizeof(kExts[0]), name + len - extLen, extLen); - unsigned namePrice = FindItem(kNames, sizeof(kNames) / sizeof(kNames[0]), name, nameLen); - - unsigned price = namePrice + extPrice * 64 + (nameStartPos == 0 ? 0 : (1 << 12)); - if (minPrice > price) - { - minPrice = price; - executeFileIndex = i; - useShellExecute = (extPrice != k_EXE_ExtIndex); - } - - if (DoesFileOrDirExist(path)) - { - errorMessage = "Duplicate file"; - res = SZ_ERROR_FAIL; - break; - } - if (OutFile_OpenW(&outFile, path)) - { - errorMessage = "Can't open output file"; - res = SZ_ERROR_FAIL; - break; - } - } - - processedSize = outSizeProcessed; - if (File_Write(&outFile, outBuffer + offset, &processedSize) != 0 || processedSize != outSizeProcessed) - { - errorMessage = "Can't write output file"; - res = SZ_ERROR_FAIL; - } - - #ifdef USE_WINDOWS_FILE - if (SzBitWithVals_Check(&db.MTime, i)) - { - const CNtfsFileTime *t = db.MTime.Vals + i; - FILETIME mTime; - mTime.dwLowDateTime = t->Low; - mTime.dwHighDateTime = t->High; - SetFileTime(outFile.handle, NULL, NULL, &mTime); - } - #endif - - { - SRes res2 = File_Close(&outFile); - if (res != SZ_OK) - break; - if (res2 != SZ_OK) - { - res = res2; - break; - } - } - #ifdef USE_WINDOWS_FILE - if (SzBitWithVals_Check(&db.Attribs, i)) - SetFileAttributesW(path, db.Attribs.Vals[i]); - #endif - } - } - - if (res == SZ_OK) - { - if (executeFileIndex == (UInt32)(Int32)-1) - { - errorMessage = "There is no file to execute"; - res = SZ_ERROR_FAIL; - } - else - { - WCHAR *temp = path + pathLen; - UInt32 j; - SzArEx_GetFileNameUtf16(&db, executeFileIndex, (UInt16 *)temp); - for (j = 0; temp[j] != 0; j++) - if (temp[j] == '/') - temp[j] = CHAR_PATH_SEPARATOR; - } - } - ISzAlloc_Free(&allocImp, outBuffer); - } - - SzArEx_Free(&db, &allocImp); - - ISzAlloc_Free(&allocImp, lookStream.buf); - - File_Close(&archiveStream.file); - - if (res == SZ_OK) - { - HANDLE hProcess = 0; - - #ifndef UNDER_CE - WCHAR oldCurDir[MAX_PATH + 2]; - oldCurDir[0] = 0; - { - DWORD needLen = GetCurrentDirectory(MAX_PATH + 1, oldCurDir); - if (needLen == 0 || needLen > MAX_PATH) - oldCurDir[0] = 0; - SetCurrentDirectory(workCurDir); - } - #endif - - if (useShellExecute) - { - SHELLEXECUTEINFO ei; - UINT32 executeRes; - BOOL success; - - memset(&ei, 0, sizeof(ei)); - ei.cbSize = sizeof(ei); - ei.lpFile = path; - ei.fMask = SEE_MASK_NOCLOSEPROCESS - #ifndef UNDER_CE - | SEE_MASK_FLAG_DDEWAIT - #endif - /* | SEE_MASK_NO_CONSOLE */ - ; - if (wcslen(cmdLineParams) != 0) - ei.lpParameters = cmdLineParams; - ei.nShow = SW_SHOWNORMAL; /* SW_HIDE; */ - success = ShellExecuteEx(&ei); - executeRes = (UINT32)(UINT_PTR)ei.hInstApp; - if (!success || (executeRes <= 32 && executeRes != 0)) /* executeRes = 0 in Windows CE */ - res = SZ_ERROR_FAIL; - else - hProcess = ei.hProcess; - } - else - { - STARTUPINFOW si; - PROCESS_INFORMATION pi; - WCHAR cmdLine[MAX_PATH * 3]; - - wcscpy(cmdLine, path); - wcscat(cmdLine, cmdLineParams); - memset(&si, 0, sizeof(si)); - si.cb = sizeof(si); - if (CreateProcessW(NULL, cmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi) == 0) - res = SZ_ERROR_FAIL; - else - { - CloseHandle(pi.hThread); - hProcess = pi.hProcess; - } - } - - if (hProcess != 0) - { - WaitForSingleObject(hProcess, INFINITE); - if (!GetExitCodeProcess(hProcess, &exitCode)) - exitCode = 1; - CloseHandle(hProcess); - } - - #ifndef UNDER_CE - SetCurrentDirectory(oldCurDir); - #endif - } - - path[pathLen] = L'\0'; - RemoveDirWithSubItems(path); - - if (res == SZ_OK) - return (int)exitCode; - - { - if (res == SZ_ERROR_UNSUPPORTED) - errorMessage = "Decoder doesn't support this archive"; - else if (res == SZ_ERROR_MEM) - errorMessage = "Can't allocate required memory"; - else if (res == SZ_ERROR_CRC) - errorMessage = "CRC error"; - else - { - if (!errorMessage) - errorMessage = "ERROR"; - } - - if (errorMessage) - PrintErrorMessage(errorMessage); - } - return 1; -} +/* SfxSetup.c - 7z SFX Setup +2019-02-02 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#ifndef UNICODE +#define UNICODE +#endif + +#ifndef _UNICODE +#define _UNICODE +#endif + +#ifdef _CONSOLE +#include +#endif + +#include "../../7z.h" +#include "../../7zAlloc.h" +#include "../../7zCrc.h" +#include "../../7zFile.h" +#include "../../CpuArch.h" +#include "../../DllSecur.h" + +#define k_EXE_ExtIndex 2 + +#define kInputBufSize ((size_t)1 << 18) + +static const char * const kExts[] = +{ + "bat" + , "cmd" + , "exe" + , "inf" + , "msi" + #ifdef UNDER_CE + , "cab" + #endif + , "html" + , "htm" +}; + +static const char * const kNames[] = +{ + "setup" + , "install" + , "run" + , "start" +}; + +static unsigned FindExt(const wchar_t *s, unsigned *extLen) +{ + unsigned len = (unsigned)wcslen(s); + unsigned i; + for (i = len; i > 0; i--) + { + if (s[i - 1] == '.') + { + *extLen = len - i; + return i - 1; + } + } + *extLen = 0; + return len; +} + +#define MAKE_CHAR_UPPER(c) ((((c) >= 'a' && (c) <= 'z') ? (c) -= 0x20 : (c))) + +static unsigned FindItem(const char * const *items, unsigned num, const wchar_t *s, unsigned len) +{ + unsigned i; + for (i = 0; i < num; i++) + { + const char *item = items[i]; + unsigned itemLen = (unsigned)strlen(item); + unsigned j; + if (len != itemLen) + continue; + for (j = 0; j < len; j++) + { + unsigned c = (Byte)item[j]; + if (c != s[j] && MAKE_CHAR_UPPER(c) != s[j]) + break; + } + if (j == len) + return i; + } + return i; +} + +#ifdef _CONSOLE +static BOOL WINAPI HandlerRoutine(DWORD ctrlType) +{ + UNUSED_VAR(ctrlType); + return TRUE; +} +#endif + +static void PrintErrorMessage(const char *message) +{ + #ifdef _CONSOLE + printf("\n7-Zip Error: %s\n", message); + #else + #ifdef UNDER_CE + WCHAR messageW[256 + 4]; + unsigned i; + for (i = 0; i < 256 && message[i] != 0; i++) + messageW[i] = message[i]; + messageW[i] = 0; + MessageBoxW(0, messageW, L"7-Zip Error", MB_ICONERROR); + #else + MessageBoxA(0, message, "7-Zip Error", MB_ICONERROR); + #endif + #endif +} + +static WRes MyCreateDir(const WCHAR *name) +{ + return CreateDirectoryW(name, NULL) ? 0 : GetLastError(); +} + +#ifdef UNDER_CE +#define kBufferSize (1 << 13) +#else +#define kBufferSize (1 << 15) +#endif + +#define kSignatureSearchLimit (1 << 22) + +static BoolInt FindSignature(CSzFile *stream, UInt64 *resPos) +{ + Byte buf[kBufferSize]; + size_t numPrevBytes = 0; + *resPos = 0; + for (;;) + { + size_t processed, pos; + if (*resPos > kSignatureSearchLimit) + return False; + processed = kBufferSize - numPrevBytes; + if (File_Read(stream, buf + numPrevBytes, &processed) != 0) + return False; + processed += numPrevBytes; + if (processed < k7zStartHeaderSize || + (processed == k7zStartHeaderSize && numPrevBytes != 0)) + return False; + processed -= k7zStartHeaderSize; + for (pos = 0; pos <= processed; pos++) + { + for (; pos <= processed && buf[pos] != '7'; pos++); + if (pos > processed) + break; + if (memcmp(buf + pos, k7zSignature, k7zSignatureSize) == 0) + if (CrcCalc(buf + pos + 12, 20) == GetUi32(buf + pos + 8)) + { + *resPos += pos; + return True; + } + } + *resPos += processed; + numPrevBytes = k7zStartHeaderSize; + memmove(buf, buf + processed, k7zStartHeaderSize); + } +} + +static BoolInt DoesFileOrDirExist(const WCHAR *path) +{ + WIN32_FIND_DATAW fd; + HANDLE handle; + handle = FindFirstFileW(path, &fd); + if (handle == INVALID_HANDLE_VALUE) + return False; + FindClose(handle); + return True; +} + +static WRes RemoveDirWithSubItems(WCHAR *path) +{ + WIN32_FIND_DATAW fd; + HANDLE handle; + WRes res = 0; + size_t len = wcslen(path); + wcscpy(path + len, L"*"); + handle = FindFirstFileW(path, &fd); + path[len] = L'\0'; + if (handle == INVALID_HANDLE_VALUE) + return GetLastError(); + + for (;;) + { + if (wcscmp(fd.cFileName, L".") != 0 && + wcscmp(fd.cFileName, L"..") != 0) + { + wcscpy(path + len, fd.cFileName); + if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0) + { + wcscat(path, WSTRING_PATH_SEPARATOR); + res = RemoveDirWithSubItems(path); + } + else + { + SetFileAttributesW(path, 0); + if (DeleteFileW(path) == 0) + res = GetLastError(); + } + + if (res != 0) + break; + } + + if (!FindNextFileW(handle, &fd)) + { + res = GetLastError(); + if (res == ERROR_NO_MORE_FILES) + res = 0; + break; + } + } + + path[len] = L'\0'; + FindClose(handle); + if (res == 0) + { + if (!RemoveDirectoryW(path)) + res = GetLastError(); + } + return res; +} + +#ifdef _CONSOLE +int MY_CDECL main() +#else +int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, + #ifdef UNDER_CE + LPWSTR + #else + LPSTR + #endif + lpCmdLine, int nCmdShow) +#endif +{ + CFileInStream archiveStream; + CLookToRead2 lookStream; + CSzArEx db; + SRes res = SZ_OK; + ISzAlloc allocImp; + ISzAlloc allocTempImp; + WCHAR sfxPath[MAX_PATH + 2]; + WCHAR path[MAX_PATH * 3 + 2]; + #ifndef UNDER_CE + WCHAR workCurDir[MAX_PATH + 32]; + #endif + size_t pathLen; + DWORD winRes; + const wchar_t *cmdLineParams; + const char *errorMessage = NULL; + BoolInt useShellExecute = True; + DWORD exitCode = 0; + + LoadSecurityDlls(); + + #ifdef _CONSOLE + SetConsoleCtrlHandler(HandlerRoutine, TRUE); + #else + UNUSED_VAR(hInstance); + UNUSED_VAR(hPrevInstance); + UNUSED_VAR(lpCmdLine); + UNUSED_VAR(nCmdShow); + #endif + + CrcGenerateTable(); + + allocImp.Alloc = SzAlloc; + allocImp.Free = SzFree; + + allocTempImp.Alloc = SzAllocTemp; + allocTempImp.Free = SzFreeTemp; + + FileInStream_CreateVTable(&archiveStream); + LookToRead2_CreateVTable(&lookStream, False); + lookStream.buf = NULL; + + winRes = GetModuleFileNameW(NULL, sfxPath, MAX_PATH); + if (winRes == 0 || winRes > MAX_PATH) + return 1; + { + cmdLineParams = GetCommandLineW(); + #ifndef UNDER_CE + { + BoolInt quoteMode = False; + for (;; cmdLineParams++) + { + wchar_t c = *cmdLineParams; + if (c == L'\"') + quoteMode = !quoteMode; + else if (c == 0 || (c == L' ' && !quoteMode)) + break; + } + } + #endif + } + + { + unsigned i; + DWORD d; + winRes = GetTempPathW(MAX_PATH, path); + if (winRes == 0 || winRes > MAX_PATH) + return 1; + pathLen = wcslen(path); + d = (GetTickCount() << 12) ^ (GetCurrentThreadId() << 14) ^ GetCurrentProcessId(); + + for (i = 0;; i++, d += GetTickCount()) + { + if (i >= 100) + { + res = SZ_ERROR_FAIL; + break; + } + wcscpy(path + pathLen, L"7z"); + + { + wchar_t *s = path + wcslen(path); + UInt32 value = d; + unsigned k; + for (k = 0; k < 8; k++) + { + unsigned t = value & 0xF; + value >>= 4; + s[7 - k] = (wchar_t)((t < 10) ? ('0' + t) : ('A' + (t - 10))); + } + s[k] = '\0'; + } + + if (DoesFileOrDirExist(path)) + continue; + if (CreateDirectoryW(path, NULL)) + { + wcscat(path, WSTRING_PATH_SEPARATOR); + pathLen = wcslen(path); + break; + } + if (GetLastError() != ERROR_ALREADY_EXISTS) + { + res = SZ_ERROR_FAIL; + break; + } + } + + #ifndef UNDER_CE + wcscpy(workCurDir, path); + #endif + if (res != SZ_OK) + errorMessage = "Can't create temp folder"; + } + + if (res != SZ_OK) + { + if (!errorMessage) + errorMessage = "Error"; + PrintErrorMessage(errorMessage); + return 1; + } + + if (InFile_OpenW(&archiveStream.file, sfxPath) != 0) + { + errorMessage = "can not open input file"; + res = SZ_ERROR_FAIL; + } + else + { + UInt64 pos = 0; + if (!FindSignature(&archiveStream.file, &pos)) + res = SZ_ERROR_FAIL; + else if (File_Seek(&archiveStream.file, (Int64 *)&pos, SZ_SEEK_SET) != 0) + res = SZ_ERROR_FAIL; + if (res != 0) + errorMessage = "Can't find 7z archive"; + } + + if (res == SZ_OK) + { + lookStream.buf = (Byte *)ISzAlloc_Alloc(&allocImp, kInputBufSize); + if (!lookStream.buf) + res = SZ_ERROR_MEM; + else + { + lookStream.bufSize = kInputBufSize; + lookStream.realStream = &archiveStream.vt; + LookToRead2_Init(&lookStream); + } + } + + SzArEx_Init(&db); + + if (res == SZ_OK) + { + res = SzArEx_Open(&db, &lookStream.vt, &allocImp, &allocTempImp); + } + + if (res == SZ_OK) + { + UInt32 executeFileIndex = (UInt32)(Int32)-1; + UInt32 minPrice = 1 << 30; + UInt32 i; + UInt32 blockIndex = 0xFFFFFFFF; /* it can have any value before first call (if outBuffer = 0) */ + Byte *outBuffer = 0; /* it must be 0 before first call for each new archive. */ + size_t outBufferSize = 0; /* it can have any value before first call (if outBuffer = 0) */ + + for (i = 0; i < db.NumFiles; i++) + { + size_t offset = 0; + size_t outSizeProcessed = 0; + WCHAR *temp; + + if (SzArEx_GetFileNameUtf16(&db, i, NULL) >= MAX_PATH) + { + res = SZ_ERROR_FAIL; + break; + } + + temp = path + pathLen; + + SzArEx_GetFileNameUtf16(&db, i, (UInt16 *)temp); + { + res = SzArEx_Extract(&db, &lookStream.vt, i, + &blockIndex, &outBuffer, &outBufferSize, + &offset, &outSizeProcessed, + &allocImp, &allocTempImp); + if (res != SZ_OK) + break; + } + { + CSzFile outFile; + size_t processedSize; + size_t j; + size_t nameStartPos = 0; + for (j = 0; temp[j] != 0; j++) + { + if (temp[j] == '/') + { + temp[j] = 0; + MyCreateDir(path); + temp[j] = CHAR_PATH_SEPARATOR; + nameStartPos = j + 1; + } + } + + if (SzArEx_IsDir(&db, i)) + { + MyCreateDir(path); + continue; + } + else + { + unsigned extLen; + const WCHAR *name = temp + nameStartPos; + unsigned len = (unsigned)wcslen(name); + unsigned nameLen = FindExt(temp + nameStartPos, &extLen); + unsigned extPrice = FindItem(kExts, sizeof(kExts) / sizeof(kExts[0]), name + len - extLen, extLen); + unsigned namePrice = FindItem(kNames, sizeof(kNames) / sizeof(kNames[0]), name, nameLen); + + unsigned price = namePrice + extPrice * 64 + (nameStartPos == 0 ? 0 : (1 << 12)); + if (minPrice > price) + { + minPrice = price; + executeFileIndex = i; + useShellExecute = (extPrice != k_EXE_ExtIndex); + } + + if (DoesFileOrDirExist(path)) + { + errorMessage = "Duplicate file"; + res = SZ_ERROR_FAIL; + break; + } + if (OutFile_OpenW(&outFile, path)) + { + errorMessage = "Can't open output file"; + res = SZ_ERROR_FAIL; + break; + } + } + + processedSize = outSizeProcessed; + if (File_Write(&outFile, outBuffer + offset, &processedSize) != 0 || processedSize != outSizeProcessed) + { + errorMessage = "Can't write output file"; + res = SZ_ERROR_FAIL; + } + + #ifdef USE_WINDOWS_FILE + if (SzBitWithVals_Check(&db.MTime, i)) + { + const CNtfsFileTime *t = db.MTime.Vals + i; + FILETIME mTime; + mTime.dwLowDateTime = t->Low; + mTime.dwHighDateTime = t->High; + SetFileTime(outFile.handle, NULL, NULL, &mTime); + } + #endif + + { + SRes res2 = File_Close(&outFile); + if (res != SZ_OK) + break; + if (res2 != SZ_OK) + { + res = res2; + break; + } + } + #ifdef USE_WINDOWS_FILE + if (SzBitWithVals_Check(&db.Attribs, i)) + SetFileAttributesW(path, db.Attribs.Vals[i]); + #endif + } + } + + if (res == SZ_OK) + { + if (executeFileIndex == (UInt32)(Int32)-1) + { + errorMessage = "There is no file to execute"; + res = SZ_ERROR_FAIL; + } + else + { + WCHAR *temp = path + pathLen; + UInt32 j; + SzArEx_GetFileNameUtf16(&db, executeFileIndex, (UInt16 *)temp); + for (j = 0; temp[j] != 0; j++) + if (temp[j] == '/') + temp[j] = CHAR_PATH_SEPARATOR; + } + } + ISzAlloc_Free(&allocImp, outBuffer); + } + + SzArEx_Free(&db, &allocImp); + + ISzAlloc_Free(&allocImp, lookStream.buf); + + File_Close(&archiveStream.file); + + if (res == SZ_OK) + { + HANDLE hProcess = 0; + + #ifndef UNDER_CE + WCHAR oldCurDir[MAX_PATH + 2]; + oldCurDir[0] = 0; + { + DWORD needLen = GetCurrentDirectory(MAX_PATH + 1, oldCurDir); + if (needLen == 0 || needLen > MAX_PATH) + oldCurDir[0] = 0; + SetCurrentDirectory(workCurDir); + } + #endif + + if (useShellExecute) + { + SHELLEXECUTEINFO ei; + UINT32 executeRes; + BOOL success; + + memset(&ei, 0, sizeof(ei)); + ei.cbSize = sizeof(ei); + ei.lpFile = path; + ei.fMask = SEE_MASK_NOCLOSEPROCESS + #ifndef UNDER_CE + | SEE_MASK_FLAG_DDEWAIT + #endif + /* | SEE_MASK_NO_CONSOLE */ + ; + if (wcslen(cmdLineParams) != 0) + ei.lpParameters = cmdLineParams; + ei.nShow = SW_SHOWNORMAL; /* SW_HIDE; */ + success = ShellExecuteEx(&ei); + executeRes = (UINT32)(UINT_PTR)ei.hInstApp; + if (!success || (executeRes <= 32 && executeRes != 0)) /* executeRes = 0 in Windows CE */ + res = SZ_ERROR_FAIL; + else + hProcess = ei.hProcess; + } + else + { + STARTUPINFOW si; + PROCESS_INFORMATION pi; + WCHAR cmdLine[MAX_PATH * 3]; + + wcscpy(cmdLine, path); + wcscat(cmdLine, cmdLineParams); + memset(&si, 0, sizeof(si)); + si.cb = sizeof(si); + if (CreateProcessW(NULL, cmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi) == 0) + res = SZ_ERROR_FAIL; + else + { + CloseHandle(pi.hThread); + hProcess = pi.hProcess; + } + } + + if (hProcess != 0) + { + WaitForSingleObject(hProcess, INFINITE); + if (!GetExitCodeProcess(hProcess, &exitCode)) + exitCode = 1; + CloseHandle(hProcess); + } + + #ifndef UNDER_CE + SetCurrentDirectory(oldCurDir); + #endif + } + + path[pathLen] = L'\0'; + RemoveDirWithSubItems(path); + + if (res == SZ_OK) + return (int)exitCode; + + { + if (res == SZ_ERROR_UNSUPPORTED) + errorMessage = "Decoder doesn't support this archive"; + else if (res == SZ_ERROR_MEM) + errorMessage = "Can't allocate required memory"; + else if (res == SZ_ERROR_CRC) + errorMessage = "CRC error"; + else + { + if (!errorMessage) + errorMessage = "ERROR"; + } + + if (errorMessage) + PrintErrorMessage(errorMessage); + } + return 1; +} diff --git a/deps/LZMA-SDK/C/Util/SfxSetup/SfxSetup.dsp b/deps/LZMA-SDK/C/Util/SfxSetup/SfxSetup.dsp index be9de6dec..60439a6f7 100644 --- a/deps/LZMA-SDK/C/Util/SfxSetup/SfxSetup.dsp +++ b/deps/LZMA-SDK/C/Util/SfxSetup/SfxSetup.dsp @@ -1,231 +1,231 @@ -# Microsoft Developer Studio Project File - Name="SfxSetup" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Application" 0x0101 - -CFG=SfxSetup - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "SfxSetup.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "SfxSetup.mak" CFG="SfxSetup - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "SfxSetup - Win32 Release" (based on "Win32 (x86) Application") -!MESSAGE "SfxSetup - Win32 Debug" (based on "Win32 (x86) Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "SfxSetup - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /W4 /WX /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /Yu"Precomp.h" /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x419 /d "NDEBUG" -# ADD RSC /l 0x419 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 - -!ELSEIF "$(CFG)" == "SfxSetup - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /W4 /WX /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /Yu"Precomp.h" /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x419 /d "_DEBUG" -# ADD RSC /l 0x419 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "SfxSetup - Win32 Release" -# Name "SfxSetup - Win32 Debug" -# Begin Group "Common" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\..\7z.h -# End Source File -# Begin Source File - -SOURCE=..\..\7zAlloc.c -# End Source File -# Begin Source File - -SOURCE=..\..\7zAlloc.h -# End Source File -# Begin Source File - -SOURCE=..\..\7zArcIn.c -# End Source File -# Begin Source File - -SOURCE=..\..\7zBuf.c -# End Source File -# Begin Source File - -SOURCE=..\..\7zBuf.h -# End Source File -# Begin Source File - -SOURCE=..\..\7zCrc.c -# End Source File -# Begin Source File - -SOURCE=..\..\7zCrc.h -# End Source File -# Begin Source File - -SOURCE=..\..\7zCrcOpt.c -# End Source File -# Begin Source File - -SOURCE=..\..\7zDec.c -# End Source File -# Begin Source File - -SOURCE=..\..\7zFile.c -# End Source File -# Begin Source File - -SOURCE=..\..\7zFile.h -# End Source File -# Begin Source File - -SOURCE=..\..\7zStream.c -# End Source File -# Begin Source File - -SOURCE=..\..\7zTypes.h -# End Source File -# Begin Source File - -SOURCE=..\..\Bcj2.c -# End Source File -# Begin Source File - -SOURCE=..\..\Bcj2.h -# End Source File -# Begin Source File - -SOURCE=..\..\Bra.c -# End Source File -# Begin Source File - -SOURCE=..\..\Bra.h -# End Source File -# Begin Source File - -SOURCE=..\..\Bra86.c -# End Source File -# Begin Source File - -SOURCE=..\..\BraIA64.c -# End Source File -# Begin Source File - -SOURCE=..\..\CpuArch.c -# End Source File -# Begin Source File - -SOURCE=..\..\CpuArch.h -# End Source File -# Begin Source File - -SOURCE=..\..\Delta.c -# End Source File -# Begin Source File - -SOURCE=..\..\Delta.h -# End Source File -# Begin Source File - -SOURCE=..\..\DllSecur.c -# End Source File -# Begin Source File - -SOURCE=..\..\DllSecur.h -# End Source File -# Begin Source File - -SOURCE=..\..\Lzma2Dec.c -# End Source File -# Begin Source File - -SOURCE=..\..\Lzma2Dec.h -# End Source File -# Begin Source File - -SOURCE=..\..\LzmaDec.c -# End Source File -# Begin Source File - -SOURCE=..\..\LzmaDec.h -# End Source File -# End Group -# Begin Group "Spec" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\Precomp.c -# ADD CPP /Yc"Precomp.h" -# End Source File -# Begin Source File - -SOURCE=.\Precomp.h -# End Source File -# End Group -# Begin Source File - -SOURCE=.\SfxSetup.c -# End Source File -# End Target -# End Project +# Microsoft Developer Studio Project File - Name="SfxSetup" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=SfxSetup - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "SfxSetup.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "SfxSetup.mak" CFG="SfxSetup - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "SfxSetup - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "SfxSetup - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "SfxSetup - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W4 /WX /GX /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /Yu"Precomp.h" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x419 /d "NDEBUG" +# ADD RSC /l 0x419 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 + +!ELSEIF "$(CFG)" == "SfxSetup - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W4 /WX /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /Yu"Precomp.h" /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x419 /d "_DEBUG" +# ADD RSC /l 0x419 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "SfxSetup - Win32 Release" +# Name "SfxSetup - Win32 Debug" +# Begin Group "Common" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\..\7z.h +# End Source File +# Begin Source File + +SOURCE=..\..\7zAlloc.c +# End Source File +# Begin Source File + +SOURCE=..\..\7zAlloc.h +# End Source File +# Begin Source File + +SOURCE=..\..\7zArcIn.c +# End Source File +# Begin Source File + +SOURCE=..\..\7zBuf.c +# End Source File +# Begin Source File + +SOURCE=..\..\7zBuf.h +# End Source File +# Begin Source File + +SOURCE=..\..\7zCrc.c +# End Source File +# Begin Source File + +SOURCE=..\..\7zCrc.h +# End Source File +# Begin Source File + +SOURCE=..\..\7zCrcOpt.c +# End Source File +# Begin Source File + +SOURCE=..\..\7zDec.c +# End Source File +# Begin Source File + +SOURCE=..\..\7zFile.c +# End Source File +# Begin Source File + +SOURCE=..\..\7zFile.h +# End Source File +# Begin Source File + +SOURCE=..\..\7zStream.c +# End Source File +# Begin Source File + +SOURCE=..\..\7zTypes.h +# End Source File +# Begin Source File + +SOURCE=..\..\Bcj2.c +# End Source File +# Begin Source File + +SOURCE=..\..\Bcj2.h +# End Source File +# Begin Source File + +SOURCE=..\..\Bra.c +# End Source File +# Begin Source File + +SOURCE=..\..\Bra.h +# End Source File +# Begin Source File + +SOURCE=..\..\Bra86.c +# End Source File +# Begin Source File + +SOURCE=..\..\BraIA64.c +# End Source File +# Begin Source File + +SOURCE=..\..\CpuArch.c +# End Source File +# Begin Source File + +SOURCE=..\..\CpuArch.h +# End Source File +# Begin Source File + +SOURCE=..\..\Delta.c +# End Source File +# Begin Source File + +SOURCE=..\..\Delta.h +# End Source File +# Begin Source File + +SOURCE=..\..\DllSecur.c +# End Source File +# Begin Source File + +SOURCE=..\..\DllSecur.h +# End Source File +# Begin Source File + +SOURCE=..\..\Lzma2Dec.c +# End Source File +# Begin Source File + +SOURCE=..\..\Lzma2Dec.h +# End Source File +# Begin Source File + +SOURCE=..\..\LzmaDec.c +# End Source File +# Begin Source File + +SOURCE=..\..\LzmaDec.h +# End Source File +# End Group +# Begin Group "Spec" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\Precomp.c +# ADD CPP /Yc"Precomp.h" +# End Source File +# Begin Source File + +SOURCE=.\Precomp.h +# End Source File +# End Group +# Begin Source File + +SOURCE=.\SfxSetup.c +# End Source File +# End Target +# End Project diff --git a/deps/LZMA-SDK/C/Util/SfxSetup/SfxSetup.dsw b/deps/LZMA-SDK/C/Util/SfxSetup/SfxSetup.dsw index 128fcdd3e..ea2311129 100644 --- a/deps/LZMA-SDK/C/Util/SfxSetup/SfxSetup.dsw +++ b/deps/LZMA-SDK/C/Util/SfxSetup/SfxSetup.dsw @@ -1,29 +1,29 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "SfxSetup"=.\SfxSetup.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "SfxSetup"=.\SfxSetup.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/deps/LZMA-SDK/C/Util/SfxSetup/makefile b/deps/LZMA-SDK/C/Util/SfxSetup/makefile index c9f59ccd3..544da67df 100644 --- a/deps/LZMA-SDK/C/Util/SfxSetup/makefile +++ b/deps/LZMA-SDK/C/Util/SfxSetup/makefile @@ -1,37 +1,37 @@ -PROG = 7zS2.sfx -MY_FIXED = 1 - -C_OBJS = \ - $O\7zAlloc.obj \ - $O\7zArcIn.obj \ - $O\7zBuf.obj \ - $O\7zBuf2.obj \ - $O\7zCrc.obj \ - $O\7zCrcOpt.obj \ - $O\7zFile.obj \ - $O\7zDec.obj \ - $O\7zStream.obj \ - $O\Bcj2.obj \ - $O\Bra.obj \ - $O\Bra86.obj \ - $O\BraIA64.obj \ - $O\CpuArch.obj \ - $O\Delta.obj \ - $O\DllSecur.obj \ - $O\Lzma2Dec.obj \ - $O\LzmaDec.obj \ - -7Z_OBJS = \ - $O\SfxSetup.obj \ - -OBJS = \ - $(7Z_OBJS) \ - $(C_OBJS) \ - $O\resource.res - -!include "../../../CPP/Build.mak" - -$(7Z_OBJS): $(*B).c - $(COMPL_O1) -$(C_OBJS): ../../$(*B).c - $(COMPL_O1) +PROG = 7zS2.sfx +MY_FIXED = 1 + +C_OBJS = \ + $O\7zAlloc.obj \ + $O\7zArcIn.obj \ + $O\7zBuf.obj \ + $O\7zBuf2.obj \ + $O\7zCrc.obj \ + $O\7zCrcOpt.obj \ + $O\7zFile.obj \ + $O\7zDec.obj \ + $O\7zStream.obj \ + $O\Bcj2.obj \ + $O\Bra.obj \ + $O\Bra86.obj \ + $O\BraIA64.obj \ + $O\CpuArch.obj \ + $O\Delta.obj \ + $O\DllSecur.obj \ + $O\Lzma2Dec.obj \ + $O\LzmaDec.obj \ + +7Z_OBJS = \ + $O\SfxSetup.obj \ + +OBJS = \ + $(7Z_OBJS) \ + $(C_OBJS) \ + $O\resource.res + +!include "../../../CPP/Build.mak" + +$(7Z_OBJS): $(*B).c + $(COMPL_O1) +$(C_OBJS): ../../$(*B).c + $(COMPL_O1) diff --git a/deps/LZMA-SDK/C/Util/SfxSetup/makefile_con b/deps/LZMA-SDK/C/Util/SfxSetup/makefile_con index 6f604ed81..d0f835254 100644 --- a/deps/LZMA-SDK/C/Util/SfxSetup/makefile_con +++ b/deps/LZMA-SDK/C/Util/SfxSetup/makefile_con @@ -1,38 +1,38 @@ -PROG = 7zS2con.sfx -MY_FIXED = 1 -CFLAGS = $(CFLAGS) -D_CONSOLE - -C_OBJS = \ - $O\7zAlloc.obj \ - $O\7zArcIn.obj \ - $O\7zBuf.obj \ - $O\7zBuf2.obj \ - $O\7zCrc.obj \ - $O\7zCrcOpt.obj \ - $O\7zFile.obj \ - $O\7zDec.obj \ - $O\7zStream.obj \ - $O\Bcj2.obj \ - $O\Bra.obj \ - $O\Bra86.obj \ - $O\BraIA64.obj \ - $O\CpuArch.obj \ - $O\Delta.obj \ - $O\DllSecur.obj \ - $O\Lzma2Dec.obj \ - $O\LzmaDec.obj \ - -7Z_OBJS = \ - $O\SfxSetup.obj \ - -OBJS = \ - $(7Z_OBJS) \ - $(C_OBJS) \ - $O\resource.res - -!include "../../../CPP/Build.mak" - -$(7Z_OBJS): $(*B).c - $(COMPL_O1) -$(C_OBJS): ../../$(*B).c - $(COMPL_O1) +PROG = 7zS2con.sfx +MY_FIXED = 1 +CFLAGS = $(CFLAGS) -D_CONSOLE + +C_OBJS = \ + $O\7zAlloc.obj \ + $O\7zArcIn.obj \ + $O\7zBuf.obj \ + $O\7zBuf2.obj \ + $O\7zCrc.obj \ + $O\7zCrcOpt.obj \ + $O\7zFile.obj \ + $O\7zDec.obj \ + $O\7zStream.obj \ + $O\Bcj2.obj \ + $O\Bra.obj \ + $O\Bra86.obj \ + $O\BraIA64.obj \ + $O\CpuArch.obj \ + $O\Delta.obj \ + $O\DllSecur.obj \ + $O\Lzma2Dec.obj \ + $O\LzmaDec.obj \ + +7Z_OBJS = \ + $O\SfxSetup.obj \ + +OBJS = \ + $(7Z_OBJS) \ + $(C_OBJS) \ + $O\resource.res + +!include "../../../CPP/Build.mak" + +$(7Z_OBJS): $(*B).c + $(COMPL_O1) +$(C_OBJS): ../../$(*B).c + $(COMPL_O1) diff --git a/deps/LZMA-SDK/C/Util/SfxSetup/resource.rc b/deps/LZMA-SDK/C/Util/SfxSetup/resource.rc index 64f4e2ce7..0c1637f23 100644 --- a/deps/LZMA-SDK/C/Util/SfxSetup/resource.rc +++ b/deps/LZMA-SDK/C/Util/SfxSetup/resource.rc @@ -1,5 +1,5 @@ -#include "../../7zVersion.rc" - -MY_VERSION_INFO_APP("7z Setup SFX small", "7zS2.sfx") - -1 ICON "setup.ico" +#include "../../7zVersion.rc" + +MY_VERSION_INFO_APP("7z Setup SFX small", "7zS2.sfx") + +1 ICON "setup.ico" diff --git a/deps/LZMA-SDK/C/Xz.c b/deps/LZMA-SDK/C/Xz.c index d6e2596a9..7c53b6007 100644 --- a/deps/LZMA-SDK/C/Xz.c +++ b/deps/LZMA-SDK/C/Xz.c @@ -1,90 +1,90 @@ -/* Xz.c - Xz -2021-02-09 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include "7zCrc.h" -#include "CpuArch.h" -#include "Xz.h" -#include "XzCrc64.h" - -const Byte XZ_SIG[XZ_SIG_SIZE] = { 0xFD, '7', 'z', 'X', 'Z', 0 }; -/* const Byte XZ_FOOTER_SIG[XZ_FOOTER_SIG_SIZE] = { 'Y', 'Z' }; */ - -unsigned Xz_WriteVarInt(Byte *buf, UInt64 v) -{ - unsigned i = 0; - do - { - buf[i++] = (Byte)((v & 0x7F) | 0x80); - v >>= 7; - } - while (v != 0); - buf[(size_t)i - 1] &= 0x7F; - return i; -} - -void Xz_Construct(CXzStream *p) -{ - p->numBlocks = 0; - p->blocks = NULL; - p->flags = 0; -} - -void Xz_Free(CXzStream *p, ISzAllocPtr alloc) -{ - ISzAlloc_Free(alloc, p->blocks); - p->numBlocks = 0; - p->blocks = NULL; -} - -unsigned XzFlags_GetCheckSize(CXzStreamFlags f) -{ - unsigned t = XzFlags_GetCheckType(f); - return (t == 0) ? 0 : ((unsigned)4 << ((t - 1) / 3)); -} - -void XzCheck_Init(CXzCheck *p, unsigned mode) -{ - p->mode = mode; - switch (mode) - { - case XZ_CHECK_CRC32: p->crc = CRC_INIT_VAL; break; - case XZ_CHECK_CRC64: p->crc64 = CRC64_INIT_VAL; break; - case XZ_CHECK_SHA256: Sha256_Init(&p->sha); break; - } -} - -void XzCheck_Update(CXzCheck *p, const void *data, size_t size) -{ - switch (p->mode) - { - case XZ_CHECK_CRC32: p->crc = CrcUpdate(p->crc, data, size); break; - case XZ_CHECK_CRC64: p->crc64 = Crc64Update(p->crc64, data, size); break; - case XZ_CHECK_SHA256: Sha256_Update(&p->sha, (const Byte *)data, size); break; - } -} - -int XzCheck_Final(CXzCheck *p, Byte *digest) -{ - switch (p->mode) - { - case XZ_CHECK_CRC32: - SetUi32(digest, CRC_GET_DIGEST(p->crc)); - break; - case XZ_CHECK_CRC64: - { - int i; - UInt64 v = CRC64_GET_DIGEST(p->crc64); - for (i = 0; i < 8; i++, v >>= 8) - digest[i] = (Byte)(v & 0xFF); - break; - } - case XZ_CHECK_SHA256: - Sha256_Final(&p->sha, digest); - break; - default: - return 0; - } - return 1; -} +/* Xz.c - Xz +2021-02-09 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "7zCrc.h" +#include "CpuArch.h" +#include "Xz.h" +#include "XzCrc64.h" + +const Byte XZ_SIG[XZ_SIG_SIZE] = { 0xFD, '7', 'z', 'X', 'Z', 0 }; +/* const Byte XZ_FOOTER_SIG[XZ_FOOTER_SIG_SIZE] = { 'Y', 'Z' }; */ + +unsigned Xz_WriteVarInt(Byte *buf, UInt64 v) +{ + unsigned i = 0; + do + { + buf[i++] = (Byte)((v & 0x7F) | 0x80); + v >>= 7; + } + while (v != 0); + buf[(size_t)i - 1] &= 0x7F; + return i; +} + +void Xz_Construct(CXzStream *p) +{ + p->numBlocks = 0; + p->blocks = NULL; + p->flags = 0; +} + +void Xz_Free(CXzStream *p, ISzAllocPtr alloc) +{ + ISzAlloc_Free(alloc, p->blocks); + p->numBlocks = 0; + p->blocks = NULL; +} + +unsigned XzFlags_GetCheckSize(CXzStreamFlags f) +{ + unsigned t = XzFlags_GetCheckType(f); + return (t == 0) ? 0 : ((unsigned)4 << ((t - 1) / 3)); +} + +void XzCheck_Init(CXzCheck *p, unsigned mode) +{ + p->mode = mode; + switch (mode) + { + case XZ_CHECK_CRC32: p->crc = CRC_INIT_VAL; break; + case XZ_CHECK_CRC64: p->crc64 = CRC64_INIT_VAL; break; + case XZ_CHECK_SHA256: Sha256_Init(&p->sha); break; + } +} + +void XzCheck_Update(CXzCheck *p, const void *data, size_t size) +{ + switch (p->mode) + { + case XZ_CHECK_CRC32: p->crc = CrcUpdate(p->crc, data, size); break; + case XZ_CHECK_CRC64: p->crc64 = Crc64Update(p->crc64, data, size); break; + case XZ_CHECK_SHA256: Sha256_Update(&p->sha, (const Byte *)data, size); break; + } +} + +int XzCheck_Final(CXzCheck *p, Byte *digest) +{ + switch (p->mode) + { + case XZ_CHECK_CRC32: + SetUi32(digest, CRC_GET_DIGEST(p->crc)); + break; + case XZ_CHECK_CRC64: + { + int i; + UInt64 v = CRC64_GET_DIGEST(p->crc64); + for (i = 0; i < 8; i++, v >>= 8) + digest[i] = (Byte)(v & 0xFF); + break; + } + case XZ_CHECK_SHA256: + Sha256_Final(&p->sha, digest); + break; + default: + return 0; + } + return 1; +} diff --git a/deps/LZMA-SDK/C/Xz.h b/deps/LZMA-SDK/C/Xz.h index cf9458e39..849b944bf 100644 --- a/deps/LZMA-SDK/C/Xz.h +++ b/deps/LZMA-SDK/C/Xz.h @@ -1,517 +1,517 @@ -/* Xz.h - Xz interface -2021-04-01 : Igor Pavlov : Public domain */ - -#ifndef __XZ_H -#define __XZ_H - -#include "Sha256.h" - -EXTERN_C_BEGIN - -#define XZ_ID_Subblock 1 -#define XZ_ID_Delta 3 -#define XZ_ID_X86 4 -#define XZ_ID_PPC 5 -#define XZ_ID_IA64 6 -#define XZ_ID_ARM 7 -#define XZ_ID_ARMT 8 -#define XZ_ID_SPARC 9 -#define XZ_ID_LZMA2 0x21 - -unsigned Xz_ReadVarInt(const Byte *p, size_t maxSize, UInt64 *value); -unsigned Xz_WriteVarInt(Byte *buf, UInt64 v); - -/* ---------- xz block ---------- */ - -#define XZ_BLOCK_HEADER_SIZE_MAX 1024 - -#define XZ_NUM_FILTERS_MAX 4 -#define XZ_BF_NUM_FILTERS_MASK 3 -#define XZ_BF_PACK_SIZE (1 << 6) -#define XZ_BF_UNPACK_SIZE (1 << 7) - -#define XZ_FILTER_PROPS_SIZE_MAX 20 - -typedef struct -{ - UInt64 id; - UInt32 propsSize; - Byte props[XZ_FILTER_PROPS_SIZE_MAX]; -} CXzFilter; - -typedef struct -{ - UInt64 packSize; - UInt64 unpackSize; - Byte flags; - CXzFilter filters[XZ_NUM_FILTERS_MAX]; -} CXzBlock; - -#define XzBlock_GetNumFilters(p) (((unsigned)(p)->flags & XZ_BF_NUM_FILTERS_MASK) + 1) -#define XzBlock_HasPackSize(p) (((p)->flags & XZ_BF_PACK_SIZE) != 0) -#define XzBlock_HasUnpackSize(p) (((p)->flags & XZ_BF_UNPACK_SIZE) != 0) -#define XzBlock_HasUnsupportedFlags(p) (((p)->flags & ~(XZ_BF_NUM_FILTERS_MASK | XZ_BF_PACK_SIZE | XZ_BF_UNPACK_SIZE)) != 0) - -SRes XzBlock_Parse(CXzBlock *p, const Byte *header); -SRes XzBlock_ReadHeader(CXzBlock *p, ISeqInStream *inStream, BoolInt *isIndex, UInt32 *headerSizeRes); - -/* ---------- xz stream ---------- */ - -#define XZ_SIG_SIZE 6 -#define XZ_FOOTER_SIG_SIZE 2 - -extern const Byte XZ_SIG[XZ_SIG_SIZE]; - -/* -extern const Byte XZ_FOOTER_SIG[XZ_FOOTER_SIG_SIZE]; -*/ - -#define XZ_FOOTER_SIG_0 'Y' -#define XZ_FOOTER_SIG_1 'Z' - -#define XZ_STREAM_FLAGS_SIZE 2 -#define XZ_STREAM_CRC_SIZE 4 - -#define XZ_STREAM_HEADER_SIZE (XZ_SIG_SIZE + XZ_STREAM_FLAGS_SIZE + XZ_STREAM_CRC_SIZE) -#define XZ_STREAM_FOOTER_SIZE (XZ_FOOTER_SIG_SIZE + XZ_STREAM_FLAGS_SIZE + XZ_STREAM_CRC_SIZE + 4) - -#define XZ_CHECK_MASK 0xF -#define XZ_CHECK_NO 0 -#define XZ_CHECK_CRC32 1 -#define XZ_CHECK_CRC64 4 -#define XZ_CHECK_SHA256 10 - -typedef struct -{ - unsigned mode; - UInt32 crc; - UInt64 crc64; - CSha256 sha; -} CXzCheck; - -void XzCheck_Init(CXzCheck *p, unsigned mode); -void XzCheck_Update(CXzCheck *p, const void *data, size_t size); -int XzCheck_Final(CXzCheck *p, Byte *digest); - -typedef UInt16 CXzStreamFlags; - -#define XzFlags_IsSupported(f) ((f) <= XZ_CHECK_MASK) -#define XzFlags_GetCheckType(f) ((f) & XZ_CHECK_MASK) -#define XzFlags_HasDataCrc32(f) (Xz_GetCheckType(f) == XZ_CHECK_CRC32) -unsigned XzFlags_GetCheckSize(CXzStreamFlags f); - -SRes Xz_ParseHeader(CXzStreamFlags *p, const Byte *buf); -SRes Xz_ReadHeader(CXzStreamFlags *p, ISeqInStream *inStream); - -typedef struct -{ - UInt64 unpackSize; - UInt64 totalSize; -} CXzBlockSizes; - -typedef struct -{ - CXzStreamFlags flags; - size_t numBlocks; - CXzBlockSizes *blocks; - UInt64 startOffset; -} CXzStream; - -void Xz_Construct(CXzStream *p); -void Xz_Free(CXzStream *p, ISzAllocPtr alloc); - -#define XZ_SIZE_OVERFLOW ((UInt64)(Int64)-1) - -UInt64 Xz_GetUnpackSize(const CXzStream *p); -UInt64 Xz_GetPackSize(const CXzStream *p); - -typedef struct -{ - size_t num; - size_t numAllocated; - CXzStream *streams; -} CXzs; - -void Xzs_Construct(CXzs *p); -void Xzs_Free(CXzs *p, ISzAllocPtr alloc); -SRes Xzs_ReadBackward(CXzs *p, ILookInStream *inStream, Int64 *startOffset, ICompressProgress *progress, ISzAllocPtr alloc); - -UInt64 Xzs_GetNumBlocks(const CXzs *p); -UInt64 Xzs_GetUnpackSize(const CXzs *p); - - -// ECoderStatus values are identical to ELzmaStatus values of LZMA2 decoder - -typedef enum -{ - CODER_STATUS_NOT_SPECIFIED, /* use main error code instead */ - CODER_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */ - CODER_STATUS_NOT_FINISHED, /* stream was not finished */ - CODER_STATUS_NEEDS_MORE_INPUT /* you must provide more input bytes */ -} ECoderStatus; - - -// ECoderFinishMode values are identical to ELzmaFinishMode - -typedef enum -{ - CODER_FINISH_ANY, /* finish at any point */ - CODER_FINISH_END /* block must be finished at the end */ -} ECoderFinishMode; - - -typedef struct _IStateCoder -{ - void *p; - void (*Free)(void *p, ISzAllocPtr alloc); - SRes (*SetProps)(void *p, const Byte *props, size_t propSize, ISzAllocPtr alloc); - void (*Init)(void *p); - SRes (*Code2)(void *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, - int srcWasFinished, ECoderFinishMode finishMode, - // int *wasFinished, - ECoderStatus *status); - SizeT (*Filter)(void *p, Byte *data, SizeT size); -} IStateCoder; - - - -#define MIXCODER_NUM_FILTERS_MAX 4 - -typedef struct -{ - ISzAllocPtr alloc; - Byte *buf; - unsigned numCoders; - - Byte *outBuf; - size_t outBufSize; - size_t outWritten; // is equal to lzmaDecoder.dicPos (in outBuf mode) - BoolInt wasFinished; - SRes res; - ECoderStatus status; - // BoolInt SingleBufMode; - - int finished[MIXCODER_NUM_FILTERS_MAX - 1]; - size_t pos[MIXCODER_NUM_FILTERS_MAX - 1]; - size_t size[MIXCODER_NUM_FILTERS_MAX - 1]; - UInt64 ids[MIXCODER_NUM_FILTERS_MAX]; - SRes results[MIXCODER_NUM_FILTERS_MAX]; - IStateCoder coders[MIXCODER_NUM_FILTERS_MAX]; -} CMixCoder; - - -typedef enum -{ - XZ_STATE_STREAM_HEADER, - XZ_STATE_STREAM_INDEX, - XZ_STATE_STREAM_INDEX_CRC, - XZ_STATE_STREAM_FOOTER, - XZ_STATE_STREAM_PADDING, - XZ_STATE_BLOCK_HEADER, - XZ_STATE_BLOCK, - XZ_STATE_BLOCK_FOOTER -} EXzState; - - -typedef struct -{ - EXzState state; - UInt32 pos; - unsigned alignPos; - unsigned indexPreSize; - - CXzStreamFlags streamFlags; - - UInt32 blockHeaderSize; - UInt64 packSize; - UInt64 unpackSize; - - UInt64 numBlocks; // number of finished blocks in current stream - UInt64 indexSize; - UInt64 indexPos; - UInt64 padSize; - - UInt64 numStartedStreams; - UInt64 numFinishedStreams; - UInt64 numTotalBlocks; - - UInt32 crc; - CMixCoder decoder; - CXzBlock block; - CXzCheck check; - CSha256 sha; - - BoolInt parseMode; - BoolInt headerParsedOk; - BoolInt decodeToStreamSignature; - unsigned decodeOnlyOneBlock; - - Byte *outBuf; - size_t outBufSize; - size_t outDataWritten; // the size of data in (outBuf) that were fully unpacked - - Byte shaDigest[SHA256_DIGEST_SIZE]; - Byte buf[XZ_BLOCK_HEADER_SIZE_MAX]; -} CXzUnpacker; - -/* alloc : aligned for cache line allocation is better */ -void XzUnpacker_Construct(CXzUnpacker *p, ISzAllocPtr alloc); -void XzUnpacker_Init(CXzUnpacker *p); -void XzUnpacker_SetOutBuf(CXzUnpacker *p, Byte *outBuf, size_t outBufSize); -void XzUnpacker_Free(CXzUnpacker *p); - -/* - XzUnpacker - The sequence for decoding functions: - { - XzUnpacker_Construct() - [Decoding_Calls] - XzUnpacker_Free() - } - - [Decoding_Calls] - - There are 3 types of interfaces for [Decoding_Calls] calls: - - Interface-1 : Partial output buffers: - { - XzUnpacker_Init() - for() - { - XzUnpacker_Code(); - } - XzUnpacker_IsStreamWasFinished() - } - - Interface-2 : Direct output buffer: - Use it, if you know exact size of decoded data, and you need - whole xz unpacked data in one output buffer. - xz unpacker doesn't allocate additional buffer for lzma2 dictionary in that mode. - { - XzUnpacker_Init() - XzUnpacker_SetOutBufMode(); // to set output buffer and size - for() - { - XzUnpacker_Code(); // (dest = NULL) in XzUnpacker_Code() - } - XzUnpacker_IsStreamWasFinished() - } - - Interface-3 : Direct output buffer : One call full decoding - It unpacks whole input buffer to output buffer in one call. - It uses Interface-2 internally. - { - XzUnpacker_CodeFull() - XzUnpacker_IsStreamWasFinished() - } -*/ - -/* -finishMode: - It has meaning only if the decoding reaches output limit (*destLen). - CODER_FINISH_ANY - use smallest number of input bytes - CODER_FINISH_END - read EndOfStream marker after decoding - -Returns: - SZ_OK - status: - CODER_STATUS_NOT_FINISHED, - CODER_STATUS_NEEDS_MORE_INPUT - the decoder can return it in two cases: - 1) it needs more input data to finish current xz stream - 2) xz stream was finished successfully. But the decoder supports multiple - concatented xz streams. So it expects more input data for new xz streams. - Call XzUnpacker_IsStreamWasFinished() to check that latest xz stream was finished successfully. - - SZ_ERROR_MEM - Memory allocation error - SZ_ERROR_DATA - Data error - SZ_ERROR_UNSUPPORTED - Unsupported method or method properties - SZ_ERROR_CRC - CRC error - // SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). - - SZ_ERROR_NO_ARCHIVE - the error with xz Stream Header with one of the following reasons: - - xz Stream Signature failure - - CRC32 of xz Stream Header is failed - - The size of Stream padding is not multiple of four bytes. - It's possible to get that error, if xz stream was finished and the stream - contains some another data. In that case you can call XzUnpacker_GetExtraSize() - function to get real size of xz stream. -*/ - - -SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen, - const Byte *src, SizeT *srcLen, int srcFinished, - ECoderFinishMode finishMode, ECoderStatus *status); - -SRes XzUnpacker_CodeFull(CXzUnpacker *p, Byte *dest, SizeT *destLen, - const Byte *src, SizeT *srcLen, - ECoderFinishMode finishMode, ECoderStatus *status); - -/* -If you decode full xz stream(s), then you can call XzUnpacker_IsStreamWasFinished() -after successful XzUnpacker_CodeFull() or after last call of XzUnpacker_Code(). -*/ - -BoolInt XzUnpacker_IsStreamWasFinished(const CXzUnpacker *p); - -/* -XzUnpacker_GetExtraSize() returns then number of unconfirmed bytes, - if it's in (XZ_STATE_STREAM_HEADER) state or in (XZ_STATE_STREAM_PADDING) state. -These bytes can be some data after xz archive, or -it can be start of new xz stream. - -Call XzUnpacker_GetExtraSize() after XzUnpacker_Code() function to detect real size of -xz stream in two cases, if XzUnpacker_Code() returns: - res == SZ_OK && status == CODER_STATUS_NEEDS_MORE_INPUT - res == SZ_ERROR_NO_ARCHIVE -*/ - -UInt64 XzUnpacker_GetExtraSize(const CXzUnpacker *p); - - -/* - for random block decoding: - XzUnpacker_Init(); - set CXzUnpacker::streamFlags - XzUnpacker_PrepareToRandomBlockDecoding() - loop - { - XzUnpacker_Code() - XzUnpacker_IsBlockFinished() - } -*/ - -void XzUnpacker_PrepareToRandomBlockDecoding(CXzUnpacker *p); -BoolInt XzUnpacker_IsBlockFinished(const CXzUnpacker *p); - -#define XzUnpacker_GetPackSizeForIndex(p) ((p)->packSize + (p)->blockHeaderSize + XzFlags_GetCheckSize((p)->streamFlags)) - - - - - - -/* ---- Single-Thread and Multi-Thread xz Decoding with Input/Output Streams ---- */ - -/* - if (CXzDecMtProps::numThreads > 1), the decoder can try to use - Multi-Threading. The decoder analyses xz block header, and if - there are pack size and unpack size values stored in xz block header, - the decoder reads compressed data of block to internal buffers, - and then it can start parallel decoding, if there are another blocks. - The decoder can switch back to Single-Thread decoding after some conditions. - - The sequence of calls for xz decoding with in/out Streams: - { - XzDecMt_Create() - XzDecMtProps_Init(XzDecMtProps) to set default values of properties - // then you can change some XzDecMtProps parameters with required values - // here you can set the number of threads and (memUseMax) - the maximum - Memory usage for multithreading decoding. - for() - { - XzDecMt_Decode() // one call per one file - } - XzDecMt_Destroy() - } -*/ - - -typedef struct -{ - size_t inBufSize_ST; // size of input buffer for Single-Thread decoding - size_t outStep_ST; // size of output buffer for Single-Thread decoding - BoolInt ignoreErrors; // if set to 1, the decoder can ignore some errors and it skips broken parts of data. - - #ifndef _7ZIP_ST - unsigned numThreads; // the number of threads for Multi-Thread decoding. if (umThreads == 1) it will use Single-thread decoding - size_t inBufSize_MT; // size of small input data buffers for Multi-Thread decoding. Big number of such small buffers can be created - size_t memUseMax; // the limit of total memory usage for Multi-Thread decoding. - // it's recommended to set (memUseMax) manually to value that is smaller of total size of RAM in computer. - #endif -} CXzDecMtProps; - -void XzDecMtProps_Init(CXzDecMtProps *p); - - -typedef void * CXzDecMtHandle; - -/* - alloc : XzDecMt uses CAlignOffsetAlloc internally for addresses allocated by (alloc). - allocMid : for big allocations, aligned allocation is better -*/ - -CXzDecMtHandle XzDecMt_Create(ISzAllocPtr alloc, ISzAllocPtr allocMid); -void XzDecMt_Destroy(CXzDecMtHandle p); - - -typedef struct -{ - Byte UnpackSize_Defined; - Byte NumStreams_Defined; - Byte NumBlocks_Defined; - - Byte DataAfterEnd; // there are some additional data after good xz streams, and that data is not new xz stream. - Byte DecodingTruncated; // Decoding was Truncated, we need only partial output data - - UInt64 InSize; // pack size processed. That value doesn't include the data after - // end of xz stream, if that data was not correct - UInt64 OutSize; - - UInt64 NumStreams; - UInt64 NumBlocks; - - SRes DecodeRes; // the error code of xz streams data decoding - SRes ReadRes; // error code from ISeqInStream:Read() - SRes ProgressRes; // error code from ICompressProgress:Progress() - - SRes CombinedRes; // Combined result error code that shows main rusult - // = S_OK, if there is no error. - // but check also (DataAfterEnd) that can show additional minor errors. - - SRes CombinedRes_Type; // = SZ_ERROR_READ, if error from ISeqInStream - // = SZ_ERROR_PROGRESS, if error from ICompressProgress - // = SZ_ERROR_WRITE, if error from ISeqOutStream - // = SZ_ERROR_* codes for decoding -} CXzStatInfo; - -void XzStatInfo_Clear(CXzStatInfo *p); - -/* - -XzDecMt_Decode() -SRes: it's combined decoding result. It also is equal to stat->CombinedRes. - - SZ_OK - no error - check also output value in (stat->DataAfterEnd) - that can show additional possible error - - SZ_ERROR_MEM - Memory allocation error - SZ_ERROR_NO_ARCHIVE - is not xz archive - SZ_ERROR_ARCHIVE - Headers error - SZ_ERROR_DATA - Data Error - SZ_ERROR_UNSUPPORTED - Unsupported method or method properties - SZ_ERROR_CRC - CRC Error - SZ_ERROR_INPUT_EOF - it needs more input data - SZ_ERROR_WRITE - ISeqOutStream error - (SZ_ERROR_READ) - ISeqInStream errors - (SZ_ERROR_PROGRESS) - ICompressProgress errors - // SZ_ERROR_THREAD - error in multi-threading functions - MY_SRes_HRESULT_FROM_WRes(WRes_error) - error in multi-threading function -*/ - -SRes XzDecMt_Decode(CXzDecMtHandle p, - const CXzDecMtProps *props, - const UInt64 *outDataSize, // NULL means undefined - int finishMode, // 0 - partial unpacking is allowed, 1 - xz stream(s) must be finished - ISeqOutStream *outStream, - // Byte *outBuf, size_t *outBufSize, - ISeqInStream *inStream, - // const Byte *inData, size_t inDataSize, - CXzStatInfo *stat, // out: decoding results and statistics - int *isMT, // out: 0 means that ST (Single-Thread) version was used - // 1 means that MT (Multi-Thread) version was used - ICompressProgress *progress); - -EXTERN_C_END - -#endif +/* Xz.h - Xz interface +2021-04-01 : Igor Pavlov : Public domain */ + +#ifndef __XZ_H +#define __XZ_H + +#include "Sha256.h" + +EXTERN_C_BEGIN + +#define XZ_ID_Subblock 1 +#define XZ_ID_Delta 3 +#define XZ_ID_X86 4 +#define XZ_ID_PPC 5 +#define XZ_ID_IA64 6 +#define XZ_ID_ARM 7 +#define XZ_ID_ARMT 8 +#define XZ_ID_SPARC 9 +#define XZ_ID_LZMA2 0x21 + +unsigned Xz_ReadVarInt(const Byte *p, size_t maxSize, UInt64 *value); +unsigned Xz_WriteVarInt(Byte *buf, UInt64 v); + +/* ---------- xz block ---------- */ + +#define XZ_BLOCK_HEADER_SIZE_MAX 1024 + +#define XZ_NUM_FILTERS_MAX 4 +#define XZ_BF_NUM_FILTERS_MASK 3 +#define XZ_BF_PACK_SIZE (1 << 6) +#define XZ_BF_UNPACK_SIZE (1 << 7) + +#define XZ_FILTER_PROPS_SIZE_MAX 20 + +typedef struct +{ + UInt64 id; + UInt32 propsSize; + Byte props[XZ_FILTER_PROPS_SIZE_MAX]; +} CXzFilter; + +typedef struct +{ + UInt64 packSize; + UInt64 unpackSize; + Byte flags; + CXzFilter filters[XZ_NUM_FILTERS_MAX]; +} CXzBlock; + +#define XzBlock_GetNumFilters(p) (((unsigned)(p)->flags & XZ_BF_NUM_FILTERS_MASK) + 1) +#define XzBlock_HasPackSize(p) (((p)->flags & XZ_BF_PACK_SIZE) != 0) +#define XzBlock_HasUnpackSize(p) (((p)->flags & XZ_BF_UNPACK_SIZE) != 0) +#define XzBlock_HasUnsupportedFlags(p) (((p)->flags & ~(XZ_BF_NUM_FILTERS_MASK | XZ_BF_PACK_SIZE | XZ_BF_UNPACK_SIZE)) != 0) + +SRes XzBlock_Parse(CXzBlock *p, const Byte *header); +SRes XzBlock_ReadHeader(CXzBlock *p, ISeqInStream *inStream, BoolInt *isIndex, UInt32 *headerSizeRes); + +/* ---------- xz stream ---------- */ + +#define XZ_SIG_SIZE 6 +#define XZ_FOOTER_SIG_SIZE 2 + +extern const Byte XZ_SIG[XZ_SIG_SIZE]; + +/* +extern const Byte XZ_FOOTER_SIG[XZ_FOOTER_SIG_SIZE]; +*/ + +#define XZ_FOOTER_SIG_0 'Y' +#define XZ_FOOTER_SIG_1 'Z' + +#define XZ_STREAM_FLAGS_SIZE 2 +#define XZ_STREAM_CRC_SIZE 4 + +#define XZ_STREAM_HEADER_SIZE (XZ_SIG_SIZE + XZ_STREAM_FLAGS_SIZE + XZ_STREAM_CRC_SIZE) +#define XZ_STREAM_FOOTER_SIZE (XZ_FOOTER_SIG_SIZE + XZ_STREAM_FLAGS_SIZE + XZ_STREAM_CRC_SIZE + 4) + +#define XZ_CHECK_MASK 0xF +#define XZ_CHECK_NO 0 +#define XZ_CHECK_CRC32 1 +#define XZ_CHECK_CRC64 4 +#define XZ_CHECK_SHA256 10 + +typedef struct +{ + unsigned mode; + UInt32 crc; + UInt64 crc64; + CSha256 sha; +} CXzCheck; + +void XzCheck_Init(CXzCheck *p, unsigned mode); +void XzCheck_Update(CXzCheck *p, const void *data, size_t size); +int XzCheck_Final(CXzCheck *p, Byte *digest); + +typedef UInt16 CXzStreamFlags; + +#define XzFlags_IsSupported(f) ((f) <= XZ_CHECK_MASK) +#define XzFlags_GetCheckType(f) ((f) & XZ_CHECK_MASK) +#define XzFlags_HasDataCrc32(f) (Xz_GetCheckType(f) == XZ_CHECK_CRC32) +unsigned XzFlags_GetCheckSize(CXzStreamFlags f); + +SRes Xz_ParseHeader(CXzStreamFlags *p, const Byte *buf); +SRes Xz_ReadHeader(CXzStreamFlags *p, ISeqInStream *inStream); + +typedef struct +{ + UInt64 unpackSize; + UInt64 totalSize; +} CXzBlockSizes; + +typedef struct +{ + CXzStreamFlags flags; + size_t numBlocks; + CXzBlockSizes *blocks; + UInt64 startOffset; +} CXzStream; + +void Xz_Construct(CXzStream *p); +void Xz_Free(CXzStream *p, ISzAllocPtr alloc); + +#define XZ_SIZE_OVERFLOW ((UInt64)(Int64)-1) + +UInt64 Xz_GetUnpackSize(const CXzStream *p); +UInt64 Xz_GetPackSize(const CXzStream *p); + +typedef struct +{ + size_t num; + size_t numAllocated; + CXzStream *streams; +} CXzs; + +void Xzs_Construct(CXzs *p); +void Xzs_Free(CXzs *p, ISzAllocPtr alloc); +SRes Xzs_ReadBackward(CXzs *p, ILookInStream *inStream, Int64 *startOffset, ICompressProgress *progress, ISzAllocPtr alloc); + +UInt64 Xzs_GetNumBlocks(const CXzs *p); +UInt64 Xzs_GetUnpackSize(const CXzs *p); + + +// ECoderStatus values are identical to ELzmaStatus values of LZMA2 decoder + +typedef enum +{ + CODER_STATUS_NOT_SPECIFIED, /* use main error code instead */ + CODER_STATUS_FINISHED_WITH_MARK, /* stream was finished with end mark. */ + CODER_STATUS_NOT_FINISHED, /* stream was not finished */ + CODER_STATUS_NEEDS_MORE_INPUT /* you must provide more input bytes */ +} ECoderStatus; + + +// ECoderFinishMode values are identical to ELzmaFinishMode + +typedef enum +{ + CODER_FINISH_ANY, /* finish at any point */ + CODER_FINISH_END /* block must be finished at the end */ +} ECoderFinishMode; + + +typedef struct _IStateCoder +{ + void *p; + void (*Free)(void *p, ISzAllocPtr alloc); + SRes (*SetProps)(void *p, const Byte *props, size_t propSize, ISzAllocPtr alloc); + void (*Init)(void *p); + SRes (*Code2)(void *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + int srcWasFinished, ECoderFinishMode finishMode, + // int *wasFinished, + ECoderStatus *status); + SizeT (*Filter)(void *p, Byte *data, SizeT size); +} IStateCoder; + + + +#define MIXCODER_NUM_FILTERS_MAX 4 + +typedef struct +{ + ISzAllocPtr alloc; + Byte *buf; + unsigned numCoders; + + Byte *outBuf; + size_t outBufSize; + size_t outWritten; // is equal to lzmaDecoder.dicPos (in outBuf mode) + BoolInt wasFinished; + SRes res; + ECoderStatus status; + // BoolInt SingleBufMode; + + int finished[MIXCODER_NUM_FILTERS_MAX - 1]; + size_t pos[MIXCODER_NUM_FILTERS_MAX - 1]; + size_t size[MIXCODER_NUM_FILTERS_MAX - 1]; + UInt64 ids[MIXCODER_NUM_FILTERS_MAX]; + SRes results[MIXCODER_NUM_FILTERS_MAX]; + IStateCoder coders[MIXCODER_NUM_FILTERS_MAX]; +} CMixCoder; + + +typedef enum +{ + XZ_STATE_STREAM_HEADER, + XZ_STATE_STREAM_INDEX, + XZ_STATE_STREAM_INDEX_CRC, + XZ_STATE_STREAM_FOOTER, + XZ_STATE_STREAM_PADDING, + XZ_STATE_BLOCK_HEADER, + XZ_STATE_BLOCK, + XZ_STATE_BLOCK_FOOTER +} EXzState; + + +typedef struct +{ + EXzState state; + UInt32 pos; + unsigned alignPos; + unsigned indexPreSize; + + CXzStreamFlags streamFlags; + + UInt32 blockHeaderSize; + UInt64 packSize; + UInt64 unpackSize; + + UInt64 numBlocks; // number of finished blocks in current stream + UInt64 indexSize; + UInt64 indexPos; + UInt64 padSize; + + UInt64 numStartedStreams; + UInt64 numFinishedStreams; + UInt64 numTotalBlocks; + + UInt32 crc; + CMixCoder decoder; + CXzBlock block; + CXzCheck check; + CSha256 sha; + + BoolInt parseMode; + BoolInt headerParsedOk; + BoolInt decodeToStreamSignature; + unsigned decodeOnlyOneBlock; + + Byte *outBuf; + size_t outBufSize; + size_t outDataWritten; // the size of data in (outBuf) that were fully unpacked + + Byte shaDigest[SHA256_DIGEST_SIZE]; + Byte buf[XZ_BLOCK_HEADER_SIZE_MAX]; +} CXzUnpacker; + +/* alloc : aligned for cache line allocation is better */ +void XzUnpacker_Construct(CXzUnpacker *p, ISzAllocPtr alloc); +void XzUnpacker_Init(CXzUnpacker *p); +void XzUnpacker_SetOutBuf(CXzUnpacker *p, Byte *outBuf, size_t outBufSize); +void XzUnpacker_Free(CXzUnpacker *p); + +/* + XzUnpacker + The sequence for decoding functions: + { + XzUnpacker_Construct() + [Decoding_Calls] + XzUnpacker_Free() + } + + [Decoding_Calls] + + There are 3 types of interfaces for [Decoding_Calls] calls: + + Interface-1 : Partial output buffers: + { + XzUnpacker_Init() + for() + { + XzUnpacker_Code(); + } + XzUnpacker_IsStreamWasFinished() + } + + Interface-2 : Direct output buffer: + Use it, if you know exact size of decoded data, and you need + whole xz unpacked data in one output buffer. + xz unpacker doesn't allocate additional buffer for lzma2 dictionary in that mode. + { + XzUnpacker_Init() + XzUnpacker_SetOutBufMode(); // to set output buffer and size + for() + { + XzUnpacker_Code(); // (dest = NULL) in XzUnpacker_Code() + } + XzUnpacker_IsStreamWasFinished() + } + + Interface-3 : Direct output buffer : One call full decoding + It unpacks whole input buffer to output buffer in one call. + It uses Interface-2 internally. + { + XzUnpacker_CodeFull() + XzUnpacker_IsStreamWasFinished() + } +*/ + +/* +finishMode: + It has meaning only if the decoding reaches output limit (*destLen). + CODER_FINISH_ANY - use smallest number of input bytes + CODER_FINISH_END - read EndOfStream marker after decoding + +Returns: + SZ_OK + status: + CODER_STATUS_NOT_FINISHED, + CODER_STATUS_NEEDS_MORE_INPUT - the decoder can return it in two cases: + 1) it needs more input data to finish current xz stream + 2) xz stream was finished successfully. But the decoder supports multiple + concatented xz streams. So it expects more input data for new xz streams. + Call XzUnpacker_IsStreamWasFinished() to check that latest xz stream was finished successfully. + + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_DATA - Data error + SZ_ERROR_UNSUPPORTED - Unsupported method or method properties + SZ_ERROR_CRC - CRC error + // SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). + + SZ_ERROR_NO_ARCHIVE - the error with xz Stream Header with one of the following reasons: + - xz Stream Signature failure + - CRC32 of xz Stream Header is failed + - The size of Stream padding is not multiple of four bytes. + It's possible to get that error, if xz stream was finished and the stream + contains some another data. In that case you can call XzUnpacker_GetExtraSize() + function to get real size of xz stream. +*/ + + +SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, int srcFinished, + ECoderFinishMode finishMode, ECoderStatus *status); + +SRes XzUnpacker_CodeFull(CXzUnpacker *p, Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, + ECoderFinishMode finishMode, ECoderStatus *status); + +/* +If you decode full xz stream(s), then you can call XzUnpacker_IsStreamWasFinished() +after successful XzUnpacker_CodeFull() or after last call of XzUnpacker_Code(). +*/ + +BoolInt XzUnpacker_IsStreamWasFinished(const CXzUnpacker *p); + +/* +XzUnpacker_GetExtraSize() returns then number of unconfirmed bytes, + if it's in (XZ_STATE_STREAM_HEADER) state or in (XZ_STATE_STREAM_PADDING) state. +These bytes can be some data after xz archive, or +it can be start of new xz stream. + +Call XzUnpacker_GetExtraSize() after XzUnpacker_Code() function to detect real size of +xz stream in two cases, if XzUnpacker_Code() returns: + res == SZ_OK && status == CODER_STATUS_NEEDS_MORE_INPUT + res == SZ_ERROR_NO_ARCHIVE +*/ + +UInt64 XzUnpacker_GetExtraSize(const CXzUnpacker *p); + + +/* + for random block decoding: + XzUnpacker_Init(); + set CXzUnpacker::streamFlags + XzUnpacker_PrepareToRandomBlockDecoding() + loop + { + XzUnpacker_Code() + XzUnpacker_IsBlockFinished() + } +*/ + +void XzUnpacker_PrepareToRandomBlockDecoding(CXzUnpacker *p); +BoolInt XzUnpacker_IsBlockFinished(const CXzUnpacker *p); + +#define XzUnpacker_GetPackSizeForIndex(p) ((p)->packSize + (p)->blockHeaderSize + XzFlags_GetCheckSize((p)->streamFlags)) + + + + + + +/* ---- Single-Thread and Multi-Thread xz Decoding with Input/Output Streams ---- */ + +/* + if (CXzDecMtProps::numThreads > 1), the decoder can try to use + Multi-Threading. The decoder analyses xz block header, and if + there are pack size and unpack size values stored in xz block header, + the decoder reads compressed data of block to internal buffers, + and then it can start parallel decoding, if there are another blocks. + The decoder can switch back to Single-Thread decoding after some conditions. + + The sequence of calls for xz decoding with in/out Streams: + { + XzDecMt_Create() + XzDecMtProps_Init(XzDecMtProps) to set default values of properties + // then you can change some XzDecMtProps parameters with required values + // here you can set the number of threads and (memUseMax) - the maximum + Memory usage for multithreading decoding. + for() + { + XzDecMt_Decode() // one call per one file + } + XzDecMt_Destroy() + } +*/ + + +typedef struct +{ + size_t inBufSize_ST; // size of input buffer for Single-Thread decoding + size_t outStep_ST; // size of output buffer for Single-Thread decoding + BoolInt ignoreErrors; // if set to 1, the decoder can ignore some errors and it skips broken parts of data. + + #ifndef _7ZIP_ST + unsigned numThreads; // the number of threads for Multi-Thread decoding. if (umThreads == 1) it will use Single-thread decoding + size_t inBufSize_MT; // size of small input data buffers for Multi-Thread decoding. Big number of such small buffers can be created + size_t memUseMax; // the limit of total memory usage for Multi-Thread decoding. + // it's recommended to set (memUseMax) manually to value that is smaller of total size of RAM in computer. + #endif +} CXzDecMtProps; + +void XzDecMtProps_Init(CXzDecMtProps *p); + + +typedef void * CXzDecMtHandle; + +/* + alloc : XzDecMt uses CAlignOffsetAlloc internally for addresses allocated by (alloc). + allocMid : for big allocations, aligned allocation is better +*/ + +CXzDecMtHandle XzDecMt_Create(ISzAllocPtr alloc, ISzAllocPtr allocMid); +void XzDecMt_Destroy(CXzDecMtHandle p); + + +typedef struct +{ + Byte UnpackSize_Defined; + Byte NumStreams_Defined; + Byte NumBlocks_Defined; + + Byte DataAfterEnd; // there are some additional data after good xz streams, and that data is not new xz stream. + Byte DecodingTruncated; // Decoding was Truncated, we need only partial output data + + UInt64 InSize; // pack size processed. That value doesn't include the data after + // end of xz stream, if that data was not correct + UInt64 OutSize; + + UInt64 NumStreams; + UInt64 NumBlocks; + + SRes DecodeRes; // the error code of xz streams data decoding + SRes ReadRes; // error code from ISeqInStream:Read() + SRes ProgressRes; // error code from ICompressProgress:Progress() + + SRes CombinedRes; // Combined result error code that shows main rusult + // = S_OK, if there is no error. + // but check also (DataAfterEnd) that can show additional minor errors. + + SRes CombinedRes_Type; // = SZ_ERROR_READ, if error from ISeqInStream + // = SZ_ERROR_PROGRESS, if error from ICompressProgress + // = SZ_ERROR_WRITE, if error from ISeqOutStream + // = SZ_ERROR_* codes for decoding +} CXzStatInfo; + +void XzStatInfo_Clear(CXzStatInfo *p); + +/* + +XzDecMt_Decode() +SRes: it's combined decoding result. It also is equal to stat->CombinedRes. + + SZ_OK - no error + check also output value in (stat->DataAfterEnd) + that can show additional possible error + + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_NO_ARCHIVE - is not xz archive + SZ_ERROR_ARCHIVE - Headers error + SZ_ERROR_DATA - Data Error + SZ_ERROR_UNSUPPORTED - Unsupported method or method properties + SZ_ERROR_CRC - CRC Error + SZ_ERROR_INPUT_EOF - it needs more input data + SZ_ERROR_WRITE - ISeqOutStream error + (SZ_ERROR_READ) - ISeqInStream errors + (SZ_ERROR_PROGRESS) - ICompressProgress errors + // SZ_ERROR_THREAD - error in multi-threading functions + MY_SRes_HRESULT_FROM_WRes(WRes_error) - error in multi-threading function +*/ + +SRes XzDecMt_Decode(CXzDecMtHandle p, + const CXzDecMtProps *props, + const UInt64 *outDataSize, // NULL means undefined + int finishMode, // 0 - partial unpacking is allowed, 1 - xz stream(s) must be finished + ISeqOutStream *outStream, + // Byte *outBuf, size_t *outBufSize, + ISeqInStream *inStream, + // const Byte *inData, size_t inDataSize, + CXzStatInfo *stat, // out: decoding results and statistics + int *isMT, // out: 0 means that ST (Single-Thread) version was used + // 1 means that MT (Multi-Thread) version was used + ICompressProgress *progress); + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/XzCrc64.c b/deps/LZMA-SDK/C/XzCrc64.c index e9ca9ec26..b6d02cbeb 100644 --- a/deps/LZMA-SDK/C/XzCrc64.c +++ b/deps/LZMA-SDK/C/XzCrc64.c @@ -1,86 +1,86 @@ -/* XzCrc64.c -- CRC64 calculation -2017-05-23 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include "XzCrc64.h" -#include "CpuArch.h" - -#define kCrc64Poly UINT64_CONST(0xC96C5795D7870F42) - -#ifdef MY_CPU_LE - #define CRC64_NUM_TABLES 4 -#else - #define CRC64_NUM_TABLES 5 - #define CRC_UINT64_SWAP(v) \ - ((v >> 56) \ - | ((v >> 40) & ((UInt64)0xFF << 8)) \ - | ((v >> 24) & ((UInt64)0xFF << 16)) \ - | ((v >> 8) & ((UInt64)0xFF << 24)) \ - | ((v << 8) & ((UInt64)0xFF << 32)) \ - | ((v << 24) & ((UInt64)0xFF << 40)) \ - | ((v << 40) & ((UInt64)0xFF << 48)) \ - | ((v << 56))) - - UInt64 MY_FAST_CALL XzCrc64UpdateT1_BeT4(UInt64 v, const void *data, size_t size, const UInt64 *table); -#endif - -#ifndef MY_CPU_BE - UInt64 MY_FAST_CALL XzCrc64UpdateT4(UInt64 v, const void *data, size_t size, const UInt64 *table); -#endif - -typedef UInt64 (MY_FAST_CALL *CRC64_FUNC)(UInt64 v, const void *data, size_t size, const UInt64 *table); - -static CRC64_FUNC g_Crc64Update; -UInt64 g_Crc64Table[256 * CRC64_NUM_TABLES]; - -UInt64 MY_FAST_CALL Crc64Update(UInt64 v, const void *data, size_t size) -{ - return g_Crc64Update(v, data, size, g_Crc64Table); -} - -UInt64 MY_FAST_CALL Crc64Calc(const void *data, size_t size) -{ - return g_Crc64Update(CRC64_INIT_VAL, data, size, g_Crc64Table) ^ CRC64_INIT_VAL; -} - -void MY_FAST_CALL Crc64GenerateTable() -{ - UInt32 i; - for (i = 0; i < 256; i++) - { - UInt64 r = i; - unsigned j; - for (j = 0; j < 8; j++) - r = (r >> 1) ^ (kCrc64Poly & ((UInt64)0 - (r & 1))); - g_Crc64Table[i] = r; - } - for (i = 256; i < 256 * CRC64_NUM_TABLES; i++) - { - UInt64 r = g_Crc64Table[(size_t)i - 256]; - g_Crc64Table[i] = g_Crc64Table[r & 0xFF] ^ (r >> 8); - } - - #ifdef MY_CPU_LE - - g_Crc64Update = XzCrc64UpdateT4; - - #else - { - #ifndef MY_CPU_BE - UInt32 k = 1; - if (*(const Byte *)&k == 1) - g_Crc64Update = XzCrc64UpdateT4; - else - #endif - { - for (i = 256 * CRC64_NUM_TABLES - 1; i >= 256; i--) - { - UInt64 x = g_Crc64Table[(size_t)i - 256]; - g_Crc64Table[i] = CRC_UINT64_SWAP(x); - } - g_Crc64Update = XzCrc64UpdateT1_BeT4; - } - } - #endif -} +/* XzCrc64.c -- CRC64 calculation +2017-05-23 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "XzCrc64.h" +#include "CpuArch.h" + +#define kCrc64Poly UINT64_CONST(0xC96C5795D7870F42) + +#ifdef MY_CPU_LE + #define CRC64_NUM_TABLES 4 +#else + #define CRC64_NUM_TABLES 5 + #define CRC_UINT64_SWAP(v) \ + ((v >> 56) \ + | ((v >> 40) & ((UInt64)0xFF << 8)) \ + | ((v >> 24) & ((UInt64)0xFF << 16)) \ + | ((v >> 8) & ((UInt64)0xFF << 24)) \ + | ((v << 8) & ((UInt64)0xFF << 32)) \ + | ((v << 24) & ((UInt64)0xFF << 40)) \ + | ((v << 40) & ((UInt64)0xFF << 48)) \ + | ((v << 56))) + + UInt64 MY_FAST_CALL XzCrc64UpdateT1_BeT4(UInt64 v, const void *data, size_t size, const UInt64 *table); +#endif + +#ifndef MY_CPU_BE + UInt64 MY_FAST_CALL XzCrc64UpdateT4(UInt64 v, const void *data, size_t size, const UInt64 *table); +#endif + +typedef UInt64 (MY_FAST_CALL *CRC64_FUNC)(UInt64 v, const void *data, size_t size, const UInt64 *table); + +static CRC64_FUNC g_Crc64Update; +UInt64 g_Crc64Table[256 * CRC64_NUM_TABLES]; + +UInt64 MY_FAST_CALL Crc64Update(UInt64 v, const void *data, size_t size) +{ + return g_Crc64Update(v, data, size, g_Crc64Table); +} + +UInt64 MY_FAST_CALL Crc64Calc(const void *data, size_t size) +{ + return g_Crc64Update(CRC64_INIT_VAL, data, size, g_Crc64Table) ^ CRC64_INIT_VAL; +} + +void MY_FAST_CALL Crc64GenerateTable() +{ + UInt32 i; + for (i = 0; i < 256; i++) + { + UInt64 r = i; + unsigned j; + for (j = 0; j < 8; j++) + r = (r >> 1) ^ (kCrc64Poly & ((UInt64)0 - (r & 1))); + g_Crc64Table[i] = r; + } + for (i = 256; i < 256 * CRC64_NUM_TABLES; i++) + { + UInt64 r = g_Crc64Table[(size_t)i - 256]; + g_Crc64Table[i] = g_Crc64Table[r & 0xFF] ^ (r >> 8); + } + + #ifdef MY_CPU_LE + + g_Crc64Update = XzCrc64UpdateT4; + + #else + { + #ifndef MY_CPU_BE + UInt32 k = 1; + if (*(const Byte *)&k == 1) + g_Crc64Update = XzCrc64UpdateT4; + else + #endif + { + for (i = 256 * CRC64_NUM_TABLES - 1; i >= 256; i--) + { + UInt64 x = g_Crc64Table[(size_t)i - 256]; + g_Crc64Table[i] = CRC_UINT64_SWAP(x); + } + g_Crc64Update = XzCrc64UpdateT1_BeT4; + } + } + #endif +} diff --git a/deps/LZMA-SDK/C/XzCrc64.h b/deps/LZMA-SDK/C/XzCrc64.h index 71b10d57e..08dbc330c 100644 --- a/deps/LZMA-SDK/C/XzCrc64.h +++ b/deps/LZMA-SDK/C/XzCrc64.h @@ -1,26 +1,26 @@ -/* XzCrc64.h -- CRC64 calculation -2013-01-18 : Igor Pavlov : Public domain */ - -#ifndef __XZ_CRC64_H -#define __XZ_CRC64_H - -#include - -#include "7zTypes.h" - -EXTERN_C_BEGIN - -extern UInt64 g_Crc64Table[]; - -void MY_FAST_CALL Crc64GenerateTable(void); - -#define CRC64_INIT_VAL UINT64_CONST(0xFFFFFFFFFFFFFFFF) -#define CRC64_GET_DIGEST(crc) ((crc) ^ CRC64_INIT_VAL) -#define CRC64_UPDATE_BYTE(crc, b) (g_Crc64Table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) - -UInt64 MY_FAST_CALL Crc64Update(UInt64 crc, const void *data, size_t size); -UInt64 MY_FAST_CALL Crc64Calc(const void *data, size_t size); - -EXTERN_C_END - -#endif +/* XzCrc64.h -- CRC64 calculation +2013-01-18 : Igor Pavlov : Public domain */ + +#ifndef __XZ_CRC64_H +#define __XZ_CRC64_H + +#include + +#include "7zTypes.h" + +EXTERN_C_BEGIN + +extern UInt64 g_Crc64Table[]; + +void MY_FAST_CALL Crc64GenerateTable(void); + +#define CRC64_INIT_VAL UINT64_CONST(0xFFFFFFFFFFFFFFFF) +#define CRC64_GET_DIGEST(crc) ((crc) ^ CRC64_INIT_VAL) +#define CRC64_UPDATE_BYTE(crc, b) (g_Crc64Table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) + +UInt64 MY_FAST_CALL Crc64Update(UInt64 crc, const void *data, size_t size); +UInt64 MY_FAST_CALL Crc64Calc(const void *data, size_t size); + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/XzCrc64Opt.c b/deps/LZMA-SDK/C/XzCrc64Opt.c index a0637dd22..93a9ffff5 100644 --- a/deps/LZMA-SDK/C/XzCrc64Opt.c +++ b/deps/LZMA-SDK/C/XzCrc64Opt.c @@ -1,71 +1,71 @@ -/* XzCrc64Opt.c -- CRC64 calculation -2021-02-09 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include "CpuArch.h" - -#ifndef MY_CPU_BE - -#define CRC64_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) - -UInt64 MY_FAST_CALL XzCrc64UpdateT4(UInt64 v, const void *data, size_t size, const UInt64 *table); -UInt64 MY_FAST_CALL XzCrc64UpdateT4(UInt64 v, const void *data, size_t size, const UInt64 *table) -{ - const Byte *p = (const Byte *)data; - for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) - v = CRC64_UPDATE_BYTE_2(v, *p); - for (; size >= 4; size -= 4, p += 4) - { - UInt32 d = (UInt32)v ^ *(const UInt32 *)(const void *)p; - v = (v >> 32) - ^ (table + 0x300)[((d ) & 0xFF)] - ^ (table + 0x200)[((d >> 8) & 0xFF)] - ^ (table + 0x100)[((d >> 16) & 0xFF)] - ^ (table + 0x000)[((d >> 24))]; - } - for (; size > 0; size--, p++) - v = CRC64_UPDATE_BYTE_2(v, *p); - return v; -} - -#endif - - -#ifndef MY_CPU_LE - -#define CRC_UINT64_SWAP(v) \ - ((v >> 56) \ - | ((v >> 40) & ((UInt64)0xFF << 8)) \ - | ((v >> 24) & ((UInt64)0xFF << 16)) \ - | ((v >> 8) & ((UInt64)0xFF << 24)) \ - | ((v << 8) & ((UInt64)0xFF << 32)) \ - | ((v << 24) & ((UInt64)0xFF << 40)) \ - | ((v << 40) & ((UInt64)0xFF << 48)) \ - | ((v << 56))) - -#define CRC64_UPDATE_BYTE_2_BE(crc, b) (table[(Byte)((crc) >> 56) ^ (b)] ^ ((crc) << 8)) - -UInt64 MY_FAST_CALL XzCrc64UpdateT1_BeT4(UInt64 v, const void *data, size_t size, const UInt64 *table); -UInt64 MY_FAST_CALL XzCrc64UpdateT1_BeT4(UInt64 v, const void *data, size_t size, const UInt64 *table) -{ - const Byte *p = (const Byte *)data; - table += 0x100; - v = CRC_UINT64_SWAP(v); - for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) - v = CRC64_UPDATE_BYTE_2_BE(v, *p); - for (; size >= 4; size -= 4, p += 4) - { - UInt32 d = (UInt32)(v >> 32) ^ *(const UInt32 *)(const void *)p; - v = (v << 32) - ^ (table + 0x000)[((d ) & 0xFF)] - ^ (table + 0x100)[((d >> 8) & 0xFF)] - ^ (table + 0x200)[((d >> 16) & 0xFF)] - ^ (table + 0x300)[((d >> 24))]; - } - for (; size > 0; size--, p++) - v = CRC64_UPDATE_BYTE_2_BE(v, *p); - return CRC_UINT64_SWAP(v); -} - -#endif +/* XzCrc64Opt.c -- CRC64 calculation +2021-02-09 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include "CpuArch.h" + +#ifndef MY_CPU_BE + +#define CRC64_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) + +UInt64 MY_FAST_CALL XzCrc64UpdateT4(UInt64 v, const void *data, size_t size, const UInt64 *table); +UInt64 MY_FAST_CALL XzCrc64UpdateT4(UInt64 v, const void *data, size_t size, const UInt64 *table) +{ + const Byte *p = (const Byte *)data; + for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) + v = CRC64_UPDATE_BYTE_2(v, *p); + for (; size >= 4; size -= 4, p += 4) + { + UInt32 d = (UInt32)v ^ *(const UInt32 *)(const void *)p; + v = (v >> 32) + ^ (table + 0x300)[((d ) & 0xFF)] + ^ (table + 0x200)[((d >> 8) & 0xFF)] + ^ (table + 0x100)[((d >> 16) & 0xFF)] + ^ (table + 0x000)[((d >> 24))]; + } + for (; size > 0; size--, p++) + v = CRC64_UPDATE_BYTE_2(v, *p); + return v; +} + +#endif + + +#ifndef MY_CPU_LE + +#define CRC_UINT64_SWAP(v) \ + ((v >> 56) \ + | ((v >> 40) & ((UInt64)0xFF << 8)) \ + | ((v >> 24) & ((UInt64)0xFF << 16)) \ + | ((v >> 8) & ((UInt64)0xFF << 24)) \ + | ((v << 8) & ((UInt64)0xFF << 32)) \ + | ((v << 24) & ((UInt64)0xFF << 40)) \ + | ((v << 40) & ((UInt64)0xFF << 48)) \ + | ((v << 56))) + +#define CRC64_UPDATE_BYTE_2_BE(crc, b) (table[(Byte)((crc) >> 56) ^ (b)] ^ ((crc) << 8)) + +UInt64 MY_FAST_CALL XzCrc64UpdateT1_BeT4(UInt64 v, const void *data, size_t size, const UInt64 *table); +UInt64 MY_FAST_CALL XzCrc64UpdateT1_BeT4(UInt64 v, const void *data, size_t size, const UInt64 *table) +{ + const Byte *p = (const Byte *)data; + table += 0x100; + v = CRC_UINT64_SWAP(v); + for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) + v = CRC64_UPDATE_BYTE_2_BE(v, *p); + for (; size >= 4; size -= 4, p += 4) + { + UInt32 d = (UInt32)(v >> 32) ^ *(const UInt32 *)(const void *)p; + v = (v << 32) + ^ (table + 0x000)[((d ) & 0xFF)] + ^ (table + 0x100)[((d >> 8) & 0xFF)] + ^ (table + 0x200)[((d >> 16) & 0xFF)] + ^ (table + 0x300)[((d >> 24))]; + } + for (; size > 0; size--, p++) + v = CRC64_UPDATE_BYTE_2_BE(v, *p); + return CRC_UINT64_SWAP(v); +} + +#endif diff --git a/deps/LZMA-SDK/C/XzDec.c b/deps/LZMA-SDK/C/XzDec.c index d345f68c1..3f96a37f9 100644 --- a/deps/LZMA-SDK/C/XzDec.c +++ b/deps/LZMA-SDK/C/XzDec.c @@ -1,2836 +1,2837 @@ -/* XzDec.c -- Xz Decode -2021-04-01 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -// #include - -// #define XZ_DUMP - -/* #define XZ_DUMP */ - -#ifdef XZ_DUMP -#include -#endif - -// #define SHOW_DEBUG_INFO - -#ifdef SHOW_DEBUG_INFO -#include -#endif - -#ifdef SHOW_DEBUG_INFO -#define PRF(x) x -#else -#define PRF(x) -#endif - -#define PRF_STR(s) PRF(printf("\n" s "\n")) -#define PRF_STR_INT(s, d) PRF(printf("\n" s " %d\n", (unsigned)d)) - -#include -#include - -#include "7zCrc.h" -#include "Alloc.h" -#include "Bra.h" -#include "CpuArch.h" -#include "Delta.h" -#include "Lzma2Dec.h" - -// #define USE_SUBBLOCK - -#ifdef USE_SUBBLOCK -#include "Bcj3Dec.c" -#include "SbDec.h" -#endif - -#include "Xz.h" - -#define XZ_CHECK_SIZE_MAX 64 - -#define CODER_BUF_SIZE ((size_t)1 << 17) - -unsigned Xz_ReadVarInt(const Byte *p, size_t maxSize, UInt64 *value) -{ - unsigned i, limit; - *value = 0; - limit = (maxSize > 9) ? 9 : (unsigned)maxSize; - - for (i = 0; i < limit;) - { - Byte b = p[i]; - *value |= (UInt64)(b & 0x7F) << (7 * i++); - if ((b & 0x80) == 0) - return (b == 0 && i != 1) ? 0 : i; - } - return 0; -} - -/* ---------- BraState ---------- */ - -#define BRA_BUF_SIZE (1 << 14) - -typedef struct -{ - size_t bufPos; - size_t bufConv; - size_t bufTotal; - - int encodeMode; - - UInt32 methodId; - UInt32 delta; - UInt32 ip; - UInt32 x86State; - Byte deltaState[DELTA_STATE_SIZE]; - - Byte buf[BRA_BUF_SIZE]; -} CBraState; - -static void BraState_Free(void *pp, ISzAllocPtr alloc) -{ - ISzAlloc_Free(alloc, pp); -} - -static SRes BraState_SetProps(void *pp, const Byte *props, size_t propSize, ISzAllocPtr alloc) -{ - CBraState *p = ((CBraState *)pp); - UNUSED_VAR(alloc); - p->ip = 0; - if (p->methodId == XZ_ID_Delta) - { - if (propSize != 1) - return SZ_ERROR_UNSUPPORTED; - p->delta = (unsigned)props[0] + 1; - } - else - { - if (propSize == 4) - { - UInt32 v = GetUi32(props); - switch (p->methodId) - { - case XZ_ID_PPC: - case XZ_ID_ARM: - case XZ_ID_SPARC: - if ((v & 3) != 0) - return SZ_ERROR_UNSUPPORTED; - break; - case XZ_ID_ARMT: - if ((v & 1) != 0) - return SZ_ERROR_UNSUPPORTED; - break; - case XZ_ID_IA64: - if ((v & 0xF) != 0) - return SZ_ERROR_UNSUPPORTED; - break; - } - p->ip = v; - } - else if (propSize != 0) - return SZ_ERROR_UNSUPPORTED; - } - return SZ_OK; -} - -static void BraState_Init(void *pp) -{ - CBraState *p = ((CBraState *)pp); - p->bufPos = p->bufConv = p->bufTotal = 0; - x86_Convert_Init(p->x86State); - if (p->methodId == XZ_ID_Delta) - Delta_Init(p->deltaState); -} - - -#define CASE_BRA_CONV(isa) case XZ_ID_ ## isa: size = isa ## _Convert(data, size, p->ip, p->encodeMode); break; - -static SizeT BraState_Filter(void *pp, Byte *data, SizeT size) -{ - CBraState *p = ((CBraState *)pp); - switch (p->methodId) - { - case XZ_ID_Delta: - if (p->encodeMode) - Delta_Encode(p->deltaState, p->delta, data, size); - else - Delta_Decode(p->deltaState, p->delta, data, size); - break; - case XZ_ID_X86: - size = x86_Convert(data, size, p->ip, &p->x86State, p->encodeMode); - break; - CASE_BRA_CONV(PPC) - CASE_BRA_CONV(IA64) - CASE_BRA_CONV(ARM) - CASE_BRA_CONV(ARMT) - CASE_BRA_CONV(SPARC) - } - p->ip += (UInt32)size; - return size; -} - - -static SRes BraState_Code2(void *pp, - Byte *dest, SizeT *destLen, - const Byte *src, SizeT *srcLen, int srcWasFinished, - ECoderFinishMode finishMode, - // int *wasFinished - ECoderStatus *status) -{ - CBraState *p = ((CBraState *)pp); - SizeT destRem = *destLen; - SizeT srcRem = *srcLen; - UNUSED_VAR(finishMode); - - *destLen = 0; - *srcLen = 0; - // *wasFinished = False; - *status = CODER_STATUS_NOT_FINISHED; - - while (destRem > 0) - { - if (p->bufPos != p->bufConv) - { - size_t size = p->bufConv - p->bufPos; - if (size > destRem) - size = destRem; - memcpy(dest, p->buf + p->bufPos, size); - p->bufPos += size; - *destLen += size; - dest += size; - destRem -= size; - continue; - } - - p->bufTotal -= p->bufPos; - memmove(p->buf, p->buf + p->bufPos, p->bufTotal); - p->bufPos = 0; - p->bufConv = 0; - { - size_t size = BRA_BUF_SIZE - p->bufTotal; - if (size > srcRem) - size = srcRem; - memcpy(p->buf + p->bufTotal, src, size); - *srcLen += size; - src += size; - srcRem -= size; - p->bufTotal += size; - } - if (p->bufTotal == 0) - break; - - p->bufConv = BraState_Filter(pp, p->buf, p->bufTotal); - - if (p->bufConv == 0) - { - if (!srcWasFinished) - break; - p->bufConv = p->bufTotal; - } - } - - if (p->bufTotal == p->bufPos && srcRem == 0 && srcWasFinished) - { - *status = CODER_STATUS_FINISHED_WITH_MARK; - // *wasFinished = 1; - } - - return SZ_OK; -} - - -SRes BraState_SetFromMethod(IStateCoder *p, UInt64 id, int encodeMode, ISzAllocPtr alloc); -SRes BraState_SetFromMethod(IStateCoder *p, UInt64 id, int encodeMode, ISzAllocPtr alloc) -{ - CBraState *decoder; - if (id < XZ_ID_Delta || id > XZ_ID_SPARC) - return SZ_ERROR_UNSUPPORTED; - decoder = (CBraState *)p->p; - if (!decoder) - { - decoder = (CBraState *)ISzAlloc_Alloc(alloc, sizeof(CBraState)); - if (!decoder) - return SZ_ERROR_MEM; - p->p = decoder; - p->Free = BraState_Free; - p->SetProps = BraState_SetProps; - p->Init = BraState_Init; - p->Code2 = BraState_Code2; - p->Filter = BraState_Filter; - } - decoder->methodId = (UInt32)id; - decoder->encodeMode = encodeMode; - return SZ_OK; -} - - - -/* ---------- SbState ---------- */ - -#ifdef USE_SUBBLOCK - -static void SbState_Free(void *pp, ISzAllocPtr alloc) -{ - CSbDec *p = (CSbDec *)pp; - SbDec_Free(p); - ISzAlloc_Free(alloc, pp); -} - -static SRes SbState_SetProps(void *pp, const Byte *props, size_t propSize, ISzAllocPtr alloc) -{ - UNUSED_VAR(pp); - UNUSED_VAR(props); - UNUSED_VAR(alloc); - return (propSize == 0) ? SZ_OK : SZ_ERROR_UNSUPPORTED; -} - -static void SbState_Init(void *pp) -{ - SbDec_Init((CSbDec *)pp); -} - -static SRes SbState_Code2(void *pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, - int srcWasFinished, ECoderFinishMode finishMode, - // int *wasFinished - ECoderStatus *status) -{ - CSbDec *p = (CSbDec *)pp; - SRes res; - UNUSED_VAR(srcWasFinished); - p->dest = dest; - p->destLen = *destLen; - p->src = src; - p->srcLen = *srcLen; - p->finish = finishMode; /* change it */ - res = SbDec_Decode((CSbDec *)pp); - *destLen -= p->destLen; - *srcLen -= p->srcLen; - // *wasFinished = (*destLen == 0 && *srcLen == 0); /* change it */ - *status = (*destLen == 0 && *srcLen == 0) ? - CODER_STATUS_FINISHED_WITH_MARK : - CODER_STATUS_NOT_FINISHED; - return res; -} - -static SRes SbState_SetFromMethod(IStateCoder *p, ISzAllocPtr alloc) -{ - CSbDec *decoder = (CSbDec *)p->p; - if (!decoder) - { - decoder = (CSbDec *)ISzAlloc_Alloc(alloc, sizeof(CSbDec)); - if (!decoder) - return SZ_ERROR_MEM; - p->p = decoder; - p->Free = SbState_Free; - p->SetProps = SbState_SetProps; - p->Init = SbState_Init; - p->Code2 = SbState_Code2; - p->Filter = NULL; - } - SbDec_Construct(decoder); - SbDec_SetAlloc(decoder, alloc); - return SZ_OK; -} - -#endif - - - -/* ---------- Lzma2 ---------- */ - -typedef struct -{ - CLzma2Dec decoder; - BoolInt outBufMode; -} CLzma2Dec_Spec; - - -static void Lzma2State_Free(void *pp, ISzAllocPtr alloc) -{ - CLzma2Dec_Spec *p = (CLzma2Dec_Spec *)pp; - if (p->outBufMode) - Lzma2Dec_FreeProbs(&p->decoder, alloc); - else - Lzma2Dec_Free(&p->decoder, alloc); - ISzAlloc_Free(alloc, pp); -} - -static SRes Lzma2State_SetProps(void *pp, const Byte *props, size_t propSize, ISzAllocPtr alloc) -{ - if (propSize != 1) - return SZ_ERROR_UNSUPPORTED; - { - CLzma2Dec_Spec *p = (CLzma2Dec_Spec *)pp; - if (p->outBufMode) - return Lzma2Dec_AllocateProbs(&p->decoder, props[0], alloc); - else - return Lzma2Dec_Allocate(&p->decoder, props[0], alloc); - } -} - -static void Lzma2State_Init(void *pp) -{ - Lzma2Dec_Init(&((CLzma2Dec_Spec *)pp)->decoder); -} - - -/* - if (outBufMode), then (dest) is not used. Use NULL. - Data is unpacked to (spec->decoder.decoder.dic) output buffer. -*/ - -static SRes Lzma2State_Code2(void *pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, - int srcWasFinished, ECoderFinishMode finishMode, - // int *wasFinished, - ECoderStatus *status) -{ - CLzma2Dec_Spec *spec = (CLzma2Dec_Spec *)pp; - ELzmaStatus status2; - /* ELzmaFinishMode fm = (finishMode == LZMA_FINISH_ANY) ? LZMA_FINISH_ANY : LZMA_FINISH_END; */ - SRes res; - UNUSED_VAR(srcWasFinished); - if (spec->outBufMode) - { - SizeT dicPos = spec->decoder.decoder.dicPos; - SizeT dicLimit = dicPos + *destLen; - res = Lzma2Dec_DecodeToDic(&spec->decoder, dicLimit, src, srcLen, (ELzmaFinishMode)finishMode, &status2); - *destLen = spec->decoder.decoder.dicPos - dicPos; - } - else - res = Lzma2Dec_DecodeToBuf(&spec->decoder, dest, destLen, src, srcLen, (ELzmaFinishMode)finishMode, &status2); - // *wasFinished = (status2 == LZMA_STATUS_FINISHED_WITH_MARK); - // ECoderStatus values are identical to ELzmaStatus values of LZMA2 decoder - *status = (ECoderStatus)status2; - return res; -} - - -static SRes Lzma2State_SetFromMethod(IStateCoder *p, Byte *outBuf, size_t outBufSize, ISzAllocPtr alloc) -{ - CLzma2Dec_Spec *spec = (CLzma2Dec_Spec *)p->p; - if (!spec) - { - spec = (CLzma2Dec_Spec *)ISzAlloc_Alloc(alloc, sizeof(CLzma2Dec_Spec)); - if (!spec) - return SZ_ERROR_MEM; - p->p = spec; - p->Free = Lzma2State_Free; - p->SetProps = Lzma2State_SetProps; - p->Init = Lzma2State_Init; - p->Code2 = Lzma2State_Code2; - p->Filter = NULL; - Lzma2Dec_Construct(&spec->decoder); - } - spec->outBufMode = False; - if (outBuf) - { - spec->outBufMode = True; - spec->decoder.decoder.dic = outBuf; - spec->decoder.decoder.dicBufSize = outBufSize; - } - return SZ_OK; -} - - -static SRes Lzma2State_ResetOutBuf(IStateCoder *p, Byte *outBuf, size_t outBufSize) -{ - CLzma2Dec_Spec *spec = (CLzma2Dec_Spec *)p->p; - if ((spec->outBufMode && !outBuf) || (!spec->outBufMode && outBuf)) - return SZ_ERROR_FAIL; - if (outBuf) - { - spec->decoder.decoder.dic = outBuf; - spec->decoder.decoder.dicBufSize = outBufSize; - } - return SZ_OK; -} - - - -static void MixCoder_Construct(CMixCoder *p, ISzAllocPtr alloc) -{ - unsigned i; - p->alloc = alloc; - p->buf = NULL; - p->numCoders = 0; - - p->outBufSize = 0; - p->outBuf = NULL; - // p->SingleBufMode = False; - - for (i = 0; i < MIXCODER_NUM_FILTERS_MAX; i++) - p->coders[i].p = NULL; -} - - -static void MixCoder_Free(CMixCoder *p) -{ - unsigned i; - p->numCoders = 0; - for (i = 0; i < MIXCODER_NUM_FILTERS_MAX; i++) - { - IStateCoder *sc = &p->coders[i]; - if (sc->p) - { - sc->Free(sc->p, p->alloc); - sc->p = NULL; - } - } - if (p->buf) - { - ISzAlloc_Free(p->alloc, p->buf); - p->buf = NULL; /* 9.31: the BUG was fixed */ - } -} - -static void MixCoder_Init(CMixCoder *p) -{ - unsigned i; - for (i = 0; i < MIXCODER_NUM_FILTERS_MAX - 1; i++) - { - p->size[i] = 0; - p->pos[i] = 0; - p->finished[i] = 0; - } - for (i = 0; i < p->numCoders; i++) - { - IStateCoder *coder = &p->coders[i]; - coder->Init(coder->p); - p->results[i] = SZ_OK; - } - p->outWritten = 0; - p->wasFinished = False; - p->res = SZ_OK; - p->status = CODER_STATUS_NOT_SPECIFIED; -} - - -static SRes MixCoder_SetFromMethod(CMixCoder *p, unsigned coderIndex, UInt64 methodId, Byte *outBuf, size_t outBufSize) -{ - IStateCoder *sc = &p->coders[coderIndex]; - p->ids[coderIndex] = methodId; - switch (methodId) - { - case XZ_ID_LZMA2: return Lzma2State_SetFromMethod(sc, outBuf, outBufSize, p->alloc); - #ifdef USE_SUBBLOCK - case XZ_ID_Subblock: return SbState_SetFromMethod(sc, p->alloc); - #endif - } - if (coderIndex == 0) - return SZ_ERROR_UNSUPPORTED; - return BraState_SetFromMethod(sc, methodId, 0, p->alloc); -} - - -static SRes MixCoder_ResetFromMethod(CMixCoder *p, unsigned coderIndex, UInt64 methodId, Byte *outBuf, size_t outBufSize) -{ - IStateCoder *sc = &p->coders[coderIndex]; - switch (methodId) - { - case XZ_ID_LZMA2: return Lzma2State_ResetOutBuf(sc, outBuf, outBufSize); - } - return SZ_ERROR_UNSUPPORTED; -} - - - -/* - if (destFinish) - then unpack data block is finished at (*destLen) position, - and we can return data that were not processed by filter - -output (status) can be : - CODER_STATUS_NOT_FINISHED - CODER_STATUS_FINISHED_WITH_MARK - CODER_STATUS_NEEDS_MORE_INPUT - not implemented still -*/ - -static SRes MixCoder_Code(CMixCoder *p, - Byte *dest, SizeT *destLen, int destFinish, - const Byte *src, SizeT *srcLen, int srcWasFinished, - ECoderFinishMode finishMode) -{ - SizeT destLenOrig = *destLen; - SizeT srcLenOrig = *srcLen; - - *destLen = 0; - *srcLen = 0; - - if (p->wasFinished) - return p->res; - - p->status = CODER_STATUS_NOT_FINISHED; - - // if (p->SingleBufMode) - if (p->outBuf) - { - SRes res; - SizeT destLen2, srcLen2; - int wasFinished; - - PRF_STR("------- MixCoder Single ----------"); - - srcLen2 = srcLenOrig; - destLen2 = destLenOrig; - - { - IStateCoder *coder = &p->coders[0]; - res = coder->Code2(coder->p, NULL, &destLen2, src, &srcLen2, srcWasFinished, finishMode, - // &wasFinished, - &p->status); - wasFinished = (p->status == CODER_STATUS_FINISHED_WITH_MARK); - } - - p->res = res; - - /* - if (wasFinished) - p->status = CODER_STATUS_FINISHED_WITH_MARK; - else - { - if (res == SZ_OK) - if (destLen2 != destLenOrig) - p->status = CODER_STATUS_NEEDS_MORE_INPUT; - } - */ - - - *srcLen = srcLen2; - src += srcLen2; - p->outWritten += destLen2; - - if (res != SZ_OK || srcWasFinished || wasFinished) - p->wasFinished = True; - - if (p->numCoders == 1) - *destLen = destLen2; - else if (p->wasFinished) - { - unsigned i; - size_t processed = p->outWritten; - - for (i = 1; i < p->numCoders; i++) - { - IStateCoder *coder = &p->coders[i]; - processed = coder->Filter(coder->p, p->outBuf, processed); - if (wasFinished || (destFinish && p->outWritten == destLenOrig)) - processed = p->outWritten; - PRF_STR_INT("filter", i); - } - *destLen = processed; - } - return res; - } - - PRF_STR("standard mix"); - - if (p->numCoders != 1) - { - if (!p->buf) - { - p->buf = (Byte *)ISzAlloc_Alloc(p->alloc, CODER_BUF_SIZE * (MIXCODER_NUM_FILTERS_MAX - 1)); - if (!p->buf) - return SZ_ERROR_MEM; - } - - finishMode = CODER_FINISH_ANY; - } - - for (;;) - { - BoolInt processed = False; - BoolInt allFinished = True; - SRes resMain = SZ_OK; - unsigned i; - - p->status = CODER_STATUS_NOT_FINISHED; - /* - if (p->numCoders == 1 && *destLen == destLenOrig && finishMode == LZMA_FINISH_ANY) - break; - */ - - for (i = 0; i < p->numCoders; i++) - { - SRes res; - IStateCoder *coder = &p->coders[i]; - Byte *dest2; - SizeT destLen2, srcLen2; // destLen2_Orig; - const Byte *src2; - int srcFinished2; - int encodingWasFinished; - ECoderStatus status2; - - if (i == 0) - { - src2 = src; - srcLen2 = srcLenOrig - *srcLen; - srcFinished2 = srcWasFinished; - } - else - { - size_t k = i - 1; - src2 = p->buf + (CODER_BUF_SIZE * k) + p->pos[k]; - srcLen2 = p->size[k] - p->pos[k]; - srcFinished2 = p->finished[k]; - } - - if (i == p->numCoders - 1) - { - dest2 = dest; - destLen2 = destLenOrig - *destLen; - } - else - { - if (p->pos[i] != p->size[i]) - continue; - dest2 = p->buf + (CODER_BUF_SIZE * i); - destLen2 = CODER_BUF_SIZE; - } - - // destLen2_Orig = destLen2; - - if (p->results[i] != SZ_OK) - { - if (resMain == SZ_OK) - resMain = p->results[i]; - continue; - } - - res = coder->Code2(coder->p, - dest2, &destLen2, - src2, &srcLen2, srcFinished2, - finishMode, - // &encodingWasFinished, - &status2); - - if (res != SZ_OK) - { - p->results[i] = res; - if (resMain == SZ_OK) - resMain = res; - } - - encodingWasFinished = (status2 == CODER_STATUS_FINISHED_WITH_MARK); - - if (!encodingWasFinished) - { - allFinished = False; - if (p->numCoders == 1 && res == SZ_OK) - p->status = status2; - } - - if (i == 0) - { - *srcLen += srcLen2; - src += srcLen2; - } - else - p->pos[(size_t)i - 1] += srcLen2; - - if (i == p->numCoders - 1) - { - *destLen += destLen2; - dest += destLen2; - } - else - { - p->size[i] = destLen2; - p->pos[i] = 0; - p->finished[i] = encodingWasFinished; - } - - if (destLen2 != 0 || srcLen2 != 0) - processed = True; - } - - if (!processed) - { - if (allFinished) - p->status = CODER_STATUS_FINISHED_WITH_MARK; - return resMain; - } - } -} - - -SRes Xz_ParseHeader(CXzStreamFlags *p, const Byte *buf) -{ - *p = (CXzStreamFlags)GetBe16(buf + XZ_SIG_SIZE); - if (CrcCalc(buf + XZ_SIG_SIZE, XZ_STREAM_FLAGS_SIZE) != - GetUi32(buf + XZ_SIG_SIZE + XZ_STREAM_FLAGS_SIZE)) - return SZ_ERROR_NO_ARCHIVE; - return XzFlags_IsSupported(*p) ? SZ_OK : SZ_ERROR_UNSUPPORTED; -} - -static BoolInt Xz_CheckFooter(CXzStreamFlags flags, UInt64 indexSize, const Byte *buf) -{ - return indexSize == (((UInt64)GetUi32(buf + 4) + 1) << 2) - && GetUi32(buf) == CrcCalc(buf + 4, 6) - && flags == GetBe16(buf + 8) - && buf[10] == XZ_FOOTER_SIG_0 - && buf[11] == XZ_FOOTER_SIG_1; -} - -#define READ_VARINT_AND_CHECK(buf, pos, size, res) \ - { unsigned s = Xz_ReadVarInt(buf + pos, size - pos, res); \ - if (s == 0) return SZ_ERROR_ARCHIVE; pos += s; } - - -static BoolInt XzBlock_AreSupportedFilters(const CXzBlock *p) -{ - unsigned numFilters = XzBlock_GetNumFilters(p) - 1; - unsigned i; - { - const CXzFilter *f = &p->filters[numFilters]; - if (f->id != XZ_ID_LZMA2 || f->propsSize != 1 || f->props[0] > 40) - return False; - } - - for (i = 0; i < numFilters; i++) - { - const CXzFilter *f = &p->filters[i]; - if (f->id == XZ_ID_Delta) - { - if (f->propsSize != 1) - return False; - } - else if (f->id < XZ_ID_Delta - || f->id > XZ_ID_SPARC - || (f->propsSize != 0 && f->propsSize != 4)) - return False; - } - return True; -} - - -SRes XzBlock_Parse(CXzBlock *p, const Byte *header) -{ - unsigned pos; - unsigned numFilters, i; - unsigned headerSize = (unsigned)header[0] << 2; - - /* (headerSize != 0) : another code checks */ - - if (CrcCalc(header, headerSize) != GetUi32(header + headerSize)) - return SZ_ERROR_ARCHIVE; - - pos = 1; - p->flags = header[pos++]; - - p->packSize = (UInt64)(Int64)-1; - if (XzBlock_HasPackSize(p)) - { - READ_VARINT_AND_CHECK(header, pos, headerSize, &p->packSize); - if (p->packSize == 0 || p->packSize + headerSize >= (UInt64)1 << 63) - return SZ_ERROR_ARCHIVE; - } - - p->unpackSize = (UInt64)(Int64)-1; - if (XzBlock_HasUnpackSize(p)) - READ_VARINT_AND_CHECK(header, pos, headerSize, &p->unpackSize); - - numFilters = XzBlock_GetNumFilters(p); - for (i = 0; i < numFilters; i++) - { - CXzFilter *filter = p->filters + i; - UInt64 size; - READ_VARINT_AND_CHECK(header, pos, headerSize, &filter->id); - READ_VARINT_AND_CHECK(header, pos, headerSize, &size); - if (size > headerSize - pos || size > XZ_FILTER_PROPS_SIZE_MAX) - return SZ_ERROR_ARCHIVE; - filter->propsSize = (UInt32)size; - memcpy(filter->props, header + pos, (size_t)size); - pos += (unsigned)size; - - #ifdef XZ_DUMP - printf("\nf[%u] = %2X: ", i, (unsigned)filter->id); - { - unsigned i; - for (i = 0; i < size; i++) - printf(" %2X", filter->props[i]); - } - #endif - } - - if (XzBlock_HasUnsupportedFlags(p)) - return SZ_ERROR_UNSUPPORTED; - - while (pos < headerSize) - if (header[pos++] != 0) - return SZ_ERROR_ARCHIVE; - return SZ_OK; -} - - - - -static SRes XzDecMix_Init(CMixCoder *p, const CXzBlock *block, Byte *outBuf, size_t outBufSize) -{ - unsigned i; - BoolInt needReInit = True; - unsigned numFilters = XzBlock_GetNumFilters(block); - - if (numFilters == p->numCoders && ((p->outBuf && outBuf) || (!p->outBuf && !outBuf))) - { - needReInit = False; - for (i = 0; i < numFilters; i++) - if (p->ids[i] != block->filters[numFilters - 1 - i].id) - { - needReInit = True; - break; - } - } - - // p->SingleBufMode = (outBuf != NULL); - p->outBuf = outBuf; - p->outBufSize = outBufSize; - - // p->SingleBufMode = False; - // outBuf = NULL; - - if (needReInit) - { - MixCoder_Free(p); - for (i = 0; i < numFilters; i++) - { - RINOK(MixCoder_SetFromMethod(p, i, block->filters[numFilters - 1 - i].id, outBuf, outBufSize)); - } - p->numCoders = numFilters; - } - else - { - RINOK(MixCoder_ResetFromMethod(p, 0, block->filters[numFilters - 1].id, outBuf, outBufSize)); - } - - for (i = 0; i < numFilters; i++) - { - const CXzFilter *f = &block->filters[numFilters - 1 - i]; - IStateCoder *sc = &p->coders[i]; - RINOK(sc->SetProps(sc->p, f->props, f->propsSize, p->alloc)); - } - - MixCoder_Init(p); - return SZ_OK; -} - - - -void XzUnpacker_Init(CXzUnpacker *p) -{ - p->state = XZ_STATE_STREAM_HEADER; - p->pos = 0; - p->numStartedStreams = 0; - p->numFinishedStreams = 0; - p->numTotalBlocks = 0; - p->padSize = 0; - p->decodeOnlyOneBlock = 0; - - p->parseMode = False; - p->decodeToStreamSignature = False; - - // p->outBuf = NULL; - // p->outBufSize = 0; - p->outDataWritten = 0; -} - - -void XzUnpacker_SetOutBuf(CXzUnpacker *p, Byte *outBuf, size_t outBufSize) -{ - p->outBuf = outBuf; - p->outBufSize = outBufSize; -} - - -void XzUnpacker_Construct(CXzUnpacker *p, ISzAllocPtr alloc) -{ - MixCoder_Construct(&p->decoder, alloc); - p->outBuf = NULL; - p->outBufSize = 0; - XzUnpacker_Init(p); -} - - -void XzUnpacker_Free(CXzUnpacker *p) -{ - MixCoder_Free(&p->decoder); -} - - -void XzUnpacker_PrepareToRandomBlockDecoding(CXzUnpacker *p) -{ - p->indexSize = 0; - p->numBlocks = 0; - Sha256_Init(&p->sha); - p->state = XZ_STATE_BLOCK_HEADER; - p->pos = 0; - p->decodeOnlyOneBlock = 1; -} - - -static void XzUnpacker_UpdateIndex(CXzUnpacker *p, UInt64 packSize, UInt64 unpackSize) -{ - Byte temp[32]; - unsigned num = Xz_WriteVarInt(temp, packSize); - num += Xz_WriteVarInt(temp + num, unpackSize); - Sha256_Update(&p->sha, temp, num); - p->indexSize += num; - p->numBlocks++; -} - - - -SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen, - const Byte *src, SizeT *srcLen, int srcFinished, - ECoderFinishMode finishMode, ECoderStatus *status) -{ - SizeT destLenOrig = *destLen; - SizeT srcLenOrig = *srcLen; - *destLen = 0; - *srcLen = 0; - *status = CODER_STATUS_NOT_SPECIFIED; - - for (;;) - { - SizeT srcRem; - - if (p->state == XZ_STATE_BLOCK) - { - SizeT destLen2 = destLenOrig - *destLen; - SizeT srcLen2 = srcLenOrig - *srcLen; - SRes res; - - ECoderFinishMode finishMode2 = finishMode; - BoolInt srcFinished2 = srcFinished; - BoolInt destFinish = False; - - if (p->block.packSize != (UInt64)(Int64)-1) - { - UInt64 rem = p->block.packSize - p->packSize; - if (srcLen2 >= rem) - { - srcFinished2 = True; - srcLen2 = (SizeT)rem; - } - if (rem == 0 && p->block.unpackSize == p->unpackSize) - return SZ_ERROR_DATA; - } - - if (p->block.unpackSize != (UInt64)(Int64)-1) - { - UInt64 rem = p->block.unpackSize - p->unpackSize; - if (destLen2 >= rem) - { - destFinish = True; - finishMode2 = CODER_FINISH_END; - destLen2 = (SizeT)rem; - } - } - - /* - if (srcLen2 == 0 && destLen2 == 0) - { - *status = CODER_STATUS_NOT_FINISHED; - return SZ_OK; - } - */ - - { - res = MixCoder_Code(&p->decoder, - (p->outBuf ? NULL : dest), &destLen2, destFinish, - src, &srcLen2, srcFinished2, - finishMode2); - - *status = p->decoder.status; - XzCheck_Update(&p->check, (p->outBuf ? p->outBuf + p->outDataWritten : dest), destLen2); - if (!p->outBuf) - dest += destLen2; - p->outDataWritten += destLen2; - } - - (*srcLen) += srcLen2; - src += srcLen2; - p->packSize += srcLen2; - (*destLen) += destLen2; - p->unpackSize += destLen2; - - RINOK(res); - - if (*status != CODER_STATUS_FINISHED_WITH_MARK) - { - if (p->block.packSize == p->packSize - && *status == CODER_STATUS_NEEDS_MORE_INPUT) - { - PRF_STR("CODER_STATUS_NEEDS_MORE_INPUT"); - *status = CODER_STATUS_NOT_SPECIFIED; - return SZ_ERROR_DATA; - } - - return SZ_OK; - } - { - XzUnpacker_UpdateIndex(p, XzUnpacker_GetPackSizeForIndex(p), p->unpackSize); - p->state = XZ_STATE_BLOCK_FOOTER; - p->pos = 0; - p->alignPos = 0; - *status = CODER_STATUS_NOT_SPECIFIED; - - if ((p->block.packSize != (UInt64)(Int64)-1 && p->block.packSize != p->packSize) - || (p->block.unpackSize != (UInt64)(Int64)-1 && p->block.unpackSize != p->unpackSize)) - { - PRF_STR("ERROR: block.size mismatch"); - return SZ_ERROR_DATA; - } - } - // continue; - } - - srcRem = srcLenOrig - *srcLen; - - // XZ_STATE_BLOCK_FOOTER can transit to XZ_STATE_BLOCK_HEADER without input bytes - if (srcRem == 0 && p->state != XZ_STATE_BLOCK_FOOTER) - { - *status = CODER_STATUS_NEEDS_MORE_INPUT; - return SZ_OK; - } - - switch (p->state) - { - case XZ_STATE_STREAM_HEADER: - { - if (p->pos < XZ_STREAM_HEADER_SIZE) - { - if (p->pos < XZ_SIG_SIZE && *src != XZ_SIG[p->pos]) - return SZ_ERROR_NO_ARCHIVE; - if (p->decodeToStreamSignature) - return SZ_OK; - p->buf[p->pos++] = *src++; - (*srcLen)++; - } - else - { - RINOK(Xz_ParseHeader(&p->streamFlags, p->buf)); - p->numStartedStreams++; - p->indexSize = 0; - p->numBlocks = 0; - Sha256_Init(&p->sha); - p->state = XZ_STATE_BLOCK_HEADER; - p->pos = 0; - } - break; - } - - case XZ_STATE_BLOCK_HEADER: - { - if (p->pos == 0) - { - p->buf[p->pos++] = *src++; - (*srcLen)++; - if (p->buf[0] == 0) - { - if (p->decodeOnlyOneBlock) - return SZ_ERROR_DATA; - p->indexPreSize = 1 + Xz_WriteVarInt(p->buf + 1, p->numBlocks); - p->indexPos = p->indexPreSize; - p->indexSize += p->indexPreSize; - Sha256_Final(&p->sha, p->shaDigest); - Sha256_Init(&p->sha); - p->crc = CrcUpdate(CRC_INIT_VAL, p->buf, p->indexPreSize); - p->state = XZ_STATE_STREAM_INDEX; - break; - } - p->blockHeaderSize = ((UInt32)p->buf[0] << 2) + 4; - break; - } - - if (p->pos != p->blockHeaderSize) - { - UInt32 cur = p->blockHeaderSize - p->pos; - if (cur > srcRem) - cur = (UInt32)srcRem; - memcpy(p->buf + p->pos, src, cur); - p->pos += cur; - (*srcLen) += cur; - src += cur; - } - else - { - RINOK(XzBlock_Parse(&p->block, p->buf)); - if (!XzBlock_AreSupportedFilters(&p->block)) - return SZ_ERROR_UNSUPPORTED; - p->numTotalBlocks++; - p->state = XZ_STATE_BLOCK; - p->packSize = 0; - p->unpackSize = 0; - XzCheck_Init(&p->check, XzFlags_GetCheckType(p->streamFlags)); - if (p->parseMode) - { - p->headerParsedOk = True; - return SZ_OK; - } - RINOK(XzDecMix_Init(&p->decoder, &p->block, p->outBuf, p->outBufSize)); - } - break; - } - - case XZ_STATE_BLOCK_FOOTER: - { - if ((((unsigned)p->packSize + p->alignPos) & 3) != 0) - { - if (srcRem == 0) - { - *status = CODER_STATUS_NEEDS_MORE_INPUT; - return SZ_OK; - } - (*srcLen)++; - p->alignPos++; - if (*src++ != 0) - return SZ_ERROR_CRC; - } - else - { - UInt32 checkSize = XzFlags_GetCheckSize(p->streamFlags); - UInt32 cur = checkSize - p->pos; - if (cur != 0) - { - if (srcRem == 0) - { - *status = CODER_STATUS_NEEDS_MORE_INPUT; - return SZ_OK; - } - if (cur > srcRem) - cur = (UInt32)srcRem; - memcpy(p->buf + p->pos, src, cur); - p->pos += cur; - (*srcLen) += cur; - src += cur; - if (checkSize != p->pos) - break; - } - { - Byte digest[XZ_CHECK_SIZE_MAX]; - p->state = XZ_STATE_BLOCK_HEADER; - p->pos = 0; - if (XzCheck_Final(&p->check, digest) && memcmp(digest, p->buf, checkSize) != 0) - return SZ_ERROR_CRC; - if (p->decodeOnlyOneBlock) - { - *status = CODER_STATUS_FINISHED_WITH_MARK; - return SZ_OK; - } - } - } - break; - } - - case XZ_STATE_STREAM_INDEX: - { - if (p->pos < p->indexPreSize) - { - (*srcLen)++; - if (*src++ != p->buf[p->pos++]) - return SZ_ERROR_CRC; - } - else - { - if (p->indexPos < p->indexSize) - { - UInt64 cur = p->indexSize - p->indexPos; - if (srcRem > cur) - srcRem = (SizeT)cur; - p->crc = CrcUpdate(p->crc, src, srcRem); - Sha256_Update(&p->sha, src, srcRem); - (*srcLen) += srcRem; - src += srcRem; - p->indexPos += srcRem; - } - else if ((p->indexPos & 3) != 0) - { - Byte b = *src++; - p->crc = CRC_UPDATE_BYTE(p->crc, b); - (*srcLen)++; - p->indexPos++; - p->indexSize++; - if (b != 0) - return SZ_ERROR_CRC; - } - else - { - Byte digest[SHA256_DIGEST_SIZE]; - p->state = XZ_STATE_STREAM_INDEX_CRC; - p->indexSize += 4; - p->pos = 0; - Sha256_Final(&p->sha, digest); - if (memcmp(digest, p->shaDigest, SHA256_DIGEST_SIZE) != 0) - return SZ_ERROR_CRC; - } - } - break; - } - - case XZ_STATE_STREAM_INDEX_CRC: - { - if (p->pos < 4) - { - (*srcLen)++; - p->buf[p->pos++] = *src++; - } - else - { - const Byte *ptr = p->buf; - p->state = XZ_STATE_STREAM_FOOTER; - p->pos = 0; - if (CRC_GET_DIGEST(p->crc) != GetUi32(ptr)) - return SZ_ERROR_CRC; - } - break; - } - - case XZ_STATE_STREAM_FOOTER: - { - UInt32 cur = XZ_STREAM_FOOTER_SIZE - p->pos; - if (cur > srcRem) - cur = (UInt32)srcRem; - memcpy(p->buf + p->pos, src, cur); - p->pos += cur; - (*srcLen) += cur; - src += cur; - if (p->pos == XZ_STREAM_FOOTER_SIZE) - { - p->state = XZ_STATE_STREAM_PADDING; - p->numFinishedStreams++; - p->padSize = 0; - if (!Xz_CheckFooter(p->streamFlags, p->indexSize, p->buf)) - return SZ_ERROR_CRC; - } - break; - } - - case XZ_STATE_STREAM_PADDING: - { - if (*src != 0) - { - if (((UInt32)p->padSize & 3) != 0) - return SZ_ERROR_NO_ARCHIVE; - p->pos = 0; - p->state = XZ_STATE_STREAM_HEADER; - } - else - { - (*srcLen)++; - src++; - p->padSize++; - } - break; - } - - case XZ_STATE_BLOCK: break; /* to disable GCC warning */ - } - } - /* - if (p->state == XZ_STATE_FINISHED) - *status = CODER_STATUS_FINISHED_WITH_MARK; - return SZ_OK; - */ -} - - -SRes XzUnpacker_CodeFull(CXzUnpacker *p, Byte *dest, SizeT *destLen, - const Byte *src, SizeT *srcLen, - ECoderFinishMode finishMode, ECoderStatus *status) -{ - XzUnpacker_Init(p); - XzUnpacker_SetOutBuf(p, dest, *destLen); - - return XzUnpacker_Code(p, - NULL, destLen, - src, srcLen, True, - finishMode, status); -} - - -BoolInt XzUnpacker_IsBlockFinished(const CXzUnpacker *p) -{ - return (p->state == XZ_STATE_BLOCK_HEADER) && (p->pos == 0); -} - -BoolInt XzUnpacker_IsStreamWasFinished(const CXzUnpacker *p) -{ - return (p->state == XZ_STATE_STREAM_PADDING) && (((UInt32)p->padSize & 3) == 0); -} - -UInt64 XzUnpacker_GetExtraSize(const CXzUnpacker *p) -{ - UInt64 num = 0; - if (p->state == XZ_STATE_STREAM_PADDING) - num = p->padSize; - else if (p->state == XZ_STATE_STREAM_HEADER) - num = p->padSize + p->pos; - return num; -} - - - - - - - - - - - - - - - - - - - - - -#ifndef _7ZIP_ST -#include "MtDec.h" -#endif - - -void XzDecMtProps_Init(CXzDecMtProps *p) -{ - p->inBufSize_ST = 1 << 18; - p->outStep_ST = 1 << 20; - p->ignoreErrors = False; - - #ifndef _7ZIP_ST - p->numThreads = 1; - p->inBufSize_MT = 1 << 18; - p->memUseMax = sizeof(size_t) << 28; - #endif -} - - - -#ifndef _7ZIP_ST - -/* ---------- CXzDecMtThread ---------- */ - -typedef struct -{ - Byte *outBuf; - size_t outBufSize; - size_t outPreSize; - size_t inPreSize; - size_t inPreHeaderSize; - size_t blockPackSize_for_Index; // including block header and checksum. - size_t blockPackTotal; // including stream header, block header and checksum. - size_t inCodeSize; - size_t outCodeSize; - ECoderStatus status; - SRes codeRes; - BoolInt skipMode; - // BoolInt finishedWithMark; - EMtDecParseState parseState; - BoolInt parsing_Truncated; - BoolInt atBlockHeader; - CXzStreamFlags streamFlags; - // UInt64 numFinishedStreams - UInt64 numStreams; - UInt64 numTotalBlocks; - UInt64 numBlocks; - - BoolInt dec_created; - CXzUnpacker dec; - - Byte mtPad[1 << 7]; -} CXzDecMtThread; - -#endif - - -/* ---------- CXzDecMt ---------- */ - -typedef struct -{ - CAlignOffsetAlloc alignOffsetAlloc; - ISzAllocPtr allocMid; - - CXzDecMtProps props; - size_t unpackBlockMaxSize; - - ISeqInStream *inStream; - ISeqOutStream *outStream; - ICompressProgress *progress; - - BoolInt finishMode; - BoolInt outSize_Defined; - UInt64 outSize; - - UInt64 outProcessed; - UInt64 inProcessed; - UInt64 readProcessed; - BoolInt readWasFinished; - SRes readRes; - SRes writeRes; - - Byte *outBuf; - size_t outBufSize; - Byte *inBuf; - size_t inBufSize; - - CXzUnpacker dec; - - ECoderStatus status; - SRes codeRes; - - #ifndef _7ZIP_ST - BoolInt mainDecoderWasCalled; - // int statErrorDefined; - int finishedDecoderIndex; - - // global values that are used in Parse stage - CXzStreamFlags streamFlags; - // UInt64 numFinishedStreams - UInt64 numStreams; - UInt64 numTotalBlocks; - UInt64 numBlocks; - - // UInt64 numBadBlocks; - SRes mainErrorCode; // it's set to error code, if the size Code() output doesn't patch the size from Parsing stage - // it can be = SZ_ERROR_INPUT_EOF - // it can be = SZ_ERROR_DATA, in some another cases - BoolInt isBlockHeaderState_Parse; - BoolInt isBlockHeaderState_Write; - UInt64 outProcessed_Parse; - BoolInt parsing_Truncated; - - BoolInt mtc_WasConstructed; - CMtDec mtc; - CXzDecMtThread coders[MTDEC__THREADS_MAX]; - #endif - -} CXzDecMt; - - - -CXzDecMtHandle XzDecMt_Create(ISzAllocPtr alloc, ISzAllocPtr allocMid) -{ - CXzDecMt *p = (CXzDecMt *)ISzAlloc_Alloc(alloc, sizeof(CXzDecMt)); - if (!p) - return NULL; - - AlignOffsetAlloc_CreateVTable(&p->alignOffsetAlloc); - p->alignOffsetAlloc.baseAlloc = alloc; - p->alignOffsetAlloc.numAlignBits = 7; - p->alignOffsetAlloc.offset = 0; - - p->allocMid = allocMid; - - p->outBuf = NULL; - p->outBufSize = 0; - p->inBuf = NULL; - p->inBufSize = 0; - - XzUnpacker_Construct(&p->dec, &p->alignOffsetAlloc.vt); - - p->unpackBlockMaxSize = 0; - - XzDecMtProps_Init(&p->props); - - #ifndef _7ZIP_ST - p->mtc_WasConstructed = False; - { - unsigned i; - for (i = 0; i < MTDEC__THREADS_MAX; i++) - { - CXzDecMtThread *coder = &p->coders[i]; - coder->dec_created = False; - coder->outBuf = NULL; - coder->outBufSize = 0; - } - } - #endif - - return p; -} - - -#ifndef _7ZIP_ST - -static void XzDecMt_FreeOutBufs(CXzDecMt *p) -{ - unsigned i; - for (i = 0; i < MTDEC__THREADS_MAX; i++) - { - CXzDecMtThread *coder = &p->coders[i]; - if (coder->outBuf) - { - ISzAlloc_Free(p->allocMid, coder->outBuf); - coder->outBuf = NULL; - coder->outBufSize = 0; - } - } - p->unpackBlockMaxSize = 0; -} - -#endif - - - -static void XzDecMt_FreeSt(CXzDecMt *p) -{ - XzUnpacker_Free(&p->dec); - - if (p->outBuf) - { - ISzAlloc_Free(p->allocMid, p->outBuf); - p->outBuf = NULL; - } - p->outBufSize = 0; - - if (p->inBuf) - { - ISzAlloc_Free(p->allocMid, p->inBuf); - p->inBuf = NULL; - } - p->inBufSize = 0; -} - - -void XzDecMt_Destroy(CXzDecMtHandle pp) -{ - CXzDecMt *p = (CXzDecMt *)pp; - - XzDecMt_FreeSt(p); - - #ifndef _7ZIP_ST - - if (p->mtc_WasConstructed) - { - MtDec_Destruct(&p->mtc); - p->mtc_WasConstructed = False; - } - { - unsigned i; - for (i = 0; i < MTDEC__THREADS_MAX; i++) - { - CXzDecMtThread *t = &p->coders[i]; - if (t->dec_created) - { - // we don't need to free dict here - XzUnpacker_Free(&t->dec); - t->dec_created = False; - } - } - } - XzDecMt_FreeOutBufs(p); - - #endif - - ISzAlloc_Free(p->alignOffsetAlloc.baseAlloc, pp); -} - - - -#ifndef _7ZIP_ST - -static void XzDecMt_Callback_Parse(void *obj, unsigned coderIndex, CMtDecCallbackInfo *cc) -{ - CXzDecMt *me = (CXzDecMt *)obj; - CXzDecMtThread *coder = &me->coders[coderIndex]; - size_t srcSize = cc->srcSize; - - cc->srcSize = 0; - cc->outPos = 0; - cc->state = MTDEC_PARSE_CONTINUE; - - cc->canCreateNewThread = True; - - if (cc->startCall) - { - coder->outPreSize = 0; - coder->inPreSize = 0; - coder->inPreHeaderSize = 0; - coder->parseState = MTDEC_PARSE_CONTINUE; - coder->parsing_Truncated = False; - coder->skipMode = False; - coder->codeRes = SZ_OK; - coder->status = CODER_STATUS_NOT_SPECIFIED; - coder->inCodeSize = 0; - coder->outCodeSize = 0; - - coder->numStreams = me->numStreams; - coder->numTotalBlocks = me->numTotalBlocks; - coder->numBlocks = me->numBlocks; - - if (!coder->dec_created) - { - XzUnpacker_Construct(&coder->dec, &me->alignOffsetAlloc.vt); - coder->dec_created = True; - } - - XzUnpacker_Init(&coder->dec); - - if (me->isBlockHeaderState_Parse) - { - coder->dec.streamFlags = me->streamFlags; - coder->atBlockHeader = True; - XzUnpacker_PrepareToRandomBlockDecoding(&coder->dec); - } - else - { - coder->atBlockHeader = False; - me->isBlockHeaderState_Parse = True; - } - - coder->dec.numStartedStreams = me->numStreams; - coder->dec.numTotalBlocks = me->numTotalBlocks; - coder->dec.numBlocks = me->numBlocks; - } - - while (!coder->skipMode) - { - ECoderStatus status; - SRes res; - size_t srcSize2 = srcSize; - size_t destSize = (size_t)0 - 1; - - coder->dec.parseMode = True; - coder->dec.headerParsedOk = False; - - PRF_STR_INT("Parse", srcSize2); - - res = XzUnpacker_Code(&coder->dec, - NULL, &destSize, - cc->src, &srcSize2, cc->srcFinished, - CODER_FINISH_END, &status); - - // PRF(printf(" res = %d, srcSize2 = %d", res, (unsigned)srcSize2)); - - coder->codeRes = res; - coder->status = status; - cc->srcSize += srcSize2; - srcSize -= srcSize2; - coder->inPreHeaderSize += srcSize2; - coder->inPreSize = coder->inPreHeaderSize; - - if (res != SZ_OK) - { - cc->state = - coder->parseState = MTDEC_PARSE_END; - /* - if (res == SZ_ERROR_MEM) - return res; - return SZ_OK; - */ - return; // res; - } - - if (coder->dec.headerParsedOk) - { - const CXzBlock *block = &coder->dec.block; - if (XzBlock_HasUnpackSize(block) - // && block->unpackSize <= me->props.outBlockMax - && XzBlock_HasPackSize(block)) - { - { - if (block->unpackSize * 2 * me->mtc.numStartedThreads > me->props.memUseMax) - { - cc->state = MTDEC_PARSE_OVERFLOW; - return; // SZ_OK; - } - } - { - UInt64 packSize = block->packSize; - UInt64 packSizeAligned = packSize + ((0 - (unsigned)packSize) & 3); - UInt32 checkSize = XzFlags_GetCheckSize(coder->dec.streamFlags); - UInt64 blockPackSum = coder->inPreSize + packSizeAligned + checkSize; - // if (blockPackSum <= me->props.inBlockMax) - // unpackBlockMaxSize - { - coder->blockPackSize_for_Index = (size_t)(coder->dec.blockHeaderSize + packSize + checkSize); - coder->blockPackTotal = (size_t)blockPackSum; - coder->outPreSize = (size_t)block->unpackSize; - coder->streamFlags = coder->dec.streamFlags; - me->streamFlags = coder->dec.streamFlags; - coder->skipMode = True; - break; - } - } - } - } - else - // if (coder->inPreSize <= me->props.inBlockMax) - { - if (!cc->srcFinished) - return; // SZ_OK; - cc->state = - coder->parseState = MTDEC_PARSE_END; - return; // SZ_OK; - } - cc->state = MTDEC_PARSE_OVERFLOW; - return; // SZ_OK; - } - - // ---------- skipMode ---------- - { - UInt64 rem = coder->blockPackTotal - coder->inPreSize; - size_t cur = srcSize; - if (cur > rem) - cur = (size_t)rem; - cc->srcSize += cur; - coder->inPreSize += cur; - srcSize -= cur; - - if (coder->inPreSize == coder->blockPackTotal) - { - if (srcSize == 0) - { - if (!cc->srcFinished) - return; // SZ_OK; - cc->state = MTDEC_PARSE_END; - } - else if ((cc->src)[cc->srcSize] == 0) // we check control byte of next block - cc->state = MTDEC_PARSE_END; - else - { - cc->state = MTDEC_PARSE_NEW; - - { - size_t blockMax = me->unpackBlockMaxSize; - if (blockMax < coder->outPreSize) - blockMax = coder->outPreSize; - { - UInt64 required = (UInt64)blockMax * (me->mtc.numStartedThreads + 1) * 2; - if (me->props.memUseMax < required) - cc->canCreateNewThread = False; - } - } - - if (me->outSize_Defined) - { - // next block can be zero size - const UInt64 rem2 = me->outSize - me->outProcessed_Parse; - if (rem2 < coder->outPreSize) - { - coder->parsing_Truncated = True; - cc->state = MTDEC_PARSE_END; - } - me->outProcessed_Parse += coder->outPreSize; - } - } - } - else if (cc->srcFinished) - cc->state = MTDEC_PARSE_END; - else - return; // SZ_OK; - - coder->parseState = cc->state; - cc->outPos = coder->outPreSize; - - me->numStreams = coder->dec.numStartedStreams; - me->numTotalBlocks = coder->dec.numTotalBlocks; - me->numBlocks = coder->dec.numBlocks + 1; - return; // SZ_OK; - } -} - - -static SRes XzDecMt_Callback_PreCode(void *pp, unsigned coderIndex) -{ - CXzDecMt *me = (CXzDecMt *)pp; - CXzDecMtThread *coder = &me->coders[coderIndex]; - Byte *dest; - - if (!coder->dec.headerParsedOk) - return SZ_OK; - - dest = coder->outBuf; - - if (!dest || coder->outBufSize < coder->outPreSize) - { - if (dest) - { - ISzAlloc_Free(me->allocMid, dest); - coder->outBuf = NULL; - coder->outBufSize = 0; - } - { - size_t outPreSize = coder->outPreSize; - if (outPreSize == 0) - outPreSize = 1; - dest = (Byte *)ISzAlloc_Alloc(me->allocMid, outPreSize); - } - if (!dest) - return SZ_ERROR_MEM; - coder->outBuf = dest; - coder->outBufSize = coder->outPreSize; - - if (coder->outBufSize > me->unpackBlockMaxSize) - me->unpackBlockMaxSize = coder->outBufSize; - } - - // return SZ_ERROR_MEM; - - XzUnpacker_SetOutBuf(&coder->dec, coder->outBuf, coder->outBufSize); - - { - SRes res = XzDecMix_Init(&coder->dec.decoder, &coder->dec.block, coder->outBuf, coder->outBufSize); - // res = SZ_ERROR_UNSUPPORTED; // to test - coder->codeRes = res; - if (res != SZ_OK) - { - // if (res == SZ_ERROR_MEM) return res; - if (me->props.ignoreErrors && res != SZ_ERROR_MEM) - return SZ_OK; - return res; - } - } - - return SZ_OK; -} - - -static SRes XzDecMt_Callback_Code(void *pp, unsigned coderIndex, - const Byte *src, size_t srcSize, int srcFinished, - // int finished, int blockFinished, - UInt64 *inCodePos, UInt64 *outCodePos, int *stop) -{ - CXzDecMt *me = (CXzDecMt *)pp; - CXzDecMtThread *coder = &me->coders[coderIndex]; - - *inCodePos = coder->inCodeSize; - *outCodePos = coder->outCodeSize; - *stop = True; - - if (srcSize > coder->inPreSize - coder->inCodeSize) - return SZ_ERROR_FAIL; - - if (coder->inCodeSize < coder->inPreHeaderSize) - { - size_t step = coder->inPreHeaderSize - coder->inCodeSize; - if (step > srcSize) - step = srcSize; - src += step; - srcSize -= step; - coder->inCodeSize += step; - *inCodePos = coder->inCodeSize; - if (coder->inCodeSize < coder->inPreHeaderSize) - { - *stop = False; - return SZ_OK; - } - } - - if (!coder->dec.headerParsedOk) - return SZ_OK; - if (!coder->outBuf) - return SZ_OK; - - if (coder->codeRes == SZ_OK) - { - ECoderStatus status; - SRes res; - size_t srcProcessed = srcSize; - size_t outSizeCur = coder->outPreSize - coder->dec.outDataWritten; - - // PRF(printf("\nCallback_Code: Code %d %d\n", (unsigned)srcSize, (unsigned)outSizeCur)); - - res = XzUnpacker_Code(&coder->dec, - NULL, &outSizeCur, - src, &srcProcessed, srcFinished, - // coder->finishedWithMark ? CODER_FINISH_END : CODER_FINISH_ANY, - CODER_FINISH_END, - &status); - - // PRF(printf(" res = %d, srcSize2 = %d, outSizeCur = %d", res, (unsigned)srcProcessed, (unsigned)outSizeCur)); - - coder->codeRes = res; - coder->status = status; - coder->inCodeSize += srcProcessed; - coder->outCodeSize = coder->dec.outDataWritten; - *inCodePos = coder->inCodeSize; - *outCodePos = coder->outCodeSize; - - if (res == SZ_OK) - { - if (srcProcessed == srcSize) - *stop = False; - return SZ_OK; - } - } - - if (me->props.ignoreErrors && coder->codeRes != SZ_ERROR_MEM) - { - *inCodePos = coder->inPreSize; - *outCodePos = coder->outPreSize; - return SZ_OK; - } - return coder->codeRes; -} - - -#define XZDECMT_STREAM_WRITE_STEP (1 << 24) - -static SRes XzDecMt_Callback_Write(void *pp, unsigned coderIndex, - BoolInt needWriteToStream, - const Byte *src, size_t srcSize, BoolInt isCross, - // int srcFinished, - BoolInt *needContinue, - BoolInt *canRecode) -{ - CXzDecMt *me = (CXzDecMt *)pp; - const CXzDecMtThread *coder = &me->coders[coderIndex]; - - // PRF(printf("\nWrite processed = %d srcSize = %d\n", (unsigned)me->mtc.inProcessed, (unsigned)srcSize)); - - *needContinue = False; - *canRecode = True; - - if (!needWriteToStream) - return SZ_OK; - - if (!coder->dec.headerParsedOk || !coder->outBuf) - { - if (me->finishedDecoderIndex < 0) - me->finishedDecoderIndex = (int)coderIndex; - return SZ_OK; - } - - if (me->finishedDecoderIndex >= 0) - return SZ_OK; - - me->mtc.inProcessed += coder->inCodeSize; - - *canRecode = False; - - { - SRes res; - size_t size = coder->outCodeSize; - Byte *data = coder->outBuf; - - // we use in me->dec: sha, numBlocks, indexSize - - if (!me->isBlockHeaderState_Write) - { - XzUnpacker_PrepareToRandomBlockDecoding(&me->dec); - me->dec.decodeOnlyOneBlock = False; - me->dec.numStartedStreams = coder->dec.numStartedStreams; - me->dec.streamFlags = coder->streamFlags; - - me->isBlockHeaderState_Write = True; - } - - me->dec.numTotalBlocks = coder->dec.numTotalBlocks; - XzUnpacker_UpdateIndex(&me->dec, coder->blockPackSize_for_Index, coder->outPreSize); - - if (coder->outPreSize != size) - { - if (me->props.ignoreErrors) - { - memset(data + size, 0, coder->outPreSize - size); - size = coder->outPreSize; - } - // me->numBadBlocks++; - if (me->mainErrorCode == SZ_OK) - { - if ((int)coder->status == LZMA_STATUS_NEEDS_MORE_INPUT) - me->mainErrorCode = SZ_ERROR_INPUT_EOF; - else - me->mainErrorCode = SZ_ERROR_DATA; - } - } - - if (me->writeRes != SZ_OK) - return me->writeRes; - - res = SZ_OK; - { - if (me->outSize_Defined) - { - const UInt64 rem = me->outSize - me->outProcessed; - if (size > rem) - size = (SizeT)rem; - } - - for (;;) - { - size_t cur = size; - size_t written; - if (cur > XZDECMT_STREAM_WRITE_STEP) - cur = XZDECMT_STREAM_WRITE_STEP; - - written = ISeqOutStream_Write(me->outStream, data, cur); - - // PRF(printf("\nWritten ask = %d written = %d\n", (unsigned)cur, (unsigned)written)); - - me->outProcessed += written; - if (written != cur) - { - me->writeRes = SZ_ERROR_WRITE; - res = me->writeRes; - break; - } - data += cur; - size -= cur; - // PRF_STR_INT("Written size =", size); - if (size == 0) - break; - res = MtProgress_ProgressAdd(&me->mtc.mtProgress, 0, 0); - if (res != SZ_OK) - break; - } - } - - if (coder->codeRes != SZ_OK) - if (!me->props.ignoreErrors) - { - me->finishedDecoderIndex = (int)coderIndex; - return res; - } - - RINOK(res); - - if (coder->inPreSize != coder->inCodeSize - || coder->blockPackTotal != coder->inCodeSize) - { - me->finishedDecoderIndex = (int)coderIndex; - return SZ_OK; - } - - if (coder->parseState != MTDEC_PARSE_END) - { - *needContinue = True; - return SZ_OK; - } - } - - // (coder->state == MTDEC_PARSE_END) means that there are no other working threads - // so we can use mtc variables without lock - - PRF_STR_INT("Write MTDEC_PARSE_END", me->mtc.inProcessed); - - me->mtc.mtProgress.totalInSize = me->mtc.inProcessed; - { - CXzUnpacker *dec = &me->dec; - - PRF_STR_INT("PostSingle", srcSize); - - { - size_t srcProcessed = srcSize; - ECoderStatus status; - size_t outSizeCur = 0; - SRes res; - - // dec->decodeOnlyOneBlock = False; - dec->decodeToStreamSignature = True; - - me->mainDecoderWasCalled = True; - - if (coder->parsing_Truncated) - { - me->parsing_Truncated = True; - return SZ_OK; - } - - /* - We have processed all xz-blocks of stream, - And xz unpacker is at XZ_STATE_BLOCK_HEADER state, where - (src) is a pointer to xz-Index structure. - We finish reading of current xz-Stream, including Zero padding after xz-Stream. - We exit, if we reach extra byte (first byte of new-Stream or another data). - But we don't update input stream pointer for that new extra byte. - If extra byte is not correct first byte of xz-signature, - we have SZ_ERROR_NO_ARCHIVE error here. - */ - - res = XzUnpacker_Code(dec, - NULL, &outSizeCur, - src, &srcProcessed, - me->mtc.readWasFinished, // srcFinished - CODER_FINISH_END, // CODER_FINISH_ANY, - &status); - - // res = SZ_ERROR_ARCHIVE; // for failure test - - me->status = status; - me->codeRes = res; - - if (isCross) - me->mtc.crossStart += srcProcessed; - - me->mtc.inProcessed += srcProcessed; - me->mtc.mtProgress.totalInSize = me->mtc.inProcessed; - - srcSize -= srcProcessed; - src += srcProcessed; - - if (res != SZ_OK) - { - return SZ_OK; - // return res; - } - - if (dec->state == XZ_STATE_STREAM_HEADER) - { - *needContinue = True; - me->isBlockHeaderState_Parse = False; - me->isBlockHeaderState_Write = False; - - if (!isCross) - { - Byte *crossBuf = MtDec_GetCrossBuff(&me->mtc); - if (!crossBuf) - return SZ_ERROR_MEM; - if (srcSize != 0) - memcpy(crossBuf, src, srcSize); - me->mtc.crossStart = 0; - me->mtc.crossEnd = srcSize; - } - - PRF_STR_INT("XZ_STATE_STREAM_HEADER crossEnd = ", (unsigned)me->mtc.crossEnd); - - return SZ_OK; - } - - if (status != CODER_STATUS_NEEDS_MORE_INPUT || srcSize != 0) - { - return SZ_ERROR_FAIL; - } - - if (me->mtc.readWasFinished) - { - return SZ_OK; - } - } - - { - size_t inPos; - size_t inLim; - // const Byte *inData; - UInt64 inProgressPrev = me->mtc.inProcessed; - - // XzDecMt_Prepare_InBuf_ST(p); - Byte *crossBuf = MtDec_GetCrossBuff(&me->mtc); - if (!crossBuf) - return SZ_ERROR_MEM; - - inPos = 0; - inLim = 0; - - // inData = crossBuf; - - for (;;) - { - SizeT inProcessed; - SizeT outProcessed; - ECoderStatus status; - SRes res; - - if (inPos == inLim) - { - if (!me->mtc.readWasFinished) - { - inPos = 0; - inLim = me->mtc.inBufSize; - me->mtc.readRes = ISeqInStream_Read(me->inStream, (void *)crossBuf, &inLim); - me->mtc.readProcessed += inLim; - if (inLim == 0 || me->mtc.readRes != SZ_OK) - me->mtc.readWasFinished = True; - } - } - - inProcessed = inLim - inPos; - outProcessed = 0; - - res = XzUnpacker_Code(dec, - NULL, &outProcessed, - crossBuf + inPos, &inProcessed, - (inProcessed == 0), // srcFinished - CODER_FINISH_END, &status); - - me->codeRes = res; - me->status = status; - inPos += inProcessed; - me->mtc.inProcessed += inProcessed; - me->mtc.mtProgress.totalInSize = me->mtc.inProcessed; - - if (res != SZ_OK) - { - return SZ_OK; - // return res; - } - - if (dec->state == XZ_STATE_STREAM_HEADER) - { - *needContinue = True; - me->mtc.crossStart = inPos; - me->mtc.crossEnd = inLim; - me->isBlockHeaderState_Parse = False; - me->isBlockHeaderState_Write = False; - return SZ_OK; - } - - if (status != CODER_STATUS_NEEDS_MORE_INPUT) - return SZ_ERROR_FAIL; - - if (me->mtc.progress) - { - UInt64 inDelta = me->mtc.inProcessed - inProgressPrev; - if (inDelta >= (1 << 22)) - { - RINOK(MtProgress_Progress_ST(&me->mtc.mtProgress)); - inProgressPrev = me->mtc.inProcessed; - } - } - if (me->mtc.readWasFinished) - return SZ_OK; - } - } - } -} - - -#endif - - - -void XzStatInfo_Clear(CXzStatInfo *p) -{ - p->InSize = 0; - p->OutSize = 0; - - p->NumStreams = 0; - p->NumBlocks = 0; - - p->UnpackSize_Defined = False; - - p->NumStreams_Defined = False; - p->NumBlocks_Defined = False; - - p->DataAfterEnd = False; - p->DecodingTruncated = False; - - p->DecodeRes = SZ_OK; - p->ReadRes = SZ_OK; - p->ProgressRes = SZ_OK; - - p->CombinedRes = SZ_OK; - p->CombinedRes_Type = SZ_OK; -} - - - -/* - XzDecMt_Decode_ST() can return SZ_OK or the following errors - - SZ_ERROR_MEM for memory allocation error - - error from XzUnpacker_Code() function - - SZ_ERROR_WRITE for ISeqOutStream::Write(). stat->CombinedRes_Type = SZ_ERROR_WRITE in that case - - ICompressProgress::Progress() error, stat->CombinedRes_Type = SZ_ERROR_PROGRESS. - But XzDecMt_Decode_ST() doesn't return ISeqInStream::Read() errors. - ISeqInStream::Read() result is set to p->readRes. - also it can set stat->CombinedRes_Type to SZ_ERROR_WRITE or SZ_ERROR_PROGRESS. -*/ - -static SRes XzDecMt_Decode_ST(CXzDecMt *p - #ifndef _7ZIP_ST - , BoolInt tMode - #endif - , CXzStatInfo *stat) -{ - size_t outPos; - size_t inPos, inLim; - const Byte *inData; - UInt64 inPrev, outPrev; - - CXzUnpacker *dec; - - #ifndef _7ZIP_ST - if (tMode) - { - XzDecMt_FreeOutBufs(p); - tMode = MtDec_PrepareRead(&p->mtc); - } - #endif - - if (!p->outBuf || p->outBufSize != p->props.outStep_ST) - { - ISzAlloc_Free(p->allocMid, p->outBuf); - p->outBufSize = 0; - p->outBuf = (Byte *)ISzAlloc_Alloc(p->allocMid, p->props.outStep_ST); - if (!p->outBuf) - return SZ_ERROR_MEM; - p->outBufSize = p->props.outStep_ST; - } - - if (!p->inBuf || p->inBufSize != p->props.inBufSize_ST) - { - ISzAlloc_Free(p->allocMid, p->inBuf); - p->inBufSize = 0; - p->inBuf = (Byte *)ISzAlloc_Alloc(p->allocMid, p->props.inBufSize_ST); - if (!p->inBuf) - return SZ_ERROR_MEM; - p->inBufSize = p->props.inBufSize_ST; - } - - dec = &p->dec; - dec->decodeToStreamSignature = False; - // dec->decodeOnlyOneBlock = False; - - XzUnpacker_SetOutBuf(dec, NULL, 0); - - inPrev = p->inProcessed; - outPrev = p->outProcessed; - - inPos = 0; - inLim = 0; - inData = NULL; - outPos = 0; - - for (;;) - { - SizeT outSize; - BoolInt finished; - ECoderFinishMode finishMode; - SizeT inProcessed; - ECoderStatus status; - SRes res; - - SizeT outProcessed; - - - - if (inPos == inLim) - { - #ifndef _7ZIP_ST - if (tMode) - { - inData = MtDec_Read(&p->mtc, &inLim); - inPos = 0; - if (inData) - continue; - tMode = False; - inLim = 0; - } - #endif - - if (!p->readWasFinished) - { - inPos = 0; - inLim = p->inBufSize; - inData = p->inBuf; - p->readRes = ISeqInStream_Read(p->inStream, (void *)p->inBuf, &inLim); - p->readProcessed += inLim; - if (inLim == 0 || p->readRes != SZ_OK) - p->readWasFinished = True; - } - } - - outSize = p->props.outStep_ST - outPos; - - finishMode = CODER_FINISH_ANY; - if (p->outSize_Defined) - { - const UInt64 rem = p->outSize - p->outProcessed; - if (outSize >= rem) - { - outSize = (SizeT)rem; - if (p->finishMode) - finishMode = CODER_FINISH_END; - } - } - - inProcessed = inLim - inPos; - outProcessed = outSize; - - res = XzUnpacker_Code(dec, p->outBuf + outPos, &outProcessed, - inData + inPos, &inProcessed, - (inPos == inLim), // srcFinished - finishMode, &status); - - p->codeRes = res; - p->status = status; - - inPos += inProcessed; - outPos += outProcessed; - p->inProcessed += inProcessed; - p->outProcessed += outProcessed; - - finished = ((inProcessed == 0 && outProcessed == 0) || res != SZ_OK); - - if (finished || outProcessed >= outSize) - if (outPos != 0) - { - const size_t written = ISeqOutStream_Write(p->outStream, p->outBuf, outPos); - // p->outProcessed += written; // 21.01: BUG fixed - if (written != outPos) - { - stat->CombinedRes_Type = SZ_ERROR_WRITE; - return SZ_ERROR_WRITE; - } - outPos = 0; - } - - if (p->progress && res == SZ_OK) - { - if (p->inProcessed - inPrev >= (1 << 22) || - p->outProcessed - outPrev >= (1 << 22)) - { - res = ICompressProgress_Progress(p->progress, p->inProcessed, p->outProcessed); - if (res != SZ_OK) - { - stat->CombinedRes_Type = SZ_ERROR_PROGRESS; - stat->ProgressRes = res; - return res; - } - inPrev = p->inProcessed; - outPrev = p->outProcessed; - } - } - - if (finished) - { - // p->codeRes is preliminary error from XzUnpacker_Code. - // and it can be corrected later as final result - // so we return SZ_OK here instead of (res); - return SZ_OK; - // return res; - } - } -} - - - -/* -XzStatInfo_SetStat() transforms - CXzUnpacker return code and status to combined CXzStatInfo results. - it can convert SZ_OK to SZ_ERROR_INPUT_EOF - it can convert SZ_ERROR_NO_ARCHIVE to SZ_OK and (DataAfterEnd = 1) -*/ - -static void XzStatInfo_SetStat(const CXzUnpacker *dec, - int finishMode, - // UInt64 readProcessed, - UInt64 inProcessed, - SRes res, // it's result from CXzUnpacker unpacker - ECoderStatus status, - BoolInt decodingTruncated, - CXzStatInfo *stat) -{ - UInt64 extraSize; - - stat->DecodingTruncated = (Byte)(decodingTruncated ? 1 : 0); - stat->InSize = inProcessed; - stat->NumStreams = dec->numStartedStreams; - stat->NumBlocks = dec->numTotalBlocks; - - stat->UnpackSize_Defined = True; - stat->NumStreams_Defined = True; - stat->NumBlocks_Defined = True; - - extraSize = XzUnpacker_GetExtraSize(dec); - - if (res == SZ_OK) - { - if (status == CODER_STATUS_NEEDS_MORE_INPUT) - { - // CODER_STATUS_NEEDS_MORE_INPUT is expected status for correct xz streams - // any extra data is part of correct data - extraSize = 0; - // if xz stream was not finished, then we need more data - if (!XzUnpacker_IsStreamWasFinished(dec)) - res = SZ_ERROR_INPUT_EOF; - } - else - { - // CODER_STATUS_FINISHED_WITH_MARK is not possible for multi stream xz decoding - // so he we have (status == CODER_STATUS_NOT_FINISHED) - // if (status != CODER_STATUS_FINISHED_WITH_MARK) - if (!decodingTruncated || finishMode) - res = SZ_ERROR_DATA; - } - } - else if (res == SZ_ERROR_NO_ARCHIVE) - { - /* - SZ_ERROR_NO_ARCHIVE is possible for 2 states: - XZ_STATE_STREAM_HEADER - if bad signature or bad CRC - XZ_STATE_STREAM_PADDING - if non-zero padding data - extraSize and inProcessed don't include "bad" byte - */ - // if (inProcessed == extraSize), there was no any good xz stream header, and we keep error - if (inProcessed != extraSize) // if there were good xz streams before error - { - // if (extraSize != 0 || readProcessed != inProcessed) - { - // he we suppose that all xz streams were finsihed OK, and we have - // some extra data after all streams - stat->DataAfterEnd = True; - res = SZ_OK; - } - } - } - - if (stat->DecodeRes == SZ_OK) - stat->DecodeRes = res; - - stat->InSize -= extraSize; -} - - - -SRes XzDecMt_Decode(CXzDecMtHandle pp, - const CXzDecMtProps *props, - const UInt64 *outDataSize, int finishMode, - ISeqOutStream *outStream, - // Byte *outBuf, size_t *outBufSize, - ISeqInStream *inStream, - // const Byte *inData, size_t inDataSize, - CXzStatInfo *stat, - int *isMT, - ICompressProgress *progress) -{ - CXzDecMt *p = (CXzDecMt *)pp; - #ifndef _7ZIP_ST - BoolInt tMode; - #endif - - XzStatInfo_Clear(stat); - - p->props = *props; - - p->inStream = inStream; - p->outStream = outStream; - p->progress = progress; - // p->stat = stat; - - p->outSize = 0; - p->outSize_Defined = False; - if (outDataSize) - { - p->outSize_Defined = True; - p->outSize = *outDataSize; - } - - p->finishMode = finishMode; - - // p->outSize = 457; p->outSize_Defined = True; p->finishMode = False; // for test - - p->writeRes = SZ_OK; - p->outProcessed = 0; - p->inProcessed = 0; - p->readProcessed = 0; - p->readWasFinished = False; - p->readRes = SZ_OK; - - p->codeRes = SZ_OK; - p->status = CODER_STATUS_NOT_SPECIFIED; - - XzUnpacker_Init(&p->dec); - - *isMT = False; - - /* - p->outBuf = NULL; - p->outBufSize = 0; - if (!outStream) - { - p->outBuf = outBuf; - p->outBufSize = *outBufSize; - *outBufSize = 0; - } - */ - - - #ifndef _7ZIP_ST - - p->isBlockHeaderState_Parse = False; - p->isBlockHeaderState_Write = False; - // p->numBadBlocks = 0; - p->mainErrorCode = SZ_OK; - p->mainDecoderWasCalled = False; - - tMode = False; - - if (p->props.numThreads > 1) - { - IMtDecCallback2 vt; - BoolInt needContinue; - SRes res; - // we just free ST buffers here - // but we still keep state variables, that was set in XzUnpacker_Init() - XzDecMt_FreeSt(p); - - p->outProcessed_Parse = 0; - p->parsing_Truncated = False; - - p->numStreams = 0; - p->numTotalBlocks = 0; - p->numBlocks = 0; - p->finishedDecoderIndex = -1; - - if (!p->mtc_WasConstructed) - { - p->mtc_WasConstructed = True; - MtDec_Construct(&p->mtc); - } - - p->mtc.mtCallback = &vt; - p->mtc.mtCallbackObject = p; - - p->mtc.progress = progress; - p->mtc.inStream = inStream; - p->mtc.alloc = &p->alignOffsetAlloc.vt; - // p->mtc.inData = inData; - // p->mtc.inDataSize = inDataSize; - p->mtc.inBufSize = p->props.inBufSize_MT; - // p->mtc.inBlockMax = p->props.inBlockMax; - p->mtc.numThreadsMax = p->props.numThreads; - - *isMT = True; - - vt.Parse = XzDecMt_Callback_Parse; - vt.PreCode = XzDecMt_Callback_PreCode; - vt.Code = XzDecMt_Callback_Code; - vt.Write = XzDecMt_Callback_Write; - - - res = MtDec_Code(&p->mtc); - - - stat->InSize = p->mtc.inProcessed; - - p->inProcessed = p->mtc.inProcessed; - p->readRes = p->mtc.readRes; - p->readWasFinished = p->mtc.readWasFinished; - p->readProcessed = p->mtc.readProcessed; - - tMode = True; - needContinue = False; - - if (res == SZ_OK) - { - if (p->mtc.mtProgress.res != SZ_OK) - { - res = p->mtc.mtProgress.res; - stat->ProgressRes = res; - stat->CombinedRes_Type = SZ_ERROR_PROGRESS; - } - else - needContinue = p->mtc.needContinue; - } - - if (!needContinue) - { - { - SRes codeRes; - BoolInt truncated = False; - ECoderStatus status; - const CXzUnpacker *dec; - - stat->OutSize = p->outProcessed; - - if (p->finishedDecoderIndex >= 0) - { - const CXzDecMtThread *coder = &p->coders[(unsigned)p->finishedDecoderIndex]; - codeRes = coder->codeRes; - dec = &coder->dec; - status = coder->status; - } - else if (p->mainDecoderWasCalled) - { - codeRes = p->codeRes; - dec = &p->dec; - status = p->status; - truncated = p->parsing_Truncated; - } - else - return SZ_ERROR_FAIL; - - if (p->mainErrorCode != SZ_OK) - stat->DecodeRes = p->mainErrorCode; - - XzStatInfo_SetStat(dec, p->finishMode, - // p->mtc.readProcessed, - p->mtc.inProcessed, - codeRes, status, - truncated, - stat); - } - - if (res == SZ_OK) - { - stat->ReadRes = p->mtc.readRes; - - if (p->writeRes != SZ_OK) - { - res = p->writeRes; - stat->CombinedRes_Type = SZ_ERROR_WRITE; - } - else if (p->mtc.readRes != SZ_OK - // && p->mtc.inProcessed == p->mtc.readProcessed - && stat->DecodeRes == SZ_ERROR_INPUT_EOF) - { - res = p->mtc.readRes; - stat->CombinedRes_Type = SZ_ERROR_READ; - } - else if (stat->DecodeRes != SZ_OK) - res = stat->DecodeRes; - } - - stat->CombinedRes = res; - if (stat->CombinedRes_Type == SZ_OK) - stat->CombinedRes_Type = res; - return res; - } - - PRF_STR("----- decoding ST -----"); - } - - #endif - - - *isMT = False; - - { - SRes res = XzDecMt_Decode_ST(p - #ifndef _7ZIP_ST - , tMode - #endif - , stat - ); - - #ifndef _7ZIP_ST - // we must set error code from MT decoding at first - if (p->mainErrorCode != SZ_OK) - stat->DecodeRes = p->mainErrorCode; - #endif - - XzStatInfo_SetStat(&p->dec, - p->finishMode, - // p->readProcessed, - p->inProcessed, - p->codeRes, p->status, - False, // truncated - stat); - - stat->ReadRes = p->readRes; - - if (res == SZ_OK) - { - if (p->readRes != SZ_OK - // && p->inProcessed == p->readProcessed - && stat->DecodeRes == SZ_ERROR_INPUT_EOF) - { - // we set read error as combined error, only if that error was the reason - // of decoding problem - res = p->readRes; - stat->CombinedRes_Type = SZ_ERROR_READ; - } - else if (stat->DecodeRes != SZ_OK) - res = stat->DecodeRes; - } - - stat->CombinedRes = res; - if (stat->CombinedRes_Type == SZ_OK) - stat->CombinedRes_Type = res; - return res; - } -} +/* XzDec.c -- Xz Decode +2021-09-04 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +// #include + +// #define XZ_DUMP + +/* #define XZ_DUMP */ + +#ifdef XZ_DUMP +#include +#endif + +// #define SHOW_DEBUG_INFO + +#ifdef SHOW_DEBUG_INFO +#include +#endif + +#ifdef SHOW_DEBUG_INFO +#define PRF(x) x +#else +#define PRF(x) +#endif + +#define PRF_STR(s) PRF(printf("\n" s "\n")) +#define PRF_STR_INT(s, d) PRF(printf("\n" s " %d\n", (unsigned)d)) + +#include +#include + +#include "7zCrc.h" +#include "Alloc.h" +#include "Bra.h" +#include "CpuArch.h" +#include "Delta.h" +#include "Lzma2Dec.h" + +// #define USE_SUBBLOCK + +#ifdef USE_SUBBLOCK +#include "Bcj3Dec.c" +#include "SbDec.h" +#endif + +#include "Xz.h" + +#define XZ_CHECK_SIZE_MAX 64 + +#define CODER_BUF_SIZE ((size_t)1 << 17) + +unsigned Xz_ReadVarInt(const Byte *p, size_t maxSize, UInt64 *value) +{ + unsigned i, limit; + *value = 0; + limit = (maxSize > 9) ? 9 : (unsigned)maxSize; + + for (i = 0; i < limit;) + { + Byte b = p[i]; + *value |= (UInt64)(b & 0x7F) << (7 * i++); + if ((b & 0x80) == 0) + return (b == 0 && i != 1) ? 0 : i; + } + return 0; +} + +/* ---------- BraState ---------- */ + +#define BRA_BUF_SIZE (1 << 14) + +typedef struct +{ + size_t bufPos; + size_t bufConv; + size_t bufTotal; + + int encodeMode; + + UInt32 methodId; + UInt32 delta; + UInt32 ip; + UInt32 x86State; + Byte deltaState[DELTA_STATE_SIZE]; + + Byte buf[BRA_BUF_SIZE]; +} CBraState; + +static void BraState_Free(void *pp, ISzAllocPtr alloc) +{ + ISzAlloc_Free(alloc, pp); +} + +static SRes BraState_SetProps(void *pp, const Byte *props, size_t propSize, ISzAllocPtr alloc) +{ + CBraState *p = ((CBraState *)pp); + UNUSED_VAR(alloc); + p->ip = 0; + if (p->methodId == XZ_ID_Delta) + { + if (propSize != 1) + return SZ_ERROR_UNSUPPORTED; + p->delta = (unsigned)props[0] + 1; + } + else + { + if (propSize == 4) + { + UInt32 v = GetUi32(props); + switch (p->methodId) + { + case XZ_ID_PPC: + case XZ_ID_ARM: + case XZ_ID_SPARC: + if ((v & 3) != 0) + return SZ_ERROR_UNSUPPORTED; + break; + case XZ_ID_ARMT: + if ((v & 1) != 0) + return SZ_ERROR_UNSUPPORTED; + break; + case XZ_ID_IA64: + if ((v & 0xF) != 0) + return SZ_ERROR_UNSUPPORTED; + break; + } + p->ip = v; + } + else if (propSize != 0) + return SZ_ERROR_UNSUPPORTED; + } + return SZ_OK; +} + +static void BraState_Init(void *pp) +{ + CBraState *p = ((CBraState *)pp); + p->bufPos = p->bufConv = p->bufTotal = 0; + x86_Convert_Init(p->x86State); + if (p->methodId == XZ_ID_Delta) + Delta_Init(p->deltaState); +} + + +#define CASE_BRA_CONV(isa) case XZ_ID_ ## isa: size = isa ## _Convert(data, size, p->ip, p->encodeMode); break; + +static SizeT BraState_Filter(void *pp, Byte *data, SizeT size) +{ + CBraState *p = ((CBraState *)pp); + switch (p->methodId) + { + case XZ_ID_Delta: + if (p->encodeMode) + Delta_Encode(p->deltaState, p->delta, data, size); + else + Delta_Decode(p->deltaState, p->delta, data, size); + break; + case XZ_ID_X86: + size = x86_Convert(data, size, p->ip, &p->x86State, p->encodeMode); + break; + CASE_BRA_CONV(PPC) + CASE_BRA_CONV(IA64) + CASE_BRA_CONV(ARM) + CASE_BRA_CONV(ARMT) + CASE_BRA_CONV(SPARC) + } + p->ip += (UInt32)size; + return size; +} + + +static SRes BraState_Code2(void *pp, + Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, int srcWasFinished, + ECoderFinishMode finishMode, + // int *wasFinished + ECoderStatus *status) +{ + CBraState *p = ((CBraState *)pp); + SizeT destRem = *destLen; + SizeT srcRem = *srcLen; + UNUSED_VAR(finishMode); + + *destLen = 0; + *srcLen = 0; + // *wasFinished = False; + *status = CODER_STATUS_NOT_FINISHED; + + while (destRem > 0) + { + if (p->bufPos != p->bufConv) + { + size_t size = p->bufConv - p->bufPos; + if (size > destRem) + size = destRem; + memcpy(dest, p->buf + p->bufPos, size); + p->bufPos += size; + *destLen += size; + dest += size; + destRem -= size; + continue; + } + + p->bufTotal -= p->bufPos; + memmove(p->buf, p->buf + p->bufPos, p->bufTotal); + p->bufPos = 0; + p->bufConv = 0; + { + size_t size = BRA_BUF_SIZE - p->bufTotal; + if (size > srcRem) + size = srcRem; + memcpy(p->buf + p->bufTotal, src, size); + *srcLen += size; + src += size; + srcRem -= size; + p->bufTotal += size; + } + if (p->bufTotal == 0) + break; + + p->bufConv = BraState_Filter(pp, p->buf, p->bufTotal); + + if (p->bufConv == 0) + { + if (!srcWasFinished) + break; + p->bufConv = p->bufTotal; + } + } + + if (p->bufTotal == p->bufPos && srcRem == 0 && srcWasFinished) + { + *status = CODER_STATUS_FINISHED_WITH_MARK; + // *wasFinished = 1; + } + + return SZ_OK; +} + + +SRes BraState_SetFromMethod(IStateCoder *p, UInt64 id, int encodeMode, ISzAllocPtr alloc); +SRes BraState_SetFromMethod(IStateCoder *p, UInt64 id, int encodeMode, ISzAllocPtr alloc) +{ + CBraState *decoder; + if (id < XZ_ID_Delta || id > XZ_ID_SPARC) + return SZ_ERROR_UNSUPPORTED; + decoder = (CBraState *)p->p; + if (!decoder) + { + decoder = (CBraState *)ISzAlloc_Alloc(alloc, sizeof(CBraState)); + if (!decoder) + return SZ_ERROR_MEM; + p->p = decoder; + p->Free = BraState_Free; + p->SetProps = BraState_SetProps; + p->Init = BraState_Init; + p->Code2 = BraState_Code2; + p->Filter = BraState_Filter; + } + decoder->methodId = (UInt32)id; + decoder->encodeMode = encodeMode; + return SZ_OK; +} + + + +/* ---------- SbState ---------- */ + +#ifdef USE_SUBBLOCK + +static void SbState_Free(void *pp, ISzAllocPtr alloc) +{ + CSbDec *p = (CSbDec *)pp; + SbDec_Free(p); + ISzAlloc_Free(alloc, pp); +} + +static SRes SbState_SetProps(void *pp, const Byte *props, size_t propSize, ISzAllocPtr alloc) +{ + UNUSED_VAR(pp); + UNUSED_VAR(props); + UNUSED_VAR(alloc); + return (propSize == 0) ? SZ_OK : SZ_ERROR_UNSUPPORTED; +} + +static void SbState_Init(void *pp) +{ + SbDec_Init((CSbDec *)pp); +} + +static SRes SbState_Code2(void *pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + int srcWasFinished, ECoderFinishMode finishMode, + // int *wasFinished + ECoderStatus *status) +{ + CSbDec *p = (CSbDec *)pp; + SRes res; + UNUSED_VAR(srcWasFinished); + p->dest = dest; + p->destLen = *destLen; + p->src = src; + p->srcLen = *srcLen; + p->finish = finishMode; /* change it */ + res = SbDec_Decode((CSbDec *)pp); + *destLen -= p->destLen; + *srcLen -= p->srcLen; + // *wasFinished = (*destLen == 0 && *srcLen == 0); /* change it */ + *status = (*destLen == 0 && *srcLen == 0) ? + CODER_STATUS_FINISHED_WITH_MARK : + CODER_STATUS_NOT_FINISHED; + return res; +} + +static SRes SbState_SetFromMethod(IStateCoder *p, ISzAllocPtr alloc) +{ + CSbDec *decoder = (CSbDec *)p->p; + if (!decoder) + { + decoder = (CSbDec *)ISzAlloc_Alloc(alloc, sizeof(CSbDec)); + if (!decoder) + return SZ_ERROR_MEM; + p->p = decoder; + p->Free = SbState_Free; + p->SetProps = SbState_SetProps; + p->Init = SbState_Init; + p->Code2 = SbState_Code2; + p->Filter = NULL; + } + SbDec_Construct(decoder); + SbDec_SetAlloc(decoder, alloc); + return SZ_OK; +} + +#endif + + + +/* ---------- Lzma2 ---------- */ + +typedef struct +{ + CLzma2Dec decoder; + BoolInt outBufMode; +} CLzma2Dec_Spec; + + +static void Lzma2State_Free(void *pp, ISzAllocPtr alloc) +{ + CLzma2Dec_Spec *p = (CLzma2Dec_Spec *)pp; + if (p->outBufMode) + Lzma2Dec_FreeProbs(&p->decoder, alloc); + else + Lzma2Dec_Free(&p->decoder, alloc); + ISzAlloc_Free(alloc, pp); +} + +static SRes Lzma2State_SetProps(void *pp, const Byte *props, size_t propSize, ISzAllocPtr alloc) +{ + if (propSize != 1) + return SZ_ERROR_UNSUPPORTED; + { + CLzma2Dec_Spec *p = (CLzma2Dec_Spec *)pp; + if (p->outBufMode) + return Lzma2Dec_AllocateProbs(&p->decoder, props[0], alloc); + else + return Lzma2Dec_Allocate(&p->decoder, props[0], alloc); + } +} + +static void Lzma2State_Init(void *pp) +{ + Lzma2Dec_Init(&((CLzma2Dec_Spec *)pp)->decoder); +} + + +/* + if (outBufMode), then (dest) is not used. Use NULL. + Data is unpacked to (spec->decoder.decoder.dic) output buffer. +*/ + +static SRes Lzma2State_Code2(void *pp, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + int srcWasFinished, ECoderFinishMode finishMode, + // int *wasFinished, + ECoderStatus *status) +{ + CLzma2Dec_Spec *spec = (CLzma2Dec_Spec *)pp; + ELzmaStatus status2; + /* ELzmaFinishMode fm = (finishMode == LZMA_FINISH_ANY) ? LZMA_FINISH_ANY : LZMA_FINISH_END; */ + SRes res; + UNUSED_VAR(srcWasFinished); + if (spec->outBufMode) + { + SizeT dicPos = spec->decoder.decoder.dicPos; + SizeT dicLimit = dicPos + *destLen; + res = Lzma2Dec_DecodeToDic(&spec->decoder, dicLimit, src, srcLen, (ELzmaFinishMode)finishMode, &status2); + *destLen = spec->decoder.decoder.dicPos - dicPos; + } + else + res = Lzma2Dec_DecodeToBuf(&spec->decoder, dest, destLen, src, srcLen, (ELzmaFinishMode)finishMode, &status2); + // *wasFinished = (status2 == LZMA_STATUS_FINISHED_WITH_MARK); + // ECoderStatus values are identical to ELzmaStatus values of LZMA2 decoder + *status = (ECoderStatus)status2; + return res; +} + + +static SRes Lzma2State_SetFromMethod(IStateCoder *p, Byte *outBuf, size_t outBufSize, ISzAllocPtr alloc) +{ + CLzma2Dec_Spec *spec = (CLzma2Dec_Spec *)p->p; + if (!spec) + { + spec = (CLzma2Dec_Spec *)ISzAlloc_Alloc(alloc, sizeof(CLzma2Dec_Spec)); + if (!spec) + return SZ_ERROR_MEM; + p->p = spec; + p->Free = Lzma2State_Free; + p->SetProps = Lzma2State_SetProps; + p->Init = Lzma2State_Init; + p->Code2 = Lzma2State_Code2; + p->Filter = NULL; + Lzma2Dec_Construct(&spec->decoder); + } + spec->outBufMode = False; + if (outBuf) + { + spec->outBufMode = True; + spec->decoder.decoder.dic = outBuf; + spec->decoder.decoder.dicBufSize = outBufSize; + } + return SZ_OK; +} + + +static SRes Lzma2State_ResetOutBuf(IStateCoder *p, Byte *outBuf, size_t outBufSize) +{ + CLzma2Dec_Spec *spec = (CLzma2Dec_Spec *)p->p; + if ((spec->outBufMode && !outBuf) || (!spec->outBufMode && outBuf)) + return SZ_ERROR_FAIL; + if (outBuf) + { + spec->decoder.decoder.dic = outBuf; + spec->decoder.decoder.dicBufSize = outBufSize; + } + return SZ_OK; +} + + + +static void MixCoder_Construct(CMixCoder *p, ISzAllocPtr alloc) +{ + unsigned i; + p->alloc = alloc; + p->buf = NULL; + p->numCoders = 0; + + p->outBufSize = 0; + p->outBuf = NULL; + // p->SingleBufMode = False; + + for (i = 0; i < MIXCODER_NUM_FILTERS_MAX; i++) + p->coders[i].p = NULL; +} + + +static void MixCoder_Free(CMixCoder *p) +{ + unsigned i; + p->numCoders = 0; + for (i = 0; i < MIXCODER_NUM_FILTERS_MAX; i++) + { + IStateCoder *sc = &p->coders[i]; + if (sc->p) + { + sc->Free(sc->p, p->alloc); + sc->p = NULL; + } + } + if (p->buf) + { + ISzAlloc_Free(p->alloc, p->buf); + p->buf = NULL; /* 9.31: the BUG was fixed */ + } +} + +static void MixCoder_Init(CMixCoder *p) +{ + unsigned i; + for (i = 0; i < MIXCODER_NUM_FILTERS_MAX - 1; i++) + { + p->size[i] = 0; + p->pos[i] = 0; + p->finished[i] = 0; + } + for (i = 0; i < p->numCoders; i++) + { + IStateCoder *coder = &p->coders[i]; + coder->Init(coder->p); + p->results[i] = SZ_OK; + } + p->outWritten = 0; + p->wasFinished = False; + p->res = SZ_OK; + p->status = CODER_STATUS_NOT_SPECIFIED; +} + + +static SRes MixCoder_SetFromMethod(CMixCoder *p, unsigned coderIndex, UInt64 methodId, Byte *outBuf, size_t outBufSize) +{ + IStateCoder *sc = &p->coders[coderIndex]; + p->ids[coderIndex] = methodId; + switch (methodId) + { + case XZ_ID_LZMA2: return Lzma2State_SetFromMethod(sc, outBuf, outBufSize, p->alloc); + #ifdef USE_SUBBLOCK + case XZ_ID_Subblock: return SbState_SetFromMethod(sc, p->alloc); + #endif + } + if (coderIndex == 0) + return SZ_ERROR_UNSUPPORTED; + return BraState_SetFromMethod(sc, methodId, 0, p->alloc); +} + + +static SRes MixCoder_ResetFromMethod(CMixCoder *p, unsigned coderIndex, UInt64 methodId, Byte *outBuf, size_t outBufSize) +{ + IStateCoder *sc = &p->coders[coderIndex]; + switch (methodId) + { + case XZ_ID_LZMA2: return Lzma2State_ResetOutBuf(sc, outBuf, outBufSize); + } + return SZ_ERROR_UNSUPPORTED; +} + + + +/* + if (destFinish) - then unpack data block is finished at (*destLen) position, + and we can return data that were not processed by filter + +output (status) can be : + CODER_STATUS_NOT_FINISHED + CODER_STATUS_FINISHED_WITH_MARK + CODER_STATUS_NEEDS_MORE_INPUT - not implemented still +*/ + +static SRes MixCoder_Code(CMixCoder *p, + Byte *dest, SizeT *destLen, int destFinish, + const Byte *src, SizeT *srcLen, int srcWasFinished, + ECoderFinishMode finishMode) +{ + SizeT destLenOrig = *destLen; + SizeT srcLenOrig = *srcLen; + + *destLen = 0; + *srcLen = 0; + + if (p->wasFinished) + return p->res; + + p->status = CODER_STATUS_NOT_FINISHED; + + // if (p->SingleBufMode) + if (p->outBuf) + { + SRes res; + SizeT destLen2, srcLen2; + int wasFinished; + + PRF_STR("------- MixCoder Single ----------"); + + srcLen2 = srcLenOrig; + destLen2 = destLenOrig; + + { + IStateCoder *coder = &p->coders[0]; + res = coder->Code2(coder->p, NULL, &destLen2, src, &srcLen2, srcWasFinished, finishMode, + // &wasFinished, + &p->status); + wasFinished = (p->status == CODER_STATUS_FINISHED_WITH_MARK); + } + + p->res = res; + + /* + if (wasFinished) + p->status = CODER_STATUS_FINISHED_WITH_MARK; + else + { + if (res == SZ_OK) + if (destLen2 != destLenOrig) + p->status = CODER_STATUS_NEEDS_MORE_INPUT; + } + */ + + + *srcLen = srcLen2; + src += srcLen2; + p->outWritten += destLen2; + + if (res != SZ_OK || srcWasFinished || wasFinished) + p->wasFinished = True; + + if (p->numCoders == 1) + *destLen = destLen2; + else if (p->wasFinished) + { + unsigned i; + size_t processed = p->outWritten; + + for (i = 1; i < p->numCoders; i++) + { + IStateCoder *coder = &p->coders[i]; + processed = coder->Filter(coder->p, p->outBuf, processed); + if (wasFinished || (destFinish && p->outWritten == destLenOrig)) + processed = p->outWritten; + PRF_STR_INT("filter", i); + } + *destLen = processed; + } + return res; + } + + PRF_STR("standard mix"); + + if (p->numCoders != 1) + { + if (!p->buf) + { + p->buf = (Byte *)ISzAlloc_Alloc(p->alloc, CODER_BUF_SIZE * (MIXCODER_NUM_FILTERS_MAX - 1)); + if (!p->buf) + return SZ_ERROR_MEM; + } + + finishMode = CODER_FINISH_ANY; + } + + for (;;) + { + BoolInt processed = False; + BoolInt allFinished = True; + SRes resMain = SZ_OK; + unsigned i; + + p->status = CODER_STATUS_NOT_FINISHED; + /* + if (p->numCoders == 1 && *destLen == destLenOrig && finishMode == LZMA_FINISH_ANY) + break; + */ + + for (i = 0; i < p->numCoders; i++) + { + SRes res; + IStateCoder *coder = &p->coders[i]; + Byte *dest2; + SizeT destLen2, srcLen2; // destLen2_Orig; + const Byte *src2; + int srcFinished2; + int encodingWasFinished; + ECoderStatus status2; + + if (i == 0) + { + src2 = src; + srcLen2 = srcLenOrig - *srcLen; + srcFinished2 = srcWasFinished; + } + else + { + size_t k = i - 1; + src2 = p->buf + (CODER_BUF_SIZE * k) + p->pos[k]; + srcLen2 = p->size[k] - p->pos[k]; + srcFinished2 = p->finished[k]; + } + + if (i == p->numCoders - 1) + { + dest2 = dest; + destLen2 = destLenOrig - *destLen; + } + else + { + if (p->pos[i] != p->size[i]) + continue; + dest2 = p->buf + (CODER_BUF_SIZE * i); + destLen2 = CODER_BUF_SIZE; + } + + // destLen2_Orig = destLen2; + + if (p->results[i] != SZ_OK) + { + if (resMain == SZ_OK) + resMain = p->results[i]; + continue; + } + + res = coder->Code2(coder->p, + dest2, &destLen2, + src2, &srcLen2, srcFinished2, + finishMode, + // &encodingWasFinished, + &status2); + + if (res != SZ_OK) + { + p->results[i] = res; + if (resMain == SZ_OK) + resMain = res; + } + + encodingWasFinished = (status2 == CODER_STATUS_FINISHED_WITH_MARK); + + if (!encodingWasFinished) + { + allFinished = False; + if (p->numCoders == 1 && res == SZ_OK) + p->status = status2; + } + + if (i == 0) + { + *srcLen += srcLen2; + src += srcLen2; + } + else + p->pos[(size_t)i - 1] += srcLen2; + + if (i == p->numCoders - 1) + { + *destLen += destLen2; + dest += destLen2; + } + else + { + p->size[i] = destLen2; + p->pos[i] = 0; + p->finished[i] = encodingWasFinished; + } + + if (destLen2 != 0 || srcLen2 != 0) + processed = True; + } + + if (!processed) + { + if (allFinished) + p->status = CODER_STATUS_FINISHED_WITH_MARK; + return resMain; + } + } +} + + +SRes Xz_ParseHeader(CXzStreamFlags *p, const Byte *buf) +{ + *p = (CXzStreamFlags)GetBe16(buf + XZ_SIG_SIZE); + if (CrcCalc(buf + XZ_SIG_SIZE, XZ_STREAM_FLAGS_SIZE) != + GetUi32(buf + XZ_SIG_SIZE + XZ_STREAM_FLAGS_SIZE)) + return SZ_ERROR_NO_ARCHIVE; + return XzFlags_IsSupported(*p) ? SZ_OK : SZ_ERROR_UNSUPPORTED; +} + +static BoolInt Xz_CheckFooter(CXzStreamFlags flags, UInt64 indexSize, const Byte *buf) +{ + return indexSize == (((UInt64)GetUi32(buf + 4) + 1) << 2) + && GetUi32(buf) == CrcCalc(buf + 4, 6) + && flags == GetBe16(buf + 8) + && buf[10] == XZ_FOOTER_SIG_0 + && buf[11] == XZ_FOOTER_SIG_1; +} + +#define READ_VARINT_AND_CHECK(buf, pos, size, res) \ + { unsigned s = Xz_ReadVarInt(buf + pos, size - pos, res); \ + if (s == 0) return SZ_ERROR_ARCHIVE; \ + pos += s; } + + +static BoolInt XzBlock_AreSupportedFilters(const CXzBlock *p) +{ + unsigned numFilters = XzBlock_GetNumFilters(p) - 1; + unsigned i; + { + const CXzFilter *f = &p->filters[numFilters]; + if (f->id != XZ_ID_LZMA2 || f->propsSize != 1 || f->props[0] > 40) + return False; + } + + for (i = 0; i < numFilters; i++) + { + const CXzFilter *f = &p->filters[i]; + if (f->id == XZ_ID_Delta) + { + if (f->propsSize != 1) + return False; + } + else if (f->id < XZ_ID_Delta + || f->id > XZ_ID_SPARC + || (f->propsSize != 0 && f->propsSize != 4)) + return False; + } + return True; +} + + +SRes XzBlock_Parse(CXzBlock *p, const Byte *header) +{ + unsigned pos; + unsigned numFilters, i; + unsigned headerSize = (unsigned)header[0] << 2; + + /* (headerSize != 0) : another code checks */ + + if (CrcCalc(header, headerSize) != GetUi32(header + headerSize)) + return SZ_ERROR_ARCHIVE; + + pos = 1; + p->flags = header[pos++]; + + p->packSize = (UInt64)(Int64)-1; + if (XzBlock_HasPackSize(p)) + { + READ_VARINT_AND_CHECK(header, pos, headerSize, &p->packSize); + if (p->packSize == 0 || p->packSize + headerSize >= (UInt64)1 << 63) + return SZ_ERROR_ARCHIVE; + } + + p->unpackSize = (UInt64)(Int64)-1; + if (XzBlock_HasUnpackSize(p)) + READ_VARINT_AND_CHECK(header, pos, headerSize, &p->unpackSize); + + numFilters = XzBlock_GetNumFilters(p); + for (i = 0; i < numFilters; i++) + { + CXzFilter *filter = p->filters + i; + UInt64 size; + READ_VARINT_AND_CHECK(header, pos, headerSize, &filter->id); + READ_VARINT_AND_CHECK(header, pos, headerSize, &size); + if (size > headerSize - pos || size > XZ_FILTER_PROPS_SIZE_MAX) + return SZ_ERROR_ARCHIVE; + filter->propsSize = (UInt32)size; + memcpy(filter->props, header + pos, (size_t)size); + pos += (unsigned)size; + + #ifdef XZ_DUMP + printf("\nf[%u] = %2X: ", i, (unsigned)filter->id); + { + unsigned i; + for (i = 0; i < size; i++) + printf(" %2X", filter->props[i]); + } + #endif + } + + if (XzBlock_HasUnsupportedFlags(p)) + return SZ_ERROR_UNSUPPORTED; + + while (pos < headerSize) + if (header[pos++] != 0) + return SZ_ERROR_ARCHIVE; + return SZ_OK; +} + + + + +static SRes XzDecMix_Init(CMixCoder *p, const CXzBlock *block, Byte *outBuf, size_t outBufSize) +{ + unsigned i; + BoolInt needReInit = True; + unsigned numFilters = XzBlock_GetNumFilters(block); + + if (numFilters == p->numCoders && ((p->outBuf && outBuf) || (!p->outBuf && !outBuf))) + { + needReInit = False; + for (i = 0; i < numFilters; i++) + if (p->ids[i] != block->filters[numFilters - 1 - i].id) + { + needReInit = True; + break; + } + } + + // p->SingleBufMode = (outBuf != NULL); + p->outBuf = outBuf; + p->outBufSize = outBufSize; + + // p->SingleBufMode = False; + // outBuf = NULL; + + if (needReInit) + { + MixCoder_Free(p); + for (i = 0; i < numFilters; i++) + { + RINOK(MixCoder_SetFromMethod(p, i, block->filters[numFilters - 1 - i].id, outBuf, outBufSize)); + } + p->numCoders = numFilters; + } + else + { + RINOK(MixCoder_ResetFromMethod(p, 0, block->filters[numFilters - 1].id, outBuf, outBufSize)); + } + + for (i = 0; i < numFilters; i++) + { + const CXzFilter *f = &block->filters[numFilters - 1 - i]; + IStateCoder *sc = &p->coders[i]; + RINOK(sc->SetProps(sc->p, f->props, f->propsSize, p->alloc)); + } + + MixCoder_Init(p); + return SZ_OK; +} + + + +void XzUnpacker_Init(CXzUnpacker *p) +{ + p->state = XZ_STATE_STREAM_HEADER; + p->pos = 0; + p->numStartedStreams = 0; + p->numFinishedStreams = 0; + p->numTotalBlocks = 0; + p->padSize = 0; + p->decodeOnlyOneBlock = 0; + + p->parseMode = False; + p->decodeToStreamSignature = False; + + // p->outBuf = NULL; + // p->outBufSize = 0; + p->outDataWritten = 0; +} + + +void XzUnpacker_SetOutBuf(CXzUnpacker *p, Byte *outBuf, size_t outBufSize) +{ + p->outBuf = outBuf; + p->outBufSize = outBufSize; +} + + +void XzUnpacker_Construct(CXzUnpacker *p, ISzAllocPtr alloc) +{ + MixCoder_Construct(&p->decoder, alloc); + p->outBuf = NULL; + p->outBufSize = 0; + XzUnpacker_Init(p); +} + + +void XzUnpacker_Free(CXzUnpacker *p) +{ + MixCoder_Free(&p->decoder); +} + + +void XzUnpacker_PrepareToRandomBlockDecoding(CXzUnpacker *p) +{ + p->indexSize = 0; + p->numBlocks = 0; + Sha256_Init(&p->sha); + p->state = XZ_STATE_BLOCK_HEADER; + p->pos = 0; + p->decodeOnlyOneBlock = 1; +} + + +static void XzUnpacker_UpdateIndex(CXzUnpacker *p, UInt64 packSize, UInt64 unpackSize) +{ + Byte temp[32]; + unsigned num = Xz_WriteVarInt(temp, packSize); + num += Xz_WriteVarInt(temp + num, unpackSize); + Sha256_Update(&p->sha, temp, num); + p->indexSize += num; + p->numBlocks++; +} + + + +SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, int srcFinished, + ECoderFinishMode finishMode, ECoderStatus *status) +{ + SizeT destLenOrig = *destLen; + SizeT srcLenOrig = *srcLen; + *destLen = 0; + *srcLen = 0; + *status = CODER_STATUS_NOT_SPECIFIED; + + for (;;) + { + SizeT srcRem; + + if (p->state == XZ_STATE_BLOCK) + { + SizeT destLen2 = destLenOrig - *destLen; + SizeT srcLen2 = srcLenOrig - *srcLen; + SRes res; + + ECoderFinishMode finishMode2 = finishMode; + BoolInt srcFinished2 = srcFinished; + BoolInt destFinish = False; + + if (p->block.packSize != (UInt64)(Int64)-1) + { + UInt64 rem = p->block.packSize - p->packSize; + if (srcLen2 >= rem) + { + srcFinished2 = True; + srcLen2 = (SizeT)rem; + } + if (rem == 0 && p->block.unpackSize == p->unpackSize) + return SZ_ERROR_DATA; + } + + if (p->block.unpackSize != (UInt64)(Int64)-1) + { + UInt64 rem = p->block.unpackSize - p->unpackSize; + if (destLen2 >= rem) + { + destFinish = True; + finishMode2 = CODER_FINISH_END; + destLen2 = (SizeT)rem; + } + } + + /* + if (srcLen2 == 0 && destLen2 == 0) + { + *status = CODER_STATUS_NOT_FINISHED; + return SZ_OK; + } + */ + + { + res = MixCoder_Code(&p->decoder, + (p->outBuf ? NULL : dest), &destLen2, destFinish, + src, &srcLen2, srcFinished2, + finishMode2); + + *status = p->decoder.status; + XzCheck_Update(&p->check, (p->outBuf ? p->outBuf + p->outDataWritten : dest), destLen2); + if (!p->outBuf) + dest += destLen2; + p->outDataWritten += destLen2; + } + + (*srcLen) += srcLen2; + src += srcLen2; + p->packSize += srcLen2; + (*destLen) += destLen2; + p->unpackSize += destLen2; + + RINOK(res); + + if (*status != CODER_STATUS_FINISHED_WITH_MARK) + { + if (p->block.packSize == p->packSize + && *status == CODER_STATUS_NEEDS_MORE_INPUT) + { + PRF_STR("CODER_STATUS_NEEDS_MORE_INPUT"); + *status = CODER_STATUS_NOT_SPECIFIED; + return SZ_ERROR_DATA; + } + + return SZ_OK; + } + { + XzUnpacker_UpdateIndex(p, XzUnpacker_GetPackSizeForIndex(p), p->unpackSize); + p->state = XZ_STATE_BLOCK_FOOTER; + p->pos = 0; + p->alignPos = 0; + *status = CODER_STATUS_NOT_SPECIFIED; + + if ((p->block.packSize != (UInt64)(Int64)-1 && p->block.packSize != p->packSize) + || (p->block.unpackSize != (UInt64)(Int64)-1 && p->block.unpackSize != p->unpackSize)) + { + PRF_STR("ERROR: block.size mismatch"); + return SZ_ERROR_DATA; + } + } + // continue; + } + + srcRem = srcLenOrig - *srcLen; + + // XZ_STATE_BLOCK_FOOTER can transit to XZ_STATE_BLOCK_HEADER without input bytes + if (srcRem == 0 && p->state != XZ_STATE_BLOCK_FOOTER) + { + *status = CODER_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + + switch (p->state) + { + case XZ_STATE_STREAM_HEADER: + { + if (p->pos < XZ_STREAM_HEADER_SIZE) + { + if (p->pos < XZ_SIG_SIZE && *src != XZ_SIG[p->pos]) + return SZ_ERROR_NO_ARCHIVE; + if (p->decodeToStreamSignature) + return SZ_OK; + p->buf[p->pos++] = *src++; + (*srcLen)++; + } + else + { + RINOK(Xz_ParseHeader(&p->streamFlags, p->buf)); + p->numStartedStreams++; + p->indexSize = 0; + p->numBlocks = 0; + Sha256_Init(&p->sha); + p->state = XZ_STATE_BLOCK_HEADER; + p->pos = 0; + } + break; + } + + case XZ_STATE_BLOCK_HEADER: + { + if (p->pos == 0) + { + p->buf[p->pos++] = *src++; + (*srcLen)++; + if (p->buf[0] == 0) + { + if (p->decodeOnlyOneBlock) + return SZ_ERROR_DATA; + p->indexPreSize = 1 + Xz_WriteVarInt(p->buf + 1, p->numBlocks); + p->indexPos = p->indexPreSize; + p->indexSize += p->indexPreSize; + Sha256_Final(&p->sha, p->shaDigest); + Sha256_Init(&p->sha); + p->crc = CrcUpdate(CRC_INIT_VAL, p->buf, p->indexPreSize); + p->state = XZ_STATE_STREAM_INDEX; + break; + } + p->blockHeaderSize = ((UInt32)p->buf[0] << 2) + 4; + break; + } + + if (p->pos != p->blockHeaderSize) + { + UInt32 cur = p->blockHeaderSize - p->pos; + if (cur > srcRem) + cur = (UInt32)srcRem; + memcpy(p->buf + p->pos, src, cur); + p->pos += cur; + (*srcLen) += cur; + src += cur; + } + else + { + RINOK(XzBlock_Parse(&p->block, p->buf)); + if (!XzBlock_AreSupportedFilters(&p->block)) + return SZ_ERROR_UNSUPPORTED; + p->numTotalBlocks++; + p->state = XZ_STATE_BLOCK; + p->packSize = 0; + p->unpackSize = 0; + XzCheck_Init(&p->check, XzFlags_GetCheckType(p->streamFlags)); + if (p->parseMode) + { + p->headerParsedOk = True; + return SZ_OK; + } + RINOK(XzDecMix_Init(&p->decoder, &p->block, p->outBuf, p->outBufSize)); + } + break; + } + + case XZ_STATE_BLOCK_FOOTER: + { + if ((((unsigned)p->packSize + p->alignPos) & 3) != 0) + { + if (srcRem == 0) + { + *status = CODER_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + (*srcLen)++; + p->alignPos++; + if (*src++ != 0) + return SZ_ERROR_CRC; + } + else + { + UInt32 checkSize = XzFlags_GetCheckSize(p->streamFlags); + UInt32 cur = checkSize - p->pos; + if (cur != 0) + { + if (srcRem == 0) + { + *status = CODER_STATUS_NEEDS_MORE_INPUT; + return SZ_OK; + } + if (cur > srcRem) + cur = (UInt32)srcRem; + memcpy(p->buf + p->pos, src, cur); + p->pos += cur; + (*srcLen) += cur; + src += cur; + if (checkSize != p->pos) + break; + } + { + Byte digest[XZ_CHECK_SIZE_MAX]; + p->state = XZ_STATE_BLOCK_HEADER; + p->pos = 0; + if (XzCheck_Final(&p->check, digest) && memcmp(digest, p->buf, checkSize) != 0) + return SZ_ERROR_CRC; + if (p->decodeOnlyOneBlock) + { + *status = CODER_STATUS_FINISHED_WITH_MARK; + return SZ_OK; + } + } + } + break; + } + + case XZ_STATE_STREAM_INDEX: + { + if (p->pos < p->indexPreSize) + { + (*srcLen)++; + if (*src++ != p->buf[p->pos++]) + return SZ_ERROR_CRC; + } + else + { + if (p->indexPos < p->indexSize) + { + UInt64 cur = p->indexSize - p->indexPos; + if (srcRem > cur) + srcRem = (SizeT)cur; + p->crc = CrcUpdate(p->crc, src, srcRem); + Sha256_Update(&p->sha, src, srcRem); + (*srcLen) += srcRem; + src += srcRem; + p->indexPos += srcRem; + } + else if ((p->indexPos & 3) != 0) + { + Byte b = *src++; + p->crc = CRC_UPDATE_BYTE(p->crc, b); + (*srcLen)++; + p->indexPos++; + p->indexSize++; + if (b != 0) + return SZ_ERROR_CRC; + } + else + { + Byte digest[SHA256_DIGEST_SIZE]; + p->state = XZ_STATE_STREAM_INDEX_CRC; + p->indexSize += 4; + p->pos = 0; + Sha256_Final(&p->sha, digest); + if (memcmp(digest, p->shaDigest, SHA256_DIGEST_SIZE) != 0) + return SZ_ERROR_CRC; + } + } + break; + } + + case XZ_STATE_STREAM_INDEX_CRC: + { + if (p->pos < 4) + { + (*srcLen)++; + p->buf[p->pos++] = *src++; + } + else + { + const Byte *ptr = p->buf; + p->state = XZ_STATE_STREAM_FOOTER; + p->pos = 0; + if (CRC_GET_DIGEST(p->crc) != GetUi32(ptr)) + return SZ_ERROR_CRC; + } + break; + } + + case XZ_STATE_STREAM_FOOTER: + { + UInt32 cur = XZ_STREAM_FOOTER_SIZE - p->pos; + if (cur > srcRem) + cur = (UInt32)srcRem; + memcpy(p->buf + p->pos, src, cur); + p->pos += cur; + (*srcLen) += cur; + src += cur; + if (p->pos == XZ_STREAM_FOOTER_SIZE) + { + p->state = XZ_STATE_STREAM_PADDING; + p->numFinishedStreams++; + p->padSize = 0; + if (!Xz_CheckFooter(p->streamFlags, p->indexSize, p->buf)) + return SZ_ERROR_CRC; + } + break; + } + + case XZ_STATE_STREAM_PADDING: + { + if (*src != 0) + { + if (((UInt32)p->padSize & 3) != 0) + return SZ_ERROR_NO_ARCHIVE; + p->pos = 0; + p->state = XZ_STATE_STREAM_HEADER; + } + else + { + (*srcLen)++; + src++; + p->padSize++; + } + break; + } + + case XZ_STATE_BLOCK: break; /* to disable GCC warning */ + } + } + /* + if (p->state == XZ_STATE_FINISHED) + *status = CODER_STATUS_FINISHED_WITH_MARK; + return SZ_OK; + */ +} + + +SRes XzUnpacker_CodeFull(CXzUnpacker *p, Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, + ECoderFinishMode finishMode, ECoderStatus *status) +{ + XzUnpacker_Init(p); + XzUnpacker_SetOutBuf(p, dest, *destLen); + + return XzUnpacker_Code(p, + NULL, destLen, + src, srcLen, True, + finishMode, status); +} + + +BoolInt XzUnpacker_IsBlockFinished(const CXzUnpacker *p) +{ + return (p->state == XZ_STATE_BLOCK_HEADER) && (p->pos == 0); +} + +BoolInt XzUnpacker_IsStreamWasFinished(const CXzUnpacker *p) +{ + return (p->state == XZ_STATE_STREAM_PADDING) && (((UInt32)p->padSize & 3) == 0); +} + +UInt64 XzUnpacker_GetExtraSize(const CXzUnpacker *p) +{ + UInt64 num = 0; + if (p->state == XZ_STATE_STREAM_PADDING) + num = p->padSize; + else if (p->state == XZ_STATE_STREAM_HEADER) + num = p->padSize + p->pos; + return num; +} + + + + + + + + + + + + + + + + + + + + + +#ifndef _7ZIP_ST +#include "MtDec.h" +#endif + + +void XzDecMtProps_Init(CXzDecMtProps *p) +{ + p->inBufSize_ST = 1 << 18; + p->outStep_ST = 1 << 20; + p->ignoreErrors = False; + + #ifndef _7ZIP_ST + p->numThreads = 1; + p->inBufSize_MT = 1 << 18; + p->memUseMax = sizeof(size_t) << 28; + #endif +} + + + +#ifndef _7ZIP_ST + +/* ---------- CXzDecMtThread ---------- */ + +typedef struct +{ + Byte *outBuf; + size_t outBufSize; + size_t outPreSize; + size_t inPreSize; + size_t inPreHeaderSize; + size_t blockPackSize_for_Index; // including block header and checksum. + size_t blockPackTotal; // including stream header, block header and checksum. + size_t inCodeSize; + size_t outCodeSize; + ECoderStatus status; + SRes codeRes; + BoolInt skipMode; + // BoolInt finishedWithMark; + EMtDecParseState parseState; + BoolInt parsing_Truncated; + BoolInt atBlockHeader; + CXzStreamFlags streamFlags; + // UInt64 numFinishedStreams + UInt64 numStreams; + UInt64 numTotalBlocks; + UInt64 numBlocks; + + BoolInt dec_created; + CXzUnpacker dec; + + Byte mtPad[1 << 7]; +} CXzDecMtThread; + +#endif + + +/* ---------- CXzDecMt ---------- */ + +typedef struct +{ + CAlignOffsetAlloc alignOffsetAlloc; + ISzAllocPtr allocMid; + + CXzDecMtProps props; + size_t unpackBlockMaxSize; + + ISeqInStream *inStream; + ISeqOutStream *outStream; + ICompressProgress *progress; + + BoolInt finishMode; + BoolInt outSize_Defined; + UInt64 outSize; + + UInt64 outProcessed; + UInt64 inProcessed; + UInt64 readProcessed; + BoolInt readWasFinished; + SRes readRes; + SRes writeRes; + + Byte *outBuf; + size_t outBufSize; + Byte *inBuf; + size_t inBufSize; + + CXzUnpacker dec; + + ECoderStatus status; + SRes codeRes; + + #ifndef _7ZIP_ST + BoolInt mainDecoderWasCalled; + // int statErrorDefined; + int finishedDecoderIndex; + + // global values that are used in Parse stage + CXzStreamFlags streamFlags; + // UInt64 numFinishedStreams + UInt64 numStreams; + UInt64 numTotalBlocks; + UInt64 numBlocks; + + // UInt64 numBadBlocks; + SRes mainErrorCode; // it's set to error code, if the size Code() output doesn't patch the size from Parsing stage + // it can be = SZ_ERROR_INPUT_EOF + // it can be = SZ_ERROR_DATA, in some another cases + BoolInt isBlockHeaderState_Parse; + BoolInt isBlockHeaderState_Write; + UInt64 outProcessed_Parse; + BoolInt parsing_Truncated; + + BoolInt mtc_WasConstructed; + CMtDec mtc; + CXzDecMtThread coders[MTDEC__THREADS_MAX]; + #endif + +} CXzDecMt; + + + +CXzDecMtHandle XzDecMt_Create(ISzAllocPtr alloc, ISzAllocPtr allocMid) +{ + CXzDecMt *p = (CXzDecMt *)ISzAlloc_Alloc(alloc, sizeof(CXzDecMt)); + if (!p) + return NULL; + + AlignOffsetAlloc_CreateVTable(&p->alignOffsetAlloc); + p->alignOffsetAlloc.baseAlloc = alloc; + p->alignOffsetAlloc.numAlignBits = 7; + p->alignOffsetAlloc.offset = 0; + + p->allocMid = allocMid; + + p->outBuf = NULL; + p->outBufSize = 0; + p->inBuf = NULL; + p->inBufSize = 0; + + XzUnpacker_Construct(&p->dec, &p->alignOffsetAlloc.vt); + + p->unpackBlockMaxSize = 0; + + XzDecMtProps_Init(&p->props); + + #ifndef _7ZIP_ST + p->mtc_WasConstructed = False; + { + unsigned i; + for (i = 0; i < MTDEC__THREADS_MAX; i++) + { + CXzDecMtThread *coder = &p->coders[i]; + coder->dec_created = False; + coder->outBuf = NULL; + coder->outBufSize = 0; + } + } + #endif + + return p; +} + + +#ifndef _7ZIP_ST + +static void XzDecMt_FreeOutBufs(CXzDecMt *p) +{ + unsigned i; + for (i = 0; i < MTDEC__THREADS_MAX; i++) + { + CXzDecMtThread *coder = &p->coders[i]; + if (coder->outBuf) + { + ISzAlloc_Free(p->allocMid, coder->outBuf); + coder->outBuf = NULL; + coder->outBufSize = 0; + } + } + p->unpackBlockMaxSize = 0; +} + +#endif + + + +static void XzDecMt_FreeSt(CXzDecMt *p) +{ + XzUnpacker_Free(&p->dec); + + if (p->outBuf) + { + ISzAlloc_Free(p->allocMid, p->outBuf); + p->outBuf = NULL; + } + p->outBufSize = 0; + + if (p->inBuf) + { + ISzAlloc_Free(p->allocMid, p->inBuf); + p->inBuf = NULL; + } + p->inBufSize = 0; +} + + +void XzDecMt_Destroy(CXzDecMtHandle pp) +{ + CXzDecMt *p = (CXzDecMt *)pp; + + XzDecMt_FreeSt(p); + + #ifndef _7ZIP_ST + + if (p->mtc_WasConstructed) + { + MtDec_Destruct(&p->mtc); + p->mtc_WasConstructed = False; + } + { + unsigned i; + for (i = 0; i < MTDEC__THREADS_MAX; i++) + { + CXzDecMtThread *t = &p->coders[i]; + if (t->dec_created) + { + // we don't need to free dict here + XzUnpacker_Free(&t->dec); + t->dec_created = False; + } + } + } + XzDecMt_FreeOutBufs(p); + + #endif + + ISzAlloc_Free(p->alignOffsetAlloc.baseAlloc, pp); +} + + + +#ifndef _7ZIP_ST + +static void XzDecMt_Callback_Parse(void *obj, unsigned coderIndex, CMtDecCallbackInfo *cc) +{ + CXzDecMt *me = (CXzDecMt *)obj; + CXzDecMtThread *coder = &me->coders[coderIndex]; + size_t srcSize = cc->srcSize; + + cc->srcSize = 0; + cc->outPos = 0; + cc->state = MTDEC_PARSE_CONTINUE; + + cc->canCreateNewThread = True; + + if (cc->startCall) + { + coder->outPreSize = 0; + coder->inPreSize = 0; + coder->inPreHeaderSize = 0; + coder->parseState = MTDEC_PARSE_CONTINUE; + coder->parsing_Truncated = False; + coder->skipMode = False; + coder->codeRes = SZ_OK; + coder->status = CODER_STATUS_NOT_SPECIFIED; + coder->inCodeSize = 0; + coder->outCodeSize = 0; + + coder->numStreams = me->numStreams; + coder->numTotalBlocks = me->numTotalBlocks; + coder->numBlocks = me->numBlocks; + + if (!coder->dec_created) + { + XzUnpacker_Construct(&coder->dec, &me->alignOffsetAlloc.vt); + coder->dec_created = True; + } + + XzUnpacker_Init(&coder->dec); + + if (me->isBlockHeaderState_Parse) + { + coder->dec.streamFlags = me->streamFlags; + coder->atBlockHeader = True; + XzUnpacker_PrepareToRandomBlockDecoding(&coder->dec); + } + else + { + coder->atBlockHeader = False; + me->isBlockHeaderState_Parse = True; + } + + coder->dec.numStartedStreams = me->numStreams; + coder->dec.numTotalBlocks = me->numTotalBlocks; + coder->dec.numBlocks = me->numBlocks; + } + + while (!coder->skipMode) + { + ECoderStatus status; + SRes res; + size_t srcSize2 = srcSize; + size_t destSize = (size_t)0 - 1; + + coder->dec.parseMode = True; + coder->dec.headerParsedOk = False; + + PRF_STR_INT("Parse", srcSize2); + + res = XzUnpacker_Code(&coder->dec, + NULL, &destSize, + cc->src, &srcSize2, cc->srcFinished, + CODER_FINISH_END, &status); + + // PRF(printf(" res = %d, srcSize2 = %d", res, (unsigned)srcSize2)); + + coder->codeRes = res; + coder->status = status; + cc->srcSize += srcSize2; + srcSize -= srcSize2; + coder->inPreHeaderSize += srcSize2; + coder->inPreSize = coder->inPreHeaderSize; + + if (res != SZ_OK) + { + cc->state = + coder->parseState = MTDEC_PARSE_END; + /* + if (res == SZ_ERROR_MEM) + return res; + return SZ_OK; + */ + return; // res; + } + + if (coder->dec.headerParsedOk) + { + const CXzBlock *block = &coder->dec.block; + if (XzBlock_HasUnpackSize(block) + // && block->unpackSize <= me->props.outBlockMax + && XzBlock_HasPackSize(block)) + { + { + if (block->unpackSize * 2 * me->mtc.numStartedThreads > me->props.memUseMax) + { + cc->state = MTDEC_PARSE_OVERFLOW; + return; // SZ_OK; + } + } + { + UInt64 packSize = block->packSize; + UInt64 packSizeAligned = packSize + ((0 - (unsigned)packSize) & 3); + UInt32 checkSize = XzFlags_GetCheckSize(coder->dec.streamFlags); + UInt64 blockPackSum = coder->inPreSize + packSizeAligned + checkSize; + // if (blockPackSum <= me->props.inBlockMax) + // unpackBlockMaxSize + { + coder->blockPackSize_for_Index = (size_t)(coder->dec.blockHeaderSize + packSize + checkSize); + coder->blockPackTotal = (size_t)blockPackSum; + coder->outPreSize = (size_t)block->unpackSize; + coder->streamFlags = coder->dec.streamFlags; + me->streamFlags = coder->dec.streamFlags; + coder->skipMode = True; + break; + } + } + } + } + else + // if (coder->inPreSize <= me->props.inBlockMax) + { + if (!cc->srcFinished) + return; // SZ_OK; + cc->state = + coder->parseState = MTDEC_PARSE_END; + return; // SZ_OK; + } + cc->state = MTDEC_PARSE_OVERFLOW; + return; // SZ_OK; + } + + // ---------- skipMode ---------- + { + UInt64 rem = coder->blockPackTotal - coder->inPreSize; + size_t cur = srcSize; + if (cur > rem) + cur = (size_t)rem; + cc->srcSize += cur; + coder->inPreSize += cur; + srcSize -= cur; + + if (coder->inPreSize == coder->blockPackTotal) + { + if (srcSize == 0) + { + if (!cc->srcFinished) + return; // SZ_OK; + cc->state = MTDEC_PARSE_END; + } + else if ((cc->src)[cc->srcSize] == 0) // we check control byte of next block + cc->state = MTDEC_PARSE_END; + else + { + cc->state = MTDEC_PARSE_NEW; + + { + size_t blockMax = me->unpackBlockMaxSize; + if (blockMax < coder->outPreSize) + blockMax = coder->outPreSize; + { + UInt64 required = (UInt64)blockMax * (me->mtc.numStartedThreads + 1) * 2; + if (me->props.memUseMax < required) + cc->canCreateNewThread = False; + } + } + + if (me->outSize_Defined) + { + // next block can be zero size + const UInt64 rem2 = me->outSize - me->outProcessed_Parse; + if (rem2 < coder->outPreSize) + { + coder->parsing_Truncated = True; + cc->state = MTDEC_PARSE_END; + } + me->outProcessed_Parse += coder->outPreSize; + } + } + } + else if (cc->srcFinished) + cc->state = MTDEC_PARSE_END; + else + return; // SZ_OK; + + coder->parseState = cc->state; + cc->outPos = coder->outPreSize; + + me->numStreams = coder->dec.numStartedStreams; + me->numTotalBlocks = coder->dec.numTotalBlocks; + me->numBlocks = coder->dec.numBlocks + 1; + return; // SZ_OK; + } +} + + +static SRes XzDecMt_Callback_PreCode(void *pp, unsigned coderIndex) +{ + CXzDecMt *me = (CXzDecMt *)pp; + CXzDecMtThread *coder = &me->coders[coderIndex]; + Byte *dest; + + if (!coder->dec.headerParsedOk) + return SZ_OK; + + dest = coder->outBuf; + + if (!dest || coder->outBufSize < coder->outPreSize) + { + if (dest) + { + ISzAlloc_Free(me->allocMid, dest); + coder->outBuf = NULL; + coder->outBufSize = 0; + } + { + size_t outPreSize = coder->outPreSize; + if (outPreSize == 0) + outPreSize = 1; + dest = (Byte *)ISzAlloc_Alloc(me->allocMid, outPreSize); + } + if (!dest) + return SZ_ERROR_MEM; + coder->outBuf = dest; + coder->outBufSize = coder->outPreSize; + + if (coder->outBufSize > me->unpackBlockMaxSize) + me->unpackBlockMaxSize = coder->outBufSize; + } + + // return SZ_ERROR_MEM; + + XzUnpacker_SetOutBuf(&coder->dec, coder->outBuf, coder->outBufSize); + + { + SRes res = XzDecMix_Init(&coder->dec.decoder, &coder->dec.block, coder->outBuf, coder->outBufSize); + // res = SZ_ERROR_UNSUPPORTED; // to test + coder->codeRes = res; + if (res != SZ_OK) + { + // if (res == SZ_ERROR_MEM) return res; + if (me->props.ignoreErrors && res != SZ_ERROR_MEM) + return SZ_OK; + return res; + } + } + + return SZ_OK; +} + + +static SRes XzDecMt_Callback_Code(void *pp, unsigned coderIndex, + const Byte *src, size_t srcSize, int srcFinished, + // int finished, int blockFinished, + UInt64 *inCodePos, UInt64 *outCodePos, int *stop) +{ + CXzDecMt *me = (CXzDecMt *)pp; + CXzDecMtThread *coder = &me->coders[coderIndex]; + + *inCodePos = coder->inCodeSize; + *outCodePos = coder->outCodeSize; + *stop = True; + + if (srcSize > coder->inPreSize - coder->inCodeSize) + return SZ_ERROR_FAIL; + + if (coder->inCodeSize < coder->inPreHeaderSize) + { + size_t step = coder->inPreHeaderSize - coder->inCodeSize; + if (step > srcSize) + step = srcSize; + src += step; + srcSize -= step; + coder->inCodeSize += step; + *inCodePos = coder->inCodeSize; + if (coder->inCodeSize < coder->inPreHeaderSize) + { + *stop = False; + return SZ_OK; + } + } + + if (!coder->dec.headerParsedOk) + return SZ_OK; + if (!coder->outBuf) + return SZ_OK; + + if (coder->codeRes == SZ_OK) + { + ECoderStatus status; + SRes res; + size_t srcProcessed = srcSize; + size_t outSizeCur = coder->outPreSize - coder->dec.outDataWritten; + + // PRF(printf("\nCallback_Code: Code %d %d\n", (unsigned)srcSize, (unsigned)outSizeCur)); + + res = XzUnpacker_Code(&coder->dec, + NULL, &outSizeCur, + src, &srcProcessed, srcFinished, + // coder->finishedWithMark ? CODER_FINISH_END : CODER_FINISH_ANY, + CODER_FINISH_END, + &status); + + // PRF(printf(" res = %d, srcSize2 = %d, outSizeCur = %d", res, (unsigned)srcProcessed, (unsigned)outSizeCur)); + + coder->codeRes = res; + coder->status = status; + coder->inCodeSize += srcProcessed; + coder->outCodeSize = coder->dec.outDataWritten; + *inCodePos = coder->inCodeSize; + *outCodePos = coder->outCodeSize; + + if (res == SZ_OK) + { + if (srcProcessed == srcSize) + *stop = False; + return SZ_OK; + } + } + + if (me->props.ignoreErrors && coder->codeRes != SZ_ERROR_MEM) + { + *inCodePos = coder->inPreSize; + *outCodePos = coder->outPreSize; + return SZ_OK; + } + return coder->codeRes; +} + + +#define XZDECMT_STREAM_WRITE_STEP (1 << 24) + +static SRes XzDecMt_Callback_Write(void *pp, unsigned coderIndex, + BoolInt needWriteToStream, + const Byte *src, size_t srcSize, BoolInt isCross, + // int srcFinished, + BoolInt *needContinue, + BoolInt *canRecode) +{ + CXzDecMt *me = (CXzDecMt *)pp; + const CXzDecMtThread *coder = &me->coders[coderIndex]; + + // PRF(printf("\nWrite processed = %d srcSize = %d\n", (unsigned)me->mtc.inProcessed, (unsigned)srcSize)); + + *needContinue = False; + *canRecode = True; + + if (!needWriteToStream) + return SZ_OK; + + if (!coder->dec.headerParsedOk || !coder->outBuf) + { + if (me->finishedDecoderIndex < 0) + me->finishedDecoderIndex = (int)coderIndex; + return SZ_OK; + } + + if (me->finishedDecoderIndex >= 0) + return SZ_OK; + + me->mtc.inProcessed += coder->inCodeSize; + + *canRecode = False; + + { + SRes res; + size_t size = coder->outCodeSize; + Byte *data = coder->outBuf; + + // we use in me->dec: sha, numBlocks, indexSize + + if (!me->isBlockHeaderState_Write) + { + XzUnpacker_PrepareToRandomBlockDecoding(&me->dec); + me->dec.decodeOnlyOneBlock = False; + me->dec.numStartedStreams = coder->dec.numStartedStreams; + me->dec.streamFlags = coder->streamFlags; + + me->isBlockHeaderState_Write = True; + } + + me->dec.numTotalBlocks = coder->dec.numTotalBlocks; + XzUnpacker_UpdateIndex(&me->dec, coder->blockPackSize_for_Index, coder->outPreSize); + + if (coder->outPreSize != size) + { + if (me->props.ignoreErrors) + { + memset(data + size, 0, coder->outPreSize - size); + size = coder->outPreSize; + } + // me->numBadBlocks++; + if (me->mainErrorCode == SZ_OK) + { + if ((int)coder->status == LZMA_STATUS_NEEDS_MORE_INPUT) + me->mainErrorCode = SZ_ERROR_INPUT_EOF; + else + me->mainErrorCode = SZ_ERROR_DATA; + } + } + + if (me->writeRes != SZ_OK) + return me->writeRes; + + res = SZ_OK; + { + if (me->outSize_Defined) + { + const UInt64 rem = me->outSize - me->outProcessed; + if (size > rem) + size = (SizeT)rem; + } + + for (;;) + { + size_t cur = size; + size_t written; + if (cur > XZDECMT_STREAM_WRITE_STEP) + cur = XZDECMT_STREAM_WRITE_STEP; + + written = ISeqOutStream_Write(me->outStream, data, cur); + + // PRF(printf("\nWritten ask = %d written = %d\n", (unsigned)cur, (unsigned)written)); + + me->outProcessed += written; + if (written != cur) + { + me->writeRes = SZ_ERROR_WRITE; + res = me->writeRes; + break; + } + data += cur; + size -= cur; + // PRF_STR_INT("Written size =", size); + if (size == 0) + break; + res = MtProgress_ProgressAdd(&me->mtc.mtProgress, 0, 0); + if (res != SZ_OK) + break; + } + } + + if (coder->codeRes != SZ_OK) + if (!me->props.ignoreErrors) + { + me->finishedDecoderIndex = (int)coderIndex; + return res; + } + + RINOK(res); + + if (coder->inPreSize != coder->inCodeSize + || coder->blockPackTotal != coder->inCodeSize) + { + me->finishedDecoderIndex = (int)coderIndex; + return SZ_OK; + } + + if (coder->parseState != MTDEC_PARSE_END) + { + *needContinue = True; + return SZ_OK; + } + } + + // (coder->state == MTDEC_PARSE_END) means that there are no other working threads + // so we can use mtc variables without lock + + PRF_STR_INT("Write MTDEC_PARSE_END", me->mtc.inProcessed); + + me->mtc.mtProgress.totalInSize = me->mtc.inProcessed; + { + CXzUnpacker *dec = &me->dec; + + PRF_STR_INT("PostSingle", srcSize); + + { + size_t srcProcessed = srcSize; + ECoderStatus status; + size_t outSizeCur = 0; + SRes res; + + // dec->decodeOnlyOneBlock = False; + dec->decodeToStreamSignature = True; + + me->mainDecoderWasCalled = True; + + if (coder->parsing_Truncated) + { + me->parsing_Truncated = True; + return SZ_OK; + } + + /* + We have processed all xz-blocks of stream, + And xz unpacker is at XZ_STATE_BLOCK_HEADER state, where + (src) is a pointer to xz-Index structure. + We finish reading of current xz-Stream, including Zero padding after xz-Stream. + We exit, if we reach extra byte (first byte of new-Stream or another data). + But we don't update input stream pointer for that new extra byte. + If extra byte is not correct first byte of xz-signature, + we have SZ_ERROR_NO_ARCHIVE error here. + */ + + res = XzUnpacker_Code(dec, + NULL, &outSizeCur, + src, &srcProcessed, + me->mtc.readWasFinished, // srcFinished + CODER_FINISH_END, // CODER_FINISH_ANY, + &status); + + // res = SZ_ERROR_ARCHIVE; // for failure test + + me->status = status; + me->codeRes = res; + + if (isCross) + me->mtc.crossStart += srcProcessed; + + me->mtc.inProcessed += srcProcessed; + me->mtc.mtProgress.totalInSize = me->mtc.inProcessed; + + srcSize -= srcProcessed; + src += srcProcessed; + + if (res != SZ_OK) + { + return SZ_OK; + // return res; + } + + if (dec->state == XZ_STATE_STREAM_HEADER) + { + *needContinue = True; + me->isBlockHeaderState_Parse = False; + me->isBlockHeaderState_Write = False; + + if (!isCross) + { + Byte *crossBuf = MtDec_GetCrossBuff(&me->mtc); + if (!crossBuf) + return SZ_ERROR_MEM; + if (srcSize != 0) + memcpy(crossBuf, src, srcSize); + me->mtc.crossStart = 0; + me->mtc.crossEnd = srcSize; + } + + PRF_STR_INT("XZ_STATE_STREAM_HEADER crossEnd = ", (unsigned)me->mtc.crossEnd); + + return SZ_OK; + } + + if (status != CODER_STATUS_NEEDS_MORE_INPUT || srcSize != 0) + { + return SZ_ERROR_FAIL; + } + + if (me->mtc.readWasFinished) + { + return SZ_OK; + } + } + + { + size_t inPos; + size_t inLim; + // const Byte *inData; + UInt64 inProgressPrev = me->mtc.inProcessed; + + // XzDecMt_Prepare_InBuf_ST(p); + Byte *crossBuf = MtDec_GetCrossBuff(&me->mtc); + if (!crossBuf) + return SZ_ERROR_MEM; + + inPos = 0; + inLim = 0; + + // inData = crossBuf; + + for (;;) + { + SizeT inProcessed; + SizeT outProcessed; + ECoderStatus status; + SRes res; + + if (inPos == inLim) + { + if (!me->mtc.readWasFinished) + { + inPos = 0; + inLim = me->mtc.inBufSize; + me->mtc.readRes = ISeqInStream_Read(me->inStream, (void *)crossBuf, &inLim); + me->mtc.readProcessed += inLim; + if (inLim == 0 || me->mtc.readRes != SZ_OK) + me->mtc.readWasFinished = True; + } + } + + inProcessed = inLim - inPos; + outProcessed = 0; + + res = XzUnpacker_Code(dec, + NULL, &outProcessed, + crossBuf + inPos, &inProcessed, + (inProcessed == 0), // srcFinished + CODER_FINISH_END, &status); + + me->codeRes = res; + me->status = status; + inPos += inProcessed; + me->mtc.inProcessed += inProcessed; + me->mtc.mtProgress.totalInSize = me->mtc.inProcessed; + + if (res != SZ_OK) + { + return SZ_OK; + // return res; + } + + if (dec->state == XZ_STATE_STREAM_HEADER) + { + *needContinue = True; + me->mtc.crossStart = inPos; + me->mtc.crossEnd = inLim; + me->isBlockHeaderState_Parse = False; + me->isBlockHeaderState_Write = False; + return SZ_OK; + } + + if (status != CODER_STATUS_NEEDS_MORE_INPUT) + return SZ_ERROR_FAIL; + + if (me->mtc.progress) + { + UInt64 inDelta = me->mtc.inProcessed - inProgressPrev; + if (inDelta >= (1 << 22)) + { + RINOK(MtProgress_Progress_ST(&me->mtc.mtProgress)); + inProgressPrev = me->mtc.inProcessed; + } + } + if (me->mtc.readWasFinished) + return SZ_OK; + } + } + } +} + + +#endif + + + +void XzStatInfo_Clear(CXzStatInfo *p) +{ + p->InSize = 0; + p->OutSize = 0; + + p->NumStreams = 0; + p->NumBlocks = 0; + + p->UnpackSize_Defined = False; + + p->NumStreams_Defined = False; + p->NumBlocks_Defined = False; + + p->DataAfterEnd = False; + p->DecodingTruncated = False; + + p->DecodeRes = SZ_OK; + p->ReadRes = SZ_OK; + p->ProgressRes = SZ_OK; + + p->CombinedRes = SZ_OK; + p->CombinedRes_Type = SZ_OK; +} + + + +/* + XzDecMt_Decode_ST() can return SZ_OK or the following errors + - SZ_ERROR_MEM for memory allocation error + - error from XzUnpacker_Code() function + - SZ_ERROR_WRITE for ISeqOutStream::Write(). stat->CombinedRes_Type = SZ_ERROR_WRITE in that case + - ICompressProgress::Progress() error, stat->CombinedRes_Type = SZ_ERROR_PROGRESS. + But XzDecMt_Decode_ST() doesn't return ISeqInStream::Read() errors. + ISeqInStream::Read() result is set to p->readRes. + also it can set stat->CombinedRes_Type to SZ_ERROR_WRITE or SZ_ERROR_PROGRESS. +*/ + +static SRes XzDecMt_Decode_ST(CXzDecMt *p + #ifndef _7ZIP_ST + , BoolInt tMode + #endif + , CXzStatInfo *stat) +{ + size_t outPos; + size_t inPos, inLim; + const Byte *inData; + UInt64 inPrev, outPrev; + + CXzUnpacker *dec; + + #ifndef _7ZIP_ST + if (tMode) + { + XzDecMt_FreeOutBufs(p); + tMode = MtDec_PrepareRead(&p->mtc); + } + #endif + + if (!p->outBuf || p->outBufSize != p->props.outStep_ST) + { + ISzAlloc_Free(p->allocMid, p->outBuf); + p->outBufSize = 0; + p->outBuf = (Byte *)ISzAlloc_Alloc(p->allocMid, p->props.outStep_ST); + if (!p->outBuf) + return SZ_ERROR_MEM; + p->outBufSize = p->props.outStep_ST; + } + + if (!p->inBuf || p->inBufSize != p->props.inBufSize_ST) + { + ISzAlloc_Free(p->allocMid, p->inBuf); + p->inBufSize = 0; + p->inBuf = (Byte *)ISzAlloc_Alloc(p->allocMid, p->props.inBufSize_ST); + if (!p->inBuf) + return SZ_ERROR_MEM; + p->inBufSize = p->props.inBufSize_ST; + } + + dec = &p->dec; + dec->decodeToStreamSignature = False; + // dec->decodeOnlyOneBlock = False; + + XzUnpacker_SetOutBuf(dec, NULL, 0); + + inPrev = p->inProcessed; + outPrev = p->outProcessed; + + inPos = 0; + inLim = 0; + inData = NULL; + outPos = 0; + + for (;;) + { + SizeT outSize; + BoolInt finished; + ECoderFinishMode finishMode; + SizeT inProcessed; + ECoderStatus status; + SRes res; + + SizeT outProcessed; + + + + if (inPos == inLim) + { + #ifndef _7ZIP_ST + if (tMode) + { + inData = MtDec_Read(&p->mtc, &inLim); + inPos = 0; + if (inData) + continue; + tMode = False; + inLim = 0; + } + #endif + + if (!p->readWasFinished) + { + inPos = 0; + inLim = p->inBufSize; + inData = p->inBuf; + p->readRes = ISeqInStream_Read(p->inStream, (void *)p->inBuf, &inLim); + p->readProcessed += inLim; + if (inLim == 0 || p->readRes != SZ_OK) + p->readWasFinished = True; + } + } + + outSize = p->props.outStep_ST - outPos; + + finishMode = CODER_FINISH_ANY; + if (p->outSize_Defined) + { + const UInt64 rem = p->outSize - p->outProcessed; + if (outSize >= rem) + { + outSize = (SizeT)rem; + if (p->finishMode) + finishMode = CODER_FINISH_END; + } + } + + inProcessed = inLim - inPos; + outProcessed = outSize; + + res = XzUnpacker_Code(dec, p->outBuf + outPos, &outProcessed, + inData + inPos, &inProcessed, + (inPos == inLim), // srcFinished + finishMode, &status); + + p->codeRes = res; + p->status = status; + + inPos += inProcessed; + outPos += outProcessed; + p->inProcessed += inProcessed; + p->outProcessed += outProcessed; + + finished = ((inProcessed == 0 && outProcessed == 0) || res != SZ_OK); + + if (finished || outProcessed >= outSize) + if (outPos != 0) + { + const size_t written = ISeqOutStream_Write(p->outStream, p->outBuf, outPos); + // p->outProcessed += written; // 21.01: BUG fixed + if (written != outPos) + { + stat->CombinedRes_Type = SZ_ERROR_WRITE; + return SZ_ERROR_WRITE; + } + outPos = 0; + } + + if (p->progress && res == SZ_OK) + { + if (p->inProcessed - inPrev >= (1 << 22) || + p->outProcessed - outPrev >= (1 << 22)) + { + res = ICompressProgress_Progress(p->progress, p->inProcessed, p->outProcessed); + if (res != SZ_OK) + { + stat->CombinedRes_Type = SZ_ERROR_PROGRESS; + stat->ProgressRes = res; + return res; + } + inPrev = p->inProcessed; + outPrev = p->outProcessed; + } + } + + if (finished) + { + // p->codeRes is preliminary error from XzUnpacker_Code. + // and it can be corrected later as final result + // so we return SZ_OK here instead of (res); + return SZ_OK; + // return res; + } + } +} + + + +/* +XzStatInfo_SetStat() transforms + CXzUnpacker return code and status to combined CXzStatInfo results. + it can convert SZ_OK to SZ_ERROR_INPUT_EOF + it can convert SZ_ERROR_NO_ARCHIVE to SZ_OK and (DataAfterEnd = 1) +*/ + +static void XzStatInfo_SetStat(const CXzUnpacker *dec, + int finishMode, + // UInt64 readProcessed, + UInt64 inProcessed, + SRes res, // it's result from CXzUnpacker unpacker + ECoderStatus status, + BoolInt decodingTruncated, + CXzStatInfo *stat) +{ + UInt64 extraSize; + + stat->DecodingTruncated = (Byte)(decodingTruncated ? 1 : 0); + stat->InSize = inProcessed; + stat->NumStreams = dec->numStartedStreams; + stat->NumBlocks = dec->numTotalBlocks; + + stat->UnpackSize_Defined = True; + stat->NumStreams_Defined = True; + stat->NumBlocks_Defined = True; + + extraSize = XzUnpacker_GetExtraSize(dec); + + if (res == SZ_OK) + { + if (status == CODER_STATUS_NEEDS_MORE_INPUT) + { + // CODER_STATUS_NEEDS_MORE_INPUT is expected status for correct xz streams + // any extra data is part of correct data + extraSize = 0; + // if xz stream was not finished, then we need more data + if (!XzUnpacker_IsStreamWasFinished(dec)) + res = SZ_ERROR_INPUT_EOF; + } + else + { + // CODER_STATUS_FINISHED_WITH_MARK is not possible for multi stream xz decoding + // so he we have (status == CODER_STATUS_NOT_FINISHED) + // if (status != CODER_STATUS_FINISHED_WITH_MARK) + if (!decodingTruncated || finishMode) + res = SZ_ERROR_DATA; + } + } + else if (res == SZ_ERROR_NO_ARCHIVE) + { + /* + SZ_ERROR_NO_ARCHIVE is possible for 2 states: + XZ_STATE_STREAM_HEADER - if bad signature or bad CRC + XZ_STATE_STREAM_PADDING - if non-zero padding data + extraSize and inProcessed don't include "bad" byte + */ + // if (inProcessed == extraSize), there was no any good xz stream header, and we keep error + if (inProcessed != extraSize) // if there were good xz streams before error + { + // if (extraSize != 0 || readProcessed != inProcessed) + { + // he we suppose that all xz streams were finsihed OK, and we have + // some extra data after all streams + stat->DataAfterEnd = True; + res = SZ_OK; + } + } + } + + if (stat->DecodeRes == SZ_OK) + stat->DecodeRes = res; + + stat->InSize -= extraSize; +} + + + +SRes XzDecMt_Decode(CXzDecMtHandle pp, + const CXzDecMtProps *props, + const UInt64 *outDataSize, int finishMode, + ISeqOutStream *outStream, + // Byte *outBuf, size_t *outBufSize, + ISeqInStream *inStream, + // const Byte *inData, size_t inDataSize, + CXzStatInfo *stat, + int *isMT, + ICompressProgress *progress) +{ + CXzDecMt *p = (CXzDecMt *)pp; + #ifndef _7ZIP_ST + BoolInt tMode; + #endif + + XzStatInfo_Clear(stat); + + p->props = *props; + + p->inStream = inStream; + p->outStream = outStream; + p->progress = progress; + // p->stat = stat; + + p->outSize = 0; + p->outSize_Defined = False; + if (outDataSize) + { + p->outSize_Defined = True; + p->outSize = *outDataSize; + } + + p->finishMode = finishMode; + + // p->outSize = 457; p->outSize_Defined = True; p->finishMode = False; // for test + + p->writeRes = SZ_OK; + p->outProcessed = 0; + p->inProcessed = 0; + p->readProcessed = 0; + p->readWasFinished = False; + p->readRes = SZ_OK; + + p->codeRes = SZ_OK; + p->status = CODER_STATUS_NOT_SPECIFIED; + + XzUnpacker_Init(&p->dec); + + *isMT = False; + + /* + p->outBuf = NULL; + p->outBufSize = 0; + if (!outStream) + { + p->outBuf = outBuf; + p->outBufSize = *outBufSize; + *outBufSize = 0; + } + */ + + + #ifndef _7ZIP_ST + + p->isBlockHeaderState_Parse = False; + p->isBlockHeaderState_Write = False; + // p->numBadBlocks = 0; + p->mainErrorCode = SZ_OK; + p->mainDecoderWasCalled = False; + + tMode = False; + + if (p->props.numThreads > 1) + { + IMtDecCallback2 vt; + BoolInt needContinue; + SRes res; + // we just free ST buffers here + // but we still keep state variables, that was set in XzUnpacker_Init() + XzDecMt_FreeSt(p); + + p->outProcessed_Parse = 0; + p->parsing_Truncated = False; + + p->numStreams = 0; + p->numTotalBlocks = 0; + p->numBlocks = 0; + p->finishedDecoderIndex = -1; + + if (!p->mtc_WasConstructed) + { + p->mtc_WasConstructed = True; + MtDec_Construct(&p->mtc); + } + + p->mtc.mtCallback = &vt; + p->mtc.mtCallbackObject = p; + + p->mtc.progress = progress; + p->mtc.inStream = inStream; + p->mtc.alloc = &p->alignOffsetAlloc.vt; + // p->mtc.inData = inData; + // p->mtc.inDataSize = inDataSize; + p->mtc.inBufSize = p->props.inBufSize_MT; + // p->mtc.inBlockMax = p->props.inBlockMax; + p->mtc.numThreadsMax = p->props.numThreads; + + *isMT = True; + + vt.Parse = XzDecMt_Callback_Parse; + vt.PreCode = XzDecMt_Callback_PreCode; + vt.Code = XzDecMt_Callback_Code; + vt.Write = XzDecMt_Callback_Write; + + + res = MtDec_Code(&p->mtc); + + + stat->InSize = p->mtc.inProcessed; + + p->inProcessed = p->mtc.inProcessed; + p->readRes = p->mtc.readRes; + p->readWasFinished = p->mtc.readWasFinished; + p->readProcessed = p->mtc.readProcessed; + + tMode = True; + needContinue = False; + + if (res == SZ_OK) + { + if (p->mtc.mtProgress.res != SZ_OK) + { + res = p->mtc.mtProgress.res; + stat->ProgressRes = res; + stat->CombinedRes_Type = SZ_ERROR_PROGRESS; + } + else + needContinue = p->mtc.needContinue; + } + + if (!needContinue) + { + { + SRes codeRes; + BoolInt truncated = False; + ECoderStatus status; + const CXzUnpacker *dec; + + stat->OutSize = p->outProcessed; + + if (p->finishedDecoderIndex >= 0) + { + const CXzDecMtThread *coder = &p->coders[(unsigned)p->finishedDecoderIndex]; + codeRes = coder->codeRes; + dec = &coder->dec; + status = coder->status; + } + else if (p->mainDecoderWasCalled) + { + codeRes = p->codeRes; + dec = &p->dec; + status = p->status; + truncated = p->parsing_Truncated; + } + else + return SZ_ERROR_FAIL; + + if (p->mainErrorCode != SZ_OK) + stat->DecodeRes = p->mainErrorCode; + + XzStatInfo_SetStat(dec, p->finishMode, + // p->mtc.readProcessed, + p->mtc.inProcessed, + codeRes, status, + truncated, + stat); + } + + if (res == SZ_OK) + { + stat->ReadRes = p->mtc.readRes; + + if (p->writeRes != SZ_OK) + { + res = p->writeRes; + stat->CombinedRes_Type = SZ_ERROR_WRITE; + } + else if (p->mtc.readRes != SZ_OK + // && p->mtc.inProcessed == p->mtc.readProcessed + && stat->DecodeRes == SZ_ERROR_INPUT_EOF) + { + res = p->mtc.readRes; + stat->CombinedRes_Type = SZ_ERROR_READ; + } + else if (stat->DecodeRes != SZ_OK) + res = stat->DecodeRes; + } + + stat->CombinedRes = res; + if (stat->CombinedRes_Type == SZ_OK) + stat->CombinedRes_Type = res; + return res; + } + + PRF_STR("----- decoding ST -----"); + } + + #endif + + + *isMT = False; + + { + SRes res = XzDecMt_Decode_ST(p + #ifndef _7ZIP_ST + , tMode + #endif + , stat + ); + + #ifndef _7ZIP_ST + // we must set error code from MT decoding at first + if (p->mainErrorCode != SZ_OK) + stat->DecodeRes = p->mainErrorCode; + #endif + + XzStatInfo_SetStat(&p->dec, + p->finishMode, + // p->readProcessed, + p->inProcessed, + p->codeRes, p->status, + False, // truncated + stat); + + stat->ReadRes = p->readRes; + + if (res == SZ_OK) + { + if (p->readRes != SZ_OK + // && p->inProcessed == p->readProcessed + && stat->DecodeRes == SZ_ERROR_INPUT_EOF) + { + // we set read error as combined error, only if that error was the reason + // of decoding problem + res = p->readRes; + stat->CombinedRes_Type = SZ_ERROR_READ; + } + else if (stat->DecodeRes != SZ_OK) + res = stat->DecodeRes; + } + + stat->CombinedRes = res; + if (stat->CombinedRes_Type == SZ_OK) + stat->CombinedRes_Type = res; + return res; + } +} diff --git a/deps/LZMA-SDK/C/XzEnc.c b/deps/LZMA-SDK/C/XzEnc.c index 759ba670e..be174cccf 100644 --- a/deps/LZMA-SDK/C/XzEnc.c +++ b/deps/LZMA-SDK/C/XzEnc.c @@ -1,1330 +1,1330 @@ -/* XzEnc.c -- Xz Encode -2021-04-01 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include -#include - -#include "7zCrc.h" -#include "Bra.h" -#include "CpuArch.h" - -#ifdef USE_SUBBLOCK -#include "Bcj3Enc.c" -#include "SbFind.c" -#include "SbEnc.c" -#endif - -#include "XzEnc.h" - -// #define _7ZIP_ST - -#ifndef _7ZIP_ST -#include "MtCoder.h" -#else -#define MTCODER__THREADS_MAX 1 -#define MTCODER__BLOCKS_MAX 1 -#endif - -#define XZ_GET_PAD_SIZE(dataSize) ((4 - ((unsigned)(dataSize) & 3)) & 3) - -/* max pack size for LZMA2 block + check-64bytrs: */ -#define XZ_GET_MAX_BLOCK_PACK_SIZE(unpackSize) ((unpackSize) + ((unpackSize) >> 10) + 16 + 64) - -#define XZ_GET_ESTIMATED_BLOCK_TOTAL_PACK_SIZE(unpackSize) (XZ_BLOCK_HEADER_SIZE_MAX + XZ_GET_MAX_BLOCK_PACK_SIZE(unpackSize)) - - -#define XzBlock_ClearFlags(p) (p)->flags = 0; -#define XzBlock_SetNumFilters(p, n) (p)->flags = (Byte)((p)->flags | ((n) - 1)); -#define XzBlock_SetHasPackSize(p) (p)->flags |= XZ_BF_PACK_SIZE; -#define XzBlock_SetHasUnpackSize(p) (p)->flags |= XZ_BF_UNPACK_SIZE; - - -static SRes WriteBytes(ISeqOutStream *s, const void *buf, size_t size) -{ - return (ISeqOutStream_Write(s, buf, size) == size) ? SZ_OK : SZ_ERROR_WRITE; -} - -static SRes WriteBytesUpdateCrc(ISeqOutStream *s, const void *buf, size_t size, UInt32 *crc) -{ - *crc = CrcUpdate(*crc, buf, size); - return WriteBytes(s, buf, size); -} - - -static SRes Xz_WriteHeader(CXzStreamFlags f, ISeqOutStream *s) -{ - UInt32 crc; - Byte header[XZ_STREAM_HEADER_SIZE]; - memcpy(header, XZ_SIG, XZ_SIG_SIZE); - header[XZ_SIG_SIZE] = (Byte)(f >> 8); - header[XZ_SIG_SIZE + 1] = (Byte)(f & 0xFF); - crc = CrcCalc(header + XZ_SIG_SIZE, XZ_STREAM_FLAGS_SIZE); - SetUi32(header + XZ_SIG_SIZE + XZ_STREAM_FLAGS_SIZE, crc); - return WriteBytes(s, header, XZ_STREAM_HEADER_SIZE); -} - - -static SRes XzBlock_WriteHeader(const CXzBlock *p, ISeqOutStream *s) -{ - Byte header[XZ_BLOCK_HEADER_SIZE_MAX]; - - unsigned pos = 1; - unsigned numFilters, i; - header[pos++] = p->flags; - - if (XzBlock_HasPackSize(p)) pos += Xz_WriteVarInt(header + pos, p->packSize); - if (XzBlock_HasUnpackSize(p)) pos += Xz_WriteVarInt(header + pos, p->unpackSize); - numFilters = XzBlock_GetNumFilters(p); - - for (i = 0; i < numFilters; i++) - { - const CXzFilter *f = &p->filters[i]; - pos += Xz_WriteVarInt(header + pos, f->id); - pos += Xz_WriteVarInt(header + pos, f->propsSize); - memcpy(header + pos, f->props, f->propsSize); - pos += f->propsSize; - } - - while ((pos & 3) != 0) - header[pos++] = 0; - - header[0] = (Byte)(pos >> 2); - SetUi32(header + pos, CrcCalc(header, pos)); - return WriteBytes(s, header, pos + 4); -} - - - - -typedef struct -{ - size_t numBlocks; - size_t size; - size_t allocated; - Byte *blocks; -} CXzEncIndex; - - -static void XzEncIndex_Construct(CXzEncIndex *p) -{ - p->numBlocks = 0; - p->size = 0; - p->allocated = 0; - p->blocks = NULL; -} - -static void XzEncIndex_Init(CXzEncIndex *p) -{ - p->numBlocks = 0; - p->size = 0; -} - -static void XzEncIndex_Free(CXzEncIndex *p, ISzAllocPtr alloc) -{ - if (p->blocks) - { - ISzAlloc_Free(alloc, p->blocks); - p->blocks = NULL; - } - p->numBlocks = 0; - p->size = 0; - p->allocated = 0; -} - - -static SRes XzEncIndex_ReAlloc(CXzEncIndex *p, size_t newSize, ISzAllocPtr alloc) -{ - Byte *blocks = (Byte *)ISzAlloc_Alloc(alloc, newSize); - if (!blocks) - return SZ_ERROR_MEM; - if (p->size != 0) - memcpy(blocks, p->blocks, p->size); - if (p->blocks) - ISzAlloc_Free(alloc, p->blocks); - p->blocks = blocks; - p->allocated = newSize; - return SZ_OK; -} - - -static SRes XzEncIndex_PreAlloc(CXzEncIndex *p, UInt64 numBlocks, UInt64 unpackSize, UInt64 totalSize, ISzAllocPtr alloc) -{ - UInt64 pos; - { - Byte buf[32]; - unsigned pos2 = Xz_WriteVarInt(buf, totalSize); - pos2 += Xz_WriteVarInt(buf + pos2, unpackSize); - pos = numBlocks * pos2; - } - - if (pos <= p->allocated - p->size) - return SZ_OK; - { - UInt64 newSize64 = p->size + pos; - size_t newSize = (size_t)newSize64; - if (newSize != newSize64) - return SZ_ERROR_MEM; - return XzEncIndex_ReAlloc(p, newSize, alloc); - } -} - - -static SRes XzEncIndex_AddIndexRecord(CXzEncIndex *p, UInt64 unpackSize, UInt64 totalSize, ISzAllocPtr alloc) -{ - Byte buf[32]; - unsigned pos = Xz_WriteVarInt(buf, totalSize); - pos += Xz_WriteVarInt(buf + pos, unpackSize); - - if (pos > p->allocated - p->size) - { - size_t newSize = p->allocated * 2 + 16 * 2; - if (newSize < p->size + pos) - return SZ_ERROR_MEM; - RINOK(XzEncIndex_ReAlloc(p, newSize, alloc)); - } - memcpy(p->blocks + p->size, buf, pos); - p->size += pos; - p->numBlocks++; - return SZ_OK; -} - - -static SRes XzEncIndex_WriteFooter(const CXzEncIndex *p, CXzStreamFlags flags, ISeqOutStream *s) -{ - Byte buf[32]; - UInt64 globalPos; - UInt32 crc = CRC_INIT_VAL; - unsigned pos = 1 + Xz_WriteVarInt(buf + 1, p->numBlocks); - - globalPos = pos; - buf[0] = 0; - RINOK(WriteBytesUpdateCrc(s, buf, pos, &crc)); - RINOK(WriteBytesUpdateCrc(s, p->blocks, p->size, &crc)); - globalPos += p->size; - - pos = XZ_GET_PAD_SIZE(globalPos); - buf[1] = 0; - buf[2] = 0; - buf[3] = 0; - globalPos += pos; - - crc = CrcUpdate(crc, buf + 4 - pos, pos); - SetUi32(buf + 4, CRC_GET_DIGEST(crc)); - - SetUi32(buf + 8 + 4, (UInt32)(globalPos >> 2)); - buf[8 + 8] = (Byte)(flags >> 8); - buf[8 + 9] = (Byte)(flags & 0xFF); - SetUi32(buf + 8, CrcCalc(buf + 8 + 4, 6)); - buf[8 + 10] = XZ_FOOTER_SIG_0; - buf[8 + 11] = XZ_FOOTER_SIG_1; - - return WriteBytes(s, buf + 4 - pos, pos + 4 + 12); -} - - - -/* ---------- CSeqCheckInStream ---------- */ - -typedef struct -{ - ISeqInStream vt; - ISeqInStream *realStream; - const Byte *data; - UInt64 limit; - UInt64 processed; - int realStreamFinished; - CXzCheck check; -} CSeqCheckInStream; - -static void SeqCheckInStream_Init(CSeqCheckInStream *p, unsigned checkMode) -{ - p->limit = (UInt64)(Int64)-1; - p->processed = 0; - p->realStreamFinished = 0; - XzCheck_Init(&p->check, checkMode); -} - -static void SeqCheckInStream_GetDigest(CSeqCheckInStream *p, Byte *digest) -{ - XzCheck_Final(&p->check, digest); -} - -static SRes SeqCheckInStream_Read(const ISeqInStream *pp, void *data, size_t *size) -{ - CSeqCheckInStream *p = CONTAINER_FROM_VTBL(pp, CSeqCheckInStream, vt); - size_t size2 = *size; - SRes res = SZ_OK; - - if (p->limit != (UInt64)(Int64)-1) - { - UInt64 rem = p->limit - p->processed; - if (size2 > rem) - size2 = (size_t)rem; - } - if (size2 != 0) - { - if (p->realStream) - { - res = ISeqInStream_Read(p->realStream, data, &size2); - p->realStreamFinished = (size2 == 0) ? 1 : 0; - } - else - memcpy(data, p->data + (size_t)p->processed, size2); - XzCheck_Update(&p->check, data, size2); - p->processed += size2; - } - *size = size2; - return res; -} - - -/* ---------- CSeqSizeOutStream ---------- */ - -typedef struct -{ - ISeqOutStream vt; - ISeqOutStream *realStream; - Byte *outBuf; - size_t outBufLimit; - UInt64 processed; -} CSeqSizeOutStream; - -static size_t SeqSizeOutStream_Write(const ISeqOutStream *pp, const void *data, size_t size) -{ - CSeqSizeOutStream *p = CONTAINER_FROM_VTBL(pp, CSeqSizeOutStream, vt); - if (p->realStream) - size = ISeqOutStream_Write(p->realStream, data, size); - else - { - if (size > p->outBufLimit - (size_t)p->processed) - return 0; - memcpy(p->outBuf + (size_t)p->processed, data, size); - } - p->processed += size; - return size; -} - - -/* ---------- CSeqInFilter ---------- */ - -#define FILTER_BUF_SIZE (1 << 20) - -typedef struct -{ - ISeqInStream p; - ISeqInStream *realStream; - IStateCoder StateCoder; - Byte *buf; - size_t curPos; - size_t endPos; - int srcWasFinished; -} CSeqInFilter; - - -SRes BraState_SetFromMethod(IStateCoder *p, UInt64 id, int encodeMode, ISzAllocPtr alloc); - -static SRes SeqInFilter_Init(CSeqInFilter *p, const CXzFilter *props, ISzAllocPtr alloc) -{ - if (!p->buf) - { - p->buf = (Byte *)ISzAlloc_Alloc(alloc, FILTER_BUF_SIZE); - if (!p->buf) - return SZ_ERROR_MEM; - } - p->curPos = p->endPos = 0; - p->srcWasFinished = 0; - RINOK(BraState_SetFromMethod(&p->StateCoder, props->id, 1, alloc)); - RINOK(p->StateCoder.SetProps(p->StateCoder.p, props->props, props->propsSize, alloc)); - p->StateCoder.Init(p->StateCoder.p); - return SZ_OK; -} - - -static SRes SeqInFilter_Read(const ISeqInStream *pp, void *data, size_t *size) -{ - CSeqInFilter *p = CONTAINER_FROM_VTBL(pp, CSeqInFilter, p); - size_t sizeOriginal = *size; - if (sizeOriginal == 0) - return SZ_OK; - *size = 0; - - for (;;) - { - if (!p->srcWasFinished && p->curPos == p->endPos) - { - p->curPos = 0; - p->endPos = FILTER_BUF_SIZE; - RINOK(ISeqInStream_Read(p->realStream, p->buf, &p->endPos)); - if (p->endPos == 0) - p->srcWasFinished = 1; - } - { - SizeT srcLen = p->endPos - p->curPos; - ECoderStatus status; - SRes res; - *size = sizeOriginal; - res = p->StateCoder.Code2(p->StateCoder.p, - (Byte *)data, size, - p->buf + p->curPos, &srcLen, - p->srcWasFinished, CODER_FINISH_ANY, - &status); - p->curPos += srcLen; - if (*size != 0 || srcLen == 0 || res != SZ_OK) - return res; - } - } -} - -static void SeqInFilter_Construct(CSeqInFilter *p) -{ - p->buf = NULL; - p->StateCoder.p = NULL; - p->p.Read = SeqInFilter_Read; -} - -static void SeqInFilter_Free(CSeqInFilter *p, ISzAllocPtr alloc) -{ - if (p->StateCoder.p) - { - p->StateCoder.Free(p->StateCoder.p, alloc); - p->StateCoder.p = NULL; - } - if (p->buf) - { - ISzAlloc_Free(alloc, p->buf); - p->buf = NULL; - } -} - - -/* ---------- CSbEncInStream ---------- */ - -#ifdef USE_SUBBLOCK - -typedef struct -{ - ISeqInStream vt; - ISeqInStream *inStream; - CSbEnc enc; -} CSbEncInStream; - -static SRes SbEncInStream_Read(const ISeqInStream *pp, void *data, size_t *size) -{ - CSbEncInStream *p = CONTAINER_FROM_VTBL(pp, CSbEncInStream, vt); - size_t sizeOriginal = *size; - if (sizeOriginal == 0) - return SZ_OK; - - for (;;) - { - if (p->enc.needRead && !p->enc.readWasFinished) - { - size_t processed = p->enc.needReadSizeMax; - RINOK(p->inStream->Read(p->inStream, p->enc.buf + p->enc.readPos, &processed)); - p->enc.readPos += processed; - if (processed == 0) - { - p->enc.readWasFinished = True; - p->enc.isFinalFinished = True; - } - p->enc.needRead = False; - } - - *size = sizeOriginal; - RINOK(SbEnc_Read(&p->enc, data, size)); - if (*size != 0 || !p->enc.needRead) - return SZ_OK; - } -} - -void SbEncInStream_Construct(CSbEncInStream *p, ISzAllocPtr alloc) -{ - SbEnc_Construct(&p->enc, alloc); - p->vt.Read = SbEncInStream_Read; -} - -SRes SbEncInStream_Init(CSbEncInStream *p) -{ - return SbEnc_Init(&p->enc); -} - -void SbEncInStream_Free(CSbEncInStream *p) -{ - SbEnc_Free(&p->enc); -} - -#endif - - - -/* ---------- CXzProps ---------- */ - - -void XzFilterProps_Init(CXzFilterProps *p) -{ - p->id = 0; - p->delta = 0; - p->ip = 0; - p->ipDefined = False; -} - -void XzProps_Init(CXzProps *p) -{ - p->checkId = XZ_CHECK_CRC32; - p->blockSize = XZ_PROPS__BLOCK_SIZE__AUTO; - p->numBlockThreads_Reduced = -1; - p->numBlockThreads_Max = -1; - p->numTotalThreads = -1; - p->reduceSize = (UInt64)(Int64)-1; - p->forceWriteSizesInHeader = 0; - // p->forceWriteSizesInHeader = 1; - - XzFilterProps_Init(&p->filterProps); - Lzma2EncProps_Init(&p->lzma2Props); -} - - -static void XzEncProps_Normalize_Fixed(CXzProps *p) -{ - UInt64 fileSize; - int t1, t1n, t2, t2r, t3; - { - CLzma2EncProps tp = p->lzma2Props; - if (tp.numTotalThreads <= 0) - tp.numTotalThreads = p->numTotalThreads; - Lzma2EncProps_Normalize(&tp); - t1n = tp.numTotalThreads; - } - - t1 = p->lzma2Props.numTotalThreads; - t2 = p->numBlockThreads_Max; - t3 = p->numTotalThreads; - - if (t2 > MTCODER__THREADS_MAX) - t2 = MTCODER__THREADS_MAX; - - if (t3 <= 0) - { - if (t2 <= 0) - t2 = 1; - t3 = t1n * t2; - } - else if (t2 <= 0) - { - t2 = t3 / t1n; - if (t2 == 0) - { - t1 = 1; - t2 = t3; - } - if (t2 > MTCODER__THREADS_MAX) - t2 = MTCODER__THREADS_MAX; - } - else if (t1 <= 0) - { - t1 = t3 / t2; - if (t1 == 0) - t1 = 1; - } - else - t3 = t1n * t2; - - p->lzma2Props.numTotalThreads = t1; - - t2r = t2; - - fileSize = p->reduceSize; - - if ((p->blockSize < fileSize || fileSize == (UInt64)(Int64)-1)) - p->lzma2Props.lzmaProps.reduceSize = p->blockSize; - - Lzma2EncProps_Normalize(&p->lzma2Props); - - t1 = p->lzma2Props.numTotalThreads; - - { - if (t2 > 1 && fileSize != (UInt64)(Int64)-1) - { - UInt64 numBlocks = fileSize / p->blockSize; - if (numBlocks * p->blockSize != fileSize) - numBlocks++; - if (numBlocks < (unsigned)t2) - { - t2r = (int)numBlocks; - if (t2r == 0) - t2r = 1; - t3 = t1 * t2r; - } - } - } - - p->numBlockThreads_Max = t2; - p->numBlockThreads_Reduced = t2r; - p->numTotalThreads = t3; -} - - -static void XzProps_Normalize(CXzProps *p) -{ - /* we normalize xzProps properties, but we normalize only some of CXzProps::lzma2Props properties. - Lzma2Enc_SetProps() will normalize lzma2Props later. */ - - if (p->blockSize == XZ_PROPS__BLOCK_SIZE__SOLID) - { - p->lzma2Props.lzmaProps.reduceSize = p->reduceSize; - p->numBlockThreads_Reduced = 1; - p->numBlockThreads_Max = 1; - if (p->lzma2Props.numTotalThreads <= 0) - p->lzma2Props.numTotalThreads = p->numTotalThreads; - return; - } - else - { - CLzma2EncProps *lzma2 = &p->lzma2Props; - if (p->blockSize == LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO) - { - // xz-auto - p->lzma2Props.lzmaProps.reduceSize = p->reduceSize; - - if (lzma2->blockSize == LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID) - { - // if (xz-auto && lzma2-solid) - we use solid for both - p->blockSize = XZ_PROPS__BLOCK_SIZE__SOLID; - p->numBlockThreads_Reduced = 1; - p->numBlockThreads_Max = 1; - if (p->lzma2Props.numTotalThreads <= 0) - p->lzma2Props.numTotalThreads = p->numTotalThreads; - } - else - { - // if (xz-auto && (lzma2-auto || lzma2-fixed_) - // we calculate block size for lzma2 and use that block size for xz, lzma2 uses single-chunk per block - CLzma2EncProps tp = p->lzma2Props; - if (tp.numTotalThreads <= 0) - tp.numTotalThreads = p->numTotalThreads; - - Lzma2EncProps_Normalize(&tp); - - p->blockSize = tp.blockSize; // fixed or solid - p->numBlockThreads_Reduced = tp.numBlockThreads_Reduced; - p->numBlockThreads_Max = tp.numBlockThreads_Max; - if (lzma2->blockSize == LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO) - lzma2->blockSize = tp.blockSize; // fixed or solid, LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID - if (lzma2->lzmaProps.reduceSize > tp.blockSize && tp.blockSize != LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID) - lzma2->lzmaProps.reduceSize = tp.blockSize; - lzma2->numBlockThreads_Reduced = 1; - lzma2->numBlockThreads_Max = 1; - return; - } - } - else - { - // xz-fixed - // we can use xz::reduceSize or xz::blockSize as base for lzmaProps::reduceSize - - p->lzma2Props.lzmaProps.reduceSize = p->reduceSize; - { - UInt64 r = p->reduceSize; - if (r > p->blockSize || r == (UInt64)(Int64)-1) - r = p->blockSize; - lzma2->lzmaProps.reduceSize = r; - } - if (lzma2->blockSize == LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO) - lzma2->blockSize = LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID; - else if (lzma2->blockSize > p->blockSize && lzma2->blockSize != LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID) - lzma2->blockSize = p->blockSize; - - XzEncProps_Normalize_Fixed(p); - } - } -} - - -/* ---------- CLzma2WithFilters ---------- */ - -typedef struct -{ - CLzma2EncHandle lzma2; - CSeqInFilter filter; - - #ifdef USE_SUBBLOCK - CSbEncInStream sb; - #endif -} CLzma2WithFilters; - - -static void Lzma2WithFilters_Construct(CLzma2WithFilters *p) -{ - p->lzma2 = NULL; - SeqInFilter_Construct(&p->filter); - - #ifdef USE_SUBBLOCK - SbEncInStream_Construct(&p->sb, alloc); - #endif -} - - -static SRes Lzma2WithFilters_Create(CLzma2WithFilters *p, ISzAllocPtr alloc, ISzAllocPtr bigAlloc) -{ - if (!p->lzma2) - { - p->lzma2 = Lzma2Enc_Create(alloc, bigAlloc); - if (!p->lzma2) - return SZ_ERROR_MEM; - } - return SZ_OK; -} - - -static void Lzma2WithFilters_Free(CLzma2WithFilters *p, ISzAllocPtr alloc) -{ - #ifdef USE_SUBBLOCK - SbEncInStream_Free(&p->sb); - #endif - - SeqInFilter_Free(&p->filter, alloc); - if (p->lzma2) - { - Lzma2Enc_Destroy(p->lzma2); - p->lzma2 = NULL; - } -} - - -typedef struct -{ - UInt64 unpackSize; - UInt64 totalSize; - size_t headerSize; -} CXzEncBlockInfo; - - -static SRes Xz_CompressBlock( - CLzma2WithFilters *lzmaf, - - ISeqOutStream *outStream, - Byte *outBufHeader, - Byte *outBufData, size_t outBufDataLimit, - - ISeqInStream *inStream, - // UInt64 expectedSize, - const Byte *inBuf, // used if (!inStream) - size_t inBufSize, // used if (!inStream), it's block size, props->blockSize is ignored - - const CXzProps *props, - ICompressProgress *progress, - int *inStreamFinished, /* only for inStream version */ - CXzEncBlockInfo *blockSizes, - ISzAllocPtr alloc, - ISzAllocPtr allocBig) -{ - CSeqCheckInStream checkInStream; - CSeqSizeOutStream seqSizeOutStream; - CXzBlock block; - unsigned filterIndex = 0; - CXzFilter *filter = NULL; - const CXzFilterProps *fp = &props->filterProps; - if (fp->id == 0) - fp = NULL; - - *inStreamFinished = False; - - RINOK(Lzma2WithFilters_Create(lzmaf, alloc, allocBig)); - - RINOK(Lzma2Enc_SetProps(lzmaf->lzma2, &props->lzma2Props)); - - XzBlock_ClearFlags(&block); - XzBlock_SetNumFilters(&block, 1 + (fp ? 1 : 0)); - - if (fp) - { - filter = &block.filters[filterIndex++]; - filter->id = fp->id; - filter->propsSize = 0; - - if (fp->id == XZ_ID_Delta) - { - filter->props[0] = (Byte)(fp->delta - 1); - filter->propsSize = 1; - } - else if (fp->ipDefined) - { - Byte *ptr = filter->props; - SetUi32(ptr, fp->ip); - filter->propsSize = 4; - } - } - - { - CXzFilter *f = &block.filters[filterIndex++]; - f->id = XZ_ID_LZMA2; - f->propsSize = 1; - f->props[0] = Lzma2Enc_WriteProperties(lzmaf->lzma2); - } - - seqSizeOutStream.vt.Write = SeqSizeOutStream_Write; - seqSizeOutStream.realStream = outStream; - seqSizeOutStream.outBuf = outBufData; - seqSizeOutStream.outBufLimit = outBufDataLimit; - seqSizeOutStream.processed = 0; - - /* - if (expectedSize != (UInt64)(Int64)-1) - { - block.unpackSize = expectedSize; - if (props->blockSize != (UInt64)(Int64)-1) - if (expectedSize > props->blockSize) - block.unpackSize = props->blockSize; - XzBlock_SetHasUnpackSize(&block); - } - */ - - if (outStream) - { - RINOK(XzBlock_WriteHeader(&block, &seqSizeOutStream.vt)); - } - - checkInStream.vt.Read = SeqCheckInStream_Read; - SeqCheckInStream_Init(&checkInStream, props->checkId); - - checkInStream.realStream = inStream; - checkInStream.data = inBuf; - checkInStream.limit = props->blockSize; - if (!inStream) - checkInStream.limit = inBufSize; - - if (fp) - { - #ifdef USE_SUBBLOCK - if (fp->id == XZ_ID_Subblock) - { - lzmaf->sb.inStream = &checkInStream.vt; - RINOK(SbEncInStream_Init(&lzmaf->sb)); - } - else - #endif - { - lzmaf->filter.realStream = &checkInStream.vt; - RINOK(SeqInFilter_Init(&lzmaf->filter, filter, alloc)); - } - } - - { - SRes res; - Byte *outBuf = NULL; - size_t outSize = 0; - BoolInt useStream = (fp || inStream); - // useStream = True; - - if (!useStream) - { - XzCheck_Update(&checkInStream.check, inBuf, inBufSize); - checkInStream.processed = inBufSize; - } - - if (!outStream) - { - outBuf = seqSizeOutStream.outBuf; // + (size_t)seqSizeOutStream.processed; - outSize = seqSizeOutStream.outBufLimit; // - (size_t)seqSizeOutStream.processed; - } - - res = Lzma2Enc_Encode2(lzmaf->lzma2, - outBuf ? NULL : &seqSizeOutStream.vt, - outBuf, - outBuf ? &outSize : NULL, - - useStream ? - (fp ? - ( - #ifdef USE_SUBBLOCK - (fp->id == XZ_ID_Subblock) ? &lzmaf->sb.vt: - #endif - &lzmaf->filter.p) : - &checkInStream.vt) : NULL, - - useStream ? NULL : inBuf, - useStream ? 0 : inBufSize, - - progress); - - if (outBuf) - seqSizeOutStream.processed += outSize; - - RINOK(res); - blockSizes->unpackSize = checkInStream.processed; - } - { - Byte buf[4 + 64]; - unsigned padSize = XZ_GET_PAD_SIZE(seqSizeOutStream.processed); - UInt64 packSize = seqSizeOutStream.processed; - - buf[0] = 0; - buf[1] = 0; - buf[2] = 0; - buf[3] = 0; - - SeqCheckInStream_GetDigest(&checkInStream, buf + 4); - RINOK(WriteBytes(&seqSizeOutStream.vt, buf + (4 - padSize), padSize + XzFlags_GetCheckSize((CXzStreamFlags)props->checkId))); - - blockSizes->totalSize = seqSizeOutStream.processed - padSize; - - if (!outStream) - { - seqSizeOutStream.outBuf = outBufHeader; - seqSizeOutStream.outBufLimit = XZ_BLOCK_HEADER_SIZE_MAX; - seqSizeOutStream.processed = 0; - - block.unpackSize = blockSizes->unpackSize; - XzBlock_SetHasUnpackSize(&block); - - block.packSize = packSize; - XzBlock_SetHasPackSize(&block); - - RINOK(XzBlock_WriteHeader(&block, &seqSizeOutStream.vt)); - - blockSizes->headerSize = (size_t)seqSizeOutStream.processed; - blockSizes->totalSize += seqSizeOutStream.processed; - } - } - - if (inStream) - *inStreamFinished = checkInStream.realStreamFinished; - else - { - *inStreamFinished = False; - if (checkInStream.processed != inBufSize) - return SZ_ERROR_FAIL; - } - - return SZ_OK; -} - - - -typedef struct -{ - ICompressProgress vt; - ICompressProgress *progress; - UInt64 inOffset; - UInt64 outOffset; -} CCompressProgress_XzEncOffset; - - -static SRes CompressProgress_XzEncOffset_Progress(const ICompressProgress *pp, UInt64 inSize, UInt64 outSize) -{ - const CCompressProgress_XzEncOffset *p = CONTAINER_FROM_VTBL(pp, CCompressProgress_XzEncOffset, vt); - inSize += p->inOffset; - outSize += p->outOffset; - return ICompressProgress_Progress(p->progress, inSize, outSize); -} - - - - -typedef struct -{ - ISzAllocPtr alloc; - ISzAllocPtr allocBig; - - CXzProps xzProps; - UInt64 expectedDataSize; - - CXzEncIndex xzIndex; - - CLzma2WithFilters lzmaf_Items[MTCODER__THREADS_MAX]; - - size_t outBufSize; /* size of allocated outBufs[i] */ - Byte *outBufs[MTCODER__BLOCKS_MAX]; - - #ifndef _7ZIP_ST - unsigned checkType; - ISeqOutStream *outStream; - BoolInt mtCoder_WasConstructed; - CMtCoder mtCoder; - CXzEncBlockInfo EncBlocks[MTCODER__BLOCKS_MAX]; - #endif - -} CXzEnc; - - -static void XzEnc_Construct(CXzEnc *p) -{ - unsigned i; - - XzEncIndex_Construct(&p->xzIndex); - - for (i = 0; i < MTCODER__THREADS_MAX; i++) - Lzma2WithFilters_Construct(&p->lzmaf_Items[i]); - - #ifndef _7ZIP_ST - p->mtCoder_WasConstructed = False; - { - for (i = 0; i < MTCODER__BLOCKS_MAX; i++) - p->outBufs[i] = NULL; - p->outBufSize = 0; - } - #endif -} - - -static void XzEnc_FreeOutBufs(CXzEnc *p) -{ - unsigned i; - for (i = 0; i < MTCODER__BLOCKS_MAX; i++) - if (p->outBufs[i]) - { - ISzAlloc_Free(p->alloc, p->outBufs[i]); - p->outBufs[i] = NULL; - } - p->outBufSize = 0; -} - - -static void XzEnc_Free(CXzEnc *p, ISzAllocPtr alloc) -{ - unsigned i; - - XzEncIndex_Free(&p->xzIndex, alloc); - - for (i = 0; i < MTCODER__THREADS_MAX; i++) - Lzma2WithFilters_Free(&p->lzmaf_Items[i], alloc); - - #ifndef _7ZIP_ST - if (p->mtCoder_WasConstructed) - { - MtCoder_Destruct(&p->mtCoder); - p->mtCoder_WasConstructed = False; - } - XzEnc_FreeOutBufs(p); - #endif -} - - -CXzEncHandle XzEnc_Create(ISzAllocPtr alloc, ISzAllocPtr allocBig) -{ - CXzEnc *p = (CXzEnc *)ISzAlloc_Alloc(alloc, sizeof(CXzEnc)); - if (!p) - return NULL; - XzEnc_Construct(p); - XzProps_Init(&p->xzProps); - XzProps_Normalize(&p->xzProps); - p->expectedDataSize = (UInt64)(Int64)-1; - p->alloc = alloc; - p->allocBig = allocBig; - return p; -} - - -void XzEnc_Destroy(CXzEncHandle pp) -{ - CXzEnc *p = (CXzEnc *)pp; - XzEnc_Free(p, p->alloc); - ISzAlloc_Free(p->alloc, p); -} - - -SRes XzEnc_SetProps(CXzEncHandle pp, const CXzProps *props) -{ - CXzEnc *p = (CXzEnc *)pp; - p->xzProps = *props; - XzProps_Normalize(&p->xzProps); - return SZ_OK; -} - - -void XzEnc_SetDataSize(CXzEncHandle pp, UInt64 expectedDataSiize) -{ - CXzEnc *p = (CXzEnc *)pp; - p->expectedDataSize = expectedDataSiize; -} - - - - -#ifndef _7ZIP_ST - -static SRes XzEnc_MtCallback_Code(void *pp, unsigned coderIndex, unsigned outBufIndex, - const Byte *src, size_t srcSize, int finished) -{ - CXzEnc *me = (CXzEnc *)pp; - SRes res; - CMtProgressThunk progressThunk; - - Byte *dest = me->outBufs[outBufIndex]; - - UNUSED_VAR(finished) - - { - CXzEncBlockInfo *bInfo = &me->EncBlocks[outBufIndex]; - bInfo->totalSize = 0; - bInfo->unpackSize = 0; - bInfo->headerSize = 0; - } - - if (!dest) - { - dest = (Byte *)ISzAlloc_Alloc(me->alloc, me->outBufSize); - if (!dest) - return SZ_ERROR_MEM; - me->outBufs[outBufIndex] = dest; - } - - MtProgressThunk_CreateVTable(&progressThunk); - progressThunk.mtProgress = &me->mtCoder.mtProgress; - MtProgressThunk_Init(&progressThunk); - - { - CXzEncBlockInfo blockSizes; - int inStreamFinished; - - res = Xz_CompressBlock( - &me->lzmaf_Items[coderIndex], - - NULL, - dest, - dest + XZ_BLOCK_HEADER_SIZE_MAX, me->outBufSize - XZ_BLOCK_HEADER_SIZE_MAX, - - NULL, - // srcSize, // expectedSize - src, srcSize, - - &me->xzProps, - &progressThunk.vt, - &inStreamFinished, - &blockSizes, - me->alloc, - me->allocBig); - - if (res == SZ_OK) - me->EncBlocks[outBufIndex] = blockSizes; - - return res; - } -} - - -static SRes XzEnc_MtCallback_Write(void *pp, unsigned outBufIndex) -{ - CXzEnc *me = (CXzEnc *)pp; - - const CXzEncBlockInfo *bInfo = &me->EncBlocks[outBufIndex]; - const Byte *data = me->outBufs[outBufIndex]; - - RINOK(WriteBytes(me->outStream, data, bInfo->headerSize)); - - { - UInt64 totalPackFull = bInfo->totalSize + XZ_GET_PAD_SIZE(bInfo->totalSize); - RINOK(WriteBytes(me->outStream, data + XZ_BLOCK_HEADER_SIZE_MAX, (size_t)totalPackFull - bInfo->headerSize)); - } - - return XzEncIndex_AddIndexRecord(&me->xzIndex, bInfo->unpackSize, bInfo->totalSize, me->alloc); -} - -#endif - - - -SRes XzEnc_Encode(CXzEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress) -{ - CXzEnc *p = (CXzEnc *)pp; - - const CXzProps *props = &p->xzProps; - - XzEncIndex_Init(&p->xzIndex); - { - UInt64 numBlocks = 1; - UInt64 blockSize = props->blockSize; - - if (blockSize != XZ_PROPS__BLOCK_SIZE__SOLID - && props->reduceSize != (UInt64)(Int64)-1) - { - numBlocks = props->reduceSize / blockSize; - if (numBlocks * blockSize != props->reduceSize) - numBlocks++; - } - else - blockSize = (UInt64)1 << 62; - - RINOK(XzEncIndex_PreAlloc(&p->xzIndex, numBlocks, blockSize, XZ_GET_ESTIMATED_BLOCK_TOTAL_PACK_SIZE(blockSize), p->alloc)); - } - - RINOK(Xz_WriteHeader((CXzStreamFlags)props->checkId, outStream)); - - - #ifndef _7ZIP_ST - if (props->numBlockThreads_Reduced > 1) - { - IMtCoderCallback2 vt; - - if (!p->mtCoder_WasConstructed) - { - p->mtCoder_WasConstructed = True; - MtCoder_Construct(&p->mtCoder); - } - - vt.Code = XzEnc_MtCallback_Code; - vt.Write = XzEnc_MtCallback_Write; - - p->checkType = props->checkId; - p->xzProps = *props; - - p->outStream = outStream; - - p->mtCoder.allocBig = p->allocBig; - p->mtCoder.progress = progress; - p->mtCoder.inStream = inStream; - p->mtCoder.inData = NULL; - p->mtCoder.inDataSize = 0; - p->mtCoder.mtCallback = &vt; - p->mtCoder.mtCallbackObject = p; - - if ( props->blockSize == XZ_PROPS__BLOCK_SIZE__SOLID - || props->blockSize == XZ_PROPS__BLOCK_SIZE__AUTO) - return SZ_ERROR_FAIL; - - p->mtCoder.blockSize = (size_t)props->blockSize; - if (p->mtCoder.blockSize != props->blockSize) - return SZ_ERROR_PARAM; /* SZ_ERROR_MEM */ - - { - size_t destBlockSize = XZ_BLOCK_HEADER_SIZE_MAX + XZ_GET_MAX_BLOCK_PACK_SIZE(p->mtCoder.blockSize); - if (destBlockSize < p->mtCoder.blockSize) - return SZ_ERROR_PARAM; - if (p->outBufSize != destBlockSize) - XzEnc_FreeOutBufs(p); - p->outBufSize = destBlockSize; - } - - p->mtCoder.numThreadsMax = (unsigned)props->numBlockThreads_Max; - p->mtCoder.expectedDataSize = p->expectedDataSize; - - RINOK(MtCoder_Code(&p->mtCoder)); - } - else - #endif - { - int writeStartSizes; - CCompressProgress_XzEncOffset progress2; - Byte *bufData = NULL; - size_t bufSize = 0; - - progress2.vt.Progress = CompressProgress_XzEncOffset_Progress; - progress2.inOffset = 0; - progress2.outOffset = 0; - progress2.progress = progress; - - writeStartSizes = 0; - - if (props->blockSize != XZ_PROPS__BLOCK_SIZE__SOLID) - { - writeStartSizes = (props->forceWriteSizesInHeader > 0); - - if (writeStartSizes) - { - size_t t2; - size_t t = (size_t)props->blockSize; - if (t != props->blockSize) - return SZ_ERROR_PARAM; - t = XZ_GET_MAX_BLOCK_PACK_SIZE(t); - if (t < props->blockSize) - return SZ_ERROR_PARAM; - t2 = XZ_BLOCK_HEADER_SIZE_MAX + t; - if (!p->outBufs[0] || t2 != p->outBufSize) - { - XzEnc_FreeOutBufs(p); - p->outBufs[0] = (Byte *)ISzAlloc_Alloc(p->alloc, t2); - if (!p->outBufs[0]) - return SZ_ERROR_MEM; - p->outBufSize = t2; - } - bufData = p->outBufs[0] + XZ_BLOCK_HEADER_SIZE_MAX; - bufSize = t; - } - } - - for (;;) - { - CXzEncBlockInfo blockSizes; - int inStreamFinished; - - /* - UInt64 rem = (UInt64)(Int64)-1; - if (props->reduceSize != (UInt64)(Int64)-1 - && props->reduceSize >= progress2.inOffset) - rem = props->reduceSize - progress2.inOffset; - */ - - blockSizes.headerSize = 0; // for GCC - - RINOK(Xz_CompressBlock( - &p->lzmaf_Items[0], - - writeStartSizes ? NULL : outStream, - writeStartSizes ? p->outBufs[0] : NULL, - bufData, bufSize, - - inStream, - // rem, - NULL, 0, - - props, - progress ? &progress2.vt : NULL, - &inStreamFinished, - &blockSizes, - p->alloc, - p->allocBig)); - - { - UInt64 totalPackFull = blockSizes.totalSize + XZ_GET_PAD_SIZE(blockSizes.totalSize); - - if (writeStartSizes) - { - RINOK(WriteBytes(outStream, p->outBufs[0], blockSizes.headerSize)); - RINOK(WriteBytes(outStream, bufData, (size_t)totalPackFull - blockSizes.headerSize)); - } - - RINOK(XzEncIndex_AddIndexRecord(&p->xzIndex, blockSizes.unpackSize, blockSizes.totalSize, p->alloc)); - - progress2.inOffset += blockSizes.unpackSize; - progress2.outOffset += totalPackFull; - } - - if (inStreamFinished) - break; - } - } - - return XzEncIndex_WriteFooter(&p->xzIndex, (CXzStreamFlags)props->checkId, outStream); -} - - -#include "Alloc.h" - -SRes Xz_Encode(ISeqOutStream *outStream, ISeqInStream *inStream, - const CXzProps *props, ICompressProgress *progress) -{ - SRes res; - CXzEncHandle xz = XzEnc_Create(&g_Alloc, &g_BigAlloc); - if (!xz) - return SZ_ERROR_MEM; - res = XzEnc_SetProps(xz, props); - if (res == SZ_OK) - res = XzEnc_Encode(xz, outStream, inStream, progress); - XzEnc_Destroy(xz); - return res; -} - - -SRes Xz_EncodeEmpty(ISeqOutStream *outStream) -{ - SRes res; - CXzEncIndex xzIndex; - XzEncIndex_Construct(&xzIndex); - res = Xz_WriteHeader((CXzStreamFlags)0, outStream); - if (res == SZ_OK) - res = XzEncIndex_WriteFooter(&xzIndex, (CXzStreamFlags)0, outStream); - XzEncIndex_Free(&xzIndex, NULL); // g_Alloc - return res; -} +/* XzEnc.c -- Xz Encode +2021-04-01 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include +#include + +#include "7zCrc.h" +#include "Bra.h" +#include "CpuArch.h" + +#ifdef USE_SUBBLOCK +#include "Bcj3Enc.c" +#include "SbFind.c" +#include "SbEnc.c" +#endif + +#include "XzEnc.h" + +// #define _7ZIP_ST + +#ifndef _7ZIP_ST +#include "MtCoder.h" +#else +#define MTCODER__THREADS_MAX 1 +#define MTCODER__BLOCKS_MAX 1 +#endif + +#define XZ_GET_PAD_SIZE(dataSize) ((4 - ((unsigned)(dataSize) & 3)) & 3) + +/* max pack size for LZMA2 block + check-64bytrs: */ +#define XZ_GET_MAX_BLOCK_PACK_SIZE(unpackSize) ((unpackSize) + ((unpackSize) >> 10) + 16 + 64) + +#define XZ_GET_ESTIMATED_BLOCK_TOTAL_PACK_SIZE(unpackSize) (XZ_BLOCK_HEADER_SIZE_MAX + XZ_GET_MAX_BLOCK_PACK_SIZE(unpackSize)) + + +#define XzBlock_ClearFlags(p) (p)->flags = 0; +#define XzBlock_SetNumFilters(p, n) (p)->flags = (Byte)((p)->flags | ((n) - 1)); +#define XzBlock_SetHasPackSize(p) (p)->flags |= XZ_BF_PACK_SIZE; +#define XzBlock_SetHasUnpackSize(p) (p)->flags |= XZ_BF_UNPACK_SIZE; + + +static SRes WriteBytes(ISeqOutStream *s, const void *buf, size_t size) +{ + return (ISeqOutStream_Write(s, buf, size) == size) ? SZ_OK : SZ_ERROR_WRITE; +} + +static SRes WriteBytesUpdateCrc(ISeqOutStream *s, const void *buf, size_t size, UInt32 *crc) +{ + *crc = CrcUpdate(*crc, buf, size); + return WriteBytes(s, buf, size); +} + + +static SRes Xz_WriteHeader(CXzStreamFlags f, ISeqOutStream *s) +{ + UInt32 crc; + Byte header[XZ_STREAM_HEADER_SIZE]; + memcpy(header, XZ_SIG, XZ_SIG_SIZE); + header[XZ_SIG_SIZE] = (Byte)(f >> 8); + header[XZ_SIG_SIZE + 1] = (Byte)(f & 0xFF); + crc = CrcCalc(header + XZ_SIG_SIZE, XZ_STREAM_FLAGS_SIZE); + SetUi32(header + XZ_SIG_SIZE + XZ_STREAM_FLAGS_SIZE, crc); + return WriteBytes(s, header, XZ_STREAM_HEADER_SIZE); +} + + +static SRes XzBlock_WriteHeader(const CXzBlock *p, ISeqOutStream *s) +{ + Byte header[XZ_BLOCK_HEADER_SIZE_MAX]; + + unsigned pos = 1; + unsigned numFilters, i; + header[pos++] = p->flags; + + if (XzBlock_HasPackSize(p)) pos += Xz_WriteVarInt(header + pos, p->packSize); + if (XzBlock_HasUnpackSize(p)) pos += Xz_WriteVarInt(header + pos, p->unpackSize); + numFilters = XzBlock_GetNumFilters(p); + + for (i = 0; i < numFilters; i++) + { + const CXzFilter *f = &p->filters[i]; + pos += Xz_WriteVarInt(header + pos, f->id); + pos += Xz_WriteVarInt(header + pos, f->propsSize); + memcpy(header + pos, f->props, f->propsSize); + pos += f->propsSize; + } + + while ((pos & 3) != 0) + header[pos++] = 0; + + header[0] = (Byte)(pos >> 2); + SetUi32(header + pos, CrcCalc(header, pos)); + return WriteBytes(s, header, pos + 4); +} + + + + +typedef struct +{ + size_t numBlocks; + size_t size; + size_t allocated; + Byte *blocks; +} CXzEncIndex; + + +static void XzEncIndex_Construct(CXzEncIndex *p) +{ + p->numBlocks = 0; + p->size = 0; + p->allocated = 0; + p->blocks = NULL; +} + +static void XzEncIndex_Init(CXzEncIndex *p) +{ + p->numBlocks = 0; + p->size = 0; +} + +static void XzEncIndex_Free(CXzEncIndex *p, ISzAllocPtr alloc) +{ + if (p->blocks) + { + ISzAlloc_Free(alloc, p->blocks); + p->blocks = NULL; + } + p->numBlocks = 0; + p->size = 0; + p->allocated = 0; +} + + +static SRes XzEncIndex_ReAlloc(CXzEncIndex *p, size_t newSize, ISzAllocPtr alloc) +{ + Byte *blocks = (Byte *)ISzAlloc_Alloc(alloc, newSize); + if (!blocks) + return SZ_ERROR_MEM; + if (p->size != 0) + memcpy(blocks, p->blocks, p->size); + if (p->blocks) + ISzAlloc_Free(alloc, p->blocks); + p->blocks = blocks; + p->allocated = newSize; + return SZ_OK; +} + + +static SRes XzEncIndex_PreAlloc(CXzEncIndex *p, UInt64 numBlocks, UInt64 unpackSize, UInt64 totalSize, ISzAllocPtr alloc) +{ + UInt64 pos; + { + Byte buf[32]; + unsigned pos2 = Xz_WriteVarInt(buf, totalSize); + pos2 += Xz_WriteVarInt(buf + pos2, unpackSize); + pos = numBlocks * pos2; + } + + if (pos <= p->allocated - p->size) + return SZ_OK; + { + UInt64 newSize64 = p->size + pos; + size_t newSize = (size_t)newSize64; + if (newSize != newSize64) + return SZ_ERROR_MEM; + return XzEncIndex_ReAlloc(p, newSize, alloc); + } +} + + +static SRes XzEncIndex_AddIndexRecord(CXzEncIndex *p, UInt64 unpackSize, UInt64 totalSize, ISzAllocPtr alloc) +{ + Byte buf[32]; + unsigned pos = Xz_WriteVarInt(buf, totalSize); + pos += Xz_WriteVarInt(buf + pos, unpackSize); + + if (pos > p->allocated - p->size) + { + size_t newSize = p->allocated * 2 + 16 * 2; + if (newSize < p->size + pos) + return SZ_ERROR_MEM; + RINOK(XzEncIndex_ReAlloc(p, newSize, alloc)); + } + memcpy(p->blocks + p->size, buf, pos); + p->size += pos; + p->numBlocks++; + return SZ_OK; +} + + +static SRes XzEncIndex_WriteFooter(const CXzEncIndex *p, CXzStreamFlags flags, ISeqOutStream *s) +{ + Byte buf[32]; + UInt64 globalPos; + UInt32 crc = CRC_INIT_VAL; + unsigned pos = 1 + Xz_WriteVarInt(buf + 1, p->numBlocks); + + globalPos = pos; + buf[0] = 0; + RINOK(WriteBytesUpdateCrc(s, buf, pos, &crc)); + RINOK(WriteBytesUpdateCrc(s, p->blocks, p->size, &crc)); + globalPos += p->size; + + pos = XZ_GET_PAD_SIZE(globalPos); + buf[1] = 0; + buf[2] = 0; + buf[3] = 0; + globalPos += pos; + + crc = CrcUpdate(crc, buf + 4 - pos, pos); + SetUi32(buf + 4, CRC_GET_DIGEST(crc)); + + SetUi32(buf + 8 + 4, (UInt32)(globalPos >> 2)); + buf[8 + 8] = (Byte)(flags >> 8); + buf[8 + 9] = (Byte)(flags & 0xFF); + SetUi32(buf + 8, CrcCalc(buf + 8 + 4, 6)); + buf[8 + 10] = XZ_FOOTER_SIG_0; + buf[8 + 11] = XZ_FOOTER_SIG_1; + + return WriteBytes(s, buf + 4 - pos, pos + 4 + 12); +} + + + +/* ---------- CSeqCheckInStream ---------- */ + +typedef struct +{ + ISeqInStream vt; + ISeqInStream *realStream; + const Byte *data; + UInt64 limit; + UInt64 processed; + int realStreamFinished; + CXzCheck check; +} CSeqCheckInStream; + +static void SeqCheckInStream_Init(CSeqCheckInStream *p, unsigned checkMode) +{ + p->limit = (UInt64)(Int64)-1; + p->processed = 0; + p->realStreamFinished = 0; + XzCheck_Init(&p->check, checkMode); +} + +static void SeqCheckInStream_GetDigest(CSeqCheckInStream *p, Byte *digest) +{ + XzCheck_Final(&p->check, digest); +} + +static SRes SeqCheckInStream_Read(const ISeqInStream *pp, void *data, size_t *size) +{ + CSeqCheckInStream *p = CONTAINER_FROM_VTBL(pp, CSeqCheckInStream, vt); + size_t size2 = *size; + SRes res = SZ_OK; + + if (p->limit != (UInt64)(Int64)-1) + { + UInt64 rem = p->limit - p->processed; + if (size2 > rem) + size2 = (size_t)rem; + } + if (size2 != 0) + { + if (p->realStream) + { + res = ISeqInStream_Read(p->realStream, data, &size2); + p->realStreamFinished = (size2 == 0) ? 1 : 0; + } + else + memcpy(data, p->data + (size_t)p->processed, size2); + XzCheck_Update(&p->check, data, size2); + p->processed += size2; + } + *size = size2; + return res; +} + + +/* ---------- CSeqSizeOutStream ---------- */ + +typedef struct +{ + ISeqOutStream vt; + ISeqOutStream *realStream; + Byte *outBuf; + size_t outBufLimit; + UInt64 processed; +} CSeqSizeOutStream; + +static size_t SeqSizeOutStream_Write(const ISeqOutStream *pp, const void *data, size_t size) +{ + CSeqSizeOutStream *p = CONTAINER_FROM_VTBL(pp, CSeqSizeOutStream, vt); + if (p->realStream) + size = ISeqOutStream_Write(p->realStream, data, size); + else + { + if (size > p->outBufLimit - (size_t)p->processed) + return 0; + memcpy(p->outBuf + (size_t)p->processed, data, size); + } + p->processed += size; + return size; +} + + +/* ---------- CSeqInFilter ---------- */ + +#define FILTER_BUF_SIZE (1 << 20) + +typedef struct +{ + ISeqInStream p; + ISeqInStream *realStream; + IStateCoder StateCoder; + Byte *buf; + size_t curPos; + size_t endPos; + int srcWasFinished; +} CSeqInFilter; + + +SRes BraState_SetFromMethod(IStateCoder *p, UInt64 id, int encodeMode, ISzAllocPtr alloc); + +static SRes SeqInFilter_Init(CSeqInFilter *p, const CXzFilter *props, ISzAllocPtr alloc) +{ + if (!p->buf) + { + p->buf = (Byte *)ISzAlloc_Alloc(alloc, FILTER_BUF_SIZE); + if (!p->buf) + return SZ_ERROR_MEM; + } + p->curPos = p->endPos = 0; + p->srcWasFinished = 0; + RINOK(BraState_SetFromMethod(&p->StateCoder, props->id, 1, alloc)); + RINOK(p->StateCoder.SetProps(p->StateCoder.p, props->props, props->propsSize, alloc)); + p->StateCoder.Init(p->StateCoder.p); + return SZ_OK; +} + + +static SRes SeqInFilter_Read(const ISeqInStream *pp, void *data, size_t *size) +{ + CSeqInFilter *p = CONTAINER_FROM_VTBL(pp, CSeqInFilter, p); + size_t sizeOriginal = *size; + if (sizeOriginal == 0) + return SZ_OK; + *size = 0; + + for (;;) + { + if (!p->srcWasFinished && p->curPos == p->endPos) + { + p->curPos = 0; + p->endPos = FILTER_BUF_SIZE; + RINOK(ISeqInStream_Read(p->realStream, p->buf, &p->endPos)); + if (p->endPos == 0) + p->srcWasFinished = 1; + } + { + SizeT srcLen = p->endPos - p->curPos; + ECoderStatus status; + SRes res; + *size = sizeOriginal; + res = p->StateCoder.Code2(p->StateCoder.p, + (Byte *)data, size, + p->buf + p->curPos, &srcLen, + p->srcWasFinished, CODER_FINISH_ANY, + &status); + p->curPos += srcLen; + if (*size != 0 || srcLen == 0 || res != SZ_OK) + return res; + } + } +} + +static void SeqInFilter_Construct(CSeqInFilter *p) +{ + p->buf = NULL; + p->StateCoder.p = NULL; + p->p.Read = SeqInFilter_Read; +} + +static void SeqInFilter_Free(CSeqInFilter *p, ISzAllocPtr alloc) +{ + if (p->StateCoder.p) + { + p->StateCoder.Free(p->StateCoder.p, alloc); + p->StateCoder.p = NULL; + } + if (p->buf) + { + ISzAlloc_Free(alloc, p->buf); + p->buf = NULL; + } +} + + +/* ---------- CSbEncInStream ---------- */ + +#ifdef USE_SUBBLOCK + +typedef struct +{ + ISeqInStream vt; + ISeqInStream *inStream; + CSbEnc enc; +} CSbEncInStream; + +static SRes SbEncInStream_Read(const ISeqInStream *pp, void *data, size_t *size) +{ + CSbEncInStream *p = CONTAINER_FROM_VTBL(pp, CSbEncInStream, vt); + size_t sizeOriginal = *size; + if (sizeOriginal == 0) + return SZ_OK; + + for (;;) + { + if (p->enc.needRead && !p->enc.readWasFinished) + { + size_t processed = p->enc.needReadSizeMax; + RINOK(p->inStream->Read(p->inStream, p->enc.buf + p->enc.readPos, &processed)); + p->enc.readPos += processed; + if (processed == 0) + { + p->enc.readWasFinished = True; + p->enc.isFinalFinished = True; + } + p->enc.needRead = False; + } + + *size = sizeOriginal; + RINOK(SbEnc_Read(&p->enc, data, size)); + if (*size != 0 || !p->enc.needRead) + return SZ_OK; + } +} + +void SbEncInStream_Construct(CSbEncInStream *p, ISzAllocPtr alloc) +{ + SbEnc_Construct(&p->enc, alloc); + p->vt.Read = SbEncInStream_Read; +} + +SRes SbEncInStream_Init(CSbEncInStream *p) +{ + return SbEnc_Init(&p->enc); +} + +void SbEncInStream_Free(CSbEncInStream *p) +{ + SbEnc_Free(&p->enc); +} + +#endif + + + +/* ---------- CXzProps ---------- */ + + +void XzFilterProps_Init(CXzFilterProps *p) +{ + p->id = 0; + p->delta = 0; + p->ip = 0; + p->ipDefined = False; +} + +void XzProps_Init(CXzProps *p) +{ + p->checkId = XZ_CHECK_CRC32; + p->blockSize = XZ_PROPS__BLOCK_SIZE__AUTO; + p->numBlockThreads_Reduced = -1; + p->numBlockThreads_Max = -1; + p->numTotalThreads = -1; + p->reduceSize = (UInt64)(Int64)-1; + p->forceWriteSizesInHeader = 0; + // p->forceWriteSizesInHeader = 1; + + XzFilterProps_Init(&p->filterProps); + Lzma2EncProps_Init(&p->lzma2Props); +} + + +static void XzEncProps_Normalize_Fixed(CXzProps *p) +{ + UInt64 fileSize; + int t1, t1n, t2, t2r, t3; + { + CLzma2EncProps tp = p->lzma2Props; + if (tp.numTotalThreads <= 0) + tp.numTotalThreads = p->numTotalThreads; + Lzma2EncProps_Normalize(&tp); + t1n = tp.numTotalThreads; + } + + t1 = p->lzma2Props.numTotalThreads; + t2 = p->numBlockThreads_Max; + t3 = p->numTotalThreads; + + if (t2 > MTCODER__THREADS_MAX) + t2 = MTCODER__THREADS_MAX; + + if (t3 <= 0) + { + if (t2 <= 0) + t2 = 1; + t3 = t1n * t2; + } + else if (t2 <= 0) + { + t2 = t3 / t1n; + if (t2 == 0) + { + t1 = 1; + t2 = t3; + } + if (t2 > MTCODER__THREADS_MAX) + t2 = MTCODER__THREADS_MAX; + } + else if (t1 <= 0) + { + t1 = t3 / t2; + if (t1 == 0) + t1 = 1; + } + else + t3 = t1n * t2; + + p->lzma2Props.numTotalThreads = t1; + + t2r = t2; + + fileSize = p->reduceSize; + + if ((p->blockSize < fileSize || fileSize == (UInt64)(Int64)-1)) + p->lzma2Props.lzmaProps.reduceSize = p->blockSize; + + Lzma2EncProps_Normalize(&p->lzma2Props); + + t1 = p->lzma2Props.numTotalThreads; + + { + if (t2 > 1 && fileSize != (UInt64)(Int64)-1) + { + UInt64 numBlocks = fileSize / p->blockSize; + if (numBlocks * p->blockSize != fileSize) + numBlocks++; + if (numBlocks < (unsigned)t2) + { + t2r = (int)numBlocks; + if (t2r == 0) + t2r = 1; + t3 = t1 * t2r; + } + } + } + + p->numBlockThreads_Max = t2; + p->numBlockThreads_Reduced = t2r; + p->numTotalThreads = t3; +} + + +static void XzProps_Normalize(CXzProps *p) +{ + /* we normalize xzProps properties, but we normalize only some of CXzProps::lzma2Props properties. + Lzma2Enc_SetProps() will normalize lzma2Props later. */ + + if (p->blockSize == XZ_PROPS__BLOCK_SIZE__SOLID) + { + p->lzma2Props.lzmaProps.reduceSize = p->reduceSize; + p->numBlockThreads_Reduced = 1; + p->numBlockThreads_Max = 1; + if (p->lzma2Props.numTotalThreads <= 0) + p->lzma2Props.numTotalThreads = p->numTotalThreads; + return; + } + else + { + CLzma2EncProps *lzma2 = &p->lzma2Props; + if (p->blockSize == LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO) + { + // xz-auto + p->lzma2Props.lzmaProps.reduceSize = p->reduceSize; + + if (lzma2->blockSize == LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID) + { + // if (xz-auto && lzma2-solid) - we use solid for both + p->blockSize = XZ_PROPS__BLOCK_SIZE__SOLID; + p->numBlockThreads_Reduced = 1; + p->numBlockThreads_Max = 1; + if (p->lzma2Props.numTotalThreads <= 0) + p->lzma2Props.numTotalThreads = p->numTotalThreads; + } + else + { + // if (xz-auto && (lzma2-auto || lzma2-fixed_) + // we calculate block size for lzma2 and use that block size for xz, lzma2 uses single-chunk per block + CLzma2EncProps tp = p->lzma2Props; + if (tp.numTotalThreads <= 0) + tp.numTotalThreads = p->numTotalThreads; + + Lzma2EncProps_Normalize(&tp); + + p->blockSize = tp.blockSize; // fixed or solid + p->numBlockThreads_Reduced = tp.numBlockThreads_Reduced; + p->numBlockThreads_Max = tp.numBlockThreads_Max; + if (lzma2->blockSize == LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO) + lzma2->blockSize = tp.blockSize; // fixed or solid, LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID + if (lzma2->lzmaProps.reduceSize > tp.blockSize && tp.blockSize != LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID) + lzma2->lzmaProps.reduceSize = tp.blockSize; + lzma2->numBlockThreads_Reduced = 1; + lzma2->numBlockThreads_Max = 1; + return; + } + } + else + { + // xz-fixed + // we can use xz::reduceSize or xz::blockSize as base for lzmaProps::reduceSize + + p->lzma2Props.lzmaProps.reduceSize = p->reduceSize; + { + UInt64 r = p->reduceSize; + if (r > p->blockSize || r == (UInt64)(Int64)-1) + r = p->blockSize; + lzma2->lzmaProps.reduceSize = r; + } + if (lzma2->blockSize == LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO) + lzma2->blockSize = LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID; + else if (lzma2->blockSize > p->blockSize && lzma2->blockSize != LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID) + lzma2->blockSize = p->blockSize; + + XzEncProps_Normalize_Fixed(p); + } + } +} + + +/* ---------- CLzma2WithFilters ---------- */ + +typedef struct +{ + CLzma2EncHandle lzma2; + CSeqInFilter filter; + + #ifdef USE_SUBBLOCK + CSbEncInStream sb; + #endif +} CLzma2WithFilters; + + +static void Lzma2WithFilters_Construct(CLzma2WithFilters *p) +{ + p->lzma2 = NULL; + SeqInFilter_Construct(&p->filter); + + #ifdef USE_SUBBLOCK + SbEncInStream_Construct(&p->sb, alloc); + #endif +} + + +static SRes Lzma2WithFilters_Create(CLzma2WithFilters *p, ISzAllocPtr alloc, ISzAllocPtr bigAlloc) +{ + if (!p->lzma2) + { + p->lzma2 = Lzma2Enc_Create(alloc, bigAlloc); + if (!p->lzma2) + return SZ_ERROR_MEM; + } + return SZ_OK; +} + + +static void Lzma2WithFilters_Free(CLzma2WithFilters *p, ISzAllocPtr alloc) +{ + #ifdef USE_SUBBLOCK + SbEncInStream_Free(&p->sb); + #endif + + SeqInFilter_Free(&p->filter, alloc); + if (p->lzma2) + { + Lzma2Enc_Destroy(p->lzma2); + p->lzma2 = NULL; + } +} + + +typedef struct +{ + UInt64 unpackSize; + UInt64 totalSize; + size_t headerSize; +} CXzEncBlockInfo; + + +static SRes Xz_CompressBlock( + CLzma2WithFilters *lzmaf, + + ISeqOutStream *outStream, + Byte *outBufHeader, + Byte *outBufData, size_t outBufDataLimit, + + ISeqInStream *inStream, + // UInt64 expectedSize, + const Byte *inBuf, // used if (!inStream) + size_t inBufSize, // used if (!inStream), it's block size, props->blockSize is ignored + + const CXzProps *props, + ICompressProgress *progress, + int *inStreamFinished, /* only for inStream version */ + CXzEncBlockInfo *blockSizes, + ISzAllocPtr alloc, + ISzAllocPtr allocBig) +{ + CSeqCheckInStream checkInStream; + CSeqSizeOutStream seqSizeOutStream; + CXzBlock block; + unsigned filterIndex = 0; + CXzFilter *filter = NULL; + const CXzFilterProps *fp = &props->filterProps; + if (fp->id == 0) + fp = NULL; + + *inStreamFinished = False; + + RINOK(Lzma2WithFilters_Create(lzmaf, alloc, allocBig)); + + RINOK(Lzma2Enc_SetProps(lzmaf->lzma2, &props->lzma2Props)); + + XzBlock_ClearFlags(&block); + XzBlock_SetNumFilters(&block, 1 + (fp ? 1 : 0)); + + if (fp) + { + filter = &block.filters[filterIndex++]; + filter->id = fp->id; + filter->propsSize = 0; + + if (fp->id == XZ_ID_Delta) + { + filter->props[0] = (Byte)(fp->delta - 1); + filter->propsSize = 1; + } + else if (fp->ipDefined) + { + Byte *ptr = filter->props; + SetUi32(ptr, fp->ip); + filter->propsSize = 4; + } + } + + { + CXzFilter *f = &block.filters[filterIndex++]; + f->id = XZ_ID_LZMA2; + f->propsSize = 1; + f->props[0] = Lzma2Enc_WriteProperties(lzmaf->lzma2); + } + + seqSizeOutStream.vt.Write = SeqSizeOutStream_Write; + seqSizeOutStream.realStream = outStream; + seqSizeOutStream.outBuf = outBufData; + seqSizeOutStream.outBufLimit = outBufDataLimit; + seqSizeOutStream.processed = 0; + + /* + if (expectedSize != (UInt64)(Int64)-1) + { + block.unpackSize = expectedSize; + if (props->blockSize != (UInt64)(Int64)-1) + if (expectedSize > props->blockSize) + block.unpackSize = props->blockSize; + XzBlock_SetHasUnpackSize(&block); + } + */ + + if (outStream) + { + RINOK(XzBlock_WriteHeader(&block, &seqSizeOutStream.vt)); + } + + checkInStream.vt.Read = SeqCheckInStream_Read; + SeqCheckInStream_Init(&checkInStream, props->checkId); + + checkInStream.realStream = inStream; + checkInStream.data = inBuf; + checkInStream.limit = props->blockSize; + if (!inStream) + checkInStream.limit = inBufSize; + + if (fp) + { + #ifdef USE_SUBBLOCK + if (fp->id == XZ_ID_Subblock) + { + lzmaf->sb.inStream = &checkInStream.vt; + RINOK(SbEncInStream_Init(&lzmaf->sb)); + } + else + #endif + { + lzmaf->filter.realStream = &checkInStream.vt; + RINOK(SeqInFilter_Init(&lzmaf->filter, filter, alloc)); + } + } + + { + SRes res; + Byte *outBuf = NULL; + size_t outSize = 0; + BoolInt useStream = (fp || inStream); + // useStream = True; + + if (!useStream) + { + XzCheck_Update(&checkInStream.check, inBuf, inBufSize); + checkInStream.processed = inBufSize; + } + + if (!outStream) + { + outBuf = seqSizeOutStream.outBuf; // + (size_t)seqSizeOutStream.processed; + outSize = seqSizeOutStream.outBufLimit; // - (size_t)seqSizeOutStream.processed; + } + + res = Lzma2Enc_Encode2(lzmaf->lzma2, + outBuf ? NULL : &seqSizeOutStream.vt, + outBuf, + outBuf ? &outSize : NULL, + + useStream ? + (fp ? + ( + #ifdef USE_SUBBLOCK + (fp->id == XZ_ID_Subblock) ? &lzmaf->sb.vt: + #endif + &lzmaf->filter.p) : + &checkInStream.vt) : NULL, + + useStream ? NULL : inBuf, + useStream ? 0 : inBufSize, + + progress); + + if (outBuf) + seqSizeOutStream.processed += outSize; + + RINOK(res); + blockSizes->unpackSize = checkInStream.processed; + } + { + Byte buf[4 + 64]; + unsigned padSize = XZ_GET_PAD_SIZE(seqSizeOutStream.processed); + UInt64 packSize = seqSizeOutStream.processed; + + buf[0] = 0; + buf[1] = 0; + buf[2] = 0; + buf[3] = 0; + + SeqCheckInStream_GetDigest(&checkInStream, buf + 4); + RINOK(WriteBytes(&seqSizeOutStream.vt, buf + (4 - padSize), padSize + XzFlags_GetCheckSize((CXzStreamFlags)props->checkId))); + + blockSizes->totalSize = seqSizeOutStream.processed - padSize; + + if (!outStream) + { + seqSizeOutStream.outBuf = outBufHeader; + seqSizeOutStream.outBufLimit = XZ_BLOCK_HEADER_SIZE_MAX; + seqSizeOutStream.processed = 0; + + block.unpackSize = blockSizes->unpackSize; + XzBlock_SetHasUnpackSize(&block); + + block.packSize = packSize; + XzBlock_SetHasPackSize(&block); + + RINOK(XzBlock_WriteHeader(&block, &seqSizeOutStream.vt)); + + blockSizes->headerSize = (size_t)seqSizeOutStream.processed; + blockSizes->totalSize += seqSizeOutStream.processed; + } + } + + if (inStream) + *inStreamFinished = checkInStream.realStreamFinished; + else + { + *inStreamFinished = False; + if (checkInStream.processed != inBufSize) + return SZ_ERROR_FAIL; + } + + return SZ_OK; +} + + + +typedef struct +{ + ICompressProgress vt; + ICompressProgress *progress; + UInt64 inOffset; + UInt64 outOffset; +} CCompressProgress_XzEncOffset; + + +static SRes CompressProgress_XzEncOffset_Progress(const ICompressProgress *pp, UInt64 inSize, UInt64 outSize) +{ + const CCompressProgress_XzEncOffset *p = CONTAINER_FROM_VTBL(pp, CCompressProgress_XzEncOffset, vt); + inSize += p->inOffset; + outSize += p->outOffset; + return ICompressProgress_Progress(p->progress, inSize, outSize); +} + + + + +typedef struct +{ + ISzAllocPtr alloc; + ISzAllocPtr allocBig; + + CXzProps xzProps; + UInt64 expectedDataSize; + + CXzEncIndex xzIndex; + + CLzma2WithFilters lzmaf_Items[MTCODER__THREADS_MAX]; + + size_t outBufSize; /* size of allocated outBufs[i] */ + Byte *outBufs[MTCODER__BLOCKS_MAX]; + + #ifndef _7ZIP_ST + unsigned checkType; + ISeqOutStream *outStream; + BoolInt mtCoder_WasConstructed; + CMtCoder mtCoder; + CXzEncBlockInfo EncBlocks[MTCODER__BLOCKS_MAX]; + #endif + +} CXzEnc; + + +static void XzEnc_Construct(CXzEnc *p) +{ + unsigned i; + + XzEncIndex_Construct(&p->xzIndex); + + for (i = 0; i < MTCODER__THREADS_MAX; i++) + Lzma2WithFilters_Construct(&p->lzmaf_Items[i]); + + #ifndef _7ZIP_ST + p->mtCoder_WasConstructed = False; + { + for (i = 0; i < MTCODER__BLOCKS_MAX; i++) + p->outBufs[i] = NULL; + p->outBufSize = 0; + } + #endif +} + + +static void XzEnc_FreeOutBufs(CXzEnc *p) +{ + unsigned i; + for (i = 0; i < MTCODER__BLOCKS_MAX; i++) + if (p->outBufs[i]) + { + ISzAlloc_Free(p->alloc, p->outBufs[i]); + p->outBufs[i] = NULL; + } + p->outBufSize = 0; +} + + +static void XzEnc_Free(CXzEnc *p, ISzAllocPtr alloc) +{ + unsigned i; + + XzEncIndex_Free(&p->xzIndex, alloc); + + for (i = 0; i < MTCODER__THREADS_MAX; i++) + Lzma2WithFilters_Free(&p->lzmaf_Items[i], alloc); + + #ifndef _7ZIP_ST + if (p->mtCoder_WasConstructed) + { + MtCoder_Destruct(&p->mtCoder); + p->mtCoder_WasConstructed = False; + } + XzEnc_FreeOutBufs(p); + #endif +} + + +CXzEncHandle XzEnc_Create(ISzAllocPtr alloc, ISzAllocPtr allocBig) +{ + CXzEnc *p = (CXzEnc *)ISzAlloc_Alloc(alloc, sizeof(CXzEnc)); + if (!p) + return NULL; + XzEnc_Construct(p); + XzProps_Init(&p->xzProps); + XzProps_Normalize(&p->xzProps); + p->expectedDataSize = (UInt64)(Int64)-1; + p->alloc = alloc; + p->allocBig = allocBig; + return p; +} + + +void XzEnc_Destroy(CXzEncHandle pp) +{ + CXzEnc *p = (CXzEnc *)pp; + XzEnc_Free(p, p->alloc); + ISzAlloc_Free(p->alloc, p); +} + + +SRes XzEnc_SetProps(CXzEncHandle pp, const CXzProps *props) +{ + CXzEnc *p = (CXzEnc *)pp; + p->xzProps = *props; + XzProps_Normalize(&p->xzProps); + return SZ_OK; +} + + +void XzEnc_SetDataSize(CXzEncHandle pp, UInt64 expectedDataSiize) +{ + CXzEnc *p = (CXzEnc *)pp; + p->expectedDataSize = expectedDataSiize; +} + + + + +#ifndef _7ZIP_ST + +static SRes XzEnc_MtCallback_Code(void *pp, unsigned coderIndex, unsigned outBufIndex, + const Byte *src, size_t srcSize, int finished) +{ + CXzEnc *me = (CXzEnc *)pp; + SRes res; + CMtProgressThunk progressThunk; + + Byte *dest = me->outBufs[outBufIndex]; + + UNUSED_VAR(finished) + + { + CXzEncBlockInfo *bInfo = &me->EncBlocks[outBufIndex]; + bInfo->totalSize = 0; + bInfo->unpackSize = 0; + bInfo->headerSize = 0; + } + + if (!dest) + { + dest = (Byte *)ISzAlloc_Alloc(me->alloc, me->outBufSize); + if (!dest) + return SZ_ERROR_MEM; + me->outBufs[outBufIndex] = dest; + } + + MtProgressThunk_CreateVTable(&progressThunk); + progressThunk.mtProgress = &me->mtCoder.mtProgress; + MtProgressThunk_Init(&progressThunk); + + { + CXzEncBlockInfo blockSizes; + int inStreamFinished; + + res = Xz_CompressBlock( + &me->lzmaf_Items[coderIndex], + + NULL, + dest, + dest + XZ_BLOCK_HEADER_SIZE_MAX, me->outBufSize - XZ_BLOCK_HEADER_SIZE_MAX, + + NULL, + // srcSize, // expectedSize + src, srcSize, + + &me->xzProps, + &progressThunk.vt, + &inStreamFinished, + &blockSizes, + me->alloc, + me->allocBig); + + if (res == SZ_OK) + me->EncBlocks[outBufIndex] = blockSizes; + + return res; + } +} + + +static SRes XzEnc_MtCallback_Write(void *pp, unsigned outBufIndex) +{ + CXzEnc *me = (CXzEnc *)pp; + + const CXzEncBlockInfo *bInfo = &me->EncBlocks[outBufIndex]; + const Byte *data = me->outBufs[outBufIndex]; + + RINOK(WriteBytes(me->outStream, data, bInfo->headerSize)); + + { + UInt64 totalPackFull = bInfo->totalSize + XZ_GET_PAD_SIZE(bInfo->totalSize); + RINOK(WriteBytes(me->outStream, data + XZ_BLOCK_HEADER_SIZE_MAX, (size_t)totalPackFull - bInfo->headerSize)); + } + + return XzEncIndex_AddIndexRecord(&me->xzIndex, bInfo->unpackSize, bInfo->totalSize, me->alloc); +} + +#endif + + + +SRes XzEnc_Encode(CXzEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress) +{ + CXzEnc *p = (CXzEnc *)pp; + + const CXzProps *props = &p->xzProps; + + XzEncIndex_Init(&p->xzIndex); + { + UInt64 numBlocks = 1; + UInt64 blockSize = props->blockSize; + + if (blockSize != XZ_PROPS__BLOCK_SIZE__SOLID + && props->reduceSize != (UInt64)(Int64)-1) + { + numBlocks = props->reduceSize / blockSize; + if (numBlocks * blockSize != props->reduceSize) + numBlocks++; + } + else + blockSize = (UInt64)1 << 62; + + RINOK(XzEncIndex_PreAlloc(&p->xzIndex, numBlocks, blockSize, XZ_GET_ESTIMATED_BLOCK_TOTAL_PACK_SIZE(blockSize), p->alloc)); + } + + RINOK(Xz_WriteHeader((CXzStreamFlags)props->checkId, outStream)); + + + #ifndef _7ZIP_ST + if (props->numBlockThreads_Reduced > 1) + { + IMtCoderCallback2 vt; + + if (!p->mtCoder_WasConstructed) + { + p->mtCoder_WasConstructed = True; + MtCoder_Construct(&p->mtCoder); + } + + vt.Code = XzEnc_MtCallback_Code; + vt.Write = XzEnc_MtCallback_Write; + + p->checkType = props->checkId; + p->xzProps = *props; + + p->outStream = outStream; + + p->mtCoder.allocBig = p->allocBig; + p->mtCoder.progress = progress; + p->mtCoder.inStream = inStream; + p->mtCoder.inData = NULL; + p->mtCoder.inDataSize = 0; + p->mtCoder.mtCallback = &vt; + p->mtCoder.mtCallbackObject = p; + + if ( props->blockSize == XZ_PROPS__BLOCK_SIZE__SOLID + || props->blockSize == XZ_PROPS__BLOCK_SIZE__AUTO) + return SZ_ERROR_FAIL; + + p->mtCoder.blockSize = (size_t)props->blockSize; + if (p->mtCoder.blockSize != props->blockSize) + return SZ_ERROR_PARAM; /* SZ_ERROR_MEM */ + + { + size_t destBlockSize = XZ_BLOCK_HEADER_SIZE_MAX + XZ_GET_MAX_BLOCK_PACK_SIZE(p->mtCoder.blockSize); + if (destBlockSize < p->mtCoder.blockSize) + return SZ_ERROR_PARAM; + if (p->outBufSize != destBlockSize) + XzEnc_FreeOutBufs(p); + p->outBufSize = destBlockSize; + } + + p->mtCoder.numThreadsMax = (unsigned)props->numBlockThreads_Max; + p->mtCoder.expectedDataSize = p->expectedDataSize; + + RINOK(MtCoder_Code(&p->mtCoder)); + } + else + #endif + { + int writeStartSizes; + CCompressProgress_XzEncOffset progress2; + Byte *bufData = NULL; + size_t bufSize = 0; + + progress2.vt.Progress = CompressProgress_XzEncOffset_Progress; + progress2.inOffset = 0; + progress2.outOffset = 0; + progress2.progress = progress; + + writeStartSizes = 0; + + if (props->blockSize != XZ_PROPS__BLOCK_SIZE__SOLID) + { + writeStartSizes = (props->forceWriteSizesInHeader > 0); + + if (writeStartSizes) + { + size_t t2; + size_t t = (size_t)props->blockSize; + if (t != props->blockSize) + return SZ_ERROR_PARAM; + t = XZ_GET_MAX_BLOCK_PACK_SIZE(t); + if (t < props->blockSize) + return SZ_ERROR_PARAM; + t2 = XZ_BLOCK_HEADER_SIZE_MAX + t; + if (!p->outBufs[0] || t2 != p->outBufSize) + { + XzEnc_FreeOutBufs(p); + p->outBufs[0] = (Byte *)ISzAlloc_Alloc(p->alloc, t2); + if (!p->outBufs[0]) + return SZ_ERROR_MEM; + p->outBufSize = t2; + } + bufData = p->outBufs[0] + XZ_BLOCK_HEADER_SIZE_MAX; + bufSize = t; + } + } + + for (;;) + { + CXzEncBlockInfo blockSizes; + int inStreamFinished; + + /* + UInt64 rem = (UInt64)(Int64)-1; + if (props->reduceSize != (UInt64)(Int64)-1 + && props->reduceSize >= progress2.inOffset) + rem = props->reduceSize - progress2.inOffset; + */ + + blockSizes.headerSize = 0; // for GCC + + RINOK(Xz_CompressBlock( + &p->lzmaf_Items[0], + + writeStartSizes ? NULL : outStream, + writeStartSizes ? p->outBufs[0] : NULL, + bufData, bufSize, + + inStream, + // rem, + NULL, 0, + + props, + progress ? &progress2.vt : NULL, + &inStreamFinished, + &blockSizes, + p->alloc, + p->allocBig)); + + { + UInt64 totalPackFull = blockSizes.totalSize + XZ_GET_PAD_SIZE(blockSizes.totalSize); + + if (writeStartSizes) + { + RINOK(WriteBytes(outStream, p->outBufs[0], blockSizes.headerSize)); + RINOK(WriteBytes(outStream, bufData, (size_t)totalPackFull - blockSizes.headerSize)); + } + + RINOK(XzEncIndex_AddIndexRecord(&p->xzIndex, blockSizes.unpackSize, blockSizes.totalSize, p->alloc)); + + progress2.inOffset += blockSizes.unpackSize; + progress2.outOffset += totalPackFull; + } + + if (inStreamFinished) + break; + } + } + + return XzEncIndex_WriteFooter(&p->xzIndex, (CXzStreamFlags)props->checkId, outStream); +} + + +#include "Alloc.h" + +SRes Xz_Encode(ISeqOutStream *outStream, ISeqInStream *inStream, + const CXzProps *props, ICompressProgress *progress) +{ + SRes res; + CXzEncHandle xz = XzEnc_Create(&g_Alloc, &g_BigAlloc); + if (!xz) + return SZ_ERROR_MEM; + res = XzEnc_SetProps(xz, props); + if (res == SZ_OK) + res = XzEnc_Encode(xz, outStream, inStream, progress); + XzEnc_Destroy(xz); + return res; +} + + +SRes Xz_EncodeEmpty(ISeqOutStream *outStream) +{ + SRes res; + CXzEncIndex xzIndex; + XzEncIndex_Construct(&xzIndex); + res = Xz_WriteHeader((CXzStreamFlags)0, outStream); + if (res == SZ_OK) + res = XzEncIndex_WriteFooter(&xzIndex, (CXzStreamFlags)0, outStream); + XzEncIndex_Free(&xzIndex, NULL); // g_Alloc + return res; +} diff --git a/deps/LZMA-SDK/C/XzEnc.h b/deps/LZMA-SDK/C/XzEnc.h index 529ac3fd8..0c29e7e1e 100644 --- a/deps/LZMA-SDK/C/XzEnc.h +++ b/deps/LZMA-SDK/C/XzEnc.h @@ -1,60 +1,60 @@ -/* XzEnc.h -- Xz Encode -2017-06-27 : Igor Pavlov : Public domain */ - -#ifndef __XZ_ENC_H -#define __XZ_ENC_H - -#include "Lzma2Enc.h" - -#include "Xz.h" - -EXTERN_C_BEGIN - - -#define XZ_PROPS__BLOCK_SIZE__AUTO LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO -#define XZ_PROPS__BLOCK_SIZE__SOLID LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID - - -typedef struct -{ - UInt32 id; - UInt32 delta; - UInt32 ip; - int ipDefined; -} CXzFilterProps; - -void XzFilterProps_Init(CXzFilterProps *p); - - -typedef struct -{ - CLzma2EncProps lzma2Props; - CXzFilterProps filterProps; - unsigned checkId; - UInt64 blockSize; - int numBlockThreads_Reduced; - int numBlockThreads_Max; - int numTotalThreads; - int forceWriteSizesInHeader; - UInt64 reduceSize; -} CXzProps; - -void XzProps_Init(CXzProps *p); - - -typedef void * CXzEncHandle; - -CXzEncHandle XzEnc_Create(ISzAllocPtr alloc, ISzAllocPtr allocBig); -void XzEnc_Destroy(CXzEncHandle p); -SRes XzEnc_SetProps(CXzEncHandle p, const CXzProps *props); -void XzEnc_SetDataSize(CXzEncHandle p, UInt64 expectedDataSiize); -SRes XzEnc_Encode(CXzEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress); - -SRes Xz_Encode(ISeqOutStream *outStream, ISeqInStream *inStream, - const CXzProps *props, ICompressProgress *progress); - -SRes Xz_EncodeEmpty(ISeqOutStream *outStream); - -EXTERN_C_END - -#endif +/* XzEnc.h -- Xz Encode +2017-06-27 : Igor Pavlov : Public domain */ + +#ifndef __XZ_ENC_H +#define __XZ_ENC_H + +#include "Lzma2Enc.h" + +#include "Xz.h" + +EXTERN_C_BEGIN + + +#define XZ_PROPS__BLOCK_SIZE__AUTO LZMA2_ENC_PROPS__BLOCK_SIZE__AUTO +#define XZ_PROPS__BLOCK_SIZE__SOLID LZMA2_ENC_PROPS__BLOCK_SIZE__SOLID + + +typedef struct +{ + UInt32 id; + UInt32 delta; + UInt32 ip; + int ipDefined; +} CXzFilterProps; + +void XzFilterProps_Init(CXzFilterProps *p); + + +typedef struct +{ + CLzma2EncProps lzma2Props; + CXzFilterProps filterProps; + unsigned checkId; + UInt64 blockSize; + int numBlockThreads_Reduced; + int numBlockThreads_Max; + int numTotalThreads; + int forceWriteSizesInHeader; + UInt64 reduceSize; +} CXzProps; + +void XzProps_Init(CXzProps *p); + + +typedef void * CXzEncHandle; + +CXzEncHandle XzEnc_Create(ISzAllocPtr alloc, ISzAllocPtr allocBig); +void XzEnc_Destroy(CXzEncHandle p); +SRes XzEnc_SetProps(CXzEncHandle p, const CXzProps *props); +void XzEnc_SetDataSize(CXzEncHandle p, UInt64 expectedDataSiize); +SRes XzEnc_Encode(CXzEncHandle p, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress); + +SRes Xz_Encode(ISeqOutStream *outStream, ISeqInStream *inStream, + const CXzProps *props, ICompressProgress *progress); + +SRes Xz_EncodeEmpty(ISeqOutStream *outStream); + +EXTERN_C_END + +#endif diff --git a/deps/LZMA-SDK/C/XzIn.c b/deps/LZMA-SDK/C/XzIn.c index 54d81c4a4..84f868ec6 100644 --- a/deps/LZMA-SDK/C/XzIn.c +++ b/deps/LZMA-SDK/C/XzIn.c @@ -1,324 +1,325 @@ -/* XzIn.c - Xz input -2021-04-01 : Igor Pavlov : Public domain */ - -#include "Precomp.h" - -#include - -#include "7zCrc.h" -#include "CpuArch.h" -#include "Xz.h" - -/* -#define XZ_FOOTER_SIG_CHECK(p) (memcmp((p), XZ_FOOTER_SIG, XZ_FOOTER_SIG_SIZE) == 0) -*/ -#define XZ_FOOTER_SIG_CHECK(p) ((p)[0] == XZ_FOOTER_SIG_0 && (p)[1] == XZ_FOOTER_SIG_1) - - -SRes Xz_ReadHeader(CXzStreamFlags *p, ISeqInStream *inStream) -{ - Byte sig[XZ_STREAM_HEADER_SIZE]; - RINOK(SeqInStream_Read2(inStream, sig, XZ_STREAM_HEADER_SIZE, SZ_ERROR_NO_ARCHIVE)); - if (memcmp(sig, XZ_SIG, XZ_SIG_SIZE) != 0) - return SZ_ERROR_NO_ARCHIVE; - return Xz_ParseHeader(p, sig); -} - -#define READ_VARINT_AND_CHECK(buf, pos, size, res) \ - { unsigned s = Xz_ReadVarInt(buf + pos, size - pos, res); \ - if (s == 0) return SZ_ERROR_ARCHIVE; pos += s; } - -SRes XzBlock_ReadHeader(CXzBlock *p, ISeqInStream *inStream, BoolInt *isIndex, UInt32 *headerSizeRes) -{ - Byte header[XZ_BLOCK_HEADER_SIZE_MAX]; - unsigned headerSize; - *headerSizeRes = 0; - RINOK(SeqInStream_ReadByte(inStream, &header[0])); - headerSize = (unsigned)header[0]; - if (headerSize == 0) - { - *headerSizeRes = 1; - *isIndex = True; - return SZ_OK; - } - - *isIndex = False; - headerSize = (headerSize << 2) + 4; - *headerSizeRes = headerSize; - RINOK(SeqInStream_Read(inStream, header + 1, headerSize - 1)); - return XzBlock_Parse(p, header); -} - -#define ADD_SIZE_CHECK(size, val) \ - { UInt64 newSize = size + (val); if (newSize < size) return XZ_SIZE_OVERFLOW; size = newSize; } - -UInt64 Xz_GetUnpackSize(const CXzStream *p) -{ - UInt64 size = 0; - size_t i; - for (i = 0; i < p->numBlocks; i++) - ADD_SIZE_CHECK(size, p->blocks[i].unpackSize); - return size; -} - -UInt64 Xz_GetPackSize(const CXzStream *p) -{ - UInt64 size = 0; - size_t i; - for (i = 0; i < p->numBlocks; i++) - ADD_SIZE_CHECK(size, (p->blocks[i].totalSize + 3) & ~(UInt64)3); - return size; -} - -/* -SRes XzBlock_ReadFooter(CXzBlock *p, CXzStreamFlags f, ISeqInStream *inStream) -{ - return SeqInStream_Read(inStream, p->check, XzFlags_GetCheckSize(f)); -} -*/ - -static SRes Xz_ReadIndex2(CXzStream *p, const Byte *buf, size_t size, ISzAllocPtr alloc) -{ - size_t numBlocks, pos = 1; - UInt32 crc; - - if (size < 5 || buf[0] != 0) - return SZ_ERROR_ARCHIVE; - - size -= 4; - crc = CrcCalc(buf, size); - if (crc != GetUi32(buf + size)) - return SZ_ERROR_ARCHIVE; - - { - UInt64 numBlocks64; - READ_VARINT_AND_CHECK(buf, pos, size, &numBlocks64); - numBlocks = (size_t)numBlocks64; - if (numBlocks != numBlocks64 || numBlocks * 2 > size) - return SZ_ERROR_ARCHIVE; - } - - Xz_Free(p, alloc); - if (numBlocks != 0) - { - size_t i; - p->numBlocks = numBlocks; - p->blocks = (CXzBlockSizes *)ISzAlloc_Alloc(alloc, sizeof(CXzBlockSizes) * numBlocks); - if (!p->blocks) - return SZ_ERROR_MEM; - for (i = 0; i < numBlocks; i++) - { - CXzBlockSizes *block = &p->blocks[i]; - READ_VARINT_AND_CHECK(buf, pos, size, &block->totalSize); - READ_VARINT_AND_CHECK(buf, pos, size, &block->unpackSize); - if (block->totalSize == 0) - return SZ_ERROR_ARCHIVE; - } - } - while ((pos & 3) != 0) - if (buf[pos++] != 0) - return SZ_ERROR_ARCHIVE; - return (pos == size) ? SZ_OK : SZ_ERROR_ARCHIVE; -} - -static SRes Xz_ReadIndex(CXzStream *p, ILookInStream *stream, UInt64 indexSize, ISzAllocPtr alloc) -{ - SRes res; - size_t size; - Byte *buf; - if (indexSize > ((UInt32)1 << 31)) - return SZ_ERROR_UNSUPPORTED; - size = (size_t)indexSize; - if (size != indexSize) - return SZ_ERROR_UNSUPPORTED; - buf = (Byte *)ISzAlloc_Alloc(alloc, size); - if (!buf) - return SZ_ERROR_MEM; - res = LookInStream_Read2(stream, buf, size, SZ_ERROR_UNSUPPORTED); - if (res == SZ_OK) - res = Xz_ReadIndex2(p, buf, size, alloc); - ISzAlloc_Free(alloc, buf); - return res; -} - -static SRes LookInStream_SeekRead_ForArc(ILookInStream *stream, UInt64 offset, void *buf, size_t size) -{ - RINOK(LookInStream_SeekTo(stream, offset)); - return LookInStream_Read(stream, buf, size); - /* return LookInStream_Read2(stream, buf, size, SZ_ERROR_NO_ARCHIVE); */ -} - -static SRes Xz_ReadBackward(CXzStream *p, ILookInStream *stream, Int64 *startOffset, ISzAllocPtr alloc) -{ - UInt64 indexSize; - Byte buf[XZ_STREAM_FOOTER_SIZE]; - UInt64 pos = (UInt64)*startOffset; - - if ((pos & 3) != 0 || pos < XZ_STREAM_FOOTER_SIZE) - return SZ_ERROR_NO_ARCHIVE; - - pos -= XZ_STREAM_FOOTER_SIZE; - RINOK(LookInStream_SeekRead_ForArc(stream, pos, buf, XZ_STREAM_FOOTER_SIZE)); - - if (!XZ_FOOTER_SIG_CHECK(buf + 10)) - { - UInt32 total = 0; - pos += XZ_STREAM_FOOTER_SIZE; - - for (;;) - { - size_t i; - #define TEMP_BUF_SIZE (1 << 10) - Byte temp[TEMP_BUF_SIZE]; - - i = (pos > TEMP_BUF_SIZE) ? TEMP_BUF_SIZE : (size_t)pos; - pos -= i; - RINOK(LookInStream_SeekRead_ForArc(stream, pos, temp, i)); - total += (UInt32)i; - for (; i != 0; i--) - if (temp[i - 1] != 0) - break; - if (i != 0) - { - if ((i & 3) != 0) - return SZ_ERROR_NO_ARCHIVE; - pos += i; - break; - } - if (pos < XZ_STREAM_FOOTER_SIZE || total > (1 << 16)) - return SZ_ERROR_NO_ARCHIVE; - } - - if (pos < XZ_STREAM_FOOTER_SIZE) - return SZ_ERROR_NO_ARCHIVE; - pos -= XZ_STREAM_FOOTER_SIZE; - RINOK(LookInStream_SeekRead_ForArc(stream, pos, buf, XZ_STREAM_FOOTER_SIZE)); - if (!XZ_FOOTER_SIG_CHECK(buf + 10)) - return SZ_ERROR_NO_ARCHIVE; - } - - p->flags = (CXzStreamFlags)GetBe16(buf + 8); - - if (!XzFlags_IsSupported(p->flags)) - return SZ_ERROR_UNSUPPORTED; - - { - /* to eliminate GCC 6.3 warning: - dereferencing type-punned pointer will break strict-aliasing rules */ - const Byte *buf_ptr = buf; - if (GetUi32(buf_ptr) != CrcCalc(buf + 4, 6)) - return SZ_ERROR_ARCHIVE; - } - - indexSize = ((UInt64)GetUi32(buf + 4) + 1) << 2; - - if (pos < indexSize) - return SZ_ERROR_ARCHIVE; - - pos -= indexSize; - RINOK(LookInStream_SeekTo(stream, pos)); - RINOK(Xz_ReadIndex(p, stream, indexSize, alloc)); - - { - UInt64 totalSize = Xz_GetPackSize(p); - if (totalSize == XZ_SIZE_OVERFLOW - || totalSize >= ((UInt64)1 << 63) - || pos < totalSize + XZ_STREAM_HEADER_SIZE) - return SZ_ERROR_ARCHIVE; - pos -= (totalSize + XZ_STREAM_HEADER_SIZE); - RINOK(LookInStream_SeekTo(stream, pos)); - *startOffset = (Int64)pos; - } - { - CXzStreamFlags headerFlags; - CSecToRead secToRead; - SecToRead_CreateVTable(&secToRead); - secToRead.realStream = stream; - - RINOK(Xz_ReadHeader(&headerFlags, &secToRead.vt)); - return (p->flags == headerFlags) ? SZ_OK : SZ_ERROR_ARCHIVE; - } -} - - -/* ---------- Xz Streams ---------- */ - -void Xzs_Construct(CXzs *p) -{ - p->num = p->numAllocated = 0; - p->streams = 0; -} - -void Xzs_Free(CXzs *p, ISzAllocPtr alloc) -{ - size_t i; - for (i = 0; i < p->num; i++) - Xz_Free(&p->streams[i], alloc); - ISzAlloc_Free(alloc, p->streams); - p->num = p->numAllocated = 0; - p->streams = 0; -} - -UInt64 Xzs_GetNumBlocks(const CXzs *p) -{ - UInt64 num = 0; - size_t i; - for (i = 0; i < p->num; i++) - num += p->streams[i].numBlocks; - return num; -} - -UInt64 Xzs_GetUnpackSize(const CXzs *p) -{ - UInt64 size = 0; - size_t i; - for (i = 0; i < p->num; i++) - ADD_SIZE_CHECK(size, Xz_GetUnpackSize(&p->streams[i])); - return size; -} - -/* -UInt64 Xzs_GetPackSize(const CXzs *p) -{ - UInt64 size = 0; - size_t i; - for (i = 0; i < p->num; i++) - ADD_SIZE_CHECK(size, Xz_GetTotalSize(&p->streams[i])); - return size; -} -*/ - -SRes Xzs_ReadBackward(CXzs *p, ILookInStream *stream, Int64 *startOffset, ICompressProgress *progress, ISzAllocPtr alloc) -{ - Int64 endOffset = 0; - RINOK(ILookInStream_Seek(stream, &endOffset, SZ_SEEK_END)); - *startOffset = endOffset; - for (;;) - { - CXzStream st; - SRes res; - Xz_Construct(&st); - res = Xz_ReadBackward(&st, stream, startOffset, alloc); - st.startOffset = (UInt64)*startOffset; - RINOK(res); - if (p->num == p->numAllocated) - { - const size_t newNum = p->num + p->num / 4 + 1; - void *data = ISzAlloc_Alloc(alloc, newNum * sizeof(CXzStream)); - if (!data) - return SZ_ERROR_MEM; - p->numAllocated = newNum; - if (p->num != 0) - memcpy(data, p->streams, p->num * sizeof(CXzStream)); - ISzAlloc_Free(alloc, p->streams); - p->streams = (CXzStream *)data; - } - p->streams[p->num++] = st; - if (*startOffset == 0) - break; - RINOK(LookInStream_SeekTo(stream, (UInt64)*startOffset)); - if (progress && ICompressProgress_Progress(progress, (UInt64)(endOffset - *startOffset), (UInt64)(Int64)-1) != SZ_OK) - return SZ_ERROR_PROGRESS; - } - return SZ_OK; -} +/* XzIn.c - Xz input +2021-09-04 : Igor Pavlov : Public domain */ + +#include "Precomp.h" + +#include + +#include "7zCrc.h" +#include "CpuArch.h" +#include "Xz.h" + +/* +#define XZ_FOOTER_SIG_CHECK(p) (memcmp((p), XZ_FOOTER_SIG, XZ_FOOTER_SIG_SIZE) == 0) +*/ +#define XZ_FOOTER_SIG_CHECK(p) ((p)[0] == XZ_FOOTER_SIG_0 && (p)[1] == XZ_FOOTER_SIG_1) + + +SRes Xz_ReadHeader(CXzStreamFlags *p, ISeqInStream *inStream) +{ + Byte sig[XZ_STREAM_HEADER_SIZE]; + RINOK(SeqInStream_Read2(inStream, sig, XZ_STREAM_HEADER_SIZE, SZ_ERROR_NO_ARCHIVE)); + if (memcmp(sig, XZ_SIG, XZ_SIG_SIZE) != 0) + return SZ_ERROR_NO_ARCHIVE; + return Xz_ParseHeader(p, sig); +} + +#define READ_VARINT_AND_CHECK(buf, pos, size, res) \ + { unsigned s = Xz_ReadVarInt(buf + pos, size - pos, res); \ + if (s == 0) return SZ_ERROR_ARCHIVE; \ + pos += s; } + +SRes XzBlock_ReadHeader(CXzBlock *p, ISeqInStream *inStream, BoolInt *isIndex, UInt32 *headerSizeRes) +{ + Byte header[XZ_BLOCK_HEADER_SIZE_MAX]; + unsigned headerSize; + *headerSizeRes = 0; + RINOK(SeqInStream_ReadByte(inStream, &header[0])); + headerSize = (unsigned)header[0]; + if (headerSize == 0) + { + *headerSizeRes = 1; + *isIndex = True; + return SZ_OK; + } + + *isIndex = False; + headerSize = (headerSize << 2) + 4; + *headerSizeRes = headerSize; + RINOK(SeqInStream_Read(inStream, header + 1, headerSize - 1)); + return XzBlock_Parse(p, header); +} + +#define ADD_SIZE_CHECK(size, val) \ + { UInt64 newSize = size + (val); if (newSize < size) return XZ_SIZE_OVERFLOW; size = newSize; } + +UInt64 Xz_GetUnpackSize(const CXzStream *p) +{ + UInt64 size = 0; + size_t i; + for (i = 0; i < p->numBlocks; i++) + ADD_SIZE_CHECK(size, p->blocks[i].unpackSize); + return size; +} + +UInt64 Xz_GetPackSize(const CXzStream *p) +{ + UInt64 size = 0; + size_t i; + for (i = 0; i < p->numBlocks; i++) + ADD_SIZE_CHECK(size, (p->blocks[i].totalSize + 3) & ~(UInt64)3); + return size; +} + +/* +SRes XzBlock_ReadFooter(CXzBlock *p, CXzStreamFlags f, ISeqInStream *inStream) +{ + return SeqInStream_Read(inStream, p->check, XzFlags_GetCheckSize(f)); +} +*/ + +static SRes Xz_ReadIndex2(CXzStream *p, const Byte *buf, size_t size, ISzAllocPtr alloc) +{ + size_t numBlocks, pos = 1; + UInt32 crc; + + if (size < 5 || buf[0] != 0) + return SZ_ERROR_ARCHIVE; + + size -= 4; + crc = CrcCalc(buf, size); + if (crc != GetUi32(buf + size)) + return SZ_ERROR_ARCHIVE; + + { + UInt64 numBlocks64; + READ_VARINT_AND_CHECK(buf, pos, size, &numBlocks64); + numBlocks = (size_t)numBlocks64; + if (numBlocks != numBlocks64 || numBlocks * 2 > size) + return SZ_ERROR_ARCHIVE; + } + + Xz_Free(p, alloc); + if (numBlocks != 0) + { + size_t i; + p->numBlocks = numBlocks; + p->blocks = (CXzBlockSizes *)ISzAlloc_Alloc(alloc, sizeof(CXzBlockSizes) * numBlocks); + if (!p->blocks) + return SZ_ERROR_MEM; + for (i = 0; i < numBlocks; i++) + { + CXzBlockSizes *block = &p->blocks[i]; + READ_VARINT_AND_CHECK(buf, pos, size, &block->totalSize); + READ_VARINT_AND_CHECK(buf, pos, size, &block->unpackSize); + if (block->totalSize == 0) + return SZ_ERROR_ARCHIVE; + } + } + while ((pos & 3) != 0) + if (buf[pos++] != 0) + return SZ_ERROR_ARCHIVE; + return (pos == size) ? SZ_OK : SZ_ERROR_ARCHIVE; +} + +static SRes Xz_ReadIndex(CXzStream *p, ILookInStream *stream, UInt64 indexSize, ISzAllocPtr alloc) +{ + SRes res; + size_t size; + Byte *buf; + if (indexSize > ((UInt32)1 << 31)) + return SZ_ERROR_UNSUPPORTED; + size = (size_t)indexSize; + if (size != indexSize) + return SZ_ERROR_UNSUPPORTED; + buf = (Byte *)ISzAlloc_Alloc(alloc, size); + if (!buf) + return SZ_ERROR_MEM; + res = LookInStream_Read2(stream, buf, size, SZ_ERROR_UNSUPPORTED); + if (res == SZ_OK) + res = Xz_ReadIndex2(p, buf, size, alloc); + ISzAlloc_Free(alloc, buf); + return res; +} + +static SRes LookInStream_SeekRead_ForArc(ILookInStream *stream, UInt64 offset, void *buf, size_t size) +{ + RINOK(LookInStream_SeekTo(stream, offset)); + return LookInStream_Read(stream, buf, size); + /* return LookInStream_Read2(stream, buf, size, SZ_ERROR_NO_ARCHIVE); */ +} + +static SRes Xz_ReadBackward(CXzStream *p, ILookInStream *stream, Int64 *startOffset, ISzAllocPtr alloc) +{ + UInt64 indexSize; + Byte buf[XZ_STREAM_FOOTER_SIZE]; + UInt64 pos = (UInt64)*startOffset; + + if ((pos & 3) != 0 || pos < XZ_STREAM_FOOTER_SIZE) + return SZ_ERROR_NO_ARCHIVE; + + pos -= XZ_STREAM_FOOTER_SIZE; + RINOK(LookInStream_SeekRead_ForArc(stream, pos, buf, XZ_STREAM_FOOTER_SIZE)); + + if (!XZ_FOOTER_SIG_CHECK(buf + 10)) + { + UInt32 total = 0; + pos += XZ_STREAM_FOOTER_SIZE; + + for (;;) + { + size_t i; + #define TEMP_BUF_SIZE (1 << 10) + Byte temp[TEMP_BUF_SIZE]; + + i = (pos > TEMP_BUF_SIZE) ? TEMP_BUF_SIZE : (size_t)pos; + pos -= i; + RINOK(LookInStream_SeekRead_ForArc(stream, pos, temp, i)); + total += (UInt32)i; + for (; i != 0; i--) + if (temp[i - 1] != 0) + break; + if (i != 0) + { + if ((i & 3) != 0) + return SZ_ERROR_NO_ARCHIVE; + pos += i; + break; + } + if (pos < XZ_STREAM_FOOTER_SIZE || total > (1 << 16)) + return SZ_ERROR_NO_ARCHIVE; + } + + if (pos < XZ_STREAM_FOOTER_SIZE) + return SZ_ERROR_NO_ARCHIVE; + pos -= XZ_STREAM_FOOTER_SIZE; + RINOK(LookInStream_SeekRead_ForArc(stream, pos, buf, XZ_STREAM_FOOTER_SIZE)); + if (!XZ_FOOTER_SIG_CHECK(buf + 10)) + return SZ_ERROR_NO_ARCHIVE; + } + + p->flags = (CXzStreamFlags)GetBe16(buf + 8); + + if (!XzFlags_IsSupported(p->flags)) + return SZ_ERROR_UNSUPPORTED; + + { + /* to eliminate GCC 6.3 warning: + dereferencing type-punned pointer will break strict-aliasing rules */ + const Byte *buf_ptr = buf; + if (GetUi32(buf_ptr) != CrcCalc(buf + 4, 6)) + return SZ_ERROR_ARCHIVE; + } + + indexSize = ((UInt64)GetUi32(buf + 4) + 1) << 2; + + if (pos < indexSize) + return SZ_ERROR_ARCHIVE; + + pos -= indexSize; + RINOK(LookInStream_SeekTo(stream, pos)); + RINOK(Xz_ReadIndex(p, stream, indexSize, alloc)); + + { + UInt64 totalSize = Xz_GetPackSize(p); + if (totalSize == XZ_SIZE_OVERFLOW + || totalSize >= ((UInt64)1 << 63) + || pos < totalSize + XZ_STREAM_HEADER_SIZE) + return SZ_ERROR_ARCHIVE; + pos -= (totalSize + XZ_STREAM_HEADER_SIZE); + RINOK(LookInStream_SeekTo(stream, pos)); + *startOffset = (Int64)pos; + } + { + CXzStreamFlags headerFlags; + CSecToRead secToRead; + SecToRead_CreateVTable(&secToRead); + secToRead.realStream = stream; + + RINOK(Xz_ReadHeader(&headerFlags, &secToRead.vt)); + return (p->flags == headerFlags) ? SZ_OK : SZ_ERROR_ARCHIVE; + } +} + + +/* ---------- Xz Streams ---------- */ + +void Xzs_Construct(CXzs *p) +{ + p->num = p->numAllocated = 0; + p->streams = 0; +} + +void Xzs_Free(CXzs *p, ISzAllocPtr alloc) +{ + size_t i; + for (i = 0; i < p->num; i++) + Xz_Free(&p->streams[i], alloc); + ISzAlloc_Free(alloc, p->streams); + p->num = p->numAllocated = 0; + p->streams = 0; +} + +UInt64 Xzs_GetNumBlocks(const CXzs *p) +{ + UInt64 num = 0; + size_t i; + for (i = 0; i < p->num; i++) + num += p->streams[i].numBlocks; + return num; +} + +UInt64 Xzs_GetUnpackSize(const CXzs *p) +{ + UInt64 size = 0; + size_t i; + for (i = 0; i < p->num; i++) + ADD_SIZE_CHECK(size, Xz_GetUnpackSize(&p->streams[i])); + return size; +} + +/* +UInt64 Xzs_GetPackSize(const CXzs *p) +{ + UInt64 size = 0; + size_t i; + for (i = 0; i < p->num; i++) + ADD_SIZE_CHECK(size, Xz_GetTotalSize(&p->streams[i])); + return size; +} +*/ + +SRes Xzs_ReadBackward(CXzs *p, ILookInStream *stream, Int64 *startOffset, ICompressProgress *progress, ISzAllocPtr alloc) +{ + Int64 endOffset = 0; + RINOK(ILookInStream_Seek(stream, &endOffset, SZ_SEEK_END)); + *startOffset = endOffset; + for (;;) + { + CXzStream st; + SRes res; + Xz_Construct(&st); + res = Xz_ReadBackward(&st, stream, startOffset, alloc); + st.startOffset = (UInt64)*startOffset; + RINOK(res); + if (p->num == p->numAllocated) + { + const size_t newNum = p->num + p->num / 4 + 1; + void *data = ISzAlloc_Alloc(alloc, newNum * sizeof(CXzStream)); + if (!data) + return SZ_ERROR_MEM; + p->numAllocated = newNum; + if (p->num != 0) + memcpy(data, p->streams, p->num * sizeof(CXzStream)); + ISzAlloc_Free(alloc, p->streams); + p->streams = (CXzStream *)data; + } + p->streams[p->num++] = st; + if (*startOffset == 0) + break; + RINOK(LookInStream_SeekTo(stream, (UInt64)*startOffset)); + if (progress && ICompressProgress_Progress(progress, (UInt64)(endOffset - *startOffset), (UInt64)(Int64)-1) != SZ_OK) + return SZ_ERROR_PROGRESS; + } + return SZ_OK; +} diff --git a/deps/LZMA-SDK/C/var_clang.mak b/deps/LZMA-SDK/C/var_clang.mak index ee265698e..a6df26e77 100644 --- a/deps/LZMA-SDK/C/var_clang.mak +++ b/deps/LZMA-SDK/C/var_clang.mak @@ -1,11 +1,11 @@ -PLATFORM= -O=b/c -IS_X64= -IS_X86= -IS_ARM64= -CROSS_COMPILE= -MY_ARCH= -USE_ASM= -CC=$(CROSS_COMPILE)clang -CXX=$(CROSS_COMPILE)clang++ -USE_CLANG=1 +PLATFORM= +O=b/c +IS_X64= +IS_X86= +IS_ARM64= +CROSS_COMPILE= +MY_ARCH= +USE_ASM= +CC=$(CROSS_COMPILE)clang +CXX=$(CROSS_COMPILE)clang++ +USE_CLANG=1 diff --git a/deps/LZMA-SDK/C/var_clang_arm64.mak b/deps/LZMA-SDK/C/var_clang_arm64.mak index 1e82d2eb6..4b3540969 100644 --- a/deps/LZMA-SDK/C/var_clang_arm64.mak +++ b/deps/LZMA-SDK/C/var_clang_arm64.mak @@ -1,11 +1,11 @@ -PLATFORM=arm64 -O=b/c_$(PLATFORM) -IS_X64= -IS_X86= -IS_ARM64=1 -CROSS_COMPILE= -MY_ARCH= -USE_ASM=1 -CC=$(CROSS_COMPILE)clang -CXX=$(CROSS_COMPILE)clang++ -USE_CLANG=1 +PLATFORM=arm64 +O=b/c_$(PLATFORM) +IS_X64= +IS_X86= +IS_ARM64=1 +CROSS_COMPILE= +MY_ARCH= +USE_ASM=1 +CC=$(CROSS_COMPILE)clang +CXX=$(CROSS_COMPILE)clang++ +USE_CLANG=1 diff --git a/deps/LZMA-SDK/C/var_clang_x64.mak b/deps/LZMA-SDK/C/var_clang_x64.mak index d9013e1cd..34e1b49c5 100644 --- a/deps/LZMA-SDK/C/var_clang_x64.mak +++ b/deps/LZMA-SDK/C/var_clang_x64.mak @@ -1,12 +1,11 @@ -PLATFORM=x64 -O=b/c_$(PLATFORM) -IS_X64=1 -IS_X86= -IS_ARM64= -CROSS_COMPILE= -MY_ARCH= -USE_ASM=1 -CC=$(CROSS_COMPILE)clang -CXX=$(CROSS_COMPILE)clang++ -USE_CLANG=1 - +PLATFORM=x64 +O=b/c_$(PLATFORM) +IS_X64=1 +IS_X86= +IS_ARM64= +CROSS_COMPILE= +MY_ARCH= +USE_ASM=1 +CC=$(CROSS_COMPILE)clang +CXX=$(CROSS_COMPILE)clang++ +USE_CLANG=1 diff --git a/deps/LZMA-SDK/C/var_clang_x86.mak b/deps/LZMA-SDK/C/var_clang_x86.mak index 9ab916a70..bd2317c29 100644 --- a/deps/LZMA-SDK/C/var_clang_x86.mak +++ b/deps/LZMA-SDK/C/var_clang_x86.mak @@ -1,12 +1,11 @@ -PLATFORM=x86 -O=b/c_$(PLATFORM) -IS_X64= -IS_X86=1 -IS_ARM64= -CROSS_COMPILE= -MY_ARCH=-m32 -USE_ASM=1 -CC=$(CROSS_COMPILE)clang -CXX=$(CROSS_COMPILE)clang++ -USE_CLANG=1 - +PLATFORM=x86 +O=b/c_$(PLATFORM) +IS_X64= +IS_X86=1 +IS_ARM64= +CROSS_COMPILE= +MY_ARCH=-m32 +USE_ASM=1 +CC=$(CROSS_COMPILE)clang +CXX=$(CROSS_COMPILE)clang++ +USE_CLANG=1 diff --git a/deps/LZMA-SDK/C/var_gcc.mak b/deps/LZMA-SDK/C/var_gcc.mak index 803c8de9d..664491cf2 100644 --- a/deps/LZMA-SDK/C/var_gcc.mak +++ b/deps/LZMA-SDK/C/var_gcc.mak @@ -1,12 +1,12 @@ -PLATFORM= -O=b/g -IS_X64= -IS_X86= -IS_ARM64= -CROSS_COMPILE= -MY_ARCH= -USE_ASM= -CC=$(CROSS_COMPILE)gcc -CXX=$(CROSS_COMPILE)g++ - -# -march=armv8-a+crc+crypto +PLATFORM= +O=b/g +IS_X64= +IS_X86= +IS_ARM64= +CROSS_COMPILE= +MY_ARCH= +USE_ASM= +CC=$(CROSS_COMPILE)gcc +CXX=$(CROSS_COMPILE)g++ + +# -march=armv8-a+crc+crypto diff --git a/deps/LZMA-SDK/C/var_gcc_arm64.mak b/deps/LZMA-SDK/C/var_gcc_arm64.mak index 562cfaa6d..4bbb687db 100644 --- a/deps/LZMA-SDK/C/var_gcc_arm64.mak +++ b/deps/LZMA-SDK/C/var_gcc_arm64.mak @@ -1,12 +1,12 @@ -PLATFORM=arm64 -O=b/g_$(PLATFORM) -IS_X64= -IS_X86= -IS_ARM64=1 -CROSS_COMPILE= -MY_ARCH=-mtune=cortex-a53 -USE_ASM=1 -CC=$(CROSS_COMPILE)gcc -CXX=$(CROSS_COMPILE)g++ - -# -march=armv8-a+crc+crypto +PLATFORM=arm64 +O=b/g_$(PLATFORM) +IS_X64= +IS_X86= +IS_ARM64=1 +CROSS_COMPILE= +MY_ARCH=-mtune=cortex-a53 +USE_ASM=1 +CC=$(CROSS_COMPILE)gcc +CXX=$(CROSS_COMPILE)g++ + +# -march=armv8-a+crc+crypto diff --git a/deps/LZMA-SDK/C/var_gcc_x64.mak b/deps/LZMA-SDK/C/var_gcc_x64.mak index 1b965b21b..1acf604f5 100644 --- a/deps/LZMA-SDK/C/var_gcc_x64.mak +++ b/deps/LZMA-SDK/C/var_gcc_x64.mak @@ -1,10 +1,10 @@ -PLATFORM=x64 -O=b/g_$(PLATFORM) -IS_X64=1 -IS_X86= -IS_ARM64= -CROSS_COMPILE= -MY_ARCH= -USE_ASM=1 -CC=$(CROSS_COMPILE)gcc -CXX=$(CROSS_COMPILE)g++ +PLATFORM=x64 +O=b/g_$(PLATFORM) +IS_X64=1 +IS_X86= +IS_ARM64= +CROSS_COMPILE= +MY_ARCH= +USE_ASM=1 +CC=$(CROSS_COMPILE)gcc +CXX=$(CROSS_COMPILE)g++ diff --git a/deps/LZMA-SDK/C/var_gcc_x86.mak b/deps/LZMA-SDK/C/var_gcc_x86.mak index 9eada64e1..f0718ec71 100644 --- a/deps/LZMA-SDK/C/var_gcc_x86.mak +++ b/deps/LZMA-SDK/C/var_gcc_x86.mak @@ -1,11 +1,10 @@ -PLATFORM=x86 -O=b/g_$(PLATFORM) -IS_X64= -IS_X86=1 -IS_ARM64= -CROSS_COMPILE= -MY_ARCH=-m32 -USE_ASM=1 -CC=$(CROSS_COMPILE)gcc -CXX=$(CROSS_COMPILE)g++ - +PLATFORM=x86 +O=b/g_$(PLATFORM) +IS_X64= +IS_X86=1 +IS_ARM64= +CROSS_COMPILE= +MY_ARCH=-m32 +USE_ASM=1 +CC=$(CROSS_COMPILE)gcc +CXX=$(CROSS_COMPILE)g++ diff --git a/deps/LZMA-SDK/C/var_mac_arm64.mak b/deps/LZMA-SDK/C/var_mac_arm64.mak index 0ba414230..adf5fa1d7 100644 --- a/deps/LZMA-SDK/C/var_mac_arm64.mak +++ b/deps/LZMA-SDK/C/var_mac_arm64.mak @@ -1,11 +1,11 @@ -PLATFORM=arm64 -O=b/m_$(PLATFORM) -IS_X64= -IS_X86= -IS_ARM64=1 -CROSS_COMPILE= -MY_ARCH=-arch arm64 -USE_ASM=1 -CC=$(CROSS_COMPILE)clang -CXX=$(CROSS_COMPILE)clang++ -USE_CLANG=1 +PLATFORM=arm64 +O=b/m_$(PLATFORM) +IS_X64= +IS_X86= +IS_ARM64=1 +CROSS_COMPILE= +MY_ARCH=-arch arm64 +USE_ASM=1 +CC=$(CROSS_COMPILE)clang +CXX=$(CROSS_COMPILE)clang++ +USE_CLANG=1 diff --git a/deps/LZMA-SDK/C/var_mac_x64.mak b/deps/LZMA-SDK/C/var_mac_x64.mak index 92b15c8b7..13d7aa7fe 100644 --- a/deps/LZMA-SDK/C/var_mac_x64.mak +++ b/deps/LZMA-SDK/C/var_mac_x64.mak @@ -1,11 +1,11 @@ -PLATFORM=x64 -O=b/m_$(PLATFORM) -IS_X64=1 -IS_X86= -IS_ARM64= -CROSS_COMPILE= -MY_ARCH=-arch x86_64 -USE_ASM= -CC=$(CROSS_COMPILE)clang -CXX=$(CROSS_COMPILE)clang++ -USE_CLANG=1 +PLATFORM=x64 +O=b/m_$(PLATFORM) +IS_X64=1 +IS_X86= +IS_ARM64= +CROSS_COMPILE= +MY_ARCH=-arch x86_64 +USE_ASM= +CC=$(CROSS_COMPILE)clang +CXX=$(CROSS_COMPILE)clang++ +USE_CLANG=1 diff --git a/deps/LZMA-SDK/C/warn_clang.mak b/deps/LZMA-SDK/C/warn_clang.mak index a299fbc4d..ed4f908f6 100644 --- a/deps/LZMA-SDK/C/warn_clang.mak +++ b/deps/LZMA-SDK/C/warn_clang.mak @@ -1,37 +1,37 @@ -CFLAGS_WARN_CLANG_3_8_UNIQ = \ - -Wno-reserved-id-macro \ - -Wno-old-style-cast \ - -Wno-c++11-long-long \ - -Wno-unused-macros \ - -CFLAGS_WARN_CLANG_3_8 = \ - $(CFLAGS_WARN_CLANG_3_8_UNIQ) \ - -Weverything \ - -Wno-extra-semi \ - -Wno-sign-conversion \ - -Wno-language-extension-token \ - -Wno-global-constructors \ - -Wno-non-virtual-dtor \ - -Wno-switch-enum \ - -Wno-covered-switch-default \ - -Wno-cast-qual \ - -Wno-padded \ - -Wno-exit-time-destructors \ - -Wno-weak-vtables \ - -CFLAGS_WARN_CLANG_12= $(CFLAGS_WARN_CLANG_3_8) \ - -Wno-extra-semi-stmt \ - -Wno-zero-as-null-pointer-constant \ - -Wno-deprecated-dynamic-exception-spec \ - -Wno-c++98-compat-pedantic \ - -Wno-atomic-implicit-seq-cst \ - -Wconversion \ - -Wno-sign-conversion \ - -CFLAGS_WARN_1 = \ - -Wno-deprecated-copy-dtor \ - - - - -CFLAGS_WARN = $(CFLAGS_WARN_CLANG_12) $(CFLAGS_WARN_1) +CFLAGS_WARN_CLANG_3_8_UNIQ = \ + -Wno-reserved-id-macro \ + -Wno-old-style-cast \ + -Wno-c++11-long-long \ + -Wno-unused-macros \ + +CFLAGS_WARN_CLANG_3_8 = \ + $(CFLAGS_WARN_CLANG_3_8_UNIQ) \ + -Weverything \ + -Wno-extra-semi \ + -Wno-sign-conversion \ + -Wno-language-extension-token \ + -Wno-global-constructors \ + -Wno-non-virtual-dtor \ + -Wno-switch-enum \ + -Wno-covered-switch-default \ + -Wno-cast-qual \ + -Wno-padded \ + -Wno-exit-time-destructors \ + -Wno-weak-vtables \ + +CFLAGS_WARN_CLANG_12= $(CFLAGS_WARN_CLANG_3_8) \ + -Wno-extra-semi-stmt \ + -Wno-zero-as-null-pointer-constant \ + -Wno-deprecated-dynamic-exception-spec \ + -Wno-c++98-compat-pedantic \ + -Wno-atomic-implicit-seq-cst \ + -Wconversion \ + -Wno-sign-conversion \ + +CFLAGS_WARN_1 = \ + -Wno-deprecated-copy-dtor \ + + + + +CFLAGS_WARN = $(CFLAGS_WARN_CLANG_12) $(CFLAGS_WARN_1) diff --git a/deps/LZMA-SDK/C/warn_clang_mac.mak b/deps/LZMA-SDK/C/warn_clang_mac.mak index cfbbda073..41044a2ce 100644 --- a/deps/LZMA-SDK/C/warn_clang_mac.mak +++ b/deps/LZMA-SDK/C/warn_clang_mac.mak @@ -1,37 +1,37 @@ -CFLAGS_WARN_CLANG_3_8_UNIQ = \ - -Wno-reserved-id-macro \ - -Wno-old-style-cast \ - -Wno-c++11-long-long \ - -Wno-unused-macros \ - -CFLAGS_WARN_CLANG_3_8 = \ - $(CFLAGS_WARN_CLANG_3_8_UNIQ) \ - -Weverything \ - -Wno-extra-semi \ - -Wno-sign-conversion \ - -Wno-language-extension-token \ - -Wno-global-constructors \ - -Wno-non-virtual-dtor \ - -Wno-switch-enum \ - -Wno-covered-switch-default \ - -Wno-cast-qual \ - -Wno-padded \ - -Wno-exit-time-destructors \ - -Wno-weak-vtables \ - -CFLAGS_WARN_CLANG_12= $(CFLAGS_WARN_CLANG_3_8) \ - -Wno-extra-semi-stmt \ - -Wno-zero-as-null-pointer-constant \ - -Wno-deprecated-dynamic-exception-spec \ - -Wno-c++98-compat-pedantic \ - -Wno-atomic-implicit-seq-cst \ - -Wconversion \ - -Wno-sign-conversion \ - -CFLAGS_WARN_MAC = \ - -Wno-poison-system-directories \ - -Wno-c++11-long-long \ - -Wno-atomic-implicit-seq-cst \ - - -CFLAGS_WARN = $(CFLAGS_WARN_CLANG_12) $(CFLAGS_WARN_MAC) +CFLAGS_WARN_CLANG_3_8_UNIQ = \ + -Wno-reserved-id-macro \ + -Wno-old-style-cast \ + -Wno-c++11-long-long \ + -Wno-unused-macros \ + +CFLAGS_WARN_CLANG_3_8 = \ + $(CFLAGS_WARN_CLANG_3_8_UNIQ) \ + -Weverything \ + -Wno-extra-semi \ + -Wno-sign-conversion \ + -Wno-language-extension-token \ + -Wno-global-constructors \ + -Wno-non-virtual-dtor \ + -Wno-switch-enum \ + -Wno-covered-switch-default \ + -Wno-cast-qual \ + -Wno-padded \ + -Wno-exit-time-destructors \ + -Wno-weak-vtables \ + +CFLAGS_WARN_CLANG_12= $(CFLAGS_WARN_CLANG_3_8) \ + -Wno-extra-semi-stmt \ + -Wno-zero-as-null-pointer-constant \ + -Wno-deprecated-dynamic-exception-spec \ + -Wno-c++98-compat-pedantic \ + -Wno-atomic-implicit-seq-cst \ + -Wconversion \ + -Wno-sign-conversion \ + +CFLAGS_WARN_MAC = \ + -Wno-poison-system-directories \ + -Wno-c++11-long-long \ + -Wno-atomic-implicit-seq-cst \ + + +CFLAGS_WARN = $(CFLAGS_WARN_CLANG_12) $(CFLAGS_WARN_MAC) diff --git a/deps/LZMA-SDK/C/warn_gcc.mak b/deps/LZMA-SDK/C/warn_gcc.mak index 3ae796480..7aab7a449 100644 --- a/deps/LZMA-SDK/C/warn_gcc.mak +++ b/deps/LZMA-SDK/C/warn_gcc.mak @@ -1,53 +1,51 @@ -CFLAGS_WARN_GCC_4_5 = \ - -CFLAGS_WARN_GCC_6 = \ - -Waddress \ - -Waggressive-loop-optimizations \ - -Wattributes \ - -Wbool-compare \ - -Wcast-align \ - -Wcomment \ - -Wdiv-by-zero \ - -Wduplicated-cond \ - -Wformat-contains-nul \ - -Winit-self \ - -Wint-to-pointer-cast \ - -Wunused \ - -Wunused-macros \ - -# -Wno-strict-aliasing - -CFLAGS_WARN_GCC_9 = \ - -Waddress \ - -Waddress-of-packed-member \ - -Waggressive-loop-optimizations \ - -Wattributes \ - -Wbool-compare \ - -Wbool-operation \ - -Wcast-align \ - -Wcast-align=strict \ - -Wcomment \ - -Wdangling-else \ - -Wdiv-by-zero \ - -Wduplicated-branches \ - -Wduplicated-cond \ - -Wformat-contains-nul \ - -Wimplicit-fallthrough=5 \ - -Winit-self \ - -Wint-in-bool-context \ - -Wint-to-pointer-cast \ - -Wunused \ - -Wunused-macros \ - -Wconversion \ - -# -Wno-sign-conversion \ - -CFLAGS_WARN_GCC_PPMD_UNALIGNED = \ - -Wno-strict-aliasing \ - - -CFLAGS_WARN = $(CFLAGS_WARN_GCC_9) \ - -# $(CFLAGS_WARN_GCC_PPMD_UNALIGNED) - - \ No newline at end of file +CFLAGS_WARN_GCC_4_5 = \ + +CFLAGS_WARN_GCC_6 = \ + -Waddress \ + -Waggressive-loop-optimizations \ + -Wattributes \ + -Wbool-compare \ + -Wcast-align \ + -Wcomment \ + -Wdiv-by-zero \ + -Wduplicated-cond \ + -Wformat-contains-nul \ + -Winit-self \ + -Wint-to-pointer-cast \ + -Wunused \ + -Wunused-macros \ + +# -Wno-strict-aliasing + +CFLAGS_WARN_GCC_9 = \ + -Waddress \ + -Waddress-of-packed-member \ + -Waggressive-loop-optimizations \ + -Wattributes \ + -Wbool-compare \ + -Wbool-operation \ + -Wcast-align \ + -Wcast-align=strict \ + -Wcomment \ + -Wdangling-else \ + -Wdiv-by-zero \ + -Wduplicated-branches \ + -Wduplicated-cond \ + -Wformat-contains-nul \ + -Wimplicit-fallthrough=5 \ + -Winit-self \ + -Wint-in-bool-context \ + -Wint-to-pointer-cast \ + -Wunused \ + -Wunused-macros \ + -Wconversion \ + +# -Wno-sign-conversion \ + +CFLAGS_WARN_GCC_PPMD_UNALIGNED = \ + -Wno-strict-aliasing \ + + +CFLAGS_WARN = $(CFLAGS_WARN_GCC_9) \ + +# $(CFLAGS_WARN_GCC_PPMD_UNALIGNED) diff --git a/deps/LZMA-SDK/DOC/7zC.txt b/deps/LZMA-SDK/DOC/7zC.txt index 49276787f..939b720f9 100644 --- a/deps/LZMA-SDK/DOC/7zC.txt +++ b/deps/LZMA-SDK/DOC/7zC.txt @@ -1,187 +1,187 @@ -7z ANSI-C Decoder 9.35 ----------------------- - -7z ANSI-C provides 7z/LZMA decoding. -7z ANSI-C version is simplified version ported from C++ code. - -LZMA is default and general compression method of 7z format -in 7-Zip compression program (www.7-zip.org). LZMA provides high -compression ratio and very fast decompression. - - -LICENSE -------- - -7z ANSI-C Decoder is part of the LZMA SDK. -LZMA SDK is written and placed in the public domain by Igor Pavlov. - -Files ---------------------- - -7zDecode.* - Low level 7z decoding -7zExtract.* - High level 7z decoding -7zHeader.* - .7z format constants -7zIn.* - .7z archive opening -7zItem.* - .7z structures -7zMain.c - Test application - - -How To Use ----------- - -You can create .7z archive with 7z.exe, 7za.exe or 7zr.exe: - - 7z.exe a archive.7z *.htm -r -mx -m0fb=255 - -If you have big number of files in archive, and you need fast extracting, -you can use partly-solid archives: - - 7za.exe a archive.7z *.htm -ms=512K -r -mx -m0fb=255 -m0d=512K - -In that example 7-Zip will use 512KB solid blocks. So it needs to decompress only -512KB for extracting one file from such archive. - - -Limitations of current version of 7z ANSI-C Decoder ---------------------------------------------------- - - - It reads only "FileName", "Size", "LastWriteTime" and "CRC" information for each file in archive. - - It supports only LZMA and Copy (no compression) methods with BCJ or BCJ2 filters. - - It converts original UTF-16 Unicode file names to UTF-8 Unicode file names. - -These limitations will be fixed in future versions. - - -Using 7z ANSI-C Decoder Test application: ------------------------------------------ - -Usage: 7zDec - -: - e: Extract files from archive - l: List contents of archive - t: Test integrity of archive - -Example: - - 7zDec l archive.7z - -lists contents of archive.7z - - 7zDec e archive.7z - -extracts files from archive.7z to current folder. - - -How to use .7z Decoder ----------------------- - -Memory allocation -~~~~~~~~~~~~~~~~~ - -7z Decoder uses two memory pools: -1) Temporary pool -2) Main pool -Such scheme can allow you to avoid fragmentation of allocated blocks. - - -Steps for using 7z decoder --------------------------- - -Use code at 7zMain.c as example. - -1) Declare variables: - inStream /* implements ILookInStream interface */ - CSzArEx db; /* 7z archive database structure */ - ISzAlloc allocImp; /* memory functions for main pool */ - ISzAlloc allocTempImp; /* memory functions for temporary pool */ - -2) call CrcGenerateTable(); function to initialize CRC structures. - -3) call SzArEx_Init(&db); function to initialize db structures. - -4) call SzArEx_Open(&db, inStream, &allocMain, &allocTemp) to open archive - -This function opens archive "inStream" and reads headers to "db". -All items in "db" will be allocated with "allocMain" functions. -SzArEx_Open function allocates and frees temporary structures by "allocTemp" functions. - -5) List items or Extract items - - Listing code: - ~~~~~~~~~~~~~ - - Use SzArEx_GetFileNameUtf16 function. Look example code in C\Util\7z\7zMain.c file. - - - Extracting code: - ~~~~~~~~~~~~~~~~ - - SZ_RESULT SzAr_Extract( - CArchiveDatabaseEx *db, - ILookInStream *inStream, - UInt32 fileIndex, /* index of file */ - UInt32 *blockIndex, /* index of solid block */ - Byte **outBuffer, /* pointer to pointer to output buffer (allocated with allocMain) */ - size_t *outBufferSize, /* buffer size for output buffer */ - size_t *offset, /* offset of stream for required file in *outBuffer */ - size_t *outSizeProcessed, /* size of file in *outBuffer */ - ISzAlloc *allocMain, - ISzAlloc *allocTemp); - - If you need to decompress more than one file, you can send these values from previous call: - blockIndex, - outBuffer, - outBufferSize, - You can consider "outBuffer" as cache of solid block. If your archive is solid, - it will increase decompression speed. - - After decompressing you must free "outBuffer": - allocImp.Free(outBuffer); - -6) call SzArEx_Free(&db, allocImp.Free) to free allocated items in "db". - - - - -Memory requirements for .7z decoding ------------------------------------- - -Memory usage for Archive opening: - - Temporary pool: - - Memory for uncompressed .7z headers - - some other temporary blocks - - Main pool: - - Memory for database: - Estimated size of one file structures in solid archive: - - Size (4 or 8 Bytes) - - CRC32 (4 bytes) - - LastWriteTime (8 bytes) - - Some file information (4 bytes) - - File Name (variable length) + pointer + allocation structures - -Memory usage for archive Decompressing: - - Temporary pool: - - Memory for LZMA decompressing structures - - Main pool: - - Memory for decompressed solid block - - Memory for temprorary buffers, if BCJ2 fileter is used. Usually these - temprorary buffers can be about 15% of solid block size. - - -7z Decoder doesn't allocate memory for compressed blocks. -Instead of this, you must allocate buffer with desired -size before calling 7z Decoder. Use 7zMain.c as example. - - -Defines -------- - -_SZ_ALLOC_DEBUG - define it if you want to debug alloc/free operations to stderr. - - ---- - -http://www.7-zip.org -http://www.7-zip.org/sdk.html -http://www.7-zip.org/support.html +7z ANSI-C Decoder 9.35 +---------------------- + +7z ANSI-C provides 7z/LZMA decoding. +7z ANSI-C version is simplified version ported from C++ code. + +LZMA is default and general compression method of 7z format +in 7-Zip compression program (www.7-zip.org). LZMA provides high +compression ratio and very fast decompression. + + +LICENSE +------- + +7z ANSI-C Decoder is part of the LZMA SDK. +LZMA SDK is written and placed in the public domain by Igor Pavlov. + +Files +--------------------- + +7zDecode.* - Low level 7z decoding +7zExtract.* - High level 7z decoding +7zHeader.* - .7z format constants +7zIn.* - .7z archive opening +7zItem.* - .7z structures +7zMain.c - Test application + + +How To Use +---------- + +You can create .7z archive with 7z.exe, 7za.exe or 7zr.exe: + + 7z.exe a archive.7z *.htm -r -mx -m0fb=255 + +If you have big number of files in archive, and you need fast extracting, +you can use partly-solid archives: + + 7za.exe a archive.7z *.htm -ms=512K -r -mx -m0fb=255 -m0d=512K + +In that example 7-Zip will use 512KB solid blocks. So it needs to decompress only +512KB for extracting one file from such archive. + + +Limitations of current version of 7z ANSI-C Decoder +--------------------------------------------------- + + - It reads only "FileName", "Size", "LastWriteTime" and "CRC" information for each file in archive. + - It supports only LZMA and Copy (no compression) methods with BCJ or BCJ2 filters. + - It converts original UTF-16 Unicode file names to UTF-8 Unicode file names. + +These limitations will be fixed in future versions. + + +Using 7z ANSI-C Decoder Test application: +----------------------------------------- + +Usage: 7zDec + +: + e: Extract files from archive + l: List contents of archive + t: Test integrity of archive + +Example: + + 7zDec l archive.7z + +lists contents of archive.7z + + 7zDec e archive.7z + +extracts files from archive.7z to current folder. + + +How to use .7z Decoder +---------------------- + +Memory allocation +~~~~~~~~~~~~~~~~~ + +7z Decoder uses two memory pools: +1) Temporary pool +2) Main pool +Such scheme can allow you to avoid fragmentation of allocated blocks. + + +Steps for using 7z decoder +-------------------------- + +Use code at 7zMain.c as example. + +1) Declare variables: + inStream /* implements ILookInStream interface */ + CSzArEx db; /* 7z archive database structure */ + ISzAlloc allocImp; /* memory functions for main pool */ + ISzAlloc allocTempImp; /* memory functions for temporary pool */ + +2) call CrcGenerateTable(); function to initialize CRC structures. + +3) call SzArEx_Init(&db); function to initialize db structures. + +4) call SzArEx_Open(&db, inStream, &allocMain, &allocTemp) to open archive + +This function opens archive "inStream" and reads headers to "db". +All items in "db" will be allocated with "allocMain" functions. +SzArEx_Open function allocates and frees temporary structures by "allocTemp" functions. + +5) List items or Extract items + + Listing code: + ~~~~~~~~~~~~~ + + Use SzArEx_GetFileNameUtf16 function. Look example code in C\Util\7z\7zMain.c file. + + + Extracting code: + ~~~~~~~~~~~~~~~~ + + SZ_RESULT SzAr_Extract( + CArchiveDatabaseEx *db, + ILookInStream *inStream, + UInt32 fileIndex, /* index of file */ + UInt32 *blockIndex, /* index of solid block */ + Byte **outBuffer, /* pointer to pointer to output buffer (allocated with allocMain) */ + size_t *outBufferSize, /* buffer size for output buffer */ + size_t *offset, /* offset of stream for required file in *outBuffer */ + size_t *outSizeProcessed, /* size of file in *outBuffer */ + ISzAlloc *allocMain, + ISzAlloc *allocTemp); + + If you need to decompress more than one file, you can send these values from previous call: + blockIndex, + outBuffer, + outBufferSize, + You can consider "outBuffer" as cache of solid block. If your archive is solid, + it will increase decompression speed. + + After decompressing you must free "outBuffer": + allocImp.Free(outBuffer); + +6) call SzArEx_Free(&db, allocImp.Free) to free allocated items in "db". + + + + +Memory requirements for .7z decoding +------------------------------------ + +Memory usage for Archive opening: + - Temporary pool: + - Memory for uncompressed .7z headers + - some other temporary blocks + - Main pool: + - Memory for database: + Estimated size of one file structures in solid archive: + - Size (4 or 8 Bytes) + - CRC32 (4 bytes) + - LastWriteTime (8 bytes) + - Some file information (4 bytes) + - File Name (variable length) + pointer + allocation structures + +Memory usage for archive Decompressing: + - Temporary pool: + - Memory for LZMA decompressing structures + - Main pool: + - Memory for decompressed solid block + - Memory for temprorary buffers, if BCJ2 fileter is used. Usually these + temprorary buffers can be about 15% of solid block size. + + +7z Decoder doesn't allocate memory for compressed blocks. +Instead of this, you must allocate buffer with desired +size before calling 7z Decoder. Use 7zMain.c as example. + + +Defines +------- + +_SZ_ALLOC_DEBUG - define it if you want to debug alloc/free operations to stderr. + + +--- + +http://www.7-zip.org +http://www.7-zip.org/sdk.html +http://www.7-zip.org/support.html diff --git a/deps/LZMA-SDK/DOC/7zFormat.txt b/deps/LZMA-SDK/DOC/7zFormat.txt index 9239e9355..74cdfa418 100644 --- a/deps/LZMA-SDK/DOC/7zFormat.txt +++ b/deps/LZMA-SDK/DOC/7zFormat.txt @@ -1,469 +1,469 @@ -7z Format description (18.06) ----------------------------- - -This file contains description of 7z archive format. -7z archive can contain files compressed with any method. -See "Methods.txt" for description for defined compressing methods. - - -Format structure Overview -------------------------- - -Some fields can be optional. - -Archive structure -~~~~~~~~~~~~~~~~~ -SignatureHeader -[PackedStreams] -[PackedStreamsForHeaders] -[ - Header - or - { - Packed Header - HeaderInfo - } -] - - - -Header structure -~~~~~~~~~~~~~~~~ -{ - ArchiveProperties - AdditionalStreams - { - PackInfo - { - PackPos - NumPackStreams - Sizes[NumPackStreams] - CRCs[NumPackStreams] - } - CodersInfo - { - NumFolders - Folders[NumFolders] - { - NumCoders - CodersInfo[NumCoders] - { - ID - NumInStreams; - NumOutStreams; - PropertiesSize - Properties[PropertiesSize] - } - NumBindPairs - BindPairsInfo[NumBindPairs] - { - InIndex; - OutIndex; - } - PackedIndices - } - UnPackSize[Folders][Folders.NumOutstreams] - CRCs[NumFolders] - } - SubStreamsInfo - { - NumUnPackStreamsInFolders[NumFolders]; - UnPackSizes[] - CRCs[] - } - } - MainStreamsInfo - { - (Same as in AdditionalStreams) - } - FilesInfo - { - NumFiles - Properties[] - { - ID - Size - Data - } - } -} - -HeaderInfo structure -~~~~~~~~~~~~~~~~~~~~ -{ - (Same as in AdditionalStreams) -} - - - -Notes about Notation and encoding ---------------------------------- - -7z uses little endian encoding. - -7z archive format has optional headers that are marked as -[] -Header -[] - -REAL_UINT64 means real UINT64. - -UINT64 means real UINT64 encoded with the following scheme: - - Size of encoding sequence depends from first byte: - First_Byte Extra_Bytes Value - (binary) - 0xxxxxxx : ( xxxxxxx ) - 10xxxxxx BYTE y[1] : ( xxxxxx << (8 * 1)) + y - 110xxxxx BYTE y[2] : ( xxxxx << (8 * 2)) + y - ... - 1111110x BYTE y[6] : ( x << (8 * 6)) + y - 11111110 BYTE y[7] : y - 11111111 BYTE y[8] : y - - - -Property IDs ------------- - -0x00 = kEnd - -0x01 = kHeader - -0x02 = kArchiveProperties - -0x03 = kAdditionalStreamsInfo -0x04 = kMainStreamsInfo -0x05 = kFilesInfo - -0x06 = kPackInfo -0x07 = kUnPackInfo -0x08 = kSubStreamsInfo - -0x09 = kSize -0x0A = kCRC - -0x0B = kFolder - -0x0C = kCodersUnPackSize -0x0D = kNumUnPackStream - -0x0E = kEmptyStream -0x0F = kEmptyFile -0x10 = kAnti - -0x11 = kName -0x12 = kCTime -0x13 = kATime -0x14 = kMTime -0x15 = kWinAttributes -0x16 = kComment - -0x17 = kEncodedHeader - -0x18 = kStartPos -0x19 = kDummy - - -7z format headers ------------------ - -SignatureHeader -~~~~~~~~~~~~~~~ - BYTE kSignature[6] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C}; - - ArchiveVersion - { - BYTE Major; // now = 0 - BYTE Minor; // now = 4 - }; - - UINT32 StartHeaderCRC; - - StartHeader - { - REAL_UINT64 NextHeaderOffset - REAL_UINT64 NextHeaderSize - UINT32 NextHeaderCRC - } - - -........................... - - -ArchiveProperties -~~~~~~~~~~~~~~~~~ -BYTE NID::kArchiveProperties (0x02) -for (;;) -{ - BYTE PropertyType; - if (aType == 0) - break; - UINT64 PropertySize; - BYTE PropertyData[PropertySize]; -} - - -Digests (NumStreams) -~~~~~~~~~~~~~~~~~~~~~ - BYTE AllAreDefined - if (AllAreDefined == 0) - { - for(NumStreams) - BIT Defined - } - UINT32 CRCs[NumDefined] - - -PackInfo -~~~~~~~~~~~~ - BYTE NID::kPackInfo (0x06) - UINT64 PackPos - UINT64 NumPackStreams - - [] - BYTE NID::kSize (0x09) - UINT64 PackSizes[NumPackStreams] - [] - - [] - BYTE NID::kCRC (0x0A) - PackStreamDigests[NumPackStreams] - [] - - BYTE NID::kEnd - - -Folder -~~~~~~ - UINT64 NumCoders; - for (NumCoders) - { - BYTE - { - 0:3 CodecIdSize - 4: Is Complex Coder - 5: There Are Attributes - 6: Reserved - 7: There are more alternative methods. (Not used anymore, must be 0). - } - BYTE CodecId[CodecIdSize] - if (Is Complex Coder) - { - UINT64 NumInStreams; - UINT64 NumOutStreams; - } - if (There Are Attributes) - { - UINT64 PropertiesSize - BYTE Properties[PropertiesSize] - } - } - - NumBindPairs = NumOutStreamsTotal - 1; - - for (NumBindPairs) - { - UINT64 InIndex; - UINT64 OutIndex; - } - - NumPackedStreams = NumInStreamsTotal - NumBindPairs; - if (NumPackedStreams > 1) - for(NumPackedStreams) - { - UINT64 Index; - }; - - - - -Coders Info -~~~~~~~~~~~ - - BYTE NID::kUnPackInfo (0x07) - - - BYTE NID::kFolder (0x0B) - UINT64 NumFolders - BYTE External - switch(External) - { - case 0: - Folders[NumFolders] - case 1: - UINT64 DataStreamIndex - } - - - BYTE ID::kCodersUnPackSize (0x0C) - for(Folders) - for(Folder.NumOutStreams) - UINT64 UnPackSize; - - - [] - BYTE NID::kCRC (0x0A) - UnPackDigests[NumFolders] - [] - - - - BYTE NID::kEnd - - - -SubStreams Info -~~~~~~~~~~~~~~ - BYTE NID::kSubStreamsInfo; (0x08) - - [] - BYTE NID::kNumUnPackStream; (0x0D) - UINT64 NumUnPackStreamsInFolders[NumFolders]; - [] - - - [] - BYTE NID::kSize (0x09) - UINT64 UnPackSizes[] - [] - - - [] - BYTE NID::kCRC (0x0A) - Digests[Number of streams with unknown CRC] - [] - - - BYTE NID::kEnd - - -Streams Info -~~~~~~~~~~~~ - - [] - PackInfo - [] - - - [] - CodersInfo - [] - - - [] - SubStreamsInfo - [] - - BYTE NID::kEnd - - -FilesInfo -~~~~~~~~~ - BYTE NID::kFilesInfo; (0x05) - UINT64 NumFiles - - for (;;) - { - BYTE PropertyType; - if (aType == 0) - break; - - UINT64 Size; - - switch(PropertyType) - { - kEmptyStream: (0x0E) - for(NumFiles) - BIT IsEmptyStream - - kEmptyFile: (0x0F) - for(EmptyStreams) - BIT IsEmptyFile - - kAnti: (0x10) - for(EmptyStreams) - BIT IsAntiFile - - case kCTime: (0x12) - case kATime: (0x13) - case kMTime: (0x14) - BYTE AllAreDefined - if (AllAreDefined == 0) - { - for(NumFiles) - BIT TimeDefined - } - BYTE External; - if(External != 0) - UINT64 DataIndex - [] - for(Definded Items) - REAL_UINT64 Time - [] - - kNames: (0x11) - BYTE External; - if(External != 0) - UINT64 DataIndex - [] - for(Files) - { - wchar_t Names[NameSize]; - wchar_t 0; - } - [] - - kAttributes: (0x15) - BYTE AllAreDefined - if (AllAreDefined == 0) - { - for(NumFiles) - BIT AttributesAreDefined - } - BYTE External; - if(External != 0) - UINT64 DataIndex - [] - for(Definded Attributes) - UINT32 Attributes - [] - } - } - - -Header -~~~~~~ - BYTE NID::kHeader (0x01) - - [] - ArchiveProperties - [] - - [] - BYTE NID::kAdditionalStreamsInfo; (0x03) - StreamsInfo - [] - - [] - BYTE NID::kMainStreamsInfo; (0x04) - StreamsInfo - [] - - [] - FilesInfo - [] - - BYTE NID::kEnd - - -HeaderInfo -~~~~~~~~~~ - [] - BYTE NID::kEncodedHeader; (0x17) - StreamsInfo for Encoded Header - [] - - ---- -End of document +7z Format description (18.06) +---------------------------- + +This file contains description of 7z archive format. +7z archive can contain files compressed with any method. +See "Methods.txt" for description for defined compressing methods. + + +Format structure Overview +------------------------- + +Some fields can be optional. + +Archive structure +~~~~~~~~~~~~~~~~~ +SignatureHeader +[PackedStreams] +[PackedStreamsForHeaders] +[ + Header + or + { + Packed Header + HeaderInfo + } +] + + + +Header structure +~~~~~~~~~~~~~~~~ +{ + ArchiveProperties + AdditionalStreams + { + PackInfo + { + PackPos + NumPackStreams + Sizes[NumPackStreams] + CRCs[NumPackStreams] + } + CodersInfo + { + NumFolders + Folders[NumFolders] + { + NumCoders + CodersInfo[NumCoders] + { + ID + NumInStreams; + NumOutStreams; + PropertiesSize + Properties[PropertiesSize] + } + NumBindPairs + BindPairsInfo[NumBindPairs] + { + InIndex; + OutIndex; + } + PackedIndices + } + UnPackSize[Folders][Folders.NumOutstreams] + CRCs[NumFolders] + } + SubStreamsInfo + { + NumUnPackStreamsInFolders[NumFolders]; + UnPackSizes[] + CRCs[] + } + } + MainStreamsInfo + { + (Same as in AdditionalStreams) + } + FilesInfo + { + NumFiles + Properties[] + { + ID + Size + Data + } + } +} + +HeaderInfo structure +~~~~~~~~~~~~~~~~~~~~ +{ + (Same as in AdditionalStreams) +} + + + +Notes about Notation and encoding +--------------------------------- + +7z uses little endian encoding. + +7z archive format has optional headers that are marked as +[] +Header +[] + +REAL_UINT64 means real UINT64. + +UINT64 means real UINT64 encoded with the following scheme: + + Size of encoding sequence depends from first byte: + First_Byte Extra_Bytes Value + (binary) + 0xxxxxxx : ( xxxxxxx ) + 10xxxxxx BYTE y[1] : ( xxxxxx << (8 * 1)) + y + 110xxxxx BYTE y[2] : ( xxxxx << (8 * 2)) + y + ... + 1111110x BYTE y[6] : ( x << (8 * 6)) + y + 11111110 BYTE y[7] : y + 11111111 BYTE y[8] : y + + + +Property IDs +------------ + +0x00 = kEnd + +0x01 = kHeader + +0x02 = kArchiveProperties + +0x03 = kAdditionalStreamsInfo +0x04 = kMainStreamsInfo +0x05 = kFilesInfo + +0x06 = kPackInfo +0x07 = kUnPackInfo +0x08 = kSubStreamsInfo + +0x09 = kSize +0x0A = kCRC + +0x0B = kFolder + +0x0C = kCodersUnPackSize +0x0D = kNumUnPackStream + +0x0E = kEmptyStream +0x0F = kEmptyFile +0x10 = kAnti + +0x11 = kName +0x12 = kCTime +0x13 = kATime +0x14 = kMTime +0x15 = kWinAttributes +0x16 = kComment + +0x17 = kEncodedHeader + +0x18 = kStartPos +0x19 = kDummy + + +7z format headers +----------------- + +SignatureHeader +~~~~~~~~~~~~~~~ + BYTE kSignature[6] = {'7', 'z', 0xBC, 0xAF, 0x27, 0x1C}; + + ArchiveVersion + { + BYTE Major; // now = 0 + BYTE Minor; // now = 4 + }; + + UINT32 StartHeaderCRC; + + StartHeader + { + REAL_UINT64 NextHeaderOffset + REAL_UINT64 NextHeaderSize + UINT32 NextHeaderCRC + } + + +........................... + + +ArchiveProperties +~~~~~~~~~~~~~~~~~ +BYTE NID::kArchiveProperties (0x02) +for (;;) +{ + BYTE PropertyType; + if (aType == 0) + break; + UINT64 PropertySize; + BYTE PropertyData[PropertySize]; +} + + +Digests (NumStreams) +~~~~~~~~~~~~~~~~~~~~~ + BYTE AllAreDefined + if (AllAreDefined == 0) + { + for(NumStreams) + BIT Defined + } + UINT32 CRCs[NumDefined] + + +PackInfo +~~~~~~~~~~~~ + BYTE NID::kPackInfo (0x06) + UINT64 PackPos + UINT64 NumPackStreams + + [] + BYTE NID::kSize (0x09) + UINT64 PackSizes[NumPackStreams] + [] + + [] + BYTE NID::kCRC (0x0A) + PackStreamDigests[NumPackStreams] + [] + + BYTE NID::kEnd + + +Folder +~~~~~~ + UINT64 NumCoders; + for (NumCoders) + { + BYTE + { + 0:3 CodecIdSize + 4: Is Complex Coder + 5: There Are Attributes + 6: Reserved + 7: There are more alternative methods. (Not used anymore, must be 0). + } + BYTE CodecId[CodecIdSize] + if (Is Complex Coder) + { + UINT64 NumInStreams; + UINT64 NumOutStreams; + } + if (There Are Attributes) + { + UINT64 PropertiesSize + BYTE Properties[PropertiesSize] + } + } + + NumBindPairs = NumOutStreamsTotal - 1; + + for (NumBindPairs) + { + UINT64 InIndex; + UINT64 OutIndex; + } + + NumPackedStreams = NumInStreamsTotal - NumBindPairs; + if (NumPackedStreams > 1) + for(NumPackedStreams) + { + UINT64 Index; + }; + + + + +Coders Info +~~~~~~~~~~~ + + BYTE NID::kUnPackInfo (0x07) + + + BYTE NID::kFolder (0x0B) + UINT64 NumFolders + BYTE External + switch(External) + { + case 0: + Folders[NumFolders] + case 1: + UINT64 DataStreamIndex + } + + + BYTE ID::kCodersUnPackSize (0x0C) + for(Folders) + for(Folder.NumOutStreams) + UINT64 UnPackSize; + + + [] + BYTE NID::kCRC (0x0A) + UnPackDigests[NumFolders] + [] + + + + BYTE NID::kEnd + + + +SubStreams Info +~~~~~~~~~~~~~~ + BYTE NID::kSubStreamsInfo; (0x08) + + [] + BYTE NID::kNumUnPackStream; (0x0D) + UINT64 NumUnPackStreamsInFolders[NumFolders]; + [] + + + [] + BYTE NID::kSize (0x09) + UINT64 UnPackSizes[] + [] + + + [] + BYTE NID::kCRC (0x0A) + Digests[Number of streams with unknown CRC] + [] + + + BYTE NID::kEnd + + +Streams Info +~~~~~~~~~~~~ + + [] + PackInfo + [] + + + [] + CodersInfo + [] + + + [] + SubStreamsInfo + [] + + BYTE NID::kEnd + + +FilesInfo +~~~~~~~~~ + BYTE NID::kFilesInfo; (0x05) + UINT64 NumFiles + + for (;;) + { + BYTE PropertyType; + if (aType == 0) + break; + + UINT64 Size; + + switch(PropertyType) + { + kEmptyStream: (0x0E) + for(NumFiles) + BIT IsEmptyStream + + kEmptyFile: (0x0F) + for(EmptyStreams) + BIT IsEmptyFile + + kAnti: (0x10) + for(EmptyStreams) + BIT IsAntiFile + + case kCTime: (0x12) + case kATime: (0x13) + case kMTime: (0x14) + BYTE AllAreDefined + if (AllAreDefined == 0) + { + for(NumFiles) + BIT TimeDefined + } + BYTE External; + if(External != 0) + UINT64 DataIndex + [] + for(Definded Items) + REAL_UINT64 Time + [] + + kNames: (0x11) + BYTE External; + if(External != 0) + UINT64 DataIndex + [] + for(Files) + { + wchar_t Names[NameSize]; + wchar_t 0; + } + [] + + kAttributes: (0x15) + BYTE AllAreDefined + if (AllAreDefined == 0) + { + for(NumFiles) + BIT AttributesAreDefined + } + BYTE External; + if(External != 0) + UINT64 DataIndex + [] + for(Definded Attributes) + UINT32 Attributes + [] + } + } + + +Header +~~~~~~ + BYTE NID::kHeader (0x01) + + [] + ArchiveProperties + [] + + [] + BYTE NID::kAdditionalStreamsInfo; (0x03) + StreamsInfo + [] + + [] + BYTE NID::kMainStreamsInfo; (0x04) + StreamsInfo + [] + + [] + FilesInfo + [] + + BYTE NID::kEnd + + +HeaderInfo +~~~~~~~~~~ + [] + BYTE NID::kEncodedHeader; (0x17) + StreamsInfo for Encoded Header + [] + + +--- +End of document diff --git a/deps/LZMA-SDK/DOC/Methods.txt b/deps/LZMA-SDK/DOC/Methods.txt index 6d0641bae..d4a1b1dd4 100644 --- a/deps/LZMA-SDK/DOC/Methods.txt +++ b/deps/LZMA-SDK/DOC/Methods.txt @@ -1,173 +1,173 @@ -7-Zip method IDs for 7z and xz archives ---------------------------------------- - -Version: 18.06 -Date: 2018-06-30 - -Each compression or crypto method in 7z is associated with unique binary value (ID). -The length of ID in bytes is arbitrary but it can not exceed 63 bits (8 bytes). - -xz and 7z formats use same ID map. - -If you want to add some new ID, you have two ways: - 1) Write request for allocating IDs to 7-Zip developers. - 2) Generate 8-bytes ID: - - 3F ZZ ZZ ZZ ZZ ZZ MM MM - - 3F - Prefix for random IDs (1 byte) - ZZ ZZ ZZ ZZ ZZ - Developer ID (5 bytes). Use real random bytes. - - MM MM - Method ID (2 bytes) - - You can notify 7-Zip developers about your Developer ID / Method ID. - - Note: Use new ID, if old codec can not decode data encoded with new version. - - -List of defined IDs -------------------- - -00 - Copy - -03 - Delta -04 - BCJ (x86) -05 - PPC (big-endian) -06 - IA64 -07 - ARM (little-endian) -08 - ARMT (little-endian) -09 - SPARC - -21 - LZMA2 - -02.. - Common - 03 [Swap] - - 2 Swap2 - - 4 Swap4 - -03.. - 7z - 01 - - 01 - LZMA - - 03 - [Branch Codecs] - 01 - [x86 Codecs] - 03 - BCJ - 1B - BCJ2 (4 packed streams) - 02 - - 05 - PPC (big-endian) - 03 - - 01 - Alpha - 04 - - 01 - IA64 - 05 - - 01 - ARM (little-endian) - 06 - - 05 - M68 (big-endian) - 07 - - 01 - ARMT (little-endian) - 08 - - 05 - SPARC - - 04 - - 01 - PPMD - - 7F - - 01 - experimental method. - - -04.. - Misc codecs - - 00 - Reserved - - 01 - [Zip] - 00 - Copy (not used. Use {00} instead) - 01 - Shrink - 06 - Implode - 08 - Deflate - 09 - Deflate64 - 0A - Imploding - 0C - BZip2 (not used. Use {040202} instead) - 0E - LZMA (LZMA-zip) - 5F - xz - 60 - Jpeg - 61 - WavPack - 62 - PPMd (PPMd-zip) - 63 - wzAES - - 02 - - 02 - BZip2 - - 03 - [Rar] - 01 - Rar1 - 02 - Rar2 - 03 - Rar3 - 05 - Rar5 - - 04 - [Arj] - 01 - Arj(1,2,3) - 02 - Arj4 - - 05 - [Z] - - 06 - [Lzh] - - 07 - Reserved for 7z - - 08 - [Cab] - - 09 - [NSIS] - 01 - DeflateNSIS - 02 - BZip2NSIS - - F7 - External codecs (that are not included to 7-Zip) - - 0x xx - reserved - - 10 xx - reserved (LZHAM) - 01 - LZHAM - - 11 xx - reserved (Tino Reichardt) - 01 - ZSTD - 02 - BROTLI - 04 - LZ4 - 05 - LZ5 - 06 - LIZARD - - 12 xx - reserverd (Denis Anisimov) - - 01 - WavPack2 - FE - eSplitter - FF - RawSplitter - - -06.. - Crypto - - F0 - Ciphers without hashing algo - - 01 - [AES] - 0x - AES-128 - 4x - AES-192 - 8x - AES-256 - Cx - AES - - x0 - ECB - x1 - CBC - x2 - CFB - x3 - OFB - x4 - CTR - - F1 - Combine Ciphers - - 01 - [Zip] - 01 - ZipCrypto (Main Zip crypto algo) - - 03 - [RAR] - 02 - - 03 - Rar29AES (AES-128 + modified SHA-1) - - 07 - [7z] - 01 - 7zAES (AES-256 + SHA-256) - - ---- -End of document +7-Zip method IDs for 7z and xz archives +--------------------------------------- + +Version: 18.06 +Date: 2018-06-30 + +Each compression or crypto method in 7z is associated with unique binary value (ID). +The length of ID in bytes is arbitrary but it can not exceed 63 bits (8 bytes). + +xz and 7z formats use same ID map. + +If you want to add some new ID, you have two ways: + 1) Write request for allocating IDs to 7-Zip developers. + 2) Generate 8-bytes ID: + + 3F ZZ ZZ ZZ ZZ ZZ MM MM + + 3F - Prefix for random IDs (1 byte) + ZZ ZZ ZZ ZZ ZZ - Developer ID (5 bytes). Use real random bytes. + + MM MM - Method ID (2 bytes) + + You can notify 7-Zip developers about your Developer ID / Method ID. + + Note: Use new ID, if old codec can not decode data encoded with new version. + + +List of defined IDs +------------------- + +00 - Copy + +03 - Delta +04 - BCJ (x86) +05 - PPC (big-endian) +06 - IA64 +07 - ARM (little-endian) +08 - ARMT (little-endian) +09 - SPARC + +21 - LZMA2 + +02.. - Common + 03 [Swap] + - 2 Swap2 + - 4 Swap4 + +03.. - 7z + 01 - + 01 - LZMA + + 03 - [Branch Codecs] + 01 - [x86 Codecs] + 03 - BCJ + 1B - BCJ2 (4 packed streams) + 02 - + 05 - PPC (big-endian) + 03 - + 01 - Alpha + 04 - + 01 - IA64 + 05 - + 01 - ARM (little-endian) + 06 - + 05 - M68 (big-endian) + 07 - + 01 - ARMT (little-endian) + 08 - + 05 - SPARC + + 04 - + 01 - PPMD + + 7F - + 01 - experimental method. + + +04.. - Misc codecs + + 00 - Reserved + + 01 - [Zip] + 00 - Copy (not used. Use {00} instead) + 01 - Shrink + 06 - Implode + 08 - Deflate + 09 - Deflate64 + 0A - Imploding + 0C - BZip2 (not used. Use {040202} instead) + 0E - LZMA (LZMA-zip) + 5F - xz + 60 - Jpeg + 61 - WavPack + 62 - PPMd (PPMd-zip) + 63 - wzAES + + 02 - + 02 - BZip2 + + 03 - [Rar] + 01 - Rar1 + 02 - Rar2 + 03 - Rar3 + 05 - Rar5 + + 04 - [Arj] + 01 - Arj(1,2,3) + 02 - Arj4 + + 05 - [Z] + + 06 - [Lzh] + + 07 - Reserved for 7z + + 08 - [Cab] + + 09 - [NSIS] + 01 - DeflateNSIS + 02 - BZip2NSIS + + F7 - External codecs (that are not included to 7-Zip) + + 0x xx - reserved + + 10 xx - reserved (LZHAM) + 01 - LZHAM + + 11 xx - reserved (Tino Reichardt) + 01 - ZSTD + 02 - BROTLI + 04 - LZ4 + 05 - LZ5 + 06 - LIZARD + + 12 xx - reserverd (Denis Anisimov) + + 01 - WavPack2 + FE - eSplitter + FF - RawSplitter + + +06.. - Crypto + + F0 - Ciphers without hashing algo + + 01 - [AES] + 0x - AES-128 + 4x - AES-192 + 8x - AES-256 + Cx - AES + + x0 - ECB + x1 - CBC + x2 - CFB + x3 - OFB + x4 - CTR + + F1 - Combine Ciphers + + 01 - [Zip] + 01 - ZipCrypto (Main Zip crypto algo) + + 03 - [RAR] + 02 - + 03 - Rar29AES (AES-128 + modified SHA-1) + + 07 - [7z] + 01 - 7zAES (AES-256 + SHA-256) + + +--- +End of document diff --git a/deps/LZMA-SDK/DOC/installer.txt b/deps/LZMA-SDK/DOC/installer.txt index 70ad7dc6a..b99d21d24 100644 --- a/deps/LZMA-SDK/DOC/installer.txt +++ b/deps/LZMA-SDK/DOC/installer.txt @@ -1,166 +1,166 @@ -7-Zip for installers 9.38 -------------------------- - -7-Zip is a file archiver for Windows NT/2000/2003/2008/XP/Vista/7/8/10. - -7-Zip for installers is part of LZMA SDK. -LZMA SDK is written and placed in the public domain by Igor Pavlov. - -It's allowed to join 7-Zip SFX module with another software. -It's allowed to change resources of 7-Zip's SFX modules. - - -HOW to use ------------ - -7zr.exe is reduced version of 7za.exe of 7-Zip. -7zr.exe supports only format with these codecs: LZMA, LZMA2, BCJ, BCJ2, ARM, Copy. - -Example of compressing command for installation packages: - -7zr a archive.7z files - -7zSD.sfx is SFX module for installers. 7zSD.sfx uses msvcrt.dll. - -SFX modules for installers allow to create installation program. -Such module extracts archive to temp folder and then runs specified program and removes -temp files after program finishing. Self-extract archive for installers must be created -as joining 3 files: SFX_Module, Installer_Config, 7z_Archive. -Installer_Config is optional file. You can use the following command to create installer -self-extract archive: - -copy /b 7zSD.sfx + config.txt + archive.7z archive.exe - -The smallest installation package size can be achieved, if installation files was -uncompressed before including to 7z archive. - --y switch for installer module (at runtime) specifies quiet mode for extracting. - -Installer Config file format -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Config file contains commands for Installer. File begins from string -;!@Install@!UTF-8! and ends with ;!@InstallEnd@!. File must be written -in UTF-8 encoding. File contains string pairs: - -ID_String="Value" - -ID_String Description - -Title Title for messages -BeginPrompt Begin Prompt message -Progress Value can be "yes" or "no". Default value is "yes". -RunProgram Command for executing. Default value is "setup.exe". - Substring %%T will be replaced with path to temporary - folder, where files were extracted -Directory Directory prefix for "RunProgram". Default value is ".\\" -ExecuteFile Name of file for executing -ExecuteParameters Parameters for "ExecuteFile" - - -You can omit any string pair. - -There are two ways to run program: RunProgram and ExecuteFile. -Use RunProgram, if you want to run some program from .7z archive. -Use ExecuteFile, if you want to open some document from .7z archive or -if you want to execute some command from Windows. - -If you use RunProgram and if you specify empty directory prefix: Directory="", -the system searches for the executable file in the following sequence: - -1. The directory from which the application (installer) loaded. -2. The temporary folder, where files were extracted. -3. The Windows system directory. - - -Config file Examples -~~~~~~~~~~~~~~~~~~~~ - -;!@Install@!UTF-8! -Title="7-Zip 4.00" -BeginPrompt="Do you want to install the 7-Zip 4.00?" -RunProgram="setup.exe" -;!@InstallEnd@! - - - -;!@Install@!UTF-8! -Title="7-Zip 4.00" -BeginPrompt="Do you want to install the 7-Zip 4.00?" -ExecuteFile="7zip.msi" -;!@InstallEnd@! - - - -;!@Install@!UTF-8! -Title="7-Zip 4.01 Update" -BeginPrompt="Do you want to install the 7-Zip 4.01 Update?" -ExecuteFile="msiexec.exe" -ExecuteParameters="/i 7zip.msi REINSTALL=ALL REINSTALLMODE=vomus" -;!@InstallEnd@! - - - -Small SFX modules for installers --------------------------------- - -7zS2.sfx - small SFX module (GUI version) -7zS2con.sfx - small SFX module (Console version) - -Small SFX modules support this codecs: LZMA, LZMA2, BCJ, BCJ2, ARM, COPY - -Small SFX module is similar to common SFX module for installers. -The difference (what's new in small version): - - Smaller size (30 KB vs 100 KB) - - C source code instead of Ñ++ - - No installer Configuration file - - No extracting progress window - - It decompresses solid 7z blocks (it can be whole 7z archive) to RAM. - So user that calls SFX installer must have free RAM of size of largest - solid 7z block (size of 7z archive at simplest case). - -How to use ----------- - -copy /b 7zS2.sfx + archive.7z sfx.exe - -When you run installer sfx module (sfx.exe) -1) It creates "7zNNNNNNNN" temp folder in system temp folder. -2) It extracts .7z archive to that folder -3) It executes one file from "7zNNNNNNNN" temp folder. -4) It removes "7zNNNNNNNN" temp folder - -You can send parameters to installer, and installer will transfer them to extracted .exe file. - -Small SFX uses 3 levels of priorities to select file to execute: - - 1) Files in root folder have higher priority than files in subfolders. - 2) File extension priorities (from high to low priority order): - bat, cmd, exe, inf, msi, cab (under Windows CE), html, htm - 3) File name priorities (from high to low priority order): - setup, install, run, start - -Windows CE (ARM) version of 7zS2.sfx is included to 7-Zip for Windows Mobile package. - - -Examples --------- - -1) To create compressed console 7-Zip: - -7zr a c.7z 7z.exe 7z.dll -mx -copy /b 7zS2con.sfx + c.7z 7zCompr.exe -7zCompr.exe b -md22 - - -2) To create compressed GUI 7-Zip: - -7zr a g.7z 7zg.exe 7z.dll -mx -copy /b 7zS2.sfx + g.7z 7zgCompr.exe -7zgCompr.exe b -md22 - - -3) To open some file: - -7zr a h.7z readme.txt -mx -copy /b 7zS2.sfx + h.7z 7zTxt.exe -7zTxt.exe +7-Zip for installers 9.38 +------------------------- + +7-Zip is a file archiver for Windows NT/2000/2003/2008/XP/Vista/7/8/10. + +7-Zip for installers is part of LZMA SDK. +LZMA SDK is written and placed in the public domain by Igor Pavlov. + +It's allowed to join 7-Zip SFX module with another software. +It's allowed to change resources of 7-Zip's SFX modules. + + +HOW to use +----------- + +7zr.exe is reduced version of 7za.exe of 7-Zip. +7zr.exe supports only format with these codecs: LZMA, LZMA2, BCJ, BCJ2, ARM, Copy. + +Example of compressing command for installation packages: + +7zr a archive.7z files + +7zSD.sfx is SFX module for installers. 7zSD.sfx uses msvcrt.dll. + +SFX modules for installers allow to create installation program. +Such module extracts archive to temp folder and then runs specified program and removes +temp files after program finishing. Self-extract archive for installers must be created +as joining 3 files: SFX_Module, Installer_Config, 7z_Archive. +Installer_Config is optional file. You can use the following command to create installer +self-extract archive: + +copy /b 7zSD.sfx + config.txt + archive.7z archive.exe + +The smallest installation package size can be achieved, if installation files was +uncompressed before including to 7z archive. + +-y switch for installer module (at runtime) specifies quiet mode for extracting. + +Installer Config file format +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Config file contains commands for Installer. File begins from string +;!@Install@!UTF-8! and ends with ;!@InstallEnd@!. File must be written +in UTF-8 encoding. File contains string pairs: + +ID_String="Value" + +ID_String Description + +Title Title for messages +BeginPrompt Begin Prompt message +Progress Value can be "yes" or "no". Default value is "yes". +RunProgram Command for executing. Default value is "setup.exe". + Substring %%T will be replaced with path to temporary + folder, where files were extracted +Directory Directory prefix for "RunProgram". Default value is ".\\" +ExecuteFile Name of file for executing +ExecuteParameters Parameters for "ExecuteFile" + + +You can omit any string pair. + +There are two ways to run program: RunProgram and ExecuteFile. +Use RunProgram, if you want to run some program from .7z archive. +Use ExecuteFile, if you want to open some document from .7z archive or +if you want to execute some command from Windows. + +If you use RunProgram and if you specify empty directory prefix: Directory="", +the system searches for the executable file in the following sequence: + +1. The directory from which the application (installer) loaded. +2. The temporary folder, where files were extracted. +3. The Windows system directory. + + +Config file Examples +~~~~~~~~~~~~~~~~~~~~ + +;!@Install@!UTF-8! +Title="7-Zip 4.00" +BeginPrompt="Do you want to install the 7-Zip 4.00?" +RunProgram="setup.exe" +;!@InstallEnd@! + + + +;!@Install@!UTF-8! +Title="7-Zip 4.00" +BeginPrompt="Do you want to install the 7-Zip 4.00?" +ExecuteFile="7zip.msi" +;!@InstallEnd@! + + + +;!@Install@!UTF-8! +Title="7-Zip 4.01 Update" +BeginPrompt="Do you want to install the 7-Zip 4.01 Update?" +ExecuteFile="msiexec.exe" +ExecuteParameters="/i 7zip.msi REINSTALL=ALL REINSTALLMODE=vomus" +;!@InstallEnd@! + + + +Small SFX modules for installers +-------------------------------- + +7zS2.sfx - small SFX module (GUI version) +7zS2con.sfx - small SFX module (Console version) + +Small SFX modules support this codecs: LZMA, LZMA2, BCJ, BCJ2, ARM, COPY + +Small SFX module is similar to common SFX module for installers. +The difference (what's new in small version): + - Smaller size (30 KB vs 100 KB) + - C source code instead of Ñ++ + - No installer Configuration file + - No extracting progress window + - It decompresses solid 7z blocks (it can be whole 7z archive) to RAM. + So user that calls SFX installer must have free RAM of size of largest + solid 7z block (size of 7z archive at simplest case). + +How to use +---------- + +copy /b 7zS2.sfx + archive.7z sfx.exe + +When you run installer sfx module (sfx.exe) +1) It creates "7zNNNNNNNN" temp folder in system temp folder. +2) It extracts .7z archive to that folder +3) It executes one file from "7zNNNNNNNN" temp folder. +4) It removes "7zNNNNNNNN" temp folder + +You can send parameters to installer, and installer will transfer them to extracted .exe file. + +Small SFX uses 3 levels of priorities to select file to execute: + + 1) Files in root folder have higher priority than files in subfolders. + 2) File extension priorities (from high to low priority order): + bat, cmd, exe, inf, msi, cab (under Windows CE), html, htm + 3) File name priorities (from high to low priority order): + setup, install, run, start + +Windows CE (ARM) version of 7zS2.sfx is included to 7-Zip for Windows Mobile package. + + +Examples +-------- + +1) To create compressed console 7-Zip: + +7zr a c.7z 7z.exe 7z.dll -mx +copy /b 7zS2con.sfx + c.7z 7zCompr.exe +7zCompr.exe b -md22 + + +2) To create compressed GUI 7-Zip: + +7zr a g.7z 7zg.exe 7z.dll -mx +copy /b 7zS2.sfx + g.7z 7zgCompr.exe +7zgCompr.exe b -md22 + + +3) To open some file: + +7zr a h.7z readme.txt -mx +copy /b 7zS2.sfx + h.7z 7zTxt.exe +7zTxt.exe diff --git a/deps/LZMA-SDK/DOC/lzma-history.txt b/deps/LZMA-SDK/DOC/lzma-history.txt index 3fc19fd8b..0963c7bf7 100644 --- a/deps/LZMA-SDK/DOC/lzma-history.txt +++ b/deps/LZMA-SDK/DOC/lzma-history.txt @@ -1,484 +1,520 @@ -HISTORY of the LZMA SDK ------------------------ - -21.02 alpha 2021-05-06 -------------------------- -- The command line version of 7-Zip for macOS was released. -- The speed for LZMA and LZMA2 decompression in arm64 versions for macOS and Linux - was increased by 20%-60%. - - -21.01 alpha 2021-03-09 -------------------------- -- The command line version of 7-Zip for Linux was released. -- The improvements for speed of ARM64 version using hardware CPU instructions - for AES, CRC-32, SHA-1 and SHA-256. -- Some bugs were fixed. - - -20.02 alpha 2020-08-08 -------------------------- -- The default number of LZMA2 chunks per solid block in 7z archive was increased to 64. - It allows to increase the compression speed for big 7z archives, if there is a big number - of CPU cores and threads. -- The speed of PPMd compressing/decompressing was increased for 7z archives. -- The new -ssp switch. If the switch -ssp is specified, 7-Zip doesn't allow the system - to modify "Last Access Time" property of source files for archiving and hashing operations. -- Some bugs were fixed. - - -20.00 alpha 2020-02-06 -------------------------- -- 7-Zip now supports new optional match finders for LZMA/LZMA2 compression: bt5 and hc5, - that can work faster than bt4 and hc4 match finders for the data with big redundancy. -- The compression ratio was improved for Fast and Fastest compression levels with the - following default settings: - - Fastest level (-mx1) : hc5 match finder with 256 KB dictionary. - - Fast level (-mx3) : hc5 match finder with 4 MB dictionary. -- Minor speed optimizations in multithreaded LZMA/LZMA2 compression for Normal/Maximum/Ultra - compression levels. - - -19.00 2019-02-21 -------------------------- -- Encryption strength for 7z archives was increased: - the size of random initialization vector was increased from 64-bit to 128-bit, - and the pseudo-random number generator was improved. -- The bug in 7zIn.c code was fixed. - - -18.06 2018-12-30 -------------------------- -- The speed for LZMA/LZMA2 compressing was increased by 3-10%, - and there are minor changes in compression ratio. -- Some bugs were fixed. -- The bug in 7-Zip 18.02-18.05 was fixed: - There was memory leak in multithreading xz decoder - XzDecMt_Decode(), - if xz stream contains only one block. -- The changes for MSVS compiler makefiles: - - the makefiles now use "PLATFORM" macroname with values (x64, x86, arm64) - instead of "CPU" macroname with values (AMD64, ARM64). - - the makefiles by default now use static version of the run-time library. - - -18.05 2018-04-30 -------------------------- -- The speed for LZMA/LZMA2 compressing was increased - by 8% for fastest/fast compression levels and - by 3% for normal/maximum compression levels. -- Previous versions of 7-Zip could work incorrectly in "Large memory pages" mode in - Windows 10 because of some BUG with "Large Pages" in Windows 10. - Now 7-Zip doesn't use "Large Pages" on Windows 10 up to revision 1709 (16299). -- The BUG was fixed in Lzma2Enc.c - Lzma2Enc_Encode2() function worked incorretly, - if (inStream == NULL) and the number of block threads is more than 1. - - -18.03 beta 2018-03-04 -------------------------- -- Asm\x86\LzmaDecOpt.asm: new optimized LZMA decoder written in asm - for x64 with about 30% higher speed than main version of LZMA decoder written in C. -- The speed for single-thread LZMA/LZMA2 decoder written in C was increased by 3%. -- 7-Zip now can use multi-threading for 7z/LZMA2 decoding, - if there are multiple independent data chunks in LZMA2 stream. -- 7-Zip now can use multi-threading for xz decoding, - if there are multiple blocks in xz stream. - - -18.01 2019-01-28 -------------------------- -- The BUG in 17.01 - 18.00 beta was fixed: - XzDec.c : random block unpacking and XzUnpacker_IsBlockFinished() - didn't work correctly for xz archives without checksum (CRC). - - -18.00 beta 2019-01-10 -------------------------- -- The BUG in xz encoder was fixed: - There was memory leak of 16 KB for each file compressed with - xz compression method, if additional filter was used. - - -17.01 beta 2017-08-28 -------------------------- -- Minor speed optimization for LZMA2 (xz and 7z) multi-threading compression. - 7-Zip now uses additional memory buffers for multi-block LZMA2 compression. - CPU utilization was slightly improved. -- 7-zip now creates multi-block xz archives by default. Block size can be - specified with -ms[Size]{m|g} switch. -- xz decoder now can unpack random block from multi-block xz archives. -- 7-Zip command line: @listfile now doesn't work after -- switch. - Use -i@listfile before -- switch instead. -- The BUGs were fixed: - 7-Zip 17.00 beta crashed for commands that write anti-item to 7z archive. - - -17.00 beta 2017-04-29 -------------------------- -- NewHandler.h / NewHandler.cpp: - now it redefines operator new() only for old MSVC compilers (_MSC_VER < 1900). -- C/7zTypes.h : the names of variables in interface structures were changed (vt). -- Some bugs were fixed. 7-Zip could crash in some cases. -- Some internal changes in code. - - -16.04 2016-10-04 -------------------------- -- The bug was fixed in DllSecur.c. - - -16.03 2016-09-28 -------------------------- -- SFX modules now use some protection against DLL preloading attack. -- Some bugs in 7z code were fixed. - - -16.02 2016-05-21 -------------------------- -- The BUG in 16.00 - 16.01 was fixed: - Split Handler (SplitHandler.cpp) returned incorrect - total size value (kpidSize) for split archives. - - -16.01 2016-05-19 -------------------------- -- Some internal changes to reduce the number of compiler warnings. - - -16.00 2016-05-10 -------------------------- -- Some bugs were fixed. - - -15.12 2015-11-19 -------------------------- -- The BUG in C version of 7z decoder was fixed: - 7zDec.c : SzDecodeLzma2() - 7z decoder could mistakenly report about decoding error for some 7z archives - that use LZMA2 compression method. - The probability to get that mistaken decoding error report was about - one error per 16384 solid blocks for solid blocks larger than 16 KB (compressed size). -- The BUG (in 9.26-15.11) in C version of 7z decoder was fixed: - 7zArcIn.c : SzReadHeader2() - 7z decoder worked incorrectly for 7z archives that contain - empty solid blocks, that can be placed to 7z archive, if some file is - unavailable for reading during archive creation. - - -15.09 beta 2015-10-16 -------------------------- -- The BUG in LZMA / LZMA2 encoding code was fixed. - The BUG in LzFind.c::MatchFinder_ReadBlock() function. - If input data size is larger than (4 GiB - dictionary_size), - the following code worked incorrectly: - - LZMA : LzmaEnc_MemEncode(), LzmaEncode() : LZMA encoding functions - for compressing from memory to memory. - That BUG is not related to LZMA encoder version that works via streams. - - LZMA2 : multi-threaded version of LZMA2 encoder worked incorrectly, if - default value of chunk size (CLzma2EncProps::blockSize) is changed - to value larger than (4 GiB - dictionary_size). - - -9.38 beta 2015-01-03 -------------------------- -- The BUG in 9.31-9.37 was fixed: - IArchiveGetRawProps interface was disabled for 7z archives. -- The BUG in 9.26-9.36 was fixed: - Some code in CPP\7zip\Archive\7z\ worked correctly only under Windows. - - -9.36 beta 2014-12-26 -------------------------- -- The BUG in command line version was fixed: - 7-Zip created temporary archive in current folder during update archive - operation, if -w{Path} switch was not specified. - The fixed 7-Zip creates temporary archive in folder that contains updated archive. -- The BUG in 9.33-9.35 was fixed: - 7-Zip silently ignored file reading errors during 7z or gz archive creation, - and the created archive contained only part of file that was read before error. - The fixed 7-Zip stops archive creation and it reports about error. - - -9.35 beta 2014-12-07 -------------------------- -- 7zr.exe now support AES encryption. -- SFX mudules were added to LZMA SDK -- Some bugs were fixed. - - -9.21 beta 2011-04-11 -------------------------- -- New class FString for file names at file systems. -- Speed optimization in CRC code for big-endian CPUs. -- The BUG in Lzma2Dec.c was fixed: - Lzma2Decode function didn't work. - - -9.18 beta 2010-11-02 -------------------------- -- New small SFX module for installers (SfxSetup). - - -9.12 beta 2010-03-24 -------------------------- -- The BUG in LZMA SDK 9.* was fixed: LZMA2 codec didn't work, - if more than 10 threads were used (or more than 20 threads in some modes). - - -9.11 beta 2010-03-15 -------------------------- -- PPMd compression method support - - -9.09 2009-12-12 -------------------------- -- The bug was fixed: - Utf16_To_Utf8 funstions in UTFConvert.cpp and 7zMain.c - incorrectly converted surrogate characters (the code >= 0x10000) to UTF-8. -- Some bugs were fixed - - -9.06 2009-08-17 -------------------------- -- Some changes in ANSI-C 7z Decoder interfaces. - - -9.04 2009-05-30 -------------------------- -- LZMA2 compression method support -- xz format support - - -4.65 2009-02-03 -------------------------- -- Some minor fixes - - -4.63 2008-12-31 -------------------------- -- Some minor fixes - - -4.61 beta 2008-11-23 -------------------------- -- The bug in ANSI-C LZMA Decoder was fixed: - If encoded stream was corrupted, decoder could access memory - outside of allocated range. -- Some changes in ANSI-C 7z Decoder interfaces. -- LZMA SDK is placed in the public domain. - - -4.60 beta 2008-08-19 -------------------------- -- Some minor fixes. - - -4.59 beta 2008-08-13 -------------------------- -- The bug was fixed: - LZMA Encoder in fast compression mode could access memory outside of - allocated range in some rare cases. - - -4.58 beta 2008-05-05 -------------------------- -- ANSI-C LZMA Decoder was rewritten for speed optimizations. -- ANSI-C LZMA Encoder was included to LZMA SDK. -- C++ LZMA code now is just wrapper over ANSI-C code. - - -4.57 2007-12-12 -------------------------- -- Speed optimizations in Ñ++ LZMA Decoder. -- Small changes for more compatibility with some C/C++ compilers. - - -4.49 beta 2007-07-05 -------------------------- -- .7z ANSI-C Decoder: - - now it supports BCJ and BCJ2 filters - - now it supports files larger than 4 GB. - - now it supports "Last Write Time" field for files. -- C++ code for .7z archives compressing/decompressing from 7-zip - was included to LZMA SDK. - - -4.43 2006-06-04 -------------------------- -- Small changes for more compatibility with some C/C++ compilers. - - -4.42 2006-05-15 -------------------------- -- Small changes in .h files in ANSI-C version. - - -4.39 beta 2006-04-14 -------------------------- -- The bug in versions 4.33b:4.38b was fixed: - C++ version of LZMA encoder could not correctly compress - files larger than 2 GB with HC4 match finder (-mfhc4). - - -4.37 beta 2005-04-06 -------------------------- -- Fixes in C++ code: code could no be compiled if _NO_EXCEPTIONS was defined. - - -4.35 beta 2005-03-02 -------------------------- -- The bug was fixed in C++ version of LZMA Decoder: - If encoded stream was corrupted, decoder could access memory - outside of allocated range. - - -4.34 beta 2006-02-27 -------------------------- -- Compressing speed and memory requirements for compressing were increased -- LZMA now can use only these match finders: HC4, BT2, BT3, BT4 - - -4.32 2005-12-09 -------------------------- -- Java version of LZMA SDK was included - - -4.30 2005-11-20 -------------------------- -- Compression ratio was improved in -a2 mode -- Speed optimizations for compressing in -a2 mode -- -fb switch now supports values up to 273 -- The bug in 7z_C (7zIn.c) was fixed: - It used Alloc/Free functions from different memory pools. - So if program used two memory pools, it worked incorrectly. -- 7z_C: .7z format supporting was improved -- LZMA# SDK (C#.NET version) was included - - -4.27 (Updated) 2005-09-21 -------------------------- -- Some GUIDs/interfaces in C++ were changed. - IStream.h: - ISequentialInStream::Read now works as old ReadPart - ISequentialOutStream::Write now works as old WritePart - - -4.27 2005-08-07 -------------------------- -- The bug in LzmaDecodeSize.c was fixed: - if _LZMA_IN_CB and _LZMA_OUT_READ were defined, - decompressing worked incorrectly. - - -4.26 2005-08-05 -------------------------- -- Fixes in 7z_C code and LzmaTest.c: - previous versions could work incorrectly, - if malloc(0) returns 0 - - -4.23 2005-06-29 -------------------------- -- Small fixes in C++ code - - -4.22 2005-06-10 -------------------------- -- Small fixes - - -4.21 2005-06-08 -------------------------- -- Interfaces for ANSI-C LZMA Decoder (LzmaDecode.c) were changed -- New additional version of ANSI-C LZMA Decoder with zlib-like interface: - - LzmaStateDecode.h - - LzmaStateDecode.c - - LzmaStateTest.c -- ANSI-C LZMA Decoder now can decompress files larger than 4 GB - - -4.17 2005-04-18 -------------------------- -- New example for RAM->RAM compressing/decompressing: - LZMA + BCJ (filter for x86 code): - - LzmaRam.h - - LzmaRam.cpp - - LzmaRamDecode.h - - LzmaRamDecode.c - - -f86 switch for lzma.exe - - -4.16 2005-03-29 -------------------------- -- The bug was fixed in LzmaDecode.c (ANSI-C LZMA Decoder): - If _LZMA_OUT_READ was defined, and if encoded stream was corrupted, - decoder could access memory outside of allocated range. -- Speed optimization of ANSI-C LZMA Decoder (now it's about 20% faster). - Old version of LZMA Decoder now is in file LzmaDecodeSize.c. - LzmaDecodeSize.c can provide slightly smaller code than LzmaDecode.c -- Small speed optimization in LZMA C++ code -- filter for SPARC's code was added -- Simplified version of .7z ANSI-C Decoder was included - - -4.06 2004-09-05 -------------------------- -- The bug in v4.05 was fixed: - LZMA-Encoder didn't release output stream in some cases. - - -4.05 2004-08-25 -------------------------- -- Source code of filters for x86, IA-64, ARM, ARM-Thumb - and PowerPC code was included to SDK -- Some internal minor changes - - -4.04 2004-07-28 -------------------------- -- More compatibility with some C++ compilers - - -4.03 2004-06-18 -------------------------- -- "Benchmark" command was added. It measures compressing - and decompressing speed and shows rating values. - Also it checks hardware errors. - - -4.02 2004-06-10 -------------------------- -- C++ LZMA Encoder/Decoder code now is more portable - and it can be compiled by GCC on Linux. - - -4.01 2004-02-15 -------------------------- -- Some detection of data corruption was enabled. - LzmaDecode.c / RangeDecoderReadByte - ..... - { - rd->ExtraBytes = 1; - return 0xFF; - } - - -4.00 2004-02-13 -------------------------- -- Original version of LZMA SDK - - - -HISTORY of the LZMA -------------------- - 2001-2008: Improvements to LZMA compressing/decompressing code, - keeping compatibility with original LZMA format - 1996-2001: Development of LZMA compression format - - Some milestones: - - 2001-08-30: LZMA compression was added to 7-Zip - 1999-01-02: First version of 7-Zip was released - - -End of document +HISTORY of the LZMA SDK +----------------------- + +21.07 2021-12-26 +------------------------- +- New switches: -spm and -im!{file_path} to exclude directories from processing + for specified paths that don't contain path separator character at the end of path. +- The sorting order of files in archives was slightly changed to be more consistent + for cases where the name of some directory is the same as the prefix part of the name + of another directory or file. + + +21.06 2021-11-24 +------------------------- +- Bug in LZMA encoder in file LzmaEnc.c was fixed: + LzmaEnc_MemEncode(), LzmaEncode() and LzmaCompress() could work incorrectly, + if size value for output buffer is smaller than size required for all compressed data. + LzmaEnc_Encode() could work incorrectly, + if callback ISeqOutStream::Write() doesn't write all compressed data. + NCompress::NLzma::CEncoder::Code() could work incorrectly, + if callback ISequentialOutStream::Write() returns error code. +- Bug in versions 21.00-21.05 was fixed: + 7-Zip didn't set attributes of directories during archive extracting. + + +21.04 beta 2021-11-02 +------------------------- +- 7-Zip now reduces the number of working CPU threads for compression, + if RAM size is not enough for compression with big LZMA2 dictionary. +- 7-Zip now can create and check "file.sha256" text files that contain the list + of file names and SHA-256 checksums in format compatible with sha256sum program. + + +21.03 beta 2021-07-20 +------------------------- +- The maximum dictionary size for LZMA/LZMA2 compressing was increased to 4 GB (3840 MiB). +- Minor speed optimizations in LZMA/LZMA2 compressing. + + +21.02 alpha 2021-05-06 +------------------------- +- The command line version of 7-Zip for macOS was released. +- The speed for LZMA and LZMA2 decompression in arm64 versions for macOS and Linux + was increased by 20%-60%. + + +21.01 alpha 2021-03-09 +------------------------- +- The command line version of 7-Zip for Linux was released. +- The improvements for speed of ARM64 version using hardware CPU instructions + for AES, CRC-32, SHA-1 and SHA-256. +- Some bugs were fixed. + + +20.02 alpha 2020-08-08 +------------------------- +- The default number of LZMA2 chunks per solid block in 7z archive was increased to 64. + It allows to increase the compression speed for big 7z archives, if there is a big number + of CPU cores and threads. +- The speed of PPMd compressing/decompressing was increased for 7z archives. +- The new -ssp switch. If the switch -ssp is specified, 7-Zip doesn't allow the system + to modify "Last Access Time" property of source files for archiving and hashing operations. +- Some bugs were fixed. + + +20.00 alpha 2020-02-06 +------------------------- +- 7-Zip now supports new optional match finders for LZMA/LZMA2 compression: bt5 and hc5, + that can work faster than bt4 and hc4 match finders for the data with big redundancy. +- The compression ratio was improved for Fast and Fastest compression levels with the + following default settings: + - Fastest level (-mx1) : hc5 match finder with 256 KB dictionary. + - Fast level (-mx3) : hc5 match finder with 4 MB dictionary. +- Minor speed optimizations in multithreaded LZMA/LZMA2 compression for Normal/Maximum/Ultra + compression levels. + + +19.00 2019-02-21 +------------------------- +- Encryption strength for 7z archives was increased: + the size of random initialization vector was increased from 64-bit to 128-bit, + and the pseudo-random number generator was improved. +- The bug in 7zIn.c code was fixed. + + +18.06 2018-12-30 +------------------------- +- The speed for LZMA/LZMA2 compressing was increased by 3-10%, + and there are minor changes in compression ratio. +- Some bugs were fixed. +- The bug in 7-Zip 18.02-18.05 was fixed: + There was memory leak in multithreading xz decoder - XzDecMt_Decode(), + if xz stream contains only one block. +- The changes for MSVS compiler makefiles: + - the makefiles now use "PLATFORM" macroname with values (x64, x86, arm64) + instead of "CPU" macroname with values (AMD64, ARM64). + - the makefiles by default now use static version of the run-time library. + + +18.05 2018-04-30 +------------------------- +- The speed for LZMA/LZMA2 compressing was increased + by 8% for fastest/fast compression levels and + by 3% for normal/maximum compression levels. +- Previous versions of 7-Zip could work incorrectly in "Large memory pages" mode in + Windows 10 because of some BUG with "Large Pages" in Windows 10. + Now 7-Zip doesn't use "Large Pages" on Windows 10 up to revision 1709 (16299). +- The BUG was fixed in Lzma2Enc.c + Lzma2Enc_Encode2() function worked incorretly, + if (inStream == NULL) and the number of block threads is more than 1. + + +18.03 beta 2018-03-04 +------------------------- +- Asm\x86\LzmaDecOpt.asm: new optimized LZMA decoder written in asm + for x64 with about 30% higher speed than main version of LZMA decoder written in C. +- The speed for single-thread LZMA/LZMA2 decoder written in C was increased by 3%. +- 7-Zip now can use multi-threading for 7z/LZMA2 decoding, + if there are multiple independent data chunks in LZMA2 stream. +- 7-Zip now can use multi-threading for xz decoding, + if there are multiple blocks in xz stream. + + +18.01 2019-01-28 +------------------------- +- The BUG in 17.01 - 18.00 beta was fixed: + XzDec.c : random block unpacking and XzUnpacker_IsBlockFinished() + didn't work correctly for xz archives without checksum (CRC). + + +18.00 beta 2019-01-10 +------------------------- +- The BUG in xz encoder was fixed: + There was memory leak of 16 KB for each file compressed with + xz compression method, if additional filter was used. + + +17.01 beta 2017-08-28 +------------------------- +- Minor speed optimization for LZMA2 (xz and 7z) multi-threading compression. + 7-Zip now uses additional memory buffers for multi-block LZMA2 compression. + CPU utilization was slightly improved. +- 7-zip now creates multi-block xz archives by default. Block size can be + specified with -ms[Size]{m|g} switch. +- xz decoder now can unpack random block from multi-block xz archives. +- 7-Zip command line: @listfile now doesn't work after -- switch. + Use -i@listfile before -- switch instead. +- The BUGs were fixed: + 7-Zip 17.00 beta crashed for commands that write anti-item to 7z archive. + + +17.00 beta 2017-04-29 +------------------------- +- NewHandler.h / NewHandler.cpp: + now it redefines operator new() only for old MSVC compilers (_MSC_VER < 1900). +- C/7zTypes.h : the names of variables in interface structures were changed (vt). +- Some bugs were fixed. 7-Zip could crash in some cases. +- Some internal changes in code. + + +16.04 2016-10-04 +------------------------- +- The bug was fixed in DllSecur.c. + + +16.03 2016-09-28 +------------------------- +- SFX modules now use some protection against DLL preloading attack. +- Some bugs in 7z code were fixed. + + +16.02 2016-05-21 +------------------------- +- The BUG in 16.00 - 16.01 was fixed: + Split Handler (SplitHandler.cpp) returned incorrect + total size value (kpidSize) for split archives. + + +16.01 2016-05-19 +------------------------- +- Some internal changes to reduce the number of compiler warnings. + + +16.00 2016-05-10 +------------------------- +- Some bugs were fixed. + + +15.12 2015-11-19 +------------------------- +- The BUG in C version of 7z decoder was fixed: + 7zDec.c : SzDecodeLzma2() + 7z decoder could mistakenly report about decoding error for some 7z archives + that use LZMA2 compression method. + The probability to get that mistaken decoding error report was about + one error per 16384 solid blocks for solid blocks larger than 16 KB (compressed size). +- The BUG (in 9.26-15.11) in C version of 7z decoder was fixed: + 7zArcIn.c : SzReadHeader2() + 7z decoder worked incorrectly for 7z archives that contain + empty solid blocks, that can be placed to 7z archive, if some file is + unavailable for reading during archive creation. + + +15.09 beta 2015-10-16 +------------------------- +- The BUG in LZMA / LZMA2 encoding code was fixed. + The BUG in LzFind.c::MatchFinder_ReadBlock() function. + If input data size is larger than (4 GiB - dictionary_size), + the following code worked incorrectly: + - LZMA : LzmaEnc_MemEncode(), LzmaEncode() : LZMA encoding functions + for compressing from memory to memory. + That BUG is not related to LZMA encoder version that works via streams. + - LZMA2 : multi-threaded version of LZMA2 encoder worked incorrectly, if + default value of chunk size (CLzma2EncProps::blockSize) is changed + to value larger than (4 GiB - dictionary_size). + + +9.38 beta 2015-01-03 +------------------------- +- The BUG in 9.31-9.37 was fixed: + IArchiveGetRawProps interface was disabled for 7z archives. +- The BUG in 9.26-9.36 was fixed: + Some code in CPP\7zip\Archive\7z\ worked correctly only under Windows. + + +9.36 beta 2014-12-26 +------------------------- +- The BUG in command line version was fixed: + 7-Zip created temporary archive in current folder during update archive + operation, if -w{Path} switch was not specified. + The fixed 7-Zip creates temporary archive in folder that contains updated archive. +- The BUG in 9.33-9.35 was fixed: + 7-Zip silently ignored file reading errors during 7z or gz archive creation, + and the created archive contained only part of file that was read before error. + The fixed 7-Zip stops archive creation and it reports about error. + + +9.35 beta 2014-12-07 +------------------------- +- 7zr.exe now support AES encryption. +- SFX mudules were added to LZMA SDK +- Some bugs were fixed. + + +9.21 beta 2011-04-11 +------------------------- +- New class FString for file names at file systems. +- Speed optimization in CRC code for big-endian CPUs. +- The BUG in Lzma2Dec.c was fixed: + Lzma2Decode function didn't work. + + +9.18 beta 2010-11-02 +------------------------- +- New small SFX module for installers (SfxSetup). + + +9.12 beta 2010-03-24 +------------------------- +- The BUG in LZMA SDK 9.* was fixed: LZMA2 codec didn't work, + if more than 10 threads were used (or more than 20 threads in some modes). + + +9.11 beta 2010-03-15 +------------------------- +- PPMd compression method support + + +9.09 2009-12-12 +------------------------- +- The bug was fixed: + Utf16_To_Utf8 funstions in UTFConvert.cpp and 7zMain.c + incorrectly converted surrogate characters (the code >= 0x10000) to UTF-8. +- Some bugs were fixed + + +9.06 2009-08-17 +------------------------- +- Some changes in ANSI-C 7z Decoder interfaces. + + +9.04 2009-05-30 +------------------------- +- LZMA2 compression method support +- xz format support + + +4.65 2009-02-03 +------------------------- +- Some minor fixes + + +4.63 2008-12-31 +------------------------- +- Some minor fixes + + +4.61 beta 2008-11-23 +------------------------- +- The bug in ANSI-C LZMA Decoder was fixed: + If encoded stream was corrupted, decoder could access memory + outside of allocated range. +- Some changes in ANSI-C 7z Decoder interfaces. +- LZMA SDK is placed in the public domain. + + +4.60 beta 2008-08-19 +------------------------- +- Some minor fixes. + + +4.59 beta 2008-08-13 +------------------------- +- The bug was fixed: + LZMA Encoder in fast compression mode could access memory outside of + allocated range in some rare cases. + + +4.58 beta 2008-05-05 +------------------------- +- ANSI-C LZMA Decoder was rewritten for speed optimizations. +- ANSI-C LZMA Encoder was included to LZMA SDK. +- C++ LZMA code now is just wrapper over ANSI-C code. + + +4.57 2007-12-12 +------------------------- +- Speed optimizations in Ñ++ LZMA Decoder. +- Small changes for more compatibility with some C/C++ compilers. + + +4.49 beta 2007-07-05 +------------------------- +- .7z ANSI-C Decoder: + - now it supports BCJ and BCJ2 filters + - now it supports files larger than 4 GB. + - now it supports "Last Write Time" field for files. +- C++ code for .7z archives compressing/decompressing from 7-zip + was included to LZMA SDK. + + +4.43 2006-06-04 +------------------------- +- Small changes for more compatibility with some C/C++ compilers. + + +4.42 2006-05-15 +------------------------- +- Small changes in .h files in ANSI-C version. + + +4.39 beta 2006-04-14 +------------------------- +- The bug in versions 4.33b:4.38b was fixed: + C++ version of LZMA encoder could not correctly compress + files larger than 2 GB with HC4 match finder (-mfhc4). + + +4.37 beta 2005-04-06 +------------------------- +- Fixes in C++ code: code could no be compiled if _NO_EXCEPTIONS was defined. + + +4.35 beta 2005-03-02 +------------------------- +- The bug was fixed in C++ version of LZMA Decoder: + If encoded stream was corrupted, decoder could access memory + outside of allocated range. + + +4.34 beta 2006-02-27 +------------------------- +- Compressing speed and memory requirements for compressing were increased +- LZMA now can use only these match finders: HC4, BT2, BT3, BT4 + + +4.32 2005-12-09 +------------------------- +- Java version of LZMA SDK was included + + +4.30 2005-11-20 +------------------------- +- Compression ratio was improved in -a2 mode +- Speed optimizations for compressing in -a2 mode +- -fb switch now supports values up to 273 +- The bug in 7z_C (7zIn.c) was fixed: + It used Alloc/Free functions from different memory pools. + So if program used two memory pools, it worked incorrectly. +- 7z_C: .7z format supporting was improved +- LZMA# SDK (C#.NET version) was included + + +4.27 (Updated) 2005-09-21 +------------------------- +- Some GUIDs/interfaces in C++ were changed. + IStream.h: + ISequentialInStream::Read now works as old ReadPart + ISequentialOutStream::Write now works as old WritePart + + +4.27 2005-08-07 +------------------------- +- The bug in LzmaDecodeSize.c was fixed: + if _LZMA_IN_CB and _LZMA_OUT_READ were defined, + decompressing worked incorrectly. + + +4.26 2005-08-05 +------------------------- +- Fixes in 7z_C code and LzmaTest.c: + previous versions could work incorrectly, + if malloc(0) returns 0 + + +4.23 2005-06-29 +------------------------- +- Small fixes in C++ code + + +4.22 2005-06-10 +------------------------- +- Small fixes + + +4.21 2005-06-08 +------------------------- +- Interfaces for ANSI-C LZMA Decoder (LzmaDecode.c) were changed +- New additional version of ANSI-C LZMA Decoder with zlib-like interface: + - LzmaStateDecode.h + - LzmaStateDecode.c + - LzmaStateTest.c +- ANSI-C LZMA Decoder now can decompress files larger than 4 GB + + +4.17 2005-04-18 +------------------------- +- New example for RAM->RAM compressing/decompressing: + LZMA + BCJ (filter for x86 code): + - LzmaRam.h + - LzmaRam.cpp + - LzmaRamDecode.h + - LzmaRamDecode.c + - -f86 switch for lzma.exe + + +4.16 2005-03-29 +------------------------- +- The bug was fixed in LzmaDecode.c (ANSI-C LZMA Decoder): + If _LZMA_OUT_READ was defined, and if encoded stream was corrupted, + decoder could access memory outside of allocated range. +- Speed optimization of ANSI-C LZMA Decoder (now it's about 20% faster). + Old version of LZMA Decoder now is in file LzmaDecodeSize.c. + LzmaDecodeSize.c can provide slightly smaller code than LzmaDecode.c +- Small speed optimization in LZMA C++ code +- filter for SPARC's code was added +- Simplified version of .7z ANSI-C Decoder was included + + +4.06 2004-09-05 +------------------------- +- The bug in v4.05 was fixed: + LZMA-Encoder didn't release output stream in some cases. + + +4.05 2004-08-25 +------------------------- +- Source code of filters for x86, IA-64, ARM, ARM-Thumb + and PowerPC code was included to SDK +- Some internal minor changes + + +4.04 2004-07-28 +------------------------- +- More compatibility with some C++ compilers + + +4.03 2004-06-18 +------------------------- +- "Benchmark" command was added. It measures compressing + and decompressing speed and shows rating values. + Also it checks hardware errors. + + +4.02 2004-06-10 +------------------------- +- C++ LZMA Encoder/Decoder code now is more portable + and it can be compiled by GCC on Linux. + + +4.01 2004-02-15 +------------------------- +- Some detection of data corruption was enabled. + LzmaDecode.c / RangeDecoderReadByte + ..... + { + rd->ExtraBytes = 1; + return 0xFF; + } + + +4.00 2004-02-13 +------------------------- +- Original version of LZMA SDK + + + +HISTORY of the LZMA +------------------- + 2001-2008: Improvements to LZMA compressing/decompressing code, + keeping compatibility with original LZMA format + 1996-2001: Development of LZMA compression format + + Some milestones: + + 2001-08-30: LZMA compression was added to 7-Zip + 1999-01-02: First version of 7-Zip was released + + +End of document diff --git a/deps/LZMA-SDK/DOC/lzma-sdk.txt b/deps/LZMA-SDK/DOC/lzma-sdk.txt index b11716938..ed1a431ee 100644 --- a/deps/LZMA-SDK/DOC/lzma-sdk.txt +++ b/deps/LZMA-SDK/DOC/lzma-sdk.txt @@ -1,357 +1,404 @@ -LZMA SDK 21.02 --------------- - -LZMA SDK provides the documentation, samples, header files, -libraries, and tools you need to develop applications that -use 7z / LZMA / LZMA2 / XZ compression. - -LZMA is an improved version of famous LZ77 compression algorithm. -It was improved in way of maximum increasing of compression ratio, -keeping high decompression speed and low memory requirements for -decompressing. - -LZMA2 is a LZMA based compression method. LZMA2 provides better -multithreading support for compression than LZMA and some other improvements. - -7z is a file format for data compression and file archiving. -7z is a main file format for 7-Zip compression program (www.7-zip.org). -7z format supports different compression methods: LZMA, LZMA2 and others. -7z also supports AES-256 based encryption. - -XZ is a file format for data compression that uses LZMA2 compression. -XZ format provides additional features: SHA/CRC check, filters for -improved compression ratio, splitting to blocks and streams, - - - -LICENSE -------- - -LZMA SDK is written and placed in the public domain by Igor Pavlov. - -Some code in LZMA SDK is based on public domain code from another developers: - 1) PPMd var.H (2001): Dmitry Shkarin - 2) SHA-256: Wei Dai (Crypto++ library) - -Anyone is free to copy, modify, publish, use, compile, sell, or distribute the -original LZMA SDK code, either in source code form or as a compiled binary, for -any purpose, commercial or non-commercial, and by any means. - -LZMA SDK code is compatible with open source licenses, for example, you can -include it to GNU GPL or GNU LGPL code. - - -LZMA SDK Contents ------------------ - - Source code: - - - C / C++ / C# / Java - LZMA compression and decompression - - C / C++ - LZMA2 compression and decompression - - C / C++ - XZ compression and decompression - - C - 7z decompression - - C++ - 7z compression and decompression - - C - small SFXs for installers (7z decompression) - - C++ - SFXs and SFXs for installers (7z decompression) - - Precomiled binaries: - - - console programs for lzma / 7z / xz compression and decompression - - SFX modules for installers. - - -UNIX/Linux version ------------------- -To compile C++ version of file->file LZMA encoding, go to directory -CPP/7zip/Bundles/LzmaCon -and call make to recompile it: - make -f makefile.gcc clean all - -In some UNIX/Linux versions you must compile LZMA with static libraries. -To compile with static libraries, you can use -LIB = -lm -static - -Also you can use p7zip (port of 7-Zip for POSIX systems like Unix or Linux): - - http://p7zip.sourceforge.net/ - - -Files ------ - -DOC/7zC.txt - 7z ANSI-C Decoder description -DOC/7zFormat.txt - 7z Format description -DOC/installer.txt - information about 7-Zip for installers -DOC/lzma.txt - LZMA compression description -DOC/lzma-sdk.txt - LZMA SDK description (this file) -DOC/lzma-history.txt - history of LZMA SDK -DOC/lzma-specification.txt - Specification of LZMA -DOC/Methods.txt - Compression method IDs for .7z - -bin/installer/ - example script to create installer that uses SFX module, - -bin/7zdec.exe - simplified 7z archive decoder -bin/7zr.exe - 7-Zip console program (reduced version) -bin/x64/7zr.exe - 7-Zip console program (reduced version) (x64 version) -bin/lzma.exe - file->file LZMA encoder/decoder for Windows -bin/7zS2.sfx - small SFX module for installers (GUI version) -bin/7zS2con.sfx - small SFX module for installers (Console version) -bin/7zSD.sfx - SFX module for installers. - - -7zDec.exe ---------- -7zDec.exe is simplified 7z archive decoder. -It supports only LZMA, LZMA2, and PPMd methods. -7zDec decodes whole solid block from 7z archive to RAM. -The RAM consumption can be high. - - - - -Source code structure ---------------------- - - -Asm/ - asm files (optimized code for CRC calculation and Intel-AES encryption) - -C/ - C files (compression / decompression and other) - Util/ - 7z - 7z decoder program (decoding 7z files) - Lzma - LZMA program (file->file LZMA encoder/decoder). - LzmaLib - LZMA library (.DLL for Windows) - SfxSetup - small SFX module for installers - -CPP/ -- CPP files - - Common - common files for C++ projects - Windows - common files for Windows related code - - 7zip - files related to 7-Zip - - Archive - files related to archiving - - Common - common files for archive handling - 7z - 7z C++ Encoder/Decoder - - Bundles - Modules that are bundles of other modules (files) - - Alone7z - 7zr.exe: Standalone 7-Zip console program (reduced version) - Format7zExtractR - 7zxr.dll: Reduced version of 7z DLL: extracting from 7z/LZMA/BCJ/BCJ2. - Format7zR - 7zr.dll: Reduced version of 7z DLL: extracting/compressing to 7z/LZMA/BCJ/BCJ2 - LzmaCon - lzma.exe: LZMA compression/decompression - LzmaSpec - example code for LZMA Specification - SFXCon - 7zCon.sfx: Console 7z SFX module - SFXSetup - 7zS.sfx: 7z SFX module for installers - SFXWin - 7z.sfx: GUI 7z SFX module - - Common - common files for 7-Zip - - Compress - files for compression/decompression - - Crypto - files for encryption / decompression - - UI - User Interface files - - Client7z - Test application for 7za.dll, 7zr.dll, 7zxr.dll - Common - Common UI files - Console - Code for console program (7z.exe) - Explorer - Some code from 7-Zip Shell extension - FileManager - Some GUI code from 7-Zip File Manager - GUI - Some GUI code from 7-Zip - - -CS/ - C# files - 7zip - Common - some common files for 7-Zip - Compress - files related to compression/decompression - LZ - files related to LZ (Lempel-Ziv) compression algorithm - LZMA - LZMA compression/decompression - LzmaAlone - file->file LZMA compression/decompression - RangeCoder - Range Coder (special code of compression/decompression) - -Java/ - Java files - SevenZip - Compression - files related to compression/decompression - LZ - files related to LZ (Lempel-Ziv) compression algorithm - LZMA - LZMA compression/decompression - RangeCoder - Range Coder (special code of compression/decompression) - - -Note: - Asm / C / C++ source code of LZMA SDK is part of 7-Zip's source code. - 7-Zip's source code can be downloaded from 7-Zip's SourceForge page: - - http://sourceforge.net/projects/sevenzip/ - - - -LZMA features -------------- - - Variable dictionary size (up to 1 GB) - - Estimated compressing speed: about 2 MB/s on 2 GHz CPU - - Estimated decompressing speed: - - 20-30 MB/s on modern 2 GHz cpu - - 1-2 MB/s on 200 MHz simple RISC cpu: (ARM, MIPS, PowerPC) - - Small memory requirements for decompressing (16 KB + DictionarySize) - - Small code size for decompressing: 5-8 KB - -LZMA decoder uses only integer operations and can be -implemented in any modern 32-bit CPU (or on 16-bit CPU with some conditions). - -Some critical operations that affect the speed of LZMA decompression: - 1) 32*16 bit integer multiply - 2) Mispredicted branches (penalty mostly depends from pipeline length) - 3) 32-bit shift and arithmetic operations - -The speed of LZMA decompressing mostly depends from CPU speed. -Memory speed has no big meaning. But if your CPU has small data cache, -overall weight of memory speed will slightly increase. - - -How To Use ----------- - -Using LZMA encoder/decoder executable --------------------------------------- - -Usage: LZMA inputFile outputFile [...] - - e: encode file - - d: decode file - - b: Benchmark. There are two tests: compressing and decompressing - with LZMA method. Benchmark shows rating in MIPS (million - instructions per second). Rating value is calculated from - measured speed and it is normalized with Intel's Core 2 results. - Also Benchmark checks possible hardware errors (RAM - errors in most cases). Benchmark uses these settings: - (-a1, -d21, -fb32, -mfbt4). You can change only -d parameter. - Also you can change the number of iterations. Example for 30 iterations: - LZMA b 30 - Default number of iterations is 10. - - - - - -a{N}: set compression mode 0 = fast, 1 = normal - default: 1 (normal) - - d{N}: Sets Dictionary size - [0, 30], default: 23 (8MB) - The maximum value for dictionary size is 1 GB = 2^30 bytes. - Dictionary size is calculated as DictionarySize = 2^N bytes. - For decompressing file compressed by LZMA method with dictionary - size D = 2^N you need about D bytes of memory (RAM). - - -fb{N}: set number of fast bytes - [5, 273], default: 128 - Usually big number gives a little bit better compression ratio - and slower compression process. - - -lc{N}: set number of literal context bits - [0, 8], default: 3 - Sometimes lc=4 gives gain for big files. - - -lp{N}: set number of literal pos bits - [0, 4], default: 0 - lp switch is intended for periodical data when period is - equal 2^N. For example, for 32-bit (4 bytes) - periodical data you can use lp=2. Often it's better to set lc0, - if you change lp switch. - - -pb{N}: set number of pos bits - [0, 4], default: 2 - pb switch is intended for periodical data - when period is equal 2^N. - - -mf{MF_ID}: set Match Finder. Default: bt4. - Algorithms from hc* group doesn't provide good compression - ratio, but they often works pretty fast in combination with - fast mode (-a0). - - Memory requirements depend from dictionary size - (parameter "d" in table below). - - MF_ID Memory Description - - bt2 d * 9.5 + 4MB Binary Tree with 2 bytes hashing. - bt3 d * 11.5 + 4MB Binary Tree with 3 bytes hashing. - bt4 d * 11.5 + 4MB Binary Tree with 4 bytes hashing. - hc4 d * 7.5 + 4MB Hash Chain with 4 bytes hashing. - - -eos: write End Of Stream marker. By default LZMA doesn't write - eos marker, since LZMA decoder knows uncompressed size - stored in .lzma file header. - - -si: Read data from stdin (it will write End Of Stream marker). - -so: Write data to stdout - - -Examples: - -1) LZMA e file.bin file.lzma -d16 -lc0 - -compresses file.bin to file.lzma with 64 KB dictionary (2^16=64K) -and 0 literal context bits. -lc0 allows to reduce memory requirements -for decompression. - - -2) LZMA e file.bin file.lzma -lc0 -lp2 - -compresses file.bin to file.lzma with settings suitable -for 32-bit periodical data (for example, ARM or MIPS code). - -3) LZMA d file.lzma file.bin - -decompresses file.lzma to file.bin. - - -Compression ratio hints ------------------------ - -Recommendations ---------------- - -To increase the compression ratio for LZMA compressing it's desirable -to have aligned data (if it's possible) and also it's desirable to locate -data in such order, where code is grouped in one place and data is -grouped in other place (it's better than such mixing: code, data, code, -data, ...). - - -Filters -------- -You can increase the compression ratio for some data types, using -special filters before compressing. For example, it's possible to -increase the compression ratio on 5-10% for code for those CPU ISAs: -x86, IA-64, ARM, ARM-Thumb, PowerPC, SPARC. - -You can find C source code of such filters in C/Bra*.* files - -You can check the compression ratio gain of these filters with such -7-Zip commands (example for ARM code): -No filter: - 7z a a1.7z a.bin -m0=lzma - -With filter for little-endian ARM code: - 7z a a2.7z a.bin -m0=arm -m1=lzma - -It works in such manner: -Compressing = Filter_encoding + LZMA_encoding -Decompressing = LZMA_decoding + Filter_decoding - -Compressing and decompressing speed of such filters is very high, -so it will not increase decompressing time too much. -Moreover, it reduces decompression time for LZMA_decoding, -since compression ratio with filtering is higher. - -These filters convert CALL (calling procedure) instructions -from relative offsets to absolute addresses, so such data becomes more -compressible. - -For some ISAs (for example, for MIPS) it's impossible to get gain from such filter. - - - ---- - -http://www.7-zip.org -http://www.7-zip.org/sdk.html -http://www.7-zip.org/support.html +LZMA SDK 22.01 +-------------- + +LZMA SDK provides the documentation, samples, header files, +libraries, and tools you need to develop applications that +use 7z / LZMA / LZMA2 / XZ compression. + +LZMA is an improved version of famous LZ77 compression algorithm. +It was improved in way of maximum increasing of compression ratio, +keeping high decompression speed and low memory requirements for +decompressing. + +LZMA2 is a LZMA based compression method. LZMA2 provides better +multithreading support for compression than LZMA and some other improvements. + +7z is a file format for data compression and file archiving. +7z is a main file format for 7-Zip compression program (www.7-zip.org). +7z format supports different compression methods: LZMA, LZMA2 and others. +7z also supports AES-256 based encryption. + +XZ is a file format for data compression that uses LZMA2 compression. +XZ format provides additional features: SHA/CRC check, filters for +improved compression ratio, splitting to blocks and streams, + + + +LICENSE +------- + +LZMA SDK is written and placed in the public domain by Igor Pavlov. + +Some code in LZMA SDK is based on public domain code from another developers: + 1) PPMd var.H (2001): Dmitry Shkarin + 2) SHA-256: Wei Dai (Crypto++ library) + +Anyone is free to copy, modify, publish, use, compile, sell, or distribute the +original LZMA SDK code, either in source code form or as a compiled binary, for +any purpose, commercial or non-commercial, and by any means. + +LZMA SDK code is compatible with open source licenses, for example, you can +include it to GNU GPL or GNU LGPL code. + + +LZMA SDK Contents +----------------- + + Source code: + + - C / C++ / C# / Java - LZMA compression and decompression + - C / C++ - LZMA2 compression and decompression + - C / C++ - XZ compression and decompression + - C - 7z decompression + - C++ - 7z compression and decompression + - C - small SFXs for installers (7z decompression) + - C++ - SFXs and SFXs for installers (7z decompression) + + Precomiled binaries: + + - console programs for lzma / 7z / xz compression and decompression + - SFX modules for installers. + + +UNIX/Linux version +------------------ +There are several otpions to compile 7-Zip with different compilers: gcc and clang. +Also 7-Zip code contains two versions for some critical parts of code: in C and in Assembeler. +So if you compile the version with Assembeler code, you will get faster 7-Zip binary. + +7-Zip's assembler code uses the following syntax for different platforms: + +1) x86 and x86-64 (AMD64): MASM syntax. + There are 2 programs that supports MASM syntax in Linux. +' 'Asmc Macro Assembler and JWasm. But JWasm now doesn't support some + cpu instructions used in 7-Zip. + So you must install Asmc Macro Assembler in Linux, if you want to compile fastest version + of 7-Zip x86 and x86-64: + https://github.com/nidud/asmc + +2) arm64: GNU assembler for ARM64 with preprocessor. + That systax of that arm64 assembler code in 7-Zip is supported by GCC and CLANG for ARM64. + +There are different binaries that can be compiled from 7-Zip source. +There are 2 main files in folder for compiling: + makefile - that can be used for compiling Windows version of 7-Zip with nmake command + makefile.gcc - that can be used for compiling Linux/macOS versions of 7-Zip with make command + +At first you must change the current folder to folder that contains `makefile.gcc`: + + cd CPP/7zip/Bundles/Alone7z + +Then you can compile `makefile.gcc` with the command: + + make -j -f makefile.gcc + +Also there are additional "*.mak" files in folder "CPP/7zip/" that can be used to compile +7-Zip binaries with optimized code and optimzing options. + +To compile with GCC without assembler: + cd CPP/7zip/Bundles/Alone7z + make -j -f ../../cmpl_gcc.mak + +To compile with CLANG without assembler: + make -j -f ../../cmpl_clang.mak + +To compile 7-Zip for x86-64 with asmc assembler: + make -j -f ../../cmpl_gcc_x64.mak + +To compile 7-Zip for arm64 with assembler: + make -j -f ../../cmpl_gcc_arm64.mak + +To compile 7-Zip for arm64 for macOS: + make -j -f ../../cmpl_mac_arm64.mak + +Also you can change some compiler options in the mak files: + cmpl_gcc.mak + var_gcc.mak + warn_gcc.mak + + + +Also you can use p7zip (port of 7-Zip for POSIX systems like Unix or Linux): + + http://p7zip.sourceforge.net/ + + +Files +----- + +DOC/7zC.txt - 7z ANSI-C Decoder description +DOC/7zFormat.txt - 7z Format description +DOC/installer.txt - information about 7-Zip for installers +DOC/lzma.txt - LZMA compression description +DOC/lzma-sdk.txt - LZMA SDK description (this file) +DOC/lzma-history.txt - history of LZMA SDK +DOC/lzma-specification.txt - Specification of LZMA +DOC/Methods.txt - Compression method IDs for .7z + +bin/installer/ - example script to create installer that uses SFX module, + +bin/7zdec.exe - simplified 7z archive decoder +bin/7zr.exe - 7-Zip console program (reduced version) +bin/x64/7zr.exe - 7-Zip console program (reduced version) (x64 version) +bin/lzma.exe - file->file LZMA encoder/decoder for Windows +bin/7zS2.sfx - small SFX module for installers (GUI version) +bin/7zS2con.sfx - small SFX module for installers (Console version) +bin/7zSD.sfx - SFX module for installers. + + +7zDec.exe +--------- +7zDec.exe is simplified 7z archive decoder. +It supports only LZMA, LZMA2, and PPMd methods. +7zDec decodes whole solid block from 7z archive to RAM. +The RAM consumption can be high. + + + + +Source code structure +--------------------- + + +Asm/ - asm files (optimized code for CRC calculation and Intel-AES encryption) + +C/ - C files (compression / decompression and other) + Util/ + 7z - 7z decoder program (decoding 7z files) + Lzma - LZMA program (file->file LZMA encoder/decoder). + LzmaLib - LZMA library (.DLL for Windows) + SfxSetup - small SFX module for installers + +CPP/ -- CPP files + + Common - common files for C++ projects + Windows - common files for Windows related code + + 7zip - files related to 7-Zip + + Archive - files related to archiving + + Common - common files for archive handling + 7z - 7z C++ Encoder/Decoder + + Bundles - Modules that are bundles of other modules (files) + + Alone7z - 7zr.exe: Standalone 7-Zip console program (reduced version) + Format7zExtractR - 7zxr.dll: Reduced version of 7z DLL: extracting from 7z/LZMA/BCJ/BCJ2. + Format7zR - 7zr.dll: Reduced version of 7z DLL: extracting/compressing to 7z/LZMA/BCJ/BCJ2 + LzmaCon - lzma.exe: LZMA compression/decompression + LzmaSpec - example code for LZMA Specification + SFXCon - 7zCon.sfx: Console 7z SFX module + SFXSetup - 7zS.sfx: 7z SFX module for installers + SFXWin - 7z.sfx: GUI 7z SFX module + + Common - common files for 7-Zip + + Compress - files for compression/decompression + + Crypto - files for encryption / decompression + + UI - User Interface files + + Client7z - Test application for 7za.dll, 7zr.dll, 7zxr.dll + Common - Common UI files + Console - Code for console program (7z.exe) + Explorer - Some code from 7-Zip Shell extension + FileManager - Some GUI code from 7-Zip File Manager + GUI - Some GUI code from 7-Zip + + +CS/ - C# files + 7zip + Common - some common files for 7-Zip + Compress - files related to compression/decompression + LZ - files related to LZ (Lempel-Ziv) compression algorithm + LZMA - LZMA compression/decompression + LzmaAlone - file->file LZMA compression/decompression + RangeCoder - Range Coder (special code of compression/decompression) + +Java/ - Java files + SevenZip + Compression - files related to compression/decompression + LZ - files related to LZ (Lempel-Ziv) compression algorithm + LZMA - LZMA compression/decompression + RangeCoder - Range Coder (special code of compression/decompression) + + +Note: + Asm / C / C++ source code of LZMA SDK is part of 7-Zip's source code. + 7-Zip's source code can be downloaded from 7-Zip's SourceForge page: + + http://sourceforge.net/projects/sevenzip/ + + + +LZMA features +------------- + - Variable dictionary size (up to 1 GB) + - Estimated compressing speed: about 2 MB/s on 2 GHz CPU + - Estimated decompressing speed: + - 20-30 MB/s on modern 2 GHz cpu + - 1-2 MB/s on 200 MHz simple RISC cpu: (ARM, MIPS, PowerPC) + - Small memory requirements for decompressing (16 KB + DictionarySize) + - Small code size for decompressing: 5-8 KB + +LZMA decoder uses only integer operations and can be +implemented in any modern 32-bit CPU (or on 16-bit CPU with some conditions). + +Some critical operations that affect the speed of LZMA decompression: + 1) 32*16 bit integer multiply + 2) Mispredicted branches (penalty mostly depends from pipeline length) + 3) 32-bit shift and arithmetic operations + +The speed of LZMA decompressing mostly depends from CPU speed. +Memory speed has no big meaning. But if your CPU has small data cache, +overall weight of memory speed will slightly increase. + + +How To Use +---------- + +Using LZMA encoder/decoder executable +-------------------------------------- + +Usage: LZMA inputFile outputFile [...] + + e: encode file + + d: decode file + + b: Benchmark. There are two tests: compressing and decompressing + with LZMA method. Benchmark shows rating in MIPS (million + instructions per second). Rating value is calculated from + measured speed and it is normalized with Intel's Core 2 results. + Also Benchmark checks possible hardware errors (RAM + errors in most cases). Benchmark uses these settings: + (-a1, -d21, -fb32, -mfbt4). You can change only -d parameter. + Also you can change the number of iterations. Example for 30 iterations: + LZMA b 30 + Default number of iterations is 10. + + + + + -a{N}: set compression mode 0 = fast, 1 = normal + default: 1 (normal) + + d{N}: Sets Dictionary size - [0, 30], default: 23 (8MB) + The maximum value for dictionary size is 1 GB = 2^30 bytes. + Dictionary size is calculated as DictionarySize = 2^N bytes. + For decompressing file compressed by LZMA method with dictionary + size D = 2^N you need about D bytes of memory (RAM). + + -fb{N}: set number of fast bytes - [5, 273], default: 128 + Usually big number gives a little bit better compression ratio + and slower compression process. + + -lc{N}: set number of literal context bits - [0, 8], default: 3 + Sometimes lc=4 gives gain for big files. + + -lp{N}: set number of literal pos bits - [0, 4], default: 0 + lp switch is intended for periodical data when period is + equal 2^N. For example, for 32-bit (4 bytes) + periodical data you can use lp=2. Often it's better to set lc0, + if you change lp switch. + + -pb{N}: set number of pos bits - [0, 4], default: 2 + pb switch is intended for periodical data + when period is equal 2^N. + + -mf{MF_ID}: set Match Finder. Default: bt4. + Algorithms from hc* group doesn't provide good compression + ratio, but they often works pretty fast in combination with + fast mode (-a0). + + Memory requirements depend from dictionary size + (parameter "d" in table below). + + MF_ID Memory Description + + bt2 d * 9.5 + 4MB Binary Tree with 2 bytes hashing. + bt3 d * 11.5 + 4MB Binary Tree with 3 bytes hashing. + bt4 d * 11.5 + 4MB Binary Tree with 4 bytes hashing. + hc4 d * 7.5 + 4MB Hash Chain with 4 bytes hashing. + + -eos: write End Of Stream marker. By default LZMA doesn't write + eos marker, since LZMA decoder knows uncompressed size + stored in .lzma file header. + + -si: Read data from stdin (it will write End Of Stream marker). + -so: Write data to stdout + + +Examples: + +1) LZMA e file.bin file.lzma -d16 -lc0 + +compresses file.bin to file.lzma with 64 KB dictionary (2^16=64K) +and 0 literal context bits. -lc0 allows to reduce memory requirements +for decompression. + + +2) LZMA e file.bin file.lzma -lc0 -lp2 + +compresses file.bin to file.lzma with settings suitable +for 32-bit periodical data (for example, ARM or MIPS code). + +3) LZMA d file.lzma file.bin + +decompresses file.lzma to file.bin. + + +Compression ratio hints +----------------------- + +Recommendations +--------------- + +To increase the compression ratio for LZMA compressing it's desirable +to have aligned data (if it's possible) and also it's desirable to locate +data in such order, where code is grouped in one place and data is +grouped in other place (it's better than such mixing: code, data, code, +data, ...). + + +Filters +------- +You can increase the compression ratio for some data types, using +special filters before compressing. For example, it's possible to +increase the compression ratio on 5-10% for code for those CPU ISAs: +x86, IA-64, ARM, ARM-Thumb, PowerPC, SPARC. + +You can find C source code of such filters in C/Bra*.* files + +You can check the compression ratio gain of these filters with such +7-Zip commands (example for ARM code): +No filter: + 7z a a1.7z a.bin -m0=lzma + +With filter for little-endian ARM code: + 7z a a2.7z a.bin -m0=arm -m1=lzma + +It works in such manner: +Compressing = Filter_encoding + LZMA_encoding +Decompressing = LZMA_decoding + Filter_decoding + +Compressing and decompressing speed of such filters is very high, +so it will not increase decompressing time too much. +Moreover, it reduces decompression time for LZMA_decoding, +since compression ratio with filtering is higher. + +These filters convert CALL (calling procedure) instructions +from relative offsets to absolute addresses, so such data becomes more +compressible. + +For some ISAs (for example, for MIPS) it's impossible to get gain from such filter. + + + +--- + +http://www.7-zip.org +http://www.7-zip.org/sdk.html +http://www.7-zip.org/support.html diff --git a/deps/LZMA-SDK/DOC/lzma-specification.txt b/deps/LZMA-SDK/DOC/lzma-specification.txt index b6796df75..ac0cce76a 100644 --- a/deps/LZMA-SDK/DOC/lzma-specification.txt +++ b/deps/LZMA-SDK/DOC/lzma-specification.txt @@ -1,1176 +1,1176 @@ -LZMA specification (DRAFT version) ----------------------------------- - -Author: Igor Pavlov -Date: 2015-06-14 - -This specification defines the format of LZMA compressed data and lzma file format. - -Notation --------- - -We use the syntax of C++ programming language. -We use the following types in C++ code: - unsigned - unsigned integer, at least 16 bits in size - int - signed integer, at least 16 bits in size - UInt64 - 64-bit unsigned integer - UInt32 - 32-bit unsigned integer - UInt16 - 16-bit unsigned integer - Byte - 8-bit unsigned integer - bool - boolean type with two possible values: false, true - - -lzma file format -================ - -The lzma file contains the raw LZMA stream and the header with related properties. - -The files in that format use ".lzma" extension. - -The lzma file format layout: - -Offset Size Description - - 0 1 LZMA model properties (lc, lp, pb) in encoded form - 1 4 Dictionary size (32-bit unsigned integer, little-endian) - 5 8 Uncompressed size (64-bit unsigned integer, little-endian) - 13 Compressed data (LZMA stream) - -LZMA properties: - - name Range Description - - lc [0, 8] the number of "literal context" bits - lp [0, 4] the number of "literal pos" bits - pb [0, 4] the number of "pos" bits -dictSize [0, 2^32 - 1] the dictionary size - -The following code encodes LZMA properties: - -void EncodeProperties(Byte *properties) -{ - properties[0] = (Byte)((pb * 5 + lp) * 9 + lc); - Set_UInt32_LittleEndian(properties + 1, dictSize); -} - -If the value of dictionary size in properties is smaller than (1 << 12), -the LZMA decoder must set the dictionary size variable to (1 << 12). - -#define LZMA_DIC_MIN (1 << 12) - - unsigned lc, pb, lp; - UInt32 dictSize; - UInt32 dictSizeInProperties; - - void DecodeProperties(const Byte *properties) - { - unsigned d = properties[0]; - if (d >= (9 * 5 * 5)) - throw "Incorrect LZMA properties"; - lc = d % 9; - d /= 9; - pb = d / 5; - lp = d % 5; - dictSizeInProperties = 0; - for (int i = 0; i < 4; i++) - dictSizeInProperties |= (UInt32)properties[i + 1] << (8 * i); - dictSize = dictSizeInProperties; - if (dictSize < LZMA_DIC_MIN) - dictSize = LZMA_DIC_MIN; - } - -If "Uncompressed size" field contains ones in all 64 bits, it means that -uncompressed size is unknown and there is the "end marker" in stream, -that indicates the end of decoding point. -In opposite case, if the value from "Uncompressed size" field is not -equal to ((2^64) - 1), the LZMA stream decoding must be finished after -specified number of bytes (Uncompressed size) is decoded. And if there -is the "end marker", the LZMA decoder must read that marker also. - - -The new scheme to encode LZMA properties ----------------------------------------- - -If LZMA compression is used for some another format, it's recommended to -use a new improved scheme to encode LZMA properties. That new scheme was -used in xz format that uses the LZMA2 compression algorithm. -The LZMA2 is a new compression algorithm that is based on the LZMA algorithm. - -The dictionary size in LZMA2 is encoded with just one byte and LZMA2 supports -only reduced set of dictionary sizes: - (2 << 11), (3 << 11), - (2 << 12), (3 << 12), - ... - (2 << 30), (3 << 30), - (2 << 31) - 1 - -The dictionary size can be extracted from encoded value with the following code: - - dictSize = (p == 40) ? 0xFFFFFFFF : (((UInt32)2 | ((p) & 1)) << ((p) / 2 + 11)); - -Also there is additional limitation (lc + lp <= 4) in LZMA2 for values of -"lc" and "lp" properties: - - if (lc + lp > 4) - throw "Unsupported properties: (lc + lp) > 4"; - -There are some advantages for LZMA decoder with such (lc + lp) value -limitation. It reduces the maximum size of tables allocated by decoder. -And it reduces the complexity of initialization procedure, that can be -important to keep high speed of decoding of big number of small LZMA streams. - -It's recommended to use that limitation (lc + lp <= 4) for any new format -that uses LZMA compression. Note that the combinations of "lc" and "lp" -parameters, where (lc + lp > 4), can provide significant improvement in -compression ratio only in some rare cases. - -The LZMA properties can be encoded into two bytes in new scheme: - -Offset Size Description - - 0 1 The dictionary size encoded with LZMA2 scheme - 1 1 LZMA model properties (lc, lp, pb) in encoded form - - -The RAM usage -============= - -The RAM usage for LZMA decoder is determined by the following parts: - -1) The Sliding Window (from 4 KiB to 4 GiB). -2) The probability model counter arrays (arrays of 16-bit variables). -3) Some additional state variables (about 10 variables of 32-bit integers). - - -The RAM usage for Sliding Window --------------------------------- - -There are two main scenarios of decoding: - -1) The decoding of full stream to one RAM buffer. - - If we decode full LZMA stream to one output buffer in RAM, the decoder - can use that output buffer as sliding window. So the decoder doesn't - need additional buffer allocated for sliding window. - -2) The decoding to some external storage. - - If we decode LZMA stream to external storage, the decoder must allocate - the buffer for sliding window. The size of that buffer must be equal - or larger than the value of dictionary size from properties of LZMA stream. - -In this specification we describe the code for decoding to some external -storage. The optimized version of code for decoding of full stream to one -output RAM buffer can require some minor changes in code. - - -The RAM usage for the probability model counters ------------------------------------------------- - -The size of the probability model counter arrays is calculated with the -following formula: - -size_of_prob_arrays = 1846 + 768 * (1 << (lp + lc)) - -Each probability model counter is 11-bit unsigned integer. -If we use 16-bit integer variables (2-byte integers) for these probability -model counters, the RAM usage required by probability model counter arrays -can be estimated with the following formula: - - RAM = 4 KiB + 1.5 KiB * (1 << (lp + lc)) - -For example, for default LZMA parameters (lp = 0 and lc = 3), the RAM usage is - - RAM_lc3_lp0 = 4 KiB + 1.5 KiB * 8 = 16 KiB - -The maximum RAM state usage is required for decoding the stream with lp = 4 -and lc = 8: - - RAM_lc8_lp4 = 4 KiB + 1.5 KiB * 4096 = 6148 KiB - -If the decoder uses LZMA2's limited property condition -(lc + lp <= 4), the RAM usage will be not larger than - - RAM_lc_lp_4 = 4 KiB + 1.5 KiB * 16 = 28 KiB - - -The RAM usage for encoder -------------------------- - -There are many variants for LZMA encoding code. -These variants have different values for memory consumption. -Note that memory consumption for LZMA Encoder can not be -smaller than memory consumption of LZMA Decoder for same stream. - -The RAM usage required by modern effective implementation of -LZMA Encoder can be estimated with the following formula: - - Encoder_RAM_Usage = 4 MiB + 11 * dictionarySize. - -But there are some modes of the encoder that require less memory. - - -LZMA Decoding -============= - -The LZMA compression algorithm uses LZ-based compression with Sliding Window -and Range Encoding as entropy coding method. - - -Sliding Window --------------- - -LZMA uses Sliding Window compression similar to LZ77 algorithm. - -LZMA stream must be decoded to the sequence that consists -of MATCHES and LITERALS: - - - a LITERAL is a 8-bit character (one byte). - The decoder just puts that LITERAL to the uncompressed stream. - - - a MATCH is a pair of two numbers (DISTANCE-LENGTH pair). - The decoder takes one byte exactly "DISTANCE" characters behind - current position in the uncompressed stream and puts it to - uncompressed stream. The decoder must repeat it "LENGTH" times. - -The "DISTANCE" can not be larger than dictionary size. -And the "DISTANCE" can not be larger than the number of bytes in -the uncompressed stream that were decoded before that match. - -In this specification we use cyclic buffer to implement Sliding Window -for LZMA decoder: - -class COutWindow -{ - Byte *Buf; - UInt32 Pos; - UInt32 Size; - bool IsFull; - -public: - unsigned TotalPos; - COutStream OutStream; - - COutWindow(): Buf(NULL) {} - ~COutWindow() { delete []Buf; } - - void Create(UInt32 dictSize) - { - Buf = new Byte[dictSize]; - Pos = 0; - Size = dictSize; - IsFull = false; - TotalPos = 0; - } - - void PutByte(Byte b) - { - TotalPos++; - Buf[Pos++] = b; - if (Pos == Size) - { - Pos = 0; - IsFull = true; - } - OutStream.WriteByte(b); - } - - Byte GetByte(UInt32 dist) const - { - return Buf[dist <= Pos ? Pos - dist : Size - dist + Pos]; - } - - void CopyMatch(UInt32 dist, unsigned len) - { - for (; len > 0; len--) - PutByte(GetByte(dist)); - } - - bool CheckDistance(UInt32 dist) const - { - return dist <= Pos || IsFull; - } - - bool IsEmpty() const - { - return Pos == 0 && !IsFull; - } -}; - - -In another implementation it's possible to use one buffer that contains -Sliding Window and the whole data stream after uncompressing. - - -Range Decoder -------------- - -LZMA algorithm uses Range Encoding (1) as entropy coding method. - -LZMA stream contains just one very big number in big-endian encoding. -LZMA decoder uses the Range Decoder to extract a sequence of binary -symbols from that big number. - -The state of the Range Decoder: - -struct CRangeDecoder -{ - UInt32 Range; - UInt32 Code; - InputStream *InStream; - - bool Corrupted; -} - -The notes about UInt32 type for the "Range" and "Code" variables: - - It's possible to use 64-bit (unsigned or signed) integer type - for the "Range" and the "Code" variables instead of 32-bit unsigned, - but some additional code must be used to truncate the values to - low 32-bits after some operations. - - If the programming language does not support 32-bit unsigned integer type - (like in case of JAVA language), it's possible to use 32-bit signed integer, - but some code must be changed. For example, it's required to change the code - that uses comparison operations for UInt32 variables in this specification. - -The Range Decoder can be in some states that can be treated as -"Corruption" in LZMA stream. The Range Decoder uses the variable "Corrupted": - - (Corrupted == false), if the Range Decoder has not detected any corruption. - (Corrupted == true), if the Range Decoder has detected some corruption. - -The reference LZMA Decoder ignores the value of the "Corrupted" variable. -So it continues to decode the stream, even if the corruption can be detected -in the Range Decoder. To provide the full compatibility with output of the -reference LZMA Decoder, another LZMA Decoder implementations must also -ignore the value of the "Corrupted" variable. - -The LZMA Encoder is required to create only such LZMA streams, that will not -lead the Range Decoder to states, where the "Corrupted" variable is set to true. - -The Range Decoder reads first 5 bytes from input stream to initialize -the state: - -bool CRangeDecoder::Init() -{ - Corrupted = false; - Range = 0xFFFFFFFF; - Code = 0; - - Byte b = InStream->ReadByte(); - - for (int i = 0; i < 4; i++) - Code = (Code << 8) | InStream->ReadByte(); - - if (b != 0 || Code == Range) - Corrupted = true; - return b == 0; -} - -The LZMA Encoder always writes ZERO in initial byte of compressed stream. -That scheme allows to simplify the code of the Range Encoder in the -LZMA Encoder. If initial byte is not equal to ZERO, the LZMA Decoder must -stop decoding and report error. - -After the last bit of data was decoded by Range Decoder, the value of the -"Code" variable must be equal to 0. The LZMA Decoder must check it by -calling the IsFinishedOK() function: - - bool IsFinishedOK() const { return Code == 0; } - -If there is corruption in data stream, there is big probability that -the "Code" value will be not equal to 0 in the Finish() function. So that -check in the IsFinishedOK() function provides very good feature for -corruption detection. - -The value of the "Range" variable before each bit decoding can not be smaller -than ((UInt32)1 << 24). The Normalize() function keeps the "Range" value in -described range. - -#define kTopValue ((UInt32)1 << 24) - -void CRangeDecoder::Normalize() -{ - if (Range < kTopValue) - { - Range <<= 8; - Code = (Code << 8) | InStream->ReadByte(); - } -} - -Notes: if the size of the "Code" variable is larger than 32 bits, it's -required to keep only low 32 bits of the "Code" variable after the change -in Normalize() function. - -If the LZMA Stream is not corrupted, the value of the "Code" variable is -always smaller than value of the "Range" variable. -But the Range Decoder ignores some types of corruptions, so the value of -the "Code" variable can be equal or larger than value of the "Range" variable -for some "Corrupted" archives. - - -LZMA uses Range Encoding only with binary symbols of two types: - 1) binary symbols with fixed and equal probabilities (direct bits) - 2) binary symbols with predicted probabilities - -The DecodeDirectBits() function decodes the sequence of direct bits: - -UInt32 CRangeDecoder::DecodeDirectBits(unsigned numBits) -{ - UInt32 res = 0; - do - { - Range >>= 1; - Code -= Range; - UInt32 t = 0 - ((UInt32)Code >> 31); - Code += Range & t; - - if (Code == Range) - Corrupted = true; - - Normalize(); - res <<= 1; - res += t + 1; - } - while (--numBits); - return res; -} - - -The Bit Decoding with Probability Model ---------------------------------------- - -The task of Bit Probability Model is to estimate probabilities of binary -symbols. And then it provides the Range Decoder with that information. -The better prediction provides better compression ratio. -The Bit Probability Model uses statistical data of previous decoded -symbols. - -That estimated probability is presented as 11-bit unsigned integer value -that represents the probability of symbol "0". - -#define kNumBitModelTotalBits 11 - -Mathematical probabilities can be presented with the following formulas: - probability(symbol_0) = prob / 2048. - probability(symbol_1) = 1 - Probability(symbol_0) = - = 1 - prob / 2048 = - = (2048 - prob) / 2048 -where the "prob" variable contains 11-bit integer probability counter. - -It's recommended to use 16-bit unsigned integer type, to store these 11-bit -probability values: - -typedef UInt16 CProb; - -Each probability value must be initialized with value ((1 << 11) / 2), -that represents the state, where probabilities of symbols 0 and 1 -are equal to 0.5: - -#define PROB_INIT_VAL ((1 << kNumBitModelTotalBits) / 2) - -The INIT_PROBS macro is used to initialize the array of CProb variables: - -#define INIT_PROBS(p) \ - { for (unsigned i = 0; i < sizeof(p) / sizeof(p[0]); i++) p[i] = PROB_INIT_VAL; } - - -The DecodeBit() function decodes one bit. -The LZMA decoder provides the pointer to CProb variable that contains -information about estimated probability for symbol 0 and the Range Decoder -updates that CProb variable after decoding. The Range Decoder increases -estimated probability of the symbol that was decoded: - -#define kNumMoveBits 5 - -unsigned CRangeDecoder::DecodeBit(CProb *prob) -{ - unsigned v = *prob; - UInt32 bound = (Range >> kNumBitModelTotalBits) * v; - unsigned symbol; - if (Code < bound) - { - v += ((1 << kNumBitModelTotalBits) - v) >> kNumMoveBits; - Range = bound; - symbol = 0; - } - else - { - v -= v >> kNumMoveBits; - Code -= bound; - Range -= bound; - symbol = 1; - } - *prob = (CProb)v; - Normalize(); - return symbol; -} - - -The Binary Tree of bit model counters -------------------------------------- - -LZMA uses a tree of Bit model variables to decode symbol that needs -several bits for storing. There are two versions of such trees in LZMA: - 1) the tree that decodes bits from high bit to low bit (the normal scheme). - 2) the tree that decodes bits from low bit to high bit (the reverse scheme). - -Each binary tree structure supports different size of decoded symbol -(the size of binary sequence that contains value of symbol). -If that size of decoded symbol is "NumBits" bits, the tree structure -uses the array of (2 << NumBits) counters of CProb type. -But only ((2 << NumBits) - 1) items are used by encoder and decoder. -The first item (the item with index equal to 0) in array is unused. -That scheme with unused array's item allows to simplify the code. - -unsigned BitTreeReverseDecode(CProb *probs, unsigned numBits, CRangeDecoder *rc) -{ - unsigned m = 1; - unsigned symbol = 0; - for (unsigned i = 0; i < numBits; i++) - { - unsigned bit = rc->DecodeBit(&probs[m]); - m <<= 1; - m += bit; - symbol |= (bit << i); - } - return symbol; -} - -template -class CBitTreeDecoder -{ - CProb Probs[(unsigned)1 << NumBits]; - -public: - - void Init() - { - INIT_PROBS(Probs); - } - - unsigned Decode(CRangeDecoder *rc) - { - unsigned m = 1; - for (unsigned i = 0; i < NumBits; i++) - m = (m << 1) + rc->DecodeBit(&Probs[m]); - return m - ((unsigned)1 << NumBits); - } - - unsigned ReverseDecode(CRangeDecoder *rc) - { - return BitTreeReverseDecode(Probs, NumBits, rc); - } -}; - - -LZ part of LZMA ---------------- - -LZ part of LZMA describes details about the decoding of MATCHES and LITERALS. - - -The Literal Decoding --------------------- - -The LZMA Decoder uses (1 << (lc + lp)) tables with CProb values, where -each table contains 0x300 CProb values: - - CProb *LitProbs; - - void CreateLiterals() - { - LitProbs = new CProb[(UInt32)0x300 << (lc + lp)]; - } - - void InitLiterals() - { - UInt32 num = (UInt32)0x300 << (lc + lp); - for (UInt32 i = 0; i < num; i++) - LitProbs[i] = PROB_INIT_VAL; - } - -To select the table for decoding it uses the context that consists of -(lc) high bits from previous literal and (lp) low bits from value that -represents current position in outputStream. - -If (State > 7), the Literal Decoder also uses "matchByte" that represents -the byte in OutputStream at position the is the DISTANCE bytes before -current position, where the DISTANCE is the distance in DISTANCE-LENGTH pair -of latest decoded match. - -The following code decodes one literal and puts it to Sliding Window buffer: - - void DecodeLiteral(unsigned state, UInt32 rep0) - { - unsigned prevByte = 0; - if (!OutWindow.IsEmpty()) - prevByte = OutWindow.GetByte(1); - - unsigned symbol = 1; - unsigned litState = ((OutWindow.TotalPos & ((1 << lp) - 1)) << lc) + (prevByte >> (8 - lc)); - CProb *probs = &LitProbs[(UInt32)0x300 * litState]; - - if (state >= 7) - { - unsigned matchByte = OutWindow.GetByte(rep0 + 1); - do - { - unsigned matchBit = (matchByte >> 7) & 1; - matchByte <<= 1; - unsigned bit = RangeDec.DecodeBit(&probs[((1 + matchBit) << 8) + symbol]); - symbol = (symbol << 1) | bit; - if (matchBit != bit) - break; - } - while (symbol < 0x100); - } - while (symbol < 0x100) - symbol = (symbol << 1) | RangeDec.DecodeBit(&probs[symbol]); - OutWindow.PutByte((Byte)(symbol - 0x100)); - } - - -The match length decoding -------------------------- - -The match length decoder returns normalized (zero-based value) -length of match. That value can be converted to real length of the match -with the following code: - -#define kMatchMinLen 2 - - matchLen = len + kMatchMinLen; - -The match length decoder can return the values from 0 to 271. -And the corresponded real match length values can be in the range -from 2 to 273. - -The following scheme is used for the match length encoding: - - Binary encoding Binary Tree structure Zero-based match length - sequence (binary + decimal): - - 0 xxx LowCoder[posState] xxx - 1 0 yyy MidCoder[posState] yyy + 8 - 1 1 zzzzzzzz HighCoder zzzzzzzz + 16 - -LZMA uses bit model variable "Choice" to decode the first selection bit. - -If the first selection bit is equal to 0, the decoder uses binary tree - LowCoder[posState] to decode 3-bit zero-based match length (xxx). - -If the first selection bit is equal to 1, the decoder uses bit model - variable "Choice2" to decode the second selection bit. - - If the second selection bit is equal to 0, the decoder uses binary tree - MidCoder[posState] to decode 3-bit "yyy" value, and zero-based match - length is equal to (yyy + 8). - - If the second selection bit is equal to 1, the decoder uses binary tree - HighCoder to decode 8-bit "zzzzzzzz" value, and zero-based - match length is equal to (zzzzzzzz + 16). - -LZMA uses "posState" value as context to select the binary tree -from LowCoder and MidCoder binary tree arrays: - - unsigned posState = OutWindow.TotalPos & ((1 << pb) - 1); - -The full code of the length decoder: - -class CLenDecoder -{ - CProb Choice; - CProb Choice2; - CBitTreeDecoder<3> LowCoder[1 << kNumPosBitsMax]; - CBitTreeDecoder<3> MidCoder[1 << kNumPosBitsMax]; - CBitTreeDecoder<8> HighCoder; - -public: - - void Init() - { - Choice = PROB_INIT_VAL; - Choice2 = PROB_INIT_VAL; - HighCoder.Init(); - for (unsigned i = 0; i < (1 << kNumPosBitsMax); i++) - { - LowCoder[i].Init(); - MidCoder[i].Init(); - } - } - - unsigned Decode(CRangeDecoder *rc, unsigned posState) - { - if (rc->DecodeBit(&Choice) == 0) - return LowCoder[posState].Decode(rc); - if (rc->DecodeBit(&Choice2) == 0) - return 8 + MidCoder[posState].Decode(rc); - return 16 + HighCoder.Decode(rc); - } -}; - -The LZMA decoder uses two instances of CLenDecoder class. -The first instance is for the matches of "Simple Match" type, -and the second instance is for the matches of "Rep Match" type: - - CLenDecoder LenDecoder; - CLenDecoder RepLenDecoder; - - -The match distance decoding ---------------------------- - -LZMA supports dictionary sizes up to 4 GiB minus 1. -The value of match distance (decoded by distance decoder) can be -from 1 to 2^32. But the distance value that is equal to 2^32 is used to -indicate the "End of stream" marker. So real largest match distance -that is used for LZ-window match is (2^32 - 1). - -LZMA uses normalized match length (zero-based length) -to calculate the context state "lenState" do decode the distance value: - -#define kNumLenToPosStates 4 - - unsigned lenState = len; - if (lenState > kNumLenToPosStates - 1) - lenState = kNumLenToPosStates - 1; - -The distance decoder returns the "dist" value that is zero-based value -of match distance. The real match distance can be calculated with the -following code: - - matchDistance = dist + 1; - -The state of the distance decoder and the initialization code: - - #define kEndPosModelIndex 14 - #define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) - #define kNumAlignBits 4 - - CBitTreeDecoder<6> PosSlotDecoder[kNumLenToPosStates]; - CProb PosDecoders[1 + kNumFullDistances - kEndPosModelIndex]; - CBitTreeDecoder AlignDecoder; - - void InitDist() - { - for (unsigned i = 0; i < kNumLenToPosStates; i++) - PosSlotDecoder[i].Init(); - AlignDecoder.Init(); - INIT_PROBS(PosDecoders); - } - -At first stage the distance decoder decodes 6-bit "posSlot" value with bit -tree decoder from PosSlotDecoder array. It's possible to get 2^6=64 different -"posSlot" values. - - unsigned posSlot = PosSlotDecoder[lenState].Decode(&RangeDec); - -The encoding scheme for distance value is shown in the following table: - -posSlot (decimal) / - zero-based distance (binary) - 0 0 - 1 1 - 2 10 - 3 11 - - 4 10 x - 5 11 x - 6 10 xx - 7 11 xx - 8 10 xxx - 9 11 xxx -10 10 xxxx -11 11 xxxx -12 10 xxxxx -13 11 xxxxx - -14 10 yy zzzz -15 11 yy zzzz -16 10 yyy zzzz -17 11 yyy zzzz -... -62 10 yyyyyyyyyyyyyyyyyyyyyyyyyy zzzz -63 11 yyyyyyyyyyyyyyyyyyyyyyyyyy zzzz - -where - "x ... x" means the sequence of binary symbols encoded with binary tree and - "Reverse" scheme. It uses separated binary tree for each posSlot from 4 to 13. - "y" means direct bit encoded with range coder. - "zzzz" means the sequence of four binary symbols encoded with binary - tree with "Reverse" scheme, where one common binary tree "AlignDecoder" - is used for all posSlot values. - -If (posSlot < 4), the "dist" value is equal to posSlot value. - -If (posSlot >= 4), the decoder uses "posSlot" value to calculate the value of - the high bits of "dist" value and the number of the low bits. - - If (4 <= posSlot < kEndPosModelIndex), the decoder uses bit tree decoders. - (one separated bit tree decoder per one posSlot value) and "Reverse" scheme. - In this implementation we use one CProb array "PosDecoders" that contains - all CProb variables for all these bit decoders. - - if (posSlot >= kEndPosModelIndex), the middle bits are decoded as direct - bits from RangeDecoder and the low 4 bits are decoded with a bit tree - decoder "AlignDecoder" with "Reverse" scheme. - -The code to decode zero-based match distance: - - unsigned DecodeDistance(unsigned len) - { - unsigned lenState = len; - if (lenState > kNumLenToPosStates - 1) - lenState = kNumLenToPosStates - 1; - - unsigned posSlot = PosSlotDecoder[lenState].Decode(&RangeDec); - if (posSlot < 4) - return posSlot; - - unsigned numDirectBits = (unsigned)((posSlot >> 1) - 1); - UInt32 dist = ((2 | (posSlot & 1)) << numDirectBits); - if (posSlot < kEndPosModelIndex) - dist += BitTreeReverseDecode(PosDecoders + dist - posSlot, numDirectBits, &RangeDec); - else - { - dist += RangeDec.DecodeDirectBits(numDirectBits - kNumAlignBits) << kNumAlignBits; - dist += AlignDecoder.ReverseDecode(&RangeDec); - } - return dist; - } - - - -LZMA Decoding modes -------------------- - -There are 2 types of LZMA streams: - -1) The stream with "End of stream" marker. -2) The stream without "End of stream" marker. - -And the LZMA Decoder supports 3 modes of decoding: - -1) The unpack size is undefined. The LZMA decoder stops decoding after - getting "End of stream" marker. - The input variables for that case: - - markerIsMandatory = true - unpackSizeDefined = false - unpackSize contains any value - -2) The unpack size is defined and LZMA decoder supports both variants, - where the stream can contain "End of stream" marker or the stream is - finished without "End of stream" marker. The LZMA decoder must detect - any of these situations. - The input variables for that case: - - markerIsMandatory = false - unpackSizeDefined = true - unpackSize contains unpack size - -3) The unpack size is defined and the LZMA stream must contain - "End of stream" marker - The input variables for that case: - - markerIsMandatory = true - unpackSizeDefined = true - unpackSize contains unpack size - - -The main loop of decoder ------------------------- - -The main loop of LZMA decoder: - -Initialize the LZMA state. -loop -{ - // begin of loop - Check "end of stream" conditions. - Decode Type of MATCH / LITERAL. - If it's LITERAL, decode LITERAL value and put the LITERAL to Window. - If it's MATCH, decode the length of match and the match distance. - Check error conditions, check end of stream conditions and copy - the sequence of match bytes from sliding window to current position - in window. - Go to begin of loop -} - -The reference implementation of LZMA decoder uses "unpackSize" variable -to keep the number of remaining bytes in output stream. So it reduces -"unpackSize" value after each decoded LITERAL or MATCH. - -The following code contains the "end of stream" condition check at the start -of the loop: - - if (unpackSizeDefined && unpackSize == 0 && !markerIsMandatory) - if (RangeDec.IsFinishedOK()) - return LZMA_RES_FINISHED_WITHOUT_MARKER; - -LZMA uses three types of matches: - -1) "Simple Match" - the match with distance value encoded with bit models. - -2) "Rep Match" - the match that uses the distance from distance - history table. - -3) "Short Rep Match" - the match of single byte length, that uses the latest - distance from distance history table. - -The LZMA decoder keeps the history of latest 4 match distances that were used -by decoder. That set of 4 variables contains zero-based match distances and -these variables are initialized with zero values: - - UInt32 rep0 = 0, rep1 = 0, rep2 = 0, rep3 = 0; - -The LZMA decoder uses binary model variables to select type of MATCH or LITERAL: - -#define kNumStates 12 -#define kNumPosBitsMax 4 - - CProb IsMatch[kNumStates << kNumPosBitsMax]; - CProb IsRep[kNumStates]; - CProb IsRepG0[kNumStates]; - CProb IsRepG1[kNumStates]; - CProb IsRepG2[kNumStates]; - CProb IsRep0Long[kNumStates << kNumPosBitsMax]; - -The decoder uses "state" variable value to select exact variable -from "IsRep", "IsRepG0", "IsRepG1" and "IsRepG2" arrays. -The "state" variable can get the value from 0 to 11. -Initial value for "state" variable is zero: - - unsigned state = 0; - -The "state" variable is updated after each LITERAL or MATCH with one of the -following functions: - -unsigned UpdateState_Literal(unsigned state) -{ - if (state < 4) return 0; - else if (state < 10) return state - 3; - else return state - 6; -} -unsigned UpdateState_Match (unsigned state) { return state < 7 ? 7 : 10; } -unsigned UpdateState_Rep (unsigned state) { return state < 7 ? 8 : 11; } -unsigned UpdateState_ShortRep(unsigned state) { return state < 7 ? 9 : 11; } - -The decoder calculates "state2" variable value to select exact variable from -"IsMatch" and "IsRep0Long" arrays: - -unsigned posState = OutWindow.TotalPos & ((1 << pb) - 1); -unsigned state2 = (state << kNumPosBitsMax) + posState; - -The decoder uses the following code flow scheme to select exact -type of LITERAL or MATCH: - -IsMatch[state2] decode - 0 - the Literal - 1 - the Match - IsRep[state] decode - 0 - Simple Match - 1 - Rep Match - IsRepG0[state] decode - 0 - the distance is rep0 - IsRep0Long[state2] decode - 0 - Short Rep Match - 1 - Rep Match 0 - 1 - - IsRepG1[state] decode - 0 - Rep Match 1 - 1 - - IsRepG2[state] decode - 0 - Rep Match 2 - 1 - Rep Match 3 - - -LITERAL symbol --------------- -If the value "0" was decoded with IsMatch[state2] decoding, we have "LITERAL" type. - -At first the LZMA decoder must check that it doesn't exceed -specified uncompressed size: - - if (unpackSizeDefined && unpackSize == 0) - return LZMA_RES_ERROR; - -Then it decodes literal value and puts it to sliding window: - - DecodeLiteral(state, rep0); - -Then the decoder must update the "state" value and "unpackSize" value; - - state = UpdateState_Literal(state); - unpackSize--; - -Then the decoder must go to the begin of main loop to decode next Match or Literal. - - -Simple Match ------------- - -If the value "1" was decoded with IsMatch[state2] decoding, -we have the "Simple Match" type. - -The distance history table is updated with the following scheme: - - rep3 = rep2; - rep2 = rep1; - rep1 = rep0; - -The zero-based length is decoded with "LenDecoder": - - len = LenDecoder.Decode(&RangeDec, posState); - -The state is update with UpdateState_Match function: - - state = UpdateState_Match(state); - -and the new "rep0" value is decoded with DecodeDistance: - - rep0 = DecodeDistance(len); - -That "rep0" will be used as zero-based distance for current match. - -If the value of "rep0" is equal to 0xFFFFFFFF, it means that we have -"End of stream" marker, so we can stop decoding and check finishing -condition in Range Decoder: - - if (rep0 == 0xFFFFFFFF) - return RangeDec.IsFinishedOK() ? - LZMA_RES_FINISHED_WITH_MARKER : - LZMA_RES_ERROR; - -If uncompressed size is defined, LZMA decoder must check that it doesn't -exceed that specified uncompressed size: - - if (unpackSizeDefined && unpackSize == 0) - return LZMA_RES_ERROR; - -Also the decoder must check that "rep0" value is not larger than dictionary size -and is not larger than the number of already decoded bytes: - - if (rep0 >= dictSize || !OutWindow.CheckDistance(rep0)) - return LZMA_RES_ERROR; - -Then the decoder must copy match bytes as described in -"The match symbols copying" section. - - -Rep Match ---------- - -If the LZMA decoder has decoded the value "1" with IsRep[state] variable, -we have "Rep Match" type. - -At first the LZMA decoder must check that it doesn't exceed -specified uncompressed size: - - if (unpackSizeDefined && unpackSize == 0) - return LZMA_RES_ERROR; - -Also the decoder must return error, if the LZ window is empty: - - if (OutWindow.IsEmpty()) - return LZMA_RES_ERROR; - -If the match type is "Rep Match", the decoder uses one of the 4 variables of -distance history table to get the value of distance for current match. -And there are 4 corresponding ways of decoding flow. - -The decoder updates the distance history with the following scheme -depending from type of match: - -- "Rep Match 0" or "Short Rep Match": - ; LZMA doesn't update the distance history - -- "Rep Match 1": - UInt32 dist = rep1; - rep1 = rep0; - rep0 = dist; - -- "Rep Match 2": - UInt32 dist = rep2; - rep2 = rep1; - rep1 = rep0; - rep0 = dist; - -- "Rep Match 3": - UInt32 dist = rep3; - rep3 = rep2; - rep2 = rep1; - rep1 = rep0; - rep0 = dist; - -Then the decoder decodes exact subtype of "Rep Match" using "IsRepG0", "IsRep0Long", -"IsRepG1", "IsRepG2". - -If the subtype is "Short Rep Match", the decoder updates the state, puts -the one byte from window to current position in window and goes to next -MATCH/LITERAL symbol (the begin of main loop): - - state = UpdateState_ShortRep(state); - OutWindow.PutByte(OutWindow.GetByte(rep0 + 1)); - unpackSize--; - continue; - -In other cases (Rep Match 0/1/2/3), it decodes the zero-based -length of match with "RepLenDecoder" decoder: - - len = RepLenDecoder.Decode(&RangeDec, posState); - -Then it updates the state: - - state = UpdateState_Rep(state); - -Then the decoder must copy match bytes as described in -"The Match symbols copying" section. - - -The match symbols copying -------------------------- - -If we have the match (Simple Match or Rep Match 0/1/2/3), the decoder must -copy the sequence of bytes with calculated match distance and match length. -If uncompressed size is defined, LZMA decoder must check that it doesn't -exceed that specified uncompressed size: - - len += kMatchMinLen; - bool isError = false; - if (unpackSizeDefined && unpackSize < len) - { - len = (unsigned)unpackSize; - isError = true; - } - OutWindow.CopyMatch(rep0 + 1, len); - unpackSize -= len; - if (isError) - return LZMA_RES_ERROR; - -Then the decoder must go to the begin of main loop to decode next MATCH or LITERAL. - - - -NOTES ------ - -This specification doesn't describe the variant of decoder implementation -that supports partial decoding. Such partial decoding case can require some -changes in "end of stream" condition checks code. Also such code -can use additional status codes, returned by decoder. - -This specification uses C++ code with templates to simplify describing. -The optimized version of LZMA decoder doesn't need templates. -Such optimized version can use just two arrays of CProb variables: - 1) The dynamic array of CProb variables allocated for the Literal Decoder. - 2) The one common array that contains all other CProb variables. - - -References: - -1. G. N. N. Martin, Range encoding: an algorithm for removing redundancy - from a digitized message, Video & Data Recording Conference, - Southampton, UK, July 24-27, 1979. +LZMA specification (DRAFT version) +---------------------------------- + +Author: Igor Pavlov +Date: 2015-06-14 + +This specification defines the format of LZMA compressed data and lzma file format. + +Notation +-------- + +We use the syntax of C++ programming language. +We use the following types in C++ code: + unsigned - unsigned integer, at least 16 bits in size + int - signed integer, at least 16 bits in size + UInt64 - 64-bit unsigned integer + UInt32 - 32-bit unsigned integer + UInt16 - 16-bit unsigned integer + Byte - 8-bit unsigned integer + bool - boolean type with two possible values: false, true + + +lzma file format +================ + +The lzma file contains the raw LZMA stream and the header with related properties. + +The files in that format use ".lzma" extension. + +The lzma file format layout: + +Offset Size Description + + 0 1 LZMA model properties (lc, lp, pb) in encoded form + 1 4 Dictionary size (32-bit unsigned integer, little-endian) + 5 8 Uncompressed size (64-bit unsigned integer, little-endian) + 13 Compressed data (LZMA stream) + +LZMA properties: + + name Range Description + + lc [0, 8] the number of "literal context" bits + lp [0, 4] the number of "literal pos" bits + pb [0, 4] the number of "pos" bits +dictSize [0, 2^32 - 1] the dictionary size + +The following code encodes LZMA properties: + +void EncodeProperties(Byte *properties) +{ + properties[0] = (Byte)((pb * 5 + lp) * 9 + lc); + Set_UInt32_LittleEndian(properties + 1, dictSize); +} + +If the value of dictionary size in properties is smaller than (1 << 12), +the LZMA decoder must set the dictionary size variable to (1 << 12). + +#define LZMA_DIC_MIN (1 << 12) + + unsigned lc, pb, lp; + UInt32 dictSize; + UInt32 dictSizeInProperties; + + void DecodeProperties(const Byte *properties) + { + unsigned d = properties[0]; + if (d >= (9 * 5 * 5)) + throw "Incorrect LZMA properties"; + lc = d % 9; + d /= 9; + pb = d / 5; + lp = d % 5; + dictSizeInProperties = 0; + for (int i = 0; i < 4; i++) + dictSizeInProperties |= (UInt32)properties[i + 1] << (8 * i); + dictSize = dictSizeInProperties; + if (dictSize < LZMA_DIC_MIN) + dictSize = LZMA_DIC_MIN; + } + +If "Uncompressed size" field contains ones in all 64 bits, it means that +uncompressed size is unknown and there is the "end marker" in stream, +that indicates the end of decoding point. +In opposite case, if the value from "Uncompressed size" field is not +equal to ((2^64) - 1), the LZMA stream decoding must be finished after +specified number of bytes (Uncompressed size) is decoded. And if there +is the "end marker", the LZMA decoder must read that marker also. + + +The new scheme to encode LZMA properties +---------------------------------------- + +If LZMA compression is used for some another format, it's recommended to +use a new improved scheme to encode LZMA properties. That new scheme was +used in xz format that uses the LZMA2 compression algorithm. +The LZMA2 is a new compression algorithm that is based on the LZMA algorithm. + +The dictionary size in LZMA2 is encoded with just one byte and LZMA2 supports +only reduced set of dictionary sizes: + (2 << 11), (3 << 11), + (2 << 12), (3 << 12), + ... + (2 << 30), (3 << 30), + (2 << 31) - 1 + +The dictionary size can be extracted from encoded value with the following code: + + dictSize = (p == 40) ? 0xFFFFFFFF : (((UInt32)2 | ((p) & 1)) << ((p) / 2 + 11)); + +Also there is additional limitation (lc + lp <= 4) in LZMA2 for values of +"lc" and "lp" properties: + + if (lc + lp > 4) + throw "Unsupported properties: (lc + lp) > 4"; + +There are some advantages for LZMA decoder with such (lc + lp) value +limitation. It reduces the maximum size of tables allocated by decoder. +And it reduces the complexity of initialization procedure, that can be +important to keep high speed of decoding of big number of small LZMA streams. + +It's recommended to use that limitation (lc + lp <= 4) for any new format +that uses LZMA compression. Note that the combinations of "lc" and "lp" +parameters, where (lc + lp > 4), can provide significant improvement in +compression ratio only in some rare cases. + +The LZMA properties can be encoded into two bytes in new scheme: + +Offset Size Description + + 0 1 The dictionary size encoded with LZMA2 scheme + 1 1 LZMA model properties (lc, lp, pb) in encoded form + + +The RAM usage +============= + +The RAM usage for LZMA decoder is determined by the following parts: + +1) The Sliding Window (from 4 KiB to 4 GiB). +2) The probability model counter arrays (arrays of 16-bit variables). +3) Some additional state variables (about 10 variables of 32-bit integers). + + +The RAM usage for Sliding Window +-------------------------------- + +There are two main scenarios of decoding: + +1) The decoding of full stream to one RAM buffer. + + If we decode full LZMA stream to one output buffer in RAM, the decoder + can use that output buffer as sliding window. So the decoder doesn't + need additional buffer allocated for sliding window. + +2) The decoding to some external storage. + + If we decode LZMA stream to external storage, the decoder must allocate + the buffer for sliding window. The size of that buffer must be equal + or larger than the value of dictionary size from properties of LZMA stream. + +In this specification we describe the code for decoding to some external +storage. The optimized version of code for decoding of full stream to one +output RAM buffer can require some minor changes in code. + + +The RAM usage for the probability model counters +------------------------------------------------ + +The size of the probability model counter arrays is calculated with the +following formula: + +size_of_prob_arrays = 1846 + 768 * (1 << (lp + lc)) + +Each probability model counter is 11-bit unsigned integer. +If we use 16-bit integer variables (2-byte integers) for these probability +model counters, the RAM usage required by probability model counter arrays +can be estimated with the following formula: + + RAM = 4 KiB + 1.5 KiB * (1 << (lp + lc)) + +For example, for default LZMA parameters (lp = 0 and lc = 3), the RAM usage is + + RAM_lc3_lp0 = 4 KiB + 1.5 KiB * 8 = 16 KiB + +The maximum RAM state usage is required for decoding the stream with lp = 4 +and lc = 8: + + RAM_lc8_lp4 = 4 KiB + 1.5 KiB * 4096 = 6148 KiB + +If the decoder uses LZMA2's limited property condition +(lc + lp <= 4), the RAM usage will be not larger than + + RAM_lc_lp_4 = 4 KiB + 1.5 KiB * 16 = 28 KiB + + +The RAM usage for encoder +------------------------- + +There are many variants for LZMA encoding code. +These variants have different values for memory consumption. +Note that memory consumption for LZMA Encoder can not be +smaller than memory consumption of LZMA Decoder for same stream. + +The RAM usage required by modern effective implementation of +LZMA Encoder can be estimated with the following formula: + + Encoder_RAM_Usage = 4 MiB + 11 * dictionarySize. + +But there are some modes of the encoder that require less memory. + + +LZMA Decoding +============= + +The LZMA compression algorithm uses LZ-based compression with Sliding Window +and Range Encoding as entropy coding method. + + +Sliding Window +-------------- + +LZMA uses Sliding Window compression similar to LZ77 algorithm. + +LZMA stream must be decoded to the sequence that consists +of MATCHES and LITERALS: + + - a LITERAL is a 8-bit character (one byte). + The decoder just puts that LITERAL to the uncompressed stream. + + - a MATCH is a pair of two numbers (DISTANCE-LENGTH pair). + The decoder takes one byte exactly "DISTANCE" characters behind + current position in the uncompressed stream and puts it to + uncompressed stream. The decoder must repeat it "LENGTH" times. + +The "DISTANCE" can not be larger than dictionary size. +And the "DISTANCE" can not be larger than the number of bytes in +the uncompressed stream that were decoded before that match. + +In this specification we use cyclic buffer to implement Sliding Window +for LZMA decoder: + +class COutWindow +{ + Byte *Buf; + UInt32 Pos; + UInt32 Size; + bool IsFull; + +public: + unsigned TotalPos; + COutStream OutStream; + + COutWindow(): Buf(NULL) {} + ~COutWindow() { delete []Buf; } + + void Create(UInt32 dictSize) + { + Buf = new Byte[dictSize]; + Pos = 0; + Size = dictSize; + IsFull = false; + TotalPos = 0; + } + + void PutByte(Byte b) + { + TotalPos++; + Buf[Pos++] = b; + if (Pos == Size) + { + Pos = 0; + IsFull = true; + } + OutStream.WriteByte(b); + } + + Byte GetByte(UInt32 dist) const + { + return Buf[dist <= Pos ? Pos - dist : Size - dist + Pos]; + } + + void CopyMatch(UInt32 dist, unsigned len) + { + for (; len > 0; len--) + PutByte(GetByte(dist)); + } + + bool CheckDistance(UInt32 dist) const + { + return dist <= Pos || IsFull; + } + + bool IsEmpty() const + { + return Pos == 0 && !IsFull; + } +}; + + +In another implementation it's possible to use one buffer that contains +Sliding Window and the whole data stream after uncompressing. + + +Range Decoder +------------- + +LZMA algorithm uses Range Encoding (1) as entropy coding method. + +LZMA stream contains just one very big number in big-endian encoding. +LZMA decoder uses the Range Decoder to extract a sequence of binary +symbols from that big number. + +The state of the Range Decoder: + +struct CRangeDecoder +{ + UInt32 Range; + UInt32 Code; + InputStream *InStream; + + bool Corrupted; +} + +The notes about UInt32 type for the "Range" and "Code" variables: + + It's possible to use 64-bit (unsigned or signed) integer type + for the "Range" and the "Code" variables instead of 32-bit unsigned, + but some additional code must be used to truncate the values to + low 32-bits after some operations. + + If the programming language does not support 32-bit unsigned integer type + (like in case of JAVA language), it's possible to use 32-bit signed integer, + but some code must be changed. For example, it's required to change the code + that uses comparison operations for UInt32 variables in this specification. + +The Range Decoder can be in some states that can be treated as +"Corruption" in LZMA stream. The Range Decoder uses the variable "Corrupted": + + (Corrupted == false), if the Range Decoder has not detected any corruption. + (Corrupted == true), if the Range Decoder has detected some corruption. + +The reference LZMA Decoder ignores the value of the "Corrupted" variable. +So it continues to decode the stream, even if the corruption can be detected +in the Range Decoder. To provide the full compatibility with output of the +reference LZMA Decoder, another LZMA Decoder implementations must also +ignore the value of the "Corrupted" variable. + +The LZMA Encoder is required to create only such LZMA streams, that will not +lead the Range Decoder to states, where the "Corrupted" variable is set to true. + +The Range Decoder reads first 5 bytes from input stream to initialize +the state: + +bool CRangeDecoder::Init() +{ + Corrupted = false; + Range = 0xFFFFFFFF; + Code = 0; + + Byte b = InStream->ReadByte(); + + for (int i = 0; i < 4; i++) + Code = (Code << 8) | InStream->ReadByte(); + + if (b != 0 || Code == Range) + Corrupted = true; + return b == 0; +} + +The LZMA Encoder always writes ZERO in initial byte of compressed stream. +That scheme allows to simplify the code of the Range Encoder in the +LZMA Encoder. If initial byte is not equal to ZERO, the LZMA Decoder must +stop decoding and report error. + +After the last bit of data was decoded by Range Decoder, the value of the +"Code" variable must be equal to 0. The LZMA Decoder must check it by +calling the IsFinishedOK() function: + + bool IsFinishedOK() const { return Code == 0; } + +If there is corruption in data stream, there is big probability that +the "Code" value will be not equal to 0 in the Finish() function. So that +check in the IsFinishedOK() function provides very good feature for +corruption detection. + +The value of the "Range" variable before each bit decoding can not be smaller +than ((UInt32)1 << 24). The Normalize() function keeps the "Range" value in +described range. + +#define kTopValue ((UInt32)1 << 24) + +void CRangeDecoder::Normalize() +{ + if (Range < kTopValue) + { + Range <<= 8; + Code = (Code << 8) | InStream->ReadByte(); + } +} + +Notes: if the size of the "Code" variable is larger than 32 bits, it's +required to keep only low 32 bits of the "Code" variable after the change +in Normalize() function. + +If the LZMA Stream is not corrupted, the value of the "Code" variable is +always smaller than value of the "Range" variable. +But the Range Decoder ignores some types of corruptions, so the value of +the "Code" variable can be equal or larger than value of the "Range" variable +for some "Corrupted" archives. + + +LZMA uses Range Encoding only with binary symbols of two types: + 1) binary symbols with fixed and equal probabilities (direct bits) + 2) binary symbols with predicted probabilities + +The DecodeDirectBits() function decodes the sequence of direct bits: + +UInt32 CRangeDecoder::DecodeDirectBits(unsigned numBits) +{ + UInt32 res = 0; + do + { + Range >>= 1; + Code -= Range; + UInt32 t = 0 - ((UInt32)Code >> 31); + Code += Range & t; + + if (Code == Range) + Corrupted = true; + + Normalize(); + res <<= 1; + res += t + 1; + } + while (--numBits); + return res; +} + + +The Bit Decoding with Probability Model +--------------------------------------- + +The task of Bit Probability Model is to estimate probabilities of binary +symbols. And then it provides the Range Decoder with that information. +The better prediction provides better compression ratio. +The Bit Probability Model uses statistical data of previous decoded +symbols. + +That estimated probability is presented as 11-bit unsigned integer value +that represents the probability of symbol "0". + +#define kNumBitModelTotalBits 11 + +Mathematical probabilities can be presented with the following formulas: + probability(symbol_0) = prob / 2048. + probability(symbol_1) = 1 - Probability(symbol_0) = + = 1 - prob / 2048 = + = (2048 - prob) / 2048 +where the "prob" variable contains 11-bit integer probability counter. + +It's recommended to use 16-bit unsigned integer type, to store these 11-bit +probability values: + +typedef UInt16 CProb; + +Each probability value must be initialized with value ((1 << 11) / 2), +that represents the state, where probabilities of symbols 0 and 1 +are equal to 0.5: + +#define PROB_INIT_VAL ((1 << kNumBitModelTotalBits) / 2) + +The INIT_PROBS macro is used to initialize the array of CProb variables: + +#define INIT_PROBS(p) \ + { for (unsigned i = 0; i < sizeof(p) / sizeof(p[0]); i++) p[i] = PROB_INIT_VAL; } + + +The DecodeBit() function decodes one bit. +The LZMA decoder provides the pointer to CProb variable that contains +information about estimated probability for symbol 0 and the Range Decoder +updates that CProb variable after decoding. The Range Decoder increases +estimated probability of the symbol that was decoded: + +#define kNumMoveBits 5 + +unsigned CRangeDecoder::DecodeBit(CProb *prob) +{ + unsigned v = *prob; + UInt32 bound = (Range >> kNumBitModelTotalBits) * v; + unsigned symbol; + if (Code < bound) + { + v += ((1 << kNumBitModelTotalBits) - v) >> kNumMoveBits; + Range = bound; + symbol = 0; + } + else + { + v -= v >> kNumMoveBits; + Code -= bound; + Range -= bound; + symbol = 1; + } + *prob = (CProb)v; + Normalize(); + return symbol; +} + + +The Binary Tree of bit model counters +------------------------------------- + +LZMA uses a tree of Bit model variables to decode symbol that needs +several bits for storing. There are two versions of such trees in LZMA: + 1) the tree that decodes bits from high bit to low bit (the normal scheme). + 2) the tree that decodes bits from low bit to high bit (the reverse scheme). + +Each binary tree structure supports different size of decoded symbol +(the size of binary sequence that contains value of symbol). +If that size of decoded symbol is "NumBits" bits, the tree structure +uses the array of (2 << NumBits) counters of CProb type. +But only ((2 << NumBits) - 1) items are used by encoder and decoder. +The first item (the item with index equal to 0) in array is unused. +That scheme with unused array's item allows to simplify the code. + +unsigned BitTreeReverseDecode(CProb *probs, unsigned numBits, CRangeDecoder *rc) +{ + unsigned m = 1; + unsigned symbol = 0; + for (unsigned i = 0; i < numBits; i++) + { + unsigned bit = rc->DecodeBit(&probs[m]); + m <<= 1; + m += bit; + symbol |= (bit << i); + } + return symbol; +} + +template +class CBitTreeDecoder +{ + CProb Probs[(unsigned)1 << NumBits]; + +public: + + void Init() + { + INIT_PROBS(Probs); + } + + unsigned Decode(CRangeDecoder *rc) + { + unsigned m = 1; + for (unsigned i = 0; i < NumBits; i++) + m = (m << 1) + rc->DecodeBit(&Probs[m]); + return m - ((unsigned)1 << NumBits); + } + + unsigned ReverseDecode(CRangeDecoder *rc) + { + return BitTreeReverseDecode(Probs, NumBits, rc); + } +}; + + +LZ part of LZMA +--------------- + +LZ part of LZMA describes details about the decoding of MATCHES and LITERALS. + + +The Literal Decoding +-------------------- + +The LZMA Decoder uses (1 << (lc + lp)) tables with CProb values, where +each table contains 0x300 CProb values: + + CProb *LitProbs; + + void CreateLiterals() + { + LitProbs = new CProb[(UInt32)0x300 << (lc + lp)]; + } + + void InitLiterals() + { + UInt32 num = (UInt32)0x300 << (lc + lp); + for (UInt32 i = 0; i < num; i++) + LitProbs[i] = PROB_INIT_VAL; + } + +To select the table for decoding it uses the context that consists of +(lc) high bits from previous literal and (lp) low bits from value that +represents current position in outputStream. + +If (State > 7), the Literal Decoder also uses "matchByte" that represents +the byte in OutputStream at position the is the DISTANCE bytes before +current position, where the DISTANCE is the distance in DISTANCE-LENGTH pair +of latest decoded match. + +The following code decodes one literal and puts it to Sliding Window buffer: + + void DecodeLiteral(unsigned state, UInt32 rep0) + { + unsigned prevByte = 0; + if (!OutWindow.IsEmpty()) + prevByte = OutWindow.GetByte(1); + + unsigned symbol = 1; + unsigned litState = ((OutWindow.TotalPos & ((1 << lp) - 1)) << lc) + (prevByte >> (8 - lc)); + CProb *probs = &LitProbs[(UInt32)0x300 * litState]; + + if (state >= 7) + { + unsigned matchByte = OutWindow.GetByte(rep0 + 1); + do + { + unsigned matchBit = (matchByte >> 7) & 1; + matchByte <<= 1; + unsigned bit = RangeDec.DecodeBit(&probs[((1 + matchBit) << 8) + symbol]); + symbol = (symbol << 1) | bit; + if (matchBit != bit) + break; + } + while (symbol < 0x100); + } + while (symbol < 0x100) + symbol = (symbol << 1) | RangeDec.DecodeBit(&probs[symbol]); + OutWindow.PutByte((Byte)(symbol - 0x100)); + } + + +The match length decoding +------------------------- + +The match length decoder returns normalized (zero-based value) +length of match. That value can be converted to real length of the match +with the following code: + +#define kMatchMinLen 2 + + matchLen = len + kMatchMinLen; + +The match length decoder can return the values from 0 to 271. +And the corresponded real match length values can be in the range +from 2 to 273. + +The following scheme is used for the match length encoding: + + Binary encoding Binary Tree structure Zero-based match length + sequence (binary + decimal): + + 0 xxx LowCoder[posState] xxx + 1 0 yyy MidCoder[posState] yyy + 8 + 1 1 zzzzzzzz HighCoder zzzzzzzz + 16 + +LZMA uses bit model variable "Choice" to decode the first selection bit. + +If the first selection bit is equal to 0, the decoder uses binary tree + LowCoder[posState] to decode 3-bit zero-based match length (xxx). + +If the first selection bit is equal to 1, the decoder uses bit model + variable "Choice2" to decode the second selection bit. + + If the second selection bit is equal to 0, the decoder uses binary tree + MidCoder[posState] to decode 3-bit "yyy" value, and zero-based match + length is equal to (yyy + 8). + + If the second selection bit is equal to 1, the decoder uses binary tree + HighCoder to decode 8-bit "zzzzzzzz" value, and zero-based + match length is equal to (zzzzzzzz + 16). + +LZMA uses "posState" value as context to select the binary tree +from LowCoder and MidCoder binary tree arrays: + + unsigned posState = OutWindow.TotalPos & ((1 << pb) - 1); + +The full code of the length decoder: + +class CLenDecoder +{ + CProb Choice; + CProb Choice2; + CBitTreeDecoder<3> LowCoder[1 << kNumPosBitsMax]; + CBitTreeDecoder<3> MidCoder[1 << kNumPosBitsMax]; + CBitTreeDecoder<8> HighCoder; + +public: + + void Init() + { + Choice = PROB_INIT_VAL; + Choice2 = PROB_INIT_VAL; + HighCoder.Init(); + for (unsigned i = 0; i < (1 << kNumPosBitsMax); i++) + { + LowCoder[i].Init(); + MidCoder[i].Init(); + } + } + + unsigned Decode(CRangeDecoder *rc, unsigned posState) + { + if (rc->DecodeBit(&Choice) == 0) + return LowCoder[posState].Decode(rc); + if (rc->DecodeBit(&Choice2) == 0) + return 8 + MidCoder[posState].Decode(rc); + return 16 + HighCoder.Decode(rc); + } +}; + +The LZMA decoder uses two instances of CLenDecoder class. +The first instance is for the matches of "Simple Match" type, +and the second instance is for the matches of "Rep Match" type: + + CLenDecoder LenDecoder; + CLenDecoder RepLenDecoder; + + +The match distance decoding +--------------------------- + +LZMA supports dictionary sizes up to 4 GiB minus 1. +The value of match distance (decoded by distance decoder) can be +from 1 to 2^32. But the distance value that is equal to 2^32 is used to +indicate the "End of stream" marker. So real largest match distance +that is used for LZ-window match is (2^32 - 1). + +LZMA uses normalized match length (zero-based length) +to calculate the context state "lenState" do decode the distance value: + +#define kNumLenToPosStates 4 + + unsigned lenState = len; + if (lenState > kNumLenToPosStates - 1) + lenState = kNumLenToPosStates - 1; + +The distance decoder returns the "dist" value that is zero-based value +of match distance. The real match distance can be calculated with the +following code: + + matchDistance = dist + 1; + +The state of the distance decoder and the initialization code: + + #define kEndPosModelIndex 14 + #define kNumFullDistances (1 << (kEndPosModelIndex >> 1)) + #define kNumAlignBits 4 + + CBitTreeDecoder<6> PosSlotDecoder[kNumLenToPosStates]; + CProb PosDecoders[1 + kNumFullDistances - kEndPosModelIndex]; + CBitTreeDecoder AlignDecoder; + + void InitDist() + { + for (unsigned i = 0; i < kNumLenToPosStates; i++) + PosSlotDecoder[i].Init(); + AlignDecoder.Init(); + INIT_PROBS(PosDecoders); + } + +At first stage the distance decoder decodes 6-bit "posSlot" value with bit +tree decoder from PosSlotDecoder array. It's possible to get 2^6=64 different +"posSlot" values. + + unsigned posSlot = PosSlotDecoder[lenState].Decode(&RangeDec); + +The encoding scheme for distance value is shown in the following table: + +posSlot (decimal) / + zero-based distance (binary) + 0 0 + 1 1 + 2 10 + 3 11 + + 4 10 x + 5 11 x + 6 10 xx + 7 11 xx + 8 10 xxx + 9 11 xxx +10 10 xxxx +11 11 xxxx +12 10 xxxxx +13 11 xxxxx + +14 10 yy zzzz +15 11 yy zzzz +16 10 yyy zzzz +17 11 yyy zzzz +... +62 10 yyyyyyyyyyyyyyyyyyyyyyyyyy zzzz +63 11 yyyyyyyyyyyyyyyyyyyyyyyyyy zzzz + +where + "x ... x" means the sequence of binary symbols encoded with binary tree and + "Reverse" scheme. It uses separated binary tree for each posSlot from 4 to 13. + "y" means direct bit encoded with range coder. + "zzzz" means the sequence of four binary symbols encoded with binary + tree with "Reverse" scheme, where one common binary tree "AlignDecoder" + is used for all posSlot values. + +If (posSlot < 4), the "dist" value is equal to posSlot value. + +If (posSlot >= 4), the decoder uses "posSlot" value to calculate the value of + the high bits of "dist" value and the number of the low bits. + + If (4 <= posSlot < kEndPosModelIndex), the decoder uses bit tree decoders. + (one separated bit tree decoder per one posSlot value) and "Reverse" scheme. + In this implementation we use one CProb array "PosDecoders" that contains + all CProb variables for all these bit decoders. + + if (posSlot >= kEndPosModelIndex), the middle bits are decoded as direct + bits from RangeDecoder and the low 4 bits are decoded with a bit tree + decoder "AlignDecoder" with "Reverse" scheme. + +The code to decode zero-based match distance: + + unsigned DecodeDistance(unsigned len) + { + unsigned lenState = len; + if (lenState > kNumLenToPosStates - 1) + lenState = kNumLenToPosStates - 1; + + unsigned posSlot = PosSlotDecoder[lenState].Decode(&RangeDec); + if (posSlot < 4) + return posSlot; + + unsigned numDirectBits = (unsigned)((posSlot >> 1) - 1); + UInt32 dist = ((2 | (posSlot & 1)) << numDirectBits); + if (posSlot < kEndPosModelIndex) + dist += BitTreeReverseDecode(PosDecoders + dist - posSlot, numDirectBits, &RangeDec); + else + { + dist += RangeDec.DecodeDirectBits(numDirectBits - kNumAlignBits) << kNumAlignBits; + dist += AlignDecoder.ReverseDecode(&RangeDec); + } + return dist; + } + + + +LZMA Decoding modes +------------------- + +There are 2 types of LZMA streams: + +1) The stream with "End of stream" marker. +2) The stream without "End of stream" marker. + +And the LZMA Decoder supports 3 modes of decoding: + +1) The unpack size is undefined. The LZMA decoder stops decoding after + getting "End of stream" marker. + The input variables for that case: + + markerIsMandatory = true + unpackSizeDefined = false + unpackSize contains any value + +2) The unpack size is defined and LZMA decoder supports both variants, + where the stream can contain "End of stream" marker or the stream is + finished without "End of stream" marker. The LZMA decoder must detect + any of these situations. + The input variables for that case: + + markerIsMandatory = false + unpackSizeDefined = true + unpackSize contains unpack size + +3) The unpack size is defined and the LZMA stream must contain + "End of stream" marker + The input variables for that case: + + markerIsMandatory = true + unpackSizeDefined = true + unpackSize contains unpack size + + +The main loop of decoder +------------------------ + +The main loop of LZMA decoder: + +Initialize the LZMA state. +loop +{ + // begin of loop + Check "end of stream" conditions. + Decode Type of MATCH / LITERAL. + If it's LITERAL, decode LITERAL value and put the LITERAL to Window. + If it's MATCH, decode the length of match and the match distance. + Check error conditions, check end of stream conditions and copy + the sequence of match bytes from sliding window to current position + in window. + Go to begin of loop +} + +The reference implementation of LZMA decoder uses "unpackSize" variable +to keep the number of remaining bytes in output stream. So it reduces +"unpackSize" value after each decoded LITERAL or MATCH. + +The following code contains the "end of stream" condition check at the start +of the loop: + + if (unpackSizeDefined && unpackSize == 0 && !markerIsMandatory) + if (RangeDec.IsFinishedOK()) + return LZMA_RES_FINISHED_WITHOUT_MARKER; + +LZMA uses three types of matches: + +1) "Simple Match" - the match with distance value encoded with bit models. + +2) "Rep Match" - the match that uses the distance from distance + history table. + +3) "Short Rep Match" - the match of single byte length, that uses the latest + distance from distance history table. + +The LZMA decoder keeps the history of latest 4 match distances that were used +by decoder. That set of 4 variables contains zero-based match distances and +these variables are initialized with zero values: + + UInt32 rep0 = 0, rep1 = 0, rep2 = 0, rep3 = 0; + +The LZMA decoder uses binary model variables to select type of MATCH or LITERAL: + +#define kNumStates 12 +#define kNumPosBitsMax 4 + + CProb IsMatch[kNumStates << kNumPosBitsMax]; + CProb IsRep[kNumStates]; + CProb IsRepG0[kNumStates]; + CProb IsRepG1[kNumStates]; + CProb IsRepG2[kNumStates]; + CProb IsRep0Long[kNumStates << kNumPosBitsMax]; + +The decoder uses "state" variable value to select exact variable +from "IsRep", "IsRepG0", "IsRepG1" and "IsRepG2" arrays. +The "state" variable can get the value from 0 to 11. +Initial value for "state" variable is zero: + + unsigned state = 0; + +The "state" variable is updated after each LITERAL or MATCH with one of the +following functions: + +unsigned UpdateState_Literal(unsigned state) +{ + if (state < 4) return 0; + else if (state < 10) return state - 3; + else return state - 6; +} +unsigned UpdateState_Match (unsigned state) { return state < 7 ? 7 : 10; } +unsigned UpdateState_Rep (unsigned state) { return state < 7 ? 8 : 11; } +unsigned UpdateState_ShortRep(unsigned state) { return state < 7 ? 9 : 11; } + +The decoder calculates "state2" variable value to select exact variable from +"IsMatch" and "IsRep0Long" arrays: + +unsigned posState = OutWindow.TotalPos & ((1 << pb) - 1); +unsigned state2 = (state << kNumPosBitsMax) + posState; + +The decoder uses the following code flow scheme to select exact +type of LITERAL or MATCH: + +IsMatch[state2] decode + 0 - the Literal + 1 - the Match + IsRep[state] decode + 0 - Simple Match + 1 - Rep Match + IsRepG0[state] decode + 0 - the distance is rep0 + IsRep0Long[state2] decode + 0 - Short Rep Match + 1 - Rep Match 0 + 1 - + IsRepG1[state] decode + 0 - Rep Match 1 + 1 - + IsRepG2[state] decode + 0 - Rep Match 2 + 1 - Rep Match 3 + + +LITERAL symbol +-------------- +If the value "0" was decoded with IsMatch[state2] decoding, we have "LITERAL" type. + +At first the LZMA decoder must check that it doesn't exceed +specified uncompressed size: + + if (unpackSizeDefined && unpackSize == 0) + return LZMA_RES_ERROR; + +Then it decodes literal value and puts it to sliding window: + + DecodeLiteral(state, rep0); + +Then the decoder must update the "state" value and "unpackSize" value; + + state = UpdateState_Literal(state); + unpackSize--; + +Then the decoder must go to the begin of main loop to decode next Match or Literal. + + +Simple Match +------------ + +If the value "1" was decoded with IsMatch[state2] decoding, +we have the "Simple Match" type. + +The distance history table is updated with the following scheme: + + rep3 = rep2; + rep2 = rep1; + rep1 = rep0; + +The zero-based length is decoded with "LenDecoder": + + len = LenDecoder.Decode(&RangeDec, posState); + +The state is update with UpdateState_Match function: + + state = UpdateState_Match(state); + +and the new "rep0" value is decoded with DecodeDistance: + + rep0 = DecodeDistance(len); + +That "rep0" will be used as zero-based distance for current match. + +If the value of "rep0" is equal to 0xFFFFFFFF, it means that we have +"End of stream" marker, so we can stop decoding and check finishing +condition in Range Decoder: + + if (rep0 == 0xFFFFFFFF) + return RangeDec.IsFinishedOK() ? + LZMA_RES_FINISHED_WITH_MARKER : + LZMA_RES_ERROR; + +If uncompressed size is defined, LZMA decoder must check that it doesn't +exceed that specified uncompressed size: + + if (unpackSizeDefined && unpackSize == 0) + return LZMA_RES_ERROR; + +Also the decoder must check that "rep0" value is not larger than dictionary size +and is not larger than the number of already decoded bytes: + + if (rep0 >= dictSize || !OutWindow.CheckDistance(rep0)) + return LZMA_RES_ERROR; + +Then the decoder must copy match bytes as described in +"The match symbols copying" section. + + +Rep Match +--------- + +If the LZMA decoder has decoded the value "1" with IsRep[state] variable, +we have "Rep Match" type. + +At first the LZMA decoder must check that it doesn't exceed +specified uncompressed size: + + if (unpackSizeDefined && unpackSize == 0) + return LZMA_RES_ERROR; + +Also the decoder must return error, if the LZ window is empty: + + if (OutWindow.IsEmpty()) + return LZMA_RES_ERROR; + +If the match type is "Rep Match", the decoder uses one of the 4 variables of +distance history table to get the value of distance for current match. +And there are 4 corresponding ways of decoding flow. + +The decoder updates the distance history with the following scheme +depending from type of match: + +- "Rep Match 0" or "Short Rep Match": + ; LZMA doesn't update the distance history + +- "Rep Match 1": + UInt32 dist = rep1; + rep1 = rep0; + rep0 = dist; + +- "Rep Match 2": + UInt32 dist = rep2; + rep2 = rep1; + rep1 = rep0; + rep0 = dist; + +- "Rep Match 3": + UInt32 dist = rep3; + rep3 = rep2; + rep2 = rep1; + rep1 = rep0; + rep0 = dist; + +Then the decoder decodes exact subtype of "Rep Match" using "IsRepG0", "IsRep0Long", +"IsRepG1", "IsRepG2". + +If the subtype is "Short Rep Match", the decoder updates the state, puts +the one byte from window to current position in window and goes to next +MATCH/LITERAL symbol (the begin of main loop): + + state = UpdateState_ShortRep(state); + OutWindow.PutByte(OutWindow.GetByte(rep0 + 1)); + unpackSize--; + continue; + +In other cases (Rep Match 0/1/2/3), it decodes the zero-based +length of match with "RepLenDecoder" decoder: + + len = RepLenDecoder.Decode(&RangeDec, posState); + +Then it updates the state: + + state = UpdateState_Rep(state); + +Then the decoder must copy match bytes as described in +"The Match symbols copying" section. + + +The match symbols copying +------------------------- + +If we have the match (Simple Match or Rep Match 0/1/2/3), the decoder must +copy the sequence of bytes with calculated match distance and match length. +If uncompressed size is defined, LZMA decoder must check that it doesn't +exceed that specified uncompressed size: + + len += kMatchMinLen; + bool isError = false; + if (unpackSizeDefined && unpackSize < len) + { + len = (unsigned)unpackSize; + isError = true; + } + OutWindow.CopyMatch(rep0 + 1, len); + unpackSize -= len; + if (isError) + return LZMA_RES_ERROR; + +Then the decoder must go to the begin of main loop to decode next MATCH or LITERAL. + + + +NOTES +----- + +This specification doesn't describe the variant of decoder implementation +that supports partial decoding. Such partial decoding case can require some +changes in "end of stream" condition checks code. Also such code +can use additional status codes, returned by decoder. + +This specification uses C++ code with templates to simplify describing. +The optimized version of LZMA decoder doesn't need templates. +Such optimized version can use just two arrays of CProb variables: + 1) The dynamic array of CProb variables allocated for the Literal Decoder. + 2) The one common array that contains all other CProb variables. + + +References: + +1. G. N. N. Martin, Range encoding: an algorithm for removing redundancy + from a digitized message, Video & Data Recording Conference, + Southampton, UK, July 24-27, 1979. diff --git a/deps/LZMA-SDK/DOC/lzma.txt b/deps/LZMA-SDK/DOC/lzma.txt index 1f92142ea..a65988fe0 100644 --- a/deps/LZMA-SDK/DOC/lzma.txt +++ b/deps/LZMA-SDK/DOC/lzma.txt @@ -1,328 +1,328 @@ -LZMA compression ----------------- -Version: 9.35 - -This file describes LZMA encoding and decoding functions written in C language. - -LZMA is an improved version of famous LZ77 compression algorithm. -It was improved in way of maximum increasing of compression ratio, -keeping high decompression speed and low memory requirements for -decompressing. - -Note: you can read also LZMA Specification (lzma-specification.txt from LZMA SDK) - -Also you can look source code for LZMA encoding and decoding: - C/Util/Lzma/LzmaUtil.c - - -LZMA compressed file format ---------------------------- -Offset Size Description - 0 1 Special LZMA properties (lc,lp, pb in encoded form) - 1 4 Dictionary size (little endian) - 5 8 Uncompressed size (little endian). -1 means unknown size - 13 Compressed data - - - -ANSI-C LZMA Decoder -~~~~~~~~~~~~~~~~~~~ - -Please note that interfaces for ANSI-C code were changed in LZMA SDK 4.58. -If you want to use old interfaces you can download previous version of LZMA SDK -from sourceforge.net site. - -To use ANSI-C LZMA Decoder you need the following files: -1) LzmaDec.h + LzmaDec.c + 7zTypes.h + Precomp.h + Compiler.h - -Look example code: - C/Util/Lzma/LzmaUtil.c - - -Memory requirements for LZMA decoding -------------------------------------- - -Stack usage of LZMA decoding function for local variables is not -larger than 200-400 bytes. - -LZMA Decoder uses dictionary buffer and internal state structure. -Internal state structure consumes - state_size = (4 + (1.5 << (lc + lp))) KB -by default (lc=3, lp=0), state_size = 16 KB. - - -How To decompress data ----------------------- - -LZMA Decoder (ANSI-C version) now supports 2 interfaces: -1) Single-call Decompressing -2) Multi-call State Decompressing (zlib-like interface) - -You must use external allocator: -Example: -void *SzAlloc(void *p, size_t size) { p = p; return malloc(size); } -void SzFree(void *p, void *address) { p = p; free(address); } -ISzAlloc alloc = { SzAlloc, SzFree }; - -You can use p = p; operator to disable compiler warnings. - - -Single-call Decompressing -------------------------- -When to use: RAM->RAM decompressing -Compile files: LzmaDec.h + LzmaDec.c + 7zTypes.h -Compile defines: no defines -Memory Requirements: - - Input buffer: compressed size - - Output buffer: uncompressed size - - LZMA Internal Structures: state_size (16 KB for default settings) - -Interface: - int LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, - const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, - ELzmaStatus *status, ISzAlloc *alloc); - In: - dest - output data - destLen - output data size - src - input data - srcLen - input data size - propData - LZMA properties (5 bytes) - propSize - size of propData buffer (5 bytes) - finishMode - It has meaning only if the decoding reaches output limit (*destLen). - LZMA_FINISH_ANY - Decode just destLen bytes. - LZMA_FINISH_END - Stream must be finished after (*destLen). - You can use LZMA_FINISH_END, when you know that - current output buffer covers last bytes of stream. - alloc - Memory allocator. - - Out: - destLen - processed output size - srcLen - processed input size - - Output: - SZ_OK - status: - LZMA_STATUS_FINISHED_WITH_MARK - LZMA_STATUS_NOT_FINISHED - LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK - SZ_ERROR_DATA - Data error - SZ_ERROR_MEM - Memory allocation error - SZ_ERROR_UNSUPPORTED - Unsupported properties - SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). - - If LZMA decoder sees end_marker before reaching output limit, it returns OK result, - and output value of destLen will be less than output buffer size limit. - - You can use multiple checks to test data integrity after full decompression: - 1) Check Result and "status" variable. - 2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize. - 3) Check that output(srcLen) = compressedSize, if you know real compressedSize. - You must use correct finish mode in that case. */ - - -Multi-call State Decompressing (zlib-like interface) ----------------------------------------------------- - -When to use: file->file decompressing -Compile files: LzmaDec.h + LzmaDec.c + 7zTypes.h - -Memory Requirements: - - Buffer for input stream: any size (for example, 16 KB) - - Buffer for output stream: any size (for example, 16 KB) - - LZMA Internal Structures: state_size (16 KB for default settings) - - LZMA dictionary (dictionary size is encoded in LZMA properties header) - -1) read LZMA properties (5 bytes) and uncompressed size (8 bytes, little-endian) to header: - unsigned char header[LZMA_PROPS_SIZE + 8]; - ReadFile(inFile, header, sizeof(header) - -2) Allocate CLzmaDec structures (state + dictionary) using LZMA properties - - CLzmaDec state; - LzmaDec_Constr(&state); - res = LzmaDec_Allocate(&state, header, LZMA_PROPS_SIZE, &g_Alloc); - if (res != SZ_OK) - return res; - -3) Init LzmaDec structure before any new LZMA stream. And call LzmaDec_DecodeToBuf in loop - - LzmaDec_Init(&state); - for (;;) - { - ... - int res = LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, - const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode); - ... - } - - -4) Free all allocated structures - LzmaDec_Free(&state, &g_Alloc); - -Look example code: - C/Util/Lzma/LzmaUtil.c - - -How To compress data --------------------- - -Compile files: - 7zTypes.h - Threads.h - LzmaEnc.h - LzmaEnc.c - LzFind.h - LzFind.c - LzFindMt.h - LzFindMt.c - LzHash.h - -Memory Requirements: - - (dictSize * 11.5 + 6 MB) + state_size - -Lzma Encoder can use two memory allocators: -1) alloc - for small arrays. -2) allocBig - for big arrays. - -For example, you can use Large RAM Pages (2 MB) in allocBig allocator for -better compression speed. Note that Windows has bad implementation for -Large RAM Pages. -It's OK to use same allocator for alloc and allocBig. - - -Single-call Compression with callbacks --------------------------------------- - -Look example code: - C/Util/Lzma/LzmaUtil.c - -When to use: file->file compressing - -1) you must implement callback structures for interfaces: -ISeqInStream -ISeqOutStream -ICompressProgress -ISzAlloc - -static void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); } -static void SzFree(void *p, void *address) { p = p; MyFree(address); } -static ISzAlloc g_Alloc = { SzAlloc, SzFree }; - - CFileSeqInStream inStream; - CFileSeqOutStream outStream; - - inStream.funcTable.Read = MyRead; - inStream.file = inFile; - outStream.funcTable.Write = MyWrite; - outStream.file = outFile; - - -2) Create CLzmaEncHandle object; - - CLzmaEncHandle enc; - - enc = LzmaEnc_Create(&g_Alloc); - if (enc == 0) - return SZ_ERROR_MEM; - - -3) initialize CLzmaEncProps properties; - - LzmaEncProps_Init(&props); - - Then you can change some properties in that structure. - -4) Send LZMA properties to LZMA Encoder - - res = LzmaEnc_SetProps(enc, &props); - -5) Write encoded properties to header - - Byte header[LZMA_PROPS_SIZE + 8]; - size_t headerSize = LZMA_PROPS_SIZE; - UInt64 fileSize; - int i; - - res = LzmaEnc_WriteProperties(enc, header, &headerSize); - fileSize = MyGetFileLength(inFile); - for (i = 0; i < 8; i++) - header[headerSize++] = (Byte)(fileSize >> (8 * i)); - MyWriteFileAndCheck(outFile, header, headerSize) - -6) Call encoding function: - res = LzmaEnc_Encode(enc, &outStream.funcTable, &inStream.funcTable, - NULL, &g_Alloc, &g_Alloc); - -7) Destroy LZMA Encoder Object - LzmaEnc_Destroy(enc, &g_Alloc, &g_Alloc); - - -If callback function return some error code, LzmaEnc_Encode also returns that code -or it can return the code like SZ_ERROR_READ, SZ_ERROR_WRITE or SZ_ERROR_PROGRESS. - - -Single-call RAM->RAM Compression --------------------------------- - -Single-call RAM->RAM Compression is similar to Compression with callbacks, -but you provide pointers to buffers instead of pointers to stream callbacks: - -SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, - const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, - ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); - -Return code: - SZ_OK - OK - SZ_ERROR_MEM - Memory allocation error - SZ_ERROR_PARAM - Incorrect paramater - SZ_ERROR_OUTPUT_EOF - output buffer overflow - SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) - - - -Defines -------- - -_LZMA_SIZE_OPT - Enable some optimizations in LZMA Decoder to get smaller executable code. - -_LZMA_PROB32 - It can increase the speed on some 32-bit CPUs, but memory usage for - some structures will be doubled in that case. - -_LZMA_UINT32_IS_ULONG - Define it if int is 16-bit on your compiler and long is 32-bit. - -_LZMA_NO_SYSTEM_SIZE_T - Define it if you don't want to use size_t type. - - -_7ZIP_PPMD_SUPPPORT - Define it if you don't want to support PPMD method in AMSI-C .7z decoder. - - -C++ LZMA Encoder/Decoder -~~~~~~~~~~~~~~~~~~~~~~~~ -C++ LZMA code use COM-like interfaces. So if you want to use it, -you can study basics of COM/OLE. -C++ LZMA code is just wrapper over ANSI-C code. - - -C++ Notes -~~~~~~~~~~~~~~~~~~~~~~~~ -If you use some C++ code folders in 7-Zip (for example, C++ code for .7z handling), -you must check that you correctly work with "new" operator. -7-Zip can be compiled with MSVC 6.0 that doesn't throw "exception" from "new" operator. -So 7-Zip uses "CPP\Common\NewHandler.cpp" that redefines "new" operator: -operator new(size_t size) -{ - void *p = ::malloc(size); - if (p == 0) - throw CNewException(); - return p; -} -If you use MSCV that throws exception for "new" operator, you can compile without -"NewHandler.cpp". So standard exception will be used. Actually some code of -7-Zip catches any exception in internal code and converts it to HRESULT code. -So you don't need to catch CNewException, if you call COM interfaces of 7-Zip. - ---- - -http://www.7-zip.org -http://www.7-zip.org/sdk.html -http://www.7-zip.org/support.html +LZMA compression +---------------- +Version: 9.35 + +This file describes LZMA encoding and decoding functions written in C language. + +LZMA is an improved version of famous LZ77 compression algorithm. +It was improved in way of maximum increasing of compression ratio, +keeping high decompression speed and low memory requirements for +decompressing. + +Note: you can read also LZMA Specification (lzma-specification.txt from LZMA SDK) + +Also you can look source code for LZMA encoding and decoding: + C/Util/Lzma/LzmaUtil.c + + +LZMA compressed file format +--------------------------- +Offset Size Description + 0 1 Special LZMA properties (lc,lp, pb in encoded form) + 1 4 Dictionary size (little endian) + 5 8 Uncompressed size (little endian). -1 means unknown size + 13 Compressed data + + + +ANSI-C LZMA Decoder +~~~~~~~~~~~~~~~~~~~ + +Please note that interfaces for ANSI-C code were changed in LZMA SDK 4.58. +If you want to use old interfaces you can download previous version of LZMA SDK +from sourceforge.net site. + +To use ANSI-C LZMA Decoder you need the following files: +1) LzmaDec.h + LzmaDec.c + 7zTypes.h + Precomp.h + Compiler.h + +Look example code: + C/Util/Lzma/LzmaUtil.c + + +Memory requirements for LZMA decoding +------------------------------------- + +Stack usage of LZMA decoding function for local variables is not +larger than 200-400 bytes. + +LZMA Decoder uses dictionary buffer and internal state structure. +Internal state structure consumes + state_size = (4 + (1.5 << (lc + lp))) KB +by default (lc=3, lp=0), state_size = 16 KB. + + +How To decompress data +---------------------- + +LZMA Decoder (ANSI-C version) now supports 2 interfaces: +1) Single-call Decompressing +2) Multi-call State Decompressing (zlib-like interface) + +You must use external allocator: +Example: +void *SzAlloc(void *p, size_t size) { p = p; return malloc(size); } +void SzFree(void *p, void *address) { p = p; free(address); } +ISzAlloc alloc = { SzAlloc, SzFree }; + +You can use p = p; operator to disable compiler warnings. + + +Single-call Decompressing +------------------------- +When to use: RAM->RAM decompressing +Compile files: LzmaDec.h + LzmaDec.c + 7zTypes.h +Compile defines: no defines +Memory Requirements: + - Input buffer: compressed size + - Output buffer: uncompressed size + - LZMA Internal Structures: state_size (16 KB for default settings) + +Interface: + int LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, + const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode, + ELzmaStatus *status, ISzAlloc *alloc); + In: + dest - output data + destLen - output data size + src - input data + srcLen - input data size + propData - LZMA properties (5 bytes) + propSize - size of propData buffer (5 bytes) + finishMode - It has meaning only if the decoding reaches output limit (*destLen). + LZMA_FINISH_ANY - Decode just destLen bytes. + LZMA_FINISH_END - Stream must be finished after (*destLen). + You can use LZMA_FINISH_END, when you know that + current output buffer covers last bytes of stream. + alloc - Memory allocator. + + Out: + destLen - processed output size + srcLen - processed input size + + Output: + SZ_OK + status: + LZMA_STATUS_FINISHED_WITH_MARK + LZMA_STATUS_NOT_FINISHED + LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK + SZ_ERROR_DATA - Data error + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_UNSUPPORTED - Unsupported properties + SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src). + + If LZMA decoder sees end_marker before reaching output limit, it returns OK result, + and output value of destLen will be less than output buffer size limit. + + You can use multiple checks to test data integrity after full decompression: + 1) Check Result and "status" variable. + 2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize. + 3) Check that output(srcLen) = compressedSize, if you know real compressedSize. + You must use correct finish mode in that case. */ + + +Multi-call State Decompressing (zlib-like interface) +---------------------------------------------------- + +When to use: file->file decompressing +Compile files: LzmaDec.h + LzmaDec.c + 7zTypes.h + +Memory Requirements: + - Buffer for input stream: any size (for example, 16 KB) + - Buffer for output stream: any size (for example, 16 KB) + - LZMA Internal Structures: state_size (16 KB for default settings) + - LZMA dictionary (dictionary size is encoded in LZMA properties header) + +1) read LZMA properties (5 bytes) and uncompressed size (8 bytes, little-endian) to header: + unsigned char header[LZMA_PROPS_SIZE + 8]; + ReadFile(inFile, header, sizeof(header) + +2) Allocate CLzmaDec structures (state + dictionary) using LZMA properties + + CLzmaDec state; + LzmaDec_Constr(&state); + res = LzmaDec_Allocate(&state, header, LZMA_PROPS_SIZE, &g_Alloc); + if (res != SZ_OK) + return res; + +3) Init LzmaDec structure before any new LZMA stream. And call LzmaDec_DecodeToBuf in loop + + LzmaDec_Init(&state); + for (;;) + { + ... + int res = LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, + const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode); + ... + } + + +4) Free all allocated structures + LzmaDec_Free(&state, &g_Alloc); + +Look example code: + C/Util/Lzma/LzmaUtil.c + + +How To compress data +-------------------- + +Compile files: + 7zTypes.h + Threads.h + LzmaEnc.h + LzmaEnc.c + LzFind.h + LzFind.c + LzFindMt.h + LzFindMt.c + LzHash.h + +Memory Requirements: + - (dictSize * 11.5 + 6 MB) + state_size + +Lzma Encoder can use two memory allocators: +1) alloc - for small arrays. +2) allocBig - for big arrays. + +For example, you can use Large RAM Pages (2 MB) in allocBig allocator for +better compression speed. Note that Windows has bad implementation for +Large RAM Pages. +It's OK to use same allocator for alloc and allocBig. + + +Single-call Compression with callbacks +-------------------------------------- + +Look example code: + C/Util/Lzma/LzmaUtil.c + +When to use: file->file compressing + +1) you must implement callback structures for interfaces: +ISeqInStream +ISeqOutStream +ICompressProgress +ISzAlloc + +static void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); } +static void SzFree(void *p, void *address) { p = p; MyFree(address); } +static ISzAlloc g_Alloc = { SzAlloc, SzFree }; + + CFileSeqInStream inStream; + CFileSeqOutStream outStream; + + inStream.funcTable.Read = MyRead; + inStream.file = inFile; + outStream.funcTable.Write = MyWrite; + outStream.file = outFile; + + +2) Create CLzmaEncHandle object; + + CLzmaEncHandle enc; + + enc = LzmaEnc_Create(&g_Alloc); + if (enc == 0) + return SZ_ERROR_MEM; + + +3) initialize CLzmaEncProps properties; + + LzmaEncProps_Init(&props); + + Then you can change some properties in that structure. + +4) Send LZMA properties to LZMA Encoder + + res = LzmaEnc_SetProps(enc, &props); + +5) Write encoded properties to header + + Byte header[LZMA_PROPS_SIZE + 8]; + size_t headerSize = LZMA_PROPS_SIZE; + UInt64 fileSize; + int i; + + res = LzmaEnc_WriteProperties(enc, header, &headerSize); + fileSize = MyGetFileLength(inFile); + for (i = 0; i < 8; i++) + header[headerSize++] = (Byte)(fileSize >> (8 * i)); + MyWriteFileAndCheck(outFile, header, headerSize) + +6) Call encoding function: + res = LzmaEnc_Encode(enc, &outStream.funcTable, &inStream.funcTable, + NULL, &g_Alloc, &g_Alloc); + +7) Destroy LZMA Encoder Object + LzmaEnc_Destroy(enc, &g_Alloc, &g_Alloc); + + +If callback function return some error code, LzmaEnc_Encode also returns that code +or it can return the code like SZ_ERROR_READ, SZ_ERROR_WRITE or SZ_ERROR_PROGRESS. + + +Single-call RAM->RAM Compression +-------------------------------- + +Single-call RAM->RAM Compression is similar to Compression with callbacks, +but you provide pointers to buffers instead of pointers to stream callbacks: + +SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen, + const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark, + ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig); + +Return code: + SZ_OK - OK + SZ_ERROR_MEM - Memory allocation error + SZ_ERROR_PARAM - Incorrect paramater + SZ_ERROR_OUTPUT_EOF - output buffer overflow + SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version) + + + +Defines +------- + +_LZMA_SIZE_OPT - Enable some optimizations in LZMA Decoder to get smaller executable code. + +_LZMA_PROB32 - It can increase the speed on some 32-bit CPUs, but memory usage for + some structures will be doubled in that case. + +_LZMA_UINT32_IS_ULONG - Define it if int is 16-bit on your compiler and long is 32-bit. + +_LZMA_NO_SYSTEM_SIZE_T - Define it if you don't want to use size_t type. + + +_7ZIP_PPMD_SUPPPORT - Define it if you don't want to support PPMD method in AMSI-C .7z decoder. + + +C++ LZMA Encoder/Decoder +~~~~~~~~~~~~~~~~~~~~~~~~ +C++ LZMA code use COM-like interfaces. So if you want to use it, +you can study basics of COM/OLE. +C++ LZMA code is just wrapper over ANSI-C code. + + +C++ Notes +~~~~~~~~~~~~~~~~~~~~~~~~ +If you use some C++ code folders in 7-Zip (for example, C++ code for .7z handling), +you must check that you correctly work with "new" operator. +7-Zip can be compiled with MSVC 6.0 that doesn't throw "exception" from "new" operator. +So 7-Zip uses "CPP\Common\NewHandler.cpp" that redefines "new" operator: +operator new(size_t size) +{ + void *p = ::malloc(size); + if (p == 0) + throw CNewException(); + return p; +} +If you use MSCV that throws exception for "new" operator, you can compile without +"NewHandler.cpp". So standard exception will be used. Actually some code of +7-Zip catches any exception in internal code and converts it to HRESULT code. +So you don't need to catch CNewException, if you call COM interfaces of 7-Zip. + +--- + +http://www.7-zip.org +http://www.7-zip.org/sdk.html +http://www.7-zip.org/support.html diff --git a/deps/unrar/UnRAR.vcxproj b/deps/unrar/UnRAR.vcxproj index 512bcf15d..b55873e37 100644 --- a/deps/unrar/UnRAR.vcxproj +++ b/deps/unrar/UnRAR.vcxproj @@ -1,279 +1,279 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {95CC809B-03FC-4EDB-BB20-FD07A698C05F} - UnRAR - Win32Proj - 8.1 - - - - Application - v140_xp - MultiByte - true - - - Application - v140_xp - MultiByte - - - Application - v140_xp - MultiByte - false - - - Application - v140_xp - MultiByte - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>14.0.24720.0 - - - build\unrar32\$(Configuration)\ - build\unrar32\$(Configuration)\obj\ - true - false - - - build\unrar64\$(Configuration)\ - build\unrar64\$(Configuration)\obj\ - true - false - - - build\unrar32\$(Configuration)\ - build\unrar32\$(Configuration)\obj\ - false - false - - - build\unrar64\$(Configuration)\ - build\unrar64\$(Configuration)\obj\ - false - false - - - - /MP %(AdditionalOptions) - Disabled - UNRAR;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - false - Use - rar.hpp - Level3 - ProgramDatabase - StdCall - 4007;4996;%(DisableSpecificWarnings) - NoExtensions - - - true - Console - MachineX86 - - - - - X64 - - - /MP %(AdditionalOptions) - Disabled - UNRAR;%(PreprocessorDefinitions) - false - EnableFastChecks - MultiThreadedDebug - false - Use - rar.hpp - Level3 - ProgramDatabase - StdCall - 4007;4996;%(DisableSpecificWarnings) - NotSet - - - true - Console - MachineX64 - - - - - /MP %(AdditionalOptions) - MaxSpeed - true - Neither - true - false - UNRAR;%(PreprocessorDefinitions) - false - MultiThreaded - Default - true - true - NoExtensions - Precise - false - Use - rar.hpp - Level3 - ProgramDatabase - StdCall - 4007;4996;%(DisableSpecificWarnings) - - - true - Console - true - true - - MachineX86 - - - - - X64 - - - /MP %(AdditionalOptions) - MinSpace - true - Neither - true - false - UNRAR;%(PreprocessorDefinitions) - false - false - MultiThreaded - true - true - false - Use - rar.hpp - Level3 - ProgramDatabase - StdCall - 4007;4996;%(DisableSpecificWarnings) - NotSet - - - true - Console - true - true - - MachineX64 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {95CC809B-03FC-4EDB-BB20-FD07A698C05F} + UnRAR + Win32Proj + 8.1 + + + + Application + v140_xp + MultiByte + true + + + Application + v140_xp + MultiByte + + + Application + v140_xp + MultiByte + false + + + Application + v140_xp + MultiByte + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>14.0.24720.0 + + + build\unrar32\$(Configuration)\ + build\unrar32\$(Configuration)\obj\ + true + false + + + build\unrar64\$(Configuration)\ + build\unrar64\$(Configuration)\obj\ + true + false + + + build\unrar32\$(Configuration)\ + build\unrar32\$(Configuration)\obj\ + false + false + + + build\unrar64\$(Configuration)\ + build\unrar64\$(Configuration)\obj\ + false + false + + + + /MP %(AdditionalOptions) + Disabled + UNRAR;%(PreprocessorDefinitions) + false + EnableFastChecks + MultiThreadedDebug + false + Use + rar.hpp + Level3 + ProgramDatabase + StdCall + 4007;4996;%(DisableSpecificWarnings) + NoExtensions + + + true + Console + MachineX86 + + + + + X64 + + + /MP %(AdditionalOptions) + Disabled + UNRAR;%(PreprocessorDefinitions) + false + EnableFastChecks + MultiThreadedDebug + false + Use + rar.hpp + Level3 + ProgramDatabase + StdCall + 4007;4996;%(DisableSpecificWarnings) + NotSet + + + true + Console + MachineX64 + + + + + /MP %(AdditionalOptions) + MaxSpeed + true + Neither + true + false + UNRAR;%(PreprocessorDefinitions) + false + MultiThreaded + Default + true + true + NoExtensions + Precise + false + Use + rar.hpp + Level3 + ProgramDatabase + StdCall + 4007;4996;%(DisableSpecificWarnings) + + + true + Console + true + true + + MachineX86 + + + + + X64 + + + /MP %(AdditionalOptions) + MinSpace + true + Neither + true + false + UNRAR;%(PreprocessorDefinitions) + false + false + MultiThreaded + true + true + false + Use + rar.hpp + Level3 + ProgramDatabase + StdCall + 4007;4996;%(DisableSpecificWarnings) + NotSet + + + true + Console + true + true + + MachineX64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/deps/unrar/UnRARDll.vcxproj b/deps/unrar/UnRARDll.vcxproj index ec5c17b00..d96e4d1c1 100644 --- a/deps/unrar/UnRARDll.vcxproj +++ b/deps/unrar/UnRARDll.vcxproj @@ -1,420 +1,420 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - release_nocrypt - Win32 - - - release_nocrypt - x64 - - - Release - Win32 - - - Release - x64 - - - - UnRAR - {E815C46C-36C4-499F-BBC2-E772C6B17971} - UnRAR - Win32Proj - 8.1 - - - - DynamicLibrary - v140_xp - MultiByte - true - - - DynamicLibrary - v140_xp - MultiByte - true - - - DynamicLibrary - v140_xp - MultiByte - - - DynamicLibrary - v140_xp - MultiByte - false - - - DynamicLibrary - v140_xp - MultiByte - false - - - DynamicLibrary - v140_xp - MultiByte - - - - - - - - - - - - - - - - - - - - - - - - - <_ProjectFileVersion>14.0.24720.0 - - - build\unrardll32\$(Configuration)\ - build\unrardll32\$(Configuration)\obj\ - true - true - - - build\unrardll64\$(Configuration)\ - build\unrardll64\$(Configuration)\obj\ - true - true - - - build\unrardll32\$(Configuration)\ - build\unrardll32\$(Configuration)\obj\ - false - true - - - build\unrardll64\$(Configuration)\ - build\unrardll64\$(Configuration)\obj\ - false - true - - - build\unrardll32\$(Configuration)\ - build\unrardll32\$(Configuration)\obj\ - false - true - - - build\unrardll64\$(Configuration)\ - build\unrardll64\$(Configuration)\obj\ - false - true - - - - /MP %(AdditionalOptions) - Disabled - RARDLL;UNRAR;SILENT;%(PreprocessorDefinitions) - false - Sync - EnableFastChecks - MultiThreadedDebug - 4Bytes - false - Use - rar.hpp - Level3 - ProgramDatabase - Cdecl - 4007;4996;%(DisableSpecificWarnings) - NoExtensions - - - $(OutDir)unrar.dll - dll.def - true - Console - MachineX86 - - - - - X64 - - - /MP %(AdditionalOptions) - Disabled - RARDLL;UNRAR;SILENT;%(PreprocessorDefinitions) - false - Sync - EnableFastChecks - MultiThreadedDebug - 4Bytes - false - Use - rar.hpp - Level3 - ProgramDatabase - Cdecl - 4007;4996;%(DisableSpecificWarnings) - NotSet - - - $(OutDir)unrar.dll - dll.def - true - Console - MachineX64 - - - - - /MP %(AdditionalOptions) - MaxSpeed - true - Neither - true - false - RARDLL;UNRAR;SILENT;%(PreprocessorDefinitions) - false - Sync - MultiThreaded - 4Bytes - true - true - NoExtensions - Precise - false - Use - rar.hpp - Level3 - ProgramDatabase - Cdecl - 4007;4996;%(DisableSpecificWarnings) - - - /SAFESEH %(AdditionalOptions) - $(OutDir)unrar.dll - dll.def - true - Console - true - true - - MachineX86 - - - - - X64 - - - /MP %(AdditionalOptions) - MaxSpeed - true - Neither - true - false - RARDLL;UNRAR;SILENT;%(PreprocessorDefinitions) - false - false - Sync - MultiThreaded - 4Bytes - true - true - false - Use - rar.hpp - Level3 - ProgramDatabase - Cdecl - 4007;4996;%(DisableSpecificWarnings) - NotSet - - - $(OutDir)unrar.dll - dll.def - true - Console - true - true - - MachineX64 - - - - - /MP %(AdditionalOptions) - MaxSpeed - true - Neither - true - false - RARDLL;UNRAR;SILENT;RAR_NOCRYPT;%(PreprocessorDefinitions) - false - Sync - MultiThreaded - 4Bytes - true - true - NoExtensions - Precise - false - Use - rar.hpp - Level3 - ProgramDatabase - Cdecl - 4007;4996;%(DisableSpecificWarnings) - - - /SAFESEH %(AdditionalOptions) - $(OutDir)unrar.dll - dll_nocrypt.def - true - Console - true - true - - MachineX86 - - - - - X64 - - - /MP %(AdditionalOptions) - MaxSpeed - true - Neither - true - false - RARDLL;UNRAR;SILENT;RAR_NOCRYPT;%(PreprocessorDefinitions) - false - false - Sync - MultiThreaded - 4Bytes - true - true - false - Use - rar.hpp - Level3 - ProgramDatabase - StdCall - 4007;4996;%(DisableSpecificWarnings) - NotSet - - - $(OutDir)unrar.dll - dll_nocrypt.def - true - Console - true - true - - MachineX64 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create - Create - Create - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Debug + x64 + + + release_nocrypt + Win32 + + + release_nocrypt + x64 + + + Release + Win32 + + + Release + x64 + + + + UnRAR + {E815C46C-36C4-499F-BBC2-E772C6B17971} + UnRAR + Win32Proj + 8.1 + + + + DynamicLibrary + v140_xp + MultiByte + true + + + DynamicLibrary + v140_xp + MultiByte + true + + + DynamicLibrary + v140_xp + MultiByte + + + DynamicLibrary + v140_xp + MultiByte + false + + + DynamicLibrary + v140_xp + MultiByte + false + + + DynamicLibrary + v140_xp + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>14.0.24720.0 + + + build\unrardll32\$(Configuration)\ + build\unrardll32\$(Configuration)\obj\ + true + true + + + build\unrardll64\$(Configuration)\ + build\unrardll64\$(Configuration)\obj\ + true + true + + + build\unrardll32\$(Configuration)\ + build\unrardll32\$(Configuration)\obj\ + false + true + + + build\unrardll64\$(Configuration)\ + build\unrardll64\$(Configuration)\obj\ + false + true + + + build\unrardll32\$(Configuration)\ + build\unrardll32\$(Configuration)\obj\ + false + true + + + build\unrardll64\$(Configuration)\ + build\unrardll64\$(Configuration)\obj\ + false + true + + + + /MP %(AdditionalOptions) + Disabled + RARDLL;UNRAR;SILENT;%(PreprocessorDefinitions) + false + Sync + EnableFastChecks + MultiThreadedDebug + Default + false + Use + rar.hpp + Level3 + ProgramDatabase + Cdecl + 4007;4996;%(DisableSpecificWarnings) + NoExtensions + + + $(OutDir)unrar.dll + dll.def + true + Console + MachineX86 + + + + + X64 + + + /MP %(AdditionalOptions) + Disabled + RARDLL;UNRAR;SILENT;%(PreprocessorDefinitions) + false + Sync + EnableFastChecks + MultiThreadedDebug + Default + false + Use + rar.hpp + Level3 + ProgramDatabase + Cdecl + 4007;4996;%(DisableSpecificWarnings) + NotSet + + + $(OutDir)unrar.dll + dll.def + true + Console + MachineX64 + + + + + /MP %(AdditionalOptions) + MaxSpeed + true + Neither + true + false + RARDLL;UNRAR;SILENT;%(PreprocessorDefinitions) + false + Sync + MultiThreaded + Default + true + true + NoExtensions + Precise + false + Use + rar.hpp + Level3 + ProgramDatabase + Cdecl + 4007;4996;%(DisableSpecificWarnings) + + + /SAFESEH %(AdditionalOptions) + $(OutDir)unrar.dll + dll.def + true + Console + true + true + + MachineX86 + + + + + X64 + + + /MP %(AdditionalOptions) + MaxSpeed + true + Neither + true + false + RARDLL;UNRAR;SILENT;%(PreprocessorDefinitions) + false + false + Sync + MultiThreaded + Default + true + true + false + Use + rar.hpp + Level3 + ProgramDatabase + Cdecl + 4007;4996;%(DisableSpecificWarnings) + NotSet + + + $(OutDir)unrar.dll + dll.def + true + Console + true + true + + MachineX64 + + + + + /MP %(AdditionalOptions) + MaxSpeed + true + Neither + true + false + RARDLL;UNRAR;SILENT;RAR_NOCRYPT;%(PreprocessorDefinitions) + false + Sync + MultiThreaded + Default + true + true + NoExtensions + Precise + false + Use + rar.hpp + Level3 + ProgramDatabase + Cdecl + 4007;4996;%(DisableSpecificWarnings) + + + /SAFESEH %(AdditionalOptions) + $(OutDir)unrar.dll + dll_nocrypt.def + true + Console + true + true + + MachineX86 + + + + + X64 + + + /MP %(AdditionalOptions) + MaxSpeed + true + Neither + true + false + RARDLL;UNRAR;SILENT;RAR_NOCRYPT;%(PreprocessorDefinitions) + false + false + Sync + MultiThreaded + Default + true + true + false + Use + rar.hpp + Level3 + ProgramDatabase + StdCall + 4007;4996;%(DisableSpecificWarnings) + NotSet + + + $(OutDir)unrar.dll + dll_nocrypt.def + true + Console + true + true + + MachineX64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/deps/unrar/acknow.txt b/deps/unrar/acknow.txt index 60a772fa1..b8d35a6aa 100644 --- a/deps/unrar/acknow.txt +++ b/deps/unrar/acknow.txt @@ -1,92 +1,59 @@ - ACKNOWLEDGMENTS - -* We used "Screaming Fast Galois Field Arithmetic Using Intel - SIMD Instructions" paper by James S. Plank, Kevin M. Greenan - and Ethan L. Miller to improve Reed-Solomon coding performance. - Also we are grateful to Artem Drobanov and Bulat Ziganshin - for samples and ideas allowed to make Reed-Solomon coding - more efficient. - -* RAR text compression algorithm is based on Dmitry Shkarin PPMII - and Dmitry Subbotin carryless rangecoder public domain source code. - You may find it in ftp.elf.stuba.sk/pub/pc/pack. - -* RAR encryption includes parts of code from Szymon Stefanek - and Brian Gladman AES implementations also as Steve Reid SHA-1 source. - - --------------------------------------------------------------------------- - Copyright (c) 2002, Dr Brian Gladman < >, Worcester, UK. - All rights reserved. - - LICENSE TERMS - - The free distribution and use of this software in both source and binary - form is allowed (with or without changes) provided that: - - 1. distributions of this source code include the above copyright - notice, this list of conditions and the following disclaimer; - - 2. distributions in binary form include the above copyright - notice, this list of conditions and the following disclaimer - in the documentation and/or other associated materials; - - 3. the copyright holder's name is not used to endorse products - built using this software without specific written permission. - - ALTERNATIVELY, provided that this notice is retained in full, this product - may be distributed under the terms of the GNU General Public License (GPL), - in which case the provisions of the GPL apply INSTEAD OF those given above. - - DISCLAIMER - - This software is provided 'as is' with no explicit or implied warranties - in respect of its properties, including, but not limited to, correctness - and/or fitness for purpose. - --------------------------------------------------------------------------- - - Source code of this package also as other cryptographic technology - and computing project related links are available on Brian Gladman's - web site: http://www.gladman.me.uk - -* RAR uses CRC32 function based on Intel Slicing-by-8 algorithm. - Original Intel Slicing-by-8 code is available here: - - https://sourceforge.net/projects/slicing-by-8/ - - Original Intel Slicing-by-8 code is licensed under BSD License - available at http://www.opensource.org/licenses/bsd-license.html - - Copyright (c) 2004-2006 Intel Corporation. - All Rights Reserved - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with - the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. - -* RAR archives may optionally include BLAKE2sp hash ( https://blake2.net ), - designed by Jean-Philippe Aumasson, Samuel Neves, Zooko Wilcox-O'Hearn - and Christian Winnerlein. - -* Useful hints provided by Alexander Khoroshev and Bulat Ziganshin allowed - to significantly improve RAR compression and speed. + ACKNOWLEDGMENTS + +* We used "Screaming Fast Galois Field Arithmetic Using Intel + SIMD Instructions" paper by James S. Plank, Kevin M. Greenan + and Ethan L. Miller to improve Reed-Solomon coding performance. + Also we are grateful to Artem Drobanov and Bulat Ziganshin + for samples and ideas allowed to make Reed-Solomon coding + more efficient. + +* RAR4 text compression algorithm is based on Dmitry Shkarin PPMII + and Dmitry Subbotin carryless rangecoder public domain source code. + You can find it in ftp.elf.stuba.sk/pub/pc/pack. + +* RAR encryption includes parts of public domain code + from Szymon Stefanek AES and Steve Reid SHA-1 implementations. + +* With exception of SFX modules, RAR uses CRC32 function based + on Intel Slicing-by-8 algorithm. Original Intel Slicing-by-8 code + is available here: + + https://sourceforge.net/projects/slicing-by-8/ + + Original Intel Slicing-by-8 code is licensed under BSD License + available at http://www.opensource.org/licenses/bsd-license.html + + Copyright (c) 2004-2006 Intel Corporation. + All Rights Reserved + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with + the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + +* RAR archives may optionally include BLAKE2sp hash ( https://blake2.net ), + designed by Jean-Philippe Aumasson, Samuel Neves, Zooko Wilcox-O'Hearn + and Christian Winnerlein. + +* Useful hints provided by Alexander Khoroshev and Bulat Ziganshin allowed + to significantly improve RAR compression and speed. diff --git a/deps/unrar/archive.cpp b/deps/unrar/archive.cpp index 8c5a1da81..25f0c3b79 100644 --- a/deps/unrar/archive.cpp +++ b/deps/unrar/archive.cpp @@ -3,15 +3,15 @@ #include "arccmt.cpp" -Archive::Archive(RAROptions *InitCmd) +Archive::Archive(CommandData *InitCmd) { Cmd=NULL; // Just in case we'll have an exception in 'new' below. DummyCmd=(InitCmd==NULL); - Cmd=DummyCmd ? (new RAROptions):InitCmd; + Cmd=DummyCmd ? (new CommandData):InitCmd; OpenShared=Cmd->OpenShared; - Format=RARFMT15; + Format=RARFMT_NONE; Solid=false; Volume=false; MainComment=false; @@ -31,9 +31,9 @@ Archive::Archive(RAROptions *InitCmd) NextBlockPos=0; - memset(&MainHead,0,sizeof(MainHead)); - memset(&CryptHead,0,sizeof(CryptHead)); - memset(&EndArcHead,0,sizeof(EndArcHead)); + MainHead.Reset(); + CryptHead={}; + EndArcHead.Reset(); VolNumber=0; VolWrite=0; @@ -231,7 +231,7 @@ bool Archive::IsArchive(bool EnableBroken) // first file header to set "comment" flag when reading service header. // Unless we are in silent mode, we need to know about presence of comment // immediately after IsArchive call. - if (HeadersLeft && (!SilentOpen || !Encrypted)) + if (HeadersLeft && (!SilentOpen || !Encrypted) && IsSeekable()) { int64 SavePos=Tell(); int64 SaveCurBlockPos=CurBlockPos,SaveNextBlockPos=NextBlockPos; diff --git a/deps/unrar/archive.hpp b/deps/unrar/archive.hpp index d9518f1dc..35a399bca 100644 --- a/deps/unrar/archive.hpp +++ b/deps/unrar/archive.hpp @@ -32,8 +32,8 @@ class Archive:public File size_t ReadHeader14(); size_t ReadHeader15(); size_t ReadHeader50(); - void ProcessExtra50(RawRead *Raw,size_t ExtraSize,BaseBlock *bb); - void RequestArcPassword(); + void ProcessExtra50(RawRead *Raw,size_t ExtraSize,const BaseBlock *bb); + void RequestArcPassword(RarCheckPassword *SelPwd); void UnexpEndArcMsg(); void BrokenHeaderMsg(); void UnkEncVerMsg(const wchar *Name,const wchar *Info); @@ -45,7 +45,7 @@ class Archive:public File #endif ComprDataIO SubDataIO; bool DummyCmd; - RAROptions *Cmd; + CommandData *Cmd; RarTime LatestTime; @@ -58,7 +58,7 @@ class Archive:public File bool ProhibitQOpen; #endif public: - Archive(RAROptions *InitCmd=NULL); + Archive(CommandData *InitCmd=NULL); ~Archive(); static RARFORMAT IsSignature(const byte *D,size_t Size); bool IsArchive(bool EnableBroken); @@ -83,7 +83,7 @@ class Archive:public File const wchar *Name,uint Flags); bool ReadSubData(Array *UnpData,File *DestFile,bool TestMode); HEADER_TYPE GetHeaderType() {return CurHeaderType;} - RAROptions* GetRAROptions() {return Cmd;} + CommandData* GetCommandData() {return Cmd;} void SetSilentOpen(bool Mode) {SilentOpen=Mode;} #if 0 void GetRecoveryInfo(bool Required,int64 *Size,int *Percent); diff --git a/deps/unrar/arcread.cpp b/deps/unrar/arcread.cpp index d1df6c041..86488cd49 100644 --- a/deps/unrar/arcread.cpp +++ b/deps/unrar/arcread.cpp @@ -100,6 +100,9 @@ void Archive::UnexpEndArcMsg() // If block positions are equal to file size, this is not an error. // It can happen when we reached the end of older RAR 1.5 archive, // which did not have the end of archive block. + // We can't replace this check by checking that read size is exactly 0 + // in the beginning of file header, because in this case the read position + // still can be beyond the end of archive. if (CurBlockPos!=ArcSize || NextBlockPos!=ArcSize) { uiMsg(UIERROR_UNEXPEOF,FileName); @@ -145,7 +148,7 @@ size_t Archive::ReadHeader15() #ifdef RAR_NOCRYPT // For rarext.dll and unrar_nocrypt.dll. return 0; #else - RequestArcPassword(); + RequestArcPassword(NULL); byte Salt[SIZE_SALT30]; if (Read(Salt,SIZE_SALT30)!=SIZE_SALT30) @@ -251,7 +254,11 @@ size_t Archive::ReadHeader15() hd->SplitAfter=(hd->Flags & LHD_SPLIT_AFTER)!=0; hd->Encrypted=(hd->Flags & LHD_PASSWORD)!=0; hd->SaltSet=(hd->Flags & LHD_SALT)!=0; + + // RAR versions earlier than 2.0 do not set the solid flag + // in file header. They use only a global solid archive flag. hd->Solid=FileBlock && (hd->Flags & LHD_SOLID)!=0; + hd->SubBlock=!FileBlock && (hd->Flags & LHD_SOLID)!=0; hd->Dir=(hd->Flags & LHD_WINDOWMASK)==LHD_DIRECTORY; hd->WinSize=hd->Dir ? 0:0x10000<<((hd->Flags & LHD_WINDOWMASK)>>5); @@ -558,6 +565,13 @@ size_t Archive::ReadHeader50() return 0; #else + if (Cmd->SkipEncrypted) + { + uiMsg(UIMSG_SKIPENCARC,FileName); + FailedHeaderDecryption=true; // Suppress error messages and quit quietly. + return 0; + } + byte HeadersInitV[SIZE_INITV]; if (Read(HeadersInitV,SIZE_INITV)!=SIZE_INITV) { @@ -570,14 +584,20 @@ size_t Archive::ReadHeader50() // in -p to not stop batch processing for encrypted archives. bool GlobalPassword=Cmd->Password.IsSet() || uiIsGlobalPasswordSet(); + RarCheckPassword CheckPwd; + if (CryptHead.UsePswCheck && !BrokenHeader) + CheckPwd.Set(CryptHead.Salt,HeadersInitV,CryptHead.Lg2Count,CryptHead.PswCheck); + while (true) // Repeat the password prompt for wrong passwords. { - RequestArcPassword(); + RequestArcPassword(CheckPwd.IsSet() ? &CheckPwd:NULL); byte PswCheck[SIZE_PSWCHECK]; HeadersCrypt.SetCryptKeys(false,CRYPT_RAR50,&Cmd->Password,CryptHead.Salt,HeadersInitV,CryptHead.Lg2Count,NULL,PswCheck); - // Verify password validity. - if (CryptHead.UsePswCheck && memcmp(PswCheck,CryptHead.PswCheck,SIZE_PSWCHECK)!=0) + // Verify password validity. If header is damaged, we cannot rely on + // password check value, because it can be damaged too. + if (CryptHead.UsePswCheck && !BrokenHeader && + memcmp(PswCheck,CryptHead.PswCheck,SIZE_PSWCHECK)!=0) { if (GlobalPassword) // For -p or Ctrl+P. { @@ -843,8 +863,6 @@ size_t Archive::ReadHeader50() hd->Dir=(hd->FileFlags & FHFL_DIRECTORY)!=0; hd->WinSize=hd->Dir ? 0:size_t(0x20000)<<((CompInfo>>10)&0xf); - hd->CryptMethod=hd->Encrypted ? CRYPT_RAR50:CRYPT_NONE; - char FileName[NM*4]; size_t ReadNameSize=Min(NameSize,ASIZE(FileName)-1); Raw.GetB((byte *)FileName,ReadNameSize); @@ -868,20 +886,6 @@ size_t Archive::ReadHeader50() if (!FileBlock && hd->CmpName(SUBHEAD_TYPE_CMT)) MainComment=true; -#if 0 - // For RAR5 format we read the user specified recovery percent here. - // It would be useful to do it for shell extension too, so we display - // the correct recovery record size in archive properties. But then - // we would need to include the entire recovery record processing - // code to shell extension, which is not done now. - if (!FileBlock && hd->CmpName(SUBHEAD_TYPE_RR) && hd->SubData.Size()>0) - { - RecoveryPercent=hd->SubData[0]; - RSBlockHeader Header; - GetRRInfo(this,&Header); - RecoverySize=Header.RecSectionSize*Header.RecCount; - } -#endif if (BadCRC) // Add the file name to broken header message displayed above. uiMsg(UIERROR_FHEADERBROKEN,Archive::FileName,hd->FileName); @@ -904,7 +908,7 @@ size_t Archive::ReadHeader50() #if !defined(RAR_NOCRYPT) -void Archive::RequestArcPassword() +void Archive::RequestArcPassword(RarCheckPassword *CheckPwd) { if (!Cmd->Password.IsSet()) { @@ -934,7 +938,7 @@ void Archive::RequestArcPassword() ErrHandler.Exit(RARX_USERBREAK); } #else - if (!uiGetPassword(UIPASSWORD_ARCHIVE,FileName,&Cmd->Password)) + if (!uiGetPassword(UIPASSWORD_ARCHIVE,FileName,&Cmd->Password,CheckPwd)) { Close(); uiMsg(UIERROR_INCERRCOUNT); // Prevent archive deleting if delete after extraction is on. @@ -947,7 +951,7 @@ void Archive::RequestArcPassword() #endif -void Archive::ProcessExtra50(RawRead *Raw,size_t ExtraSize,BaseBlock *bb) +void Archive::ProcessExtra50(RawRead *Raw,size_t ExtraSize,const BaseBlock *bb) { // Read extra data from the end of block skipping any fields before it. size_t ExtraStart=Raw->Size()-ExtraSize; @@ -970,22 +974,57 @@ void Archive::ProcessExtra50(RawRead *Raw,size_t ExtraSize,BaseBlock *bb) if (bb->HeaderType==HEAD_MAIN) { MainHeader *hd=(MainHeader *)bb; - if (FieldType==MHEXTRA_LOCATOR) + switch(FieldType) { - hd->Locator=true; - uint Flags=(uint)Raw->GetV(); - if ((Flags & MHEXTRA_LOCATOR_QLIST)!=0) - { - uint64 Offset=Raw->GetV(); - if (Offset!=0) // 0 means that reserved space was not enough to write the offset. - hd->QOpenOffset=Offset+CurBlockPos; - } - if ((Flags & MHEXTRA_LOCATOR_RR)!=0) - { - uint64 Offset=Raw->GetV(); - if (Offset!=0) // 0 means that reserved space was not enough to write the offset. - hd->RROffset=Offset+CurBlockPos; - } + case MHEXTRA_LOCATOR: + { + hd->Locator=true; + uint Flags=(uint)Raw->GetV(); + if ((Flags & MHEXTRA_LOCATOR_QLIST)!=0) + { + uint64 Offset=Raw->GetV(); + if (Offset!=0) // 0 means that reserved space was not enough to write the offset. + hd->QOpenOffset=Offset+CurBlockPos; + } + if ((Flags & MHEXTRA_LOCATOR_RR)!=0) + { + uint64 Offset=Raw->GetV(); + if (Offset!=0) // 0 means that reserved space was not enough to write the offset. + hd->RROffset=Offset+CurBlockPos; + } + } + break; + case MHEXTRA_METADATA: + { + uint Flags=(uint)Raw->GetV(); + if ((Flags & MHEXTRA_METADATA_NAME)!=0) + { + uint64 NameSize=Raw->GetV(); + if (NameSize<0x10000) // Prevent excessive allocation. + { + std::vector NameU((size_t)NameSize); // UTF-8 name. + Raw->GetB(&NameU[0],(size_t)NameSize); + // If starts from 0, the name was longer than reserved space + // when saving this extra field. + if (NameU[0]!=0) + { + NameU.push_back(0); + std::vector NameW(NameU.size()*4); + UtfToWide(&NameU[0],&NameW[0],NameW.size()); + hd->OrigName.assign(&NameW[0]); + } + } + } + if ((Flags & MHEXTRA_METADATA_CTIME)!=0) + if ((Flags & MHEXTRA_METADATA_UNIXTIME)!=0) + if ((Flags & MHEXTRA_METADATA_UNIX_NS)!=0) + hd->OrigTime.SetUnixNS(Raw->Get8()); + else + hd->OrigTime.SetUnix((time_t)Raw->Get4()); + else + hd->OrigTime.SetWin(Raw->Get8()); + } + break; } } @@ -1441,7 +1480,9 @@ bool Archive::ReadSubData(Array *UnpData,File *DestFile,bool TestMode) { if (SubHead.UnpSize>0x1000000) { - // So huge allocation must never happen in valid archives. + // Prevent the excessive allocation. When reading to memory, normally + // this function operates with reasonably small blocks, such as + // the archive comment, NTFS ACL or "Zone.Identifier" NTFS stream. uiMsg(UIERROR_SUBHEADERUNKNOWN,FileName); return false; } diff --git a/deps/unrar/array.hpp b/deps/unrar/array.hpp index 20d258d5b..ac786f710 100644 --- a/deps/unrar/array.hpp +++ b/deps/unrar/array.hpp @@ -10,7 +10,6 @@ template class Array size_t BufSize; size_t AllocSize; size_t MaxSize; - bool Secure; // Clean memory if true. public: Array(); Array(size_t Size); @@ -24,14 +23,13 @@ template class Array void Alloc(size_t Items); void Reset(); void SoftReset(); - void operator = (Array &Src); + Array& operator = (const Array &Src); void Push(T Item); void Append(T *Item,size_t Count); T* Addr(size_t Item) {return Buffer+Item;} void SetMaxSize(size_t Size) {MaxSize=Size;} T* Begin() {return Buffer;} T* End() {return Buffer==NULL ? NULL:Buffer+BufSize;} - void SetSecure() {Secure=true;} }; @@ -41,7 +39,6 @@ template void Array::CleanData() BufSize=0; AllocSize=0; MaxSize=0; - Secure=false; } @@ -71,11 +68,7 @@ template Array::Array(const Array &Src) template Array::~Array() { if (Buffer!=NULL) - { - if (Secure) - cleandata(Buffer,AllocSize*sizeof(T)); free(Buffer); - } } @@ -111,25 +104,9 @@ template void Array::Add(size_t Items) size_t Suggested=AllocSize+AllocSize/4+32; size_t NewSize=Max(BufSize,Suggested); - T *NewBuffer; - if (Secure) - { - NewBuffer=(T *)malloc(NewSize*sizeof(T)); - if (NewBuffer==NULL) - ErrHandler.MemoryError(); - if (Buffer!=NULL) - { - memcpy(NewBuffer,Buffer,AllocSize*sizeof(T)); - cleandata(Buffer,AllocSize*sizeof(T)); - free(Buffer); - } - } - else - { - NewBuffer=(T *)realloc(Buffer,NewSize*sizeof(T)); - if (NewBuffer==NULL) - ErrHandler.MemoryError(); - } + T *NewBuffer=(T *)realloc(Buffer,NewSize*sizeof(T)); + if (NewBuffer==NULL) + ErrHandler.MemoryError(); Buffer=NewBuffer; AllocSize=NewSize; } @@ -165,12 +142,13 @@ template void Array::SoftReset() } -template void Array::operator =(Array &Src) +template Array& Array::operator =(const Array &Src) { Reset(); Alloc(Src.BufSize); if (Src.BufSize!=0) memcpy((void *)Buffer,(void *)Src.Buffer,Src.BufSize*sizeof(T)); + return *this; } diff --git a/deps/unrar/blake2s.hpp b/deps/unrar/blake2s.hpp index f88ef3780..06e396a77 100644 --- a/deps/unrar/blake2s.hpp +++ b/deps/unrar/blake2s.hpp @@ -20,10 +20,15 @@ enum blake2s_constant // 'new' operator. struct blake2s_state { - enum { BLAKE_ALIGNMENT = 64 }; + // Use constexpr instead of enums, because otherwise clang -std=c++20 + // issues a warning about "arithmetic between different enumeration types" + // in ubuf[BLAKE_DATA_SIZE + BLAKE_ALIGNMENT] declaration. + static constexpr size_t BLAKE_ALIGNMENT = 64; // buffer and uint32 h[8], t[2], f[2]; - enum { BLAKE_DATA_SIZE = 48 + 2 * BLAKE2S_BLOCKBYTES }; + // 2 * BLAKE2S_BLOCKBYTES is the buf size in blake2_code_20140114.zip. + // It might differ in later versions. + static constexpr size_t BLAKE_DATA_SIZE = 48 + 2 * BLAKE2S_BLOCKBYTES; byte ubuf[BLAKE_DATA_SIZE + BLAKE_ALIGNMENT]; diff --git a/deps/unrar/cmddata.cpp b/deps/unrar/cmddata.cpp index 455a07b2c..3a4ab99eb 100644 --- a/deps/unrar/cmddata.cpp +++ b/deps/unrar/cmddata.cpp @@ -26,9 +26,10 @@ void CommandData::Init() FileArgs.Reset(); ExclArgs.Reset(); InclArgs.Reset(); - StoreArgs.Reset(); ArcNames.Reset(); - NextVolSizes.Reset(); + StoreArgs.Reset(); + Password.Clean(); + NextVolSizes.clear(); } @@ -108,6 +109,11 @@ void CommandData::ParseArg(wchar *Arg) // 'S' can contain SFX name, which case is important in Unix. if (*Command!='I' && *Command!='S') wcsupper(Command); + if (*Command=='P') // Enforce -idq for print command. + { + MsgStream=MSG_ERRONLY; + SetConsoleMsgStream(MSG_ERRONLY); + } } else if (*ArcName==0) @@ -309,6 +315,21 @@ void CommandData::ProcessSwitch(const wchar *Switch) case 'I': IgnoreGeneralAttr=true; break; + case 'M': + switch(toupperw(Switch[2])) + { + case 0: + case 'S': + ArcMetadata=ARCMETA_SAVE; + break; + case 'R': + ArcMetadata=ARCMETA_RESTORE; + break; + default: + BadSwitch(Switch); + break; + } + break; case 'N': // Reserved for archive name. break; case 'O': @@ -373,6 +394,9 @@ void CommandData::ProcessSwitch(const wchar *Switch) case '3': ExclPath=EXCL_ABSPATH; break; + case '4': + wcsncpyz(ExclArcPath,Switch+3,ASIZE(ExclArcPath)); + break; } break; default: @@ -399,13 +423,15 @@ void CommandData::ProcessSwitch(const wchar *Switch) EncryptHeaders=true; if (Switch[2]!=0) { + if (wcslen(Switch+2)>=MAXPASSWORD) + uiMsg(UIERROR_TRUNCPSW,MAXPASSWORD-1); Password.Set(Switch+2); cleandata((void *)Switch,wcslen(Switch)*sizeof(Switch[0])); } else if (!Password.IsSet()) { - uiGetPassword(UIPASSWORD_GLOBAL,NULL,&Password); + uiGetPassword(UIPASSWORD_GLOBAL,NULL,&Password,NULL); eprintf(L"\n"); } break; @@ -561,6 +587,10 @@ void CommandData::ProcessSwitch(const wchar *Switch) break; case 'D': break; + case 'E': + if (toupperw(Switch[2])=='S' && Switch[3]==0) + SkipEncrypted=true; + break; case 'S': { wchar StoreNames[1024]; @@ -648,6 +678,10 @@ void CommandData::ProcessSwitch(const wchar *Switch) AllowIncompatNames=true; break; #endif + case 'P': + wcsncpyz(ExtrPath,Switch+2,ASIZE(ExtrPath)); + AddEndSlash(ExtrPath,ASIZE(ExtrPath)); + break; case 'R': Overwrite=OVERWRITE_AUTORENAME; break; @@ -667,11 +701,13 @@ void CommandData::ProcessSwitch(const wchar *Switch) case 'P': if (Switch[1]==0) { - uiGetPassword(UIPASSWORD_GLOBAL,NULL,&Password); + uiGetPassword(UIPASSWORD_GLOBAL,NULL,&Password,NULL); eprintf(L"\n"); } else { + if (wcslen(Switch+1)>=MAXPASSWORD) + uiMsg(UIERROR_TRUNCPSW,MAXPASSWORD-1); Password.Set(Switch+1); cleandata((void *)Switch,wcslen(Switch)*sizeof(Switch[0])); } @@ -752,6 +788,10 @@ void CommandData::ProcessSwitch(const wchar *Switch) case 'D': Solid|=SOLID_VOLUME_DEPENDENT; break; + case 'I': + ProhibitConsoleInput(); + wcsncpyz(UseStdin,Switch[2] ? Switch+2:L"stdin",ASIZE(UseStdin)); + break; case 'L': if (IsDigit(Switch[2])) FileSizeLess=atoilw(Switch+2); @@ -935,7 +975,7 @@ void CommandData::ProcessCommand() wcsncpyz(ArcName,Name,ASIZE(ArcName)); } - if (wcschr(L"AFUMD",*Command)==NULL) + if (wcschr(L"AFUMD",*Command)==NULL && *UseStdin==0) { if (GenerateArcName) { diff --git a/deps/unrar/cmddata.hpp b/deps/unrar/cmddata.hpp index 719b4007e..0feb404b3 100644 --- a/deps/unrar/cmddata.hpp +++ b/deps/unrar/cmddata.hpp @@ -2,7 +2,7 @@ #define _RAR_CMDDATA_ -#define DefaultStoreList L"7z;ace;arj;bz2;cab;gz;jpeg;jpg;lha;lz;lzh;mp3;rar;taz;tgz;xz;z;zip;zipx" +#define DefaultStoreList L"7z;ace;arj;bz2;cab;gz;jpeg;jpg;lha;lz;lzh;mp3;rar;taz;tbz;tbz2;tgz;txz;xz;z;zip;zipx;zst;tzst" enum RAR_CMD_LIST_MODE {RCLM_AUTO,RCLM_REJECT_LISTS,RCLM_ACCEPT_LISTS}; @@ -50,7 +50,7 @@ class CommandData:public RAROptions bool GetArcName(wchar *Name,int MaxSize); bool CheckWinSize(); - int GetRecoverySize(const wchar *Str,int DefSize); + int GetRecoverySize(const wchar *CmdStr,const wchar *Value,int DefSize); #ifndef SFX_MODULE void ReportWrongSwitches(RARFORMAT Format); @@ -65,6 +65,10 @@ class CommandData:public RAROptions StringList InclArgs; StringList ArcNames; StringList StoreArgs; + + SecPassword Password; + + std::vector NextVolSizes; }; #endif diff --git a/deps/unrar/cmdfilter.cpp b/deps/unrar/cmdfilter.cpp index d6517ceb7..e0add14bf 100644 --- a/deps/unrar/cmdfilter.cpp +++ b/deps/unrar/cmdfilter.cpp @@ -262,6 +262,8 @@ bool CommandData::TimeCheck(RarTime &ftm,RarTime &ftc,RarTime &fta) // Return 'true' if we need to exclude the file from processing. bool CommandData::SizeCheck(int64 Size) { + if (Size==INT64NDF) // If called from archive formats like bzip2, not storing the file size. + return false; if (FileSizeLess!=INT64NDF && Size>=FileSizeLess) return true; if (FileSizeMore!=INT64NDF && Size<=FileSizeMore) @@ -287,8 +289,8 @@ int CommandData::IsProcessFile(FileHeader &FileHead,bool *ExactMatch,int MatchTy return 0; if ((FileHead.FileAttr & ExclFileAttr)!=0 || FileHead.Dir && ExclDir) return 0; - if (InclAttrSet && (!FileHead.Dir && (FileHead.FileAttr & InclFileAttr)==0 || - FileHead.Dir && !InclDir)) + if (InclAttrSet && (FileHead.FileAttr & InclFileAttr)==0 && + (!FileHead.Dir || !InclDir)) return 0; if (!Dir && SizeCheck(FileHead.UnpSize)) return 0; diff --git a/deps/unrar/cmdmix.cpp b/deps/unrar/cmdmix.cpp index 3990cc189..6bd1e1ac0 100644 --- a/deps/unrar/cmdmix.cpp +++ b/deps/unrar/cmdmix.cpp @@ -61,14 +61,14 @@ void CommandData::OutHelp(RAR_EXIT ExitCode) MUNRARTitle1,MRARTitle2,MCHelpCmd,MCHelpCmdE,MCHelpCmdL, MCHelpCmdP,MCHelpCmdT,MCHelpCmdV,MCHelpCmdX,MCHelpSw,MCHelpSwm, MCHelpSwAT,MCHelpSwAC,MCHelpSwAD,MCHelpSwAG,MCHelpSwAI,MCHelpSwAP, - MCHelpSwCm,MCHelpSwCFGm,MCHelpSwCL,MCHelpSwCU, - MCHelpSwDH,MCHelpSwEP,MCHelpSwEP3,MCHelpSwF,MCHelpSwIDP,MCHelpSwIERR, - MCHelpSwINUL,MCHelpSwIOFF,MCHelpSwKB,MCHelpSwN,MCHelpSwNa,MCHelpSwNal, - MCHelpSwO,MCHelpSwOC,MCHelpSwOL,MCHelpSwOR,MCHelpSwOW,MCHelpSwP, - MCHelpSwPm,MCHelpSwR,MCHelpSwRI,MCHelpSwSC,MCHelpSwSL,MCHelpSwSM, - MCHelpSwTA,MCHelpSwTB,MCHelpSwTN,MCHelpSwTO,MCHelpSwTS,MCHelpSwU, - MCHelpSwVUnr,MCHelpSwVER,MCHelpSwVP,MCHelpSwX,MCHelpSwXa,MCHelpSwXal, - MCHelpSwY + MCHelpSwCm,MCHelpSwCFGm,MCHelpSwCL,MCHelpSwCU,MCHelpSwDH,MCHelpSwEP, + MCHelpSwEP3,MCHelpSwEP4,MCHelpSwF,MCHelpSwIDP,MCHelpSwIERR, + MCHelpSwINUL,MCHelpSwIOFF,MCHelpSwKB,MCHelpSwME,MCHelpSwN,MCHelpSwNa, + MCHelpSwNal,MCHelpSwO,MCHelpSwOC,MCHelpSwOL,MCHelpSwOP,MCHelpSwOR, + MCHelpSwOW,MCHelpSwP,MCHelpSwR,MCHelpSwRI,MCHelpSwSC,MCHelpSwSI, + MCHelpSwSL,MCHelpSwSM,MCHelpSwTA,MCHelpSwTB,MCHelpSwTN,MCHelpSwTO, + MCHelpSwTS,MCHelpSwU,MCHelpSwVUnr,MCHelpSwVER,MCHelpSwVP,MCHelpSwX, + MCHelpSwXa,MCHelpSwXal,MCHelpSwY #endif }; @@ -92,6 +92,13 @@ void CommandData::OutHelp(RAR_EXIT ExitCode) if (Found) continue; #endif +#ifdef _UNIX + if (CmpMSGID(Help[I],MRARTitle2)) + { + mprintf(St(MFwrSlTitle2)); + continue; + } +#endif #if !defined(_UNIX) && !defined(_WIN_ALL) if (CmpMSGID(Help[I],MCHelpSwOW)) continue; diff --git a/deps/unrar/compress.hpp b/deps/unrar/compress.hpp index 73f7ee41a..4ef8570f4 100644 --- a/deps/unrar/compress.hpp +++ b/deps/unrar/compress.hpp @@ -17,6 +17,7 @@ class PackDef static const uint MAX_INC_LZ_MATCH = MAX_LZ_MATCH + 3; static const uint MAX3_LZ_MATCH = 0x101; // Maximum match length for RAR v3. + static const uint MAX3_INC_LZ_MATCH = MAX3_LZ_MATCH + 3; static const uint LOW_DIST_REP_COUNT = 16; static const uint NC = 306; /* alphabet = {0, 1, 2, ..., NC - 1} */ diff --git a/deps/unrar/consio.cpp b/deps/unrar/consio.cpp index fedd5c05c..fa35d6146 100644 --- a/deps/unrar/consio.cpp +++ b/deps/unrar/consio.cpp @@ -3,6 +3,7 @@ static MESSAGE_TYPE MsgStream=MSG_STDOUT; static RAR_CHARSET RedirectCharset=RCH_DEFAULT; +static bool ProhibitInput=false; const int MaxMsgSize=2*NM+2048; @@ -61,6 +62,12 @@ void SetConsoleRedirectCharset(RAR_CHARSET RedirectCharset) } +void ProhibitConsoleInput() +{ + ProhibitInput=true; +} + + #ifndef SILENT static void cvt_wprintf(FILE *dest,const wchar *fmt,va_list arglist) { @@ -141,28 +148,56 @@ void eprintf(const wchar *fmt,...) #ifndef SILENT +static void QuitIfInputProhibited() +{ + // We cannot handle user prompts if -si is used to read file or archive data + // from stdin. + if (ProhibitInput) + { + mprintf(St(MStdinNoInput)); + ErrHandler.Exit(RARX_FATAL); + } +} + + static void GetPasswordText(wchar *Str,uint MaxLength) { if (MaxLength==0) return; + QuitIfInputProhibited(); if (StdinRedirected) getwstr(Str,MaxLength); // Read from pipe or redirected file. else { #ifdef _WIN_ALL HANDLE hConIn=GetStdHandle(STD_INPUT_HANDLE); - HANDLE hConOut=GetStdHandle(STD_OUTPUT_HANDLE); - DWORD ConInMode,ConOutMode; - DWORD Read=0; + DWORD ConInMode; GetConsoleMode(hConIn,&ConInMode); - GetConsoleMode(hConOut,&ConOutMode); - SetConsoleMode(hConIn,ENABLE_LINE_INPUT); - SetConsoleMode(hConOut,ENABLE_PROCESSED_OUTPUT|ENABLE_WRAP_AT_EOL_OUTPUT); + SetConsoleMode(hConIn,ENABLE_LINE_INPUT); // Remove ENABLE_ECHO_INPUT. + // We prefer ReadConsole to ReadFile, so we can read Unicode input. + DWORD Read=0; ReadConsole(hConIn,Str,MaxLength-1,&Read,NULL); Str[Read]=0; SetConsoleMode(hConIn,ConInMode); - SetConsoleMode(hConOut,ConOutMode); + + // If entered password is longer than MAXPASSWORD and truncated, + // read its unread part anyway, so it isn't read later as the second + // password for -p switch. Low level FlushConsoleInputBuffer doesn't help + // for high level ReadConsole, which in line input mode seems to store + // the rest of string in its own internal buffer. + if (wcschr(Str,'\r')==NULL) // If '\r' is missing, the password was truncated. + while (true) + { + wchar Trail[64]; + DWORD TrailRead=0; + // Use ASIZE(Trail)-1 to reserve the space for trailing 0. + ReadConsole(hConIn,Trail,ASIZE(Trail)-1,&TrailRead,NULL); + Trail[TrailRead]=0; + if (TrailRead==0 || wcschr(Trail,'\r')!=NULL) + break; + } + #else char StrA[MAXPASSWORD*4]; // "*4" for multibyte UTF-8 characters. #if defined(_EMX) || defined (__VMS) @@ -190,16 +225,21 @@ bool GetConsolePassword(UIPASSWORD_TYPE Type,const wchar *FileName,SecPassword * while (true) { - if (!StdinRedirected) +// if (!StdinRedirected) if (Type==UIPASSWORD_GLOBAL) eprintf(L"\n%s: ",St(MAskPsw)); else eprintf(St(MAskPswFor),FileName); - wchar PlainPsw[MAXPASSWORD]; + wchar PlainPsw[MAXPASSWORD+1]; GetPasswordText(PlainPsw,ASIZE(PlainPsw)); if (*PlainPsw==0 && Type==UIPASSWORD_GLOBAL) return false; + if (wcslen(PlainPsw)>=MAXPASSWORD) + { + PlainPsw[MAXPASSWORD-1]=0; + uiMsg(UIERROR_TRUNCPSW,MAXPASSWORD-1); + } if (!StdinRedirected && Type==UIPASSWORD_GLOBAL) { eprintf(St(MReAskPsw)); @@ -229,6 +269,8 @@ bool getwstr(wchar *str,size_t n) // Print buffered prompt title function before waiting for input. fflush(stderr); + QuitIfInputProhibited(); + *str=0; #if defined(_WIN_ALL) // fgetws does not work well with non-English text in Windows, @@ -240,6 +282,7 @@ bool getwstr(wchar *str,size_t n) Array StrA(n*4); // Up to 4 UTF-8 characters per wchar_t. File SrcFile; SrcFile.SetHandleType(FILE_HANDLESTD); + SrcFile.SetLineInputMode(true); int ReadSize=SrcFile.Read(&StrA[0],StrA.Size()-1); if (ReadSize<=0) { diff --git a/deps/unrar/consio.hpp b/deps/unrar/consio.hpp index 903dc21a4..bf97289e7 100644 --- a/deps/unrar/consio.hpp +++ b/deps/unrar/consio.hpp @@ -4,6 +4,7 @@ void InitConsole(); void SetConsoleMsgStream(MESSAGE_TYPE MsgStream); void SetConsoleRedirectCharset(RAR_CHARSET RedirectCharset); +void ProhibitConsoleInput(); void OutComment(const wchar *Comment,size_t Size); #ifndef SILENT diff --git a/deps/unrar/crc.cpp b/deps/unrar/crc.cpp index cf23bbf4f..0c6aef160 100644 --- a/deps/unrar/crc.cpp +++ b/deps/unrar/crc.cpp @@ -14,6 +14,12 @@ #include "rar.hpp" +#ifndef SFX_MODULE +// User suggested to avoid BSD license in SFX module, so they do not need +// to include the license to SFX archive. +#define USE_SLICING +#endif + static uint crc_tables[8][256]; // Tables for Slicing-by-8. @@ -37,6 +43,7 @@ static void InitTables() { InitCRC32(crc_tables[0]); +#ifdef USE_SLICING for (uint I=0;I<256;I++) // Build additional lookup tables. { uint C=crc_tables[0][I]; @@ -46,6 +53,7 @@ static void InitTables() crc_tables[J][I]=C; } } +#endif } @@ -55,6 +63,7 @@ uint CRC32(uint StartCRC,const void *Addr,size_t Size) { byte *Data=(byte *)Addr; +#ifdef USE_SLICING // Align Data to 8 for better performance. for (;Size>0 && ((size_t)Data & 7);Size--,Data++) StartCRC=crc_tables[0][(byte)(StartCRC^Data[0])]^(StartCRC>>8); @@ -77,6 +86,7 @@ uint CRC32(uint StartCRC,const void *Addr,size_t Size) crc_tables[1][(byte)(NextData >> 16)] ^ crc_tables[0][(byte)(NextData >> 24)]; } +#endif for (;Size>0;Size--,Data++) // Process left data. StartCRC=crc_tables[0][(byte)(StartCRC^Data[0])]^(StartCRC>>8); @@ -100,3 +110,164 @@ ushort Checksum14(ushort StartCRC,const void *Addr,size_t Size) #endif +#if 0 +static uint64 crc64_tables[8][256]; // Tables for Slicing-by-8 for CRC64. + +void InitCRC64(uint64 *CRCTab) +{ + const uint64 poly=INT32TO64(0xC96C5795, 0xD7870F42); // 0xC96C5795D7870F42; + for (uint I=0;I<256;I++) + { + uint64 C=I; + for (uint J=0;J<8;J++) + C=(C & 1) ? (C>>1)^poly: (C>>1); + CRCTab[I]=C; + } +} + + +static void InitTables64() +{ + InitCRC64(crc64_tables[0]); + + for (uint I=0;I<256;I++) // Build additional lookup tables. + { + uint64 C=crc64_tables[0][I]; + for (uint J=1;J<8;J++) + { + C=crc64_tables[0][(byte)C]^(C>>8); + crc64_tables[J][I]=C; + } + } +} + + +// We cannot place the intialization to CRC64(), because we use this function +// in multithreaded mode and it conflicts with multithreading. +struct CallInitCRC64 {CallInitCRC64() {InitTables64();}} static CallInit64; + +uint64 CRC64(uint64 StartCRC,const void *Addr,size_t Size) +{ + byte *Data=(byte *)Addr; + + // Align Data to 8 for better performance. + for (;Size>0 && ((size_t)Data & 7)!=0;Size--,Data++) + StartCRC=crc64_tables[0][(byte)(StartCRC^Data[0])]^(StartCRC>>8); + + for (byte *DataEnd=Data+Size/8*8; Data> 8 ) ] ^ + crc64_tables[ 5 ] [ ( byte ) (Index >> 16 ) ] ^ + crc64_tables[ 4 ] [ ( byte ) (Index >> 24 ) ] ^ + crc64_tables[ 3 ] [ ( byte ) (Index >> 32 ) ] ^ + crc64_tables[ 2 ] [ ( byte ) (Index >> 40 ) ] ^ + crc64_tables[ 1 ] [ ( byte ) (Index >> 48 ) ] ^ + crc64_tables[ 0 ] [ ( byte ) (Index >> 56 ) ] ; + } + + for (Size%=8;Size>0;Size--,Data++) // Process left data. + StartCRC=crc64_tables[0][(byte)(StartCRC^Data[0])]^(StartCRC>>8); + + return StartCRC; +} + + +#if 0 +static void TestCRC(); +struct TestCRCStruct {TestCRCStruct() {TestCRC();exit(0);}} GlobalTesCRC; + +void TestCRC() +{ + const uint FirstSize=300; + byte b[FirstSize]; + + if ((CRC32(0xffffffff,(byte*)"testtesttest",12)^0xffffffff)==0x44608e84) + mprintf(L"\nCRC32 test1 OK"); + else + mprintf(L"\nCRC32 test1 FAILED"); + + if (CRC32(0,(byte*)"te\x80st",5)==0xB2E5C5AE) + mprintf(L"\nCRC32 test2 OK"); + else + mprintf(L"\nCRC32 test2 FAILED"); + + for (uint I=0;I<14;I++) // Check for possible int sign extension. + b[I]=(byte)0x7f+I; + if ((CRC32(0xffffffff,b,14)^0xffffffff)==0x1DFA75DA) + mprintf(L"\nCRC32 test3 OK"); + else + mprintf(L"\nCRC32 test3 FAILED"); + + for (uint I=0;IIsSet() || Method==CRYPT_NONE) + if (Method==CRYPT_NONE || !Password->IsSet()) return false; CryptData::Method=Method; wchar PwdW[MAXPASSWORD]; Password->Get(PwdW,ASIZE(PwdW)); + PwdW[Min(MAXPASSWORD_RAR,MAXPASSWORD)-1]=0; // For compatibility with existing archives. + char PwdA[MAXPASSWORD]; WideToChar(PwdW,PwdA,ASIZE(PwdA)); + PwdA[Min(MAXPASSWORD_RAR,MAXPASSWORD)-1]=0; // For compatibility with existing archives. switch(Method) { diff --git a/deps/unrar/crypt.hpp b/deps/unrar/crypt.hpp index ebbad96ed..8f22bea21 100644 --- a/deps/unrar/crypt.hpp +++ b/deps/unrar/crypt.hpp @@ -30,6 +30,18 @@ class CryptData uint Lg2Count; // Log2 of PBKDF2 repetition count. byte PswCheckValue[SHA256_DIGEST_SIZE]; byte HashKeyValue[SHA256_DIGEST_SIZE]; + + KDF5CacheItem() {Clean();} + ~KDF5CacheItem() {Clean();} + + void Clean() + { + cleandata(Salt,sizeof(Salt)); + cleandata(Key,sizeof(Key)); + cleandata(&Lg2Count,sizeof(Lg2Count)); + cleandata(PswCheckValue,sizeof(PswCheckValue)); + cleandata(HashKeyValue,sizeof(HashKeyValue)); + } }; struct KDF3CacheItem @@ -39,6 +51,17 @@ class CryptData byte Key[16]; byte Init[16]; bool SaltPresent; + + KDF3CacheItem() {Clean();} + ~KDF3CacheItem() {Clean();} + + void Clean() + { + cleandata(Salt,sizeof(Salt)); + cleandata(Key,sizeof(Key)); + cleandata(Init,sizeof(Init)); + cleandata(&SaltPresent,sizeof(SaltPresent)); + } }; @@ -77,7 +100,6 @@ class CryptData ushort Key15[4]; public: CryptData(); - ~CryptData(); bool SetCryptKeys(bool Encrypt,CRYPT_METHOD Method,SecPassword *Password, const byte *Salt,const byte *InitV,uint Lg2Cnt, byte *HashKey,byte *PswCheck); @@ -89,6 +111,54 @@ class CryptData static void SetSalt(byte *Salt,size_t SaltSize); }; + +class CheckPassword +{ + public: + enum CONFIDENCE {CONFIDENCE_HIGH,CONFIDENCE_MEDIUM,CONFIDENCE_LOW}; + virtual CONFIDENCE GetConfidence()=0; + virtual bool Check(SecPassword *Password)=0; +}; + +class RarCheckPassword:public CheckPassword +{ + private: + CryptData *Crypt; + uint Lg2Count; + byte Salt[SIZE_SALT50]; + byte InitV[SIZE_INITV]; + byte PswCheck[SIZE_PSWCHECK]; + public: + RarCheckPassword() + { + Crypt=NULL; + } + ~RarCheckPassword() + { + delete Crypt; + } + void Set(byte *Salt,byte *InitV,uint Lg2Count,byte *PswCheck) + { + if (Crypt==NULL) + Crypt=new CryptData; + memcpy(this->Salt,Salt,sizeof(this->Salt)); + memcpy(this->InitV,InitV,sizeof(this->InitV)); + this->Lg2Count=Lg2Count; + memcpy(this->PswCheck,PswCheck,sizeof(this->PswCheck)); + } + bool IsSet() {return Crypt!=NULL;} + + // RAR5 provides the higly reliable 64 bit password verification value. + CONFIDENCE GetConfidence() {return CONFIDENCE_HIGH;} + + bool Check(SecPassword *Password) + { + byte PswCheck[SIZE_PSWCHECK]; + Crypt->SetCryptKeys(false,CRYPT_RAR50,Password,Salt,InitV,Lg2Count,NULL,PswCheck); + return memcmp(PswCheck,this->PswCheck,sizeof(this->PswCheck))==0; + } +}; + void GetRnd(byte *RndBuf,size_t BufSize); void hmac_sha256(const byte *Key,size_t KeyLength,const byte *Data, diff --git a/deps/unrar/crypt3.cpp b/deps/unrar/crypt3.cpp index fe3bf97b8..e6e3a82cb 100644 --- a/deps/unrar/crypt3.cpp +++ b/deps/unrar/crypt3.cpp @@ -18,8 +18,9 @@ void CryptData::SetKey30(bool Encrypt,SecPassword *Password,const wchar *PwdW,co if (!Cached) { byte RawPsw[2*MAXPASSWORD+SIZE_SALT30]; - WideToRaw(PwdW,RawPsw,ASIZE(RawPsw)); - size_t RawLength=2*wcslen(PwdW); + size_t PswLength=wcslen(PwdW); + size_t RawLength=2*PswLength; + WideToRaw(PwdW,PswLength,RawPsw,RawLength); if (Salt!=NULL) { memcpy(RawPsw+RawLength,Salt,SIZE_SALT30); diff --git a/deps/unrar/crypt5.cpp b/deps/unrar/crypt5.cpp index 7562469f3..5ed65af81 100644 --- a/deps/unrar/crypt5.cpp +++ b/deps/unrar/crypt5.cpp @@ -21,7 +21,7 @@ static void hmac_sha256(const byte *Key,size_t KeyLength,const byte *Data, sha256_context ICtx; if (ICtxOpt!=NULL && *SetIOpt) - ICtx=*ICtxOpt; // Use already calculated first block context. + ICtx=*ICtxOpt; // Use already calculated the first block context. else { // This calculation is the same for all iterations with same password. @@ -90,10 +90,10 @@ void pbkdf2(const byte *Pwd, size_t PwdLength, byte SaltData[MaxSalt+4]; memcpy(SaltData, Salt, Min(SaltLength,MaxSalt)); - SaltData[SaltLength + 0] = 0; // Salt concatenated to 1. - SaltData[SaltLength + 1] = 0; - SaltData[SaltLength + 2] = 0; - SaltData[SaltLength + 3] = 1; + SaltData[SaltLength + 0] = 0; // Block index appened to salt. + SaltData[SaltLength + 1] = 0; // + SaltData[SaltLength + 2] = 0; // Since we do not request the key width + SaltData[SaltLength + 3] = 1; // exceeding HMAC width, it is always 1. // First iteration: HMAC of password, salt and block index (1). byte U1[SHA256_DIGEST_SIZE]; @@ -140,7 +140,7 @@ void CryptData::SetKey50(bool Encrypt,SecPassword *Password,const wchar *PwdW, for (uint I=0;ILg2Count==Lg2Cnt && Item->Pwd==*Password && + if (Item->Pwd==*Password && Item->Lg2Count==Lg2Cnt && memcmp(Item->Salt,Salt,SIZE_SALT50)==0) { memcpy(Key,Item->Key,sizeof(Key)); diff --git a/deps/unrar/dll.def b/deps/unrar/dll.def index 3c9a2c83a..a7241141a 100644 --- a/deps/unrar/dll.def +++ b/deps/unrar/dll.def @@ -1,13 +1,13 @@ -EXPORTS - RAROpenArchive - RAROpenArchiveEx - RARCloseArchive - RARReadHeader - RARReadHeaderEx - RARProcessFile - RARProcessFileW - RARSetCallback - RARSetChangeVolProc - RARSetProcessDataProc - RARSetPassword - RARGetDllVersion +EXPORTS + RAROpenArchive + RAROpenArchiveEx + RARCloseArchive + RARReadHeader + RARReadHeaderEx + RARProcessFile + RARProcessFileW + RARSetCallback + RARSetChangeVolProc + RARSetProcessDataProc + RARSetPassword + RARGetDllVersion diff --git a/deps/unrar/dll.rc b/deps/unrar/dll.rc index 8dd505da0..ff610c835 100644 --- a/deps/unrar/dll.rc +++ b/deps/unrar/dll.rc @@ -1,28 +1,28 @@ -#include -#include - -VS_VERSION_INFO VERSIONINFO -FILEVERSION 6, 1, 100, 3756 -PRODUCTVERSION 6, 1, 100, 3756 -FILEOS VOS__WINDOWS32 -FILETYPE VFT_APP -{ - BLOCK "StringFileInfo" - { - BLOCK "040904E4" - { - VALUE "CompanyName", "Alexander Roshal\0" - VALUE "ProductName", "RAR decompression library\0" - VALUE "FileDescription", "RAR decompression library\0" - VALUE "FileVersion", "6.1.0\0" - VALUE "ProductVersion", "6.1.0\0" - VALUE "LegalCopyright", "Copyright © Alexander Roshal 1993-2021\0" - VALUE "OriginalFilename", "Unrar.dll\0" - } - } - BLOCK "VarFileInfo" - { - VALUE "Translation", 0x0409, 0x04E4 - } -} - +#include +#include + +VS_VERSION_INFO VERSIONINFO +FILEVERSION 6, 22, 1, 865 +PRODUCTVERSION 6, 22, 1, 865 +FILEOS VOS__WINDOWS32 +FILETYPE VFT_APP +{ + BLOCK "StringFileInfo" + { + BLOCK "040904E4" + { + VALUE "CompanyName", "Alexander Roshal\0" + VALUE "ProductName", "RAR decompression library\0" + VALUE "FileDescription", "RAR decompression library\0" + VALUE "FileVersion", "6.22.1\0" + VALUE "ProductVersion", "6.22.1\0" + VALUE "LegalCopyright", "Copyright © Alexander Roshal 1993-2023\0" + VALUE "OriginalFilename", "Unrar.dll\0" + } + } + BLOCK "VarFileInfo" + { + VALUE "Translation", 0x0409, 0x04E4 + } +} + diff --git a/deps/unrar/dll_nocrypt.def b/deps/unrar/dll_nocrypt.def index d473e978e..f7037ea4c 100644 --- a/deps/unrar/dll_nocrypt.def +++ b/deps/unrar/dll_nocrypt.def @@ -1,13 +1,13 @@ -EXPORTS - RAROpenArchive - RAROpenArchiveEx - RARCloseArchive - RARReadHeader - RARReadHeaderEx - RARProcessFile - RARProcessFileW - RARSetCallback - RARSetChangeVolProc - RARSetProcessDataProc -; RARSetPassword - RARGetDllVersion +EXPORTS + RAROpenArchive + RAROpenArchiveEx + RARCloseArchive + RARReadHeader + RARReadHeaderEx + RARProcessFile + RARProcessFileW + RARSetCallback + RARSetChangeVolProc + RARSetProcessDataProc +; RARSetPassword + RARGetDllVersion diff --git a/deps/unrar/encname.cpp b/deps/unrar/encname.cpp index 84731a71e..e1ba1ed70 100644 --- a/deps/unrar/encname.cpp +++ b/deps/unrar/encname.cpp @@ -20,8 +20,6 @@ void EncodeFileName::Decode(char *Name,size_t NameSize,byte *EncName,size_t EncS { if (FlagBits==0) { - if (EncPos>=EncSize) - break; Flags=EncName[EncPos++]; FlagBits=8; } diff --git a/deps/unrar/encname.hpp b/deps/unrar/encname.hpp index 538bcb699..c6b4ed44d 100644 --- a/deps/unrar/encname.hpp +++ b/deps/unrar/encname.hpp @@ -4,9 +4,8 @@ class EncodeFileName { private: - void AddFlags(int Value); + void AddFlags(byte Value,byte *EncName); - byte *EncName; byte Flags; uint FlagBits; size_t FlagsPos; diff --git a/deps/unrar/errhnd.cpp b/deps/unrar/errhnd.cpp index 18e91973e..97193e5ac 100644 --- a/deps/unrar/errhnd.cpp +++ b/deps/unrar/errhnd.cpp @@ -169,10 +169,13 @@ void ErrorHandler::OpenErrorMsg(const wchar *FileName) void ErrorHandler::OpenErrorMsg(const wchar *ArcName,const wchar *FileName) { - Wait(); // Keep GUI responsive if many files cannot be opened when archiving. uiMsg(UIERROR_FILEOPEN,ArcName,FileName); SysErrMsg(); SetErrorCode(RARX_OPEN); + + // Keep GUI responsive if many files cannot be opened when archiving. + // Call after SysErrMsg to avoid modifying the error code and SysErrMsg text. + Wait(); } @@ -367,7 +370,7 @@ bool ErrorHandler::GetSysErrMsg(wchar *Msg,size_t Size) void ErrorHandler::SysErrMsg() { -#if !defined(SFX_MODULE) && !defined(SILENT) +#ifndef SILENT wchar Msg[1024]; if (!GetSysErrMsg(Msg,ASIZE(Msg))) return; diff --git a/deps/unrar/extinfo.cpp b/deps/unrar/extinfo.cpp index 5cb90a408..0f25f3124 100644 --- a/deps/unrar/extinfo.cpp +++ b/deps/unrar/extinfo.cpp @@ -112,6 +112,68 @@ static bool LinkInPath(const wchar *Name) } +// Delete symbolic links in file path, if any, and replace them by directories. +// Prevents extracting files outside of destination folder with symlink chains. +bool LinksToDirs(const wchar *SrcName,const wchar *SkipPart,std::wstring &LastChecked) +{ + // Unlike Unix, Windows doesn't expand lnk1 in symlink targets like + // "lnk1/../dir", but converts the path to "dir". In Unix we need to call + // this function to prevent placing unpacked files outside of destination + // folder if previously we unpacked "dir/lnk1" -> "..", + // "dir/lnk2" -> "lnk1/.." and "dir/lnk2/anypath/poc.txt". + // We may still need this function to prevent abusing symlink chains + // in link source path if we remove detection of such chains + // in IsRelativeSymlinkSafe. This function seems to make other symlink + // related safety checks redundant, but for now we prefer to keep them too. + // + // 2022.12.01: the performance impact is minimized after adding the check + // against the previous path and enabling this verification only after + // extracting a symlink with ".." in target. So we enabled it for Windows + // as well for extra safety. +//#ifdef _UNIX + wchar Path[NM]; + if (wcslen(SrcName)>=ASIZE(Path)) + return false; // It should not be that long, skip. + wcsncpyz(Path,SrcName,ASIZE(Path)); + + size_t SkipLength=wcslen(SkipPart); + + if (SkipLength>0 && wcsncmp(Path,SkipPart,SkipLength)!=0) + SkipLength=0; // Parameter validation, not really needed now. + + // Do not check parts already checked in previous path to improve performance. + for (uint I=0;Path[I]!=0 && ISkipLength) + SkipLength=I; + + wchar *Name=Path; + if (SkipLength>0) + { + // Avoid converting symlinks in destination path part specified by user. + Name+=SkipLength; + while (IsPathDiv(*Name)) + Name++; + } + + for (wchar *s=Path+wcslen(Path)-1;s>Name;s--) + if (IsPathDiv(*s)) + { + *s=0; + FindData FD; + if (FindFile::FastFind(Path,&FD,true) && FD.IsLink) +#ifdef _WIN_ALL + if (!DelDir(Path)) +#else + if (!DelFile(Path)) +#endif + return false; // Couldn't delete the symlink to replace it with directory. + } + LastChecked=SrcName; +//#endif + return true; +} + + bool IsRelativeSymlinkSafe(CommandData *Cmd,const wchar *SrcName,const wchar *PrepSrcName,const wchar *TargetName) { // Catch root dir based /path/file paths also as stuff like \\?\. @@ -131,10 +193,14 @@ bool IsRelativeSymlinkSafe(CommandData *Cmd,const wchar *SrcName,const wchar *Pr UpLevels++; TargetName++; } - // If link target includes "..", it must not have another links - // in the path, because they can bypass our safety check. For example, + // If link target includes "..", it must not have another links in its + // source path, because they can bypass our safety check. For example, // suppose we extracted "lnk1" -> "." first and "lnk1/lnk2" -> ".." next - // or "dir/lnk1" -> ".." first and "dir/lnk1/lnk2" -> ".." next. + // or "dir/lnk1" -> ".." first, "dir/lnk1/lnk2" -> ".." next and + // file "dir/lnk1/lnk2/poc.txt" last. + // Do not confuse with link chains in target, this is in link source path. + // It is important for Windows too, though this check can be omitted + // if LinksToDirs is invoked in Windows as well. if (UpLevels>0 && LinkInPath(PrepSrcName)) return false; @@ -160,15 +226,26 @@ bool IsRelativeSymlinkSafe(CommandData *Cmd,const wchar *SrcName,const wchar *Pr } -bool ExtractSymlink(CommandData *Cmd,ComprDataIO &DataIO,Archive &Arc,const wchar *LinkName) +bool ExtractSymlink(CommandData *Cmd,ComprDataIO &DataIO,Archive &Arc,const wchar *LinkName,bool &UpLink) { + // Returning true in Uplink indicates that link target might include ".." + // and enables additional checks. It is ok to falsely return true here, + // as it implies only the minor performance penalty. But we shall always + // return true for links with ".." in target for security reason. + + UpLink=true; // Assume the target might include potentially unsafe "..". +#if defined(SAVE_LINKS) && defined(_UNIX) || defined(_WIN_ALL) + if (Arc.Format==RARFMT50) // For RAR5 archives we can check RedirName for both Unix and Windows. + UpLink=wcsstr(Arc.FileHead.RedirName,L"..")!=NULL; +#endif + #if defined(SAVE_LINKS) && defined(_UNIX) // For RAR 3.x archives we process links even in test mode to skip link data. if (Arc.Format==RARFMT15) - return ExtractUnixLink30(Cmd,DataIO,Arc,LinkName); + return ExtractUnixLink30(Cmd,DataIO,Arc,LinkName,UpLink); if (Arc.Format==RARFMT50) return ExtractUnixLink50(Cmd,LinkName,&Arc.FileHead); -#elif defined _WIN_ALL +#elif defined(_WIN_ALL) // RAR 5.0 archives store link information in file header, so there is // no need to additionally test it if we do not create a file. if (Arc.Format==RARFMT50) diff --git a/deps/unrar/extinfo.hpp b/deps/unrar/extinfo.hpp index f3c7511b4..d8551d463 100644 --- a/deps/unrar/extinfo.hpp +++ b/deps/unrar/extinfo.hpp @@ -1,8 +1,9 @@ #ifndef _RAR_EXTINFO_ #define _RAR_EXTINFO_ +bool LinksToDirs(const wchar *SrcName,const wchar *SkipPart,std::wstring &LastChecked); bool IsRelativeSymlinkSafe(CommandData *Cmd,const wchar *SrcName,const wchar *PrepSrcName,const wchar *TargetName); -bool ExtractSymlink(CommandData *Cmd,ComprDataIO &DataIO,Archive &Arc,const wchar *LinkName); +bool ExtractSymlink(CommandData *Cmd,ComprDataIO &DataIO,Archive &Arc,const wchar *LinkName,bool &UpLink); #ifdef _UNIX void SetUnixOwner(Archive &Arc,const wchar *FileName); #endif diff --git a/deps/unrar/extract.cpp b/deps/unrar/extract.cpp index dc824aa97..4d9e51202 100644 --- a/deps/unrar/extract.cpp +++ b/deps/unrar/extract.cpp @@ -5,10 +5,30 @@ CmdExtract::CmdExtract(CommandData *Cmd) CmdExtract::Cmd=Cmd; *ArcName=0; - *DestFileName=0; + ArcAnalyzed=false; + Analyze=new AnalyzeData; + memset(Analyze,0,sizeof(*Analyze)); + TotalFileCount=0; + + // Common for all archives involved. Set here instead of DoExtract() + // to use in unrar.dll too. Allows to avoid LinksToDirs() calls + // and save CPU time in no symlinks including ".." in target were extracted. +#if defined(_WIN_ALL) + // We can't expand symlink path components in another symlink target + // in Windows. We can't create symlinks in Android now. Even though we do not + // really need LinksToDirs() calls in these systems, we still call it + // for extra safety, but only if symlink with ".." in target was extracted. + ConvertSymlinkPaths=false; +#else + // We enable it by default in Unix to care about the case when several + // archives are unpacked to same directory with several independent RAR runs. + // Worst case performance penalty for a lot of small files seems to be ~3%. + ConvertSymlinkPaths=true; +#endif + Unp=new Unpack(&DataIO); #ifdef RAR_SMP Unp->SetThreads(Cmd->Threads); @@ -18,7 +38,26 @@ CmdExtract::CmdExtract(CommandData *Cmd) CmdExtract::~CmdExtract() { + FreeAnalyzeData(); delete Unp; + delete Analyze; +} + + +void CmdExtract::FreeAnalyzeData() +{ + for (size_t I=0;ICommand[0]); - FindData FD; - while (Cmd->GetArcName(ArcName,ASIZE(ArcName))) - if (FindFile::FastFind(ArcName,&FD)) - DataIO.TotalArcSize+=FD.Size; + if (*Cmd->UseStdin==0) + { + FindData FD; + while (Cmd->GetArcName(ArcName,ASIZE(ArcName))) + if (FindFile::FastFind(ArcName,&FD)) + DataIO.TotalArcSize+=FD.Size; + } Cmd->ArcNames.Rewind(); while (Cmd->GetArcName(ArcName,ASIZE(ArcName))) @@ -49,8 +91,7 @@ void CmdExtract::DoExtract() if (Code!=EXTRACT_ARC_REPEAT) break; } - if (FindFile::FastFind(ArcName,&FD)) - DataIO.ProcessedArcSize+=FD.Size; + DataIO.ProcessedArcSize+=DataIO.LastArcSize; } // Clean user entered password. Not really required, just for extra safety. @@ -82,7 +123,7 @@ void CmdExtract::DoExtract() void CmdExtract::ExtractArchiveInit(Archive &Arc) { - DataIO.UnpArcSize=Arc.FileLength(); + DataIO.AdjustTotalArcSize(&Arc); FileCount=0; MatchedArgs=0; @@ -98,15 +139,33 @@ void CmdExtract::ExtractArchiveInit(Archive &Arc) AllMatchesExact=true; AnySolidDataUnpackedWell=false; + ArcAnalyzed=false; + StartTime.SetCurrentTime(); + + LastCheckedSymlink.clear(); } EXTRACT_ARC_CODE CmdExtract::ExtractArchive() { Archive Arc(Cmd); - if (!Arc.WOpen(ArcName)) - return EXTRACT_ARC_NEXT; + if (*Cmd->UseStdin!=0) + { + Arc.SetHandleType(FILE_HANDLESTD); +#ifdef USE_QOPEN + Arc.SetProhibitQOpen(true); +#endif + } + else + { +#if defined(_WIN_ALL) && !defined(SFX_MODULE) // WinRAR GUI code also resets the cache. + if (*Cmd->Command=='T' || Cmd->Test) + ResetFileCache(ArcName); // Reset the file cache when testing an archive. +#endif + if (!Arc.WOpen(ArcName)) + return EXTRACT_ARC_NEXT; + } if (!Arc.IsArchive(true)) { @@ -155,20 +214,33 @@ EXTRACT_ARC_CODE CmdExtract::ExtractArchive() } #endif + Arc.ViewComment(); // Must be before possible EXTRACT_ARC_REPEAT. + int64 VolumeSetSize=0; // Total size of volumes after the current volume. +#ifndef SFX_MODULE + if (!ArcAnalyzed && *Cmd->UseStdin==0) + { + AnalyzeArchive(Arc.FileName,Arc.Volume,Arc.NewNumbering); + ArcAnalyzed=true; // Avoid repeated analysis on EXTRACT_ARC_REPEAT. + } +#endif + if (Arc.Volume) { #ifndef SFX_MODULE // Try to speed up extraction for independent solid volumes by starting // extraction from non-first volume if we can. - if (!UseExactVolName && Arc.Solid && DetectStartVolume(Arc.FileName,Arc.NewNumbering)) + if (*Analyze->StartName!=0) { + wcsncpyz(ArcName,Analyze->StartName,ASIZE(ArcName)); + *Analyze->StartName=0; + UseExactVolName=true; return EXTRACT_ARC_REPEAT; } #endif - + // Calculate the total size of all accessible volumes. // This size is necessary to display the correct total progress indicator. @@ -203,7 +275,13 @@ EXTRACT_ARC_CODE CmdExtract::ExtractArchive() else uiStartArchiveExtract(!Cmd->Test,ArcName); - Arc.ViewComment(); +#ifndef SFX_MODULE + if (Analyze->StartPos!=0) + { + Arc.Seek(Analyze->StartPos,SEEK_SET); + Analyze->StartPos=0; + } +#endif while (1) @@ -216,14 +294,11 @@ EXTRACT_ARC_CODE CmdExtract::ExtractArchive() if (Repeat) { // If we started extraction from not first volume and need to - // restart it from first, we must correct DataIO.TotalArcSize - // for correct total progress display. We subtract the size - // of current volume and all volumes after it and add the size - // of new (first) volume. - FindData OldArc,NewArc; - if (FindFile::FastFind(Arc.FileName,&OldArc) && - FindFile::FastFind(ArcName,&NewArc)) - DataIO.TotalArcSize-=VolumeSetSize+OldArc.Size-NewArc.Size; + // restart it from first, we must set DataIO.TotalArcSize to size + // of new first volume to display the total progress correctly. + FindData NewArc; + if (FindFile::FastFind(ArcName,&NewArc)) + DataIO.TotalArcSize=NewArc.Size; return EXTRACT_ARC_REPEAT; } else @@ -262,7 +337,14 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat) return false; HEADER_TYPE HeaderType=Arc.GetHeaderType(); - if (HeaderType!=HEAD_FILE) + if (HeaderType==HEAD_FILE) + { + // Unlike Arc.FileName, ArcName might store an old volume name here. + if (Analyze->EndPos!=0 && Analyze->EndPos==Arc.CurBlockPos && + (*Analyze->EndName==0 || wcscmp(Analyze->EndName,Arc.FileName)==0)) + return false; + } + else { #ifndef SFX_MODULE if (Arc.Format==RARFMT15 && HeaderType==HEAD3_OLDSERVICE && PrevProcessed) @@ -305,6 +387,9 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat) if (Arc.FileHead.UnpSize<0) Arc.FileHead.UnpSize=0; + // 2022.03.20: We might remove this check in the future. + // It duplicates Analyze->EndPos and Analyze->EndName in all cases except + // volumes on removable media. if (!Cmd->Recurse && MatchedArgs>=Cmd->FileArgs.ItemsCount() && AllMatchesExact) return false; @@ -403,7 +488,39 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat) FirstFile=false; #endif - if (MatchFound || (SkipSolid=Arc.Solid)!=0) + bool RefTarget=false; + if (!MatchFound) + for (size_t I=0;ITest) // While harmless, it is useless for 't'. + { + // If reference source isn't selected, but target is selected, + // we unpack the source under the temporary name and then rename + // or copy it to target name. We do not unpack it under the target + // name immediately, because the same source can be used by multiple + // targets and it is possible that first target isn't unpacked + // for some reason. Also targets might have associated service blocks + // like ACLs. All this would complicate processing a lot. + wcsncpyz(DestFileName,*Cmd->TempPath!=0 ? Cmd->TempPath:Cmd->ExtrPath,ASIZE(DestFileName)); + AddEndSlash(DestFileName,ASIZE(DestFileName)); + wcsncatz(DestFileName,L"__tmp_reference_source_",ASIZE(DestFileName)); + MkTemp(DestFileName,ASIZE(DestFileName)); + MatchedRef->TmpName=wcsdup(DestFileName); + } + RefTarget=true; // Need it even for 't' to test the reference source. + break; + } + + if (Arc.FileHead.Encrypted && Cmd->SkipEncrypted) + if (Arc.Solid) + return false; // Abort the entire extraction for solid archive. + else + MatchFound=false; // Skip only the current file for non-solid archive. + + if (MatchFound || RefTarget || (SkipSolid=Arc.Solid)!=0) { // First common call of uiStartFileExtract. It is done before overwrite // prompts, so if SkipSolid state is changed below, we'll need to make @@ -411,7 +528,8 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat) if (!uiStartFileExtract(ArcFileName,!Cmd->Test,Cmd->Test && Command!='I',SkipSolid)) return false; - ExtrPrepareName(Arc,ArcFileName,DestFileName,ASIZE(DestFileName)); + if (!RefTarget) + ExtrPrepareName(Arc,ArcFileName,DestFileName,ASIZE(DestFileName)); // DestFileName can be set empty in case of excessive -ap switch. ExtrFile=!SkipSolid && *DestFileName!=0 && !Arc.FileHead.SplitBefore; @@ -448,9 +566,13 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat) return !Arc.Solid; // Can try extracting next file only in non-solid archive. } - while (true) // Repeat the password prompt for wrong and empty passwords. + if (Arc.FileHead.Encrypted) { - if (Arc.FileHead.Encrypted) + RarCheckPassword CheckPwd; + if (Arc.Format==RARFMT50 && Arc.FileHead.UsePswCheck && !Arc.BrokenHeader) + CheckPwd.Set(Arc.FileHead.Salt,Arc.FileHead.InitV,Arc.FileHead.Lg2Count,Arc.FileHead.PswCheck); + + while (true) // Repeat the password prompt for wrong and empty passwords. { // Stop archive extracting if user cancelled a password prompt. #ifdef RARDLL @@ -460,77 +582,83 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat) return false; } #else - if (!ExtrGetPassword(Arc,ArcFileName)) + if (!ExtrGetPassword(Arc,ArcFileName,CheckPwd.IsSet() ? &CheckPwd:NULL)) { PasswordCancelled=true; return false; } #endif - } - // Set a password before creating the file, so we can skip creating - // in case of wrong password. - SecPassword FilePassword=Cmd->Password; -#if defined(_WIN_ALL) && !defined(SFX_MODULE) - ConvertDosPassword(Arc,FilePassword); -#endif + // Set a password before creating the file, so we can skip creating + // in case of wrong password. + SecPassword FilePassword=Cmd->Password; + #if defined(_WIN_ALL) && !defined(SFX_MODULE) + ConvertDosPassword(Arc,FilePassword); + #endif - byte PswCheck[SIZE_PSWCHECK]; - DataIO.SetEncryption(false,Arc.FileHead.CryptMethod,&FilePassword, - Arc.FileHead.SaltSet ? Arc.FileHead.Salt:NULL, - Arc.FileHead.InitV,Arc.FileHead.Lg2Count, - Arc.FileHead.HashKey,PswCheck); + byte PswCheck[SIZE_PSWCHECK]; + DataIO.SetEncryption(false,Arc.FileHead.CryptMethod,&FilePassword, + Arc.FileHead.SaltSet ? Arc.FileHead.Salt:NULL, + Arc.FileHead.InitV,Arc.FileHead.Lg2Count, + Arc.FileHead.HashKey,PswCheck); - // If header is damaged, we cannot rely on password check value, - // because it can be damaged too. - if (Arc.FileHead.Encrypted && Arc.FileHead.UsePswCheck && - memcmp(Arc.FileHead.PswCheck,PswCheck,SIZE_PSWCHECK)!=0 && - !Arc.BrokenHeader) - { - if (GlobalPassword) // For -p or Ctrl+P to avoid the infinite loop. + // If header is damaged, we cannot rely on password check value, + // because it can be damaged too. + if (Arc.FileHead.UsePswCheck && !Arc.BrokenHeader && + memcmp(Arc.FileHead.PswCheck,PswCheck,SIZE_PSWCHECK)!=0) { - // This message is used by Android GUI to reset cached passwords. - // Update appropriate code if changed. - uiMsg(UIERROR_BADPSW,Arc.FileName,ArcFileName); - } - else // For passwords entered manually. - { - // This message is used by Android GUI and Windows GUI and SFX to - // reset cached passwords. Update appropriate code if changed. - uiMsg(UIWAIT_BADPSW,Arc.FileName,ArcFileName); - Cmd->Password.Clean(); + if (GlobalPassword) // For -p or Ctrl+P to avoid the infinite loop. + { + // This message is used by Android GUI to reset cached passwords. + // Update appropriate code if changed. + uiMsg(UIERROR_BADPSW,Arc.FileName,ArcFileName); + } + else // For passwords entered manually. + { + // This message is used by Android GUI and Windows GUI and SFX to + // reset cached passwords. Update appropriate code if changed. + uiMsg(UIWAIT_BADPSW,Arc.FileName,ArcFileName); + Cmd->Password.Clean(); - // Avoid new requests for unrar.dll to prevent the infinite loop - // if app always returns the same password. -#ifndef RARDLL - continue; // Request a password again. -#endif + // Avoid new requests for unrar.dll to prevent the infinite loop + // if app always returns the same password. + #ifndef RARDLL + continue; // Request a password again. + #endif + } + #ifdef RARDLL + // If we already have ERAR_EOPEN as result of missing volume, + // we should not replace it with less precise ERAR_BAD_PASSWORD. + if (Cmd->DllError!=ERAR_EOPEN) + Cmd->DllError=ERAR_BAD_PASSWORD; + #endif + ErrHandler.SetErrorCode(RARX_BADPWD); + ExtrFile=false; } -#ifdef RARDLL - // If we already have ERAR_EOPEN as result of missing volume, - // we should not replace it with less precise ERAR_BAD_PASSWORD. - if (Cmd->DllError!=ERAR_EOPEN) - Cmd->DllError=ERAR_BAD_PASSWORD; -#endif - ErrHandler.SetErrorCode(RARX_BADPWD); - ExtrFile=false; + break; } - break; } + else + DataIO.SetEncryption(false,CRYPT_NONE,NULL,NULL,NULL,0,NULL,NULL); #ifdef RARDLL if (*Cmd->DllDestName!=0) wcsncpyz(DestFileName,Cmd->DllDestName,ASIZE(DestFileName)); #endif + if (ExtrFile && Command!='P' && !Cmd->Test && !Cmd->AbsoluteLinks && + ConvertSymlinkPaths) + ExtrFile=LinksToDirs(DestFileName,Cmd->ExtrPath,LastCheckedSymlink); + File CurFile; bool LinkEntry=Arc.FileHead.RedirType!=FSREDIR_NONE; - if (LinkEntry && Arc.FileHead.RedirType!=FSREDIR_FILECOPY) + if (LinkEntry && (Arc.FileHead.RedirType!=FSREDIR_FILECOPY)) { if (ExtrFile && Command!='P' && !Cmd->Test) { - // Overwrite prompt for symbolic and hard links. + // Overwrite prompt for symbolic and hard links and when we move + // a temporary file to the file reference instead of copying it. bool UserReject=false; if (FileExist(DestFileName) && !UserReject) FileCreate(Cmd,NULL,DestFileName,ASIZE(DestFileName),&UserReject,Arc.FileHead.UnpSize,&Arc.FileHead.mtime); @@ -632,7 +760,7 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat) uint64 Preallocated=0; if (!TestMode && !Arc.BrokenHeader && Arc.FileHead.UnpSize>1000000 && - Arc.FileHead.PackSize*1024>Arc.FileHead.UnpSize && + Arc.FileHead.PackSize*1024>Arc.FileHead.UnpSize && Arc.IsSeekable() && (Arc.FileHead.UnpSize<100000000 || Arc.FileLength()>Arc.FileHead.PackSize)) { CurFile.Prealloc(Arc.FileHead.UnpSize); @@ -650,23 +778,51 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat) if (Type==FSREDIR_HARDLINK || Type==FSREDIR_FILECOPY) { + wchar RedirName[NM]; + + // 2022.11.15: Might be needed when unpacking WinRAR 5.0 links with + // Unix RAR. WinRAR 5.0 used \ path separators here, when beginning + // from 5.10 even Windows version uses / internally and converts + // them to \ when reading FHEXTRA_REDIR. + // We must perform this conversion before ConvertPath call, + // so paths mixing different slashes like \dir1/dir2\file are + // processed correctly. + SlashToNative(Arc.FileHead.RedirName,RedirName,ASIZE(RedirName)); + + ConvertPath(RedirName,RedirName,ASIZE(RedirName)); + wchar NameExisting[NM]; - ExtrPrepareName(Arc,Arc.FileHead.RedirName,NameExisting,ASIZE(NameExisting)); + ExtrPrepareName(Arc,RedirName,NameExisting,ASIZE(NameExisting)); if (FileCreateMode && *NameExisting!=0) // *NameExisting can be 0 in case of excessive -ap switch. if (Type==FSREDIR_HARDLINK) LinkSuccess=ExtractHardlink(Cmd,DestFileName,NameExisting,ASIZE(NameExisting)); else - LinkSuccess=ExtractFileCopy(CurFile,Arc.FileName,DestFileName,NameExisting,ASIZE(NameExisting)); + LinkSuccess=ExtractFileCopy(CurFile,Arc.FileName,RedirName,DestFileName,NameExisting,ASIZE(NameExisting),Arc.FileHead.UnpSize); } else if (Type==FSREDIR_UNIXSYMLINK || Type==FSREDIR_WINSYMLINK || Type==FSREDIR_JUNCTION) { if (FileCreateMode) - LinkSuccess=ExtractSymlink(Cmd,DataIO,Arc,DestFileName); + { + bool UpLink; + LinkSuccess=ExtractSymlink(Cmd,DataIO,Arc,DestFileName,UpLink); + ConvertSymlinkPaths|=LinkSuccess && UpLink; + + // We do not actually need to reset the cache here if we cache + // only the single last checked path, because at this point + // it will always contain the link own path and link can't + // overwrite its parent folder. But if we ever decide to cache + // several already checked paths, we'll need to reset them here. + // Otherwise if no files were created in one of such paths, + // let's say because of file create error, it might be possible + // to overwrite the path with link and avoid checks. We keep this + // code here as a reminder in case of possible modifications. + LastCheckedSymlink.clear(); // Reset cache for safety reason. + } } else { - uiMsg(UIERROR_UNKNOWNEXTRA,Arc.FileName,DestFileName); + uiMsg(UIERROR_UNKNOWNEXTRA,Arc.FileName,ArcFileName); LinkSuccess=false; } @@ -690,6 +846,7 @@ bool CmdExtract::ExtractCurrentFile(Archive &Arc,size_t HeaderSize,bool &Repeat) Unp->Init(Arc.FileHead.WinSize,Arc.FileHead.Solid); Unp->SetDestSize(Arc.FileHead.UnpSize); #ifndef SFX_MODULE + // RAR 1.3 - 1.5 archives do not set per file solid flag. if (Arc.Format!=RARFMT50 && Arc.FileHead.UnpVer<=15) Unp->DoUnpack(15,FileCount>1 && Arc.Solid); else @@ -847,22 +1004,64 @@ void CmdExtract::UnstoreFile(ComprDataIO &DataIO,int64 DestUnpSize) } -bool CmdExtract::ExtractFileCopy(File &New,wchar *ArcName,wchar *NameNew,wchar *NameExisting,size_t NameExistingSize) +bool CmdExtract::ExtractFileCopy(File &New,wchar *ArcName,const wchar *RedirName,wchar *NameNew,wchar *NameExisting,size_t NameExistingSize,int64 UnpSize) { - SlashToNative(NameExisting,NameExisting,NameExistingSize); // Not needed for RAR 5.1+ archives. - File Existing; - if (!Existing.WOpen(NameExisting)) + if (!Existing.Open(NameExisting)) { - uiMsg(UIERROR_FILECOPY,ArcName,NameExisting,NameNew); - uiMsg(UIERROR_FILECOPYHINT,ArcName); + bool OpenFailed=true; + // If we couldn't find the existing file, check if match is present + // in temporary reference sources list. + for (size_t I=0;IDllError=ERAR_EREFERENCE; + Cmd->DllError=ERAR_EREFERENCE; #endif - return false; + return false; + } } - Array Buffer(0x100000); + Array Buffer(0x100000); int64 CopySize=0; while (true) @@ -871,6 +1070,10 @@ bool CmdExtract::ExtractFileCopy(File &New,wchar *ArcName,wchar *NameNew,wchar * int ReadSize=Existing.Read(&Buffer[0],Buffer.Size()); if (ReadSize==0) break; + // Update only the current file progress in WinRAR, set the total to 0 + // to keep it as is. It looks better for WinRAR. + uiExtractProgress(CopySize,UnpSize,0,0); + New.Write(&Buffer[0],ReadSize); CopySize+=ReadSize; } @@ -881,6 +1084,16 @@ bool CmdExtract::ExtractFileCopy(File &New,wchar *ArcName,wchar *NameNew,wchar * void CmdExtract::ExtrPrepareName(Archive &Arc,const wchar *ArcFileName,wchar *DestName,size_t DestSize) { + if (Cmd->Test) + { + // Destination name conversion isn't needed for simple archive test. + // This check also allows to avoid issuing "Attempting to correct... + // Renaming..." messages in MakeNameCompatible() below for problematic + // names like aux.txt when testing an archive. + wcsncpyz(DestName,ArcFileName,DestSize); + return; + } + wcsncpyz(DestName,Cmd->ExtrPath,DestSize); if (*Cmd->ExtrPath!=0) @@ -888,6 +1101,8 @@ void CmdExtract::ExtrPrepareName(Archive &Arc,const wchar *ArcFileName,wchar *De wchar LastChar=*PointToLastChar(Cmd->ExtrPath); // We need IsPathDiv check here to correctly handle Unix forward slash // in the end of destination path in Windows: rar x arc dest/ + // so we call IsPathDiv first instead of just calling AddEndSlash, + // which checks for only one type of path separator. // IsDriveDiv is needed for current drive dir: rar x arc d: if (!IsPathDiv(LastChar) && !IsDriveDiv(LastChar)) { @@ -919,19 +1134,13 @@ void CmdExtract::ExtrPrepareName(Archive &Arc,const wchar *ArcFileName,wchar *De #endif #ifndef SFX_MODULE - size_t ArcPathLength=wcslen(Cmd->ArcPath); + wchar *ArcPath=*Cmd->ExclArcPath!=0 ? Cmd->ExclArcPath:Cmd->ArcPath; + size_t ArcPathLength=wcslen(ArcPath); if (ArcPathLength>0) { size_t NameLength=wcslen(ArcFileName); - - // Earlier we compared lengths only here, but then noticed a cosmetic bug - // in WinRAR. When extracting a file reference from subfolder with - // "Extract relative paths", so WinRAR sets ArcPath, if reference target - // is missing, error message removed ArcPath both from reference and target - // names. If target was stored in another folder, its name looked wrong. - if (NameLength>=ArcPathLength && - wcsnicompc(Cmd->ArcPath,ArcFileName,ArcPathLength)==0 && - (IsPathDiv(Cmd->ArcPath[ArcPathLength-1]) || + if (NameLength>=ArcPathLength && wcsnicompc(ArcPath,ArcFileName,ArcPathLength)==0 && + (IsPathDiv(ArcPath[ArcPathLength-1]) || IsPathDiv(ArcFileName[ArcPathLength]) || ArcFileName[ArcPathLength]==0)) { ArcFileName+=Min(ArcPathLength,NameLength); @@ -964,7 +1173,7 @@ void CmdExtract::ExtrPrepareName(Archive &Arc,const wchar *ArcFileName,wchar *De // Must do after Cmd->ArcPath processing above, so file name and arc path // trailing spaces are in sync. if (!Cmd->AllowIncompatNames) - MakeNameCompatible(DestName); + MakeNameCompatible(DestName,DestSize); #endif wchar DiskLetter=toupperw(DestName[0]); @@ -1018,18 +1227,14 @@ bool CmdExtract::ExtrDllGetPassword() #ifndef RARDLL -bool CmdExtract::ExtrGetPassword(Archive &Arc,const wchar *ArcFileName) +bool CmdExtract::ExtrGetPassword(Archive &Arc,const wchar *ArcFileName,RarCheckPassword *CheckPwd) { if (!Cmd->Password.IsSet()) { - if (!uiGetPassword(UIPASSWORD_FILE,ArcFileName,&Cmd->Password)/* || !Cmd->Password.IsSet()*/) + if (!uiGetPassword(UIPASSWORD_FILE,ArcFileName,&Cmd->Password,CheckPwd)/* || !Cmd->Password.IsSet()*/) { // Suppress "test is ok" message if user cancelled the password prompt. -// 2019.03.23: If some archives are tested ok and prompt is cancelled for others, -// do we really need to suppress "test is ok"? Also if we set an empty password -// and "Use for all archives" in WinRAR Ctrl+P and skip some encrypted archives. -// We commented out this UIERROR_INCERRCOUNT for now. -// uiMsg(UIERROR_INCERRCOUNT); + uiMsg(UIERROR_INCERRCOUNT); return false; } Cmd->ManualPassword=true; @@ -1044,7 +1249,7 @@ bool CmdExtract::ExtrGetPassword(Archive &Arc,const wchar *ArcFileName) case -1: ErrHandler.Exit(RARX_USERBREAK); case 2: - if (!uiGetPassword(UIPASSWORD_FILE,ArcFileName,&Cmd->Password)) + if (!uiGetPassword(UIPASSWORD_FILE,ArcFileName,&Cmd->Password,CheckPwd)) return false; break; case 3: @@ -1120,6 +1325,8 @@ void CmdExtract::ExtrCreateDir(Archive &Arc,const wchar *ArcFileName) DirExist=FileExist(DestFileName) && IsDir(GetFileAttr(DestFileName)); if (!DirExist) { + if (!Cmd->AbsoluteLinks && ConvertSymlinkPaths) + LinksToDirs(DestFileName,Cmd->ExtrPath,LastCheckedSymlink); CreatePath(DestFileName,true,Cmd->DisableNames); MDCode=MakeDir(DestFileName,!Cmd->IgnoreGeneralAttr,Arc.FileHead.FileAttr); } @@ -1201,6 +1408,8 @@ bool CmdExtract::ExtrCreateFile(Archive &Arc,File &CurFile) MakeNameUsable(DestFileName,true); + if (!Cmd->AbsoluteLinks && ConvertSymlinkPaths) + LinksToDirs(DestFileName,Cmd->ExtrPath,LastCheckedSymlink); CreatePath(DestFileName,true,Cmd->DisableNames); if (FileCreate(Cmd,&CurFile,DestFileName,ASIZE(DestFileName),&UserReject,Arc.FileHead.UnpSize,&Arc.FileHead.mtime,true)) { @@ -1247,31 +1456,59 @@ bool CmdExtract::CheckUnpVer(Archive &Arc,const wchar *ArcFileName) #ifndef SFX_MODULE -// To speed up solid volumes extraction, try to find a non-first start volume, -// which still allows to unpack all files. It is possible for independent -// solid volumes with solid statistics reset in the beginning. -bool CmdExtract::DetectStartVolume(const wchar *VolName,bool NewNumbering) +// Find non-matched reference sources in solid and non-solid archives. +// Detect the optimal start position for semi-solid archives +// and optimal start volume for independent solid volumes. +// +// Alternatively we could collect references while extracting an archive +// and perform the second extraction pass for references only. +// But it would be slower for solid archives than scaning headers +// in first pass and extracting everything in second, as implemented now. +// +void CmdExtract::AnalyzeArchive(const wchar *ArcName,bool Volume,bool NewNumbering) { + FreeAnalyzeData(); // If processing non-first archive in multiple archives set. + wchar *ArgName=Cmd->FileArgs.GetString(); Cmd->FileArgs.Rewind(); if (ArgName!=NULL && (wcscmp(ArgName,L"*")==0 || wcscmp(ArgName,L"*.*")==0)) - return false; // No need to check further for * and *.* masks. + return; // No need to check further for * and *.* masks. - wchar StartName[NM]; - *StartName=0; - // Start search from first volume if all volumes preceding current are available. wchar NextName[NM]; - GetFirstVolIfFullSet(VolName,NewNumbering,NextName,ASIZE(NextName)); + if (Volume) + GetFirstVolIfFullSet(ArcName,NewNumbering,NextName,ASIZE(NextName)); + else + wcsncpyz(NextName,ArcName,ASIZE(NextName)); + + bool MatchFound=false; + bool PrevMatched=false; + bool OpenNext=false; - bool Matched=false; - while (!Matched) + bool FirstVolume=true; + + // We shall set FirstFile once for all volumes and not for each volume. + // So we do not reuse the outdated Analyze->StartPos from previous volume + // if extracted file resides completely in the beginning of current one. + bool FirstFile=true; + + while (true) { Archive Arc(Cmd); - if (!Arc.Open(NextName) || !Arc.IsArchive(false) || !Arc.Volume) + if (!Arc.Open(NextName) || !Arc.IsArchive(false)) + { + if (OpenNext) + { + // If we couldn't open trailing volumes, we can't set early exit + // parameters. It is possible that some volume are on removable media + // and will be provided by user when extracting. + *Analyze->EndName=0; + Analyze->EndPos=0; + } break; + } - bool OpenNext=false; + OpenNext=false; while (Arc.ReadHeader()>0) { Wait(); @@ -1284,17 +1521,88 @@ bool CmdExtract::DetectStartVolume(const wchar *VolName,bool NewNumbering) } if (HeaderType==HEAD_FILE) { + if ((Arc.Format==RARFMT14 || Arc.Format==RARFMT15) && Arc.FileHead.UnpVer<=15) + { + // RAR versions earlier than 2.0 do not set per file solid flag. + // They have only the global archive solid flag, so we can't + // reliably analyze them here. + OpenNext=false; + break; + } + if (!Arc.FileHead.SplitBefore) { - if (!Arc.FileHead.Solid) // Can start extraction from here. - wcsncpyz(StartName,NextName,ASIZE(StartName)); + if (!MatchFound && !Arc.FileHead.Solid) // Can start extraction from here. + { + // We would gain nothing and unnecessarily complicate extraction + // if we set StartName for first volume or StartPos for first + // archived file. + if (!FirstVolume) + wcsncpyz(Analyze->StartName,NextName,ASIZE(Analyze->StartName)); + + // We shall set FirstFile once for all volumes for this code + // to work properly. Alternatively we could append + // "|| Analyze->StartPos!=0" to the condition, so we do not reuse + // the outdated Analyze->StartPos value from previous volume. + if (!FirstFile) + Analyze->StartPos=Arc.CurBlockPos; + } if (Cmd->IsProcessFile(Arc.FileHead,NULL,MATCH_WILDSUBPATH,0,NULL,0)!=0) { - Matched=true; // First matched file found, must stop further scan. - break; + MatchFound = true; + PrevMatched = true; + + // Reset the previously set early exit position, if any, because + // we found a new matched file. + Analyze->EndPos=0; + + // Matched file reference pointing at maybe non-matched source file. + // Even though we know RedirName, we can't check if source file + // is certainly non-matched, because it can be filtered out by + // date or attributes, which we do not know here. + if (Arc.FileHead.RedirType==FSREDIR_FILECOPY) + { + bool AlreadyAdded=false; + for (size_t I=0;IEndName,NextName,ASIZE(Analyze->EndName)); + Analyze->EndPos=Arc.CurBlockPos; + } + PrevMatched=false; } } + + FirstFile=false; if (Arc.FileHead.SplitAfter) { OpenNext=true; // Allow open next volume. @@ -1305,16 +1613,25 @@ bool CmdExtract::DetectStartVolume(const wchar *VolName,bool NewNumbering) } Arc.Close(); - if (!OpenNext) - break; + if (Volume && OpenNext) + { + NextVolumeName(NextName,ASIZE(NextName),!Arc.NewNumbering); + FirstVolume=false; - NextVolumeName(NextName,ASIZE(NextName),!Arc.NewNumbering); + // Needed for multivolume archives. Added in case some 'break' + // will quit early from loop above, so we do not set it in the loop. + // Now it can happen for hypothetical archive without file records + // and with HEAD_ENDARC record. + FirstFile=false; + } + else + break; } - bool NewStartFound=wcscmp(VolName,StartName)!=0; - if (NewStartFound) // Found a new volume to start extraction. - wcsncpyz(ArcName,StartName,ASIZE(ArcName)); - - return NewStartFound; + + // If file references are present, we can't reliably skip in semi-solid + // archives, because reference source can be present in skipped data. + if (RefList.Size()!=0) + memset(Analyze,0,sizeof(*Analyze)); } #endif diff --git a/deps/unrar/extract.hpp b/deps/unrar/extract.hpp index 159759b56..18396c5b9 100644 --- a/deps/unrar/extract.hpp +++ b/deps/unrar/extract.hpp @@ -6,13 +6,32 @@ enum EXTRACT_ARC_CODE {EXTRACT_ARC_NEXT,EXTRACT_ARC_REPEAT}; class CmdExtract { private: + struct ExtractRef + { + wchar *RefName; + wchar *TmpName; + uint64 RefCount; + }; + Array RefList; + + struct AnalyzeData + { + wchar StartName[NM]; + uint64 StartPos; + wchar EndName[NM]; + uint64 EndPos; + } *Analyze; + + bool ArcAnalyzed; + + void FreeAnalyzeData(); EXTRACT_ARC_CODE ExtractArchive(); - bool ExtractFileCopy(File &New,wchar *ArcName,wchar *NameNew,wchar *NameExisting,size_t NameExistingSize); + bool ExtractFileCopy(File &New,wchar *ArcName,const wchar *RedirName,wchar *NameNew,wchar *NameExisting,size_t NameExistingSize,int64 UnpSize); void ExtrPrepareName(Archive &Arc,const wchar *ArcFileName,wchar *DestName,size_t DestSize); #ifdef RARDLL bool ExtrDllGetPassword(); #else - bool ExtrGetPassword(Archive &Arc,const wchar *ArcFileName); + bool ExtrGetPassword(Archive &Arc,const wchar *ArcFileName,RarCheckPassword *CheckPwd); #endif #if defined(_WIN_ALL) && !defined(SFX_MODULE) void ConvertDosPassword(Archive &Arc,SecPassword &DestPwd); @@ -21,7 +40,7 @@ class CmdExtract bool ExtrCreateFile(Archive &Arc,File &CurFile); bool CheckUnpVer(Archive &Arc,const wchar *ArcFileName); #ifndef SFX_MODULE - bool DetectStartVolume(const wchar *VolName,bool NewNumbering); + void AnalyzeArchive(const wchar *ArcName,bool Volume,bool NewNumbering); void GetFirstVolIfFullSet(const wchar *SrcName,bool NewNumbering,wchar *DestName,size_t DestSize); #endif @@ -52,6 +71,15 @@ class CmdExtract bool PrevProcessed; // If previous file was successfully extracted or tested. wchar DestFileName[NM]; bool PasswordCancelled; + + // In Windows it is set to true if at least one symlink with ".." + // in target was extracted. + bool ConvertSymlinkPaths; + + // Last path checked for symlinks. We use it to improve the performance, + // so we do not check recently checked folders again. + std::wstring LastCheckedSymlink; + #if defined(_WIN_ALL) && !defined(SFX_MODULE) && !defined(SILENT) bool Fat32,NotFat32; #endif diff --git a/deps/unrar/filcreat.cpp b/deps/unrar/filcreat.cpp index 620bee813..d58e4f6fe 100644 --- a/deps/unrar/filcreat.cpp +++ b/deps/unrar/filcreat.cpp @@ -1,9 +1,9 @@ #include "rar.hpp" // If NewFile==NULL, we delete created file after user confirmation. -// It is useful we we need to overwrite an existing folder or file, +// It is useful if we need to overwrite an existing folder or file, // but need user confirmation for that. -bool FileCreate(RAROptions *Cmd,File *NewFile,wchar *Name,size_t MaxNameSize, +bool FileCreate(CommandData *Cmd,File *NewFile,wchar *Name,size_t MaxNameSize, bool *UserReject,int64 FileSize,RarTime *FileTime,bool WriteOnly) { if (UserReject!=NULL) @@ -44,7 +44,9 @@ bool FileCreate(RAROptions *Cmd,File *NewFile,wchar *Name,size_t MaxNameSize, } // Try to truncate the existing file first instead of delete, - // so we preserve existing file permissions such as NTFS permissions. + // so we preserve existing file permissions, such as NTFS permissions, + // also as "Compressed" attribute and hard links. In GUI version we avoid + // deleting an existing file for non-.rar archive formats as well. uint FileMode=WriteOnly ? FMF_WRITE|FMF_SHAREREAD:FMF_UPDATE|FMF_SHAREREAD; if (NewFile!=NULL && NewFile->Create(Name,FileMode)) return true; diff --git a/deps/unrar/filcreat.hpp b/deps/unrar/filcreat.hpp index 44f801d4e..456a4a4a1 100644 --- a/deps/unrar/filcreat.hpp +++ b/deps/unrar/filcreat.hpp @@ -1,7 +1,7 @@ #ifndef _RAR_FILECREATE_ #define _RAR_FILECREATE_ -bool FileCreate(RAROptions *Cmd,File *NewFile,wchar *Name,size_t MaxNameSize, +bool FileCreate(CommandData *Cmd,File *NewFile,wchar *Name,size_t MaxNameSize, bool *UserReject,int64 FileSize=INT64NDF, RarTime *FileTime=NULL,bool WriteOnly=false); diff --git a/deps/unrar/file.cpp b/deps/unrar/file.cpp index 5a8099ec5..7bf60fd4e 100644 --- a/deps/unrar/file.cpp +++ b/deps/unrar/file.cpp @@ -7,6 +7,7 @@ File::File() NewFile=false; LastWrite=false; HandleType=FILE_HANDLENORMAL; + LineInput=false; SkipClose=false; ErrorType=FILE_SUCCESS; OpenShared=false; @@ -14,11 +15,11 @@ File::File() AllowExceptions=true; PreserveAtime=false; #ifdef _WIN_ALL - NoSequentialRead=false; CreateMode=FMF_UNDEFINED; #endif ReadErrorMode=FREM_ASK; TruncatedAfterReadError=false; + CurFilePos=0; } @@ -58,7 +59,7 @@ bool File::Open(const wchar *Name,uint Mode) uint ShareMode=(Mode & FMF_OPENEXCLUSIVE) ? 0 : FILE_SHARE_READ; if (OpenShared) ShareMode|=FILE_SHARE_WRITE; - uint Flags=NoSequentialRead ? 0:FILE_FLAG_SEQUENTIAL_SCAN; + uint Flags=FILE_FLAG_SEQUENTIAL_SCAN; FindData FD; if (PreserveAtime) Access|=FILE_WRITE_ATTRIBUTES; // Needed to preserve atime. @@ -379,10 +380,11 @@ int File::Read(void *Data,size_t Size) if (ReadErrorMode==FREM_IGNORE) FilePos=Tell(); - int ReadSize; + int TotalRead=0; while (true) { - ReadSize=DirectRead(Data,Size); + int ReadSize=DirectRead(Data,Size); + if (ReadSize==-1) { ErrorType=FILE_READERROR; @@ -396,6 +398,8 @@ int File::Read(void *Data,size_t Size) size_t SizeToRead=Min(Size-I,512); int ReadCode=DirectRead(Data,SizeToRead); ReadSize+=(ReadCode==-1) ? 512:ReadCode; + if (ReadSize!=-1) + TotalRead+=ReadSize; } } else @@ -415,9 +419,28 @@ int File::Read(void *Data,size_t Size) ErrHandler.ReadError(FileName); } } + TotalRead+=ReadSize; // If ReadSize is -1, TotalRead is also set to -1 here. + + if (HandleType==FILE_HANDLESTD && !LineInput && ReadSize>0 && (uint)ReadSize0) // Can be -1 for error and AllowExceptions disabled. + CurFilePos+=TotalRead; + return TotalRead; // It can return -1 only if AllowExceptions is disabled. } @@ -499,6 +522,36 @@ bool File::RawSeek(int64 Offset,int Method) { if (hFile==FILE_BAD_HANDLE) return true; + if (!IsSeekable()) // To extract archives from stdin with -si. + { + // We tried to dynamically allocate 32 KB buffer here, but it improved + // speed in Windows 10 by mere ~1.5%. + byte Buf[4096]; + if (Method==SEEK_CUR || Method==SEEK_SET && Offset>=CurFilePos) + { + uint64 SkipSize=Method==SEEK_CUR ? Offset:Offset-CurFilePos; + while (SkipSize>0) // Reading to emulate seek forward. + { + int ReadSize=Read(Buf,(size_t)Min(SkipSize,ASIZE(Buf))); + if (ReadSize<=0) + return false; + SkipSize-=ReadSize; + CurFilePos+=ReadSize; + } + return true; + } + // May need it in FileLength() in Archive::UnexpEndArcMsg() when unpacking + // RAR 4.x archives without the end of archive block created with -en. + if (Method==SEEK_END) + { + int ReadSize; + while ((ReadSize=Read(Buf,ASIZE(Buf)))>0) + CurFilePos+=ReadSize; + return true; + } + + return false; // Backward seek on unseekable file. + } if (Offset<0 && Method!=SEEK_SET) { Offset=(Method==SEEK_CUR ? Tell():FileLength())+Offset; @@ -533,6 +586,8 @@ int64 File::Tell() ErrHandler.SeekError(FileName); else return -1; + if (!IsSeekable()) + return CurFilePos; #ifdef _WIN_ALL LONG HighDist=0; uint LowDist=SetFilePointer(hFile,0,&HighDist,FILE_CURRENT); @@ -683,17 +738,40 @@ void File::SetCloseFileTimeByName(const wchar *Name,RarTime *ftm,RarTime *fta) } -void File::GetOpenFileTime(RarTime *ft) +#ifdef _UNIX +void File::StatToRarTime(struct stat &st,RarTime *ftm,RarTime *ftc,RarTime *fta) +{ +#ifdef UNIX_TIME_NS +#if defined(_APPLE) + if (ftm!=NULL) ftm->SetUnixNS(st.st_mtimespec.tv_sec*(uint64)1000000000+st.st_mtimespec.tv_nsec); + if (ftc!=NULL) ftc->SetUnixNS(st.st_ctimespec.tv_sec*(uint64)1000000000+st.st_ctimespec.tv_nsec); + if (fta!=NULL) fta->SetUnixNS(st.st_atimespec.tv_sec*(uint64)1000000000+st.st_atimespec.tv_nsec); +#else + if (ftm!=NULL) ftm->SetUnixNS(st.st_mtim.tv_sec*(uint64)1000000000+st.st_mtim.tv_nsec); + if (ftc!=NULL) ftc->SetUnixNS(st.st_ctim.tv_sec*(uint64)1000000000+st.st_ctim.tv_nsec); + if (fta!=NULL) fta->SetUnixNS(st.st_atim.tv_sec*(uint64)1000000000+st.st_atim.tv_nsec); +#endif +#else + if (ftm!=NULL) ftm->SetUnix(st.st_mtime); + if (ftc!=NULL) ftc->SetUnix(st.st_ctime); + if (fta!=NULL) fta->SetUnix(st.st_atime); +#endif +} +#endif + + +void File::GetOpenFileTime(RarTime *ftm,RarTime *ftc,RarTime *fta) { #ifdef _WIN_ALL - FILETIME FileTime; - GetFileTime(hFile,NULL,NULL,&FileTime); - ft->SetWinFT(&FileTime); -#endif -#if defined(_UNIX) || defined(_EMX) + FILETIME ctime,atime,mtime; + GetFileTime(hFile,&ctime,&atime,&mtime); + if (ftm!=NULL) ftm->SetWinFT(&mtime); + if (ftc!=NULL) ftc->SetWinFT(&ctime); + if (fta!=NULL) fta->SetWinFT(&atime); +#elif defined(_UNIX) struct stat st; fstat(GetFD(),&st); - ft->SetUnix(st.st_mtime); + StatToRarTime(st,ftm,ftc,fta); #endif } diff --git a/deps/unrar/file.hpp b/deps/unrar/file.hpp index 1c436d4ef..5f55de960 100644 --- a/deps/unrar/file.hpp +++ b/deps/unrar/file.hpp @@ -14,8 +14,6 @@ #define FILE_BAD_HANDLE NULL #endif -class RAROptions; - enum FILE_HANDLETYPE {FILE_HANDLENORMAL,FILE_HANDLESTD}; enum FILE_ERRORTYPE {FILE_SUCCESS,FILE_NOTFOUND,FILE_READERROR}; @@ -59,6 +57,16 @@ class File FileHandle hFile; bool LastWrite; FILE_HANDLETYPE HandleType; + + // If we read the user input in console prompts from stdin, we shall + // process the available line immediately, not waiting for rest of data. + // Otherwise apps piping user responses to multiple Ask() prompts can + // hang if no more data is available yet and pipe isn't closed. + // If we read RAR archive or other file data from stdin, we shall collect + // the entire requested block as long as pipe isn't closed, so we get + // complete archive headers, not split between different reads. + bool LineInput; + bool SkipClose; FILE_READ_ERROR_MODE ReadErrorMode; bool NewFile; @@ -70,12 +78,17 @@ class File #endif bool PreserveAtime; bool TruncatedAfterReadError; + + int64 CurFilePos; // Used for forward seeks in stdin files. protected: bool OpenShared; // Set by 'Archive' class. public: wchar FileName[NM]; FILE_ERRORTYPE ErrorType; + + byte *SeekBuf; // To read instead of seek for stdin files. + static const size_t SeekBufSize=0x10000; public: File(); virtual ~File(); @@ -106,11 +119,16 @@ class File void SetOpenFileTime(RarTime *ftm,RarTime *ftc=NULL,RarTime *fta=NULL); void SetCloseFileTime(RarTime *ftm,RarTime *fta=NULL); static void SetCloseFileTimeByName(const wchar *Name,RarTime *ftm,RarTime *fta); - void GetOpenFileTime(RarTime *ft); +#ifdef _UNIX + static void StatToRarTime(struct stat &st,RarTime *ftm,RarTime *ftc,RarTime *fta); +#endif + void GetOpenFileTime(RarTime *ftm,RarTime *ftc=NULL,RarTime *fta=NULL); virtual bool IsOpened() {return hFile!=FILE_BAD_HANDLE;} // 'virtual' for MultiFile class. int64 FileLength(); void SetHandleType(FILE_HANDLETYPE Type) {HandleType=Type;} + void SetLineInputMode(bool Mode) {LineInput=Mode;} FILE_HANDLETYPE GetHandleType() {return HandleType;} + bool IsSeekable() {return HandleType!=FILE_HANDLESTD;} bool IsDevice(); static bool RemoveCreated(); FileHandle GetHandle() {return hFile;} @@ -119,9 +137,6 @@ class File int64 Copy(File &Dest,int64 Length=INT64NDF); void SetAllowDelete(bool Allow) {AllowDelete=Allow;} void SetExceptions(bool Allow) {AllowExceptions=Allow;} -#ifdef _WIN_ALL - void RemoveSequentialFlag() {NoSequentialRead=true;} -#endif void SetPreserveAtime(bool Preserve) {PreserveAtime=Preserve;} bool IsTruncatedAfterReadError() {return TruncatedAfterReadError;} #ifdef _UNIX diff --git a/deps/unrar/filefn.cpp b/deps/unrar/filefn.cpp index bab7c7384..aaef305b8 100644 --- a/deps/unrar/filefn.cpp +++ b/deps/unrar/filefn.cpp @@ -320,7 +320,6 @@ bool SetFileAttr(const wchar *Name,uint Attr) } -#if 0 wchar *MkTemp(wchar *Name,size_t MaxSize) { size_t Length=wcslen(Name); @@ -354,7 +353,6 @@ wchar *MkTemp(wchar *Name,size_t MaxSize) } return Name; } -#endif #if !defined(SFX_MODULE) @@ -397,7 +395,11 @@ void CalcFileSum(File *SrcFile,uint *CRC32,byte *Blake2,uint Threads,int64 Size, { #ifndef SILENT if ((Flags & CALCFSUM_SHOWPROGRESS)!=0) - uiExtractProgress(TotalRead,FileLength,TotalRead,FileLength); + { + // Update only the current file progress in WinRAR, set the total to 0 + // to keep it as is. It looks better for WinRAR. + uiExtractProgress(TotalRead,FileLength,0,0); + } else { if ((Flags & CALCFSUM_SHOWPERCENT)!=0) @@ -517,6 +519,18 @@ bool SetFileCompression(const wchar *Name,bool State) CloseHandle(hFile); return RetCode!=0; } + + +void ResetFileCache(const wchar *Name) +{ + // To reset file cache in Windows it is enough to open it with + // FILE_FLAG_NO_BUFFERING and then close it. + HANDLE hSrc=CreateFile(Name,GENERIC_READ, + FILE_SHARE_READ|FILE_SHARE_WRITE, + NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING,NULL); + if (hSrc!=INVALID_HANDLE_VALUE) + CloseHandle(hSrc); +} #endif diff --git a/deps/unrar/filefn.hpp b/deps/unrar/filefn.hpp index 78735fee9..53d86653f 100644 --- a/deps/unrar/filefn.hpp +++ b/deps/unrar/filefn.hpp @@ -27,9 +27,7 @@ bool IsDeleteAllowed(uint FileAttr); void PrepareToDelete(const wchar *Name); uint GetFileAttr(const wchar *Name); bool SetFileAttr(const wchar *Name,uint Attr); -#if 0 wchar* MkTemp(wchar *Name,size_t MaxSize); -#endif enum CALCFSUM_FLAGS {CALCFSUM_SHOWTEXT=1,CALCFSUM_SHOWPERCENT=2,CALCFSUM_SHOWPROGRESS=4,CALCFSUM_CURPOS=8}; @@ -41,6 +39,7 @@ bool DelDir(const wchar *Name); #if defined(_WIN_ALL) && !defined(SFX_MODULE) bool SetFileCompression(const wchar *Name,bool State); +void ResetFileCache(const wchar *Name); #endif diff --git a/deps/unrar/find.cpp b/deps/unrar/find.cpp index b22f82d8f..c9f2c5768 100644 --- a/deps/unrar/find.cpp +++ b/deps/unrar/find.cpp @@ -117,7 +117,7 @@ bool FindFile::FastFind(const wchar *FindMask,FindData *fd,bool GetSymLink) if (hFind==INVALID_HANDLE_VALUE) return false; FindClose(hFind); -#else +#elif defined(_UNIX) char FindMaskA[NM]; WideToChar(FindMask,FindMaskA,ASIZE(FindMaskA)); @@ -143,15 +143,7 @@ bool FindFile::FastFind(const wchar *FindMask,FindData *fd,bool GetSymLink) fd->FileAttr=st.st_mode; fd->Size=st.st_size; -#ifdef UNIX_TIME_NS - fd->mtime.SetUnixNS(st.st_mtim.tv_sec*(uint64)1000000000+st.st_mtim.tv_nsec); - fd->atime.SetUnixNS(st.st_atim.tv_sec*(uint64)1000000000+st.st_atim.tv_nsec); - fd->ctime.SetUnixNS(st.st_ctim.tv_sec*(uint64)1000000000+st.st_ctim.tv_nsec); -#else - fd->mtime.SetUnix(st.st_mtime); - fd->atime.SetUnix(st.st_atime); - fd->ctime.SetUnix(st.st_ctime); -#endif + File::StatToRarTime(st,&fd->mtime,&fd->ctime,&fd->atime); wcsncpyz(fd->Name,FindMask,ASIZE(fd->Name)); #endif diff --git a/deps/unrar/getbits.cpp b/deps/unrar/getbits.cpp index e4db2695f..8805f2787 100644 --- a/deps/unrar/getbits.cpp +++ b/deps/unrar/getbits.cpp @@ -5,7 +5,7 @@ BitInput::BitInput(bool AllocBuffer) ExternalBuffer=false; if (AllocBuffer) { - // getbits32 attempts to read data from InAddr, ... InAddr+3 positions. + // getbits*() attempt to read data from InAddr, ... InAddr+3 positions. // So let's allocate 3 additional bytes for situation, when we need to // read only 1 byte from the last position of buffer and avoid a crash // from access to next 3 bytes, which contents we do not need. diff --git a/deps/unrar/getbits.hpp b/deps/unrar/getbits.hpp index 7fbdfdf30..00acbea94 100644 --- a/deps/unrar/getbits.hpp +++ b/deps/unrar/getbits.hpp @@ -4,7 +4,7 @@ class BitInput { public: - enum BufferSize {MAX_SIZE=0x50000}; // Size of input buffer. + enum BufferSize {MAX_SIZE=0x8000}; // Size of input buffer. int InAddr; // Curent byte position in the buffer. int InBit; // Current bit position in the current byte. @@ -28,26 +28,38 @@ class BitInput InAddr+=Bits>>3; InBit=Bits&7; } - + // Return 16 bits from current position in the buffer. // Bit at (InAddr,InBit) has the highest position in returning data. uint getbits() { +#if defined(LITTLE_ENDIAN) && defined(ALLOW_MISALIGNED) + uint32 BitField=*(uint32*)(InBuf+InAddr); + BitField=ByteSwap32(BitField); + BitField >>= (16-InBit); +#else uint BitField=(uint)InBuf[InAddr] << 16; BitField|=(uint)InBuf[InAddr+1] << 8; BitField|=(uint)InBuf[InAddr+2]; BitField >>= (8-InBit); +#endif return BitField & 0xffff; } + // Return 32 bits from current position in the buffer. // Bit at (InAddr,InBit) has the highest position in returning data. uint getbits32() { +#if defined(LITTLE_ENDIAN) && defined(ALLOW_MISALIGNED) + uint32 BitField=*(uint32*)(InBuf+InAddr); + BitField=ByteSwap32(BitField); +#else uint BitField=(uint)InBuf[InAddr] << 24; BitField|=(uint)InBuf[InAddr+1] << 16; BitField|=(uint)InBuf[InAddr+2] << 8; BitField|=(uint)InBuf[InAddr+3]; +#endif BitField <<= InBit; BitField|=(uint)InBuf[InAddr+4] >> (8-InBit); return BitField & 0xffffffff; diff --git a/deps/unrar/global.cpp b/deps/unrar/global.cpp index 3975813a9..771f00016 100644 --- a/deps/unrar/global.cpp +++ b/deps/unrar/global.cpp @@ -1,6 +1,6 @@ #define INCLUDEGLOBAL -#if defined(__BORLANDC__) || defined(_MSC_VER) +#ifdef _MSC_VER #pragma hdrstop #endif diff --git a/deps/unrar/hardlinks.cpp b/deps/unrar/hardlinks.cpp index 40cc0aa49..171b5fa08 100644 --- a/deps/unrar/hardlinks.cpp +++ b/deps/unrar/hardlinks.cpp @@ -1,7 +1,5 @@ bool ExtractHardlink(CommandData *Cmd,wchar *NameNew,wchar *NameExisting,size_t NameExistingSize) { - SlashToNative(NameExisting,NameExisting,NameExistingSize); // Not needed for RAR 5.1+ archives. - if (!FileExist(NameExisting)) { uiMsg(UIERROR_HLINKCREATE,NameNew); diff --git a/deps/unrar/hash.cpp b/deps/unrar/hash.cpp index a4559e05c..106cc6083 100644 --- a/deps/unrar/hash.cpp +++ b/deps/unrar/hash.cpp @@ -26,7 +26,7 @@ void HashValue::Init(HASH_TYPE Type) } -bool HashValue::operator == (const HashValue &cmp) +bool HashValue::operator == (const HashValue &cmp) const { if (Type==HASH_NONE || cmp.Type==HASH_NONE) return true; diff --git a/deps/unrar/hash.hpp b/deps/unrar/hash.hpp index b7d879f66..6315680e7 100644 --- a/deps/unrar/hash.hpp +++ b/deps/unrar/hash.hpp @@ -6,8 +6,14 @@ enum HASH_TYPE {HASH_NONE,HASH_RAR14,HASH_CRC32,HASH_BLAKE2}; struct HashValue { void Init(HASH_TYPE Type); - bool operator == (const HashValue &cmp); - bool operator != (const HashValue &cmp) {return !(*this==cmp);} + + // Use the const member, so types on both sides of "==" match. + // Otherwise clang -std=c++20 issues "ambiguity is between a regular call + // to this operator and a call with the argument order reversed" warning. + bool operator == (const HashValue &cmp) const; + + // Not actually used now. Const member for same reason as operator == above. + bool operator != (const HashValue &cmp) const {return !(*this==cmp);} HASH_TYPE Type; union diff --git a/deps/unrar/headers.cpp b/deps/unrar/headers.cpp index b042dc393..b441376c5 100644 --- a/deps/unrar/headers.cpp +++ b/deps/unrar/headers.cpp @@ -49,13 +49,5 @@ FileHeader& FileHeader::operator = (FileHeader &hd) void MainHeader::Reset() { - HighPosAV=0; - PosAV=0; - CommentInHeader=false; - PackComment=false; - Locator=false; - QOpenOffset=0; - QOpenMaxSize=0; - RROffset=0; - RRMaxSize=0; + *this={}; } diff --git a/deps/unrar/headers.hpp b/deps/unrar/headers.hpp index 6af453a9d..0941220f5 100644 --- a/deps/unrar/headers.hpp +++ b/deps/unrar/headers.hpp @@ -6,7 +6,7 @@ #define SIZEOF_MAINHEAD3 13 // Size of RAR 4.x main archive header. #define SIZEOF_FILEHEAD14 21 // Size of RAR 1.4 file header. #define SIZEOF_FILEHEAD3 32 // Size of RAR 3.0 file header. -#define SIZEOF_SHORTBLOCKHEAD 7 +#define SIZEOF_SHORTBLOCKHEAD 7 // Smallest RAR 4.x block size. #define SIZEOF_LONGBLOCKHEAD 11 #define SIZEOF_SUBBLOCKHEAD 14 #define SIZEOF_COMMHEAD 13 @@ -162,12 +162,16 @@ struct MainHeader:BaseBlock ushort HighPosAV; uint PosAV; bool CommentInHeader; - bool PackComment; // For RAR 1.4 archive format only. + bool PackComment; // For RAR 1.4 archive format only. bool Locator; - uint64 QOpenOffset; // Offset of quick list record. - uint64 QOpenMaxSize; // Maximum size of QOpen offset in locator extra field. - uint64 RROffset; // Offset of recovery record. - uint64 RRMaxSize; // Maximum size of RR offset in locator extra field. + uint64 QOpenOffset; // Offset of quick list record. + uint64 QOpenMaxSize; // Maximum size of QOpen offset in locator extra field. + uint64 RROffset; // Offset of recovery record. + uint64 RRMaxSize; // Maximum size of RR offset in locator extra field. + size_t MetaNameMaxSize; // Maximum size of archive name in metadata extra field. + std::wstring OrigName; // Original archive name. + RarTime OrigTime; // Original archive time. + void Reset(); }; @@ -230,7 +234,7 @@ struct FileHeader:BlockHeader bool LargeFile; // 'true' for HEAD_SERVICE block, which is a child of preceding file block. - // RAR 4.x uses 'solid' flag to indicate child subheader blocks in archives. + // RAR 4.x uses 'solid' flag to indicate children subheader blocks in archives. bool SubBlock; HOST_SYSTEM_TYPE HSType; diff --git a/deps/unrar/headers5.hpp b/deps/unrar/headers5.hpp index 9ea8d979a..50f5955d1 100644 --- a/deps/unrar/headers5.hpp +++ b/deps/unrar/headers5.hpp @@ -59,11 +59,18 @@ // Main header extra field values. #define MHEXTRA_LOCATOR 0x01 // Position of quick list and other blocks. +#define MHEXTRA_METADATA 0x02 // Archive metadata. // Flags for MHEXTRA_LOCATOR. #define MHEXTRA_LOCATOR_QLIST 0x01 // Quick open offset is present. #define MHEXTRA_LOCATOR_RR 0x02 // Recovery record offset is present. +// Flags for MHEXTRA_METADATA. +#define MHEXTRA_METADATA_NAME 0x01 // Archive name is present. +#define MHEXTRA_METADATA_CTIME 0x02 // Archive creation time is present. +#define MHEXTRA_METADATA_UNIXTIME 0x04 // Use Unix nanosecond time format. +#define MHEXTRA_METADATA_UNIX_NS 0x08 // Unix format with nanosecond precision. + // File and service header extra field values. #define FHEXTRA_CRYPT 0x01 // Encryption parameters. #define FHEXTRA_HASH 0x02 // File hash. diff --git a/deps/unrar/isnt.cpp b/deps/unrar/isnt.cpp index 6fadec049..31da8c158 100644 --- a/deps/unrar/isnt.cpp +++ b/deps/unrar/isnt.cpp @@ -13,6 +13,7 @@ DWORD WinNT() dwPlatformId=WinVer.dwPlatformId; dwMajorVersion=WinVer.dwMajorVersion; dwMinorVersion=WinVer.dwMinorVersion; + } DWORD Result=0; if (dwPlatformId==VER_PLATFORM_WIN32_NT) @@ -21,4 +22,102 @@ DWORD WinNT() return Result; } -#endif + + +// Replace it with documented Windows 11 check when available. +#include +#include +#pragma comment(lib, "wbemuuid.lib") + +static bool WMI_IsWindows10() +{ + IWbemLocator *pLoc = NULL; + + HRESULT hres = CoCreateInstance(CLSID_WbemLocator,0,CLSCTX_INPROC_SERVER, + IID_IWbemLocator,(LPVOID *)&pLoc); + + if (FAILED(hres)) + return false; + + IWbemServices *pSvc = NULL; + + BSTR bstr_root_cimv2 = SysAllocString(L"ROOT\\CIMV2"); + + hres = pLoc->ConnectServer(bstr_root_cimv2,NULL,NULL,NULL,0,0,0,&pSvc); + + if (FAILED(hres)) + { + pLoc->Release(); + return false; + } + + hres = CoSetProxyBlanket(pSvc,RPC_C_AUTHN_WINNT,RPC_C_AUTHZ_NONE,NULL, + RPC_C_AUTHN_LEVEL_CALL,RPC_C_IMP_LEVEL_IMPERSONATE,NULL,EOAC_NONE); + + if (FAILED(hres)) + { + pSvc->Release(); + pLoc->Release(); + return false; + } + + IEnumWbemClassObject *pEnumerator = NULL; + + BSTR bstr_wql = SysAllocString(L"WQL"); + BSTR bstr_sql = SysAllocString(L"SELECT * FROM Win32_OperatingSystem"); + + hres = pSvc->ExecQuery(bstr_wql, bstr_sql, + WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); + + if (FAILED(hres)) + { + pSvc->Release(); + pLoc->Release(); + return false; + } + + IWbemClassObject *pclsObj = NULL; + ULONG uReturn = 0; + + bool Win10=false; + while (pEnumerator!=NULL) + { + HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); + + if (uReturn==0) + break; + + VARIANT vtProp; + + hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0); + Win10|=wcsstr(vtProp.bstrVal,L"Windows 10")!=NULL; + VariantClear(&vtProp); + + pclsObj->Release(); + } + + pSvc->Release(); + pLoc->Release(); + pEnumerator->Release(); + + return Win10; +} + + +// Replace it with actual check when available. +bool IsWindows11OrGreater() +{ + static bool IsSet=false,IsWin11=false; + if (!IsSet) + { + OSVERSIONINFO WinVer; + WinVer.dwOSVersionInfoSize=sizeof(WinVer); + GetVersionEx(&WinVer); + IsWin11=WinVer.dwMajorVersion>10 || + WinVer.dwMajorVersion==10 && WinVer.dwBuildNumber >= 22000 && !WMI_IsWindows10(); + IsSet=true; + } + return IsWin11; +} + +#endif // _WIN_ALL diff --git a/deps/unrar/isnt.hpp b/deps/unrar/isnt.hpp index 85790da46..fed0b5173 100644 --- a/deps/unrar/isnt.hpp +++ b/deps/unrar/isnt.hpp @@ -10,4 +10,7 @@ enum WINNT_VERSION { DWORD WinNT(); +// Replace it with actual check when available. +bool IsWindows11OrGreater(); + #endif diff --git a/deps/unrar/list.cpp b/deps/unrar/list.cpp index 476fd3c65..e4444e13a 100644 --- a/deps/unrar/list.cpp +++ b/deps/unrar/list.cpp @@ -1,6 +1,6 @@ #include "rar.hpp" -static void ListFileHeader(Archive &Arc,FileHeader &hd,bool &TitleShown,bool Verbose,bool Technical,bool Bare); +static void ListFileHeader(Archive &Arc,FileHeader &hd,bool &TitleShown,bool Verbose,bool Technical,bool Bare,bool DisableNames); static void ListSymLink(Archive &Arc); static void ListFileAttr(uint A,HOST_SYSTEM_TYPE HostType,wchar *AttrStr,size_t AttrSize); static void ListOldSubHeader(Archive &Arc); @@ -22,9 +22,6 @@ void ListArchive(CommandData *Cmd) Cmd->Password.Clean(); // Clean user entered password before processing next archive. Archive Arc(Cmd); -#ifdef _WIN_ALL - Arc.RemoveSequentialFlag(); -#endif if (!Arc.WOpen(ArcName)) continue; bool FileMatched=true; @@ -39,6 +36,7 @@ void ListArchive(CommandData *Cmd) { Arc.ViewComment(); mprintf(L"\n%s: %s",St(MListArchive),Arc.FileName); + mprintf(L"\n%s: ",St(MListDetails)); uint SetCount=0; const wchar *Fmt=Arc.Format==RARFMT14 ? L"RAR 1.4":(Arc.Format==RARFMT15 ? L"RAR 4":L"RAR 5"); @@ -64,6 +62,16 @@ void ListArchive(CommandData *Cmd) mprintf(L"%s%s", SetCount++ > 0 ? L", ":L"", St(MListLock)); if (Arc.Encrypted) mprintf(L"%s%s", SetCount++ > 0 ? L", ":L"", St(MListEncHead)); + + if (!Arc.MainHead.OrigName.empty()) + mprintf(L"\n%s: %s",St(MOrigName),Arc.MainHead.OrigName.c_str()); + if (Arc.MainHead.OrigTime.IsSet()) + { + wchar DateStr[50]; + Arc.MainHead.OrigTime.GetText(DateStr,ASIZE(DateStr),Technical); + mprintf(L"\n%s: %s",St(MOriginalTime),DateStr); + } + mprintf(L"\n"); } @@ -95,7 +103,7 @@ void ListArchive(CommandData *Cmd) FileMatched=Cmd->IsProcessFile(Arc.FileHead,NULL,MATCH_WILDSUBPATH,0,NULL,0)!=0; if (FileMatched) { - ListFileHeader(Arc,Arc.FileHead,TitleShown,Verbose,Technical,Bare); + ListFileHeader(Arc,Arc.FileHead,TitleShown,Verbose,Technical,Bare,Cmd->DisableNames); if (!Arc.FileHead.SplitBefore) { TotalUnpSize+=Arc.FileHead.UnpSize; @@ -108,7 +116,7 @@ void ListArchive(CommandData *Cmd) if (FileMatched && !Bare) { if (Technical && ShowService) - ListFileHeader(Arc,Arc.SubHead,TitleShown,Verbose,true,false); + ListFileHeader(Arc,Arc.SubHead,TitleShown,Verbose,true,false,Cmd->DisableNames); } break; } @@ -188,8 +196,29 @@ enum LISTCOL_TYPE { }; -void ListFileHeader(Archive &Arc,FileHeader &hd,bool &TitleShown,bool Verbose,bool Technical,bool Bare) +void ListFileHeader(Archive &Arc,FileHeader &hd,bool &TitleShown,bool Verbose,bool Technical,bool Bare,bool DisableNames) { + if (!TitleShown && !Technical && !Bare) + { + if (Verbose) + { + mprintf(L"\n%ls",St(MListTitleV)); + if (!DisableNames) + mprintf(L"\n----------- --------- -------- ----- ---------- ----- -------- ----"); + } + else + { + mprintf(L"\n%ls",St(MListTitleL)); + if (!DisableNames) + mprintf(L"\n----------- --------- ---------- ----- ----"); + } + // Must be set even in DisableNames mode to suppress "0 files" output + // unless no files are matched. + TitleShown=true; + } + if (DisableNames) + return; + wchar *Name=hd.FileName; RARFORMAT Format=Arc.Format; @@ -199,21 +228,6 @@ void ListFileHeader(Archive &Arc,FileHeader &hd,bool &TitleShown,bool Verbose,bo return; } - if (!TitleShown && !Technical) - { - if (Verbose) - { - mprintf(L"\n%ls",St(MListTitleV)); - mprintf(L"\n----------- --------- -------- ----- ---------- ----- -------- ----"); - } - else - { - mprintf(L"\n%ls",St(MListTitleL)); - mprintf(L"\n----------- --------- ---------- ----- ----"); - } - TitleShown=true; - } - wchar UnpSizeText[30],PackSizeText[30]; if (hd.UnpSize==INT64NDF) wcsncpyz(UnpSizeText,L"?",ASIZE(UnpSizeText)); @@ -304,17 +318,21 @@ void ListFileHeader(Archive &Arc,FileHeader &hd,bool &TitleShown,bool Verbose,bo mprintf(L"\n%12ls: %ls",St(MListPacked),PackSizeText); mprintf(L"\n%12ls: %ls",St(MListRatio),RatioStr); } + bool WinTitles=false; +#ifdef _WIN_ALL + WinTitles=true; +#endif if (hd.mtime.IsSet()) - mprintf(L"\n%12ls: %ls",St(MListMtime),DateStr); + mprintf(L"\n%12ls: %ls",St(WinTitles ? MListModified:MListMtime),DateStr); if (hd.ctime.IsSet()) { hd.ctime.GetText(DateStr,ASIZE(DateStr),true); - mprintf(L"\n%12ls: %ls",St(MListCtime),DateStr); + mprintf(L"\n%12ls: %ls",St(WinTitles ? MListCreated:MListCtime),DateStr); } if (hd.atime.IsSet()) { hd.atime.GetText(DateStr,ASIZE(DateStr),true); - mprintf(L"\n%12ls: %ls",St(MListAtime),DateStr); + mprintf(L"\n%12ls: %ls",St(WinTitles ? MListAccessed:MListAtime),DateStr); } mprintf(L"\n%12ls: %ls",St(MListAttr),AttrStr); if (hd.FileHash.Type==HASH_CRC32) @@ -370,15 +388,16 @@ void ListFileHeader(Archive &Arc,FileHeader &hd,bool &TitleShown,bool Verbose,bo { mprintf(L"\n%12ls: ",L"Unix owner"); if (*hd.UnixOwnerName!=0) - mprintf(L"%ls:",GetWide(hd.UnixOwnerName)); + mprintf(L"%ls",GetWide(hd.UnixOwnerName)); + else + if (hd.UnixOwnerNumeric) + mprintf(L"#%d",hd.UnixOwnerID); + mprintf(L":"); if (*hd.UnixGroupName!=0) mprintf(L"%ls",GetWide(hd.UnixGroupName)); - if ((*hd.UnixOwnerName!=0 || *hd.UnixGroupName!=0) && (hd.UnixOwnerNumeric || hd.UnixGroupNumeric)) - mprintf(L" "); - if (hd.UnixOwnerNumeric) - mprintf(L"#%d:",hd.UnixOwnerID); - if (hd.UnixGroupNumeric) - mprintf(L"#%d:",hd.UnixGroupID); + else + if (hd.UnixGroupNumeric) + mprintf(L"#%d",hd.UnixGroupID); } mprintf(L"\n"); diff --git a/deps/unrar/loclang.hpp b/deps/unrar/loclang.hpp index a1cd544a3..8c7c08814 100644 --- a/deps/unrar/loclang.hpp +++ b/deps/unrar/loclang.hpp @@ -28,6 +28,7 @@ #define MRARTitle1 L"\nUsage: rar - - " #define MUNRARTitle1 L"\nUsage: unrar - - " #define MRARTitle2 L"\n <@listfiles...> " +#define MFwrSlTitle2 L"\n <@listfiles...> " #define MCHelpCmd L"\n\n" #define MCHelpCmdA L"\n a Add files to archive" #define MCHelpCmdC L"\n c Add archive comment" @@ -58,6 +59,7 @@ #define MCHelpSwAD L"\n ad[1,2] Alternate destination path" #define MCHelpSwAG L"\n ag[format] Generate archive name using the current date" #define MCHelpSwAI L"\n ai Ignore file attributes" +#define MCHelpSwAM L"\n am[s,r] Archive name and time [save, restore]" #define MCHelpSwAO L"\n ao Add files with Archive attribute set" #define MCHelpSwAP L"\n ap Set path inside archive" #define MCHelpSwAS L"\n as Synchronize archive contents" @@ -72,11 +74,11 @@ #define MCHelpSwDW L"\n dw Wipe files after archiving" #define MCHelpSwEa L"\n e[+] Set file exclude and include attributes" #define MCHelpSwED L"\n ed Do not add empty directories" -#define MCHelpSwEN L"\n en Do not put 'end of archive' block" #define MCHelpSwEP L"\n ep Exclude paths from names" #define MCHelpSwEP1 L"\n ep1 Exclude base directory from names" #define MCHelpSwEP2 L"\n ep2 Expand paths to full" #define MCHelpSwEP3 L"\n ep3 Expand paths to full including the drive letter" +#define MCHelpSwEP4 L"\n ep4 Exclude the path prefix from names" #define MCHelpSwF L"\n f Freshen files" #define MCHelpSwHP L"\n hp[password] Encrypt both file data and headers" #define MCHelpSwHT L"\n ht[b|c] Select hash type [BLAKE2,CRC32] for file checksum" @@ -95,6 +97,7 @@ #define MCHelpSwMA L"\n ma[4|5] Specify a version of archiving format" #define MCHelpSwMC L"\n mc Set advanced compression parameters" #define MCHelpSwMD L"\n md[k,m,g] Dictionary size in KB, MB or GB" +#define MCHelpSwME L"\n me[par] Set encryption parameters" #define MCHelpSwMS L"\n ms[ext;ext] Specify file types to store" #define MCHelpSwMT L"\n mt Set the number of threads" #define MCHelpSwN L"\n n Additionally filter included files" @@ -106,11 +109,11 @@ #define MCHelpSwOI L"\n oi[0-4][:min] Save identical files as references" #define MCHelpSwOL L"\n ol[a] Process symbolic links as the link [absolute paths]" #define MCHelpSwONI L"\n oni Allow potentially incompatible names" +#define MCHelpSwOP L"\n op Set the output path for extracted files" #define MCHelpSwOR L"\n or Rename files automatically" #define MCHelpSwOS L"\n os Save NTFS streams" #define MCHelpSwOW L"\n ow Save or restore file owner and group" #define MCHelpSwP L"\n p[password] Set password" -#define MCHelpSwPm L"\n p- Do not query password" #define MCHelpSwQO L"\n qo[-|+] Add quick open information [none|force]" #define MCHelpSwR L"\n r Recurse subdirectories" #define MCHelpSwRm L"\n r- Disable recursion" @@ -272,6 +275,9 @@ #define MListMtime L"mtime" #define MListCtime L"ctime" #define MListAtime L"atime" +#define MListModified L"Modified" +#define MListCreated L"Created" +#define MListAccessed L"Accessed" #define MListAttr L"Attributes" #define MListFlags L"Flags" #define MListCompInfo L"Compression" @@ -385,3 +391,11 @@ #define MErrReadTrunc L"\n%s is archived incompletely because of read error.\n" #define MErrReadCount L"\n%u files are archived incompletely because of read errors." #define MDirNameExists L"\nDirectory with such name already exists" +#define MStdinNoInput L"\nKeyboard input is not allowed when reading data from stdin" +#define MTruncPsw L"\nPassword exceeds the maximum allowed length of %u characters and will be truncated." +#define MAdjustValue L"\nAdjusting %s value to %s." +#define MOpFailed L"\nOperation failed" +#define MSkipEncArc L"\nSkipping the encrypted archive %s" +#define MOrigName L"Original name" +#define MOriginalTime L"Original time" +#define MFileRenamed L"\n%s is renamed to %s" diff --git a/deps/unrar/makefile b/deps/unrar/makefile index 214f87ef3..55af49bef 100644 --- a/deps/unrar/makefile +++ b/deps/unrar/makefile @@ -123,10 +123,10 @@ UNRAR_OBJ=filestr.o recvol.o rs.o scantree.o qopen.o LIB_OBJ=filestr.o scantree.o dll.o qopen.o OBJECTS=rar.o strlist.o strfn.o pathfn.o smallfn.o global.o file.o filefn.o filcreat.o \ - archive.o arcread.o unicode.o system.o isnt.o crypt.o crc.o rawread.o encname.o \ + archive.o arcread.o unicode.o system.o crypt.o crc.o rawread.o encname.o \ resource.o match.o timefn.o rdwrfn.o consio.o options.o errhnd.o rarvm.o secpassword.o \ rijndael.o getbits.o sha1.o sha256.o blake2s.o hash.o extinfo.o extract.o volume.o \ - list.o find.o unpack.o headers.o threadpool.o rs16.o cmddata.o ui.o + list.o find.o unpack.o headers.o threadpool.o rs16.o cmddata.o ui.o .cpp.o: $(COMPILE) -D$(WHAT) -c $< @@ -142,20 +142,23 @@ clean: @rm -f $(OBJECTS) $(UNRAR_OBJ) $(LIB_OBJ) @rm -f unrar libunrar.* -unrar: clean $(OBJECTS) $(UNRAR_OBJ) +# We removed 'clean' from dependencies, because it prevented parallel +# 'make -Jn' builds. + +unrar: $(OBJECTS) $(UNRAR_OBJ) @rm -f unrar $(LINK) -o unrar $(LDFLAGS) $(OBJECTS) $(UNRAR_OBJ) $(LIBS) $(STRIP) unrar sfx: WHAT=SFX_MODULE -sfx: clean $(OBJECTS) +sfx: $(OBJECTS) @rm -f default.sfx $(LINK) -o default.sfx $(LDFLAGS) $(OBJECTS) $(STRIP) default.sfx lib: WHAT=RARDLL lib: CXXFLAGS+=$(LIBFLAGS) -lib: clean $(OBJECTS) $(LIB_OBJ) +lib: $(OBJECTS) $(LIB_OBJ) @rm -f libunrar.* $(LINK) -shared -o libunrar.so $(LDFLAGS) $(OBJECTS) $(LIB_OBJ) $(AR) rcs libunrar.a $(OBJECTS) $(LIB_OBJ) diff --git a/deps/unrar/model.cpp b/deps/unrar/model.cpp index 3aa29b245..e4f9e3c53 100644 --- a/deps/unrar/model.cpp +++ b/deps/unrar/model.cpp @@ -532,13 +532,15 @@ inline bool RARPPM_CONTEXT::decodeSymbol2(ModelPPM *Model) Model->Coder.SubRange.LowCount=HiCnt; Model->Coder.SubRange.HighCount=Model->Coder.SubRange.scale; i=NumStats-Model->NumMasked; - pps--; + + // 2022.12.02: we removed pps-- here and changed the code below to avoid + // "array subscript -1 is outside array bounds" warning in some compilers. do { - pps++; if (pps>=ps+ASIZE(ps)) // Extra safety check. return false; Model->CharMask[(*pps)->Symbol]=Model->EscCount; + pps++; } while ( --i ); psee2c->Summ += Model->Coder.SubRange.scale; Model->NumMasked = NumStats; @@ -566,17 +568,14 @@ void ModelPPM::CleanUp() } -bool ModelPPM::DecodeInit(Unpack *UnpackRead,int &EscChar,byte *hcppm) +bool ModelPPM::DecodeInit(Unpack *UnpackRead,int &EscChar) { int MaxOrder=UnpackRead->GetChar(); bool Reset=(MaxOrder & 0x20)!=0; int MaxMB; if (Reset) - { MaxMB=UnpackRead->GetChar(); - if (MaxMB>128) return(false); - } else if (SubAlloc.GetAllocatedMemory()==0) return(false); @@ -593,7 +592,6 @@ bool ModelPPM::DecodeInit(Unpack *UnpackRead,int &EscChar,byte *hcppm) SubAlloc.StopSubAllocator(); return(false); } - SubAlloc.SetHeapStartFixed(hcppm); SubAlloc.StartSubAllocator(MaxMB+1); StartModelRare(MaxOrder); } diff --git a/deps/unrar/model.hpp b/deps/unrar/model.hpp index c7444de33..52abc89b3 100644 --- a/deps/unrar/model.hpp +++ b/deps/unrar/model.hpp @@ -115,7 +115,7 @@ class ModelPPM : RARPPM_DEF public: ModelPPM(); void CleanUp(); // reset PPM variables after data error - bool DecodeInit(Unpack *UnpackRead,int &EscChar,byte *hcppm); + bool DecodeInit(Unpack *UnpackRead,int &EscChar); int DecodeChar(); }; diff --git a/deps/unrar/options.cpp b/deps/unrar/options.cpp index 40323be82..22ae27ce2 100644 --- a/deps/unrar/options.cpp +++ b/deps/unrar/options.cpp @@ -6,14 +6,6 @@ RAROptions::RAROptions() } -RAROptions::~RAROptions() -{ - // It is important for security reasons, so we do not have the unnecessary - // password data left in memory. - memset(this,0,sizeof(RAROptions)); -} - - void RAROptions::Init() { memset(this,0,sizeof(RAROptions)); diff --git a/deps/unrar/options.hpp b/deps/unrar/options.hpp index 993b21963..e249eb599 100644 --- a/deps/unrar/options.hpp +++ b/deps/unrar/options.hpp @@ -45,6 +45,12 @@ enum OVERWRITE_MODE OVERWRITE_FORCE_ASK }; +enum ARC_METADATA +{ + ARCMETA_NONE=0, + ARCMETA_SAVE, // -ams + ARCMETA_RESTORE // -amr +}; enum QOPEN_MODE { QOPEN_NONE, QOPEN_AUTO, QOPEN_ALWAYS }; @@ -84,11 +90,12 @@ struct FilterMode #define MAX_GENERATE_MASK 128 +// Here we store simple data types, which we can clear and move all together +// quickly. Rest of data types goes to CommandData. class RAROptions { public: RAROptions(); - ~RAROptions(); void Init(); uint ExclFileAttr; @@ -116,9 +123,10 @@ class RAROptions RAR_CHARSET ErrlogCharset; RAR_CHARSET RedirectCharset; - wchar ArcPath[NM]; - SecPassword Password; + wchar ArcPath[NM]; // For -ap. + wchar ExclArcPath[NM]; // For -ep4 switch. bool EncryptHeaders; + bool SkipEncrypted; bool ManualPassword; // Password entered manually during operation, might need to clean for next archive. @@ -130,6 +138,7 @@ class RAROptions HASH_TYPE HashType; int Recovery; int RecVolNumber; + ARC_METADATA ArcMetadata; bool DisablePercentage; bool DisableCopyright; bool DisableDone; @@ -145,7 +154,6 @@ class RAROptions PATH_EXCL_MODE ExclPath; RECURSE_MODE Recurse; int64 VolSize; - Array NextVolSizes; uint CurVolNum; bool AllYes; bool VerboseOutput; // -iv, display verbose output, used only in "WinRAR t" now. @@ -195,7 +203,11 @@ class RAROptions EXTTIME_MODE xctime; EXTTIME_MODE xatime; bool PreserveAtime; - wchar CompressStdin[NM]; + + // Read data from stdin and store in archive under a name specified here + // when archiving. Read an archive from stdin if any non-empty string + // is specified here when extracting. + wchar UseStdin[NM]; uint Threads; // We use it to init hash even if RAR_SMP is not defined. diff --git a/deps/unrar/os.hpp b/deps/unrar/os.hpp index dadec759a..8b2cdc42d 100644 --- a/deps/unrar/os.hpp +++ b/deps/unrar/os.hpp @@ -13,6 +13,8 @@ #endif #include +#include +#include #if defined(_WIN_ALL) || defined(_EMX) @@ -36,12 +38,23 @@ // re-definition warnings in third party projects. #ifndef UNICODE #define UNICODE +#define _UNICODE // Set _T() macro to convert from narrow to wide strings. #endif -#undef WINVER + +#ifdef _WIN32_WINNT #undef _WIN32_WINNT -#define WINVER 0x0501 -#define _WIN32_WINNT 0x0501 +#endif + +#if 0 +// 2021.09.05: Allow newer Vista+ APIs like IFileOpenDialog for WinRAR, +// but still keep SFX modules XP compatible. +#define WINVER _WIN32_WINNT_VISTA +#define _WIN32_WINNT _WIN32_WINNT_VISTA +#else +#define WINVER _WIN32_WINNT_WINXP +#define _WIN32_WINNT _WIN32_WINNT_WINXP +#endif #if !defined(ZIPSFX) #define RAR_SMP @@ -73,14 +86,14 @@ #include #endif #ifdef _MSC_VER - #if _MSC_VER<1500 - #define for if (0) ; else for - #endif #include #include - #define USE_SSE - #define SSE_ALIGNMENT 16 + // Use SSE only for x86/x64, not ARM Windows. + #if defined(_M_IX86) || defined(_M_X64) + #define USE_SSE + #define SSE_ALIGNMENT 16 + #endif #else #include #endif // _MSC_VER @@ -96,7 +109,6 @@ #include #include - #define SAVE_LINKS #define ENABLE_ACCESS @@ -212,7 +224,8 @@ #endif #endif -#if _POSIX_C_SOURCE >= 200809L +// Unlike Apple x64, utimensat shall be available in all Apple M1 systems. +#if _POSIX_C_SOURCE >= 200809L || defined(__APPLE__) && defined(__arm64__) #define UNIX_TIME_NS // Nanosecond time precision in Unix. #endif diff --git a/deps/unrar/pathfn.cpp b/deps/unrar/pathfn.cpp index 41594bf95..50b6b29da 100644 --- a/deps/unrar/pathfn.cpp +++ b/deps/unrar/pathfn.cpp @@ -5,7 +5,7 @@ wchar* PointToName(const wchar *Path) for (int I=(int)wcslen(Path)-1;I>=0;I--) if (IsPathDiv(Path[I])) return (wchar*)&Path[I+1]; - return (wchar*)((*Path && IsDriveDiv(Path[1])) ? Path+2:Path); + return (wchar*)((*Path!=0 && IsDriveDiv(Path[1])) ? Path+2:Path); } @@ -31,11 +31,17 @@ wchar* ConvertPath(const wchar *SrcPath,wchar *DestPath,size_t DestSize) const wchar *s=DestPtr; if (s[0]!=0 && IsDriveDiv(s[1])) s+=2; - if (s[0]=='\\' && s[1]=='\\') + + // Skip UNC Windows \\server\share\ or Unix //server/share/ + if (IsPathDiv(s[0]) && IsPathDiv(s[1])) { - const wchar *Slash=wcschr(s+2,'\\'); - if (Slash!=NULL && (Slash=wcschr(Slash+1,'\\'))!=NULL) - s=Slash+1; + uint SlashCount=0; + for (const wchar *t=s+2;*t!=0;t++) + if (IsPathDiv(*t) && ++SlashCount==2) + { + s=t+1; // Found two more path separators after leading two. + break; + } } for (const wchar *t=s;*t!=0;t++) if (IsPathDiv(*t)) @@ -184,7 +190,9 @@ void MakeName(const wchar *Path,const wchar *Name,wchar *Pathname,size_t MaxSize // the temporary buffer instead of constructing the name in 'Pathname'. wchar OutName[NM]; wcsncpyz(OutName,Path,ASIZE(OutName)); - AddEndSlash(OutName,ASIZE(OutName)); + // Do not add slash to d:, we want to allow relative paths like d:filename. + if (!IsDriveLetter(Path) || Path[2]!=0) + AddEndSlash(OutName,ASIZE(OutName)); wcsncatz(OutName,Name,ASIZE(OutName)); wcsncpyz(Pathname,OutName,MaxSize); } @@ -317,6 +325,9 @@ void GetConfigName(const wchar *Name,wchar *FullName,size_t MaxSize,bool CheckEx // of file name if numeric part is missing. wchar* GetVolNumPart(const wchar *ArcName) { + // We do not want to increment any characters in path component. + ArcName=PointToName(ArcName); + if (*ArcName==0) return (wchar *)ArcName; @@ -340,7 +351,7 @@ wchar* GetVolNumPart(const wchar *ArcName) { // Validate the first numeric part only if it has a dot somewhere // before it. - wchar *Dot=wcschr(PointToName(ArcName),'.'); + const wchar *Dot=wcschr(ArcName,'.'); if (Dot!=NULL && Dot|\"")==NULL; } -void MakeNameUsable(char *Name,bool Extended) -{ -#ifdef _WIN_ALL - // In Windows we also need to convert characters not defined in current - // code page. This double conversion changes them to '?', which is - // catched by code below. - size_t NameLength=strlen(Name); - wchar NameW[NM]; - CharToWide(Name,NameW,ASIZE(NameW)); - WideToChar(NameW,Name,NameLength+1); - Name[NameLength]=0; -#endif - for (char *s=Name;*s!=0;s=charnext(s)) - { - if (strchr(Extended ? "?*<>|\"":"?*",*s)!=NULL || Extended && (byte)*s<32) - *s='_'; -#ifdef _EMX - if (*s=='=') - *s='_'; -#endif -#ifndef _UNIX - if (s-Name>1 && *s==':') - *s='_'; - // Remove ' ' and '.' before path separator, but allow .\ and ..\. - if ((*s==' ' || *s=='.' && s>Name && !IsPathDiv(s[-1]) && s[-1]!='.') && IsPathDiv(s[1])) - *s='_'; -#endif - } -} void MakeNameUsable(wchar *Name,bool Extended) @@ -469,7 +469,27 @@ void MakeNameUsable(wchar *Name,bool Extended) { if (wcschr(Extended ? L"?*<>|\"":L"?*",*s)!=NULL || Extended && (uint)*s<32) *s='_'; -#ifndef _UNIX +#ifdef _UNIX + // We were asked to apply Windows-like conversion in Linux in case + // files are unpacked to Windows share. This code is invoked only + // if file failed to be created, so it doesn't affect extraction + // of Unix compatible names to native Unix drives. + if (Extended) + { + // Windows shares in Unix do not allow the drive letter, + // so unlike Windows version, we check all characters here. + if (*s==':') + *s='_'; + + // No spaces or dots before the path separator are allowed on Windows + // shares. But they are allowed and automtically removed at the end of + // file or folder name, so it is useless to replace them here. + // Since such files or folders are created successfully, a supposed + // conversion here would never be invoked. + if ((*s==' ' || *s=='.') && IsPathDiv(s[1])) + *s='_'; + } +#else if (s-Name>1 && *s==':') *s='_'; #if 0 // We already can create such files. @@ -692,7 +712,8 @@ static void GenArcName(wchar *ArcName,size_t MaxSize,const wchar *GenerateMask,u wchar Mask[MAX_GENERATE_MASK]; wcsncpyz(Mask,*GenerateMask!=0 ? GenerateMask:L"yyyymmddhhmmss",ASIZE(Mask)); - bool QuoteMode=false,Hours=false; + bool QuoteMode=false; + uint MAsMinutes=0; // By default we treat 'M' as months. for (uint I=0;Mask[I]!=0;I++) { if (Mask[I]=='{' || Mask[I]=='}') @@ -704,13 +725,16 @@ static void GenArcName(wchar *ArcName,size_t MaxSize,const wchar *GenerateMask,u continue; int CurChar=toupperw(Mask[I]); if (CurChar=='H') - Hours=true; + MAsMinutes=2; // Treat next two 'M' after 'H' as minutes. + if (CurChar=='D' || CurChar=='Y') + MAsMinutes=0; // Treat 'M' in HHDDMMYY and HHYYMMDD as month. - if (Hours && CurChar=='M') + if (MAsMinutes>0 && CurChar=='M') { // Replace minutes with 'I'. We use 'M' both for months and minutes, - // so we treat as minutes only those 'M' which are found after hours. + // so we treat as minutes only those 'M', which are found after hours. Mask[I]='I'; + MAsMinutes--; } if (CurChar=='N') { @@ -774,7 +798,9 @@ static void GenArcName(wchar *ArcName,size_t MaxSize,const wchar *GenerateMask,u const wchar *MaskChars=L"YMDHISWAEN"; + // How many times every modifier character was encountered in the mask. int CField[sizeof(Field)/sizeof(Field[0])]; + memset(CField,0,sizeof(CField)); QuoteMode=false; for (uint I=0;Mask[I]!=0;I++) @@ -816,13 +842,22 @@ static void GenArcName(wchar *ArcName,size_t MaxSize,const wchar *GenerateMask,u { size_t FieldPos=ChPtr-MaskChars; int CharPos=(int)strlen(Field[FieldPos])-CField[FieldPos]--; - if (FieldPos==1 && toupperw(Mask[I+1])=='M' && toupperw(Mask[I+2])=='M') + + // CField[FieldPos] shall have exactly 3 "MMM" symbols, so we do not + // repeat the month name in case "MMMMMMMM" mask. But since we + // decremented CField[FieldPos] above, we compared it with 2. + if (FieldPos==1 && CField[FieldPos]==2 && + toupperw(Mask[I+1])=='M' && toupperw(Mask[I+2])=='M') { wcsncpyz(DateText+J,GetMonthName(rlt.Month-1),ASIZE(DateText)-J); J=wcslen(DateText); I+=2; continue; } + // If CharPos is negative, we have more modifier characters than + // matching time data. We prefer to issue a modifier character + // instead of repeating time data from beginning, so user can notice + // excessive modifiers added by mistake. if (CharPos<0) DateText[J]=Mask[I]; else @@ -985,9 +1020,9 @@ void ConvertToPrecomposed(wchar *Name,size_t NameSize) } -// Remove trailing spaces and dots in file name and in dir names in path. -void MakeNameCompatible(wchar *Name) +void MakeNameCompatible(wchar *Name,size_t MaxSize) { + // Remove trailing spaces and dots in file name and in dir names in path. int Src=0,Dest=0; while (true) { @@ -1005,5 +1040,47 @@ void MakeNameCompatible(wchar *Name) Src++; Dest++; } + + // Rename reserved device names, such as aux.txt to _aux.txt. + // We check them in path components too, where they are also prohibited. + for (uint I=0;Name[I]!=0;I++) + if (I==0 || I>0 && IsPathDiv(Name[I-1])) + { + static const wchar *Devices[]={L"CON",L"PRN",L"AUX",L"NUL",L"COM#",L"LPT#"}; + wchar *s=Name+I; + bool MatchFound=false; + for (uint J=0;JI+1) // I+1, because we do not move the trailing 0. + memmove(s+1,s,(MaxSize-I-1)*sizeof(*s)); + *s='_'; +#ifndef SFX_MODULE + uiMsg(UIMSG_CORRECTINGNAME,nullptr); + uiMsg(UIERROR_RENAMING,nullptr,OrigName,Name); +#endif + } + } } #endif + + diff --git a/deps/unrar/pathfn.hpp b/deps/unrar/pathfn.hpp index 63813d8a4..62cae0ad2 100644 --- a/deps/unrar/pathfn.hpp +++ b/deps/unrar/pathfn.hpp @@ -29,7 +29,6 @@ void GetConfigName(const wchar *Name,wchar *FullName,size_t MaxSize,bool CheckEx wchar* GetVolNumPart(const wchar *ArcName); void NextVolumeName(wchar *ArcName,uint MaxLength,bool OldNumbering); bool IsNameUsable(const wchar *Name); -void MakeNameUsable(char *Name,bool Extended); void MakeNameUsable(wchar *Name,bool Extended); void UnixSlashToDos(const char *SrcName,char *DestName,size_t MaxLength); @@ -70,7 +69,8 @@ void GenerateArchiveName(wchar *ArcName,size_t MaxSize,const wchar *GenerateMask #ifdef _WIN_ALL bool GetWinLongPath(const wchar *Src,wchar *Dest,size_t MaxSize); void ConvertToPrecomposed(wchar *Name,size_t NameSize); -void MakeNameCompatible(wchar *Name); +void MakeNameCompatible(wchar *Name,size_t MaxSize); #endif + #endif diff --git a/deps/unrar/qopen.cpp b/deps/unrar/qopen.cpp index 43346b061..d906d06bd 100644 --- a/deps/unrar/qopen.cpp +++ b/deps/unrar/qopen.cpp @@ -97,7 +97,7 @@ void QuickOpen::Load(uint64 BlockPos) if (Arc->SubHead.Encrypted) { - RAROptions *Cmd=Arc->GetRAROptions(); + CommandData *Cmd=Arc->GetCommandData(); #ifndef RAR_NOCRYPT if (Cmd->Password.IsSet()) Crypt.SetCryptKeys(false,CRYPT_RAR50,&Cmd->Password,Arc->SubHead.Salt, diff --git a/deps/unrar/rar.hpp b/deps/unrar/rar.hpp index 3f7414c87..67edb6735 100644 --- a/deps/unrar/rar.hpp +++ b/deps/unrar/rar.hpp @@ -12,10 +12,12 @@ #include "version.hpp" #include "rardefs.hpp" #include "rarlang.hpp" +#include "rawint.hpp" #include "unicode.hpp" #include "errhnd.hpp" #include "secpassword.hpp" #include "array.hpp" +#include "strlist.hpp" #include "timefn.hpp" #include "sha1.hpp" #include "sha256.hpp" @@ -28,13 +30,11 @@ #include "headers.hpp" #include "pathfn.hpp" #include "strfn.hpp" -#include "strlist.hpp" #ifdef _WIN_ALL #include "isnt.hpp" #endif #include "file.hpp" #include "crc.hpp" -#include "ui.hpp" #include "filefn.hpp" #include "filestr.hpp" #include "find.hpp" @@ -47,11 +47,11 @@ #include "archive.hpp" #include "match.hpp" #include "cmddata.hpp" +#include "ui.hpp" #include "filcreat.hpp" #include "consio.hpp" #include "system.hpp" #include "log.hpp" -#include "rawint.hpp" #include "rawread.hpp" #include "encname.hpp" #include "resource.hpp" diff --git a/deps/unrar/rardefs.hpp b/deps/unrar/rardefs.hpp index 095792a03..6858d39c1 100644 --- a/deps/unrar/rardefs.hpp +++ b/deps/unrar/rardefs.hpp @@ -9,9 +9,13 @@ #define ASIZE(x) (sizeof(x)/sizeof(x[0])) -// MAXPASSWORD is expected to be multiple of CRYPTPROTECTMEMORY_BLOCK_SIZE (16) -// for CryptProtectMemory in SecPassword. -#define MAXPASSWORD 128 +// MAXPASSWORD and MAXPASSWORD_RAR are expected to be multiple of +// CRYPTPROTECTMEMORY_BLOCK_SIZE (16) for CryptProtectMemory in SecPassword. +// We allow a larger MAXPASSWORD to unpack archives with lengthy passwords +// in non-RAR formats in GUI versions. For RAR format we set MAXPASSWORD_RAR +// to 128 for compatibility and because it is enough for AES-256. +#define MAXPASSWORD 512 +#define MAXPASSWORD_RAR 128 #define MAXSFXSIZE 0x200000 diff --git a/deps/unrar/rawint.hpp b/deps/unrar/rawint.hpp index 303798886..c8cd86fc7 100644 --- a/deps/unrar/rawint.hpp +++ b/deps/unrar/rawint.hpp @@ -84,7 +84,7 @@ inline uint32 RawGetBE4(const byte *m) { #if defined(USE_MEM_BYTESWAP) && defined(_MSC_VER) return _byteswap_ulong(*(uint32 *)m); -#elif defined(USE_MEM_BYTESWAP) && (__GNUC__ > 3) && (__GNUC_MINOR__ > 2) +#elif defined(USE_MEM_BYTESWAP) && (defined(__clang__) || defined(__GNUC__)) return __builtin_bswap32(*(uint32 *)m); #else return uint32(m[0]<<24) | uint32(m[1]<<16) | uint32(m[2]<<8) | m[3]; @@ -97,7 +97,7 @@ inline void RawPutBE4(uint32 i,byte *mem) { #if defined(USE_MEM_BYTESWAP) && defined(_MSC_VER) *(uint32*)mem = _byteswap_ulong(i); -#elif defined(USE_MEM_BYTESWAP) && (__GNUC__ > 3) && (__GNUC_MINOR__ > 2) +#elif defined(USE_MEM_BYTESWAP) && (defined(__clang__) || defined(__GNUC__)) *(uint32*)mem = __builtin_bswap32(i); #else mem[0]=byte(i>>24); @@ -112,7 +112,7 @@ inline uint32 ByteSwap32(uint32 i) { #ifdef _MSC_VER return _byteswap_ulong(i); -#elif (__GNUC__ > 3) && (__GNUC_MINOR__ > 2) +#elif defined(__clang__) || defined(__GNUC__) return __builtin_bswap32(i); #else return (rotl32(i,24)&0xFF00FF00)|(rotl32(i,8)&0x00FF00FF); diff --git a/deps/unrar/rdwrfn.cpp b/deps/unrar/rdwrfn.cpp index 5c85753da..1b8219acf 100644 --- a/deps/unrar/rdwrfn.cpp +++ b/deps/unrar/rdwrfn.cpp @@ -16,6 +16,7 @@ void ComprDataIO::Init() UnpackFromMemory=false; UnpackToMemory=false; UnpPackedSize=0; + UnpPackedLeft=0; ShowProgress=true; TestMode=false; SkipUnpCRC=false; @@ -35,7 +36,9 @@ void ComprDataIO::Init() SubHead=NULL; SubHeadPos=NULL; CurrentCommand=0; - ProcessedArcSize=TotalArcSize=0; + ProcessedArcSize=0; + LastArcSize=0; + TotalArcSize=0; } @@ -75,10 +78,10 @@ int ComprDataIO::UnpRead(byte *Addr,size_t Count) } else { - size_t SizeToRead=((int64)Count>UnpPackedSize) ? (size_t)UnpPackedSize:Count; + size_t SizeToRead=((int64)Count>UnpPackedLeft) ? (size_t)UnpPackedLeft:Count; if (SizeToRead > 0) { - if (UnpVolume && Decryption && (int64)Count>UnpPackedSize) + if (UnpVolume && Decryption && (int64)Count>UnpPackedLeft) { // We need aligned blocks for decryption and we want "Keep broken // files" to work efficiently with missing encrypted volumes. @@ -109,7 +112,7 @@ int ComprDataIO::UnpRead(byte *Addr,size_t Count) ReadAddr+=ReadSize; Count-=ReadSize; #endif - UnpPackedSize-=ReadSize; + UnpPackedLeft-=ReadSize; // Do not ask for next volume if we read something from current volume. // If next volume is missing, we need to process all data from current @@ -118,7 +121,7 @@ int ComprDataIO::UnpRead(byte *Addr,size_t Count) // we ask for next volume also if we have non-aligned encryption block. // Since we adjust data size for decryption earlier above, // it does not hurt "Keep broken files" mode efficiency. - if (UnpVolume && UnpPackedSize == 0 && + if (UnpVolume && UnpPackedLeft == 0 && (ReadSize==0 || Decryption && (TotalRead & CRYPT_BLOCK_MASK) != 0) ) { #ifndef NOVOLUME @@ -134,7 +137,7 @@ int ComprDataIO::UnpRead(byte *Addr,size_t Count) } Archive *SrcArc=(Archive *)SrcFile; if (SrcArc!=NULL) - ShowUnpRead(SrcArc->CurBlockPos+CurUnpRead,UnpArcSize); + ShowUnpRead(SrcArc->NextBlockPos-UnpPackedSize+CurUnpRead,TotalArcSize); if (ReadSize!=-1) { ReadSize=TotalRead; @@ -148,18 +151,11 @@ int ComprDataIO::UnpRead(byte *Addr,size_t Count) } -#if defined(RARDLL) && defined(_MSC_VER) && !defined(_WIN_64) -// Disable the run time stack check for unrar.dll, so we can manipulate -// with ProcessDataProc call type below. Run time check would intercept -// a wrong ESP before we restore it. -#pragma runtime_checks( "s", off ) -#endif - void ComprDataIO::UnpWrite(byte *Addr,size_t Count) { #ifdef RARDLL - RAROptions *Cmd=((Archive *)SrcFile)->GetRAROptions(); + CommandData *Cmd=((Archive *)SrcFile)->GetCommandData(); if (Cmd->DllOpMode!=RAR_SKIP) { if (Cmd->Callback!=NULL && @@ -167,28 +163,7 @@ void ComprDataIO::UnpWrite(byte *Addr,size_t Count) ErrHandler.Exit(RARX_USERBREAK); if (Cmd->ProcessDataProc!=NULL) { - // Here we preserve ESP value. It is necessary for those developers, - // who still define ProcessDataProc callback as "C" type function, - // even though in year 2001 we announced in unrar.dll whatsnew.txt - // that it will be PASCAL type (for compatibility with Visual Basic). -#if defined(_MSC_VER) -#ifndef _WIN_64 - __asm mov ebx,esp -#endif -#elif defined(_WIN_ALL) && defined(__BORLANDC__) - _EBX=_ESP; -#endif int RetCode=Cmd->ProcessDataProc(Addr,(int)Count); - - // Restore ESP after ProcessDataProc with wrongly defined calling - // convention broken it. -#if defined(_MSC_VER) -#ifndef _WIN_64 - __asm mov esp,ebx -#endif -#elif defined(_WIN_ALL) && defined(__BORLANDC__) - _ESP=_EBX; -#endif if (RetCode==0) ErrHandler.Exit(RARX_USERBREAK); } @@ -216,11 +191,6 @@ void ComprDataIO::UnpWrite(byte *Addr,size_t Count) Wait(); } -#if defined(RARDLL) && defined(_MSC_VER) && !defined(_WIN_64) -// Restore the run time stack check for unrar.dll. -#pragma runtime_checks( "s", restore ) -#endif - @@ -230,15 +200,11 @@ void ComprDataIO::ShowUnpRead(int64 ArcPos,int64 ArcSize) { if (ShowProgress && SrcFile!=NULL) { - if (TotalArcSize!=0) - { - // important when processing several archives or multivolume archive - ArcSize=TotalArcSize; - ArcPos+=ProcessedArcSize; - } + // Important when processing several archives or multivolume archive. + ArcPos+=ProcessedArcSize; Archive *SrcArc=(Archive *)SrcFile; - RAROptions *Cmd=SrcArc->GetRAROptions(); + CommandData *Cmd=SrcArc->GetCommandData(); int CurPercent=ToPercent(ArcPos,ArcSize); if (!Cmd->DisablePercentage && CurPercent!=LastPercent) @@ -333,3 +299,37 @@ void ComprDataIO::SetUnpackFromMemory(byte *Addr,uint Size) UnpackFromMemoryAddr=Addr; UnpackFromMemorySize=Size; } + +// Extraction progress is based on the position in archive and we adjust +// the total archives size here, so trailing blocks do not prevent progress +// reaching 100% at the end of extraction. Alternatively we could print "100%" +// after completing the entire archive extraction, but then we would need +// to take into account possible messages like the checksum error after +// last file percent progress. +void ComprDataIO::AdjustTotalArcSize(Archive *Arc) +{ + // If we know a position of QO or RR blocks, use them to adjust the total + // packed size to beginning of these blocks. Earlier we already calculated + // the total size based on entire archive sizes. We also set LastArcSize + // to start of first trailing block, to add it later to ProcessedArcSize. + int64 ArcLength=Arc->IsSeekable() ? Arc->FileLength() : 0; + if (Arc->MainHead.QOpenOffset!=0) // QO is always preceding RR record. + LastArcSize=Arc->MainHead.QOpenOffset; + else + if (Arc->MainHead.RROffset!=0) + LastArcSize=Arc->MainHead.RROffset; + else + { + // If neither QO nor RR are found, exclude the approximate size of + // end of archive block. + // We select EndBlock to be larger than typical 8 bytes HEAD_ENDARC, + // but to not exceed the smallest 22 bytes HEAD_FILE with 1 byte file + // name, so we do not have two files with 100% at the end of archive. + const uint EndBlock=23; + + if (ArcLength>EndBlock) + LastArcSize=ArcLength-EndBlock; + } + + TotalArcSize-=ArcLength-LastArcSize; +} diff --git a/deps/unrar/rdwrfn.hpp b/deps/unrar/rdwrfn.hpp index 24c09eec4..f708bf4a9 100644 --- a/deps/unrar/rdwrfn.hpp +++ b/deps/unrar/rdwrfn.hpp @@ -1,6 +1,7 @@ #ifndef _RAR_DATAIO_ #define _RAR_DATAIO_ +class Archive; class CmdAdd; class Unpack; class ArcFileSearch; @@ -29,6 +30,7 @@ class ComprDataIO byte *UnpWrAddr; int64 UnpPackedSize; + int64 UnpPackedLeft; bool ShowProgress; bool TestMode; @@ -61,7 +63,7 @@ class ComprDataIO void UnpWrite(byte *Addr,size_t Count); void EnableShowProgress(bool Show) {ShowProgress=Show;} void GetUnpackedData(byte **Data,size_t *Size); - void SetPackedSizeToRead(int64 Size) {UnpPackedSize=Size;} + void SetPackedSizeToRead(int64 Size) {UnpPackedSize=UnpPackedLeft=Size;} void SetTestMode(bool Mode) {TestMode=Mode;} void SetSkipUnpCRC(bool Skip) {SkipUnpCRC=Skip;} void SetNoFileHeader(bool Mode) {NoFileHeader=Mode;} @@ -76,12 +78,12 @@ class ComprDataIO void SetUnpackToMemory(byte *Addr,uint Size); void SetUnpackFromMemory(byte *Addr,uint Size); void SetCurrentCommand(wchar Cmd) {CurrentCommand=Cmd;} + void AdjustTotalArcSize(Archive *Arc); bool PackVolume; bool UnpVolume; bool NextVolumeMissing; - int64 UnpArcSize; int64 CurPackRead,CurPackWrite,CurUnpRead,CurUnpWrite; @@ -89,6 +91,9 @@ class ComprDataIO // Used to calculate the total operation progress. int64 ProcessedArcSize; + // Last extracted archive size up to QO or RR block. + int64 LastArcSize; + int64 TotalArcSize; DataHash PackedDataHash; // Packed write and unpack read hash. diff --git a/deps/unrar/recvol.cpp b/deps/unrar/recvol.cpp index adf584044..b17820711 100644 --- a/deps/unrar/recvol.cpp +++ b/deps/unrar/recvol.cpp @@ -5,7 +5,7 @@ -bool RecVolumesRestore(RAROptions *Cmd,const wchar *Name,bool Silent) +bool RecVolumesRestore(CommandData *Cmd,const wchar *Name,bool Silent) { Archive Arc(Cmd); if (!Arc.Open(Name)) @@ -42,7 +42,7 @@ bool RecVolumesRestore(RAROptions *Cmd,const wchar *Name,bool Silent) } -void RecVolumesTest(RAROptions *Cmd,Archive *Arc,const wchar *Name) +void RecVolumesTest(CommandData *Cmd,Archive *Arc,const wchar *Name) { wchar RevName[NM]; *RevName=0; diff --git a/deps/unrar/recvol.hpp b/deps/unrar/recvol.hpp index 06510a211..4a6d663ff 100644 --- a/deps/unrar/recvol.hpp +++ b/deps/unrar/recvol.hpp @@ -14,11 +14,11 @@ class RecVolumes3 ThreadPool *RSThreadPool; #endif public: - RecVolumes3(RAROptions *Cmd,bool TestOnly); + RecVolumes3(CommandData *Cmd,bool TestOnly); ~RecVolumes3(); - void Make(RAROptions *Cmd,wchar *ArcName); - bool Restore(RAROptions *Cmd,const wchar *Name,bool Silent); - void Test(RAROptions *Cmd,const wchar *Name); + void Make(CommandData *Cmd,wchar *ArcName); + bool Restore(CommandData *Cmd,const wchar *Name,bool Silent); + void Test(CommandData *Cmd,const wchar *Name); }; @@ -48,8 +48,8 @@ struct RecRSThreadData class RecVolumes5 { private: - void ProcessRS(RAROptions *Cmd,uint DataNum,const byte *Data,uint MaxRead,bool Encode); - void ProcessRS(RAROptions *Cmd,uint MaxRead,bool Encode); + void ProcessRS(CommandData *Cmd,uint DataNum,const byte *Data,uint MaxRead,bool Encode); + void ProcessRS(CommandData *Cmd,uint MaxRead,bool Encode); uint ReadHeader(File *RecFile,bool FirstRev); Array RecItems; @@ -76,13 +76,13 @@ class RecVolumes5 public: // 'public' only because called from thread functions. void ProcessAreaRS(RecRSThreadData *td); public: - RecVolumes5(RAROptions *Cmd,bool TestOnly); + RecVolumes5(CommandData *Cmd,bool TestOnly); ~RecVolumes5(); - bool Restore(RAROptions *Cmd,const wchar *Name,bool Silent); - void Test(RAROptions *Cmd,const wchar *Name); + bool Restore(CommandData *Cmd,const wchar *Name,bool Silent); + void Test(CommandData *Cmd,const wchar *Name); }; -bool RecVolumesRestore(RAROptions *Cmd,const wchar *Name,bool Silent); -void RecVolumesTest(RAROptions *Cmd,Archive *Arc,const wchar *Name); +bool RecVolumesRestore(CommandData *Cmd,const wchar *Name,bool Silent); +void RecVolumesTest(CommandData *Cmd,Archive *Arc,const wchar *Name); #endif diff --git a/deps/unrar/recvol3.cpp b/deps/unrar/recvol3.cpp index 9fb846a28..ecf6dd35e 100644 --- a/deps/unrar/recvol3.cpp +++ b/deps/unrar/recvol3.cpp @@ -36,7 +36,7 @@ THREAD_PROC(RSDecodeThread) } #endif -RecVolumes3::RecVolumes3(RAROptions *Cmd,bool TestOnly) +RecVolumes3::RecVolumes3(CommandData *Cmd,bool TestOnly) { memset(SrcFile,0,sizeof(SrcFile)); if (TestOnly) @@ -99,7 +99,7 @@ static bool IsNewStyleRev(const wchar *Name) } -bool RecVolumes3::Restore(RAROptions *Cmd,const wchar *Name,bool Silent) +bool RecVolumes3::Restore(CommandData *Cmd,const wchar *Name,bool Silent) { wchar ArcName[NM]; wcsncpyz(ArcName,Name,ASIZE(ArcName)); @@ -497,7 +497,7 @@ void RSEncode::DecodeBuf() } -void RecVolumes3::Test(RAROptions *Cmd,const wchar *Name) +void RecVolumes3::Test(CommandData *Cmd,const wchar *Name) { if (!IsNewStyleRev(Name)) // RAR 3.0 name#_#_#.rev do not include CRC32. { diff --git a/deps/unrar/recvol5.cpp b/deps/unrar/recvol5.cpp index 3c524d8ee..2d9c94711 100644 --- a/deps/unrar/recvol5.cpp +++ b/deps/unrar/recvol5.cpp @@ -1,6 +1,10 @@ static const uint MaxVolumes=65535; -RecVolumes5::RecVolumes5(RAROptions *Cmd,bool TestOnly) +// We select this limit arbitrarily, to prevent user creating too many +// rev files by mistake. +#define MAX_REV_TO_DATA_RATIO 10 // 1000% of rev files. + +RecVolumes5::RecVolumes5(CommandData *Cmd,bool TestOnly) { RealBuf=NULL; RealReadBuffer=NULL; @@ -66,7 +70,7 @@ THREAD_PROC(RecThreadRS) #endif -void RecVolumes5::ProcessRS(RAROptions *Cmd,uint DataNum,const byte *Data,uint MaxRead,bool Encode) +void RecVolumes5::ProcessRS(CommandData *Cmd,uint DataNum,const byte *Data,uint MaxRead,bool Encode) { /* RSCoder16 RS; @@ -137,7 +141,7 @@ void RecVolumes5::ProcessAreaRS(RecRSThreadData *td) -bool RecVolumes5::Restore(RAROptions *Cmd,const wchar *Name,bool Silent) +bool RecVolumes5::Restore(CommandData *Cmd,const wchar *Name,bool Silent) { wchar ArcName[NM]; wcsncpyz(ArcName,Name,ASIZE(ArcName)); @@ -145,13 +149,16 @@ bool RecVolumes5::Restore(RAROptions *Cmd,const wchar *Name,bool Silent) wchar *Num=GetVolNumPart(ArcName); while (Num>ArcName && IsDigit(*(Num-1))) Num--; - if (Num==ArcName) + if (Num<=PointToName(ArcName)) return false; // Numeric part is missing or entire volume name is numeric, not possible for RAR or REV volume. wcsncpyz(Num,L"*.*",ASIZE(ArcName)-(Num-ArcName)); wchar FirstVolName[NM]; *FirstVolName=0; + wchar LongestRevName[NM]; + *LongestRevName=0; + int64 RecFileSize=0; FindFile VolFind; @@ -164,7 +171,7 @@ bool RecVolumes5::Restore(RAROptions *Cmd,const wchar *Name,bool Silent) Archive *Vol=new Archive(Cmd); int ItemPos=-1; - if (Vol->WOpen(fd.Name)) + if (!fd.IsDir && Vol->WOpen(fd.Name)) { if (CmpExt(fd.Name,L"rev")) { @@ -176,6 +183,9 @@ bool RecVolumes5::Restore(RAROptions *Cmd,const wchar *Name,bool Silent) ItemPos=RecNum; FoundRecVolumes++; + + if (wcslen(fd.Name)>wcslen(LongestRevName)) + wcsncpyz(LongestRevName,fd.Name,ASIZE(LongestRevName)); } } else @@ -231,6 +241,15 @@ bool RecVolumes5::Restore(RAROptions *Cmd,const wchar *Name,bool Silent) if (FoundRecVolumes==0) return false; + // If we did not find even a single .rar volume, create .rar volume name + // based on the longest .rev file name. Use longest .rev, so we have + // enough space for volume number. + if (*FirstVolName==0) + { + SetExt(LongestRevName,L"rar",ASIZE(LongestRevName)); + VolNameToFirstName(LongestRevName,FirstVolName,ASIZE(FirstVolName),true); + } + uiMsg(UIMSG_RECVOLCALCCHECKSUM); MissingVolumes=0; @@ -301,7 +320,7 @@ bool RecVolumes5::Restore(RAROptions *Cmd,const wchar *Name,bool Silent) Item->f=NULL; } - if ((Item->New=(Item->f==NULL))) // Additional parentheses to avoid GCC warning. + if ((Item->New=(Item->f==NULL))==true) { wcsncpyz(Item->Name,FirstVolName,ASIZE(Item->Name)); uiMsg(UIMSG_CREATING,Item->Name); @@ -316,7 +335,6 @@ bool RecVolumes5::Restore(RAROptions *Cmd,const wchar *Name,bool Silent) } NewVol->Prealloc(Item->FileSize); Item->f=NewVol; - Item->New=true; } NextVolumeName(FirstVolName,ASIZE(FirstVolName),false); } @@ -346,13 +364,11 @@ bool RecVolumes5::Restore(RAROptions *Cmd,const wchar *Name,bool Silent) RecBufferSize&=~(SSE_ALIGNMENT-1); // Align for SSE. #endif - uint *Data=new uint[TotalCount]; - RSCoder16 RS; if (!RS.Init(DataCount,RecCount,ValidFlags)) { + uiMsg(UIERROR_OPFAILED); delete[] ValidFlags; - delete[] Data; return false; // Should not happen, we check parameter validity above. } @@ -415,7 +431,6 @@ bool RecVolumes5::Restore(RAROptions *Cmd,const wchar *Name,bool Silent) RecItems[I].f->Close(); delete[] ValidFlags; - delete[] Data; #if !defined(SILENT) if (!Cmd->DisablePercentage) mprintf(L"\b\b\b\b100%%"); @@ -479,7 +494,7 @@ uint RecVolumes5::ReadHeader(File *RecFile,bool FirstRev) } -void RecVolumes5::Test(RAROptions *Cmd,const wchar *Name) +void RecVolumes5::Test(CommandData *Cmd,const wchar *Name) { wchar VolName[NM]; wcsncpyz(VolName,Name,ASIZE(VolName)); diff --git a/deps/unrar/rijndael.cpp b/deps/unrar/rijndael.cpp index cbb1722fd..02c4d147b 100644 --- a/deps/unrar/rijndael.cpp +++ b/deps/unrar/rijndael.cpp @@ -1,22 +1,40 @@ -/*************************************************************************** - * This code is based on public domain Szymon Stefanek AES implementation: * - * http://www.pragmaware.net/software/rijndael/index.php * - * * - * Dynamic tables generation is based on the Brian Gladman work: * - * http://fp.gladman.plus.com/cryptography_technology/rijndael * - ***************************************************************************/ +/************************************************************************** + * This code is based on Szymon Stefanek public domain AES implementation * + **************************************************************************/ #include "rar.hpp" #ifdef USE_SSE #include #endif -// not thread-safe ? -//static byte S[256],S5[256],rcon[30]; -//static byte T1[256][4],T2[256][4],T3[256][4],T4[256][4]; -//static byte T5[256][4],T6[256][4],T7[256][4],T8[256][4]; -//static byte U1[256][4],U2[256][4],U3[256][4],U4[256][4]; +static byte S[256]= +{ + 99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118, + 202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192, + 183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21, + 4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117, + 9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, + 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207, + 208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168, + 81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210, + 205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115, + 96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, + 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121, + 231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8, + 186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138, + 112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158, + 225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, + 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22 +}; +static byte S5[256]; + +// Round constants. 10 items are used by AES-128, 8 by AES-192, 7 by AES-256. +static byte rcon[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36}; + +static byte T1[256][4],T2[256][4],T3[256][4],T4[256][4]; +static byte T5[256][4],T6[256][4],T7[256][4],T8[256][4]; +static byte U1[256][4],U2[256][4],U3[256][4],U4[256][4]; inline void Xor128(void *dest,const void *arg1,const void *arg2) { @@ -64,7 +82,7 @@ inline void Copy128(byte *dest,const byte *src) Rijndael::Rijndael() { - //if (S[0]==0) + if (S5[0]==0) GenerateTables(); CBCMode = true; // Always true for RAR. } @@ -72,18 +90,20 @@ Rijndael::Rijndael() void Rijndael::Init(bool Encrypt,const byte *key,uint keyLen,const byte * initVector) { -#ifdef USE_SSE - // Check SSE here instead of constructor, so if object is a part of some - // structure memset'ed before use, this variable is not lost. + // Check SIMD here instead of constructor, so if object is a part of some + // structure memset'ed before use, these variables are not lost. +#if defined(USE_SSE) int CPUInfo[4]; - __cpuid(CPUInfo, 0x80000000); // Get the maximum supported cpuid function. - if ((CPUInfo[0] & 0x7fffffff)>=1) + __cpuid(CPUInfo, 0); + if (CPUInfo[0]>=1) // Check the maximum supported cpuid function. { __cpuid(CPUInfo, 1); AES_NI=(CPUInfo[2] & 0x2000000)!=0; } else - AES_NI=0; + AES_NI=false; +#elif defined(USE_NEON) + AES_Neon=(getauxval(AT_HWCAP) & HWCAP_AES)!=0; #endif // Other developers asked us to initialize it to suppress "may be used @@ -123,18 +143,25 @@ void Rijndael::Init(bool Encrypt,const byte *key,uint keyLen,const byte * initVe keyEncToDec(); } + void Rijndael::blockEncrypt(const byte *input,size_t inputLen,byte *outBuffer) { if (inputLen <= 0) return; size_t numBlocks = inputLen/16; -#ifdef USE_SSE +#if defined(USE_SSE) if (AES_NI) { blockEncryptSSE(input,numBlocks,outBuffer); return; } +#elif defined(USE_NEON) + if (AES_Neon) + { + blockEncryptNeon(input,numBlocks,outBuffer); + return; + } #endif byte *prevBlock = m_initVector; @@ -221,6 +248,40 @@ void Rijndael::blockEncryptSSE(const byte *input,size_t numBlocks,byte *outBuffe } #endif + +#ifdef USE_NEON +void Rijndael::blockEncryptNeon(const byte *input,size_t numBlocks,byte *outBuffer) +{ + byte *prevBlock = m_initVector; + while (numBlocks > 0) + { + byte block[16]; + if (CBCMode) + vst1q_u8(block, veorq_u8(vld1q_u8(prevBlock), vld1q_u8(input))); + else + vst1q_u8(block, vld1q_u8(input)); + + uint8x16_t data = vld1q_u8(block); + for (uint i = 0; i < m_uRounds-1; i++) + { + data = vaeseq_u8(data, vld1q_u8((byte *)m_expandedKey[i])); + data = vaesmcq_u8(data); + } + data = vaeseq_u8(data, vld1q_u8((byte *)(m_expandedKey[m_uRounds-1]))); + data = veorq_u8(data, vld1q_u8((byte *)(m_expandedKey[m_uRounds]))); + vst1q_u8(outBuffer, data); + + prevBlock=outBuffer; + + outBuffer += 16; + input += 16; + numBlocks--; + } + vst1q_u8(m_initVector, vld1q_u8(prevBlock)); + return; +} +#endif + void Rijndael::blockDecrypt(const byte *input, size_t inputLen, byte *outBuffer) { @@ -228,12 +289,18 @@ void Rijndael::blockDecrypt(const byte *input, size_t inputLen, byte *outBuffer) return; size_t numBlocks=inputLen/16; -#ifdef USE_SSE +#if defined(USE_SSE) if (AES_NI) { blockDecryptSSE(input,numBlocks,outBuffer); return; } +#elif defined(USE_NEON) + if (AES_Neon) + { + blockDecryptNeon(input,numBlocks,outBuffer); + return; + } #endif byte block[16], iv[4][4]; @@ -325,6 +392,41 @@ void Rijndael::blockDecryptSSE(const byte *input, size_t numBlocks, byte *outBuf #endif +#ifdef USE_NEON +void Rijndael::blockDecryptNeon(const byte *input, size_t numBlocks, byte *outBuffer) +{ + byte iv[16]; + memcpy(iv,m_initVector,16); + + while (numBlocks > 0) + { + uint8x16_t data = vld1q_u8(input); + + for (int i=m_uRounds-1; i>0; i--) + { + data = vaesdq_u8(data, vld1q_u8((byte *)m_expandedKey[i+1])); + data = vaesimcq_u8(data); + } + + data = vaesdq_u8(data, vld1q_u8((byte *)m_expandedKey[1])); + data = veorq_u8(data, vld1q_u8((byte *)m_expandedKey[0])); + + if (CBCMode) + data = veorq_u8(data, vld1q_u8(iv)); + + vst1q_u8(iv, vld1q_u8(input)); + vst1q_u8(outBuffer, data); + + input += 16; + outBuffer += 16; + numBlocks--; + } + + memcpy(m_initVector,iv,16); +} +#endif + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ALGORITHM ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -417,51 +519,40 @@ void Rijndael::keyEncToDec() } -#define ff_poly 0x011b -#define ff_hi 0x80 +static byte gmul(byte a, byte b) // Galois field "peasant's algorithm" multiplication. +{ + const byte poly=0x1b; // Lower byte of AES 0x11b irreducible polynomial. + byte result = 0; + while (b>0) + { + if ((b & 1) != 0) + result ^= a; + a = (a & 0x80) ? (a<<1)^poly : a<<1; + b >>= 1; + } + return result; +} -#define FFinv(x) ((x) ? pow[255 - log[x]]: 0) - -#define FFmul02(x) (x ? pow[log[x] + 0x19] : 0) -#define FFmul03(x) (x ? pow[log[x] + 0x01] : 0) -#define FFmul09(x) (x ? pow[log[x] + 0xc7] : 0) -#define FFmul0b(x) (x ? pow[log[x] + 0x68] : 0) -#define FFmul0d(x) (x ? pow[log[x] + 0xee] : 0) -#define FFmul0e(x) (x ? pow[log[x] + 0xdf] : 0) -#define fwd_affine(x) \ - (w = (uint)x, w ^= (w<<1)^(w<<2)^(w<<3)^(w<<4), (byte)(0x63^(w^(w>>8)))) - -#define inv_affine(x) \ - (w = (uint)x, w = (w<<1)^(w<<3)^(w<<6), (byte)(0x05^(w^(w>>8)))) +// 2021-09-24: changed to slower and simpler code without interim tables. +// It is still fast enough for our purpose. void Rijndael::GenerateTables() { - unsigned char pow[512],log[256]; - int i = 0, w = 1; - do + for (int I=0;I<256;I++) + S5[S[I]]=I; + + for (int I=0;I<256;I++) { - pow[i] = (byte)w; - pow[i + 255] = (byte)w; - log[w] = (byte)i++; - w ^= (w << 1) ^ (w & ff_hi ? ff_poly : 0); - } while (w != 1); - - for (int i = 0,w = 1; i < sizeof(rcon)/sizeof(rcon[0]); i++) - { - rcon[i] = w; - w = (w << 1) ^ (w & ff_hi ? ff_poly : 0); - } - for(int i = 0; i < 256; ++i) - { - unsigned char b=S[i]=fwd_affine(FFinv((byte)i)); - T1[i][1]=T1[i][2]=T2[i][2]=T2[i][3]=T3[i][0]=T3[i][3]=T4[i][0]=T4[i][1]=b; - T1[i][0]=T2[i][1]=T3[i][2]=T4[i][3]=FFmul02(b); - T1[i][3]=T2[i][0]=T3[i][1]=T4[i][2]=FFmul03(b); - S5[i] = b = FFinv(inv_affine((byte)i)); - U1[b][3]=U2[b][0]=U3[b][1]=U4[b][2]=T5[i][3]=T6[i][0]=T7[i][1]=T8[i][2]=FFmul0b(b); - U1[b][1]=U2[b][2]=U3[b][3]=U4[b][0]=T5[i][1]=T6[i][2]=T7[i][3]=T8[i][0]=FFmul09(b); - U1[b][2]=U2[b][3]=U3[b][0]=U4[b][1]=T5[i][2]=T6[i][3]=T7[i][0]=T8[i][1]=FFmul0d(b); - U1[b][0]=U2[b][1]=U3[b][2]=U4[b][3]=T5[i][0]=T6[i][1]=T7[i][2]=T8[i][3]=FFmul0e(b); + byte s=S[I]; + T1[I][1]=T1[I][2]=T2[I][2]=T2[I][3]=T3[I][0]=T3[I][3]=T4[I][0]=T4[I][1]=s; + T1[I][0]=T2[I][1]=T3[I][2]=T4[I][3]=gmul(s,2); + T1[I][3]=T2[I][0]=T3[I][1]=T4[I][2]=gmul(s,3); + + byte b=S5[I]; + U1[b][3]=U2[b][0]=U3[b][1]=U4[b][2]=T5[I][3]=T6[I][0]=T7[I][1]=T8[I][2]=gmul(b,0xb); + U1[b][1]=U2[b][2]=U3[b][3]=U4[b][0]=T5[I][1]=T6[I][2]=T7[I][3]=T8[I][0]=gmul(b,0x9); + U1[b][2]=U2[b][3]=U3[b][0]=U4[b][1]=T5[I][2]=T6[I][3]=T7[I][0]=T8[I][1]=gmul(b,0xd); + U1[b][0]=U2[b][1]=U3[b][2]=U4[b][3]=T5[I][0]=T6[I][1]=T7[I][2]=T8[I][3]=gmul(b,0xe); } } diff --git a/deps/unrar/rijndael.hpp b/deps/unrar/rijndael.hpp index 33537d890..96e1d0d14 100644 --- a/deps/unrar/rijndael.hpp +++ b/deps/unrar/rijndael.hpp @@ -2,11 +2,7 @@ #define _RIJNDAEL_H_ /************************************************************************** - * This code is based on Szymon Stefanek AES implementation: * - * http://www.esat.kuleuven.ac.be/~rijmen/rijndael/rijndael-cpplib.tar.gz * - * * - * Dynamic tables generation is based on the Brian Gladman's work: * - * http://fp.gladman.plus.com/cryptography_technology/rijndael * + * This code is based on Szymon Stefanek public domain AES implementation * **************************************************************************/ #define _MAX_KEY_COLUMNS (256/32) @@ -22,6 +18,16 @@ class Rijndael bool AES_NI; #endif +#ifdef USE_NEON + // Set "crypto" attribute as replacement of -march=armv8-a+crypto switch. + __attribute__((target("crypto"))) + void blockEncryptNeon(const byte *input,size_t numBlocks,byte *outBuffer); + __attribute__((target("crypto"))) + void blockDecryptNeon(const byte *input, size_t numBlocks, byte *outBuffer); + + bool AES_Neon; +#endif + void keySched(byte key[_MAX_KEY_COLUMNS][4]); void keyEncToDec(); void GenerateTables(); @@ -33,11 +39,6 @@ class Rijndael int m_uRounds; byte m_initVector[MAX_IV_SIZE]; byte m_expandedKey[_MAX_ROUNDS+1][4][4]; - - byte S[256],S5[256],rcon[30]; - byte T1[256][4],T2[256][4],T3[256][4],T4[256][4]; - byte T5[256][4],T6[256][4],T7[256][4],T8[256][4]; - byte U1[256][4],U2[256][4],U3[256][4],U4[256][4]; public: Rijndael(); void Init(bool Encrypt,const byte *key,uint keyLen,const byte *initVector); diff --git a/deps/unrar/rs16.cpp b/deps/unrar/rs16.cpp index bc8dd0937..f5c7ccac1 100644 --- a/deps/unrar/rs16.cpp +++ b/deps/unrar/rs16.cpp @@ -95,7 +95,9 @@ bool RSCoder16::Init(uint DataCount, uint RecCount, bool *ValidityFlags) if (NE > ValidECC || NE == 0 || ValidECC == 0) return false; } - if (ND + NR > gfSize || NR > ND || ND == 0 || NR == 0) + + // 2021.09.01 - we allowed RR and REV >100%, so no more NR > ND check. + if (ND + NR > gfSize || /*NR > ND ||*/ ND == 0 || NR == 0) return false; delete[] MX; diff --git a/deps/unrar/savepos.hpp b/deps/unrar/savepos.hpp deleted file mode 100644 index 1f8353f65..000000000 --- a/deps/unrar/savepos.hpp +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef _RAR_SAVEPOS_ -#define _RAR_SAVEPOS_ - -class SaveFilePos -{ - private: - File *SaveFile; - int64 SavePos; - public: - SaveFilePos(File &Src) - { - SaveFile=&Src; - SavePos=Src.Tell(); - } - ~SaveFilePos() - { - // Unless the file is already closed either by current exception - // processing or intentionally by external code. - if (SaveFile->IsOpened()) - { - try - { - SaveFile->Seek(SavePos,SEEK_SET); - } - catch(RAR_EXIT) - { - // Seek() can throw an exception and it terminates process - // if we are already processing another exception. Also in C++ 11 - // an exception in destructor always terminates process unless - // we mark destructor with noexcept(false). So we do not want to - // throw here. To prevent data loss we do not want to continue - // execution after seek error, so we close the file. - // Any next access to this file will return an error. - SaveFile->Close(); - } - } - } -}; - -#endif diff --git a/deps/unrar/scantree.cpp b/deps/unrar/scantree.cpp index a13a3ebce..03c830e71 100644 --- a/deps/unrar/scantree.cpp +++ b/deps/unrar/scantree.cpp @@ -215,10 +215,23 @@ bool ScanTree::GetNextMask() UnixSlashToDos(CurMask,CurMask,ASIZE(CurMask)); #endif - // We wish to scan entire disk if mask like c:\ is specified - // regardless of recursion mode. Use c:\*.* mask when need to scan only - // the root directory. - ScanEntireDisk=IsDriveLetter(CurMask) && IsPathDiv(CurMask[2]) && CurMask[3]==0; + /* + We prefer to scan entire disk if mask like \\server\share\ or c:\ + is specified regardless of recursion mode. Use \\server\share\*.* + or c:\*.* mask to scan only the root directory. + */ + if (CurMask[0]=='\\' && CurMask[1]=='\\') + { + const wchar *Slash=wcschr(CurMask+2,'\\'); + if (Slash!=NULL) + { + Slash=wcschr(Slash+1,'\\'); + ScanEntireDisk=Slash!=NULL && *(Slash+1)==0; + } + } + else + ScanEntireDisk=IsDriveLetter(CurMask) && IsPathDiv(CurMask[2]) && CurMask[3]==0; + wchar *Name=PointToName(CurMask); if (*Name==0) diff --git a/deps/unrar/secpassword.cpp b/deps/unrar/secpassword.cpp index b99e53af0..42ed47d5e 100644 --- a/deps/unrar/secpassword.cpp +++ b/deps/unrar/secpassword.cpp @@ -56,7 +56,6 @@ static CryptLoader GlobalCryptLoader; SecPassword::SecPassword() { - CrossProcess=false; Set(L""); } @@ -70,7 +69,8 @@ SecPassword::~SecPassword() void SecPassword::Clean() { PasswordSet=false; - cleandata(Password,sizeof(Password)); + if (Password.size()>0) + cleandata(&Password[0],Password.size()); } @@ -104,7 +104,7 @@ void SecPassword::Process(const wchar *Src,size_t SrcSize,wchar *Dst,size_t DstS // Source string can be shorter than destination as in case when we process // -p parameter, so we need to take into account both sizes. memcpy(Dst,Src,Min(SrcSize,DstSize)*sizeof(*Dst)); - SecHideData(Dst,DstSize*sizeof(*Dst),Encode,CrossProcess); + SecHideData(Dst,DstSize*sizeof(*Dst),Encode,false); } @@ -112,7 +112,7 @@ void SecPassword::Get(wchar *Psw,size_t MaxSize) { if (PasswordSet) { - Process(Password,ASIZE(Password),Psw,MaxSize,false); + Process(&Password[0],Password.size(),Psw,MaxSize,false); Psw[MaxSize-1]=0; } else @@ -124,15 +124,14 @@ void SecPassword::Get(wchar *Psw,size_t MaxSize) void SecPassword::Set(const wchar *Psw) { - if (*Psw==0) - { - PasswordSet=false; - memset(Password,0,sizeof(Password)); - } - else + // Eliminate any traces of previously stored password for security reason + // in case it was longer than new one. + Clean(); + + if (*Psw!=0) { PasswordSet=true; - Process(Psw,wcslen(Psw)+1,Password,ASIZE(Password),true); + Process(Psw,wcslen(Psw)+1,&Password[0],Password.size(),true); } } @@ -163,6 +162,9 @@ bool SecPassword::operator == (SecPassword &psw) } +// Set CrossProcess to true if we need to pass a password to another process. +// We use CrossProcess when transferring parameters to UAC elevated WinRAR +// and Windows GUI SFX modules. void SecHideData(void *Data,size_t DataSize,bool Encode,bool CrossProcess) { // CryptProtectMemory is not available in UWP and CryptProtectData diff --git a/deps/unrar/secpassword.hpp b/deps/unrar/secpassword.hpp index 375d3887a..5284bce12 100644 --- a/deps/unrar/secpassword.hpp +++ b/deps/unrar/secpassword.hpp @@ -8,10 +8,7 @@ class SecPassword private: void Process(const wchar *Src,size_t SrcSize,wchar *Dst,size_t DstSize,bool Encode); - wchar Password[MAXPASSWORD]; - - // It is important to have this 'bool' value, so if our object is cleaned - // with memset as a part of larger structure, it is handled correctly. + std::vector Password = std::vector(MAXPASSWORD); bool PasswordSet; public: SecPassword(); @@ -22,10 +19,6 @@ class SecPassword bool IsSet() {return PasswordSet;} size_t Length(); bool operator == (SecPassword &psw); - - // Set to true if we need to pass a password to another process. - // We use it when transferring parameters to UAC elevated WinRAR. - bool CrossProcess; }; diff --git a/deps/unrar/strfn.cpp b/deps/unrar/strfn.cpp index 8904b9072..7617f7a59 100644 --- a/deps/unrar/strfn.cpp +++ b/deps/unrar/strfn.cpp @@ -121,48 +121,26 @@ wchar* RemoveLF(wchar *Str) } -unsigned char loctolower(unsigned char ch) -{ -#if defined(_WIN_ALL) - // Convert to LPARAM first to avoid a warning in 64 bit mode. - // Convert to uintptr_t to avoid Clang/win error: cast to 'char *' from smaller integer type 'unsigned char' [-Werror,-Wint-to-pointer-cast] - return (int)(LPARAM)CharLowerA((LPSTR)(uintptr_t)ch); -#else - return tolower(ch); -#endif -} - - -unsigned char loctoupper(unsigned char ch) -{ -#if defined(_WIN_ALL) - // Convert to LPARAM first to avoid a warning in 64 bit mode. - // Convert to uintptr_t to avoid Clang/win error: cast to 'char *' from smaller integer type 'unsigned char' [-Werror,-Wint-to-pointer-cast] - return (int)(LPARAM)CharUpperA((LPSTR)(uintptr_t)ch); -#else - return toupper(ch); -#endif -} - - -// toupper with English only results if English input is provided. -// It avoids Turkish (small i) -> (big I with dot) conversion problem. -// We do not define 'ch' as 'int' to avoid necessity to cast all +#if defined(SFX_MODULE) +// char version of etoupperw. Used in console SFX module only. +// Fast toupper for English only input and output. Additionally to speed, +// it also avoids Turkish small i to big I with dot conversion problem. +// We do not define 'c' as 'int' to avoid necessity to cast all // signed chars passed to this function to unsigned char. -unsigned char etoupper(unsigned char ch) +unsigned char etoupper(unsigned char c) { - if (ch=='i') - return 'I'; - return toupper(ch); + return c>='a' && c<='z' ? c-'a'+'A' : c; } +#endif -// Unicode version of etoupper. -wchar etoupperw(wchar ch) +// Fast toupper for English only input and output. Additionally to speed, +// it also avoids Turkish small i to big I with dot conversion problem. +// We do not define 'c' as 'int' to avoid necessity to cast all +// signed wchars passed to this function to unsigned char. +wchar etoupperw(wchar c) { - if (ch=='i') - return 'I'; - return toupperw(ch); + return c>='a' && c<='z' ? c-'a'+'A' : c; } @@ -379,6 +357,32 @@ void itoa(int64 n,wchar *Str,size_t MaxSize) } +// Convert the number to string using thousand separators. +void fmtitoa(int64 n,wchar *Str,size_t MaxSize) +{ + static wchar ThSep=0; // Thousands separator. +#ifdef _WIN_ALL + wchar Info[10]; + if (!ThSep!=0 && GetLocaleInfo(LOCALE_USER_DEFAULT,LOCALE_STHOUSAND,Info,ASIZE(Info))>0) + ThSep=*Info; +#elif defined(_UNIX) + ThSep=*localeconv()->thousands_sep; +#endif + if (ThSep==0) // If failed to detect the actual separator value. + ThSep=' '; + wchar RawText[30]; // 20 characters are enough for largest unsigned 64 bit int. + itoa(n,RawText,ASIZE(RawText)); + uint S=0,D=0,L=wcslen(RawText)%3; + while (RawText[S]!=0 && D+1=7) { diff --git a/deps/unrar/threadmisc.cpp b/deps/unrar/threadmisc.cpp index 742eda41d..7a6ec7822 100644 --- a/deps/unrar/threadmisc.cpp +++ b/deps/unrar/threadmisc.cpp @@ -149,3 +149,5 @@ uint GetNumberOfThreads() return NumCPU; } + + diff --git a/deps/unrar/timefn.cpp b/deps/unrar/timefn.cpp index e86d41a11..0abf49de9 100644 --- a/deps/unrar/timefn.cpp +++ b/deps/unrar/timefn.cpp @@ -273,12 +273,12 @@ void RarTime::SetAgeText(const wchar *TimeText) uint Seconds=0,Value=0; for (uint I=0;TimeText[I]!=0;I++) { - int Ch=TimeText[I]; + wchar Ch=TimeText[I]; if (IsDigit(Ch)) Value=Value*10+Ch-'0'; else { - switch(etoupper(Ch)) + switch(etoupperw(Ch)) { case 'D': Seconds+=Value*24*3600; diff --git a/deps/unrar/timefn.hpp b/deps/unrar/timefn.hpp index 527136164..49b61e85d 100644 --- a/deps/unrar/timefn.hpp +++ b/deps/unrar/timefn.hpp @@ -22,6 +22,17 @@ class RarTime // Internal time representation in 1/TICKS_PER_SECOND since 01.01.1601. // We use nanoseconds here to handle the high precision Unix time. + // It allows dates up to July 2185. + // + // If we'll ever need to extend the date range, we can define a lower + // precision Windows version of TICKS_PER_SECOND. But then Unix and Windows + // versions can differ in least significant digits of "lt" time output + // for Unix archives. + // Alternatively we can introduce 'bool HighPrecision' set to true + // in SetUnixNS() and TicksPerSecond() instead of constant above. + // It might be more reliable than defining TicksPerSecond variable, + // which wouldn't survive memset of any structure hosting RarTime. + // We would need to eliminate all such memsets in the entire code first. uint64 itime; public: // RarLocalTime::Reminder precision. Must be equal to TICKS_PER_SECOND. diff --git a/deps/unrar/ui.hpp b/deps/unrar/ui.hpp index 2654387c2..5def26df1 100644 --- a/deps/unrar/ui.hpp +++ b/deps/unrar/ui.hpp @@ -39,7 +39,7 @@ enum UIMESSAGE_CODE { UIERROR_UOWNERBROKEN, UIERROR_UOWNERGETOWNERID, UIERROR_UOWNERGETGROUPID, UIERROR_UOWNERSET, UIERROR_ULINKREAD, UIERROR_ULINKEXIST, UIERROR_OPENPRESERVEATIME, UIERROR_READERRTRUNCATED, UIERROR_READERRCOUNT, - UIERROR_DIRNAMEEXISTS, + UIERROR_DIRNAMEEXISTS,UIERROR_TRUNCPSW,UIERROR_ADJUSTVALUE, UIMSG_FIRST, UIMSG_STRING, UIMSG_BUILD, UIMSG_RRSEARCH, UIMSG_ANALYZEFILEDATA, @@ -49,6 +49,7 @@ enum UIMESSAGE_CODE { UIMSG_CORRECTINGNAME, UIMSG_BADARCHIVE, UIMSG_CREATING, UIMSG_RENAMING, UIMSG_RECVOLCALCCHECKSUM, UIMSG_RECVOLFOUND, UIMSG_RECVOLMISSING, UIMSG_MISSINGVOL, UIMSG_RECONSTRUCTING, UIMSG_CHECKSUM, UIMSG_FAT32SIZE, + UIMSG_SKIPENCARC, UIMSG_FILERENAME, UIWAIT_FIRST, UIWAIT_DISKFULLNEXT, UIWAIT_FCREATEERROR, UIWAIT_BADPSW, @@ -76,7 +77,7 @@ enum UIASKREP_RESULT { }; UIASKREP_RESULT uiAskReplace(wchar *Name,size_t MaxNameSize,int64 FileSize,RarTime *FileTime,uint Flags); -UIASKREP_RESULT uiAskReplaceEx(RAROptions *Cmd,wchar *Name,size_t MaxNameSize,int64 FileSize,RarTime *FileTime,uint Flags); +UIASKREP_RESULT uiAskReplaceEx(CommandData *Cmd,wchar *Name,size_t MaxNameSize,int64 FileSize,RarTime *FileTime,uint Flags); void uiInit(SOUND_NOTIFY_MODE Sound); @@ -87,7 +88,7 @@ void uiExtractProgress(int64 CurFileSize,int64 TotalFileSize,int64 CurSize,int64 void uiProcessProgress(const char *Command,int64 CurSize,int64 TotalSize); enum UIPASSWORD_TYPE {UIPASSWORD_GLOBAL,UIPASSWORD_FILE,UIPASSWORD_ARCHIVE}; -bool uiGetPassword(UIPASSWORD_TYPE Type,const wchar *FileName,SecPassword *Password); +bool uiGetPassword(UIPASSWORD_TYPE Type,const wchar *FileName,SecPassword *Password,CheckPassword *CheckPwd); bool uiIsGlobalPasswordSet(); enum UIALARM_TYPE {UIALARM_ERROR, UIALARM_INFO, UIALARM_QUESTION}; @@ -144,30 +145,31 @@ class uiMsgStore // Templates recognize usual NULL as integer, not wchar*. #define UINULL ((wchar *)NULL) -inline void uiMsg(UIMESSAGE_CODE Code) +inline void uiMsgBase(uiMsgStore &Store) { - uiMsgStore Store(Code); - Store.Msg(); + // Called last, when no parameters are left. } -template void uiMsg(UIMESSAGE_CODE Code,T1 a1) +template void uiMsgBase(uiMsgStore &Store,T1&& a1,TN&&... aN) { - uiMsgStore Store(Code); + // Process first parameter and pass the rest to same uiMsgBase. Store< void uiMsg(UIMESSAGE_CODE Code,T1 a1,T2 a2) + +// Use variadic templates. +// +// We must pass variable parameters by reference, so no temporary copies are +// created for custom string objects like CStringBase in 7-Zip decompression +// code. Such temporary copies would be destroyed inside of recursive +// uiMsgBase calls, leaving us with Str[] items pointing at released memory. +// Since we pass integer values as well, we can't use & references +// and must resort to && rvalue references. +template void uiMsg(UIMESSAGE_CODE Code,TN&&... aN) { uiMsgStore Store(Code); - Store< void uiMsg(UIMESSAGE_CODE code,T1 a1,T2 a2,T3 a3) -{ - uiMsgStore Store(code); - Store<Overwrite==OVERWRITE_NONE) return UIASKREP_R_SKIP; diff --git a/deps/unrar/uiconsole.cpp b/deps/unrar/uiconsole.cpp index ceae1a7c5..b1ac51322 100644 --- a/deps/unrar/uiconsole.cpp +++ b/deps/unrar/uiconsole.cpp @@ -71,7 +71,10 @@ bool uiStartFileExtract(const wchar *FileName,bool Extract,bool Test,bool Skip) void uiExtractProgress(int64 CurFileSize,int64 TotalFileSize,int64 CurSize,int64 TotalSize) { - int CurPercent=ToPercent(CurSize,TotalSize); + // We set the total size to 0 to update only the current progress and keep + // the total progress intact in WinRAR. Unlike WinRAR, console RAR has only + // the total progress and updates it with current values in such case. + int CurPercent=TotalSize!=0 ? ToPercent(CurSize,TotalSize) : ToPercent(CurFileSize,TotalFileSize); mprintf(L"\b\b\b\b%3d%%",CurPercent); } @@ -247,6 +250,9 @@ void uiMsgStore::Msg() mprintf(L"\n"); // Needed when called from CmdExtract::ExtractCurrentFile. break; #ifndef SFX_MODULE + case UIERROR_OPFAILED: + Log(NULL,St(MOpFailed)); + break; case UIERROR_NEWRARFORMAT: Log(Str[0],St(MNewRarFormat)); break; @@ -256,6 +262,7 @@ void uiMsgStore::Msg() break; case UIERROR_MISSINGVOL: Log(Str[0],St(MAbsNextVol),Str[0]); + mprintf(L" "); // For progress percent. break; #ifndef SFX_MODULE case UIERROR_NEEDPREVVOL: @@ -329,6 +336,13 @@ void uiMsgStore::Msg() case UIERROR_DIRNAMEEXISTS: Log(NULL,St(MDirNameExists)); break; + case UIERROR_TRUNCPSW: + eprintf(St(MTruncPsw),Num[0]); + eprintf(L"\n"); + break; + case UIERROR_ADJUSTVALUE: + Log(NULL,St(MAdjustValue),Str[0],Str[1]); + break; #ifndef SFX_MODULE case UIMSG_STRING: @@ -369,6 +383,9 @@ void uiMsgStore::Msg() mprintf(St(MFAT32Size)); mprintf(L" "); // For progress percent. break; + case UIMSG_SKIPENCARC: + Log(NULL,St(MSkipEncArc),Str[0]); + break; @@ -379,7 +396,8 @@ void uiMsgStore::Msg() } -bool uiGetPassword(UIPASSWORD_TYPE Type,const wchar *FileName,SecPassword *Password) +bool uiGetPassword(UIPASSWORD_TYPE Type,const wchar *FileName, + SecPassword *Password,CheckPassword *CheckPwd) { // Unlike GUI we cannot provide Cancel button here, so we use the empty // password to abort. Otherwise user not knowing a password would need to diff --git a/deps/unrar/uisilent.cpp b/deps/unrar/uisilent.cpp index 1df097566..815588574 100644 --- a/deps/unrar/uisilent.cpp +++ b/deps/unrar/uisilent.cpp @@ -33,7 +33,8 @@ void uiMsgStore::Msg() } -bool uiGetPassword(UIPASSWORD_TYPE Type,const wchar *FileName,SecPassword *Password) +bool uiGetPassword(UIPASSWORD_TYPE Type,const wchar *FileName, + SecPassword *Password,CheckPassword *CheckPwd) { return false; } diff --git a/deps/unrar/ulinks.cpp b/deps/unrar/ulinks.cpp index d198f2e06..141a97fec 100644 --- a/deps/unrar/ulinks.cpp +++ b/deps/unrar/ulinks.cpp @@ -50,7 +50,28 @@ static bool IsFullPath(const char *PathA) // Unix ASCII version. } -bool ExtractUnixLink30(CommandData *Cmd,ComprDataIO &DataIO,Archive &Arc,const wchar *LinkName) +// For security purpose we prefer to be sure that CharToWide completed +// successfully and even if it truncated a string for some reason, +// it didn't affect the number of path related characters we analyze +// in IsRelativeSymlinkSafe later. +// This check is likely to be excessive, but let's keep it anyway. +static bool SafeCharToWide(const char *Src,wchar *Dest,size_t DestSize) +{ + if (!CharToWide(Src,Dest,DestSize) || *Dest==0) + return false; + uint SrcChars=0,DestChars=0; + for (uint I=0;Src[I]!=0;I++) + if (Src[I]=='/' || Src[I]=='.') + SrcChars++; + for (uint I=0;Dest[I]!=0;I++) + if (Dest[I]=='/' || Dest[I]=='.') + DestChars++; + return SrcChars==DestChars; +} + + +static bool ExtractUnixLink30(CommandData *Cmd,ComprDataIO &DataIO,Archive &Arc, + const wchar *LinkName,bool &UpLink) { char Target[NM]; if (IsLink(Arc.FileHead.FileAttr)) @@ -72,21 +93,22 @@ bool ExtractUnixLink30(CommandData *Cmd,ComprDataIO &DataIO,Archive &Arc,const w return true; wchar TargetW[NM]; - CharToWide(Target,TargetW,ASIZE(TargetW)); - // Check for *TargetW==0 to catch CharToWide failure. + if (!SafeCharToWide(Target,TargetW,ASIZE(TargetW))) + return false; // Use Arc.FileHead.FileName instead of LinkName, since LinkName // can include the destination path as a prefix, which can // confuse IsRelativeSymlinkSafe algorithm. - if (!Cmd->AbsoluteLinks && (*TargetW==0 || IsFullPath(TargetW) || + if (!Cmd->AbsoluteLinks && (IsFullPath(TargetW) || !IsRelativeSymlinkSafe(Cmd,Arc.FileHead.FileName,LinkName,TargetW))) return false; + UpLink=strstr(Target,"..")!=NULL; return UnixSymlink(Cmd,Target,LinkName,&Arc.FileHead.mtime,&Arc.FileHead.atime); } return false; } -bool ExtractUnixLink50(CommandData *Cmd,const wchar *Name,FileHeader *hd) +static bool ExtractUnixLink50(CommandData *Cmd,const wchar *Name,FileHeader *hd) { char Target[NM]; WideToChar(hd->RedirName,Target,ASIZE(Target)); @@ -100,11 +122,15 @@ bool ExtractUnixLink50(CommandData *Cmd,const wchar *Name,FileHeader *hd) return false; DosSlashToUnix(Target,Target,ASIZE(Target)); } + + wchar TargetW[NM]; + if (!SafeCharToWide(Target,TargetW,ASIZE(TargetW))) + return false; // Use hd->FileName instead of LinkName, since LinkName can include // the destination path as a prefix, which can confuse // IsRelativeSymlinkSafe algorithm. - if (!Cmd->AbsoluteLinks && (IsFullPath(Target) || - !IsRelativeSymlinkSafe(Cmd,hd->FileName,Name,hd->RedirName))) + if (!Cmd->AbsoluteLinks && (IsFullPath(TargetW) || + !IsRelativeSymlinkSafe(Cmd,hd->FileName,Name,TargetW))) return false; return UnixSymlink(Cmd,Target,Name,&hd->mtime,&hd->atime); } diff --git a/deps/unrar/unicode.cpp b/deps/unrar/unicode.cpp index 641f6c892..73b09bb22 100644 --- a/deps/unrar/unicode.cpp +++ b/deps/unrar/unicode.cpp @@ -229,10 +229,11 @@ void CharToWideMap(const char *Src,wchar *Dest,size_t DestSize,bool &Success) #endif -// SrcSize is in wide characters, not in bytes. -byte* WideToRaw(const wchar *Src,byte *Dest,size_t SrcSize) +// SrcSize is source data size in wide characters, not in bytes. +// DestSize is the maximum allowed destination size. +byte* WideToRaw(const wchar *Src,size_t SrcSize,byte *Dest,size_t DestSize) { - for (size_t I=0;I>8); @@ -601,59 +602,6 @@ char* SupportDBCS::charnext(const char *s) // to break string processing loops. return (char *)(IsLeadByte[(byte)*s] && s[1]!=0 ? s+2:s+1); } - - -size_t SupportDBCS::strlend(const char *s) -{ - size_t Length=0; - while (*s!=0) - { - if (IsLeadByte[(byte)*s]) - s+=2; - else - s++; - Length++; - } - return(Length); -} - - -char* SupportDBCS::strchrd(const char *s, int c) -{ - while (*s!=0) - if (IsLeadByte[(byte)*s]) - s+=2; - else - if (*s==c) - return((char *)s); - else - s++; - return(NULL); -} - - -void SupportDBCS::copychrd(char *dest,const char *src) -{ - dest[0]=src[0]; - if (IsLeadByte[(byte)src[0]]) - dest[1]=src[1]; -} - - -char* SupportDBCS::strrchrd(const char *s, int c) -{ - const char *found=NULL; - while (*s!=0) - if (IsLeadByte[(byte)*s]) - s+=2; - else - { - if (*s==c) - found=s; - s++; - } - return((char *)found); -} #endif diff --git a/deps/unrar/unicode.hpp b/deps/unrar/unicode.hpp index 031ac09ab..9bfd9c5dc 100644 --- a/deps/unrar/unicode.hpp +++ b/deps/unrar/unicode.hpp @@ -7,7 +7,7 @@ bool WideToChar(const wchar *Src,char *Dest,size_t DestSize); bool CharToWide(const char *Src,wchar *Dest,size_t DestSize); -byte* WideToRaw(const wchar *Src,byte *Dest,size_t SrcSize); +byte* WideToRaw(const wchar *Src,size_t SrcSize,byte *Dest,size_t DestSize); wchar* RawToWide(const byte *Src,wchar *Dest,size_t DestSize); void WideToUtf(const wchar *Src,char *Dest,size_t DestSize); size_t WideToUtfSize(const wchar *Src); @@ -33,34 +33,19 @@ class SupportDBCS public: SupportDBCS(); void Init(); - char* charnext(const char *s); - size_t strlend(const char *s); - char *strchrd(const char *s, int c); - char *strrchrd(const char *s, int c); - void copychrd(char *dest,const char *src); bool IsLeadByte[256]; bool DBCSMode; }; - extern SupportDBCS gdbcs; inline char* charnext(const char *s) {return (char *)(gdbcs.DBCSMode ? gdbcs.charnext(s):s+1);} -inline size_t strlend(const char *s) {return (uint)(gdbcs.DBCSMode ? gdbcs.strlend(s):strlen(s));} -inline char* strchrd(const char *s, int c) {return (char *)(gdbcs.DBCSMode ? gdbcs.strchrd(s,c):strchr(s,c));} -inline char* strrchrd(const char *s, int c) {return (char *)(gdbcs.DBCSMode ? gdbcs.strrchrd(s,c):strrchr(s,c));} -inline void copychrd(char *dest,const char *src) {if (gdbcs.DBCSMode) gdbcs.copychrd(dest,src); else *dest=*src;} -inline bool IsDBCSMode() {return(gdbcs.DBCSMode);} -inline void InitDBCS() {gdbcs.Init();} +inline bool IsDBCSMode() {return gdbcs.DBCSMode;} #else #define charnext(s) ((s)+1) -#define strlend strlen -#define strchrd strchr -#define strrchrd strrchr -#define IsDBCSMode() (true) -inline void copychrd(char *dest,const char *src) {*dest=*src;} +#define IsDBCSMode() (false) #endif diff --git a/deps/unrar/unpack.cpp b/deps/unrar/unpack.cpp index 5f577d85d..1597505ea 100644 --- a/deps/unrar/unpack.cpp +++ b/deps/unrar/unpack.cpp @@ -16,7 +16,7 @@ #include "unpack50frag.cpp" Unpack::Unpack(ComprDataIO *DataIO) -:Inp(false),VMCodeInp(false) +:Inp(true),VMCodeInp(true) { UnpIO=DataIO; Window=NULL; @@ -49,8 +49,8 @@ Unpack::~Unpack() { InitFilters30(false); - //if (Window!=NULL) - // free(Window); + if (Window!=NULL) + free(Window); #ifdef RAR_SMP delete UnpThreadPool; delete[] ReadBufMT; @@ -117,7 +117,7 @@ void Unpack::Init(size_t WinSize,bool Solid) if (Grow && Fragmented) throw std::bad_alloc(); - byte *NewWindow=Fragmented ? NULL : (byte *)hcwin; + byte *NewWindow=Fragmented ? NULL : (byte *)malloc(WinSize); if (NewWindow==NULL) if (Grow || WinSize<0x1000000) @@ -130,7 +130,7 @@ void Unpack::Init(size_t WinSize,bool Solid) { if (Window!=NULL) // If allocated by preceding files. { - //free(Window); + free(Window); Window=NULL; } FragWindow.Init(WinSize); @@ -141,7 +141,7 @@ void Unpack::Init(size_t WinSize,bool Solid) { // Clean the window to generate the same output when unpacking corrupt // RAR files, which may access unused areas of sliding dictionary. - //memset(NewWindow,0,WinSize); + memset(NewWindow,0,WinSize); // If Window is not NULL, it means that window size has grown. // In solid streams we need to copy data to a new window in such case. @@ -151,8 +151,8 @@ void Unpack::Init(size_t WinSize,bool Solid) for (size_t I=1;I<=MaxWinSize;I++) NewWindow[(UnpPtr-I)&(WinSize-1)]=Window[(UnpPtr-I)&(MaxWinSize-1)]; - //if (Window!=NULL) - // free(Window); + if (Window!=NULL) + free(Window); Window=NewWindow; } @@ -324,7 +324,7 @@ void Unpack::MakeDecodeTables(byte *LengthTable,DecodeTable *Dec,uint Size) Dec->QuickBits=MAX_QUICK_DECODE_BITS; break; default: - Dec->QuickBits=MAX_QUICK_DECODE_BITS-3; + Dec->QuickBits=MAX_QUICK_DECODE_BITS>3 ? MAX_QUICK_DECODE_BITS-3 : 0; break; } diff --git a/deps/unrar/unpack.hpp b/deps/unrar/unpack.hpp index f76ddcc86..3e23cd320 100644 --- a/deps/unrar/unpack.hpp +++ b/deps/unrar/unpack.hpp @@ -23,8 +23,8 @@ // allocation. Must be equal or larger than MAX_ANALYZE_SIZE. #define MAX_FILTER_BLOCK_SIZE 0x400000 -// Write data in 4 MB or smaller blocks. Must not exceed PACK_MAX_WRITE, -// so we keep a number of buffered filters in unpacker reasonable. +// Write data in 4 MB or smaller blocks. Must not exceed PACK_MAX_READ, +// so we keep the number of buffered filters in unpacker reasonable. #define UNPACK_MAX_WRITE 0x400000 // Decode compressed bit fields to alphabet numbers. @@ -93,17 +93,17 @@ struct UnpackBlockTables #ifdef RAR_SMP enum UNP_DEC_TYPE { - UNPDT_LITERAL,UNPDT_MATCH,UNPDT_FULLREP,UNPDT_REP,UNPDT_FILTER + UNPDT_LITERAL=0,UNPDT_MATCH,UNPDT_FULLREP,UNPDT_REP,UNPDT_FILTER }; struct UnpackDecodedItem { - UNP_DEC_TYPE Type; + byte Type; // 'byte' instead of enum type to reduce memory use. ushort Length; union { uint Distance; - byte Literal[4]; + byte Literal[8]; // Store up to 8 chars here to speed up extraction. }; }; diff --git a/deps/unrar/unpack30.cpp b/deps/unrar/unpack30.cpp index 346bcf970..7c2adfab2 100644 --- a/deps/unrar/unpack30.cpp +++ b/deps/unrar/unpack30.cpp @@ -55,7 +55,7 @@ void Unpack::Unpack29(bool Solid) if (!UnpReadBuf30()) break; } - if (((WrPtr-UnpPtr) & MaxWinMask)<260 && WrPtr!=UnpPtr) + if (((WrPtr-UnpPtr) & MaxWinMask)<=MAX3_INC_LZ_MATCH && WrPtr!=UnpPtr) { UnpWriteBuf30(); if (WrittenFileSize>DestUnpSize) @@ -637,7 +637,7 @@ bool Unpack::ReadTables30() if (BitField & 0x8000) { UnpBlockType=BLOCK_PPM; - return(PPM.DecodeInit(this,PPMEscChar,hcppm)); + return(PPM.DecodeInit(this,PPMEscChar)); } UnpBlockType=BLOCK_LZ; diff --git a/deps/unrar/unpack50.cpp b/deps/unrar/unpack50.cpp index 99119507f..e040907c2 100644 --- a/deps/unrar/unpack50.cpp +++ b/deps/unrar/unpack50.cpp @@ -42,7 +42,7 @@ void Unpack::Unpack5(bool Solid) break; } - if (((WriteBorder-UnpPtr) & MaxWinMask)DestUnpSize) @@ -93,7 +93,7 @@ void Unpack::Unpack5(bool Solid) } else { - Distance+=Inp.getbits32()>>(32-DBits); + Distance+=Inp.getbits()>>(16-DBits); Inp.addbits(DBits); } } diff --git a/deps/unrar/unpack50mt.cpp b/deps/unrar/unpack50mt.cpp index 691ac8e99..82c9c4a8c 100644 --- a/deps/unrar/unpack50mt.cpp +++ b/deps/unrar/unpack50mt.cpp @@ -345,7 +345,7 @@ void Unpack::UnpackDecode(UnpackThreadData &D) if (D.DecodedSize>1) { UnpackDecodedItem *PrevItem=CurItem-1; - if (PrevItem->Type==UNPDT_LITERAL && PrevItem->Length<3) + if (PrevItem->Type==UNPDT_LITERAL && PrevItem->LengthLiteral)-1) { PrevItem->Length++; PrevItem->Literal[PrevItem->Length]=(byte)MainSlot; @@ -388,7 +388,7 @@ void Unpack::UnpackDecode(UnpackThreadData &D) } else { - Distance+=D.Inp.getbits32()>>(32-DBits); + Distance+=D.Inp.getbits()>>(16-DBits); D.Inp.addbits(DBits); } } @@ -451,7 +451,7 @@ bool Unpack::ProcessDecoded(UnpackThreadData &D) while (ItemDestUnpSize) @@ -461,10 +461,10 @@ bool Unpack::ProcessDecoded(UnpackThreadData &D) if (Item->Type==UNPDT_LITERAL) { #if defined(LITTLE_ENDIAN) && defined(ALLOW_MISALIGNED) - if (Item->Length==3 && UnpPtrLength==7 && UnpPtrLiteral; - UnpPtr+=4; + *(uint64 *)(Window+UnpPtr)=*(uint64 *)(Item->Literal); + UnpPtr+=8; } else #endif @@ -559,7 +559,7 @@ bool Unpack::UnpackLargeBlock(UnpackThreadData &D) break; } } - if (((WriteBorder-UnpPtr) & MaxWinMask)DestUnpSize) diff --git a/deps/unrar/version.hpp b/deps/unrar/version.hpp index 922c67ed8..9af752ed0 100644 --- a/deps/unrar/version.hpp +++ b/deps/unrar/version.hpp @@ -1,6 +1,6 @@ #define RARVER_MAJOR 6 -#define RARVER_MINOR 1 -#define RARVER_BETA 0 -#define RARVER_DAY 7 -#define RARVER_MONTH 4 -#define RARVER_YEAR 2021 +#define RARVER_MINOR 22 +#define RARVER_BETA 1 +#define RARVER_DAY 14 +#define RARVER_MONTH 5 +#define RARVER_YEAR 2023 diff --git a/deps/unrar/volume.cpp b/deps/unrar/volume.cpp index 001a9673a..4924d8d0e 100644 --- a/deps/unrar/volume.cpp +++ b/deps/unrar/volume.cpp @@ -1,15 +1,15 @@ #include "rar.hpp" #ifdef RARDLL -static bool DllVolChange(RAROptions *Cmd,wchar *NextName,size_t NameSize); -static bool DllVolNotify(RAROptions *Cmd,wchar *NextName); +static bool DllVolChange(CommandData *Cmd,wchar *NextName,size_t NameSize); +static bool DllVolNotify(CommandData *Cmd,wchar *NextName); #endif bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName,wchar Command) { - RAROptions *Cmd=Arc.GetRAROptions(); + CommandData *Cmd=Arc.GetCommandData(); HEADER_TYPE HeaderType=Arc.GetHeaderType(); FileHeader *hd=HeaderType==HEAD_SERVICE ? &Arc.SubHead:&Arc.FileHead; @@ -25,10 +25,12 @@ bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName,wchar Comma uiMsg(UIERROR_CHECKSUMPACKED, Arc.FileName, hd->FileName); } + bool PrevVolEncrypted=Arc.Encrypted; + int64 PosBeforeClose=Arc.Tell(); if (DataIO!=NULL) - DataIO->ProcessedArcSize+=Arc.FileLength(); + DataIO->ProcessedArcSize+=DataIO->LastArcSize; Arc.Close(); @@ -40,12 +42,20 @@ bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName,wchar Comma #if !defined(SFX_MODULE) && !defined(RARDLL) bool RecoveryDone=false; #endif - bool FailedOpen=false,OldSchemeTested=false; + bool OldSchemeTested=false; + bool FailedOpen=false; // No more next volume open attempts if true. #if !defined(SILENT) // In -vp mode we force the pause before next volume even if it is present // and even if we are on the hard disk. It is important when user does not // want to process partially downloaded volumes preliminary. + // 2022.01.11: In WinRAR 6.10 beta versions we tried to ignore VolumePause + // if we could open the next volume with FMF_OPENEXCLUSIVE. But another + // developer asked us to return the previous behavior and always prompt + // for confirmation. They want to control when unrar continues, because + // the next file might not be fully decoded yet. They write chunks of data + // and then close the file again until the next chunk comes in. + if (Cmd->VolumePause && !uiAskNextVolume(NextName,ASIZE(NextName))) FailedOpen=true; #endif @@ -127,6 +137,16 @@ bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName,wchar Comma return false; #endif + if (Arc.Encrypted!=PrevVolEncrypted) + { + // There is no legitimate reason for encrypted header state to be + // changed in the middle of volume sequence. So we abort here to prevent + // replacing an encrypted header volume to unencrypted and adding + // unexpected files by third party to encrypted extraction. + uiMsg(UIERROR_BADARCHIVE,Arc.FileName); + ErrHandler.Exit(RARX_FATAL); + } + if (SplitHeader) Arc.SearchBlock(HeaderType); else @@ -151,10 +171,9 @@ bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName,wchar Comma DataIO->UnpVolume=hd->SplitAfter; DataIO->SetPackedSizeToRead(hd->PackSize); } -#ifdef SFX_MODULE - DataIO->UnpArcSize=Arc.FileLength(); -#endif - + + DataIO->AdjustTotalArcSize(&Arc); + // Reset the size of packed data read from current volume. It is used // to display the total progress and preceding volumes are already // compensated with ProcessedArcSize, so we need to reset this variable. @@ -171,14 +190,7 @@ bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName,wchar Comma #ifdef RARDLL -#if defined(RARDLL) && defined(_MSC_VER) && !defined(_WIN_64) -// Disable the run time stack check for unrar.dll, so we can manipulate -// with ChangeVolProc call type below. Run time check would intercept -// a wrong ESP before we restore it. -#pragma runtime_checks( "s", off ) -#endif - -bool DllVolChange(RAROptions *Cmd,wchar *NextName,size_t NameSize) +bool DllVolChange(CommandData *Cmd,wchar *NextName,size_t NameSize) { bool DllVolChanged=false,DllVolAborted=false; @@ -212,28 +224,7 @@ bool DllVolChange(RAROptions *Cmd,wchar *NextName,size_t NameSize) { char NextNameA[NM]; WideToChar(NextName,NextNameA,ASIZE(NextNameA)); - // Here we preserve ESP value. It is necessary for those developers, - // who still define ChangeVolProc callback as "C" type function, - // even though in year 2001 we announced in unrar.dll whatsnew.txt - // that it will be PASCAL type (for compatibility with Visual Basic). -#if defined(_MSC_VER) -#ifndef _WIN_64 - __asm mov ebx,esp -#endif -#elif defined(_WIN_ALL) && defined(__BORLANDC__) - _EBX=_ESP; -#endif int RetCode=Cmd->ChangeVolProc(NextNameA,RAR_VOL_ASK); - - // Restore ESP after ChangeVolProc with wrongly defined calling - // convention broken it. -#if defined(_MSC_VER) -#ifndef _WIN_64 - __asm mov esp,ebx -#endif -#elif defined(_WIN_ALL) && defined(__BORLANDC__) - _ESP=_EBX; -#endif if (RetCode==0) DllVolAborted=true; else @@ -255,7 +246,7 @@ bool DllVolChange(RAROptions *Cmd,wchar *NextName,size_t NameSize) #ifdef RARDLL -bool DllVolNotify(RAROptions *Cmd,wchar *NextName) +bool DllVolNotify(CommandData *Cmd,wchar *NextName) { char NextNameA[NM]; WideToChar(NextName,NextNameA,ASIZE(NextNameA)); @@ -268,21 +259,10 @@ bool DllVolNotify(RAROptions *Cmd,wchar *NextName) } if (Cmd->ChangeVolProc!=NULL) { -#if defined(_WIN_ALL) && !defined(_MSC_VER) && !defined(__MINGW32__) - _EBX=_ESP; -#endif int RetCode=Cmd->ChangeVolProc(NextNameA,RAR_VOL_NOTIFY); -#if defined(_WIN_ALL) && !defined(_MSC_VER) && !defined(__MINGW32__) - _ESP=_EBX; -#endif if (RetCode==0) return false; } return true; } - -#if defined(RARDLL) && defined(_MSC_VER) && !defined(_WIN_64) -// Restore the run time stack check for unrar.dll. -#pragma runtime_checks( "s", restore ) -#endif #endif diff --git a/deps/unrar/volume.hpp b/deps/unrar/volume.hpp index 2d6a6d5c1..4ada10910 100644 --- a/deps/unrar/volume.hpp +++ b/deps/unrar/volume.hpp @@ -1,10 +1,7 @@ #ifndef _RAR_VOLUME_ #define _RAR_VOLUME_ -void SplitArchive(Archive &Arc,FileHeader *fh,int64 *HeaderPos, - ComprDataIO *DataIO); bool MergeArchive(Archive &Arc,ComprDataIO *DataIO,bool ShowFileName, wchar Command); -void SetVolWrite(Archive &Dest,int64 VolSize); #endif diff --git a/deps/unrar/win32stm.cpp b/deps/unrar/win32stm.cpp index eaa43be2d..048fd86b6 100644 --- a/deps/unrar/win32stm.cpp +++ b/deps/unrar/win32stm.cpp @@ -111,16 +111,23 @@ void ExtractStreams(Archive &Arc,const wchar *FileName,bool TestMode) wcsncatz(FullName,StreamName,ASIZE(FullName)); + FindData fd; - bool Found=FindFile::FastFind(FileName,&fd); + bool HostFound=FindFile::FastFind(FileName,&fd); if ((fd.FileAttr & FILE_ATTRIBUTE_READONLY)!=0) SetFileAttr(FileName,fd.FileAttr & ~FILE_ATTRIBUTE_READONLY); File CurFile; - if (CurFile.WCreate(FullName) && Arc.ReadSubData(NULL,&CurFile,false)) - CurFile.Close(); + + if (CurFile.WCreate(FullName)) + { + if (Arc.ReadSubData(NULL,&CurFile,false)) + CurFile.Close(); + } + + // Restoring original file timestamps. File HostFile; - if (Found && HostFile.Open(FileName,FMF_OPENSHARED|FMF_UPDATE)) + if (HostFound && HostFile.Open(FileName,FMF_OPENSHARED|FMF_UPDATE)) SetFileTime(HostFile.GetHandle(),&fd.ftCreationTime,&fd.ftLastAccessTime, &fd.ftLastWriteTime); diff --git a/deps/zlib/contrib/minizip/mztools.c b/deps/zlib/contrib/minizip/mztools.c index 96891c2e0..5808aac95 100644 --- a/deps/zlib/contrib/minizip/mztools.c +++ b/deps/zlib/contrib/minizip/mztools.c @@ -38,7 +38,7 @@ uLong* bytesRecovered; FILE* fpZip = fopen(file, "rb"); FILE* fpOut = fopen(fileOut, "wb"); FILE* fpOutCD = fopen(fileOutTmp, "wb"); - if (fpZip != NULL && fpOut != NULL) { + if (fpZip != NULL && fpOut != NULL && fpOutCD !=NULL) { int entries = 0; uLong totalBytes = 0; char header[30]; diff --git a/deps/zlib/examples/gzlog.c b/deps/zlib/examples/gzlog.c index b8c29274e..d830ddf04 100644 --- a/deps/zlib/examples/gzlog.c +++ b/deps/zlib/examples/gzlog.c @@ -757,12 +757,15 @@ local int log_recover(struct log *log, int op) } if ((fd = open(log->path, O_RDONLY, 0)) < 0) { log_log(log, op, ".add file read failure"); + if (data != NULL) + free(data); return -1; } ret = (size_t)read(fd, data, len) != len; close(fd); if (ret) { log_log(log, op, ".add file read failure"); + return -1; } log_log(log, op, "loaded .add file"); diff --git a/docs/changes.txt b/docs/changes.txt index 9dbe1a5f1..283e3c0d4 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -5,14 +5,19 @@ ## - Added hash-mode: 1Password, mobilekeychain (1Password 8) +- Added hash-mode: Adobe AEM (SSPR, SHA-256 with Salt) +- Added hash-mode: Adobe AEM (SSPR, SHA-512 with Salt) - Added hash-mode: Anope IRC Services (enc_sha256) - Added hash-mode: Bisq .wallet (scrypt) - Added hash-mode: Bitcoin raw private key (P2PKH) - Added hash-mode: Bitcoin raw private key (P2SH(P2WPKH)) - Added hash-mode: Bitcoin raw private key (P2WPKH, Bech32) - Added hash-mode: BLAKE2s-256 +- Added hash-mode: CubeCart (Whirlpool($salt.$pass.$salt) - Added hash-mode: Dahua NVR/DVR/HVR (md5($salt1.strtoupper(md5($salt2.$pass)))) - Added hash-mode: DANE RFC7929/RFC8162 SHA2-256 +- Added hash-mode: Dogechain.info Wallet +- Added hash-mode: Empire CMS (Admin password) - Added hash-mode: ENCsecurity Datavault (MD5/keychain) - Added hash-mode: ENCsecurity Datavault (MD5/no keychain) - Added hash-mode: ENCsecurity Datavault (PBKDF2/keychain) @@ -20,16 +25,36 @@ - Added hash-mode: GPG (AES-128/AES-256 (SHA-1($pass))) - Added hash-mode: GPG (AES-128/AES-256 (SHA-256($pass))) - Added hash-mode: GPG (AES-128/AES-256 (SHA-512($pass))) +- Added hash-mode: GPG (CAST5 (SHA-1($pass))) +- Added hash-mode: Kerberos 5, etype 17, AS-REP +- Added hash-mode: Kerberos 5, etype 18, AS-REP - Added hash-mode: MetaMask Mobile Wallet - Added hash-mode: MetaMask Wallet (short hash, plaintext check) +- Added hash-mode: NetIQ SSPR (MD5) +- Added hash-mode: NetIQ SSPR (PBKDF2WithHmacSHA1) +- Added hash-mode: NetIQ SSPR (PBKDF2WithHmacSHA256) +- Added hash-mode: NetIQ SSPR (PBKDF2WithHmacSHA512) +- Added hash-mode: NetIQ SSPR (SHA1) +- Added hash-mode: NetIQ SSPR (SHA-1 with Salt) +- Added hash-mode: NetIQ SSPR (SHA-256 with Salt) +- Added hash-mode: NetIQ SSPR (SHA-512 with Salt) +- Added hash-mode: RSA Security Analytics / NetWitness (sha256) - Added hash-mode: SecureCRT MasterPassphrase v2 - Added hash-mode: Veeam VB - Added hash-mode: bcrypt(sha256($pass)) - Added hash-mode: HMAC-RIPEMD160 (key = $pass) - Added hash-mode: HMAC-RIPEMD160 (key = $salt) +- Added hash-mode: md5($salt1.sha1($salt2.$pass)) +- Added hash-mode: md5(md5($pass.$salt)) - Added hash-mode: md5(md5($salt).md5(md5($pass))) +- Added hash-mode: Domain Cached Credentials 2 (DCC2), MS Cache 2, (NT) +- Added hash-mode: Domain Cached Credentials (DCC), MS Cache (NT) - Added hash-mode: md5(md5(md5($pass).$salt1).$salt2) - Added hash-mode: md5(md5(md5($pass)).$salt) +- Added hash-mode: md5(sha1($pass.$salt)) +- Added hash-mode: md5(sha1($salt.$pass)) +- Added hash-mode: sha512(sha512($pass).$salt) +- Added hash-mode: sha512(sha512_bin($pass).$salt) ## ## Features @@ -47,42 +72,52 @@ ## Bugs ## -- Fixed keys extraction in luks2hashcat - now extracts all active keys -- Prevent Hashcat from hanging by checking during startup whether the output file is a named pipe -- Fixed debug mode 5 by adding the missing colon between original-word and finding-rule -- Skip chained generated rules that exceed the maximum number of function calls -- Fixed incorrect plaintext check for 25400 and 26610. Increased plaintext check to 32 bytes to prevent false positives. -- Fixed bug in --stdout that caused certain rules to malfunction +- Added verification of token buffer length when using TOKEN_ATTR_FIXED_LENGTH +- Fixed a bug in all SCRYPT-based hash modes with Apple Metal +- Fixed buffer overflow on module_26600.c / module_hash_encode() - Fixed bug in 18400 module_hash_encode +- Fixed bug in 23800/unrar with Apple Silicon - Fixed bug in 26900 module_hash_encode - Fixed bug in 29600 module OPTS_TYPE setting - Fixed bug in grep out-of-memory workaround on Unit Test - Fixed bug in input_tokenizer when TOKEN_ATTR_FIXED_LENGTH is used and refactor modules -- Added verification of token buffer length when using TOKEN_ATTR_FIXED_LENGTH -- Fixed build failed for 4410 with vector width > 1 +- Fixed bug in --stdout that caused certain rules to malfunction +- Fixed build failed for 10700 optimized with Apple Metal +- Fixed build failed for 13772 and 13773 with Apple Metal - Fixed build failed for 18400 with Apple Metal - Fixed build failed for 18600 with Apple Metal -- Fixed build failed for 31700 with Apple Metal -- Fixed build failed for 31300 with vector width > 1 -- Fixed build failed for 31000/Blake2s with vector width > 1 +- Fixed build failed for 4410 with vector width > 1 +- Fixed build failure for almost all hash modes that make use of hc_swap64 and/or hc_swap64_S with Apple Metal +- Fixed debug mode 5 by adding the missing colon between original-word and finding-rule - Fixed display problem of the "Optimizers applied" list for algorithms using OPTI_TYPE_SLOW_HASH_SIMD_INIT2 and/or OPTI_TYPE_SLOW_HASH_SIMD_LOOP2 -- Fixed incompatible pointer types (salt1 and salt2 buf) in 31700 a3 kernel - Fixed incompatible pointer types (salt1 and salt2 buf) in 3730 a3 kernel +- Fixed incorrect plaintext check for 25400 and 26610. Increased plaintext check to 32 bytes to prevent false positives. +- Fixed keys extraction in luks2hashcat - now extracts all active keys +- Fixed maximum password length in module/test_module of hash-mode 2400 +- Fixed maximum password length in module/test_module of hash-mode 2410 - Fixed minimum password length in module of hash-mode 28200 -- Handle signed/unsigned PDF permission P value for all PDF hash-modes - Fixed minimum password length in module of hash-mode 29800 -- Fixed buffer overflow on module_26600.c / module_hash_encode() +- Fixed out-of-boundary read when a fast hash defines a kernel_loops_min value higher than the amplifiers provided by the user +- Fixed vector datatypes usage for HIP +- Fix missing check for -j and -k before writing hashcat.dictstat2 which can lead to false negatives +- Handle signed/unsigned PDF permission P value for all PDF hash-modes +- Prevent Hashcat from hanging by checking during startup whether the output file is a named pipe +- Skip chained generated rules that exceed the maximum number of function calls ## ## Technical ## -- AMD Driver: Updated requirements for AMD Windows drivers to "AMD Adrenalin Edition" (Adrenalin 22.5.1 exactly) +- AMD Driver: Updated requirements for AMD Windows drivers to "AMD Adrenalin Edition" (23.7.2 or later) and "AMD HIP SDK" (23.Q3 or later) - Apple Driver: Automatically enable GPU support on Apple OpenCL instead of CPU support - Apple Driver: Updated requirements to use Apple OpenCL API to macOS 13.0 - use - Backend Checks: Describe workaround in error message when detecting more than 64 backend devices - Brain: Added sanity check and corresponding error message for invalid --brain-port values +- Dependencies: Updated LZMA SDK to 22.01 +- Dependencies: Updated unrar source to 6.2.7 +- Building: Support building windows binaries on macOS using MinGW - Dependencies: Updated OpenCL-Headers to v2023.04.17 +- Documents: Updated BUILD.md and added BUILD_macOS.md (containing instructions for building windows binaries on macOS) - Modules: Added support for non-zero IVs for -m 6800 (Lastpass). Also added `tools/lastpass2hashcat.py` - Open Document Format: Added support for small documents with content length < 1024 - Status Code: Add specific return code for self-test fail (-11) @@ -92,10 +127,13 @@ - MetaMask: update extraction tool to support MetaMask Mobile wallets - SecureCRT MasterPassphrase v2: update module, pure kernels and test unit. Add optimized kernels. - Metal Backend: added workaround to prevent 'Infinite Loop' bug when build kernels +- Metal Backend: allow use of devices with Metal if runtime version is >= 200 +- Metal Backend: disable Metal devices only if at least one OpenCL device is active - User Options: added --metal-compiler-runtime option - Hardware Monitor: avoid sprintf in src/ext_iokit.c - Help: show supported hash-modes only with -hh -- Unit tests: add test modules for hash-modes 31500 and 31600 and handle them in tools/test.pl +- Makefile: prevent make failure with Apple Silicon in case of partial rebuild +- Rules: Rename best64.rule to best66.rule and remove the unknown section from it * changes v6.2.5 -> v6.2.6 @@ -194,7 +232,7 @@ - Hardware Monitor: Add support for GPU device utilization readings using iokit on Apple Silicon (OpenCL and Metal) - Hash Info: show more information (Updated Hash-Format. Added Autodetect, Self-Test, Potfile and Plaintext encoding) - HIP Backend: moved functions to ext_hip.c/ext_hiprtc.c and includes to ext_hip.h/ext_hiprtc.h -- HIP Backend: removed unused functions from hiprtc to workaroung missing function symbols on windows dll +- HIP Backend: removed unused functions from hiprtc to workaround missing function symbols on windows dll - Kernels: Refactored standard kernel declaration to use a structure holding u32/u64 attributes to reduce the number of attributes - Kernels: Refactored standard kernel includes, KERN_ATTR macros and RC4 cipher functions, in order to support Apple Metal runtime - Kernels: Set the default Address Space Qualifier for any pointer, in order to support Apple Metal runtime @@ -220,7 +258,7 @@ - Rules: Add support to include source wordlist in debugging format - Rules: Update hand-written rulesets to covers years up to 2029 - Status code: updated negative status code (added kernel create failure and resync) -- Status code: updated negative status code, usefull in Unit tests engine (test.sh) +- Status code: updated negative status code, useful in Unit tests engine (test.sh) - Terminal: Increased size of hash name column in `--help` and `--identify` options - Terminal: Limit output length of example hash in --example-hash mode to 200. Use --mach to see full example hash - Terminal: show empty OpenCL platforms only in backend information mode @@ -632,7 +670,7 @@ - Building: Fixed build warnings on macOS for unrar sources - Building: Fixed test for DARWIN_VERSION in Makefile - Commandline Options: Removed option --example-hashes, now an alias of --hash-info -- Compute API: Skipping devices instead of stop if error occured in initialization +- Compute API: Skipping devices instead of stop if error occurred in initialization - Documentation: Added 3rd party licenses to docs/license_libs - Hash-Mode 8900 (Scrypt): Changed default benchmark scrypt parameters from 1k:1:1 to 16k:8:1 (default) - Hash-Mode 11600 (7-Zip): Improved memory handling (alloc and free) for the hook function @@ -698,7 +736,7 @@ - Hcchr Files: Renamed some .charset files into .hcchr files - Hash-Mode 21200 (md5(sha1($salt).md5($pass))): Improved speed by using pre-computed SHA1 - OpenCL Devices: Utilize PCI domain to improve alias device detection -- OpenCL Kernels: Added datatypes to literals of enum costants +- OpenCL Kernels: Added datatypes to literals of enum constants - OpenCL Kernels: Added pure kernels for hash-mode 600 (BLAKE2b-512) - OpenCL Runtime: Add some unstable warnings for some SHA512 based algorithms on AMD GPU on macOS - OpenCL Runtime: Reinterpret return code CL_DEVICE_NOT_FOUND from clGetDeviceIDs() as non-fatal @@ -831,7 +869,7 @@ - Bitcoin Wallet: Be more user friendly by allowing a larger data range for ckey and public_key - Brain: Added new parameter --brain-server-timer to specify seconds between scheduled backups -- Building: Fix for library compilation failure due to multiple defenition of sbob_xx64() +- Building: Fix for library compilation failure due to multiple definition of sbob_xx64() - Cracking bcrypt and Password Safe v2: Use feedback from the compute API backend to dynamically calculate optimal thread count - Dictstat: On Windows, the st_ino attribute in the stat struct is not set, which can lead to invalid cache hits. Added the filename to the database entry. - Documents: Added README on how to build hashcat on Cygwin, MSYS2 and WSL @@ -869,7 +907,7 @@ ## Technical ## -- Backend Interface: Added new options --backend-ignore-cuda and --backend-ingore-opencl to prevent CUDA and/or OpenCL API from being used +- Backend Interface: Added new options --backend-ignore-cuda and --backend-ignore-opencl to prevent CUDA and/or OpenCL API from being used - Binary Distribution: Removed 32-bit binary executables - Building: On macOS, switch from ar to /usr/bin/ar to improve building compatibility - Building: Skipping Travis/Appveyor build for non-code changes @@ -1227,7 +1265,7 @@ - Added option --optimized-kernel-enable to use faster kernels but limit the maximum supported password- and salt-length - Added self-test functionality to detect broken OpenCL runtimes on startup - Added option --self-test-disable to disable self-test functionality on startup -- Added option --wordlist-autohex-disable to disable the automatical conversion of $HEX[] words from the word list +- Added option --wordlist-autohex-disable to disable the automatic conversion of $HEX[] words from the word list - Added option --example-hashes to show an example hash for each hash-mode - Removed option --weak-hash-check (zero-length password check) to increase startup time, it also causes many Trap 6 error on macOS @@ -1244,7 +1282,7 @@ - Fixed a buffer overflow in mangle_dupechar_last function - Fixed a calculation error in get_power() leading to errors of type "BUG pw_add()!!" -- Fixed a memory problem that occured when the OpenCL folder was not found and e.g. the shared and session folder were the same +- Fixed a memory problem that occurred when the OpenCL folder was not found and e.g. the shared and session folder were the same - Fixed a missing barrier() call in the RACF OpenCL kernel - Fixed a missing salt length value in benchmark mode for SIP - Fixed an integer overflow in hash buffer size calculation @@ -1429,7 +1467,7 @@ - Added support for filtering hccapx message pairs using --hccapx-message-pair - Added support for parsing 7-Zip hashes with LZMA/LZMA2 compression indicator set to a non-zero value - Added support for decompressing LZMA1/LZMA2 data for -m 11600 = 7-Zip to validate the CRC -- Added support for automatic merge of LM halfes in case --show and --left is used +- Added support for automatic merge of LM halves in case --show and --left is used - Added support for showing all user names with --show and --left if --username was specified - Added support for GPU temperature management on cygwin build @@ -1504,7 +1542,7 @@ - Hardware Management: Bring back kernel exec timeout detection for NVidia on user request - Hardware Monitor: Fixed several memory leaks in case hash-file writing (caused by --remove) failed - Hardware Monitor: Fixed several memory leaks in case no hardware monitor sensor is found -- Hardware Monitor: In case NVML initialization failed, do not try to initialiaze NVAPI or XNVCTRL because they both depend on NVML +- Hardware Monitor: In case NVML initialization failed, do not try to initialize NVAPI or XNVCTRL because they both depend on NVML - Hash Parsing: Added additional bound checks for the SIP digest authentication (MD5) parser (-m 11400) - Hash Parsing: Make sure that all files are correctly closed whenever a hash file parsing error occurs - Helper: Added functions to check existence, type, read- and write-permissions and rewrite sources to use them instead of stat() @@ -1541,7 +1579,7 @@ ## Features ## -- Files: Use $HEX[...] in case the password includes the separater character, increases potfile reading performance +- Files: Use $HEX[...] in case the password includes the separator character, increases potfile reading performance - Files: If the user specifies a folder to scan for wordlists instead of directly a wordlist, then ignore the hidden files - Loopback: Include passwords for removed hashes present in the potfile to next loopback iteration - New option --progress-only: Quickly provides ideal progress step size and time to process on the user hashes and selected options, then quit @@ -1648,9 +1686,9 @@ The CLI (hashcat.bin or hashcat.exe) works as before but from a technical perspe ## Bugs ## -- Custom charset from file parsing code did not return an error if an error occured +- Custom charset from file parsing code did not return an error if an error occurred - Fix some clSetKernelArg() size error that caused slow modes to not work anymore in -a 1 mode -- Hash-mode 11600 = (7-Zip): Depending on input hash a clEnqueueReadBuffer(): CL_INVALID_VALUE error occured +- Hash-mode 11600 = (7-Zip): Depending on input hash a clEnqueueReadBuffer(): CL_INVALID_VALUE error occurred - Hash-mode 22 = Juniper Netscreen/SSG (ScreenOS): Fix salt length for -m 22 in benchmark mode - Hash-Mode 5500 = NetNTLMv1 + ESS: Fix loading of NetNTLMv1 + SSP hash - Hash-mode 6000 = RipeMD160: Fix typo in array index number @@ -1723,12 +1761,12 @@ The CLI (hashcat.bin or hashcat.exe) works as before but from a technical perspe - Error handling (startup): Added some missing returncode checks to get_exec_path() - Fanspeed: Check both fanpolicy and fanspeed returncode and disable retain support if any of them fail - Fanspeed: Minimum fanspeed for retain support increased to 33%, same as NV uses as default on windows -- Fanspeed: Reset PID controler settings to what they were initially +- Fanspeed: Reset PID controller settings to what they were initially - Fanspeed: Set fan speed to default on quit - File handling: Do a single write test (for files to be written later) directly on startup - File locking: Use same locking mechanism in potfile as in outfile - Hardware management: Fixed calling conventions for ADL, NvAPI and NVML on windows -- Hardware management: Improved checking for successfull load of the NVML API +- Hardware management: Improved checking for successful load of the NVML API - Hardware management: In case fanspeed can not be set, disable --gpu-temp-retain automatically - Hardware management: In case of initialization error show it only once to the user on startup - Hardware management: Refactored all code to return returncode (0 or -1) instead of data for more easy error handling @@ -1832,7 +1870,7 @@ The CLI (hashcat.bin or hashcat.exe) works as before but from a technical perspe * changes v2.01 -> v3.00: -This release markes the fusion of "hashcat" and "oclHashcat" into "hashcat". +This release marks the fusion of "hashcat" and "oclHashcat" into "hashcat". It combines all features of all hashcat projects in one project. ## @@ -1917,7 +1955,7 @@ It combines all features of all hashcat projects in one project. - Fixed a bug in line counter: conditional jump or move depends on an uninitialised value - Fixed a bug in rule-engine for NVidia devices: code for left- and right-shift were switched - Fixed a bug in dive.rule: rules were not updated after the function 'x' was renamed to 'O' -- Fixed a bug in memory allocation "OpenCL -4 error": used unitialized value in a special situation +- Fixed a bug in memory allocation "OpenCL -4 error": used uninitialized value in a special situation - Fixed a bug in memory handling: heap buffer overflow - Fixed a bug in memory handling: out of bounds access - Fixed a bug in implementation of DCC2: forced default iteration count for hashes to 10240 diff --git a/docs/hashcat-brain.md b/docs/hashcat-brain.md index ec2dc1e09..727a1fe04 100644 --- a/docs/hashcat-brain.md +++ b/docs/hashcat-brain.md @@ -203,7 +203,7 @@ Each password candidate creates a hash of 8 bytes that has to be transferred, lo So let's assume a candidate list size of 8,000,000,000. That doesn't sound like too much - especially if you want to work with rules and masks. It should be clear that using the hashcat brain against a raw MD5 is not very efficient. But now things become interesting, because of some unexpected effects that kick in. -Imagine you have a salted MD5 list, let's say VBULL which is a fast hash (not a slow hash) - and you have many of them. In thise case, each of the salts starts to work for us. +Imagine you have a salted MD5 list, let's say VBULL which is a fast hash (not a slow hash) - and you have many of them. In this case, each of the salts starts to work for us. Yes, you read that right - the more salts, the better!! diff --git a/docs/license_libs/OPENCL_HEADERS_LICENSE.txt b/docs/license_libs/OPENCL_HEADERS_LICENSE.txt index 020ce65fc..d64569567 100644 --- a/docs/license_libs/OPENCL_HEADERS_LICENSE.txt +++ b/docs/license_libs/OPENCL_HEADERS_LICENSE.txt @@ -1,25 +1,202 @@ -Copyright (c) 2008-2015 The Khronos Group Inc. -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and/or associated documentation files (the -"Materials"), to deal in the Materials without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Materials, and to -permit persons to whom the Materials are furnished to do so, subject to -the following conditions: + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Materials. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS -KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS -SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT - https://www.khronos.org/registry/ + 1. Definitions. -THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/docs/license_libs/XXHASH_LICENSE.txt b/docs/license_libs/XXHASH_LICENSE.txt index 7de801ed1..6bc30a1bc 100644 --- a/docs/license_libs/XXHASH_LICENSE.txt +++ b/docs/license_libs/XXHASH_LICENSE.txt @@ -1,7 +1,9 @@ xxHash Library -Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2012-2020 Yann Collet All rights reserved. +BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php) + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/docs/readme.txt b/docs/readme.txt index 7f2db3af1..e5fd69f25 100644 --- a/docs/readme.txt +++ b/docs/readme.txt @@ -11,7 +11,7 @@ hashcat v6.2.6 ============== AMD GPUs on Linux require "AMDGPU" (21.50 or later) and "ROCm" (5.0 or later) -AMD GPUs on Windows require "AMD Adrenalin Edition" (Adrenalin 22.5.1 exactly) +AMD GPUs on Windows require "AMD Adrenalin Edition" (23.7.2 or later) and "AMD HIP SDK" (23.Q3 or later) Intel CPUs require "OpenCL Runtime for Intel Core and Intel Xeon Processors" (16.1.1 or later) NVIDIA GPUs require "NVIDIA Driver" (440.64 or later) and "CUDA Toolkit" (9.0 or later) @@ -69,6 +69,7 @@ NVIDIA GPUs require "NVIDIA Driver" (440.64 or later) and "CUDA Toolkit" (9.0 or - Keccak-384 - Keccak-512 - Whirlpool +- CubeCart (Whirlpool($salt.$pass.$salt)) - SipHash - md5(utf16le($pass)) - sha1(utf16le($pass)) @@ -85,16 +86,20 @@ NVIDIA GPUs require "NVIDIA Driver" (440.64 or later) and "CUDA Toolkit" (9.0 or - md5($salt.md5($salt.$pass)) - md5($salt.sha1($salt.$pass)) - md5($salt.utf16le($pass)) +- md5($salt1.sha1($salt2.$pass)) - md5($salt1.strtoupper(md5($salt2.$pass))) - md5(md5($pass)) - md5(md5($pass).md5($salt)) +- md5(md5($pass.$salt)) - md5(md5(md5($pass))) - md5(md5(md5($pass)).$salt) - md5(md5(md5($pass).$salt1).$salt2) - md5(sha1($pass)) - md5(sha1($pass).$salt) - md5(sha1($pass).md5($pass).sha1($pass)) +- md5(sha1($pass.$salt)) - md5(sha1($salt).md5($pass)) +- md5(sha1($salt.$pass)) - md5(strtoupper(md5($pass))) - md5(utf16le($pass).$salt) - sha1($pass.$salt) @@ -102,6 +107,7 @@ NVIDIA GPUs require "NVIDIA Driver" (440.64 or later) and "CUDA Toolkit" (9.0 or - sha1($salt.$pass.$salt) - sha1($salt.sha1($pass)) - sha1($salt.sha1($pass.$salt)) +- sha1($salt.sha1(utf16le($username).':'.utf16le($pass))) - sha1($salt.utf16le($pass)) - sha1($salt1.$pass.$salt2) - sha1(CX) @@ -130,6 +136,8 @@ NVIDIA GPUs require "NVIDIA Driver" (440.64 or later) and "CUDA Toolkit" (9.0 or - sha512($pass.$salt) - sha512($salt.$pass) - sha512($salt.utf16le($pass)) +- sha512(sha512($pass).$salt) +- sha512(sha512_bin($pass).$salt) - sha512(utf16le($pass).$salt) - HMAC-MD5 (key = $pass) - HMAC-MD5 (key = $salt) @@ -193,9 +201,11 @@ NVIDIA GPUs require "NVIDIA Driver" (440.64 or later) and "CUDA Toolkit" (9.0 or - Kerberos 5, etype 17, TGS-REP - Kerberos 5, etype 17, Pre-Auth - Kerberos 5, etype 17, DB +- Kerberos 5, etype 17, AS-REP - Kerberos 5, etype 18, TGS-REP - Kerberos 5, etype 18, Pre-Auth - Kerberos 5, etype 18, DB +- Kerberos 5, etype 18, AS-REP - Kerberos 5, etype 23, AS-REQ Pre-Auth - Kerberos 5, etype 23, TGS-REP - Kerberos 5, etype 23, AS-REP @@ -248,7 +258,6 @@ NVIDIA GPUs require "NVIDIA Driver" (440.64 or later) and "CUDA Toolkit" (9.0 or - bcrypt $2*$, Blowfish (Unix) - md5crypt, MD5 (Unix), Cisco-IOS $1$ (MD5) - descrypt, DES (Unix), Traditional DES -- sha1($salt.sha1(utf16le($username).':'.utf16le($pass))) - sha256crypt $5$, SHA256 (Unix) - sha512crypt $6$, SHA512 (Unix) - SQLCipher @@ -288,8 +297,19 @@ NVIDIA GPUs require "NVIDIA Driver" (440.64 or later) and "CUDA Toolkit" (9.0 or - SAP CODVN F/G (PASSCODE) - SAP CODVN F/G (PASSCODE) from RFC_READ_TABLE - SAP CODVN H (PWDSALTEDHASH) iSSHA-1 +- RSA Security Analytics / NetWitness (sha256) +- Adobe AEM (SSPR, SHA-256 with Salt) +- Adobe AEM (SSPR, SHA-512 with Salt) - PeopleSoft - PeopleSoft PS_TOKEN +- NetIQ SSPR (MD5) +- NetIQ SSPR (PBKDF2WithHmacSHA1) +- NetIQ SSPR (PBKDF2WithHmacSHA256) +- NetIQ SSPR (PBKDF2WithHmacSHA512) +- NetIQ SSPR (SHA-1 with Salt) +- NetIQ SSPR (SHA-256 with Salt) +- NetIQ SSPR (SHA-512 with Salt) +- NetIQ SSPR (SHA1) - SolarWinds Orion - SolarWinds Orion v2 - SolarWinds Serv-U @@ -350,8 +370,7 @@ NVIDIA GPUs require "NVIDIA Driver" (440.64 or later) and "CUDA Toolkit" (9.0 or - Mozilla key4.db - Apple Keychain - 7-Zip -- RAR3-hp -- RAR3-p +- RAR3 - RAR5 - PKZIP - PKZIP Master Key @@ -375,6 +394,7 @@ NVIDIA GPUs require "NVIDIA Driver" (440.64 or later) and "CUDA Toolkit" (9.0 or - MediaWiki B type - Redmine - Umbraco HMAC-SHA1 +- Empire CMS (Admin password) - Joomla < 2.5.18 - OpenCart - PrestaShop @@ -408,6 +428,7 @@ NVIDIA GPUs require "NVIDIA Driver" (440.64 or later) and "CUDA Toolkit" (9.0 or - GPG (AES-128/AES-256 (SHA-1($pass))) - GPG (AES-128/AES-256 (SHA-512($pass))) - GPG (AES-128/AES-256 (SHA-256($pass))) +- GPG (CAST5 (SHA-1($pass))) - RSA/DSA/EC/OpenSSH Private Keys ($0$) - RSA/DSA/EC/OpenSSH Private Keys ($6$) - RSA/DSA/EC/OpenSSH Private Keys ($1, $3$) @@ -426,12 +447,18 @@ NVIDIA GPUs require "NVIDIA Driver" (440.64 or later) and "CUDA Toolkit" (9.0 or - MetaMask Wallet (short hash, plaintext check) - Bisq .wallet (scrypt) - BitShares v0.x - sha512(sha512_bin(pass)) -- Bitcoin WIF private key (P2PKH) -- Bitcoin WIF private key (P2WPKH, Bech32) -- Bitcoin WIF private key (P2SH(P2WPKH)) -- Bitcoin raw private key (P2PKH) -- Bitcoin raw private key (P2WPKH, Bech32) -- Bitcoin raw private key (P2SH(P2WPKH)) +- Bitcoin WIF private key (P2PKH), compressed +- Bitcoin WIF private key (P2PKH), uncompressed +- Bitcoin WIF private key (P2WPKH, Bech32), compressed +- Bitcoin WIF private key (P2WPKH, Bech32), uncompressed +- Bitcoin WIF private key (P2SH(P2WPKH)), compressed +- Bitcoin WIF private key (P2SH(P2WPKH)), uncompressed +- Bitcoin raw private key (P2PKH), compressed +- Bitcoin raw private key (P2PKH), uncompressed +- Bitcoin raw private key (P2WPKH, Bech32), compressed +- Bitcoin raw private key (P2WPKH, Bech32), uncompressed +- Bitcoin raw private key (P2SH(P2WPKH)), compressed +- Bitcoin raw private key (P2SH(P2WPKH)), uncompressed - Bitcoin/Litecoin wallet.dat - Electrum Wallet (Salt-Type 1-3) - Electrum Wallet (Salt-Type 4) @@ -439,6 +466,7 @@ NVIDIA GPUs require "NVIDIA Driver" (440.64 or later) and "CUDA Toolkit" (9.0 or - Blockchain, My Wallet - Blockchain, My Wallet, V2 - Blockchain, My Wallet, Second Password (SHA256) +- Dogechain.info Wallet - Stargazer Stellar Wallet XLM - Ethereum Pre-Sale Wallet, PBKDF2-HMAC-SHA256 - Ethereum Wallet, PBKDF2-HMAC-SHA256 diff --git a/example0.cmd b/example0.cmd index 38e05a590..08b223344 100644 --- a/example0.cmd +++ b/example0.cmd @@ -1,2 +1,2 @@ -hashcat.exe -m 0 -t 32 -a 7 example0.hash ?a?a?a?a example.dict -pause +hashcat.exe -m 0 -t 32 -a 7 example0.hash ?a?a?a?a example.dict +pause diff --git a/example400.cmd b/example400.cmd index 20421431d..88ffdc5f5 100644 --- a/example400.cmd +++ b/example400.cmd @@ -1,2 +1,2 @@ -type example.dict | hashcat.exe -m 400 example400.hash -pause +type example.dict | hashcat.exe -m 400 example400.hash +pause diff --git a/example500.cmd b/example500.cmd index 192027475..83a054687 100644 --- a/example500.cmd +++ b/example500.cmd @@ -1,2 +1,2 @@ -hashcat.exe -m 500 example500.hash example.dict -pause +hashcat.exe -m 500 example500.hash example.dict +pause diff --git a/extra/tab_completion/hashcat.sh b/extra/tab_completion/hashcat.sh old mode 100644 new mode 100755 index 7ad527905..f823cda72 --- a/extra/tab_completion/hashcat.sh +++ b/extra/tab_completion/hashcat.sh @@ -426,7 +426,7 @@ _hashcat () local BUILD_IN_CHARSETS='?l ?u ?d ?a ?b ?s ?h ?H' local SHORT_OPTS="-m -a -V -h -b -t -T -o -p -c -d -D -w -n -u -j -k -r -g -1 -2 -3 -4 -i -I -s -l -O -S -z -M -Y" - local LONG_OPTS="--hash-type --attack-mode --version --help --quiet --benchmark --benchmark-all --hex-salt --hex-wordlist --hex-charset --force --status --status-json --status-timer --stdin-timeout-abort --machine-readable --loopback --markov-hcstat2 --markov-disable --markov-inverse --markov-classic --markov-threshold --runtime --session --speed-only --progress-only --restore --restore-file-path --restore-disable --outfile --outfile-format --outfile-autohex-disable --outfile-check-timer --outfile-check-dir --wordlist-autohex-disable --separator --show --deprecated-check-disable --left --username --remove --remove-timer --potfile-disable --potfile-path --debug-mode --debug-file --induction-dir --segment-size --bitmap-min --bitmap-max --cpu-affinity --example-hashes --hash-info --backend-ignore-cuda --backend-ignore-opencl --backend-ignore-hip --backend-ignore-metal --backend-info --backend-devices --backend-devices-virtual --opencl-device-types --backend-vector-width --workload-profile --kernel-accel --kernel-loops --kernel-threads --spin-damp --hwmon-disable --hwmon-temp-abort --skip --limit --keyspace --rule-left --rule-right --rules-file --generate-rules --generate-rules-func-min --generate-rules-func-max --generate-rules-func-sel --generate-rules-seed --custom-charset1 --custom-charset2 --custom-charset3 --custom-charset4 --hook-threads --increment --increment-min --increment-max --logfile-disable --scrypt-tmto --keyboard-layout-mapping --truecrypt-keyfiles --veracrypt-keyfiles --veracrypt-pim-start --veracrypt-pim-stop --stdout --keep-guessing --hccapx-message-pair --nonce-error-corrections --encoding-from --encoding-to --optimized-kernel-enable --multiply-accel-disable --self-test-disable --slow-candidates --brain-server --brain-server-timer --brain-client --brain-client-features --brain-host --brain-port --brain-session --brain-session-whitelist --brain-password --identify" + local LONG_OPTS="--hash-type --attack-mode --version --help --quiet --benchmark --benchmark-all --hex-salt --hex-wordlist --hex-charset --force --status --status-json --status-timer --stdin-timeout-abort --machine-readable --loopback --markov-hcstat2 --markov-disable --markov-inverse --markov-classic --markov-threshold --runtime --session --speed-only --progress-only --restore --restore-file-path --restore-disable --outfile --outfile-format --outfile-autohex-disable --outfile-json --outfile-check-timer --outfile-check-dir --wordlist-autohex-disable --separator --show --deprecated-check-disable --left --username --dynamic-x --remove --remove-timer --potfile-disable --potfile-path --debug-mode --debug-file --induction-dir --segment-size --bitmap-min --bitmap-max --cpu-affinity --example-hashes --hash-info --backend-ignore-cuda --backend-ignore-opencl --backend-ignore-hip --backend-ignore-metal --backend-info --backend-devices --backend-devices-virtual --opencl-device-types --backend-vector-width --workload-profile --kernel-accel --kernel-loops --kernel-threads --spin-damp --hwmon-disable --hwmon-temp-abort --skip --limit --keyspace --rule-left --rule-right --rules-file --generate-rules --generate-rules-func-min --generate-rules-func-max --generate-rules-func-sel --generate-rules-seed --custom-charset1 --custom-charset2 --custom-charset3 --custom-charset4 --hook-threads --increment --increment-min --increment-max --logfile-disable --scrypt-tmto --keyboard-layout-mapping --truecrypt-keyfiles --veracrypt-keyfiles --veracrypt-pim-start --veracrypt-pim-stop --stdout --keep-guessing --hccapx-message-pair --nonce-error-corrections --encoding-from --encoding-to --optimized-kernel-enable --multiply-accel-disable --self-test-disable --slow-candidates --brain-server --brain-server-timer --brain-client --brain-client-features --brain-host --brain-port --brain-session --brain-session-whitelist --brain-password --identify" local OPTIONS="-m -a -t -o -p -c -d -w -n -u -j -k -r -g -1 -2 -3 -4 -s -l --hash-type --attack-mode --status-timer --stdin-timeout-abort --markov-hcstat2 --markov-threshold --runtime --session --outfile --outfile-format --outfile-check-timer --outfile-check-dir --separator --remove-timer --potfile-path --restore-file-path --debug-mode --debug-file --induction-dir --segment-size --bitmap-min --bitmap-max --cpu-affinity --backend-devices --backend-devices-virtual --opencl-device-types --backend-vector-width --workload-profile --kernel-accel --kernel-loops --kernel-threads --spin-damp --hwmon-temp-abort --skip --limit --rule-left --rule-right --rules-file --generate-rules --generate-rules-func-min --generate-rules-func-max --generate-rules-func-sel --generate-rules-seed --custom-charset1 --custom-charset2 --custom-charset3 --custom-charset4 --hook-threads --increment-min --increment-max --scrypt-tmto --keyboard-layout-mapping --truecrypt-keyfiles --veracrypt-keyfiles --veracrypt-pim-start --veracrypt-pim-stop --hccapx-message-pair --nonce-error-corrections --encoding-from --encoding-to --brain-server-timer --brain-client-features --brain-host --brain-password --brain-port --brain-session --brain-session-whitelist" COMPREPLY=() diff --git a/include/backend.h b/include/backend.h index 117452740..ce1e9cfe4 100644 --- a/include/backend.h +++ b/include/backend.h @@ -93,7 +93,9 @@ int run_kernel_decompress (hashcat_ctx_t *hashcat_ctx, hc_devi int run_copy (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u64 pws_cnt); int run_cracker (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, const u64 pws_pos, const u64 pws_cnt); +HC_API_CALL void *hook12_thread (void *p); +HC_API_CALL void *hook23_thread (void *p); #endif // HC_BACKEND_H diff --git a/include/brain.h b/include/brain.h index 9ad0b5c1a..783a0d4cc 100644 --- a/include/brain.h +++ b/include/brain.h @@ -240,7 +240,9 @@ int brain_server_sort_hash_long (const void *v1, const void *v2); int brain_server_sort_hash_short (const void *v1, const void *v2); int brain_server_sort_hash_unique (const void *v1, const void *v2); void brain_server_handle_signal (int signo); +HC_API_CALL void *brain_server_handle_client (void *p); +HC_API_CALL void *brain_server_handle_dumps (void *p); void brain_server_db_hash_init (brain_server_db_hash_t *brain_server_db_hash, const u32 brain_session); bool brain_server_db_hash_realloc (brain_server_db_hash_t *brain_server_db_hash, const i64 new_long_cnt); diff --git a/include/common.h b/include/common.h index a91f46e37..a744d532a 100644 --- a/include/common.h +++ b/include/common.h @@ -76,7 +76,7 @@ #endif /* The C++ standard denies redefinition of keywords, -but this is nededed for VS compiler which doesn't have inline keyword but has __inline +but this is needed for VS compiler which doesn't have inline keyword but has __inline */ #ifndef __cplusplus #if defined (_MSC_VER) @@ -131,7 +131,7 @@ but this is nededed for VS compiler which doesn't have inline keyword but has __ #define CPT_CACHE 0x20000 #define PARAMCNT 64 -#define DEVICES_MAX 128 +#define DEVICES_MAX 256 #define EXEC_CACHE 128 #define SPEED_CACHE 4096 #define SPEED_MAXAGE 4096 diff --git a/include/dictstat.h b/include/dictstat.h index a60b3ffe9..13f62b17a 100644 --- a/include/dictstat.h +++ b/include/dictstat.h @@ -18,7 +18,7 @@ #define MAX_DICTSTAT 100000 #define DICTSTAT_FILENAME "hashcat.dictstat2" -#define DICTSTAT_VERSION (0x6863646963743200 | 0x02) +#define DICTSTAT_VERSION (0x6863646963743200 | 0x03) int sort_by_dictstat (const void *s1, const void *s2); diff --git a/include/dispatch.h b/include/dispatch.h index dccdf3436..fcccad950 100644 --- a/include/dispatch.h +++ b/include/dispatch.h @@ -8,7 +8,7 @@ #ifdef WITH_BRAIN #if defined (_WIN) -#include +#include #define SEND_FLAGS 0 #endif diff --git a/include/ext_ADL.h b/include/ext_ADL.h index 232aa3714..bc7442ee8 100644 --- a/include/ext_ADL.h +++ b/include/ext_ADL.h @@ -212,11 +212,11 @@ typedef struct ADLThermalControllerInfo { /// Must be set to the size of the structure int iSize; -/// Possible valies: \ref ADL_DL_THERMAL_DOMAIN_OTHER or \ref ADL_DL_THERMAL_DOMAIN_GPU. +/// Possible values: \ref ADL_DL_THERMAL_DOMAIN_OTHER or \ref ADL_DL_THERMAL_DOMAIN_GPU. int iThermalDomain; /// GPU 0, 1, etc. int iDomainIndex; -/// Possible valies: \ref ADL_DL_THERMAL_FLAG_INTERRUPT or \ref ADL_DL_THERMAL_FLAG_FANCONTROL +/// Possible values: \ref ADL_DL_THERMAL_FLAG_INTERRUPT or \ref ADL_DL_THERMAL_FLAG_FANCONTROL int iFlags; } ADLThermalControllerInfo; @@ -269,7 +269,7 @@ typedef struct ADLFanSpeedValue { /// Must be set to the size of the structure int iSize; -/// Possible valies: \ref ADL_DL_FANCTRL_SPEED_TYPE_PERCENT or \ref ADL_DL_FANCTRL_SPEED_TYPE_RPM +/// Possible values: \ref ADL_DL_FANCTRL_SPEED_TYPE_PERCENT or \ref ADL_DL_FANCTRL_SPEED_TYPE_RPM int iSpeedType; /// Fan speed value int iFanSpeed; @@ -596,7 +596,7 @@ typedef int (ADL_API_CALL *ADL_ADAPTER_ACTIVE_GET ) ( int, int* ); typedef int (ADL_API_CALL *ADL_ADAPTER_ADAPTERINFO_GET ) ( LPAdapterInfo, int ); typedef int (ADL_API_CALL *ADL_ADAPTER_NUMBEROFADAPTERS_GET ) ( int* ); typedef int (ADL_API_CALL *ADL_MAIN_CONTROL_CREATE )(ADL_MAIN_MALLOC_CALLBACK, int ); -typedef int (ADL_API_CALL *ADL_MAIN_CONTROL_DESTROY )(); +typedef int (ADL_API_CALL *ADL_MAIN_CONTROL_DESTROY )(void); typedef int (ADL_API_CALL *ADL_OVERDRIVE5_CURRENTACTIVITY_GET ) (int iAdapterIndex, ADLPMActivity *lpActivity); typedef int (ADL_API_CALL *ADL_OVERDRIVE5_FANSPEEDINFO_GET ) (int iAdapterIndex, int iThermalControllerIndex, ADLFanSpeedInfo *lpFanSpeedInfo); typedef int (ADL_API_CALL *ADL_OVERDRIVE5_FANSPEED_GET ) (int iAdapterIndex, int iThermalControllerIndex, ADLFanSpeedValue *lpFanSpeedValue); diff --git a/include/ext_cuda.h b/include/ext_cuda.h index f809a1ae3..3a05aff1a 100644 --- a/include/ext_cuda.h +++ b/include/ext_cuda.h @@ -675,10 +675,10 @@ typedef enum CUjit_option_enum CU_JIT_FAST_COMPILE, /** - * Array of device symbol names that will be relocated to the corresponing + * Array of device symbol names that will be relocated to the corresponding * host addresses stored in ::CU_JIT_GLOBAL_SYMBOL_ADDRESSES.\n * Must contain ::CU_JIT_GLOBAL_SYMBOL_COUNT entries.\n - * When loding a device module, driver will relocate all encountered + * When loading a device module, driver will relocate all encountered * unresolved symbols to the host addresses.\n * It is only allowed to register symbols that correspond to unresolved * global variables.\n @@ -1022,7 +1022,7 @@ typedef CUresult (CUDA_API_CALL *CUDA_CUCTXPUSHCURRENT) (CUcontext); typedef CUresult (CUDA_API_CALL *CUDA_CUCTXSETCACHECONFIG) (CUfunc_cache); typedef CUresult (CUDA_API_CALL *CUDA_CUCTXSETCURRENT) (CUcontext); typedef CUresult (CUDA_API_CALL *CUDA_CUCTXSETSHAREDMEMCONFIG) (CUsharedconfig); -typedef CUresult (CUDA_API_CALL *CUDA_CUCTXSYNCHRONIZE) (); +typedef CUresult (CUDA_API_CALL *CUDA_CUCTXSYNCHRONIZE) (void); typedef CUresult (CUDA_API_CALL *CUDA_CUDEVICEGETATTRIBUTE) (int *, CUdevice_attribute, CUdevice); typedef CUresult (CUDA_API_CALL *CUDA_CUDEVICEGETCOUNT) (int *); typedef CUresult (CUDA_API_CALL *CUDA_CUDEVICEGET) (CUdevice *, int); @@ -1059,8 +1059,8 @@ typedef CUresult (CUDA_API_CALL *CUDA_CUMODULELOAD) (CUmodule *, con typedef CUresult (CUDA_API_CALL *CUDA_CUMODULELOADDATA) (CUmodule *, const void *); typedef CUresult (CUDA_API_CALL *CUDA_CUMODULELOADDATAEX) (CUmodule *, const void *, unsigned int, CUjit_option *, void **); typedef CUresult (CUDA_API_CALL *CUDA_CUMODULEUNLOAD) (CUmodule); -typedef CUresult (CUDA_API_CALL *CUDA_CUPROFILERSTART) (); -typedef CUresult (CUDA_API_CALL *CUDA_CUPROFILERSTOP) (); +typedef CUresult (CUDA_API_CALL *CUDA_CUPROFILERSTART) (void); +typedef CUresult (CUDA_API_CALL *CUDA_CUPROFILERSTOP) (void); typedef CUresult (CUDA_API_CALL *CUDA_CUSTREAMCREATE) (CUstream *, unsigned int); typedef CUresult (CUDA_API_CALL *CUDA_CUSTREAMDESTROY) (CUstream); typedef CUresult (CUDA_API_CALL *CUDA_CUSTREAMSYNCHRONIZE) (CUstream); diff --git a/include/ext_hip.h b/include/ext_hip.h index 950b100c0..eb0d52a59 100644 --- a/include/ext_hip.h +++ b/include/ext_hip.h @@ -152,7 +152,7 @@ typedef enum __HIP_NODISCARD hipError_t { ///< hipStreamEndCapture in a different thread. hipErrorGraphExecUpdateFailure = 910, ///< This error indicates that the graph update ///< not performed because it included changes which - ///< violated constraintsspecific to instantiated graph + ///< violated constraints specific to instantiated graph ///< update. hipErrorUnknown = 999, //< Unknown error. // HSA Runtime Error Codes start here. @@ -216,7 +216,7 @@ typedef enum hipDeviceAttribute_t { ///< Use cudaDeviceGetTexture1DLinearMaxWidth() instead on Cuda. hipDeviceAttributeMaxTexture1DMipmap, ///< Cuda only. Maximum size of 1D mipmapped texture. hipDeviceAttributeMaxTexture2DWidth, ///< Maximum dimension width of 2D texture. - hipDeviceAttributeMaxTexture2DHeight, ///< Maximum dimension hight of 2D texture. + hipDeviceAttributeMaxTexture2DHeight, ///< Maximum dimension height of 2D texture. hipDeviceAttributeMaxTexture2DGather, ///< Cuda only. Maximum dimensions of 2D texture if gather operations performed. hipDeviceAttributeMaxTexture2DLayered, ///< Cuda only. Maximum dimensions of 2D layered texture. hipDeviceAttributeMaxTexture2DLinear, ///< Cuda only. Maximum dimensions (width, height, pitch) of 2D textures bound to pitched memory. @@ -258,7 +258,7 @@ typedef enum hipDeviceAttribute_t { hipDeviceAttributeTextureAlignment, ///< Alignment requirement for textures hipDeviceAttributeTexturePitchAlignment, ///< Pitch alignment requirement for 2D texture references bound to pitched memory; hipDeviceAttributeTotalConstantMemory, ///< Constant memory size in bytes. - hipDeviceAttributeTotalGlobalMem, ///< Global memory available on devicice. + hipDeviceAttributeTotalGlobalMem, ///< Global memory available on device. hipDeviceAttributeUnifiedAddressing, ///< Cuda only. An unified address space shared with the host. hipDeviceAttributeUuid, ///< Cuda only. Unique ID in 16 byte. hipDeviceAttributeWarpSize, ///< Warp size in threads. @@ -315,7 +315,7 @@ typedef enum hipDeviceAttribute_t { /** Disable event's capability to record timing information. May improve performance.*/ #define hipEventDisableTiming 0x2 -/** Event can support IPC. Warnig: It is not supported in HIP.*/ +/** Event can support IPC. Warning: It is not supported in HIP.*/ #define hipEventInterprocess 0x4 /** Use a device-scope release when recording this event. This flag is useful to obtain more @@ -377,7 +377,7 @@ typedef hipError_t (HIP_API_CALL *HIP_HIPCTXDESTROY) (hipCtx_t); typedef hipError_t (HIP_API_CALL *HIP_HIPCTXPOPCURRENT) (hipCtx_t *); typedef hipError_t (HIP_API_CALL *HIP_HIPCTXPUSHCURRENT) (hipCtx_t); typedef hipError_t (HIP_API_CALL *HIP_HIPCTXSETCURRENT) (hipCtx_t); -typedef hipError_t (HIP_API_CALL *HIP_HIPCTXSYNCHRONIZE) (); +typedef hipError_t (HIP_API_CALL *HIP_HIPCTXSYNCHRONIZE) (void); typedef hipError_t (HIP_API_CALL *HIP_HIPDEVICEGETATTRIBUTE) (int *, hipDeviceAttribute_t, hipDevice_t); typedef hipError_t (HIP_API_CALL *HIP_HIPDEVICEGETCOUNT) (int *); typedef hipError_t (HIP_API_CALL *HIP_HIPDEVICEGET) (hipDevice_t *, int); diff --git a/include/ext_iokit.h b/include/ext_iokit.h index 180be3ef9..36676c948 100644 --- a/include/ext_iokit.h +++ b/include/ext_iokit.h @@ -9,6 +9,9 @@ #if defined(__APPLE__) #include +// kIOMasterPortDefault/kIOMainPortDefault is 0 +static const mach_port_t hc_IOMasterPortDefault = 0; + // Apple SMC Keys #define HM_IOKIT_SMC_SENSOR_GRAPHICS_HOT "SGHT" #define HM_IOKIT_SMC_CPU_PROXIMITY "TC0P" diff --git a/include/ext_sysfs_cpu.h b/include/ext_sysfs_cpu.h index d81608d3a..10bc38740 100644 --- a/include/ext_sysfs_cpu.h +++ b/include/ext_sysfs_cpu.h @@ -48,7 +48,7 @@ typedef hm_sysfs_cpu_lib_t SYSFS_CPU_PTR; bool sysfs_cpu_init (void *hashcat_ctx); void sysfs_cpu_close (void *hashcat_ctx); -char *hm_SYSFS_CPU_get_syspath_hwmon (); +char *hm_SYSFS_CPU_get_syspath_hwmon (void); int hm_SYSFS_CPU_get_temperature_current (void *hashcat_ctx, int *val); bool read_proc_stat (void *hashcat_ctx, proc_stat_t *proc_stat); diff --git a/include/shared.h b/include/shared.h index 46d7a8e27..f1660c58e 100644 --- a/include/shared.h +++ b/include/shared.h @@ -69,7 +69,7 @@ int hc_string_bom_size (const u8 *s); void hc_string_trim_trailing (char *s); void hc_string_trim_leading (char *s); -int hc_get_processor_count (); +int hc_get_processor_count (void); bool hc_same_files (char *file1, char *file2); @@ -104,6 +104,8 @@ int generic_salt_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, const u8 int input_tokenizer (const u8 *input_buf, const int input_len, hc_token_t *token); +int extract_dynamicx_hash (const u8 *input_buf, const int input_len, u8 **output_buf, int *output_len); + #if defined (__APPLE__) bool is_apple_silicon (void); #endif diff --git a/include/sort_r.h b/include/sort_r.h index 28e523aeb..79bd8ab65 100644 --- a/include/sort_r.h +++ b/include/sort_r.h @@ -20,7 +20,7 @@ void sort_r(void *base, size_t nel, size_t width, int (*compar)(const void *_a, const void *_b, void *_arg), void *arg); -Slightly modified to work with hashcat to no falsly detect _SORT_R_LINUX with mingw +Slightly modified to work with hashcat to no falsely detect _SORT_R_LINUX with mingw */ diff --git a/include/types.h b/include/types.h index d059ab416..02b83da2b 100644 --- a/include/types.h +++ b/include/types.h @@ -17,11 +17,7 @@ #include #include #include - -// workaround to get the rid of "redefinition of typedef 'Byte'" build warning -#if !defined (__APPLE__) -#include "zlib.h" -#endif +#include #if !defined(__MACTYPES__) #define __MACTYPES__ @@ -625,7 +621,7 @@ typedef enum progress_mode typedef enum user_options_defaults { - ADVICE_DISABLE = false, + ADVICE = true, ATTACK_MODE = ATTACK_MODE_STRAIGHT, AUTODETECT = false, BACKEND_DEVICES_VIRTUAL = 1, @@ -641,9 +637,10 @@ typedef enum user_options_defaults BRAIN_SESSION = 0, #endif DEBUG_MODE = 0, - DEPRECATED_CHECK_DISABLE = false, + DEPRECATED_CHECK = true, + DYNAMIC_X = false, FORCE = false, - HWMON_DISABLE = false, + HWMON = true, #if defined (__APPLE__) HWMON_TEMP_ABORT = 100, #else @@ -667,11 +664,11 @@ typedef enum user_options_defaults KEYSPACE = false, LEFT = false, LIMIT = 0, - LOGFILE_DISABLE = false, + LOGFILE = true, LOOPBACK = false, MACHINE_READABLE = false, MARKOV_CLASSIC = false, - MARKOV_DISABLE = false, + MARKOV = true, MARKOV_INVERSE = false, MARKOV_THRESHOLD = 0, METAL_COMPILER_RUNTIME = 120, @@ -684,17 +681,18 @@ typedef enum user_options_defaults BACKEND_IGNORE_OPENCL = false, BACKEND_INFO = 0, BACKEND_VECTOR_WIDTH = 0, - OPTIMIZED_KERNEL_ENABLE = false, - MULTIPLY_ACCEL_DISABLE = false, + OPTIMIZED_KERNEL = false, + MULTIPLY_ACCEL = true, OUTFILE_AUTOHEX = true, OUTFILE_CHECK_TIMER = 5, OUTFILE_FORMAT = 3, - POTFILE_DISABLE = false, + OUTFILE_JSON = false, + POTFILE = true, PROGRESS_ONLY = false, QUIET = false, REMOVE = false, REMOVE_TIMER = 60, - RESTORE_DISABLE = false, + RESTORE_ENABLE = true, RESTORE = false, RESTORE_TIMER = 1, RP_GEN = 0, @@ -704,7 +702,7 @@ typedef enum user_options_defaults RUNTIME = 0, SCRYPT_TMTO = 0, SEGMENT_SIZE = 33554432, - SELF_TEST_DISABLE = false, + SELF_TEST = true, SHOW = false, SKIP = 0, SLOW_CANDIDATES = false, @@ -720,7 +718,7 @@ typedef enum user_options_defaults VERSION = false, VERACRYPT_PIM_START = 485, VERACRYPT_PIM_STOP = 485, - WORDLIST_AUTOHEX_DISABLE = false, + WORDLIST_AUTOHEX = true, WORKLOAD_PROFILE = 2, } user_options_defaults_t; @@ -765,6 +763,7 @@ typedef enum user_options_map IDX_DEBUG_FILE = 0xff12, IDX_DEBUG_MODE = 0xff13, IDX_DEPRECATED_CHECK_DISABLE = 0xff14, + IDX_DYNAMIC_X = 0xff55, IDX_ENCODING_FROM = 0xff15, IDX_ENCODING_TO = 0xff16, IDX_HASH_INFO = 0xff17, @@ -808,48 +807,49 @@ typedef enum user_options_map IDX_OUTFILE_CHECK_DIR = 0xff32, IDX_OUTFILE_CHECK_TIMER = 0xff33, IDX_OUTFILE_FORMAT = 0xff34, + IDX_OUTFILE_JSON = 0xff35, IDX_OUTFILE = 'o', - IDX_POTFILE_DISABLE = 0xff35, - IDX_POTFILE_PATH = 0xff36, - IDX_PROGRESS_ONLY = 0xff37, - IDX_QUIET = 0xff38, - IDX_REMOVE = 0xff39, - IDX_REMOVE_TIMER = 0xff3a, - IDX_RESTORE = 0xff3b, - IDX_RESTORE_DISABLE = 0xff3c, - IDX_RESTORE_FILE_PATH = 0xff3d, + IDX_POTFILE_DISABLE = 0xff36, + IDX_POTFILE_PATH = 0xff37, + IDX_PROGRESS_ONLY = 0xff38, + IDX_QUIET = 0xff39, + IDX_REMOVE = 0xff3a, + IDX_REMOVE_TIMER = 0xff3b, + IDX_RESTORE = 0xff3c, + IDX_RESTORE_DISABLE = 0xff3d, + IDX_RESTORE_FILE_PATH = 0xff3e, IDX_RP_FILE = 'r', - IDX_RP_GEN_FUNC_MAX = 0xff3e, - IDX_RP_GEN_FUNC_MIN = 0xff3f, - IDX_RP_GEN_FUNC_SEL = 0xff40, + IDX_RP_GEN_FUNC_MAX = 0xff3f, + IDX_RP_GEN_FUNC_MIN = 0xff40, + IDX_RP_GEN_FUNC_SEL = 0xff41, IDX_RP_GEN = 'g', - IDX_RP_GEN_SEED = 0xff41, + IDX_RP_GEN_SEED = 0xff42, IDX_RULE_BUF_L = 'j', IDX_RULE_BUF_R = 'k', - IDX_RUNTIME = 0xff42, - IDX_SCRYPT_TMTO = 0xff43, + IDX_RUNTIME = 0xff43, + IDX_SCRYPT_TMTO = 0xff44, IDX_SEGMENT_SIZE = 'c', - IDX_SELF_TEST_DISABLE = 0xff44, + IDX_SELF_TEST_DISABLE = 0xff45, IDX_SEPARATOR = 'p', - IDX_SESSION = 0xff45, - IDX_SHOW = 0xff46, + IDX_SESSION = 0xff46, + IDX_SHOW = 0xff47, IDX_SKIP = 's', IDX_SLOW_CANDIDATES = 'S', - IDX_SPEED_ONLY = 0xff47, - IDX_SPIN_DAMP = 0xff48, - IDX_STATUS = 0xff49, - IDX_STATUS_JSON = 0xff4a, - IDX_STATUS_TIMER = 0xff4b, - IDX_STDOUT_FLAG = 0xff4c, - IDX_STDIN_TIMEOUT_ABORT = 0xff4d, - IDX_TRUECRYPT_KEYFILES = 0xff4e, - IDX_USERNAME = 0xff4f, - IDX_VERACRYPT_KEYFILES = 0xff50, - IDX_VERACRYPT_PIM_START = 0xff51, - IDX_VERACRYPT_PIM_STOP = 0xff52, + IDX_SPEED_ONLY = 0xff48, + IDX_SPIN_DAMP = 0xff49, + IDX_STATUS = 0xff4a, + IDX_STATUS_JSON = 0xff4b, + IDX_STATUS_TIMER = 0xff4c, + IDX_STDOUT_FLAG = 0xff4d, + IDX_STDIN_TIMEOUT_ABORT = 0xff4e, + IDX_TRUECRYPT_KEYFILES = 0xff4f, + IDX_USERNAME = 0xff50, + IDX_VERACRYPT_KEYFILES = 0xff51, + IDX_VERACRYPT_PIM_START = 0xff52, + IDX_VERACRYPT_PIM_STOP = 0xff53, IDX_VERSION_LOWER = 'v', IDX_VERSION = 'V', - IDX_WORDLIST_AUTOHEX_DISABLE = 0xff53, + IDX_WORDLIST_AUTOHEX_DISABLE = 0xff54, IDX_WORKLOAD_PROFILE = 'w', } user_options_map_t; @@ -894,6 +894,13 @@ typedef void * hc_dynfunc_t; * structs */ +typedef struct dynamicx +{ + char *dynamicx_buf; + u32 dynamicx_len; + +} dynamicx_t; + typedef struct user { char *user_name; @@ -921,9 +928,10 @@ typedef struct split typedef struct hashinfo { - user_t *user; - char *orighash; - split_t *split; + dynamicx_t *dynamicx; + user_t *user; + char *orighash; + split_t *split; } hashinfo_t; @@ -1898,7 +1906,7 @@ typedef struct backend_ctx int opencl_devices_cnt; int opencl_devices_active; - u64 backend_devices_filter; + bool backend_devices_filter[DEVICES_MAX + 1]; hc_device_param_t *devices_param; @@ -2114,6 +2122,7 @@ typedef struct outfile_ctx u32 outfile_format; bool outfile_autohex; + bool outfile_json; bool is_fifo; char *filename; @@ -2314,6 +2323,7 @@ typedef struct user_options bool nonce_error_corrections_chgd; bool spin_damp_chgd; bool backend_vector_width_chgd; + bool outfile_chgd; bool outfile_format_chgd; bool remove_timer_chgd; bool rp_gen_seed_chgd; @@ -2325,8 +2335,10 @@ typedef struct user_options bool limit_chgd; bool scrypt_tmto_chgd; bool separator_chgd; + bool rule_buf_l_chgd; + bool rule_buf_r_chgd; - bool advice_disable; + bool advice; bool benchmark; bool benchmark_all; #ifdef WITH_BRAIN @@ -2334,8 +2346,9 @@ typedef struct user_options bool brain_server; #endif bool force; - bool deprecated_check_disable; - bool hwmon_disable; + bool deprecated_check; + bool dynamic_x; + bool hwmon; bool hash_info; bool hex_charset; bool hex_salt; @@ -2344,26 +2357,27 @@ typedef struct user_options bool keep_guessing; bool keyspace; bool left; - bool logfile_disable; + bool logfile; bool loopback; bool machine_readable; bool markov_classic; - bool markov_disable; + bool markov; bool markov_inverse; bool backend_ignore_cuda; bool backend_ignore_hip; bool backend_ignore_metal; bool backend_ignore_opencl; - bool optimized_kernel_enable; - bool multiply_accel_disable; + bool optimized_kernel; + bool multiply_accel; bool outfile_autohex; - bool potfile_disable; + bool outfile_json; + bool potfile; bool progress_only; bool quiet; bool remove; bool restore; - bool restore_disable; - bool self_test_disable; + bool restore_enable; + bool self_test; bool show; bool slow_candidates; bool speed_only; @@ -2375,7 +2389,7 @@ typedef struct user_options bool veracrypt_pim_start_chgd; bool veracrypt_pim_stop_chgd; bool version; - bool wordlist_autohex_disable; + bool wordlist_autohex; #ifdef WITH_BRAIN char *brain_host; char *brain_password; diff --git a/layouts/da.hckmap b/layouts/da.hckmap new file mode 100644 index 000000000..d3a513454 --- /dev/null +++ b/layouts/da.hckmap @@ -0,0 +1,97 @@ +½ ` +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +0 0 ++ - +´ = +q q +w w +e e +r r +t t +y y +u u +i i +o o +p p +å [ +¨ ] +a a +s s +d d +f f +g g +h h +j j +k k +l l +æ ; +ø ' +' \ +< \ +z z +x x +c c +v v +b b +n n +m m +, , +. . +- / + +§ ~ +! ! +" @ +# # +¤ $ +% % +& ^ +/ & +( * +) ( += ) +? _ +` + +Q Q +W W +E E +R R +T T +Y Y +U U +I I +O O +P P +Å { +^ } +A A +S S +D D +F F +G G +H H +J J +K K +L L +Æ : +Ø " +* | +> | +Z Z +X X +C C +V V +B B +N N +M M +; < +: > +_ ? diff --git a/rules/Incisive-leetspeak.rule b/rules/Incisive-leetspeak.rule index 010a618e1..d3435a96f 100644 --- a/rules/Incisive-leetspeak.rule +++ b/rules/Incisive-leetspeak.rule @@ -1,15487 +1,15487 @@ sa@ -sa@sb6 -sa@sb6sc{ -sa@sb6sc{se3 -sa@sb6sc{se3sg9 -sa@sb6sc{se3sg9si! -sa@sb6sc{se3sg9si!so0 -sa@sb6sc{se3sg9si!so0sq9 -sa@sb6sc{se3sg9si!so0sq9ss$ -sa@sb6sc{se3sg9si!so0sq9ss$st+ -sa@sb6sc{se3sg9si!so0sq9ss$st+sx% -sa@sb6sc{se3sg9si!so0sq9ss$st7 -sa@sb6sc{se3sg9si!so0sq9ss$st7sx% -sa@sb6sc{se3sg9si!so0sq9ss$sx% -sa@sb6sc{se3sg9si!so0sq9ss5 -sa@sb6sc{se3sg9si!so0sq9ss5st+ -sa@sb6sc{se3sg9si!so0sq9ss5st+sx% -sa@sb6sc{se3sg9si!so0sq9ss5st7 -sa@sb6sc{se3sg9si!so0sq9ss5st7sx% -sa@sb6sc{se3sg9si!so0sq9ss5sx% -sa@sb6sc{se3sg9si!so0sq9st+ -sa@sb6sc{se3sg9si!so0sq9st+sx% -sa@sb6sc{se3sg9si!so0sq9st7 -sa@sb6sc{se3sg9si!so0sq9st7sx% -sa@sb6sc{se3sg9si!so0sq9sx% -sa@sb6sc{se3sg9si!so0ss$ -sa@sb6sc{se3sg9si!so0ss$st+ -sa@sb6sc{se3sg9si!so0ss$st+sx% -sa@sb6sc{se3sg9si!so0ss$st7 -sa@sb6sc{se3sg9si!so0ss$st7sx% -sa@sb6sc{se3sg9si!so0ss$sx% -sa@sb6sc{se3sg9si!so0ss5 -sa@sb6sc{se3sg9si!so0ss5st+ -sa@sb6sc{se3sg9si!so0ss5st+sx% -sa@sb6sc{se3sg9si!so0ss5st7 -sa@sb6sc{se3sg9si!so0ss5st7sx% -sa@sb6sc{se3sg9si!so0ss5sx% -sa@sb6sc{se3sg9si!so0st+ -sa@sb6sc{se3sg9si!so0st+sx% -sa@sb6sc{se3sg9si!so0st7 -sa@sb6sc{se3sg9si!so0st7sx% -sa@sb6sc{se3sg9si!so0sx% -sa@sb6sc{se3sg9si!sq9 -sa@sb6sc{se3sg9si!sq9ss$ -sa@sb6sc{se3sg9si!sq9ss$st+ -sa@sb6sc{se3sg9si!sq9ss$st+sx% -sa@sb6sc{se3sg9si!sq9ss$st7 -sa@sb6sc{se3sg9si!sq9ss$st7sx% -sa@sb6sc{se3sg9si!sq9ss$sx% -sa@sb6sc{se3sg9si!sq9ss5 -sa@sb6sc{se3sg9si!sq9ss5st+ -sa@sb6sc{se3sg9si!sq9ss5st+sx% -sa@sb6sc{se3sg9si!sq9ss5st7 -sa@sb6sc{se3sg9si!sq9ss5st7sx% -sa@sb6sc{se3sg9si!sq9ss5sx% -sa@sb6sc{se3sg9si!sq9st+ -sa@sb6sc{se3sg9si!sq9st+sx% -sa@sb6sc{se3sg9si!sq9st7 -sa@sb6sc{se3sg9si!sq9st7sx% -sa@sb6sc{se3sg9si!sq9sx% -sa@sb6sc{se3sg9si!ss$ -sa@sb6sc{se3sg9si!ss$st+ -sa@sb6sc{se3sg9si!ss$st+sx% -sa@sb6sc{se3sg9si!ss$st7 -sa@sb6sc{se3sg9si!ss$st7sx% -sa@sb6sc{se3sg9si!ss$sx% -sa@sb6sc{se3sg9si!ss5 -sa@sb6sc{se3sg9si!ss5st+ -sa@sb6sc{se3sg9si!ss5st+sx% -sa@sb6sc{se3sg9si!ss5st7 -sa@sb6sc{se3sg9si!ss5st7sx% -sa@sb6sc{se3sg9si!ss5sx% -sa@sb6sc{se3sg9si!st+ -sa@sb6sc{se3sg9si!st+sx% -sa@sb6sc{se3sg9si!st7 -sa@sb6sc{se3sg9si!st7sx% -sa@sb6sc{se3sg9si!sx% -sa@sb6sc{se3sg9si1 -sa@sb6sc{se3sg9si1so0 -sa@sb6sc{se3sg9si1so0sq9 -sa@sb6sc{se3sg9si1so0sq9ss$ -sa@sb6sc{se3sg9si1so0sq9ss$st+ -sa@sb6sc{se3sg9si1so0sq9ss$st+sx% -sa@sb6sc{se3sg9si1so0sq9ss$st7 -sa@sb6sc{se3sg9si1so0sq9ss$st7sx% -sa@sb6sc{se3sg9si1so0sq9ss$sx% -sa@sb6sc{se3sg9si1so0sq9ss5 -sa@sb6sc{se3sg9si1so0sq9ss5st+ -sa@sb6sc{se3sg9si1so0sq9ss5st+sx% -sa@sb6sc{se3sg9si1so0sq9ss5st7 -sa@sb6sc{se3sg9si1so0sq9ss5st7sx% -sa@sb6sc{se3sg9si1so0sq9ss5sx% -sa@sb6sc{se3sg9si1so0sq9st+ -sa@sb6sc{se3sg9si1so0sq9st+sx% -sa@sb6sc{se3sg9si1so0sq9st7 -sa@sb6sc{se3sg9si1so0sq9st7sx% -sa@sb6sc{se3sg9si1so0sq9sx% -sa@sb6sc{se3sg9si1so0ss$ -sa@sb6sc{se3sg9si1so0ss$st+ -sa@sb6sc{se3sg9si1so0ss$st+sx% -sa@sb6sc{se3sg9si1so0ss$st7 -sa@sb6sc{se3sg9si1so0ss$st7sx% -sa@sb6sc{se3sg9si1so0ss$sx% -sa@sb6sc{se3sg9si1so0ss5 -sa@sb6sc{se3sg9si1so0ss5st+ -sa@sb6sc{se3sg9si1so0ss5st+sx% -sa@sb6sc{se3sg9si1so0ss5st7 -sa@sb6sc{se3sg9si1so0ss5st7sx% -sa@sb6sc{se3sg9si1so0ss5sx% -sa@sb6sc{se3sg9si1so0st+ -sa@sb6sc{se3sg9si1so0st+sx% -sa@sb6sc{se3sg9si1so0st7 -sa@sb6sc{se3sg9si1so0st7sx% -sa@sb6sc{se3sg9si1so0sx% -sa@sb6sc{se3sg9si1sq9 -sa@sb6sc{se3sg9si1sq9ss$ -sa@sb6sc{se3sg9si1sq9ss$st+ -sa@sb6sc{se3sg9si1sq9ss$st+sx% -sa@sb6sc{se3sg9si1sq9ss$st7 -sa@sb6sc{se3sg9si1sq9ss$st7sx% -sa@sb6sc{se3sg9si1sq9ss$sx% -sa@sb6sc{se3sg9si1sq9ss5 -sa@sb6sc{se3sg9si1sq9ss5st+ -sa@sb6sc{se3sg9si1sq9ss5st+sx% -sa@sb6sc{se3sg9si1sq9ss5st7 -sa@sb6sc{se3sg9si1sq9ss5st7sx% -sa@sb6sc{se3sg9si1sq9ss5sx% -sa@sb6sc{se3sg9si1sq9st+ -sa@sb6sc{se3sg9si1sq9st+sx% -sa@sb6sc{se3sg9si1sq9st7 -sa@sb6sc{se3sg9si1sq9st7sx% -sa@sb6sc{se3sg9si1sq9sx% -sa@sb6sc{se3sg9si1ss$ -sa@sb6sc{se3sg9si1ss$st+ -sa@sb6sc{se3sg9si1ss$st+sx% -sa@sb6sc{se3sg9si1ss$st7 -sa@sb6sc{se3sg9si1ss$st7sx% -sa@sb6sc{se3sg9si1ss$sx% -sa@sb6sc{se3sg9si1ss5 -sa@sb6sc{se3sg9si1ss5st+ -sa@sb6sc{se3sg9si1ss5st+sx% -sa@sb6sc{se3sg9si1ss5st7 -sa@sb6sc{se3sg9si1ss5st7sx% -sa@sb6sc{se3sg9si1ss5sx% -sa@sb6sc{se3sg9si1st+ -sa@sb6sc{se3sg9si1st+sx% -sa@sb6sc{se3sg9si1st7 -sa@sb6sc{se3sg9si1st7sx% -sa@sb6sc{se3sg9si1sx% -sa@sb6sc{se3sg9so0 -sa@sb6sc{se3sg9so0sq9 -sa@sb6sc{se3sg9so0sq9ss$ -sa@sb6sc{se3sg9so0sq9ss$st+ -sa@sb6sc{se3sg9so0sq9ss$st+sx% -sa@sb6sc{se3sg9so0sq9ss$st7 -sa@sb6sc{se3sg9so0sq9ss$st7sx% -sa@sb6sc{se3sg9so0sq9ss$sx% -sa@sb6sc{se3sg9so0sq9ss5 -sa@sb6sc{se3sg9so0sq9ss5st+ -sa@sb6sc{se3sg9so0sq9ss5st+sx% -sa@sb6sc{se3sg9so0sq9ss5st7 -sa@sb6sc{se3sg9so0sq9ss5st7sx% -sa@sb6sc{se3sg9so0sq9ss5sx% -sa@sb6sc{se3sg9so0sq9st+ -sa@sb6sc{se3sg9so0sq9st+sx% -sa@sb6sc{se3sg9so0sq9st7 -sa@sb6sc{se3sg9so0sq9st7sx% -sa@sb6sc{se3sg9so0sq9sx% -sa@sb6sc{se3sg9so0ss$ -sa@sb6sc{se3sg9so0ss$st+ -sa@sb6sc{se3sg9so0ss$st+sx% -sa@sb6sc{se3sg9so0ss$st7 -sa@sb6sc{se3sg9so0ss$st7sx% -sa@sb6sc{se3sg9so0ss$sx% -sa@sb6sc{se3sg9so0ss5 -sa@sb6sc{se3sg9so0ss5st+ -sa@sb6sc{se3sg9so0ss5st+sx% -sa@sb6sc{se3sg9so0ss5st7 -sa@sb6sc{se3sg9so0ss5st7sx% -sa@sb6sc{se3sg9so0ss5sx% -sa@sb6sc{se3sg9so0st+ -sa@sb6sc{se3sg9so0st+sx% -sa@sb6sc{se3sg9so0st7 -sa@sb6sc{se3sg9so0st7sx% -sa@sb6sc{se3sg9so0sx% -sa@sb6sc{se3sg9sq9 -sa@sb6sc{se3sg9sq9ss$ -sa@sb6sc{se3sg9sq9ss$st+ -sa@sb6sc{se3sg9sq9ss$st+sx% -sa@sb6sc{se3sg9sq9ss$st7 -sa@sb6sc{se3sg9sq9ss$st7sx% -sa@sb6sc{se3sg9sq9ss$sx% -sa@sb6sc{se3sg9sq9ss5 -sa@sb6sc{se3sg9sq9ss5st+ -sa@sb6sc{se3sg9sq9ss5st+sx% -sa@sb6sc{se3sg9sq9ss5st7 -sa@sb6sc{se3sg9sq9ss5st7sx% -sa@sb6sc{se3sg9sq9ss5sx% -sa@sb6sc{se3sg9sq9st+ -sa@sb6sc{se3sg9sq9st+sx% -sa@sb6sc{se3sg9sq9st7 -sa@sb6sc{se3sg9sq9st7sx% -sa@sb6sc{se3sg9sq9sx% -sa@sb6sc{se3sg9ss$ -sa@sb6sc{se3sg9ss$st+ -sa@sb6sc{se3sg9ss$st+sx% -sa@sb6sc{se3sg9ss$st7 -sa@sb6sc{se3sg9ss$st7sx% -sa@sb6sc{se3sg9ss$sx% -sa@sb6sc{se3sg9ss5 -sa@sb6sc{se3sg9ss5st+ -sa@sb6sc{se3sg9ss5st+sx% -sa@sb6sc{se3sg9ss5st7 -sa@sb6sc{se3sg9ss5st7sx% -sa@sb6sc{se3sg9ss5sx% -sa@sb6sc{se3sg9st+ -sa@sb6sc{se3sg9st+sx% -sa@sb6sc{se3sg9st7 -sa@sb6sc{se3sg9st7sx% -sa@sb6sc{se3sg9sx% -sa@sb6sc{se3si! -sa@sb6sc{se3si!so0 -sa@sb6sc{se3si!so0sq9 -sa@sb6sc{se3si!so0sq9ss$ -sa@sb6sc{se3si!so0sq9ss$st+ -sa@sb6sc{se3si!so0sq9ss$st+sx% -sa@sb6sc{se3si!so0sq9ss$st7 -sa@sb6sc{se3si!so0sq9ss$st7sx% -sa@sb6sc{se3si!so0sq9ss$sx% -sa@sb6sc{se3si!so0sq9ss5 -sa@sb6sc{se3si!so0sq9ss5st+ -sa@sb6sc{se3si!so0sq9ss5st+sx% -sa@sb6sc{se3si!so0sq9ss5st7 -sa@sb6sc{se3si!so0sq9ss5st7sx% -sa@sb6sc{se3si!so0sq9ss5sx% -sa@sb6sc{se3si!so0sq9st+ -sa@sb6sc{se3si!so0sq9st+sx% -sa@sb6sc{se3si!so0sq9st7 -sa@sb6sc{se3si!so0sq9st7sx% -sa@sb6sc{se3si!so0sq9sx% -sa@sb6sc{se3si!so0ss$ -sa@sb6sc{se3si!so0ss$st+ -sa@sb6sc{se3si!so0ss$st+sx% -sa@sb6sc{se3si!so0ss$st7 -sa@sb6sc{se3si!so0ss$st7sx% -sa@sb6sc{se3si!so0ss$sx% -sa@sb6sc{se3si!so0ss5 -sa@sb6sc{se3si!so0ss5st+ -sa@sb6sc{se3si!so0ss5st+sx% -sa@sb6sc{se3si!so0ss5st7 -sa@sb6sc{se3si!so0ss5st7sx% -sa@sb6sc{se3si!so0ss5sx% -sa@sb6sc{se3si!so0st+ -sa@sb6sc{se3si!so0st+sx% -sa@sb6sc{se3si!so0st7 -sa@sb6sc{se3si!so0st7sx% -sa@sb6sc{se3si!so0sx% -sa@sb6sc{se3si!sq9 -sa@sb6sc{se3si!sq9ss$ -sa@sb6sc{se3si!sq9ss$st+ -sa@sb6sc{se3si!sq9ss$st+sx% -sa@sb6sc{se3si!sq9ss$st7 -sa@sb6sc{se3si!sq9ss$st7sx% -sa@sb6sc{se3si!sq9ss$sx% -sa@sb6sc{se3si!sq9ss5 -sa@sb6sc{se3si!sq9ss5st+ -sa@sb6sc{se3si!sq9ss5st+sx% -sa@sb6sc{se3si!sq9ss5st7 -sa@sb6sc{se3si!sq9ss5st7sx% -sa@sb6sc{se3si!sq9ss5sx% -sa@sb6sc{se3si!sq9st+ -sa@sb6sc{se3si!sq9st+sx% -sa@sb6sc{se3si!sq9st7 -sa@sb6sc{se3si!sq9st7sx% -sa@sb6sc{se3si!sq9sx% -sa@sb6sc{se3si!ss$ -sa@sb6sc{se3si!ss$st+ -sa@sb6sc{se3si!ss$st+sx% -sa@sb6sc{se3si!ss$st7 -sa@sb6sc{se3si!ss$st7sx% -sa@sb6sc{se3si!ss$sx% -sa@sb6sc{se3si!ss5 -sa@sb6sc{se3si!ss5st+ -sa@sb6sc{se3si!ss5st+sx% -sa@sb6sc{se3si!ss5st7 -sa@sb6sc{se3si!ss5st7sx% -sa@sb6sc{se3si!ss5sx% -sa@sb6sc{se3si!st+ -sa@sb6sc{se3si!st+sx% -sa@sb6sc{se3si!st7 -sa@sb6sc{se3si!st7sx% -sa@sb6sc{se3si!sx% -sa@sb6sc{se3si1 -sa@sb6sc{se3si1so0 -sa@sb6sc{se3si1so0sq9 -sa@sb6sc{se3si1so0sq9ss$ -sa@sb6sc{se3si1so0sq9ss$st+ -sa@sb6sc{se3si1so0sq9ss$st+sx% -sa@sb6sc{se3si1so0sq9ss$st7 -sa@sb6sc{se3si1so0sq9ss$st7sx% -sa@sb6sc{se3si1so0sq9ss$sx% -sa@sb6sc{se3si1so0sq9ss5 -sa@sb6sc{se3si1so0sq9ss5st+ -sa@sb6sc{se3si1so0sq9ss5st+sx% -sa@sb6sc{se3si1so0sq9ss5st7 -sa@sb6sc{se3si1so0sq9ss5st7sx% -sa@sb6sc{se3si1so0sq9ss5sx% -sa@sb6sc{se3si1so0sq9st+ -sa@sb6sc{se3si1so0sq9st+sx% -sa@sb6sc{se3si1so0sq9st7 -sa@sb6sc{se3si1so0sq9st7sx% -sa@sb6sc{se3si1so0sq9sx% -sa@sb6sc{se3si1so0ss$ -sa@sb6sc{se3si1so0ss$st+ -sa@sb6sc{se3si1so0ss$st+sx% -sa@sb6sc{se3si1so0ss$st7 -sa@sb6sc{se3si1so0ss$st7sx% -sa@sb6sc{se3si1so0ss$sx% -sa@sb6sc{se3si1so0ss5 -sa@sb6sc{se3si1so0ss5st+ -sa@sb6sc{se3si1so0ss5st+sx% -sa@sb6sc{se3si1so0ss5st7 -sa@sb6sc{se3si1so0ss5st7sx% -sa@sb6sc{se3si1so0ss5sx% -sa@sb6sc{se3si1so0st+ -sa@sb6sc{se3si1so0st+sx% -sa@sb6sc{se3si1so0st7 -sa@sb6sc{se3si1so0st7sx% -sa@sb6sc{se3si1so0sx% -sa@sb6sc{se3si1sq9 -sa@sb6sc{se3si1sq9ss$ -sa@sb6sc{se3si1sq9ss$st+ -sa@sb6sc{se3si1sq9ss$st+sx% -sa@sb6sc{se3si1sq9ss$st7 -sa@sb6sc{se3si1sq9ss$st7sx% -sa@sb6sc{se3si1sq9ss$sx% -sa@sb6sc{se3si1sq9ss5 -sa@sb6sc{se3si1sq9ss5st+ -sa@sb6sc{se3si1sq9ss5st+sx% -sa@sb6sc{se3si1sq9ss5st7 -sa@sb6sc{se3si1sq9ss5st7sx% -sa@sb6sc{se3si1sq9ss5sx% -sa@sb6sc{se3si1sq9st+ -sa@sb6sc{se3si1sq9st+sx% -sa@sb6sc{se3si1sq9st7 -sa@sb6sc{se3si1sq9st7sx% -sa@sb6sc{se3si1sq9sx% -sa@sb6sc{se3si1ss$ -sa@sb6sc{se3si1ss$st+ -sa@sb6sc{se3si1ss$st+sx% -sa@sb6sc{se3si1ss$st7 -sa@sb6sc{se3si1ss$st7sx% -sa@sb6sc{se3si1ss$sx% -sa@sb6sc{se3si1ss5 -sa@sb6sc{se3si1ss5st+ -sa@sb6sc{se3si1ss5st+sx% -sa@sb6sc{se3si1ss5st7 -sa@sb6sc{se3si1ss5st7sx% -sa@sb6sc{se3si1ss5sx% -sa@sb6sc{se3si1st+ -sa@sb6sc{se3si1st+sx% -sa@sb6sc{se3si1st7 -sa@sb6sc{se3si1st7sx% -sa@sb6sc{se3si1sx% -sa@sb6sc{se3so0 -sa@sb6sc{se3so0sq9 -sa@sb6sc{se3so0sq9ss$ -sa@sb6sc{se3so0sq9ss$st+ -sa@sb6sc{se3so0sq9ss$st+sx% -sa@sb6sc{se3so0sq9ss$st7 -sa@sb6sc{se3so0sq9ss$st7sx% -sa@sb6sc{se3so0sq9ss$sx% -sa@sb6sc{se3so0sq9ss5 -sa@sb6sc{se3so0sq9ss5st+ -sa@sb6sc{se3so0sq9ss5st+sx% -sa@sb6sc{se3so0sq9ss5st7 -sa@sb6sc{se3so0sq9ss5st7sx% -sa@sb6sc{se3so0sq9ss5sx% -sa@sb6sc{se3so0sq9st+ -sa@sb6sc{se3so0sq9st+sx% -sa@sb6sc{se3so0sq9st7 -sa@sb6sc{se3so0sq9st7sx% -sa@sb6sc{se3so0sq9sx% -sa@sb6sc{se3so0ss$ -sa@sb6sc{se3so0ss$st+ -sa@sb6sc{se3so0ss$st+sx% -sa@sb6sc{se3so0ss$st7 -sa@sb6sc{se3so0ss$st7sx% -sa@sb6sc{se3so0ss$sx% -sa@sb6sc{se3so0ss5 -sa@sb6sc{se3so0ss5st+ -sa@sb6sc{se3so0ss5st+sx% -sa@sb6sc{se3so0ss5st7 -sa@sb6sc{se3so0ss5st7sx% -sa@sb6sc{se3so0ss5sx% -sa@sb6sc{se3so0st+ -sa@sb6sc{se3so0st+sx% -sa@sb6sc{se3so0st7 -sa@sb6sc{se3so0st7sx% -sa@sb6sc{se3so0sx% -sa@sb6sc{se3sq9 -sa@sb6sc{se3sq9ss$ -sa@sb6sc{se3sq9ss$st+ -sa@sb6sc{se3sq9ss$st+sx% -sa@sb6sc{se3sq9ss$st7 -sa@sb6sc{se3sq9ss$st7sx% -sa@sb6sc{se3sq9ss$sx% -sa@sb6sc{se3sq9ss5 -sa@sb6sc{se3sq9ss5st+ -sa@sb6sc{se3sq9ss5st+sx% -sa@sb6sc{se3sq9ss5st7 -sa@sb6sc{se3sq9ss5st7sx% -sa@sb6sc{se3sq9ss5sx% -sa@sb6sc{se3sq9st+ -sa@sb6sc{se3sq9st+sx% -sa@sb6sc{se3sq9st7 -sa@sb6sc{se3sq9st7sx% -sa@sb6sc{se3sq9sx% -sa@sb6sc{se3ss$ -sa@sb6sc{se3ss$st+ -sa@sb6sc{se3ss$st+sx% -sa@sb6sc{se3ss$st7 -sa@sb6sc{se3ss$st7sx% -sa@sb6sc{se3ss$sx% -sa@sb6sc{se3ss5 -sa@sb6sc{se3ss5st+ -sa@sb6sc{se3ss5st+sx% -sa@sb6sc{se3ss5st7 -sa@sb6sc{se3ss5st7sx% -sa@sb6sc{se3ss5sx% -sa@sb6sc{se3st+ -sa@sb6sc{se3st+sx% -sa@sb6sc{se3st7 -sa@sb6sc{se3st7sx% -sa@sb6sc{se3sx% -sa@sb6sc{sg9 -sa@sb6sc{sg9si! -sa@sb6sc{sg9si!so0 -sa@sb6sc{sg9si!so0sq9 -sa@sb6sc{sg9si!so0sq9ss$ -sa@sb6sc{sg9si!so0sq9ss$st+ -sa@sb6sc{sg9si!so0sq9ss$st+sx% -sa@sb6sc{sg9si!so0sq9ss$st7 -sa@sb6sc{sg9si!so0sq9ss$st7sx% -sa@sb6sc{sg9si!so0sq9ss$sx% -sa@sb6sc{sg9si!so0sq9ss5 -sa@sb6sc{sg9si!so0sq9ss5st+ -sa@sb6sc{sg9si!so0sq9ss5st+sx% -sa@sb6sc{sg9si!so0sq9ss5st7 -sa@sb6sc{sg9si!so0sq9ss5st7sx% -sa@sb6sc{sg9si!so0sq9ss5sx% -sa@sb6sc{sg9si!so0sq9st+ -sa@sb6sc{sg9si!so0sq9st+sx% -sa@sb6sc{sg9si!so0sq9st7 -sa@sb6sc{sg9si!so0sq9st7sx% -sa@sb6sc{sg9si!so0sq9sx% -sa@sb6sc{sg9si!so0ss$ -sa@sb6sc{sg9si!so0ss$st+ -sa@sb6sc{sg9si!so0ss$st+sx% -sa@sb6sc{sg9si!so0ss$st7 -sa@sb6sc{sg9si!so0ss$st7sx% -sa@sb6sc{sg9si!so0ss$sx% -sa@sb6sc{sg9si!so0ss5 -sa@sb6sc{sg9si!so0ss5st+ -sa@sb6sc{sg9si!so0ss5st+sx% -sa@sb6sc{sg9si!so0ss5st7 -sa@sb6sc{sg9si!so0ss5st7sx% -sa@sb6sc{sg9si!so0ss5sx% -sa@sb6sc{sg9si!so0st+ -sa@sb6sc{sg9si!so0st+sx% -sa@sb6sc{sg9si!so0st7 -sa@sb6sc{sg9si!so0st7sx% -sa@sb6sc{sg9si!so0sx% -sa@sb6sc{sg9si!sq9 -sa@sb6sc{sg9si!sq9ss$ -sa@sb6sc{sg9si!sq9ss$st+ -sa@sb6sc{sg9si!sq9ss$st+sx% -sa@sb6sc{sg9si!sq9ss$st7 -sa@sb6sc{sg9si!sq9ss$st7sx% -sa@sb6sc{sg9si!sq9ss$sx% -sa@sb6sc{sg9si!sq9ss5 -sa@sb6sc{sg9si!sq9ss5st+ -sa@sb6sc{sg9si!sq9ss5st+sx% -sa@sb6sc{sg9si!sq9ss5st7 -sa@sb6sc{sg9si!sq9ss5st7sx% -sa@sb6sc{sg9si!sq9ss5sx% -sa@sb6sc{sg9si!sq9st+ -sa@sb6sc{sg9si!sq9st+sx% -sa@sb6sc{sg9si!sq9st7 -sa@sb6sc{sg9si!sq9st7sx% -sa@sb6sc{sg9si!sq9sx% -sa@sb6sc{sg9si!ss$ -sa@sb6sc{sg9si!ss$st+ -sa@sb6sc{sg9si!ss$st+sx% -sa@sb6sc{sg9si!ss$st7 -sa@sb6sc{sg9si!ss$st7sx% -sa@sb6sc{sg9si!ss$sx% -sa@sb6sc{sg9si!ss5 -sa@sb6sc{sg9si!ss5st+ -sa@sb6sc{sg9si!ss5st+sx% -sa@sb6sc{sg9si!ss5st7 -sa@sb6sc{sg9si!ss5st7sx% -sa@sb6sc{sg9si!ss5sx% -sa@sb6sc{sg9si!st+ -sa@sb6sc{sg9si!st+sx% -sa@sb6sc{sg9si!st7 -sa@sb6sc{sg9si!st7sx% -sa@sb6sc{sg9si!sx% -sa@sb6sc{sg9si1 -sa@sb6sc{sg9si1so0 -sa@sb6sc{sg9si1so0sq9 -sa@sb6sc{sg9si1so0sq9ss$ -sa@sb6sc{sg9si1so0sq9ss$st+ -sa@sb6sc{sg9si1so0sq9ss$st+sx% -sa@sb6sc{sg9si1so0sq9ss$st7 -sa@sb6sc{sg9si1so0sq9ss$st7sx% -sa@sb6sc{sg9si1so0sq9ss$sx% -sa@sb6sc{sg9si1so0sq9ss5 -sa@sb6sc{sg9si1so0sq9ss5st+ -sa@sb6sc{sg9si1so0sq9ss5st+sx% -sa@sb6sc{sg9si1so0sq9ss5st7 -sa@sb6sc{sg9si1so0sq9ss5st7sx% -sa@sb6sc{sg9si1so0sq9ss5sx% -sa@sb6sc{sg9si1so0sq9st+ -sa@sb6sc{sg9si1so0sq9st+sx% -sa@sb6sc{sg9si1so0sq9st7 -sa@sb6sc{sg9si1so0sq9st7sx% -sa@sb6sc{sg9si1so0sq9sx% -sa@sb6sc{sg9si1so0ss$ -sa@sb6sc{sg9si1so0ss$st+ -sa@sb6sc{sg9si1so0ss$st+sx% -sa@sb6sc{sg9si1so0ss$st7 -sa@sb6sc{sg9si1so0ss$st7sx% -sa@sb6sc{sg9si1so0ss$sx% -sa@sb6sc{sg9si1so0ss5 -sa@sb6sc{sg9si1so0ss5st+ -sa@sb6sc{sg9si1so0ss5st+sx% -sa@sb6sc{sg9si1so0ss5st7 -sa@sb6sc{sg9si1so0ss5st7sx% -sa@sb6sc{sg9si1so0ss5sx% -sa@sb6sc{sg9si1so0st+ -sa@sb6sc{sg9si1so0st+sx% -sa@sb6sc{sg9si1so0st7 -sa@sb6sc{sg9si1so0st7sx% -sa@sb6sc{sg9si1so0sx% -sa@sb6sc{sg9si1sq9 -sa@sb6sc{sg9si1sq9ss$ -sa@sb6sc{sg9si1sq9ss$st+ -sa@sb6sc{sg9si1sq9ss$st+sx% -sa@sb6sc{sg9si1sq9ss$st7 -sa@sb6sc{sg9si1sq9ss$st7sx% -sa@sb6sc{sg9si1sq9ss$sx% -sa@sb6sc{sg9si1sq9ss5 -sa@sb6sc{sg9si1sq9ss5st+ -sa@sb6sc{sg9si1sq9ss5st+sx% -sa@sb6sc{sg9si1sq9ss5st7 -sa@sb6sc{sg9si1sq9ss5st7sx% -sa@sb6sc{sg9si1sq9ss5sx% -sa@sb6sc{sg9si1sq9st+ -sa@sb6sc{sg9si1sq9st+sx% -sa@sb6sc{sg9si1sq9st7 -sa@sb6sc{sg9si1sq9st7sx% -sa@sb6sc{sg9si1sq9sx% -sa@sb6sc{sg9si1ss$ -sa@sb6sc{sg9si1ss$st+ -sa@sb6sc{sg9si1ss$st+sx% -sa@sb6sc{sg9si1ss$st7 -sa@sb6sc{sg9si1ss$st7sx% -sa@sb6sc{sg9si1ss$sx% -sa@sb6sc{sg9si1ss5 -sa@sb6sc{sg9si1ss5st+ -sa@sb6sc{sg9si1ss5st+sx% -sa@sb6sc{sg9si1ss5st7 -sa@sb6sc{sg9si1ss5st7sx% -sa@sb6sc{sg9si1ss5sx% -sa@sb6sc{sg9si1st+ -sa@sb6sc{sg9si1st+sx% -sa@sb6sc{sg9si1st7 -sa@sb6sc{sg9si1st7sx% -sa@sb6sc{sg9si1sx% -sa@sb6sc{sg9so0 -sa@sb6sc{sg9so0sq9 -sa@sb6sc{sg9so0sq9ss$ -sa@sb6sc{sg9so0sq9ss$st+ -sa@sb6sc{sg9so0sq9ss$st+sx% -sa@sb6sc{sg9so0sq9ss$st7 -sa@sb6sc{sg9so0sq9ss$st7sx% -sa@sb6sc{sg9so0sq9ss$sx% -sa@sb6sc{sg9so0sq9ss5 -sa@sb6sc{sg9so0sq9ss5st+ -sa@sb6sc{sg9so0sq9ss5st+sx% -sa@sb6sc{sg9so0sq9ss5st7 -sa@sb6sc{sg9so0sq9ss5st7sx% -sa@sb6sc{sg9so0sq9ss5sx% -sa@sb6sc{sg9so0sq9st+ -sa@sb6sc{sg9so0sq9st+sx% -sa@sb6sc{sg9so0sq9st7 -sa@sb6sc{sg9so0sq9st7sx% -sa@sb6sc{sg9so0sq9sx% -sa@sb6sc{sg9so0ss$ -sa@sb6sc{sg9so0ss$st+ -sa@sb6sc{sg9so0ss$st+sx% -sa@sb6sc{sg9so0ss$st7 -sa@sb6sc{sg9so0ss$st7sx% -sa@sb6sc{sg9so0ss$sx% -sa@sb6sc{sg9so0ss5 -sa@sb6sc{sg9so0ss5st+ -sa@sb6sc{sg9so0ss5st+sx% -sa@sb6sc{sg9so0ss5st7 -sa@sb6sc{sg9so0ss5st7sx% -sa@sb6sc{sg9so0ss5sx% -sa@sb6sc{sg9so0st+ -sa@sb6sc{sg9so0st+sx% -sa@sb6sc{sg9so0st7 -sa@sb6sc{sg9so0st7sx% -sa@sb6sc{sg9so0sx% -sa@sb6sc{sg9sq9 -sa@sb6sc{sg9sq9ss$ -sa@sb6sc{sg9sq9ss$st+ -sa@sb6sc{sg9sq9ss$st+sx% -sa@sb6sc{sg9sq9ss$st7 -sa@sb6sc{sg9sq9ss$st7sx% -sa@sb6sc{sg9sq9ss$sx% -sa@sb6sc{sg9sq9ss5 -sa@sb6sc{sg9sq9ss5st+ -sa@sb6sc{sg9sq9ss5st+sx% -sa@sb6sc{sg9sq9ss5st7 -sa@sb6sc{sg9sq9ss5st7sx% -sa@sb6sc{sg9sq9ss5sx% -sa@sb6sc{sg9sq9st+ -sa@sb6sc{sg9sq9st+sx% -sa@sb6sc{sg9sq9st7 -sa@sb6sc{sg9sq9st7sx% -sa@sb6sc{sg9sq9sx% -sa@sb6sc{sg9ss$ -sa@sb6sc{sg9ss$st+ -sa@sb6sc{sg9ss$st+sx% -sa@sb6sc{sg9ss$st7 -sa@sb6sc{sg9ss$st7sx% -sa@sb6sc{sg9ss$sx% -sa@sb6sc{sg9ss5 -sa@sb6sc{sg9ss5st+ -sa@sb6sc{sg9ss5st+sx% -sa@sb6sc{sg9ss5st7 -sa@sb6sc{sg9ss5st7sx% -sa@sb6sc{sg9ss5sx% -sa@sb6sc{sg9st+ -sa@sb6sc{sg9st+sx% -sa@sb6sc{sg9st7 -sa@sb6sc{sg9st7sx% -sa@sb6sc{sg9sx% -sa@sb6sc{si! -sa@sb6sc{si!so0 -sa@sb6sc{si!so0sq9 -sa@sb6sc{si!so0sq9ss$ -sa@sb6sc{si!so0sq9ss$st+ -sa@sb6sc{si!so0sq9ss$st+sx% -sa@sb6sc{si!so0sq9ss$st7 -sa@sb6sc{si!so0sq9ss$st7sx% -sa@sb6sc{si!so0sq9ss$sx% -sa@sb6sc{si!so0sq9ss5 -sa@sb6sc{si!so0sq9ss5st+ -sa@sb6sc{si!so0sq9ss5st+sx% -sa@sb6sc{si!so0sq9ss5st7 -sa@sb6sc{si!so0sq9ss5st7sx% -sa@sb6sc{si!so0sq9ss5sx% -sa@sb6sc{si!so0sq9st+ -sa@sb6sc{si!so0sq9st+sx% -sa@sb6sc{si!so0sq9st7 -sa@sb6sc{si!so0sq9st7sx% -sa@sb6sc{si!so0sq9sx% -sa@sb6sc{si!so0ss$ -sa@sb6sc{si!so0ss$st+ -sa@sb6sc{si!so0ss$st+sx% -sa@sb6sc{si!so0ss$st7 -sa@sb6sc{si!so0ss$st7sx% -sa@sb6sc{si!so0ss$sx% -sa@sb6sc{si!so0ss5 -sa@sb6sc{si!so0ss5st+ -sa@sb6sc{si!so0ss5st+sx% -sa@sb6sc{si!so0ss5st7 -sa@sb6sc{si!so0ss5st7sx% -sa@sb6sc{si!so0ss5sx% -sa@sb6sc{si!so0st+ -sa@sb6sc{si!so0st+sx% -sa@sb6sc{si!so0st7 -sa@sb6sc{si!so0st7sx% -sa@sb6sc{si!so0sx% -sa@sb6sc{si!sq9 -sa@sb6sc{si!sq9ss$ -sa@sb6sc{si!sq9ss$st+ -sa@sb6sc{si!sq9ss$st+sx% -sa@sb6sc{si!sq9ss$st7 -sa@sb6sc{si!sq9ss$st7sx% -sa@sb6sc{si!sq9ss$sx% -sa@sb6sc{si!sq9ss5 -sa@sb6sc{si!sq9ss5st+ -sa@sb6sc{si!sq9ss5st+sx% -sa@sb6sc{si!sq9ss5st7 -sa@sb6sc{si!sq9ss5st7sx% -sa@sb6sc{si!sq9ss5sx% -sa@sb6sc{si!sq9st+ -sa@sb6sc{si!sq9st+sx% -sa@sb6sc{si!sq9st7 -sa@sb6sc{si!sq9st7sx% -sa@sb6sc{si!sq9sx% -sa@sb6sc{si!ss$ -sa@sb6sc{si!ss$st+ -sa@sb6sc{si!ss$st+sx% -sa@sb6sc{si!ss$st7 -sa@sb6sc{si!ss$st7sx% -sa@sb6sc{si!ss$sx% -sa@sb6sc{si!ss5 -sa@sb6sc{si!ss5st+ -sa@sb6sc{si!ss5st+sx% -sa@sb6sc{si!ss5st7 -sa@sb6sc{si!ss5st7sx% -sa@sb6sc{si!ss5sx% -sa@sb6sc{si!st+ -sa@sb6sc{si!st+sx% -sa@sb6sc{si!st7 -sa@sb6sc{si!st7sx% -sa@sb6sc{si!sx% -sa@sb6sc{si1 -sa@sb6sc{si1so0 -sa@sb6sc{si1so0sq9 -sa@sb6sc{si1so0sq9ss$ -sa@sb6sc{si1so0sq9ss$st+ -sa@sb6sc{si1so0sq9ss$st+sx% -sa@sb6sc{si1so0sq9ss$st7 -sa@sb6sc{si1so0sq9ss$st7sx% -sa@sb6sc{si1so0sq9ss$sx% -sa@sb6sc{si1so0sq9ss5 -sa@sb6sc{si1so0sq9ss5st+ -sa@sb6sc{si1so0sq9ss5st+sx% -sa@sb6sc{si1so0sq9ss5st7 -sa@sb6sc{si1so0sq9ss5st7sx% -sa@sb6sc{si1so0sq9ss5sx% -sa@sb6sc{si1so0sq9st+ -sa@sb6sc{si1so0sq9st+sx% -sa@sb6sc{si1so0sq9st7 -sa@sb6sc{si1so0sq9st7sx% -sa@sb6sc{si1so0sq9sx% -sa@sb6sc{si1so0ss$ -sa@sb6sc{si1so0ss$st+ -sa@sb6sc{si1so0ss$st+sx% -sa@sb6sc{si1so0ss$st7 -sa@sb6sc{si1so0ss$st7sx% -sa@sb6sc{si1so0ss$sx% -sa@sb6sc{si1so0ss5 -sa@sb6sc{si1so0ss5st+ -sa@sb6sc{si1so0ss5st+sx% -sa@sb6sc{si1so0ss5st7 -sa@sb6sc{si1so0ss5st7sx% -sa@sb6sc{si1so0ss5sx% -sa@sb6sc{si1so0st+ -sa@sb6sc{si1so0st+sx% -sa@sb6sc{si1so0st7 -sa@sb6sc{si1so0st7sx% -sa@sb6sc{si1so0sx% -sa@sb6sc{si1sq9 -sa@sb6sc{si1sq9ss$ -sa@sb6sc{si1sq9ss$st+ -sa@sb6sc{si1sq9ss$st+sx% -sa@sb6sc{si1sq9ss$st7 -sa@sb6sc{si1sq9ss$st7sx% -sa@sb6sc{si1sq9ss$sx% -sa@sb6sc{si1sq9ss5 -sa@sb6sc{si1sq9ss5st+ -sa@sb6sc{si1sq9ss5st+sx% -sa@sb6sc{si1sq9ss5st7 -sa@sb6sc{si1sq9ss5st7sx% -sa@sb6sc{si1sq9ss5sx% -sa@sb6sc{si1sq9st+ -sa@sb6sc{si1sq9st+sx% -sa@sb6sc{si1sq9st7 -sa@sb6sc{si1sq9st7sx% -sa@sb6sc{si1sq9sx% -sa@sb6sc{si1ss$ -sa@sb6sc{si1ss$st+ -sa@sb6sc{si1ss$st+sx% -sa@sb6sc{si1ss$st7 -sa@sb6sc{si1ss$st7sx% -sa@sb6sc{si1ss$sx% -sa@sb6sc{si1ss5 -sa@sb6sc{si1ss5st+ -sa@sb6sc{si1ss5st+sx% -sa@sb6sc{si1ss5st7 -sa@sb6sc{si1ss5st7sx% -sa@sb6sc{si1ss5sx% -sa@sb6sc{si1st+ -sa@sb6sc{si1st+sx% -sa@sb6sc{si1st7 -sa@sb6sc{si1st7sx% -sa@sb6sc{si1sx% -sa@sb6sc{so0 -sa@sb6sc{so0sq9 -sa@sb6sc{so0sq9ss$ -sa@sb6sc{so0sq9ss$st+ -sa@sb6sc{so0sq9ss$st+sx% -sa@sb6sc{so0sq9ss$st7 -sa@sb6sc{so0sq9ss$st7sx% -sa@sb6sc{so0sq9ss$sx% -sa@sb6sc{so0sq9ss5 -sa@sb6sc{so0sq9ss5st+ -sa@sb6sc{so0sq9ss5st+sx% -sa@sb6sc{so0sq9ss5st7 -sa@sb6sc{so0sq9ss5st7sx% -sa@sb6sc{so0sq9ss5sx% -sa@sb6sc{so0sq9st+ -sa@sb6sc{so0sq9st+sx% -sa@sb6sc{so0sq9st7 -sa@sb6sc{so0sq9st7sx% -sa@sb6sc{so0sq9sx% -sa@sb6sc{so0ss$ -sa@sb6sc{so0ss$st+ -sa@sb6sc{so0ss$st+sx% -sa@sb6sc{so0ss$st7 -sa@sb6sc{so0ss$st7sx% -sa@sb6sc{so0ss$sx% -sa@sb6sc{so0ss5 -sa@sb6sc{so0ss5st+ -sa@sb6sc{so0ss5st+sx% -sa@sb6sc{so0ss5st7 -sa@sb6sc{so0ss5st7sx% -sa@sb6sc{so0ss5sx% -sa@sb6sc{so0st+ -sa@sb6sc{so0st+sx% -sa@sb6sc{so0st7 -sa@sb6sc{so0st7sx% -sa@sb6sc{so0sx% -sa@sb6sc{sq9 -sa@sb6sc{sq9ss$ -sa@sb6sc{sq9ss$st+ -sa@sb6sc{sq9ss$st+sx% -sa@sb6sc{sq9ss$st7 -sa@sb6sc{sq9ss$st7sx% -sa@sb6sc{sq9ss$sx% -sa@sb6sc{sq9ss5 -sa@sb6sc{sq9ss5st+ -sa@sb6sc{sq9ss5st+sx% -sa@sb6sc{sq9ss5st7 -sa@sb6sc{sq9ss5st7sx% -sa@sb6sc{sq9ss5sx% -sa@sb6sc{sq9st+ -sa@sb6sc{sq9st+sx% -sa@sb6sc{sq9st7 -sa@sb6sc{sq9st7sx% -sa@sb6sc{sq9sx% -sa@sb6sc{ss$ -sa@sb6sc{ss$st+ -sa@sb6sc{ss$st+sx% -sa@sb6sc{ss$st7 -sa@sb6sc{ss$st7sx% -sa@sb6sc{ss$sx% -sa@sb6sc{ss5 -sa@sb6sc{ss5st+ -sa@sb6sc{ss5st+sx% -sa@sb6sc{ss5st7 -sa@sb6sc{ss5st7sx% -sa@sb6sc{ss5sx% -sa@sb6sc{st+ -sa@sb6sc{st+sx% -sa@sb6sc{st7 -sa@sb6sc{st7sx% -sa@sb6sc{sx% -sa@sb6sc< -sa@sb6sc -$1$9$9$0$? -$1$9$9$0$@ -$1$9$9$0$[ -$1$9$9$0$\ -$1$9$9$0$] -$1$9$9$0$^ -$1$9$9$0$_ -$1$9$9$0$` -$1$9$9$0${ -$1$9$9$0$| -$1$9$9$0$} -$1$9$9$0$~ -$1$9$9$1 -$1$9$9$1$ -$1$9$9$1$! -$1$9$9$1$" -$1$9$9$1$# -$1$9$9$1$$ -$1$9$9$1$% -$1$9$9$1$& -$1$9$9$1$' -$1$9$9$1$( -$1$9$9$1$) -$1$9$9$1$* -$1$9$9$1$+ -$1$9$9$1$, -$1$9$9$1$- -$1$9$9$1$. -$1$9$9$1$/ -$1$9$9$1$: -$1$9$9$1$; -$1$9$9$1$< -$1$9$9$1$= -$1$9$9$1$> -$1$9$9$1$? -$1$9$9$1$@ -$1$9$9$1$[ -$1$9$9$1$\ -$1$9$9$1$] -$1$9$9$1$^ -$1$9$9$1$_ -$1$9$9$1$` -$1$9$9$1${ -$1$9$9$1$| -$1$9$9$1$} -$1$9$9$1$~ -$1$9$9$2 -$1$9$9$2$ -$1$9$9$2$! -$1$9$9$2$" -$1$9$9$2$# -$1$9$9$2$$ -$1$9$9$2$% -$1$9$9$2$& -$1$9$9$2$' -$1$9$9$2$( -$1$9$9$2$) -$1$9$9$2$* -$1$9$9$2$+ -$1$9$9$2$, -$1$9$9$2$- -$1$9$9$2$. -$1$9$9$2$/ -$1$9$9$2$: -$1$9$9$2$; -$1$9$9$2$< -$1$9$9$2$= -$1$9$9$2$> -$1$9$9$2$? -$1$9$9$2$@ -$1$9$9$2$[ -$1$9$9$2$\ -$1$9$9$2$] -$1$9$9$2$^ -$1$9$9$2$_ -$1$9$9$2$` -$1$9$9$2${ -$1$9$9$2$| -$1$9$9$2$} -$1$9$9$2$~ -$1$9$9$3 -$1$9$9$3$ -$1$9$9$3$! -$1$9$9$3$" -$1$9$9$3$# -$1$9$9$3$$ -$1$9$9$3$% -$1$9$9$3$& -$1$9$9$3$' -$1$9$9$3$( -$1$9$9$3$) -$1$9$9$3$* -$1$9$9$3$+ -$1$9$9$3$, -$1$9$9$3$- -$1$9$9$3$. -$1$9$9$3$/ -$1$9$9$3$: -$1$9$9$3$; -$1$9$9$3$< -$1$9$9$3$= -$1$9$9$3$> -$1$9$9$3$? -$1$9$9$3$@ -$1$9$9$3$[ -$1$9$9$3$\ -$1$9$9$3$] -$1$9$9$3$^ -$1$9$9$3$_ -$1$9$9$3$` -$1$9$9$3${ -$1$9$9$3$| -$1$9$9$3$} -$1$9$9$3$~ -$1$9$9$4 -$1$9$9$4$ -$1$9$9$4$! -$1$9$9$4$" -$1$9$9$4$# -$1$9$9$4$$ -$1$9$9$4$% -$1$9$9$4$& -$1$9$9$4$' -$1$9$9$4$( -$1$9$9$4$) -$1$9$9$4$* -$1$9$9$4$+ -$1$9$9$4$, -$1$9$9$4$- -$1$9$9$4$. -$1$9$9$4$/ -$1$9$9$4$: -$1$9$9$4$; -$1$9$9$4$< -$1$9$9$4$= -$1$9$9$4$> -$1$9$9$4$? -$1$9$9$4$@ -$1$9$9$4$[ -$1$9$9$4$\ -$1$9$9$4$] -$1$9$9$4$^ -$1$9$9$4$_ -$1$9$9$4$` -$1$9$9$4${ -$1$9$9$4$| -$1$9$9$4$} -$1$9$9$4$~ -$1$9$9$5 -$1$9$9$5$ -$1$9$9$5$! -$1$9$9$5$" -$1$9$9$5$# -$1$9$9$5$$ -$1$9$9$5$% -$1$9$9$5$& -$1$9$9$5$' -$1$9$9$5$( -$1$9$9$5$) -$1$9$9$5$* -$1$9$9$5$+ -$1$9$9$5$, -$1$9$9$5$- -$1$9$9$5$. -$1$9$9$5$/ -$1$9$9$5$: -$1$9$9$5$; -$1$9$9$5$< -$1$9$9$5$= -$1$9$9$5$> -$1$9$9$5$? -$1$9$9$5$@ -$1$9$9$5$[ -$1$9$9$5$\ -$1$9$9$5$] -$1$9$9$5$^ -$1$9$9$5$_ -$1$9$9$5$` -$1$9$9$5${ -$1$9$9$5$| -$1$9$9$5$} -$1$9$9$5$~ -$1$9$9$6 -$1$9$9$6$ -$1$9$9$6$! -$1$9$9$6$" -$1$9$9$6$# -$1$9$9$6$$ -$1$9$9$6$% -$1$9$9$6$& -$1$9$9$6$' -$1$9$9$6$( -$1$9$9$6$) -$1$9$9$6$* -$1$9$9$6$+ -$1$9$9$6$, -$1$9$9$6$- -$1$9$9$6$. -$1$9$9$6$/ -$1$9$9$6$: -$1$9$9$6$; -$1$9$9$6$< -$1$9$9$6$= -$1$9$9$6$> -$1$9$9$6$? -$1$9$9$6$@ -$1$9$9$6$[ -$1$9$9$6$\ -$1$9$9$6$] -$1$9$9$6$^ -$1$9$9$6$_ -$1$9$9$6$` -$1$9$9$6${ -$1$9$9$6$| -$1$9$9$6$} -$1$9$9$6$~ -$1$9$9$7 -$1$9$9$7$ -$1$9$9$7$! -$1$9$9$7$" -$1$9$9$7$# -$1$9$9$7$$ -$1$9$9$7$% -$1$9$9$7$& -$1$9$9$7$' -$1$9$9$7$( -$1$9$9$7$) -$1$9$9$7$* -$1$9$9$7$+ -$1$9$9$7$, -$1$9$9$7$- -$1$9$9$7$. -$1$9$9$7$/ -$1$9$9$7$: -$1$9$9$7$; -$1$9$9$7$< -$1$9$9$7$= -$1$9$9$7$> -$1$9$9$7$? -$1$9$9$7$@ -$1$9$9$7$[ -$1$9$9$7$\ -$1$9$9$7$] -$1$9$9$7$^ -$1$9$9$7$_ -$1$9$9$7$` -$1$9$9$7${ -$1$9$9$7$| -$1$9$9$7$} -$1$9$9$7$~ -$1$9$9$8$! -$1$9$9$8$" -$1$9$9$8$# -$1$9$9$8$$ -$1$9$9$8$% -$1$9$9$8$& -$1$9$9$8$' -$1$9$9$8$( -$1$9$9$8$) -$1$9$9$8$* -$1$9$9$8$+ -$1$9$9$8$, -$1$9$9$8$- -$1$9$9$8$. -$1$9$9$8$/ -$1$9$9$8$: -$1$9$9$8$; -$1$9$9$8$< -$1$9$9$8$= -$1$9$9$8$> -$1$9$9$8$? -$1$9$9$8$@ -$1$9$9$8$A -$1$9$9$8$A$B -$1$9$9$8$[ -$1$9$9$8$\ -$1$9$9$8$] -$1$9$9$8$^ -$1$9$9$8$_ -$1$9$9$8$` -$1$9$9$8${ -$1$9$9$8$| -$1$9$9$8$} -$1$9$9$8$~ -$1$9$9$9 -$1$9$9$9$ -$1$9$9$9$! -$1$9$9$9$" -$1$9$9$9$# -$1$9$9$9$$ -$1$9$9$9$% -$1$9$9$9$& -$1$9$9$9$' -$1$9$9$9$( -$1$9$9$9$) -$1$9$9$9$* -$1$9$9$9$+ -$1$9$9$9$, -$1$9$9$9$- -$1$9$9$9$. -$1$9$9$9$/ -$1$9$9$9$: -$1$9$9$9$; -$1$9$9$9$< -$1$9$9$9$= -$1$9$9$9$> -$1$9$9$9$? -$1$9$9$9$@ -$1$9$9$9$[ -$1$9$9$9$\ -$1$9$9$9$] -$1$9$9$9$^ -$1$9$9$9$_ -$1$9$9$9$` -$1$9$9$9${ -$1$9$9$9$| -$1$9$9$9$} -$1$9$9$9$~ -$1$@ -$1$_ -$1Z1 -$1l +$1 $# +$1 $$ +$1 $* +$1 $- +$1 $. +$1 $0 $! +$1 $0 $0 +$1 $0 $0 $% +$1 $0 $1 +$1 $1 $! +$1 $1 $1 $1 $1 $1 +$1 $1 $1 $1 $1 $1 $1 +$1 $1 $1 $1 $1 $1 $1 $1 +$1 $1 $1 $1 $1 $1 $1 $1 $1 +$1 $1 $1 $1 $1 $1 $1 $1 $1 $1 +$1 $1 $1 $1 $1 $1 $1 $1 $1 $1 $1 +$1 $1 $1 $1 $1 $1 $1 $1 $1 $1 $1 $1 +$1 $1 $2 +$1 $1 $2 $3 +$1 $2 $! +$1 $2 $. +$1 $2 $1 +$1 $2 $3 $! +$1 $2 $3 $# +$1 $2 $3 $$ +$1 $2 $3 $* +$1 $2 $3 $1 +$1 $2 $3 $1 $2 $3 +$1 $2 $3 $4 $! +$1 $2 $3 $@ +$1 $2 $3 $_ +z3 x13 +$1 $2 $@ +$1 $3 $! +$1 $3 $1 $4 +$1 $4 $! +$1 $4 $3 +$1 $5 $! +$1 $6 $! +$1 $7 $! +$1 $8 $! +$1 $9 $7 $6 +$1 $9 $7 $7 +$1 $9 $7 $8 +$1 $9 $7 $9 +$1 $9 $8 $0 +$1 $9 $8 $1 +$1 $9 $8 $2 +$1 $9 $8 $5 +$1 $9 $8 $6 +$1 $9 $8 $7 +$1 $9 $8 $8 +$1 $9 $8 $9 +$1 $9 $9 $0 +$1 $9 $9 $0 $! +$1 $9 $9 $0 $" +$1 $9 $9 $0 $# +$1 $9 $9 $0 $$ +$1 $9 $9 $0 $% +$1 $9 $9 $0 $& +$1 $9 $9 $0 $' +$1 $9 $9 $0 $( +$1 $9 $9 $0 $) +$1 $9 $9 $0 $* +$1 $9 $9 $0 $+ +$1 $9 $9 $0 $, +$1 $9 $9 $0 $- +$1 $9 $9 $0 $. +$1 $9 $9 $0 $/ +$1 $9 $9 $0 $: +$1 $9 $9 $0 $; +$1 $9 $9 $0 $< +$1 $9 $9 $0 $= +$1 $9 $9 $0 $> +$1 $9 $9 $0 $? +$1 $9 $9 $0 $@ +$1 $9 $9 $0 $[ +$1 $9 $9 $0 $\ +$1 $9 $9 $0 $] +$1 $9 $9 $0 $^ +$1 $9 $9 $0 $_ +$1 $9 $9 $0 $` +$1 $9 $9 $0 ${ +$1 $9 $9 $0 $| +$1 $9 $9 $0 $} +$1 $9 $9 $0 $~ +$1 $9 $9 $1 +$1 $9 $9 $1 $ +$1 $9 $9 $1 $! +$1 $9 $9 $1 $" +$1 $9 $9 $1 $# +$1 $9 $9 $1 $$ +$1 $9 $9 $1 $% +$1 $9 $9 $1 $& +$1 $9 $9 $1 $' +$1 $9 $9 $1 $( +$1 $9 $9 $1 $) +$1 $9 $9 $1 $* +$1 $9 $9 $1 $+ +$1 $9 $9 $1 $, +$1 $9 $9 $1 $- +$1 $9 $9 $1 $. +$1 $9 $9 $1 $/ +$1 $9 $9 $1 $: +$1 $9 $9 $1 $; +$1 $9 $9 $1 $< +$1 $9 $9 $1 $= +$1 $9 $9 $1 $> +$1 $9 $9 $1 $? +$1 $9 $9 $1 $@ +$1 $9 $9 $1 $[ +$1 $9 $9 $1 $\ +$1 $9 $9 $1 $] +$1 $9 $9 $1 $^ +$1 $9 $9 $1 $_ +$1 $9 $9 $1 $` +$1 $9 $9 $1 ${ +$1 $9 $9 $1 $| +$1 $9 $9 $1 $} +$1 $9 $9 $1 $~ +$1 $9 $9 $2 +$1 $9 $9 $2 $ +$1 $9 $9 $2 $! +$1 $9 $9 $2 $" +$1 $9 $9 $2 $# +$1 $9 $9 $2 $$ +$1 $9 $9 $2 $% +$1 $9 $9 $2 $& +$1 $9 $9 $2 $' +$1 $9 $9 $2 $( +$1 $9 $9 $2 $) +$1 $9 $9 $2 $* +$1 $9 $9 $2 $+ +$1 $9 $9 $2 $, +$1 $9 $9 $2 $- +$1 $9 $9 $2 $. +$1 $9 $9 $2 $/ +$1 $9 $9 $2 $: +$1 $9 $9 $2 $; +$1 $9 $9 $2 $< +$1 $9 $9 $2 $= +$1 $9 $9 $2 $> +$1 $9 $9 $2 $? +$1 $9 $9 $2 $@ +$1 $9 $9 $2 $[ +$1 $9 $9 $2 $\ +$1 $9 $9 $2 $] +$1 $9 $9 $2 $^ +$1 $9 $9 $2 $_ +$1 $9 $9 $2 $` +$1 $9 $9 $2 ${ +$1 $9 $9 $2 $| +$1 $9 $9 $2 $} +$1 $9 $9 $2 $~ +$1 $9 $9 $3 +$1 $9 $9 $3 $ +$1 $9 $9 $3 $! +$1 $9 $9 $3 $" +$1 $9 $9 $3 $# +$1 $9 $9 $3 $$ +$1 $9 $9 $3 $% +$1 $9 $9 $3 $& +$1 $9 $9 $3 $' +$1 $9 $9 $3 $( +$1 $9 $9 $3 $) +$1 $9 $9 $3 $* +$1 $9 $9 $3 $+ +$1 $9 $9 $3 $, +$1 $9 $9 $3 $- +$1 $9 $9 $3 $. +$1 $9 $9 $3 $/ +$1 $9 $9 $3 $: +$1 $9 $9 $3 $; +$1 $9 $9 $3 $< +$1 $9 $9 $3 $= +$1 $9 $9 $3 $> +$1 $9 $9 $3 $? +$1 $9 $9 $3 $@ +$1 $9 $9 $3 $[ +$1 $9 $9 $3 $\ +$1 $9 $9 $3 $] +$1 $9 $9 $3 $^ +$1 $9 $9 $3 $_ +$1 $9 $9 $3 $` +$1 $9 $9 $3 ${ +$1 $9 $9 $3 $| +$1 $9 $9 $3 $} +$1 $9 $9 $3 $~ +$1 $9 $9 $4 +$1 $9 $9 $4 $ +$1 $9 $9 $4 $! +$1 $9 $9 $4 $" +$1 $9 $9 $4 $# +$1 $9 $9 $4 $$ +$1 $9 $9 $4 $% +$1 $9 $9 $4 $& +$1 $9 $9 $4 $' +$1 $9 $9 $4 $( +$1 $9 $9 $4 $) +$1 $9 $9 $4 $* +$1 $9 $9 $4 $+ +$1 $9 $9 $4 $, +$1 $9 $9 $4 $- +$1 $9 $9 $4 $. +$1 $9 $9 $4 $/ +$1 $9 $9 $4 $: +$1 $9 $9 $4 $; +$1 $9 $9 $4 $< +$1 $9 $9 $4 $= +$1 $9 $9 $4 $> +$1 $9 $9 $4 $? +$1 $9 $9 $4 $@ +$1 $9 $9 $4 $[ +$1 $9 $9 $4 $\ +$1 $9 $9 $4 $] +$1 $9 $9 $4 $^ +$1 $9 $9 $4 $_ +$1 $9 $9 $4 $` +$1 $9 $9 $4 ${ +$1 $9 $9 $4 $| +$1 $9 $9 $4 $} +$1 $9 $9 $4 $~ +$1 $9 $9 $5 $ +$1 $9 $9 $5 $! +$1 $9 $9 $5 $" +$1 $9 $9 $5 $# +$1 $9 $9 $5 $$ +$1 $9 $9 $5 $% +$1 $9 $9 $5 $& +$1 $9 $9 $5 $' +$1 $9 $9 $5 $( +$1 $9 $9 $5 $) +$1 $9 $9 $5 $* +$1 $9 $9 $5 $+ +$1 $9 $9 $5 $, +$1 $9 $9 $5 $- +$1 $9 $9 $5 $. +$1 $9 $9 $5 $/ +$1 $9 $9 $5 $: +$1 $9 $9 $5 $; +$1 $9 $9 $5 $< +$1 $9 $9 $5 $= +$1 $9 $9 $5 $> +$1 $9 $9 $5 $? +$1 $9 $9 $5 $@ +$1 $9 $9 $5 $[ +$1 $9 $9 $5 $\ +$1 $9 $9 $5 $] +$1 $9 $9 $5 $^ +$1 $9 $9 $5 $_ +$1 $9 $9 $5 $` +$1 $9 $9 $5 ${ +$1 $9 $9 $5 $| +$1 $9 $9 $5 $} +$1 $9 $9 $5 $~ +$1 $9 $9 $6 +$1 $9 $9 $6 $ +$1 $9 $9 $6 $! +$1 $9 $9 $6 $" +$1 $9 $9 $6 $# +$1 $9 $9 $6 $$ +$1 $9 $9 $6 $% +$1 $9 $9 $6 $& +$1 $9 $9 $6 $' +$1 $9 $9 $6 $( +$1 $9 $9 $6 $) +$1 $9 $9 $6 $* +$1 $9 $9 $6 $+ +$1 $9 $9 $6 $, +$1 $9 $9 $6 $- +$1 $9 $9 $6 $. +$1 $9 $9 $6 $/ +$1 $9 $9 $6 $: +$1 $9 $9 $6 $; +$1 $9 $9 $6 $< +$1 $9 $9 $6 $= +$1 $9 $9 $6 $> +$1 $9 $9 $6 $? +$1 $9 $9 $6 $@ +$1 $9 $9 $6 $[ +$1 $9 $9 $6 $\ +$1 $9 $9 $6 $] +$1 $9 $9 $6 $^ +$1 $9 $9 $6 $_ +$1 $9 $9 $6 $` +$1 $9 $9 $6 ${ +$1 $9 $9 $6 $| +$1 $9 $9 $6 $} +$1 $9 $9 $6 $~ +$1 $9 $9 $7 +$1 $9 $9 $7 $ +$1 $9 $9 $7 $! +$1 $9 $9 $7 $" +$1 $9 $9 $7 $# +$1 $9 $9 $7 $$ +$1 $9 $9 $7 $% +$1 $9 $9 $7 $& +$1 $9 $9 $7 $' +$1 $9 $9 $7 $( +$1 $9 $9 $7 $) +$1 $9 $9 $7 $* +$1 $9 $9 $7 $+ +$1 $9 $9 $7 $, +$1 $9 $9 $7 $- +$1 $9 $9 $7 $. +$1 $9 $9 $7 $/ +$1 $9 $9 $7 $: +$1 $9 $9 $7 $; +$1 $9 $9 $7 $< +$1 $9 $9 $7 $= +$1 $9 $9 $7 $> +$1 $9 $9 $7 $? +$1 $9 $9 $7 $@ +$1 $9 $9 $7 $[ +$1 $9 $9 $7 $\ +$1 $9 $9 $7 $] +$1 $9 $9 $7 $^ +$1 $9 $9 $7 $_ +$1 $9 $9 $7 $` +$1 $9 $9 $7 ${ +$1 $9 $9 $7 $| +$1 $9 $9 $7 $} +$1 $9 $9 $7 $~ +$1 $9 $9 $8 $! +$1 $9 $9 $8 $" +$1 $9 $9 $8 $# +$1 $9 $9 $8 $$ +$1 $9 $9 $8 $% +$1 $9 $9 $8 $& +$1 $9 $9 $8 $' +$1 $9 $9 $8 $( +$1 $9 $9 $8 $) +$1 $9 $9 $8 $* +$1 $9 $9 $8 $+ +$1 $9 $9 $8 $, +$1 $9 $9 $8 $- +$1 $9 $9 $8 $. +$1 $9 $9 $8 $/ +$1 $9 $9 $8 $: +$1 $9 $9 $8 $; +$1 $9 $9 $8 $< +$1 $9 $9 $8 $= +$1 $9 $9 $8 $> +$1 $9 $9 $8 $? +$1 $9 $9 $8 $@ +$1 $9 $9 $8 $A +$1 $9 $9 $8 $A $B +$1 $9 $9 $8 $[ +$1 $9 $9 $8 $\ +$1 $9 $9 $8 $] +$1 $9 $9 $8 $^ +$1 $9 $9 $8 $_ +$1 $9 $9 $8 $` +$1 $9 $9 $8 ${ +$1 $9 $9 $8 $| +$1 $9 $9 $8 $} +$1 $9 $9 $8 $~ +$1 $9 $9 $9 +$1 $9 $9 $9 $ +$1 $9 $9 $9 $! +$1 $9 $9 $9 $" +$1 $9 $9 $9 $# +$1 $9 $9 $9 $$ +$1 $9 $9 $9 $% +$1 $9 $9 $9 $& +$1 $9 $9 $9 $' +$1 $9 $9 $9 $( +$1 $9 $9 $9 $) +$1 $9 $9 $9 $* +$1 $9 $9 $9 $+ +$1 $9 $9 $9 $, +$1 $9 $9 $9 $- +$1 $9 $9 $9 $. +$1 $9 $9 $9 $/ +$1 $9 $9 $9 $: +$1 $9 $9 $9 $; +$1 $9 $9 $9 $< +$1 $9 $9 $9 $= +$1 $9 $9 $9 $> +$1 $9 $9 $9 $? +$1 $9 $9 $9 $@ +$1 $9 $9 $9 $[ +$1 $9 $9 $9 $\ +$1 $9 $9 $9 $] +$1 $9 $9 $9 $^ +$1 $9 $9 $9 $_ +$1 $9 $9 $9 $` +$1 $9 $9 $9 ${ +$1 $9 $9 $9 $| +$1 $9 $9 $9 $} +$1 $9 $9 $9 $~ +$1 $@ +$1 $_ +$1 l $2 $2 $0 $2 $0 $0 $0 @@ -834,1739 +792,1724 @@ $2 $6 $2 $7 $2 $8 $2 $9 -$2$! -$2$. -$2$0 -$2$0$0 -$2$0$0$0 -$2$0$0$0$ -$2$0$0$0$! -$2$0$0$0$" -$2$0$0$0$# -$2$0$0$0$$ -$2$0$0$0$% -$2$0$0$0$& -$2$0$0$0$' -$2$0$0$0$( -$2$0$0$0$) -$2$0$0$0$* -$2$0$0$0$+ -$2$0$0$0$, -$2$0$0$0$- -$2$0$0$0$. -$2$0$0$0$/ -$2$0$0$0$: -$2$0$0$0$; -$2$0$0$0$< -$2$0$0$0$= -$2$0$0$0$> -$2$0$0$0$? -$2$0$0$0$@ -$2$0$0$0$[ -$2$0$0$0$\ -$2$0$0$0$] -$2$0$0$0$^ -$2$0$0$0$_ -$2$0$0$0$` -$2$0$0$0${ -$2$0$0$0$| -$2$0$0$0$} -$2$0$0$0$~ -$2$0$0$1 -$2$0$0$1$ -$2$0$0$1$! -$2$0$0$1$" -$2$0$0$1$# -$2$0$0$1$$ -$2$0$0$1$% -$2$0$0$1$& -$2$0$0$1$' -$2$0$0$1$( -$2$0$0$1$) -$2$0$0$1$* -$2$0$0$1$+ -$2$0$0$1$, -$2$0$0$1$- -$2$0$0$1$. -$2$0$0$1$/ -$2$0$0$1$: -$2$0$0$1$; -$2$0$0$1$< -$2$0$0$1$= -$2$0$0$1$> -$2$0$0$1$? -$2$0$0$1$@ -$2$0$0$1$[ -$2$0$0$1$\ -$2$0$0$1$] -$2$0$0$1$^ -$2$0$0$1$_ -$2$0$0$1$` -$2$0$0$1${ -$2$0$0$1$| -$2$0$0$1$} -$2$0$0$1$~ -$2$0$0$2 -$2$0$0$2$ -$2$0$0$2$! -$2$0$0$2$" -$2$0$0$2$# -$2$0$0$2$$ -$2$0$0$2$% -$2$0$0$2$& -$2$0$0$2$' -$2$0$0$2$( -$2$0$0$2$) -$2$0$0$2$* -$2$0$0$2$+ -$2$0$0$2$, -$2$0$0$2$- -$2$0$0$2$. -$2$0$0$2$/ -$2$0$0$2$: -$2$0$0$2$; -$2$0$0$2$< -$2$0$0$2$= -$2$0$0$2$> -$2$0$0$2$? -$2$0$0$2$@ -$2$0$0$2$[ -$2$0$0$2$\ -$2$0$0$2$] -$2$0$0$2$^ -$2$0$0$2$_ -$2$0$0$2$` -$2$0$0$2${ -$2$0$0$2$| -$2$0$0$2$} -$2$0$0$2$~ -$2$0$0$3 -$2$0$0$3$ -$2$0$0$3$! -$2$0$0$3$" -$2$0$0$3$# -$2$0$0$3$$ -$2$0$0$3$% -$2$0$0$3$& -$2$0$0$3$' -$2$0$0$3$( -$2$0$0$3$) -$2$0$0$3$* -$2$0$0$3$+ -$2$0$0$3$, -$2$0$0$3$- -$2$0$0$3$. -$2$0$0$3$/ -$2$0$0$3$: -$2$0$0$3$; -$2$0$0$3$< -$2$0$0$3$= -$2$0$0$3$> -$2$0$0$3$? -$2$0$0$3$@ -$2$0$0$3$[ -$2$0$0$3$\ -$2$0$0$3$] -$2$0$0$3$^ -$2$0$0$3$_ -$2$0$0$3$` -$2$0$0$3${ -$2$0$0$3$| -$2$0$0$3$} -$2$0$0$3$~ -$2$0$0$4 -$2$0$0$4$ -$2$0$0$4$! -$2$0$0$4$" -$2$0$0$4$# -$2$0$0$4$$ -$2$0$0$4$% -$2$0$0$4$& -$2$0$0$4$' -$2$0$0$4$( -$2$0$0$4$) -$2$0$0$4$* -$2$0$0$4$+ -$2$0$0$4$, -$2$0$0$4$- -$2$0$0$4$. -$2$0$0$4$/ -$2$0$0$4$: -$2$0$0$4$; -$2$0$0$4$< -$2$0$0$4$= -$2$0$0$4$> -$2$0$0$4$? -$2$0$0$4$@ -$2$0$0$4$[ -$2$0$0$4$\ -$2$0$0$4$] -$2$0$0$4$^ -$2$0$0$4$_ -$2$0$0$4$` -$2$0$0$4${ -$2$0$0$4$| -$2$0$0$4$} -$2$0$0$4$~ -$2$0$0$5 -$2$0$0$5$ -$2$0$0$5$! -$2$0$0$5$" -$2$0$0$5$# -$2$0$0$5$$ -$2$0$0$5$% -$2$0$0$5$& -$2$0$0$5$' -$2$0$0$5$( -$2$0$0$5$) -$2$0$0$5$* -$2$0$0$5$+ -$2$0$0$5$, -$2$0$0$5$- -$2$0$0$5$. -$2$0$0$5$/ -$2$0$0$5$: -$2$0$0$5$; -$2$0$0$5$< -$2$0$0$5$= -$2$0$0$5$> -$2$0$0$5$? -$2$0$0$5$@ -$2$0$0$5$[ -$2$0$0$5$\ -$2$0$0$5$] -$2$0$0$5$^ -$2$0$0$5$_ -$2$0$0$5$` -$2$0$0$5${ -$2$0$0$5$| -$2$0$0$5$} -$2$0$0$5$~ -$2$0$0$6 -$2$0$0$6$! -$2$0$0$6$" -$2$0$0$6$# -$2$0$0$6$$ -$2$0$0$6$% -$2$0$0$6$& -$2$0$0$6$' -$2$0$0$6$( -$2$0$0$6$) -$2$0$0$6$* -$2$0$0$6$+ -$2$0$0$6$, -$2$0$0$6$- -$2$0$0$6$. -$2$0$0$6$/ -$2$0$0$6$: -$2$0$0$6$; -$2$0$0$6$< -$2$0$0$6$= -$2$0$0$6$> -$2$0$0$6$? -$2$0$0$6$@ -$2$0$0$6$A -$2$0$0$6$B -$2$0$0$6$[ -$2$0$0$6$\ -$2$0$0$6$] -$2$0$0$6$^ -$2$0$0$6$_ -$2$0$0$6$` -$2$0$0$6${ -$2$0$0$6$| -$2$0$0$6$} -$2$0$0$6$~ -$2$0$0$7 -$2$0$0$7$ -$2$0$0$7$! -$2$0$0$7$" -$2$0$0$7$# -$2$0$0$7$$ -$2$0$0$7$% -$2$0$0$7$& -$2$0$0$7$' -$2$0$0$7$( -$2$0$0$7$) -$2$0$0$7$* -$2$0$0$7$+ -$2$0$0$7$, -$2$0$0$7$- -$2$0$0$7$. -$2$0$0$7$/ -$2$0$0$7$: -$2$0$0$7$; -$2$0$0$7$< -$2$0$0$7$= -$2$0$0$7$> -$2$0$0$7$? -$2$0$0$7$@ -$2$0$0$7$[ -$2$0$0$7$\ -$2$0$0$7$] -$2$0$0$7$^ -$2$0$0$7$_ -$2$0$0$7$` -$2$0$0$7${ -$2$0$0$7$| -$2$0$0$7$} -$2$0$0$7$~ -$2$0$0$8 -$2$0$0$8$ -$2$0$0$8$! -$2$0$0$8$" -$2$0$0$8$# -$2$0$0$8$$ -$2$0$0$8$% -$2$0$0$8$& -$2$0$0$8$' -$2$0$0$8$( -$2$0$0$8$) -$2$0$0$8$* -$2$0$0$8$+ -$2$0$0$8$, -$2$0$0$8$- -$2$0$0$8$. -$2$0$0$8$/ -$2$0$0$8$: -$2$0$0$8$; -$2$0$0$8$< -$2$0$0$8$= -$2$0$0$8$> -$2$0$0$8$? -$2$0$0$8$@ -$2$0$0$8$[ -$2$0$0$8$\ -$2$0$0$8$] -$2$0$0$8$^ -$2$0$0$8$_ -$2$0$0$8$` -$2$0$0$8${ -$2$0$0$8$| -$2$0$0$8$} -$2$0$0$8$~ -$2$0$0$9 -$2$0$0$9$ -$2$0$0$9$! -$2$0$0$9$" -$2$0$0$9$# -$2$0$0$9$$ -$2$0$0$9$% -$2$0$0$9$& -$2$0$0$9$' -$2$0$0$9$( -$2$0$0$9$) -$2$0$0$9$* -$2$0$0$9$+ -$2$0$0$9$, -$2$0$0$9$- -$2$0$0$9$. -$2$0$0$9$/ -$2$0$0$9$: -$2$0$0$9$; -$2$0$0$9$< -$2$0$0$9$= -$2$0$0$9$> -$2$0$0$9$? -$2$0$0$9$@ -$2$0$0$9$[ -$2$0$0$9$\ -$2$0$0$9$] -$2$0$0$9$^ -$2$0$0$9$_ -$2$0$0$9$` -$2$0$0$9${ -$2$0$0$9$| -$2$0$0$9$} -$2$0$0$9$~ -$2$0$1$0 -$2$0$1$0$ -$2$0$1$0$! -$2$0$1$0$" -$2$0$1$0$# -$2$0$1$0$$ -$2$0$1$0$% -$2$0$1$0$& -$2$0$1$0$' -$2$0$1$0$( -$2$0$1$0$) -$2$0$1$0$* -$2$0$1$0$+ -$2$0$1$0$, -$2$0$1$0$- -$2$0$1$0$. -$2$0$1$0$/ -$2$0$1$0$: -$2$0$1$0$; -$2$0$1$0$< -$2$0$1$0$= -$2$0$1$0$> -$2$0$1$0$? -$2$0$1$0$@ -$2$0$1$0$[ -$2$0$1$0$\ -$2$0$1$0$] -$2$0$1$0$^ -$2$0$1$0$_ -$2$0$1$0$` -$2$0$1$0${ -$2$0$1$0$| -$2$0$1$0$} -$2$0$1$0$~ -$2$0$1$1 -$2$0$1$1$ -$2$0$1$1$! -$2$0$1$1$" -$2$0$1$1$# -$2$0$1$1$$ -$2$0$1$1$% -$2$0$1$1$& -$2$0$1$1$' -$2$0$1$1$( -$2$0$1$1$) -$2$0$1$1$* -$2$0$1$1$+ -$2$0$1$1$, -$2$0$1$1$- -$2$0$1$1$. -$2$0$1$1$/ -$2$0$1$1$: -$2$0$1$1$; -$2$0$1$1$< -$2$0$1$1$= -$2$0$1$1$> -$2$0$1$1$? -$2$0$1$1$@ -$2$0$1$1$[ -$2$0$1$1$\ -$2$0$1$1$] -$2$0$1$1$^ -$2$0$1$1$_ -$2$0$1$1$` -$2$0$1$1${ -$2$0$1$1$| -$2$0$1$1$} -$2$0$1$1$~ -$2$0$1$2 -$2$0$1$2$ -$2$0$1$2$! -$2$0$1$2$" -$2$0$1$2$# -$2$0$1$2$$ -$2$0$1$2$% -$2$0$1$2$& -$2$0$1$2$' -$2$0$1$2$( -$2$0$1$2$) -$2$0$1$2$* -$2$0$1$2$+ -$2$0$1$2$, -$2$0$1$2$- -$2$0$1$2$. -$2$0$1$2$/ -$2$0$1$2$: -$2$0$1$2$; -$2$0$1$2$< -$2$0$1$2$= -$2$0$1$2$> -$2$0$1$2$? -$2$0$1$2$@ -$2$0$1$2$[ -$2$0$1$2$\ -$2$0$1$2$] -$2$0$1$2$^ -$2$0$1$2$_ -$2$0$1$2$` -$2$0$1$2${ -$2$0$1$2$| -$2$0$1$2$} -$2$0$1$2$~ -$2$0$1$3 -$2$0$1$3$ -$2$0$1$3$! -$2$0$1$3$" -$2$0$1$3$# -$2$0$1$3$$ -$2$0$1$3$% -$2$0$1$3$& -$2$0$1$3$' -$2$0$1$3$( -$2$0$1$3$) -$2$0$1$3$* -$2$0$1$3$+ -$2$0$1$3$, -$2$0$1$3$- -$2$0$1$3$. -$2$0$1$3$/ -$2$0$1$3$: -$2$0$1$3$; -$2$0$1$3$< -$2$0$1$3$= -$2$0$1$3$> -$2$0$1$3$? -$2$0$1$3$@ -$2$0$1$3$[ -$2$0$1$3$\ -$2$0$1$3$] -$2$0$1$3$^ -$2$0$1$3$_ -$2$0$1$3$` -$2$0$1$3${ -$2$0$1$3$| -$2$0$1$3$} -$2$0$1$3$~ -$2$0$1$4 -$2$0$1$4$ -$2$0$1$4$! -$2$0$1$4$" -$2$0$1$4$# -$2$0$1$4$$ -$2$0$1$4$% -$2$0$1$4$& -$2$0$1$4$' -$2$0$1$4$( -$2$0$1$4$) -$2$0$1$4$* -$2$0$1$4$+ -$2$0$1$4$, -$2$0$1$4$- -$2$0$1$4$. -$2$0$1$4$/ -$2$0$1$4$: -$2$0$1$4$; -$2$0$1$4$< -$2$0$1$4$= -$2$0$1$4$> -$2$0$1$4$? -$2$0$1$4$@ -$2$0$1$4$[ -$2$0$1$4$\ -$2$0$1$4$] -$2$0$1$4$^ -$2$0$1$4$_ -$2$0$1$4$` -$2$0$1$4${ -$2$0$1$4$| -$2$0$1$4$} -$2$0$1$4$~ -$2$0$1$5 -$2$0$1$5$ -$2$0$1$5$! -$2$0$1$5$" -$2$0$1$5$# -$2$0$1$5$$ -$2$0$1$5$% -$2$0$1$5$& -$2$0$1$5$' -$2$0$1$5$( -$2$0$1$5$) -$2$0$1$5$* -$2$0$1$5$+ -$2$0$1$5$, -$2$0$1$5$- -$2$0$1$5$. -$2$0$1$5$/ -$2$0$1$5$: -$2$0$1$5$; -$2$0$1$5$< -$2$0$1$5$= -$2$0$1$5$> -$2$0$1$5$? -$2$0$1$5$@ -$2$0$1$5$[ -$2$0$1$5$\ -$2$0$1$5$] -$2$0$1$5$^ -$2$0$1$5$_ -$2$0$1$5$` -$2$0$1$5${ -$2$0$1$5$| -$2$0$1$5$} -$2$0$1$5$~ -$2$0$1$6 -$2$0$1$6$ -$2$0$1$6$! -$2$0$1$6$" -$2$0$1$6$# -$2$0$1$6$$ -$2$0$1$6$% -$2$0$1$6$& -$2$0$1$6$' -$2$0$1$6$( -$2$0$1$6$) -$2$0$1$6$* -$2$0$1$6$+ -$2$0$1$6$, -$2$0$1$6$- -$2$0$1$6$. -$2$0$1$6$/ -$2$0$1$6$: -$2$0$1$6$; -$2$0$1$6$< -$2$0$1$6$= -$2$0$1$6$> -$2$0$1$6$? -$2$0$1$6$@ -$2$0$1$6$[ -$2$0$1$6$\ -$2$0$1$6$] -$2$0$1$6$^ -$2$0$1$6$_ -$2$0$1$6$` -$2$0$1$6${ -$2$0$1$6$| -$2$0$1$6$} -$2$0$1$6$~ -$2$0$1$7 -$2$0$1$7$ -$2$0$1$7$! -$2$0$1$7$" -$2$0$1$7$# -$2$0$1$7$$ -$2$0$1$7$% -$2$0$1$7$& -$2$0$1$7$' -$2$0$1$7$( -$2$0$1$7$) -$2$0$1$7$* -$2$0$1$7$+ -$2$0$1$7$, -$2$0$1$7$- -$2$0$1$7$. -$2$0$1$7$/ -$2$0$1$7$: -$2$0$1$7$; -$2$0$1$7$< -$2$0$1$7$= -$2$0$1$7$> -$2$0$1$7$? -$2$0$1$7$@ -$2$0$1$7$[ -$2$0$1$7$\ -$2$0$1$7$] -$2$0$1$7$^ -$2$0$1$7$_ -$2$0$1$7$` -$2$0$1$7${ -$2$0$1$7$| -$2$0$1$7$} -$2$0$1$7$~ -$2$0$1$8 -$2$0$1$8$ -$2$0$1$8$! -$2$0$1$8$" -$2$0$1$8$# -$2$0$1$8$$ -$2$0$1$8$% -$2$0$1$8$& -$2$0$1$8$' -$2$0$1$8$( -$2$0$1$8$) -$2$0$1$8$* -$2$0$1$8$+ -$2$0$1$8$, -$2$0$1$8$- -$2$0$1$8$. -$2$0$1$8$/ -$2$0$1$8$: -$2$0$1$8$; -$2$0$1$8$< -$2$0$1$8$= -$2$0$1$8$> -$2$0$1$8$? -$2$0$1$8$@ -$2$0$1$8$[ -$2$0$1$8$\ -$2$0$1$8$] -$2$0$1$8$^ -$2$0$1$8$_ -$2$0$1$8$` -$2$0$1$8${ -$2$0$1$8$| -$2$0$1$8$} -$2$0$1$8$~ -$2$0$1$9 -$2$0$1$9$ -$2$0$1$9$! -$2$0$1$9$" -$2$0$1$9$# -$2$0$1$9$$ -$2$0$1$9$% -$2$0$1$9$& -$2$0$1$9$' -$2$0$1$9$( -$2$0$1$9$) -$2$0$1$9$* -$2$0$1$9$+ -$2$0$1$9$, -$2$0$1$9$- -$2$0$1$9$. -$2$0$1$9$/ -$2$0$1$9$: -$2$0$1$9$; -$2$0$1$9$< -$2$0$1$9$= -$2$0$1$9$> -$2$0$1$9$? -$2$0$1$9$@ -$2$0$1$9$[ -$2$0$1$9$\ -$2$0$1$9$] -$2$0$1$9$^ -$2$0$1$9$_ -$2$0$1$9$` -$2$0$1$9${ -$2$0$1$9$| -$2$0$1$9$} -$2$0$1$9$~ -$2$0$2$0 -$2$0$2$0$ -$2$0$2$0$! -$2$0$2$0$" -$2$0$2$0$# -$2$0$2$0$$ -$2$0$2$0$% -$2$0$2$0$& -$2$0$2$0$' -$2$0$2$0$( -$2$0$2$0$) -$2$0$2$0$* -$2$0$2$0$+ -$2$0$2$0$, -$2$0$2$0$- -$2$0$2$0$. -$2$0$2$0$/ -$2$0$2$0$: -$2$0$2$0$; -$2$0$2$0$< -$2$0$2$0$= -$2$0$2$0$> -$2$0$2$0$? -$2$0$2$0$@ -$2$0$2$0$[ -$2$0$2$0$\ -$2$0$2$0$] -$2$0$2$0$^ -$2$0$2$0$_ -$2$0$2$0$` -$2$0$2$0${ -$2$0$2$0$| -$2$0$2$0$} -$2$0$2$0$~ -$2$0$2$1 -$2$0$2$1$ -$2$0$2$1$! -$2$0$2$1$" -$2$0$2$1$# -$2$0$2$1$$ -$2$0$2$1$% -$2$0$2$1$& -$2$0$2$1$' -$2$0$2$1$( -$2$0$2$1$) -$2$0$2$1$* -$2$0$2$1$+ -$2$0$2$1$, -$2$0$2$1$- -$2$0$2$1$. -$2$0$2$1$/ -$2$0$2$1$: -$2$0$2$1$; -$2$0$2$1$< -$2$0$2$1$= -$2$0$2$1$> -$2$0$2$1$? -$2$0$2$1$@ -$2$0$2$1$[ -$2$0$2$1$\ -$2$0$2$1$] -$2$0$2$1$^ -$2$0$2$1$_ -$2$0$2$1$` -$2$0$2$1${ -$2$0$2$1$| -$2$0$2$1$} -$2$0$2$1$~ -$2$0$2$2 -$2$0$2$2$ -$2$0$2$2$! -$2$0$2$2$" -$2$0$2$2$# -$2$0$2$2$$ -$2$0$2$2$% -$2$0$2$2$& -$2$0$2$2$' -$2$0$2$2$( -$2$0$2$2$) -$2$0$2$2$* -$2$0$2$2$+ -$2$0$2$2$, -$2$0$2$2$- -$2$0$2$2$. -$2$0$2$2$/ -$2$0$2$2$: -$2$0$2$2$; -$2$0$2$2$< -$2$0$2$2$= -$2$0$2$2$> -$2$0$2$2$? -$2$0$2$2$@ -$2$0$2$2$[ -$2$0$2$2$\ -$2$0$2$2$] -$2$0$2$2$^ -$2$0$2$2$_ -$2$0$2$2$` -$2$0$2$2${ -$2$0$2$2$| -$2$0$2$2$} -$2$0$2$2$~ -$2$0$2$3 -$2$0$2$3$ -$2$0$2$3$! -$2$0$2$3$" -$2$0$2$3$# -$2$0$2$3$$ -$2$0$2$3$% -$2$0$2$3$& -$2$0$2$3$' -$2$0$2$3$( -$2$0$2$3$) -$2$0$2$3$* -$2$0$2$3$+ -$2$0$2$3$, -$2$0$2$3$- -$2$0$2$3$. -$2$0$2$3$/ -$2$0$2$3$: -$2$0$2$3$; -$2$0$2$3$< -$2$0$2$3$= -$2$0$2$3$> -$2$0$2$3$? -$2$0$2$3$@ -$2$0$2$3$[ -$2$0$2$3$\ -$2$0$2$3$] -$2$0$2$3$^ -$2$0$2$3$_ -$2$0$2$3$` -$2$0$2$3${ -$2$0$2$3$| -$2$0$2$3$} -$2$0$2$3$~ -$2$0$2$4 -$2$0$2$4$ -$2$0$2$4$! -$2$0$2$4$" -$2$0$2$4$# -$2$0$2$4$$ -$2$0$2$4$% -$2$0$2$4$& -$2$0$2$4$' -$2$0$2$4$( -$2$0$2$4$) -$2$0$2$4$* -$2$0$2$4$+ -$2$0$2$4$, -$2$0$2$4$- -$2$0$2$4$. -$2$0$2$4$/ -$2$0$2$4$: -$2$0$2$4$; -$2$0$2$4$< -$2$0$2$4$= -$2$0$2$4$> -$2$0$2$4$? -$2$0$2$4$@ -$2$0$2$4$[ -$2$0$2$4$\ -$2$0$2$4$] -$2$0$2$4$^ -$2$0$2$4$_ -$2$0$2$4$` -$2$0$2$4${ -$2$0$2$4$| -$2$0$2$4$} -$2$0$2$4$~ -$2$0$2$5 -$2$0$2$5$ -$2$0$2$5$! -$2$0$2$5$" -$2$0$2$5$# -$2$0$2$5$$ -$2$0$2$5$% -$2$0$2$5$& -$2$0$2$5$' -$2$0$2$5$( -$2$0$2$5$) -$2$0$2$5$* -$2$0$2$5$+ -$2$0$2$5$, -$2$0$2$5$- -$2$0$2$5$. -$2$0$2$5$/ -$2$0$2$5$: -$2$0$2$5$; -$2$0$2$5$< -$2$0$2$5$= -$2$0$2$5$> -$2$0$2$5$? -$2$0$2$5$@ -$2$0$2$5$[ -$2$0$2$5$\ -$2$0$2$5$] -$2$0$2$5$^ -$2$0$2$5$_ -$2$0$2$5$` -$2$0$2$5${ -$2$0$2$5$| -$2$0$2$5$} -$2$0$2$5$~ -$2$0$2$6 -$2$0$2$6$ -$2$0$2$6$! -$2$0$2$6$" -$2$0$2$6$# -$2$0$2$6$$ -$2$0$2$6$% -$2$0$2$6$& -$2$0$2$6$' -$2$0$2$6$( -$2$0$2$6$) -$2$0$2$6$* -$2$0$2$6$+ -$2$0$2$6$, -$2$0$2$6$- -$2$0$2$6$. -$2$0$2$6$/ -$2$0$2$6$: -$2$0$2$6$; -$2$0$2$6$< -$2$0$2$6$= -$2$0$2$6$> -$2$0$2$6$? -$2$0$2$6$@ -$2$0$2$6$[ -$2$0$2$6$\ -$2$0$2$6$] -$2$0$2$6$^ -$2$0$2$6$_ -$2$0$2$6$` -$2$0$2$6${ -$2$0$2$6$| -$2$0$2$6$} -$2$0$2$6$~ -$2$0$2$7 -$2$0$2$7$ -$2$0$2$7$! -$2$0$2$7$" -$2$0$2$7$# -$2$0$2$7$$ -$2$0$2$7$% -$2$0$2$7$& -$2$0$2$7$' -$2$0$2$7$( -$2$0$2$7$) -$2$0$2$7$* -$2$0$2$7$+ -$2$0$2$7$, -$2$0$2$7$- -$2$0$2$7$. -$2$0$2$7$/ -$2$0$2$7$: -$2$0$2$7$; -$2$0$2$7$< -$2$0$2$7$= -$2$0$2$7$> -$2$0$2$7$? -$2$0$2$7$@ -$2$0$2$7$[ -$2$0$2$7$\ -$2$0$2$7$] -$2$0$2$7$^ -$2$0$2$7$_ -$2$0$2$7$` -$2$0$2$7${ -$2$0$2$7$| -$2$0$2$7$} -$2$0$2$7$~ -$2$0$2$8 -$2$0$2$8$ -$2$0$2$8$! -$2$0$2$8$" -$2$0$2$8$# -$2$0$2$8$$ -$2$0$2$8$% -$2$0$2$8$& -$2$0$2$8$' -$2$0$2$8$( -$2$0$2$8$) -$2$0$2$8$* -$2$0$2$8$+ -$2$0$2$8$, -$2$0$2$8$- -$2$0$2$8$. -$2$0$2$8$/ -$2$0$2$8$: -$2$0$2$8$; -$2$0$2$8$< -$2$0$2$8$= -$2$0$2$8$> -$2$0$2$8$? -$2$0$2$8$@ -$2$0$2$8$[ -$2$0$2$8$\ -$2$0$2$8$] -$2$0$2$8$^ -$2$0$2$8$_ -$2$0$2$8$` -$2$0$2$8${ -$2$0$2$8$| -$2$0$2$8$} -$2$0$2$8$~ -$2$0$2$9 -$2$0$2$9$ -$2$0$2$9$! -$2$0$2$9$" -$2$0$2$9$# -$2$0$2$9$$ -$2$0$2$9$% -$2$0$2$9$& -$2$0$2$9$' -$2$0$2$9$( -$2$0$2$9$) -$2$0$2$9$* -$2$0$2$9$+ -$2$0$2$9$, -$2$0$2$9$- -$2$0$2$9$. -$2$0$2$9$/ -$2$0$2$9$: -$2$0$2$9$; -$2$0$2$9$< -$2$0$2$9$= -$2$0$2$9$> -$2$0$2$9$? -$2$0$2$9$@ -$2$0$2$9$[ -$2$0$2$9$\ -$2$0$2$9$] -$2$0$2$9$^ -$2$0$2$9$_ -$2$0$2$9$` -$2$0$2$9${ -$2$0$2$9$| -$2$0$2$9$} -$2$0$2$9$~ -$2$0$3$0 -$2$0$3$0$ -$2$0$3$0$! -$2$0$3$0$" -$2$0$3$0$# -$2$0$3$0$$ -$2$0$3$0$% -$2$0$3$0$& -$2$0$3$0$' -$2$0$3$0$( -$2$0$3$0$) -$2$0$3$0$* -$2$0$3$0$+ -$2$0$3$0$, -$2$0$3$0$- -$2$0$3$0$. -$2$0$3$0$/ -$2$0$3$0$: -$2$0$3$0$; -$2$0$3$0$< -$2$0$3$0$= -$2$0$3$0$> -$2$0$3$0$? -$2$0$3$0$@ -$2$0$3$0$[ -$2$0$3$0$\ -$2$0$3$0$] -$2$0$3$0$^ -$2$0$3$0$_ -$2$0$3$0$` -$2$0$3$0${ -$2$0$3$0$| -$2$0$3$0$} -$2$0$3$0$~ -$2$0$3$1 -$2$0$3$1$ -$2$0$3$1$! -$2$0$3$1$" -$2$0$3$1$# -$2$0$3$1$$ -$2$0$3$1$% -$2$0$3$1$& -$2$0$3$1$' -$2$0$3$1$( -$2$0$3$1$) -$2$0$3$1$* -$2$0$3$1$+ -$2$0$3$1$, -$2$0$3$1$- -$2$0$3$1$. -$2$0$3$1$/ -$2$0$3$1$: -$2$0$3$1$; -$2$0$3$1$< -$2$0$3$1$= -$2$0$3$1$> -$2$0$3$1$? -$2$0$3$1$@ -$2$0$3$1$[ -$2$0$3$1$\ -$2$0$3$1$] -$2$0$3$1$^ -$2$0$3$1$_ -$2$0$3$1$` -$2$0$3$1${ -$2$0$3$1$| -$2$0$3$1$} -$2$0$3$1$~ -$2$0$3$2 -$2$0$3$2$ -$2$0$3$2$! -$2$0$3$2$" -$2$0$3$2$# -$2$0$3$2$$ -$2$0$3$2$% -$2$0$3$2$& -$2$0$3$2$' -$2$0$3$2$( -$2$0$3$2$) -$2$0$3$2$* -$2$0$3$2$+ -$2$0$3$2$, -$2$0$3$2$- -$2$0$3$2$. -$2$0$3$2$/ -$2$0$3$2$: -$2$0$3$2$; -$2$0$3$2$< -$2$0$3$2$= -$2$0$3$2$> -$2$0$3$2$? -$2$0$3$2$@ -$2$0$3$2$[ -$2$0$3$2$\ -$2$0$3$2$] -$2$0$3$2$^ -$2$0$3$2$_ -$2$0$3$2$` -$2$0$3$2${ -$2$0$3$2$| -$2$0$3$2$} -$2$0$3$2$~ -$2$0$3$3 -$2$0$3$3$ -$2$0$3$3$! -$2$0$3$3$" -$2$0$3$3$# -$2$0$3$3$$ -$2$0$3$3$% -$2$0$3$3$& -$2$0$3$3$' -$2$0$3$3$( -$2$0$3$3$) -$2$0$3$3$* -$2$0$3$3$+ -$2$0$3$3$, -$2$0$3$3$- -$2$0$3$3$. -$2$0$3$3$/ -$2$0$3$3$: -$2$0$3$3$; -$2$0$3$3$< -$2$0$3$3$= -$2$0$3$3$> -$2$0$3$3$? -$2$0$3$3$@ -$2$0$3$3$[ -$2$0$3$3$\ -$2$0$3$3$] -$2$0$3$3$^ -$2$0$3$3$_ -$2$0$3$3$` -$2$0$3$3${ -$2$0$3$3$| -$2$0$3$3$} -$2$0$3$3$~ -$2$0$3$4 -$2$0$3$4$ -$2$0$3$4$! -$2$0$3$4$" -$2$0$3$4$# -$2$0$3$4$$ -$2$0$3$4$% -$2$0$3$4$& -$2$0$3$4$' -$2$0$3$4$( -$2$0$3$4$) -$2$0$3$4$* -$2$0$3$4$+ -$2$0$3$4$, -$2$0$3$4$- -$2$0$3$4$. -$2$0$3$4$/ -$2$0$3$4$: -$2$0$3$4$; -$2$0$3$4$< -$2$0$3$4$= -$2$0$3$4$> -$2$0$3$4$? -$2$0$3$4$@ -$2$0$3$4$[ -$2$0$3$4$\ -$2$0$3$4$] -$2$0$3$4$^ -$2$0$3$4$_ -$2$0$3$4$` -$2$0$3$4${ -$2$0$3$4$| -$2$0$3$4$} -$2$0$3$4$~ -$2$0$3$5 -$2$0$3$5$ -$2$0$3$5$! -$2$0$3$5$" -$2$0$3$5$# -$2$0$3$5$$ -$2$0$3$5$% -$2$0$3$5$& -$2$0$3$5$' -$2$0$3$5$( -$2$0$3$5$) -$2$0$3$5$* -$2$0$3$5$+ -$2$0$3$5$, -$2$0$3$5$- -$2$0$3$5$. -$2$0$3$5$/ -$2$0$3$5$: -$2$0$3$5$; -$2$0$3$5$< -$2$0$3$5$= -$2$0$3$5$> -$2$0$3$5$? -$2$0$3$5$@ -$2$0$3$5$[ -$2$0$3$5$\ -$2$0$3$5$] -$2$0$3$5$^ -$2$0$3$5$_ -$2$0$3$5$` -$2$0$3$5${ -$2$0$3$5$| -$2$0$3$5$} -$2$0$3$5$~ -$2$0$3$6 -$2$0$3$6$ -$2$0$3$6$! -$2$0$3$6$" -$2$0$3$6$# -$2$0$3$6$$ -$2$0$3$6$% -$2$0$3$6$& -$2$0$3$6$' -$2$0$3$6$( -$2$0$3$6$) -$2$0$3$6$* -$2$0$3$6$+ -$2$0$3$6$, -$2$0$3$6$- -$2$0$3$6$. -$2$0$3$6$/ -$2$0$3$6$: -$2$0$3$6$; -$2$0$3$6$< -$2$0$3$6$= -$2$0$3$6$> -$2$0$3$6$? -$2$0$3$6$@ -$2$0$3$6$[ -$2$0$3$6$\ -$2$0$3$6$] -$2$0$3$6$^ -$2$0$3$6$_ -$2$0$3$6$` -$2$0$3$6${ -$2$0$3$6$| -$2$0$3$6$} -$2$0$3$6$~ -$2$0$3$7 -$2$0$3$7$ -$2$0$3$7$! -$2$0$3$7$" -$2$0$3$7$# -$2$0$3$7$$ -$2$0$3$7$% -$2$0$3$7$& -$2$0$3$7$' -$2$0$3$7$( -$2$0$3$7$) -$2$0$3$7$* -$2$0$3$7$+ -$2$0$3$7$, -$2$0$3$7$- -$2$0$3$7$. -$2$0$3$7$/ -$2$0$3$7$: -$2$0$3$7$; -$2$0$3$7$< -$2$0$3$7$= -$2$0$3$7$> -$2$0$3$7$? -$2$0$3$7$@ -$2$0$3$7$[ -$2$0$3$7$\ -$2$0$3$7$] -$2$0$3$7$^ -$2$0$3$7$_ -$2$0$3$7$` -$2$0$3$7${ -$2$0$3$7$| -$2$0$3$7$} -$2$0$3$7$~ -$2$0$3$8 -$2$0$3$8$ -$2$0$3$8$! -$2$0$3$8$" -$2$0$3$8$# -$2$0$3$8$$ -$2$0$3$8$% -$2$0$3$8$& -$2$0$3$8$' -$2$0$3$8$( -$2$0$3$8$) -$2$0$3$8$* -$2$0$3$8$+ -$2$0$3$8$, -$2$0$3$8$- -$2$0$3$8$. -$2$0$3$8$/ -$2$0$3$8$: -$2$0$3$8$; -$2$0$3$8$< -$2$0$3$8$= -$2$0$3$8$> -$2$0$3$8$? -$2$0$3$8$@ -$2$0$3$8$[ -$2$0$3$8$\ -$2$0$3$8$] -$2$0$3$8$^ -$2$0$3$8$_ -$2$0$3$8$` -$2$0$3$8${ -$2$0$3$8$| -$2$0$3$8$} -$2$0$3$8$~ -$2$0$3$9 -$2$0$3$9$ -$2$0$3$9$! -$2$0$3$9$" -$2$0$3$9$# -$2$0$3$9$$ -$2$0$3$9$% -$2$0$3$9$& -$2$0$3$9$' -$2$0$3$9$( -$2$0$3$9$) -$2$0$3$9$* -$2$0$3$9$+ -$2$0$3$9$, -$2$0$3$9$- -$2$0$3$9$. -$2$0$3$9$/ -$2$0$3$9$: -$2$0$3$9$; -$2$0$3$9$< -$2$0$3$9$= -$2$0$3$9$> -$2$0$3$9$? -$2$0$3$9$@ -$2$0$3$9$[ -$2$0$3$9$\ -$2$0$3$9$] -$2$0$3$9$^ -$2$0$3$9$_ -$2$0$3$9$` -$2$0$3$9${ -$2$0$3$9$| -$2$0$3$9$} -$2$0$3$9$~ -$2$0$4$0 -$2$0$4$0$ -$2$0$4$0$! -$2$0$4$0$" -$2$0$4$0$# -$2$0$4$0$$ -$2$0$4$0$% -$2$0$4$0$& -$2$0$4$0$' -$2$0$4$0$( -$2$0$4$0$) -$2$0$4$0$* -$2$0$4$0$+ -$2$0$4$0$, -$2$0$4$0$- -$2$0$4$0$. -$2$0$4$0$/ -$2$0$4$0$: -$2$0$4$0$; -$2$0$4$0$< -$2$0$4$0$= -$2$0$4$0$> -$2$0$4$0$? -$2$0$4$0$@ -$2$0$4$0$[ -$2$0$4$0$\ -$2$0$4$0$] -$2$0$4$0$^ -$2$0$4$0$_ -$2$0$4$0$` -$2$0$4$0${ -$2$0$4$0$| -$2$0$4$0$} -$2$0$4$0$~ -$2$0$4$1 -$2$0$4$1$ -$2$0$4$1$! -$2$0$4$1$" -$2$0$4$1$# -$2$0$4$1$$ -$2$0$4$1$% -$2$0$4$1$& -$2$0$4$1$' -$2$0$4$1$( -$2$0$4$1$) -$2$0$4$1$* -$2$0$4$1$+ -$2$0$4$1$, -$2$0$4$1$- -$2$0$4$1$. -$2$0$4$1$/ -$2$0$4$1$: -$2$0$4$1$; -$2$0$4$1$< -$2$0$4$1$= -$2$0$4$1$> -$2$0$4$1$? -$2$0$4$1$@ -$2$0$4$1$[ -$2$0$4$1$\ -$2$0$4$1$] -$2$0$4$1$^ -$2$0$4$1$_ -$2$0$4$1$` -$2$0$4$1${ -$2$0$4$1$| -$2$0$4$1$} -$2$0$4$1$~ -$2$0$4$2 -$2$0$4$2$ -$2$0$4$2$! -$2$0$4$2$" -$2$0$4$2$# -$2$0$4$2$$ -$2$0$4$2$% -$2$0$4$2$& -$2$0$4$2$' -$2$0$4$2$( -$2$0$4$2$) -$2$0$4$2$* -$2$0$4$2$+ -$2$0$4$2$, -$2$0$4$2$- -$2$0$4$2$. -$2$0$4$2$/ -$2$0$4$2$: -$2$0$4$2$; -$2$0$4$2$< -$2$0$4$2$= -$2$0$4$2$> -$2$0$4$2$? -$2$0$4$2$@ -$2$0$4$2$[ -$2$0$4$2$\ -$2$0$4$2$] -$2$0$4$2$^ -$2$0$4$2$_ -$2$0$4$2$` -$2$0$4$2${ -$2$0$4$2$| -$2$0$4$2$} -$2$0$4$2$~ -$2$0$4$3 -$2$0$4$3$ -$2$0$4$3$! -$2$0$4$3$" -$2$0$4$3$# -$2$0$4$3$$ -$2$0$4$3$% -$2$0$4$3$& -$2$0$4$3$' -$2$0$4$3$( -$2$0$4$3$) -$2$0$4$3$* -$2$0$4$3$+ -$2$0$4$3$, -$2$0$4$3$- -$2$0$4$3$. -$2$0$4$3$/ -$2$0$4$3$: -$2$0$4$3$; -$2$0$4$3$< -$2$0$4$3$= -$2$0$4$3$> -$2$0$4$3$? -$2$0$4$3$@ -$2$0$4$3$[ -$2$0$4$3$\ -$2$0$4$3$] -$2$0$4$3$^ -$2$0$4$3$_ -$2$0$4$3$` -$2$0$4$3${ -$2$0$4$3$| -$2$0$4$3$} -$2$0$4$3$~ -$2$0$4$4 -$2$0$4$4$ -$2$0$4$4$! -$2$0$4$4$" -$2$0$4$4$# -$2$0$4$4$$ -$2$0$4$4$% -$2$0$4$4$& -$2$0$4$4$' -$2$0$4$4$( -$2$0$4$4$) -$2$0$4$4$* -$2$0$4$4$+ -$2$0$4$4$, -$2$0$4$4$- -$2$0$4$4$. -$2$0$4$4$/ -$2$0$4$4$: -$2$0$4$4$; -$2$0$4$4$< -$2$0$4$4$= -$2$0$4$4$> -$2$0$4$4$? -$2$0$4$4$@ -$2$0$4$4$[ -$2$0$4$4$\ -$2$0$4$4$] -$2$0$4$4$^ -$2$0$4$4$_ -$2$0$4$4$` -$2$0$4$4${ -$2$0$4$4$| -$2$0$4$4$} -$2$0$4$4$~ -$2$0$4$5 -$2$0$4$5$ -$2$0$4$5$! -$2$0$4$5$" -$2$0$4$5$# -$2$0$4$5$$ -$2$0$4$5$% -$2$0$4$5$& -$2$0$4$5$' -$2$0$4$5$( -$2$0$4$5$) -$2$0$4$5$* -$2$0$4$5$+ -$2$0$4$5$, -$2$0$4$5$- -$2$0$4$5$. -$2$0$4$5$/ -$2$0$4$5$: -$2$0$4$5$; -$2$0$4$5$< -$2$0$4$5$= -$2$0$4$5$> -$2$0$4$5$? -$2$0$4$5$@ -$2$0$4$5$[ -$2$0$4$5$\ -$2$0$4$5$] -$2$0$4$5$^ -$2$0$4$5$_ -$2$0$4$5$` -$2$0$4$5${ -$2$0$4$5$| -$2$0$4$5$} -$2$0$4$5$~ -$2$0$4$6 -$2$0$4$6$ -$2$0$4$6$! -$2$0$4$6$" -$2$0$4$6$# -$2$0$4$6$$ -$2$0$4$6$% -$2$0$4$6$& -$2$0$4$6$' -$2$0$4$6$( -$2$0$4$6$) -$2$0$4$6$* -$2$0$4$6$+ -$2$0$4$6$, -$2$0$4$6$- -$2$0$4$6$. -$2$0$4$6$/ -$2$0$4$6$: -$2$0$4$6$; -$2$0$4$6$< -$2$0$4$6$= -$2$0$4$6$> -$2$0$4$6$? -$2$0$4$6$@ -$2$0$4$6$[ -$2$0$4$6$\ -$2$0$4$6$] -$2$0$4$6$^ -$2$0$4$6$_ -$2$0$4$6$` -$2$0$4$6${ -$2$0$4$6$| -$2$0$4$6$} -$2$0$4$6$~ -$2$0$4$7 -$2$0$4$7$ -$2$0$4$7$! -$2$0$4$7$" -$2$0$4$7$# -$2$0$4$7$$ -$2$0$4$7$% -$2$0$4$7$& -$2$0$4$7$' -$2$0$4$7$( -$2$0$4$7$) -$2$0$4$7$* -$2$0$4$7$+ -$2$0$4$7$, -$2$0$4$7$- -$2$0$4$7$. -$2$0$4$7$/ -$2$0$4$7$: -$2$0$4$7$; -$2$0$4$7$< -$2$0$4$7$= -$2$0$4$7$> -$2$0$4$7$? -$2$0$4$7$@ -$2$0$4$7$[ -$2$0$4$7$\ -$2$0$4$7$] -$2$0$4$7$^ -$2$0$4$7$_ -$2$0$4$7$` -$2$0$4$7${ -$2$0$4$7$| -$2$0$4$7$} -$2$0$4$7$~ -$2$0$4$8 -$2$0$4$8$ -$2$0$4$8$! -$2$0$4$8$" -$2$0$4$8$# -$2$0$4$8$$ -$2$0$4$8$% -$2$0$4$8$& -$2$0$4$8$' -$2$0$4$8$( -$2$0$4$8$) -$2$0$4$8$* -$2$0$4$8$+ -$2$0$4$8$, -$2$0$4$8$- -$2$0$4$8$. -$2$0$4$8$/ -$2$0$4$8$: -$2$0$4$8$; -$2$0$4$8$< -$2$0$4$8$= -$2$0$4$8$> -$2$0$4$8$? -$2$0$4$8$@ -$2$0$4$8$[ -$2$0$4$8$\ -$2$0$4$8$] -$2$0$4$8$^ -$2$0$4$8$_ -$2$0$4$8$` -$2$0$4$8${ -$2$0$4$8$| -$2$0$4$8$} -$2$0$4$8$~ -$2$0$4$9 -$2$0$4$9$ -$2$0$4$9$! -$2$0$4$9$" -$2$0$4$9$# -$2$0$4$9$$ -$2$0$4$9$% -$2$0$4$9$& -$2$0$4$9$' -$2$0$4$9$( -$2$0$4$9$) -$2$0$4$9$* -$2$0$4$9$+ -$2$0$4$9$, -$2$0$4$9$- -$2$0$4$9$. -$2$0$4$9$/ -$2$0$4$9$: -$2$0$4$9$; -$2$0$4$9$< -$2$0$4$9$= -$2$0$4$9$> -$2$0$4$9$? -$2$0$4$9$@ -$2$0$4$9$[ -$2$0$4$9$\ -$2$0$4$9$] -$2$0$4$9$^ -$2$0$4$9$_ -$2$0$4$9$` -$2$0$4$9${ -$2$0$4$9$| -$2$0$4$9$} -$2$0$4$9$~ -$2$1 -$2$1$! -$2$1'5$1 -$2$2 -$2$2$! -$2$2$2 -$2$2$2$! -$2$2$2$2 -$2$2$2$2$2$2 -$2$2$2$2$2$2$2 -$2$2$2$2$2$2$2$2 -$2$2$2$2$2$2$2$2$2 -$2$2$2$2$2$2$2$2$2$2 -$2$2$2$2$2$2$2$2$2$2$2 -$2$2$2$2$2$2$2$2$2$2$2$2 -$2$3 -$2$3$! -$2$3$4 -$2$4 -$2$4$! -$2$4$7 -$2$5 -$2$6 -$2$7 -$2$8 -$2$9 -$2Z1 -$2i01{ +$2 $! +$2 $. +$2 $0 $0 +$2 $0 $0 $0 $ +$2 $0 $0 $0 $! +$2 $0 $0 $0 $" +$2 $0 $0 $0 $# +$2 $0 $0 $0 $$ +$2 $0 $0 $0 $% +$2 $0 $0 $0 $& +$2 $0 $0 $0 $' +$2 $0 $0 $0 $( +$2 $0 $0 $0 $) +$2 $0 $0 $0 $* +$2 $0 $0 $0 $+ +$2 $0 $0 $0 $, +$2 $0 $0 $0 $- +$2 $0 $0 $0 $. +$2 $0 $0 $0 $/ +$2 $0 $0 $0 $: +$2 $0 $0 $0 $; +$2 $0 $0 $0 $< +$2 $0 $0 $0 $= +$2 $0 $0 $0 $> +$2 $0 $0 $0 $? +$2 $0 $0 $0 $@ +$2 $0 $0 $0 $[ +$2 $0 $0 $0 $\ +$2 $0 $0 $0 $] +$2 $0 $0 $0 $^ +$2 $0 $0 $0 $_ +$2 $0 $0 $0 $` +$2 $0 $0 $0 ${ +$2 $0 $0 $0 $| +$2 $0 $0 $0 $} +$2 $0 $0 $0 $~ +$2 $0 $0 $1 +$2 $0 $0 $1 $ +$2 $0 $0 $1 $! +$2 $0 $0 $1 $" +$2 $0 $0 $1 $# +$2 $0 $0 $1 $$ +$2 $0 $0 $1 $% +$2 $0 $0 $1 $& +$2 $0 $0 $1 $' +$2 $0 $0 $1 $( +$2 $0 $0 $1 $) +$2 $0 $0 $1 $* +$2 $0 $0 $1 $+ +$2 $0 $0 $1 $, +$2 $0 $0 $1 $- +$2 $0 $0 $1 $. +$2 $0 $0 $1 $/ +$2 $0 $0 $1 $: +$2 $0 $0 $1 $; +$2 $0 $0 $1 $< +$2 $0 $0 $1 $= +$2 $0 $0 $1 $> +$2 $0 $0 $1 $? +$2 $0 $0 $1 $@ +$2 $0 $0 $1 $[ +$2 $0 $0 $1 $\ +$2 $0 $0 $1 $] +$2 $0 $0 $1 $^ +$2 $0 $0 $1 $_ +$2 $0 $0 $1 $` +$2 $0 $0 $1 ${ +$2 $0 $0 $1 $| +$2 $0 $0 $1 $} +$2 $0 $0 $1 $~ +$2 $0 $0 $2 $ +$2 $0 $0 $2 $! +$2 $0 $0 $2 $" +$2 $0 $0 $2 $# +$2 $0 $0 $2 $$ +$2 $0 $0 $2 $% +$2 $0 $0 $2 $& +$2 $0 $0 $2 $' +$2 $0 $0 $2 $( +$2 $0 $0 $2 $) +$2 $0 $0 $2 $* +$2 $0 $0 $2 $+ +$2 $0 $0 $2 $, +$2 $0 $0 $2 $- +$2 $0 $0 $2 $. +$2 $0 $0 $2 $/ +$2 $0 $0 $2 $: +$2 $0 $0 $2 $; +$2 $0 $0 $2 $< +$2 $0 $0 $2 $= +$2 $0 $0 $2 $> +$2 $0 $0 $2 $? +$2 $0 $0 $2 $@ +$2 $0 $0 $2 $[ +$2 $0 $0 $2 $\ +$2 $0 $0 $2 $] +$2 $0 $0 $2 $^ +$2 $0 $0 $2 $_ +$2 $0 $0 $2 $` +$2 $0 $0 $2 ${ +$2 $0 $0 $2 $| +$2 $0 $0 $2 $} +$2 $0 $0 $2 $~ +$2 $0 $0 $3 +$2 $0 $0 $3 $ +$2 $0 $0 $3 $! +$2 $0 $0 $3 $" +$2 $0 $0 $3 $# +$2 $0 $0 $3 $$ +$2 $0 $0 $3 $% +$2 $0 $0 $3 $& +$2 $0 $0 $3 $' +$2 $0 $0 $3 $( +$2 $0 $0 $3 $) +$2 $0 $0 $3 $* +$2 $0 $0 $3 $+ +$2 $0 $0 $3 $, +$2 $0 $0 $3 $- +$2 $0 $0 $3 $. +$2 $0 $0 $3 $/ +$2 $0 $0 $3 $: +$2 $0 $0 $3 $; +$2 $0 $0 $3 $< +$2 $0 $0 $3 $= +$2 $0 $0 $3 $> +$2 $0 $0 $3 $? +$2 $0 $0 $3 $@ +$2 $0 $0 $3 $[ +$2 $0 $0 $3 $\ +$2 $0 $0 $3 $] +$2 $0 $0 $3 $^ +$2 $0 $0 $3 $_ +$2 $0 $0 $3 $` +$2 $0 $0 $3 ${ +$2 $0 $0 $3 $| +$2 $0 $0 $3 $} +$2 $0 $0 $3 $~ +$2 $0 $0 $4 +$2 $0 $0 $4 $ +$2 $0 $0 $4 $! +$2 $0 $0 $4 $" +$2 $0 $0 $4 $# +$2 $0 $0 $4 $$ +$2 $0 $0 $4 $% +$2 $0 $0 $4 $& +$2 $0 $0 $4 $' +$2 $0 $0 $4 $( +$2 $0 $0 $4 $) +$2 $0 $0 $4 $* +$2 $0 $0 $4 $+ +$2 $0 $0 $4 $, +$2 $0 $0 $4 $- +$2 $0 $0 $4 $. +$2 $0 $0 $4 $/ +$2 $0 $0 $4 $: +$2 $0 $0 $4 $; +$2 $0 $0 $4 $< +$2 $0 $0 $4 $= +$2 $0 $0 $4 $> +$2 $0 $0 $4 $? +$2 $0 $0 $4 $@ +$2 $0 $0 $4 $[ +$2 $0 $0 $4 $\ +$2 $0 $0 $4 $] +$2 $0 $0 $4 $^ +$2 $0 $0 $4 $_ +$2 $0 $0 $4 $` +$2 $0 $0 $4 ${ +$2 $0 $0 $4 $| +$2 $0 $0 $4 $} +$2 $0 $0 $4 $~ +$2 $0 $0 $5 +$2 $0 $0 $5 $ +$2 $0 $0 $5 $! +$2 $0 $0 $5 $" +$2 $0 $0 $5 $# +$2 $0 $0 $5 $$ +$2 $0 $0 $5 $% +$2 $0 $0 $5 $& +$2 $0 $0 $5 $' +$2 $0 $0 $5 $( +$2 $0 $0 $5 $) +$2 $0 $0 $5 $* +$2 $0 $0 $5 $+ +$2 $0 $0 $5 $, +$2 $0 $0 $5 $- +$2 $0 $0 $5 $. +$2 $0 $0 $5 $/ +$2 $0 $0 $5 $: +$2 $0 $0 $5 $; +$2 $0 $0 $5 $< +$2 $0 $0 $5 $= +$2 $0 $0 $5 $> +$2 $0 $0 $5 $? +$2 $0 $0 $5 $@ +$2 $0 $0 $5 $[ +$2 $0 $0 $5 $\ +$2 $0 $0 $5 $] +$2 $0 $0 $5 $^ +$2 $0 $0 $5 $_ +$2 $0 $0 $5 $` +$2 $0 $0 $5 ${ +$2 $0 $0 $5 $| +$2 $0 $0 $5 $} +$2 $0 $0 $5 $~ +$2 $0 $0 $6 +$2 $0 $0 $6 $! +$2 $0 $0 $6 $" +$2 $0 $0 $6 $# +$2 $0 $0 $6 $$ +$2 $0 $0 $6 $% +$2 $0 $0 $6 $& +$2 $0 $0 $6 $' +$2 $0 $0 $6 $( +$2 $0 $0 $6 $) +$2 $0 $0 $6 $* +$2 $0 $0 $6 $+ +$2 $0 $0 $6 $, +$2 $0 $0 $6 $- +$2 $0 $0 $6 $. +$2 $0 $0 $6 $/ +$2 $0 $0 $6 $: +$2 $0 $0 $6 $; +$2 $0 $0 $6 $< +$2 $0 $0 $6 $= +$2 $0 $0 $6 $> +$2 $0 $0 $6 $? +$2 $0 $0 $6 $@ +$2 $0 $0 $6 $A +$2 $0 $0 $6 $B +$2 $0 $0 $6 $[ +$2 $0 $0 $6 $\ +$2 $0 $0 $6 $] +$2 $0 $0 $6 $^ +$2 $0 $0 $6 $_ +$2 $0 $0 $6 $` +$2 $0 $0 $6 ${ +$2 $0 $0 $6 $| +$2 $0 $0 $6 $} +$2 $0 $0 $6 $~ +$2 $0 $0 $7 +$2 $0 $0 $7 $ +$2 $0 $0 $7 $! +$2 $0 $0 $7 $" +$2 $0 $0 $7 $# +$2 $0 $0 $7 $$ +$2 $0 $0 $7 $% +$2 $0 $0 $7 $& +$2 $0 $0 $7 $' +$2 $0 $0 $7 $( +$2 $0 $0 $7 $) +$2 $0 $0 $7 $* +$2 $0 $0 $7 $+ +$2 $0 $0 $7 $, +$2 $0 $0 $7 $- +$2 $0 $0 $7 $. +$2 $0 $0 $7 $/ +$2 $0 $0 $7 $: +$2 $0 $0 $7 $; +$2 $0 $0 $7 $< +$2 $0 $0 $7 $= +$2 $0 $0 $7 $> +$2 $0 $0 $7 $? +$2 $0 $0 $7 $@ +$2 $0 $0 $7 $[ +$2 $0 $0 $7 $\ +$2 $0 $0 $7 $] +$2 $0 $0 $7 $^ +$2 $0 $0 $7 $_ +$2 $0 $0 $7 $` +$2 $0 $0 $7 ${ +$2 $0 $0 $7 $| +$2 $0 $0 $7 $} +$2 $0 $0 $7 $~ +$2 $0 $0 $8 +$2 $0 $0 $8 $ +$2 $0 $0 $8 $! +$2 $0 $0 $8 $" +$2 $0 $0 $8 $# +$2 $0 $0 $8 $$ +$2 $0 $0 $8 $% +$2 $0 $0 $8 $& +$2 $0 $0 $8 $' +$2 $0 $0 $8 $( +$2 $0 $0 $8 $) +$2 $0 $0 $8 $* +$2 $0 $0 $8 $+ +$2 $0 $0 $8 $, +$2 $0 $0 $8 $- +$2 $0 $0 $8 $. +$2 $0 $0 $8 $/ +$2 $0 $0 $8 $: +$2 $0 $0 $8 $; +$2 $0 $0 $8 $< +$2 $0 $0 $8 $= +$2 $0 $0 $8 $> +$2 $0 $0 $8 $? +$2 $0 $0 $8 $@ +$2 $0 $0 $8 $[ +$2 $0 $0 $8 $\ +$2 $0 $0 $8 $] +$2 $0 $0 $8 $^ +$2 $0 $0 $8 $_ +$2 $0 $0 $8 $` +$2 $0 $0 $8 ${ +$2 $0 $0 $8 $| +$2 $0 $0 $8 $} +$2 $0 $0 $8 $~ +$2 $0 $0 $9 +$2 $0 $0 $9 $ +$2 $0 $0 $9 $! +$2 $0 $0 $9 $" +$2 $0 $0 $9 $# +$2 $0 $0 $9 $$ +$2 $0 $0 $9 $% +$2 $0 $0 $9 $& +$2 $0 $0 $9 $' +$2 $0 $0 $9 $( +$2 $0 $0 $9 $) +$2 $0 $0 $9 $* +$2 $0 $0 $9 $+ +$2 $0 $0 $9 $, +$2 $0 $0 $9 $- +$2 $0 $0 $9 $. +$2 $0 $0 $9 $/ +$2 $0 $0 $9 $: +$2 $0 $0 $9 $; +$2 $0 $0 $9 $< +$2 $0 $0 $9 $= +$2 $0 $0 $9 $> +$2 $0 $0 $9 $? +$2 $0 $0 $9 $@ +$2 $0 $0 $9 $[ +$2 $0 $0 $9 $\ +$2 $0 $0 $9 $] +$2 $0 $0 $9 $^ +$2 $0 $0 $9 $_ +$2 $0 $0 $9 $` +$2 $0 $0 $9 ${ +$2 $0 $0 $9 $| +$2 $0 $0 $9 $} +$2 $0 $0 $9 $~ +$2 $0 $1 $0 +$2 $0 $1 $0 $ +$2 $0 $1 $0 $! +$2 $0 $1 $0 $" +$2 $0 $1 $0 $# +$2 $0 $1 $0 $$ +$2 $0 $1 $0 $% +$2 $0 $1 $0 $& +$2 $0 $1 $0 $' +$2 $0 $1 $0 $( +$2 $0 $1 $0 $) +$2 $0 $1 $0 $* +$2 $0 $1 $0 $+ +$2 $0 $1 $0 $, +$2 $0 $1 $0 $- +$2 $0 $1 $0 $. +$2 $0 $1 $0 $/ +$2 $0 $1 $0 $: +$2 $0 $1 $0 $; +$2 $0 $1 $0 $< +$2 $0 $1 $0 $= +$2 $0 $1 $0 $> +$2 $0 $1 $0 $? +$2 $0 $1 $0 $@ +$2 $0 $1 $0 $[ +$2 $0 $1 $0 $\ +$2 $0 $1 $0 $] +$2 $0 $1 $0 $^ +$2 $0 $1 $0 $_ +$2 $0 $1 $0 $` +$2 $0 $1 $0 ${ +$2 $0 $1 $0 $| +$2 $0 $1 $0 $} +$2 $0 $1 $0 $~ +$2 $0 $1 $1 +$2 $0 $1 $1 $ +$2 $0 $1 $1 $! +$2 $0 $1 $1 $" +$2 $0 $1 $1 $# +$2 $0 $1 $1 $$ +$2 $0 $1 $1 $% +$2 $0 $1 $1 $& +$2 $0 $1 $1 $' +$2 $0 $1 $1 $( +$2 $0 $1 $1 $) +$2 $0 $1 $1 $* +$2 $0 $1 $1 $+ +$2 $0 $1 $1 $, +$2 $0 $1 $1 $- +$2 $0 $1 $1 $. +$2 $0 $1 $1 $/ +$2 $0 $1 $1 $: +$2 $0 $1 $1 $; +$2 $0 $1 $1 $< +$2 $0 $1 $1 $= +$2 $0 $1 $1 $> +$2 $0 $1 $1 $? +$2 $0 $1 $1 $@ +$2 $0 $1 $1 $[ +$2 $0 $1 $1 $\ +$2 $0 $1 $1 $] +$2 $0 $1 $1 $^ +$2 $0 $1 $1 $_ +$2 $0 $1 $1 $` +$2 $0 $1 $1 ${ +$2 $0 $1 $1 $| +$2 $0 $1 $1 $} +$2 $0 $1 $1 $~ +$2 $0 $1 $2 +$2 $0 $1 $2 $ +$2 $0 $1 $2 $! +$2 $0 $1 $2 $" +$2 $0 $1 $2 $# +$2 $0 $1 $2 $$ +$2 $0 $1 $2 $% +$2 $0 $1 $2 $& +$2 $0 $1 $2 $' +$2 $0 $1 $2 $( +$2 $0 $1 $2 $) +$2 $0 $1 $2 $* +$2 $0 $1 $2 $+ +$2 $0 $1 $2 $, +$2 $0 $1 $2 $- +$2 $0 $1 $2 $. +$2 $0 $1 $2 $/ +$2 $0 $1 $2 $: +$2 $0 $1 $2 $; +$2 $0 $1 $2 $< +$2 $0 $1 $2 $= +$2 $0 $1 $2 $> +$2 $0 $1 $2 $? +$2 $0 $1 $2 $@ +$2 $0 $1 $2 $[ +$2 $0 $1 $2 $\ +$2 $0 $1 $2 $] +$2 $0 $1 $2 $^ +$2 $0 $1 $2 $_ +$2 $0 $1 $2 $` +$2 $0 $1 $2 ${ +$2 $0 $1 $2 $| +$2 $0 $1 $2 $} +$2 $0 $1 $2 $~ +$2 $0 $1 $3 +$2 $0 $1 $3 $ +$2 $0 $1 $3 $! +$2 $0 $1 $3 $" +$2 $0 $1 $3 $# +$2 $0 $1 $3 $$ +$2 $0 $1 $3 $% +$2 $0 $1 $3 $& +$2 $0 $1 $3 $' +$2 $0 $1 $3 $( +$2 $0 $1 $3 $) +$2 $0 $1 $3 $* +$2 $0 $1 $3 $+ +$2 $0 $1 $3 $, +$2 $0 $1 $3 $- +$2 $0 $1 $3 $. +$2 $0 $1 $3 $/ +$2 $0 $1 $3 $: +$2 $0 $1 $3 $; +$2 $0 $1 $3 $< +$2 $0 $1 $3 $= +$2 $0 $1 $3 $> +$2 $0 $1 $3 $? +$2 $0 $1 $3 $@ +$2 $0 $1 $3 $[ +$2 $0 $1 $3 $\ +$2 $0 $1 $3 $] +$2 $0 $1 $3 $^ +$2 $0 $1 $3 $_ +$2 $0 $1 $3 $` +$2 $0 $1 $3 ${ +$2 $0 $1 $3 $| +$2 $0 $1 $3 $} +$2 $0 $1 $3 $~ +$2 $0 $1 $4 +$2 $0 $1 $4 $ +$2 $0 $1 $4 $! +$2 $0 $1 $4 $" +$2 $0 $1 $4 $# +$2 $0 $1 $4 $$ +$2 $0 $1 $4 $% +$2 $0 $1 $4 $& +$2 $0 $1 $4 $' +$2 $0 $1 $4 $( +$2 $0 $1 $4 $) +$2 $0 $1 $4 $* +$2 $0 $1 $4 $+ +$2 $0 $1 $4 $, +$2 $0 $1 $4 $- +$2 $0 $1 $4 $. +$2 $0 $1 $4 $/ +$2 $0 $1 $4 $: +$2 $0 $1 $4 $; +$2 $0 $1 $4 $< +$2 $0 $1 $4 $= +$2 $0 $1 $4 $> +$2 $0 $1 $4 $? +$2 $0 $1 $4 $@ +$2 $0 $1 $4 $[ +$2 $0 $1 $4 $\ +$2 $0 $1 $4 $] +$2 $0 $1 $4 $^ +$2 $0 $1 $4 $_ +$2 $0 $1 $4 $` +$2 $0 $1 $4 ${ +$2 $0 $1 $4 $| +$2 $0 $1 $4 $} +$2 $0 $1 $4 $~ +$2 $0 $1 $5 +$2 $0 $1 $5 $ +$2 $0 $1 $5 $! +$2 $0 $1 $5 $" +$2 $0 $1 $5 $# +$2 $0 $1 $5 $$ +$2 $0 $1 $5 $% +$2 $0 $1 $5 $& +$2 $0 $1 $5 $' +$2 $0 $1 $5 $( +$2 $0 $1 $5 $) +$2 $0 $1 $5 $* +$2 $0 $1 $5 $+ +$2 $0 $1 $5 $, +$2 $0 $1 $5 $- +$2 $0 $1 $5 $. +$2 $0 $1 $5 $/ +$2 $0 $1 $5 $: +$2 $0 $1 $5 $; +$2 $0 $1 $5 $< +$2 $0 $1 $5 $= +$2 $0 $1 $5 $> +$2 $0 $1 $5 $? +$2 $0 $1 $5 $@ +$2 $0 $1 $5 $[ +$2 $0 $1 $5 $\ +$2 $0 $1 $5 $] +$2 $0 $1 $5 $^ +$2 $0 $1 $5 $_ +$2 $0 $1 $5 $` +$2 $0 $1 $5 ${ +$2 $0 $1 $5 $| +$2 $0 $1 $5 $} +$2 $0 $1 $5 $~ +$2 $0 $1 $6 +$2 $0 $1 $6 $ +$2 $0 $1 $6 $! +$2 $0 $1 $6 $" +$2 $0 $1 $6 $# +$2 $0 $1 $6 $$ +$2 $0 $1 $6 $% +$2 $0 $1 $6 $& +$2 $0 $1 $6 $' +$2 $0 $1 $6 $( +$2 $0 $1 $6 $) +$2 $0 $1 $6 $* +$2 $0 $1 $6 $+ +$2 $0 $1 $6 $, +$2 $0 $1 $6 $- +$2 $0 $1 $6 $. +$2 $0 $1 $6 $/ +$2 $0 $1 $6 $: +$2 $0 $1 $6 $; +$2 $0 $1 $6 $< +$2 $0 $1 $6 $= +$2 $0 $1 $6 $> +$2 $0 $1 $6 $? +$2 $0 $1 $6 $@ +$2 $0 $1 $6 $[ +$2 $0 $1 $6 $\ +$2 $0 $1 $6 $] +$2 $0 $1 $6 $^ +$2 $0 $1 $6 $_ +$2 $0 $1 $6 $` +$2 $0 $1 $6 ${ +$2 $0 $1 $6 $| +$2 $0 $1 $6 $} +$2 $0 $1 $6 $~ +$2 $0 $1 $7 +$2 $0 $1 $7 $ +$2 $0 $1 $7 $! +$2 $0 $1 $7 $" +$2 $0 $1 $7 $# +$2 $0 $1 $7 $$ +$2 $0 $1 $7 $% +$2 $0 $1 $7 $& +$2 $0 $1 $7 $' +$2 $0 $1 $7 $( +$2 $0 $1 $7 $) +$2 $0 $1 $7 $* +$2 $0 $1 $7 $+ +$2 $0 $1 $7 $, +$2 $0 $1 $7 $- +$2 $0 $1 $7 $. +$2 $0 $1 $7 $/ +$2 $0 $1 $7 $: +$2 $0 $1 $7 $; +$2 $0 $1 $7 $< +$2 $0 $1 $7 $= +$2 $0 $1 $7 $> +$2 $0 $1 $7 $? +$2 $0 $1 $7 $@ +$2 $0 $1 $7 $[ +$2 $0 $1 $7 $\ +$2 $0 $1 $7 $] +$2 $0 $1 $7 $^ +$2 $0 $1 $7 $_ +$2 $0 $1 $7 $` +$2 $0 $1 $7 ${ +$2 $0 $1 $7 $| +$2 $0 $1 $7 $} +$2 $0 $1 $7 $~ +$2 $0 $1 $8 +$2 $0 $1 $8 $ +$2 $0 $1 $8 $! +$2 $0 $1 $8 $" +$2 $0 $1 $8 $# +$2 $0 $1 $8 $$ +$2 $0 $1 $8 $% +$2 $0 $1 $8 $& +$2 $0 $1 $8 $' +$2 $0 $1 $8 $( +$2 $0 $1 $8 $) +$2 $0 $1 $8 $* +$2 $0 $1 $8 $+ +$2 $0 $1 $8 $, +$2 $0 $1 $8 $- +$2 $0 $1 $8 $. +$2 $0 $1 $8 $/ +$2 $0 $1 $8 $: +$2 $0 $1 $8 $; +$2 $0 $1 $8 $< +$2 $0 $1 $8 $= +$2 $0 $1 $8 $> +$2 $0 $1 $8 $? +$2 $0 $1 $8 $@ +$2 $0 $1 $8 $[ +$2 $0 $1 $8 $\ +$2 $0 $1 $8 $] +$2 $0 $1 $8 $^ +$2 $0 $1 $8 $_ +$2 $0 $1 $8 $` +$2 $0 $1 $8 ${ +$2 $0 $1 $8 $| +$2 $0 $1 $8 $} +$2 $0 $1 $8 $~ +$2 $0 $1 $9 +$2 $0 $1 $9 $ +$2 $0 $1 $9 $! +$2 $0 $1 $9 $" +$2 $0 $1 $9 $# +$2 $0 $1 $9 $$ +$2 $0 $1 $9 $% +$2 $0 $1 $9 $& +$2 $0 $1 $9 $' +$2 $0 $1 $9 $( +$2 $0 $1 $9 $) +$2 $0 $1 $9 $* +$2 $0 $1 $9 $+ +$2 $0 $1 $9 $, +$2 $0 $1 $9 $- +$2 $0 $1 $9 $. +$2 $0 $1 $9 $/ +$2 $0 $1 $9 $: +$2 $0 $1 $9 $; +$2 $0 $1 $9 $< +$2 $0 $1 $9 $= +$2 $0 $1 $9 $> +$2 $0 $1 $9 $? +$2 $0 $1 $9 $@ +$2 $0 $1 $9 $[ +$2 $0 $1 $9 $\ +$2 $0 $1 $9 $] +$2 $0 $1 $9 $^ +$2 $0 $1 $9 $_ +$2 $0 $1 $9 $` +$2 $0 $1 $9 ${ +$2 $0 $1 $9 $| +$2 $0 $1 $9 $} +$2 $0 $1 $9 $~ +$2 $0 $2 $0 +$2 $0 $2 $0 $ +$2 $0 $2 $0 $! +$2 $0 $2 $0 $" +$2 $0 $2 $0 $# +$2 $0 $2 $0 $$ +$2 $0 $2 $0 $% +$2 $0 $2 $0 $& +$2 $0 $2 $0 $' +$2 $0 $2 $0 $( +$2 $0 $2 $0 $) +$2 $0 $2 $0 $* +$2 $0 $2 $0 $+ +$2 $0 $2 $0 $, +$2 $0 $2 $0 $- +$2 $0 $2 $0 $. +$2 $0 $2 $0 $/ +$2 $0 $2 $0 $: +$2 $0 $2 $0 $; +$2 $0 $2 $0 $< +$2 $0 $2 $0 $= +$2 $0 $2 $0 $> +$2 $0 $2 $0 $? +$2 $0 $2 $0 $@ +$2 $0 $2 $0 $[ +$2 $0 $2 $0 $\ +$2 $0 $2 $0 $] +$2 $0 $2 $0 $^ +$2 $0 $2 $0 $_ +$2 $0 $2 $0 $` +$2 $0 $2 $0 ${ +$2 $0 $2 $0 $| +$2 $0 $2 $0 $} +$2 $0 $2 $0 $~ +$2 $0 $2 $1 +$2 $0 $2 $1 $ +$2 $0 $2 $1 $! +$2 $0 $2 $1 $" +$2 $0 $2 $1 $# +$2 $0 $2 $1 $$ +$2 $0 $2 $1 $% +$2 $0 $2 $1 $& +$2 $0 $2 $1 $' +$2 $0 $2 $1 $( +$2 $0 $2 $1 $) +$2 $0 $2 $1 $* +$2 $0 $2 $1 $+ +$2 $0 $2 $1 $, +$2 $0 $2 $1 $- +$2 $0 $2 $1 $. +$2 $0 $2 $1 $/ +$2 $0 $2 $1 $: +$2 $0 $2 $1 $; +$2 $0 $2 $1 $< +$2 $0 $2 $1 $= +$2 $0 $2 $1 $> +$2 $0 $2 $1 $? +$2 $0 $2 $1 $@ +$2 $0 $2 $1 $[ +$2 $0 $2 $1 $\ +$2 $0 $2 $1 $] +$2 $0 $2 $1 $^ +$2 $0 $2 $1 $_ +$2 $0 $2 $1 $` +$2 $0 $2 $1 ${ +$2 $0 $2 $1 $| +$2 $0 $2 $1 $} +$2 $0 $2 $1 $~ +$2 $0 $2 $2 +$2 $0 $2 $2 $ +$2 $0 $2 $2 $! +$2 $0 $2 $2 $" +$2 $0 $2 $2 $# +$2 $0 $2 $2 $$ +$2 $0 $2 $2 $% +$2 $0 $2 $2 $& +$2 $0 $2 $2 $' +$2 $0 $2 $2 $( +$2 $0 $2 $2 $) +$2 $0 $2 $2 $* +$2 $0 $2 $2 $+ +$2 $0 $2 $2 $, +$2 $0 $2 $2 $- +$2 $0 $2 $2 $. +$2 $0 $2 $2 $/ +$2 $0 $2 $2 $: +$2 $0 $2 $2 $; +$2 $0 $2 $2 $< +$2 $0 $2 $2 $= +$2 $0 $2 $2 $> +$2 $0 $2 $2 $? +$2 $0 $2 $2 $@ +$2 $0 $2 $2 $[ +$2 $0 $2 $2 $\ +$2 $0 $2 $2 $] +$2 $0 $2 $2 $^ +$2 $0 $2 $2 $_ +$2 $0 $2 $2 $` +$2 $0 $2 $2 ${ +$2 $0 $2 $2 $| +$2 $0 $2 $2 $} +$2 $0 $2 $2 $~ +$2 $0 $2 $3 +$2 $0 $2 $3 $ +$2 $0 $2 $3 $! +$2 $0 $2 $3 $" +$2 $0 $2 $3 $# +$2 $0 $2 $3 $$ +$2 $0 $2 $3 $% +$2 $0 $2 $3 $& +$2 $0 $2 $3 $' +$2 $0 $2 $3 $( +$2 $0 $2 $3 $) +$2 $0 $2 $3 $* +$2 $0 $2 $3 $+ +$2 $0 $2 $3 $, +$2 $0 $2 $3 $- +$2 $0 $2 $3 $. +$2 $0 $2 $3 $/ +$2 $0 $2 $3 $: +$2 $0 $2 $3 $; +$2 $0 $2 $3 $< +$2 $0 $2 $3 $= +$2 $0 $2 $3 $> +$2 $0 $2 $3 $? +$2 $0 $2 $3 $@ +$2 $0 $2 $3 $[ +$2 $0 $2 $3 $\ +$2 $0 $2 $3 $] +$2 $0 $2 $3 $^ +$2 $0 $2 $3 $_ +$2 $0 $2 $3 $` +$2 $0 $2 $3 ${ +$2 $0 $2 $3 $| +$2 $0 $2 $3 $} +$2 $0 $2 $3 $~ +$2 $0 $2 $4 +$2 $0 $2 $4 $ +$2 $0 $2 $4 $! +$2 $0 $2 $4 $" +$2 $0 $2 $4 $# +$2 $0 $2 $4 $$ +$2 $0 $2 $4 $% +$2 $0 $2 $4 $& +$2 $0 $2 $4 $' +$2 $0 $2 $4 $( +$2 $0 $2 $4 $) +$2 $0 $2 $4 $* +$2 $0 $2 $4 $+ +$2 $0 $2 $4 $, +$2 $0 $2 $4 $- +$2 $0 $2 $4 $. +$2 $0 $2 $4 $/ +$2 $0 $2 $4 $: +$2 $0 $2 $4 $; +$2 $0 $2 $4 $< +$2 $0 $2 $4 $= +$2 $0 $2 $4 $> +$2 $0 $2 $4 $? +$2 $0 $2 $4 $@ +$2 $0 $2 $4 $[ +$2 $0 $2 $4 $\ +$2 $0 $2 $4 $] +$2 $0 $2 $4 $^ +$2 $0 $2 $4 $_ +$2 $0 $2 $4 $` +$2 $0 $2 $4 ${ +$2 $0 $2 $4 $| +$2 $0 $2 $4 $} +$2 $0 $2 $4 $~ +$2 $0 $2 $5 +$2 $0 $2 $5 $ +$2 $0 $2 $5 $! +$2 $0 $2 $5 $" +$2 $0 $2 $5 $# +$2 $0 $2 $5 $$ +$2 $0 $2 $5 $% +$2 $0 $2 $5 $& +$2 $0 $2 $5 $' +$2 $0 $2 $5 $( +$2 $0 $2 $5 $) +$2 $0 $2 $5 $* +$2 $0 $2 $5 $+ +$2 $0 $2 $5 $, +$2 $0 $2 $5 $- +$2 $0 $2 $5 $. +$2 $0 $2 $5 $/ +$2 $0 $2 $5 $: +$2 $0 $2 $5 $; +$2 $0 $2 $5 $< +$2 $0 $2 $5 $= +$2 $0 $2 $5 $> +$2 $0 $2 $5 $? +$2 $0 $2 $5 $@ +$2 $0 $2 $5 $[ +$2 $0 $2 $5 $\ +$2 $0 $2 $5 $] +$2 $0 $2 $5 $^ +$2 $0 $2 $5 $_ +$2 $0 $2 $5 $` +$2 $0 $2 $5 ${ +$2 $0 $2 $5 $| +$2 $0 $2 $5 $} +$2 $0 $2 $5 $~ +$2 $0 $2 $6 +$2 $0 $2 $6 $ +$2 $0 $2 $6 $! +$2 $0 $2 $6 $" +$2 $0 $2 $6 $# +$2 $0 $2 $6 $$ +$2 $0 $2 $6 $% +$2 $0 $2 $6 $& +$2 $0 $2 $6 $' +$2 $0 $2 $6 $( +$2 $0 $2 $6 $) +$2 $0 $2 $6 $* +$2 $0 $2 $6 $+ +$2 $0 $2 $6 $, +$2 $0 $2 $6 $- +$2 $0 $2 $6 $. +$2 $0 $2 $6 $/ +$2 $0 $2 $6 $: +$2 $0 $2 $6 $; +$2 $0 $2 $6 $< +$2 $0 $2 $6 $= +$2 $0 $2 $6 $> +$2 $0 $2 $6 $? +$2 $0 $2 $6 $@ +$2 $0 $2 $6 $[ +$2 $0 $2 $6 $\ +$2 $0 $2 $6 $] +$2 $0 $2 $6 $^ +$2 $0 $2 $6 $_ +$2 $0 $2 $6 $` +$2 $0 $2 $6 ${ +$2 $0 $2 $6 $| +$2 $0 $2 $6 $} +$2 $0 $2 $6 $~ +$2 $0 $2 $7 +$2 $0 $2 $7 $ +$2 $0 $2 $7 $! +$2 $0 $2 $7 $" +$2 $0 $2 $7 $# +$2 $0 $2 $7 $$ +$2 $0 $2 $7 $% +$2 $0 $2 $7 $& +$2 $0 $2 $7 $' +$2 $0 $2 $7 $( +$2 $0 $2 $7 $) +$2 $0 $2 $7 $* +$2 $0 $2 $7 $+ +$2 $0 $2 $7 $, +$2 $0 $2 $7 $- +$2 $0 $2 $7 $. +$2 $0 $2 $7 $/ +$2 $0 $2 $7 $: +$2 $0 $2 $7 $; +$2 $0 $2 $7 $< +$2 $0 $2 $7 $= +$2 $0 $2 $7 $> +$2 $0 $2 $7 $? +$2 $0 $2 $7 $@ +$2 $0 $2 $7 $[ +$2 $0 $2 $7 $\ +$2 $0 $2 $7 $] +$2 $0 $2 $7 $^ +$2 $0 $2 $7 $_ +$2 $0 $2 $7 $` +$2 $0 $2 $7 ${ +$2 $0 $2 $7 $| +$2 $0 $2 $7 $} +$2 $0 $2 $7 $~ +$2 $0 $2 $8 +$2 $0 $2 $8 $ +$2 $0 $2 $8 $! +$2 $0 $2 $8 $" +$2 $0 $2 $8 $# +$2 $0 $2 $8 $$ +$2 $0 $2 $8 $% +$2 $0 $2 $8 $& +$2 $0 $2 $8 $' +$2 $0 $2 $8 $( +$2 $0 $2 $8 $) +$2 $0 $2 $8 $* +$2 $0 $2 $8 $+ +$2 $0 $2 $8 $, +$2 $0 $2 $8 $- +$2 $0 $2 $8 $. +$2 $0 $2 $8 $/ +$2 $0 $2 $8 $: +$2 $0 $2 $8 $; +$2 $0 $2 $8 $< +$2 $0 $2 $8 $= +$2 $0 $2 $8 $> +$2 $0 $2 $8 $? +$2 $0 $2 $8 $@ +$2 $0 $2 $8 $[ +$2 $0 $2 $8 $\ +$2 $0 $2 $8 $] +$2 $0 $2 $8 $^ +$2 $0 $2 $8 $_ +$2 $0 $2 $8 $` +$2 $0 $2 $8 ${ +$2 $0 $2 $8 $| +$2 $0 $2 $8 $} +$2 $0 $2 $8 $~ +$2 $0 $2 $9 +$2 $0 $2 $9 $ +$2 $0 $2 $9 $! +$2 $0 $2 $9 $" +$2 $0 $2 $9 $# +$2 $0 $2 $9 $$ +$2 $0 $2 $9 $% +$2 $0 $2 $9 $& +$2 $0 $2 $9 $' +$2 $0 $2 $9 $( +$2 $0 $2 $9 $) +$2 $0 $2 $9 $* +$2 $0 $2 $9 $+ +$2 $0 $2 $9 $, +$2 $0 $2 $9 $- +$2 $0 $2 $9 $. +$2 $0 $2 $9 $/ +$2 $0 $2 $9 $: +$2 $0 $2 $9 $; +$2 $0 $2 $9 $< +$2 $0 $2 $9 $= +$2 $0 $2 $9 $> +$2 $0 $2 $9 $? +$2 $0 $2 $9 $@ +$2 $0 $2 $9 $[ +$2 $0 $2 $9 $\ +$2 $0 $2 $9 $] +$2 $0 $2 $9 $^ +$2 $0 $2 $9 $_ +$2 $0 $2 $9 $` +$2 $0 $2 $9 ${ +$2 $0 $2 $9 $| +$2 $0 $2 $9 $} +$2 $0 $2 $9 $~ +$2 $0 $3 $0 +$2 $0 $3 $0 $ +$2 $0 $3 $0 $! +$2 $0 $3 $0 $" +$2 $0 $3 $0 $# +$2 $0 $3 $0 $$ +$2 $0 $3 $0 $% +$2 $0 $3 $0 $& +$2 $0 $3 $0 $' +$2 $0 $3 $0 $( +$2 $0 $3 $0 $) +$2 $0 $3 $0 $* +$2 $0 $3 $0 $+ +$2 $0 $3 $0 $, +$2 $0 $3 $0 $- +$2 $0 $3 $0 $. +$2 $0 $3 $0 $/ +$2 $0 $3 $0 $: +$2 $0 $3 $0 $; +$2 $0 $3 $0 $< +$2 $0 $3 $0 $= +$2 $0 $3 $0 $> +$2 $0 $3 $0 $? +$2 $0 $3 $0 $@ +$2 $0 $3 $0 $[ +$2 $0 $3 $0 $\ +$2 $0 $3 $0 $] +$2 $0 $3 $0 $^ +$2 $0 $3 $0 $_ +$2 $0 $3 $0 $` +$2 $0 $3 $0 ${ +$2 $0 $3 $0 $| +$2 $0 $3 $0 $} +$2 $0 $3 $0 $~ +$2 $0 $3 $1 +$2 $0 $3 $1 $ +$2 $0 $3 $1 $! +$2 $0 $3 $1 $" +$2 $0 $3 $1 $# +$2 $0 $3 $1 $$ +$2 $0 $3 $1 $% +$2 $0 $3 $1 $& +$2 $0 $3 $1 $' +$2 $0 $3 $1 $( +$2 $0 $3 $1 $) +$2 $0 $3 $1 $* +$2 $0 $3 $1 $+ +$2 $0 $3 $1 $, +$2 $0 $3 $1 $- +$2 $0 $3 $1 $. +$2 $0 $3 $1 $/ +$2 $0 $3 $1 $: +$2 $0 $3 $1 $; +$2 $0 $3 $1 $< +$2 $0 $3 $1 $= +$2 $0 $3 $1 $> +$2 $0 $3 $1 $? +$2 $0 $3 $1 $@ +$2 $0 $3 $1 $[ +$2 $0 $3 $1 $\ +$2 $0 $3 $1 $] +$2 $0 $3 $1 $^ +$2 $0 $3 $1 $_ +$2 $0 $3 $1 $` +$2 $0 $3 $1 ${ +$2 $0 $3 $1 $| +$2 $0 $3 $1 $} +$2 $0 $3 $1 $~ +$2 $0 $3 $2 +$2 $0 $3 $2 $ +$2 $0 $3 $2 $! +$2 $0 $3 $2 $" +$2 $0 $3 $2 $# +$2 $0 $3 $2 $$ +$2 $0 $3 $2 $% +$2 $0 $3 $2 $& +$2 $0 $3 $2 $' +$2 $0 $3 $2 $( +$2 $0 $3 $2 $) +$2 $0 $3 $2 $* +$2 $0 $3 $2 $+ +$2 $0 $3 $2 $, +$2 $0 $3 $2 $- +$2 $0 $3 $2 $. +$2 $0 $3 $2 $/ +$2 $0 $3 $2 $: +$2 $0 $3 $2 $; +$2 $0 $3 $2 $< +$2 $0 $3 $2 $= +$2 $0 $3 $2 $> +$2 $0 $3 $2 $? +$2 $0 $3 $2 $@ +$2 $0 $3 $2 $[ +$2 $0 $3 $2 $\ +$2 $0 $3 $2 $] +$2 $0 $3 $2 $^ +$2 $0 $3 $2 $_ +$2 $0 $3 $2 $` +$2 $0 $3 $2 ${ +$2 $0 $3 $2 $| +$2 $0 $3 $2 $} +$2 $0 $3 $2 $~ +$2 $0 $3 $3 +$2 $0 $3 $3 $ +$2 $0 $3 $3 $! +$2 $0 $3 $3 $" +$2 $0 $3 $3 $# +$2 $0 $3 $3 $$ +$2 $0 $3 $3 $% +$2 $0 $3 $3 $& +$2 $0 $3 $3 $' +$2 $0 $3 $3 $( +$2 $0 $3 $3 $) +$2 $0 $3 $3 $* +$2 $0 $3 $3 $+ +$2 $0 $3 $3 $, +$2 $0 $3 $3 $- +$2 $0 $3 $3 $. +$2 $0 $3 $3 $/ +$2 $0 $3 $3 $: +$2 $0 $3 $3 $; +$2 $0 $3 $3 $< +$2 $0 $3 $3 $= +$2 $0 $3 $3 $> +$2 $0 $3 $3 $? +$2 $0 $3 $3 $@ +$2 $0 $3 $3 $[ +$2 $0 $3 $3 $\ +$2 $0 $3 $3 $] +$2 $0 $3 $3 $^ +$2 $0 $3 $3 $_ +$2 $0 $3 $3 $` +$2 $0 $3 $3 ${ +$2 $0 $3 $3 $| +$2 $0 $3 $3 $} +$2 $0 $3 $3 $~ +$2 $0 $3 $4 +$2 $0 $3 $4 $ +$2 $0 $3 $4 $! +$2 $0 $3 $4 $" +$2 $0 $3 $4 $# +$2 $0 $3 $4 $$ +$2 $0 $3 $4 $% +$2 $0 $3 $4 $& +$2 $0 $3 $4 $' +$2 $0 $3 $4 $( +$2 $0 $3 $4 $) +$2 $0 $3 $4 $* +$2 $0 $3 $4 $+ +$2 $0 $3 $4 $, +$2 $0 $3 $4 $- +$2 $0 $3 $4 $. +$2 $0 $3 $4 $/ +$2 $0 $3 $4 $: +$2 $0 $3 $4 $; +$2 $0 $3 $4 $< +$2 $0 $3 $4 $= +$2 $0 $3 $4 $> +$2 $0 $3 $4 $? +$2 $0 $3 $4 $@ +$2 $0 $3 $4 $[ +$2 $0 $3 $4 $\ +$2 $0 $3 $4 $] +$2 $0 $3 $4 $^ +$2 $0 $3 $4 $_ +$2 $0 $3 $4 $` +$2 $0 $3 $4 ${ +$2 $0 $3 $4 $| +$2 $0 $3 $4 $} +$2 $0 $3 $4 $~ +$2 $0 $3 $5 +$2 $0 $3 $5 $ +$2 $0 $3 $5 $! +$2 $0 $3 $5 $" +$2 $0 $3 $5 $# +$2 $0 $3 $5 $$ +$2 $0 $3 $5 $% +$2 $0 $3 $5 $& +$2 $0 $3 $5 $' +$2 $0 $3 $5 $( +$2 $0 $3 $5 $) +$2 $0 $3 $5 $* +$2 $0 $3 $5 $+ +$2 $0 $3 $5 $, +$2 $0 $3 $5 $- +$2 $0 $3 $5 $. +$2 $0 $3 $5 $/ +$2 $0 $3 $5 $: +$2 $0 $3 $5 $; +$2 $0 $3 $5 $< +$2 $0 $3 $5 $= +$2 $0 $3 $5 $> +$2 $0 $3 $5 $? +$2 $0 $3 $5 $@ +$2 $0 $3 $5 $[ +$2 $0 $3 $5 $\ +$2 $0 $3 $5 $] +$2 $0 $3 $5 $^ +$2 $0 $3 $5 $_ +$2 $0 $3 $5 $` +$2 $0 $3 $5 ${ +$2 $0 $3 $5 $| +$2 $0 $3 $5 $} +$2 $0 $3 $5 $~ +$2 $0 $3 $6 +$2 $0 $3 $6 $ +$2 $0 $3 $6 $! +$2 $0 $3 $6 $" +$2 $0 $3 $6 $# +$2 $0 $3 $6 $$ +$2 $0 $3 $6 $% +$2 $0 $3 $6 $& +$2 $0 $3 $6 $' +$2 $0 $3 $6 $( +$2 $0 $3 $6 $) +$2 $0 $3 $6 $* +$2 $0 $3 $6 $+ +$2 $0 $3 $6 $, +$2 $0 $3 $6 $- +$2 $0 $3 $6 $. +$2 $0 $3 $6 $/ +$2 $0 $3 $6 $: +$2 $0 $3 $6 $; +$2 $0 $3 $6 $< +$2 $0 $3 $6 $= +$2 $0 $3 $6 $> +$2 $0 $3 $6 $? +$2 $0 $3 $6 $@ +$2 $0 $3 $6 $[ +$2 $0 $3 $6 $\ +$2 $0 $3 $6 $] +$2 $0 $3 $6 $^ +$2 $0 $3 $6 $_ +$2 $0 $3 $6 $` +$2 $0 $3 $6 ${ +$2 $0 $3 $6 $| +$2 $0 $3 $6 $} +$2 $0 $3 $6 $~ +$2 $0 $3 $7 +$2 $0 $3 $7 $ +$2 $0 $3 $7 $! +$2 $0 $3 $7 $" +$2 $0 $3 $7 $# +$2 $0 $3 $7 $$ +$2 $0 $3 $7 $% +$2 $0 $3 $7 $& +$2 $0 $3 $7 $' +$2 $0 $3 $7 $( +$2 $0 $3 $7 $) +$2 $0 $3 $7 $* +$2 $0 $3 $7 $+ +$2 $0 $3 $7 $, +$2 $0 $3 $7 $- +$2 $0 $3 $7 $. +$2 $0 $3 $7 $/ +$2 $0 $3 $7 $: +$2 $0 $3 $7 $; +$2 $0 $3 $7 $< +$2 $0 $3 $7 $= +$2 $0 $3 $7 $> +$2 $0 $3 $7 $? +$2 $0 $3 $7 $@ +$2 $0 $3 $7 $[ +$2 $0 $3 $7 $\ +$2 $0 $3 $7 $] +$2 $0 $3 $7 $^ +$2 $0 $3 $7 $_ +$2 $0 $3 $7 $` +$2 $0 $3 $7 ${ +$2 $0 $3 $7 $| +$2 $0 $3 $7 $} +$2 $0 $3 $7 $~ +$2 $0 $3 $8 +$2 $0 $3 $8 $ +$2 $0 $3 $8 $! +$2 $0 $3 $8 $" +$2 $0 $3 $8 $# +$2 $0 $3 $8 $$ +$2 $0 $3 $8 $% +$2 $0 $3 $8 $& +$2 $0 $3 $8 $' +$2 $0 $3 $8 $( +$2 $0 $3 $8 $) +$2 $0 $3 $8 $* +$2 $0 $3 $8 $+ +$2 $0 $3 $8 $, +$2 $0 $3 $8 $- +$2 $0 $3 $8 $. +$2 $0 $3 $8 $/ +$2 $0 $3 $8 $: +$2 $0 $3 $8 $; +$2 $0 $3 $8 $< +$2 $0 $3 $8 $= +$2 $0 $3 $8 $> +$2 $0 $3 $8 $? +$2 $0 $3 $8 $@ +$2 $0 $3 $8 $[ +$2 $0 $3 $8 $\ +$2 $0 $3 $8 $] +$2 $0 $3 $8 $^ +$2 $0 $3 $8 $_ +$2 $0 $3 $8 $` +$2 $0 $3 $8 ${ +$2 $0 $3 $8 $| +$2 $0 $3 $8 $} +$2 $0 $3 $8 $~ +$2 $0 $3 $9 +$2 $0 $3 $9 $ +$2 $0 $3 $9 $! +$2 $0 $3 $9 $" +$2 $0 $3 $9 $# +$2 $0 $3 $9 $$ +$2 $0 $3 $9 $% +$2 $0 $3 $9 $& +$2 $0 $3 $9 $' +$2 $0 $3 $9 $( +$2 $0 $3 $9 $) +$2 $0 $3 $9 $* +$2 $0 $3 $9 $+ +$2 $0 $3 $9 $, +$2 $0 $3 $9 $- +$2 $0 $3 $9 $. +$2 $0 $3 $9 $/ +$2 $0 $3 $9 $: +$2 $0 $3 $9 $; +$2 $0 $3 $9 $< +$2 $0 $3 $9 $= +$2 $0 $3 $9 $> +$2 $0 $3 $9 $? +$2 $0 $3 $9 $@ +$2 $0 $3 $9 $[ +$2 $0 $3 $9 $\ +$2 $0 $3 $9 $] +$2 $0 $3 $9 $^ +$2 $0 $3 $9 $_ +$2 $0 $3 $9 $` +$2 $0 $3 $9 ${ +$2 $0 $3 $9 $| +$2 $0 $3 $9 $} +$2 $0 $3 $9 $~ +$2 $0 $4 $0 +$2 $0 $4 $0 $ +$2 $0 $4 $0 $! +$2 $0 $4 $0 $" +$2 $0 $4 $0 $# +$2 $0 $4 $0 $$ +$2 $0 $4 $0 $% +$2 $0 $4 $0 $& +$2 $0 $4 $0 $' +$2 $0 $4 $0 $( +$2 $0 $4 $0 $) +$2 $0 $4 $0 $* +$2 $0 $4 $0 $+ +$2 $0 $4 $0 $, +$2 $0 $4 $0 $- +$2 $0 $4 $0 $. +$2 $0 $4 $0 $/ +$2 $0 $4 $0 $: +$2 $0 $4 $0 $; +$2 $0 $4 $0 $< +$2 $0 $4 $0 $= +$2 $0 $4 $0 $> +$2 $0 $4 $0 $? +$2 $0 $4 $0 $@ +$2 $0 $4 $0 $[ +$2 $0 $4 $0 $\ +$2 $0 $4 $0 $] +$2 $0 $4 $0 $^ +$2 $0 $4 $0 $_ +$2 $0 $4 $0 $` +$2 $0 $4 $0 ${ +$2 $0 $4 $0 $| +$2 $0 $4 $0 $} +$2 $0 $4 $0 $~ +$2 $0 $4 $1 +$2 $0 $4 $1 $ +$2 $0 $4 $1 $! +$2 $0 $4 $1 $" +$2 $0 $4 $1 $# +$2 $0 $4 $1 $$ +$2 $0 $4 $1 $% +$2 $0 $4 $1 $& +$2 $0 $4 $1 $' +$2 $0 $4 $1 $( +$2 $0 $4 $1 $) +$2 $0 $4 $1 $* +$2 $0 $4 $1 $+ +$2 $0 $4 $1 $, +$2 $0 $4 $1 $- +$2 $0 $4 $1 $. +$2 $0 $4 $1 $/ +$2 $0 $4 $1 $: +$2 $0 $4 $1 $; +$2 $0 $4 $1 $< +$2 $0 $4 $1 $= +$2 $0 $4 $1 $> +$2 $0 $4 $1 $? +$2 $0 $4 $1 $@ +$2 $0 $4 $1 $[ +$2 $0 $4 $1 $\ +$2 $0 $4 $1 $] +$2 $0 $4 $1 $^ +$2 $0 $4 $1 $_ +$2 $0 $4 $1 $` +$2 $0 $4 $1 ${ +$2 $0 $4 $1 $| +$2 $0 $4 $1 $} +$2 $0 $4 $1 $~ +$2 $0 $4 $2 +$2 $0 $4 $2 $ +$2 $0 $4 $2 $! +$2 $0 $4 $2 $" +$2 $0 $4 $2 $# +$2 $0 $4 $2 $$ +$2 $0 $4 $2 $% +$2 $0 $4 $2 $& +$2 $0 $4 $2 $' +$2 $0 $4 $2 $( +$2 $0 $4 $2 $) +$2 $0 $4 $2 $* +$2 $0 $4 $2 $+ +$2 $0 $4 $2 $, +$2 $0 $4 $2 $- +$2 $0 $4 $2 $. +$2 $0 $4 $2 $/ +$2 $0 $4 $2 $: +$2 $0 $4 $2 $; +$2 $0 $4 $2 $< +$2 $0 $4 $2 $= +$2 $0 $4 $2 $> +$2 $0 $4 $2 $? +$2 $0 $4 $2 $@ +$2 $0 $4 $2 $[ +$2 $0 $4 $2 $\ +$2 $0 $4 $2 $] +$2 $0 $4 $2 $^ +$2 $0 $4 $2 $_ +$2 $0 $4 $2 $` +$2 $0 $4 $2 ${ +$2 $0 $4 $2 $| +$2 $0 $4 $2 $} +$2 $0 $4 $2 $~ +$2 $0 $4 $3 +$2 $0 $4 $3 $ +$2 $0 $4 $3 $! +$2 $0 $4 $3 $" +$2 $0 $4 $3 $# +$2 $0 $4 $3 $$ +$2 $0 $4 $3 $% +$2 $0 $4 $3 $& +$2 $0 $4 $3 $' +$2 $0 $4 $3 $( +$2 $0 $4 $3 $) +$2 $0 $4 $3 $* +$2 $0 $4 $3 $+ +$2 $0 $4 $3 $, +$2 $0 $4 $3 $- +$2 $0 $4 $3 $. +$2 $0 $4 $3 $/ +$2 $0 $4 $3 $: +$2 $0 $4 $3 $; +$2 $0 $4 $3 $< +$2 $0 $4 $3 $= +$2 $0 $4 $3 $> +$2 $0 $4 $3 $? +$2 $0 $4 $3 $@ +$2 $0 $4 $3 $[ +$2 $0 $4 $3 $\ +$2 $0 $4 $3 $] +$2 $0 $4 $3 $^ +$2 $0 $4 $3 $_ +$2 $0 $4 $3 $` +$2 $0 $4 $3 ${ +$2 $0 $4 $3 $| +$2 $0 $4 $3 $} +$2 $0 $4 $3 $~ +$2 $0 $4 $4 +$2 $0 $4 $4 $ +$2 $0 $4 $4 $! +$2 $0 $4 $4 $" +$2 $0 $4 $4 $# +$2 $0 $4 $4 $$ +$2 $0 $4 $4 $% +$2 $0 $4 $4 $& +$2 $0 $4 $4 $' +$2 $0 $4 $4 $( +$2 $0 $4 $4 $) +$2 $0 $4 $4 $* +$2 $0 $4 $4 $+ +$2 $0 $4 $4 $, +$2 $0 $4 $4 $- +$2 $0 $4 $4 $. +$2 $0 $4 $4 $/ +$2 $0 $4 $4 $: +$2 $0 $4 $4 $; +$2 $0 $4 $4 $< +$2 $0 $4 $4 $= +$2 $0 $4 $4 $> +$2 $0 $4 $4 $? +$2 $0 $4 $4 $@ +$2 $0 $4 $4 $[ +$2 $0 $4 $4 $\ +$2 $0 $4 $4 $] +$2 $0 $4 $4 $^ +$2 $0 $4 $4 $_ +$2 $0 $4 $4 $` +$2 $0 $4 $4 ${ +$2 $0 $4 $4 $| +$2 $0 $4 $4 $} +$2 $0 $4 $4 $~ +$2 $0 $4 $5 +$2 $0 $4 $5 $ +$2 $0 $4 $5 $! +$2 $0 $4 $5 $" +$2 $0 $4 $5 $# +$2 $0 $4 $5 $$ +$2 $0 $4 $5 $% +$2 $0 $4 $5 $& +$2 $0 $4 $5 $' +$2 $0 $4 $5 $( +$2 $0 $4 $5 $) +$2 $0 $4 $5 $* +$2 $0 $4 $5 $+ +$2 $0 $4 $5 $, +$2 $0 $4 $5 $- +$2 $0 $4 $5 $. +$2 $0 $4 $5 $/ +$2 $0 $4 $5 $: +$2 $0 $4 $5 $; +$2 $0 $4 $5 $< +$2 $0 $4 $5 $= +$2 $0 $4 $5 $> +$2 $0 $4 $5 $? +$2 $0 $4 $5 $@ +$2 $0 $4 $5 $[ +$2 $0 $4 $5 $\ +$2 $0 $4 $5 $] +$2 $0 $4 $5 $^ +$2 $0 $4 $5 $_ +$2 $0 $4 $5 $` +$2 $0 $4 $5 ${ +$2 $0 $4 $5 $| +$2 $0 $4 $5 $} +$2 $0 $4 $5 $~ +$2 $0 $4 $6 +$2 $0 $4 $6 $ +$2 $0 $4 $6 $! +$2 $0 $4 $6 $" +$2 $0 $4 $6 $# +$2 $0 $4 $6 $$ +$2 $0 $4 $6 $% +$2 $0 $4 $6 $& +$2 $0 $4 $6 $' +$2 $0 $4 $6 $( +$2 $0 $4 $6 $) +$2 $0 $4 $6 $* +$2 $0 $4 $6 $+ +$2 $0 $4 $6 $, +$2 $0 $4 $6 $- +$2 $0 $4 $6 $. +$2 $0 $4 $6 $/ +$2 $0 $4 $6 $: +$2 $0 $4 $6 $; +$2 $0 $4 $6 $< +$2 $0 $4 $6 $= +$2 $0 $4 $6 $> +$2 $0 $4 $6 $? +$2 $0 $4 $6 $@ +$2 $0 $4 $6 $[ +$2 $0 $4 $6 $\ +$2 $0 $4 $6 $] +$2 $0 $4 $6 $^ +$2 $0 $4 $6 $_ +$2 $0 $4 $6 $` +$2 $0 $4 $6 ${ +$2 $0 $4 $6 $| +$2 $0 $4 $6 $} +$2 $0 $4 $6 $~ +$2 $0 $4 $7 +$2 $0 $4 $7 $ +$2 $0 $4 $7 $! +$2 $0 $4 $7 $" +$2 $0 $4 $7 $# +$2 $0 $4 $7 $$ +$2 $0 $4 $7 $% +$2 $0 $4 $7 $& +$2 $0 $4 $7 $' +$2 $0 $4 $7 $( +$2 $0 $4 $7 $) +$2 $0 $4 $7 $* +$2 $0 $4 $7 $+ +$2 $0 $4 $7 $, +$2 $0 $4 $7 $- +$2 $0 $4 $7 $. +$2 $0 $4 $7 $/ +$2 $0 $4 $7 $: +$2 $0 $4 $7 $; +$2 $0 $4 $7 $< +$2 $0 $4 $7 $= +$2 $0 $4 $7 $> +$2 $0 $4 $7 $? +$2 $0 $4 $7 $@ +$2 $0 $4 $7 $[ +$2 $0 $4 $7 $\ +$2 $0 $4 $7 $] +$2 $0 $4 $7 $^ +$2 $0 $4 $7 $_ +$2 $0 $4 $7 $` +$2 $0 $4 $7 ${ +$2 $0 $4 $7 $| +$2 $0 $4 $7 $} +$2 $0 $4 $7 $~ +$2 $0 $4 $8 +$2 $0 $4 $8 $ +$2 $0 $4 $8 $! +$2 $0 $4 $8 $" +$2 $0 $4 $8 $# +$2 $0 $4 $8 $$ +$2 $0 $4 $8 $% +$2 $0 $4 $8 $& +$2 $0 $4 $8 $' +$2 $0 $4 $8 $( +$2 $0 $4 $8 $) +$2 $0 $4 $8 $* +$2 $0 $4 $8 $+ +$2 $0 $4 $8 $, +$2 $0 $4 $8 $- +$2 $0 $4 $8 $. +$2 $0 $4 $8 $/ +$2 $0 $4 $8 $: +$2 $0 $4 $8 $; +$2 $0 $4 $8 $< +$2 $0 $4 $8 $= +$2 $0 $4 $8 $> +$2 $0 $4 $8 $? +$2 $0 $4 $8 $@ +$2 $0 $4 $8 $[ +$2 $0 $4 $8 $\ +$2 $0 $4 $8 $] +$2 $0 $4 $8 $^ +$2 $0 $4 $8 $_ +$2 $0 $4 $8 $` +$2 $0 $4 $8 ${ +$2 $0 $4 $8 $| +$2 $0 $4 $8 $} +$2 $0 $4 $8 $~ +$2 $0 $4 $9 +$2 $0 $4 $9 $ +$2 $0 $4 $9 $! +$2 $0 $4 $9 $" +$2 $0 $4 $9 $# +$2 $0 $4 $9 $$ +$2 $0 $4 $9 $% +$2 $0 $4 $9 $& +$2 $0 $4 $9 $' +$2 $0 $4 $9 $( +$2 $0 $4 $9 $) +$2 $0 $4 $9 $* +$2 $0 $4 $9 $+ +$2 $0 $4 $9 $, +$2 $0 $4 $9 $- +$2 $0 $4 $9 $. +$2 $0 $4 $9 $/ +$2 $0 $4 $9 $: +$2 $0 $4 $9 $; +$2 $0 $4 $9 $< +$2 $0 $4 $9 $= +$2 $0 $4 $9 $> +$2 $0 $4 $9 $? +$2 $0 $4 $9 $@ +$2 $0 $4 $9 $[ +$2 $0 $4 $9 $\ +$2 $0 $4 $9 $] +$2 $0 $4 $9 $^ +$2 $0 $4 $9 $_ +$2 $0 $4 $9 $` +$2 $0 $4 $9 ${ +$2 $0 $4 $9 $| +$2 $0 $4 $9 $} +$2 $0 $4 $9 $~ +$2 $1 $! +$2 $1 '5 $1 +$2 $2 $! +$2 $2 $2 $! +$2 $2 $2 $2 +$2 $2 $2 $2 $2 $2 +$2 $2 $2 $2 $2 $2 $2 +$2 $2 $2 $2 $2 $2 $2 $2 +$2 $2 $2 $2 $2 $2 $2 $2 $2 +$2 $2 $2 $2 $2 $2 $2 $2 $2 $2 +$2 $2 $2 $2 $2 $2 $2 $2 $2 $2 $2 +$2 $2 $2 $2 $2 $2 $2 $2 $2 $2 $2 $2 +$2 $3 $! +$2 $3 $4 +$2 $4 $! +$2 $4 $7 $3 $3 $0 $3 $1 @@ -2578,30 +2521,19 @@ $3 $5 $3 $6 $3 $7 $3 $8 -$3$! -$3$0 -$3$1 -$3$2 -$3$2$1 -$3$3 -$3$3$! -$3$3$3 -$3$3$3$3 -$3$3$3$3$3$3 -$3$3$3$3$3$3$3 -$3$3$3$3$3$3$3$3 -$3$3$3$3$3$3$3$3$3 -$3$3$3$3$3$3$3$3$3$3 -$3$3$3$3$3$3$3$3$3$3$3 -$3$3$3$3$3$3$3$3$3$3$3$3 -$3$4 -$3$5 -$3$5$! -$3$6 -$3$7 -$3$8 -$3$9 -$3*44 +$3 $! +$3 $2 $1 +$3 $3 $! +$3 $3 $3 $3 +$3 $3 $3 $3 $3 $3 +$3 $3 $3 $3 $3 $3 $3 +$3 $3 $3 $3 $3 $3 $3 $3 +$3 $3 $3 $3 $3 $3 $3 $3 $3 +$3 $3 $3 $3 $3 $3 $3 $3 $3 $3 +$3 $3 $3 $3 $3 $3 $3 $3 $3 $3 $3 +$3 $3 $3 $3 $3 $3 $3 $3 $3 $3 $3 $3 +$3 $5 $! +$3 $9 $4 $4 $0 $4 $3 @@ -2610,28 +2542,21 @@ $4 $5 $4 $6 $4 $7 $4 $8 -$4$! -$4$0 -$4$1 -$4$2 -$4$2$0 -$4$3 -$4$4 -$4$4$4 -$4$4$4$4 -$4$4$4$4$4$4 -$4$4$4$4$4$4$4 -$4$4$4$4$4$4$4$4 -$4$4$4$4$4$4$4$4$4 -$4$4$4$4$4$4$4$4$4$4 -$4$4$4$4$4$4$4$4$4$4$4 -$4$4$4$4$4$4$4$4$4$4$4$4 -$4$5 -$4$5$6 -$4$6 -$4$7 -$4$8 -$4$9 +$4 $! +$4 $1 +$4 $2 +$4 $2 $0 +$4 $4 $4 +$4 $4 $4 $4 +$4 $4 $4 $4 $4 $4 +$4 $4 $4 $4 $4 $4 $4 +$4 $4 $4 $4 $4 $4 $4 $4 +$4 $4 $4 $4 $4 $4 $4 $4 $4 +$4 $4 $4 $4 $4 $4 $4 $4 $4 $4 +$4 $4 $4 $4 $4 $4 $4 $4 $4 $4 $4 +$4 $4 $4 $4 $4 $4 $4 $4 $4 $4 $4 $4 +$4 $5 $6 +$4 $9 $5 $5 $0 $5 $2 @@ -2641,28 +2566,20 @@ $5 $5 $5 $5 $6 $5 $7 $5 $9 -$5$! -$5$0 -$5$1 -$5$2 -$5$2$0 -$5$2$1 -$5$3 -$5$4 -$5$5 -$5$5$5 -$5$5$5$5 -$5$5$5$5$5$5 -$5$5$5$5$5$5$5 -$5$5$5$5$5$5$5$5 -$5$5$5$5$5$5$5$5$5 -$5$5$5$5$5$5$5$5$5$5 -$5$5$5$5$5$5$5$5$5$5$5 -$5$5$5$5$5$5$5$5$5$5$5$5 -$5$6 -$5$7 -$5$8 -$5$9 +$5 $! +$5 $1 +$5 $2 $0 +$5 $2 $1 +$5 $4 +$5 $5 $5 $5 +$5 $5 $5 $5 $5 $5 +$5 $5 $5 $5 $5 $5 $5 +$5 $5 $5 $5 $5 $5 $5 $5 +$5 $5 $5 $5 $5 $5 $5 $5 $5 +$5 $5 $5 $5 $5 $5 $5 $5 $5 $5 +$5 $5 $5 $5 $5 $5 $5 $5 $5 $5 $5 +$5 $5 $5 $5 $5 $5 $5 $5 $5 $5 $5 $5 +$5 $8 $6 $6 $2 $6 $3 @@ -2673,27 +2590,18 @@ $6 $6 $6 $6 $7 $6 $8 $6 $9 -$6$0 -$6$1 -$6$2 -$6$3 -$6$4 -$6$5 -$6$6 -$6$6$6 -$6$6$6$6 -$6$6$6$6$6$6 -$6$6$6$6$6$6$6 -$6$6$6$6$6$6$6$6 -$6$6$6$6$6$6$6$6$6 -$6$6$6$6$6$6$6$6$6$6 -$6$6$6$6$6$6$6$6$6$6$6 -$6$6$6$6$6$6$6$6$6$6$6$6 -$6$7 -$6$8 -$6$9 -$6$9z5x15 -$6p4'5D1 +$6 $0 +$6 $1 +$6 $6 $6 $6 +$6 $6 $6 $6 $6 $6 +$6 $6 $6 $6 $6 $6 $6 +$6 $6 $6 $6 $6 $6 $6 $6 +$6 $6 $6 $6 $6 $6 $6 $6 $6 +$6 $6 $6 $6 $6 $6 $6 $6 $6 $6 +$6 $6 $6 $6 $6 $6 $6 $6 $6 $6 $6 +$6 $6 $6 $6 $6 $6 $6 $6 $6 $6 $6 $6 +z5 x15 +$6 p4 '5 D1 $7 $7 $0 $7 $1 @@ -2706,29 +2614,17 @@ $7 $7 $7 $7 $7 $7 $8 $7 $9 -$7$! -$7$0 -$7$1 -$7$2 -$7$3 -$7$4 -$7$5 -$7$6 -$7$7 -$7$7$7 -$7$7$7$! -$7$7$7$7 -$7$7$7$7$7$7 -$7$7$7$7$7$7$7 -$7$7$7$7$7$7$7$7 -$7$7$7$7$7$7$7$7$7 -$7$7$7$7$7$7$7$7$7$7 -$7$7$7$7$7$7$7$7$7$7$7 -$7$7$7$7$7$7$7$7$7$7$7$7 -$7$8 -$7$8$9 -$7$9 -$7Y1Kz3x13 +$7 $! +$7 $7 $7 $! +$7 $7 $7 $7 +$7 $7 $7 $7 $7 $7 +$7 $7 $7 $7 $7 $7 $7 +$7 $7 $7 $7 $7 $7 $7 $7 +$7 $7 $7 $7 $7 $7 $7 $7 $7 +$7 $7 $7 $7 $7 $7 $7 $7 $7 $7 +$7 $7 $7 $7 $7 $7 $7 $7 $7 $7 $7 +$7 $7 $7 $7 $7 $7 $7 $7 $7 $7 $7 $7 +$7 $8 $9 $8 $8 $0 $8 $1 @@ -2740,28 +2636,16 @@ $8 $7 $8 $8 $8 $8 $8 $8 $9 -$8$0 -$8$1 -$8$2 -$8$3 -$8$4 -$8$5 -$8$6 -$8$7 -$8$8 -$8$8$! -$8$8$8 -$8$8$8$8 -$8$8$8$8$8$8 -$8$8$8$8$8$8$8 -$8$8$8$8$8$8$8$8 -$8$8$8$8$8$8$8$8$8 -$8$8$8$8$8$8$8$8$8$8 -$8$8$8$8$8$8$8$8$8$8$8 -$8$8$8$8$8$8$8$8$8$8$8$8 -$8$8kk -$8$9 -$8z3x13 +$8 $4 +$8 $8 $! +$8 $8 $8 $8 +$8 $8 $8 $8 $8 $8 +$8 $8 $8 $8 $8 $8 $8 +$8 $8 $8 $8 $8 $8 $8 $8 +$8 $8 $8 $8 $8 $8 $8 $8 $8 +$8 $8 $8 $8 $8 $8 $8 $8 $8 $8 +$8 $8 $8 $8 $8 $8 $8 $8 $8 $8 $8 +$8 $8 $8 $8 $8 $8 $8 $8 $8 $8 $8 $8 $9 $9 $0 $9 $1 @@ -2775,655 +2659,632 @@ $9 $8 $9 $9 $9 $9 $9 $9 $9 $9 $9 -$9$0 -$9$1 -$9$1$1 -$9$2 -$9$3 -$9$4 -$9$5 -$9$6 -$9$7 -$9$7$1 -$9$7$2 -$9$8 -$9$9 -$9$9$! -$9$9$9 -$9$9$9$9 -$9$9$9$9$9$9 -$9$9$9$9$9$9$9 -$9$9$9$9$9$9$9$9 -$9$9$9$9$9$9$9$9$9 -$9$9$9$9$9$9$9$9$9$9 -$9$9$9$9$9$9$9$9$9$9$9 -$9$9$9$9$9$9$9$9$9$9$9$9 -$9Z1 +$9 $1 $1 +$9 $7 $1 +$9 $7 $2 +$9 $9 $! +$9 $9 $9 $9 $9 $9 +$9 $9 $9 $9 $9 $9 $9 +$9 $9 $9 $9 $9 $9 $9 $9 +$9 $9 $9 $9 $9 $9 $9 $9 $9 +$9 $9 $9 $9 $9 $9 $9 $9 $9 $9 +$9 $9 $9 $9 $9 $9 $9 $9 $9 $9 $9 +$9 $9 $9 $9 $9 $9 $9 $9 $9 $9 $9 $9 $: $; -$;$ +$; $ $< -$<$3 +$< $3 $= $> $? $@ -$@$.$: -$@$0$1 -$@$1 -$@$1$0 -$@$1$1 -$@$1$2 -$@$1$2$3 -$@$1$2$3$4 -$@$1$2$3$4$5 -$@$1$3 -$@$2 -$@$2$2 -$@$@ -$@$a$m$e$l$e$.$c$o$m -$@$a$o$l$.$c$o$m -$@$b$e$l$l$s$o$u$t$h$.$n$e$t -$@$b$i$g$s$t$r$i$n$g$.$c$o$m -$@$c$o$m$c$a$s$t$.$n$e$t -$@$c$o$x$.$n$e$t -$@$e$a$r$t$h$l$i$n$k$.$n$e$t -$@$f$a$s$t$m$a$i$l$.$f$m -$@$g$a$w$a$b$.$c$o$m -$@$g$m$a$i$l$.$c$o$m -$@$g$m$x$.$c$o$m -$@$g$m$x$.$u$s -$@$h$o$t$m$a$i$l$.$c$o$.$u$k -$@$h$o$t$m$a$i$l$.$c$o$m -$@$i$n$b$o$x$.$r$u -$@$l$i$v$e$.$c$o$.$u$k -$@$l$i$v$e$.$c$o$m -$@$m$a$i$l$.$c$o$m -$@$m$a$i$l$.$r$u -$@$m$s$n$.$c$o$m -$@$v$e$r$i$z$o$n$.$n$e$t -$@$w$p$.$p$l -$@$y$a$h$o$o$.$c$a -$@$y$a$h$o$o$.$c$o$.$i$n -$@$y$a$h$o$o$.$c$o$.$u$k -$@$y$a$h$o$o$.$c$o$m -$@$y$m$a$i$l$.$c$o$m -$@$z$o$h$o$.$c$o$m -$A$n$g$e$l -$A$p$r$i$l -$C$h$r$i$s -$D$a$n$i$e$l -$D$a$v$i$d +$@ $. $: +$@ $0 $1 +$@ $1 +$@ $1 $0 +$@ $1 $1 +$@ $1 $2 +$@ $1 $2 $3 +$@ $1 $2 $3 $4 +$@ $1 $2 $3 $4 $5 +$@ $1 $3 +$@ $2 +$@ $2 $2 +$@ $@ +$@ $a $m $e $l $e $. $c $o $m +$@ $a $o $l $. $c $o $m +$@ $b $e $l $l $s $o $u $t $h $. $n $e $t +$@ $b $i $g $s $t $r $i $n $g $. $c $o $m +$@ $c $o $m $c $a $s $t $. $n $e $t +$@ $c $o $x $. $n $e $t +$@ $e $a $r $t $h $l $i $n $k $. $n $e $t +$@ $f $a $s $t $m $a $i $l $. $f $m +$@ $g $a $w $a $b $. $c $o $m +$@ $g $m $a $i $l $. $c $o $m +$@ $g $m $x $. $c $o $m +$@ $g $m $x $. $u $s +$@ $h $o $t $m $a $i $l $. $c $o $. $u $k +$@ $h $o $t $m $a $i $l $. $c $o $m +$@ $i $n $b $o $x $. $r $u +$@ $l $i $v $e $. $c $o $. $u $k +$@ $l $i $v $e $. $c $o $m +$@ $m $a $i $l $. $c $o $m +$@ $m $a $i $l $. $r $u +$@ $m $s $n $. $c $o $m +$@ $v $e $r $i $z $o $n $. $n $e $t +$@ $w $p $. $p $l +$@ $y $a $h $o $o $. $c $a +$@ $y $a $h $o $o $. $c $o $. $i $n +$@ $y $a $h $o $o $. $c $o $. $u $k +$@ $y $a $h $o $o $. $c $o $m +$@ $y $m $a $i $l $. $c $o $m +$@ $z $o $h $o $. $c $o $m +$A $n $g $e $l +$A $p $r $i $l +$C $h $r $i $s +$D $a $n $i $e $l +$D $a $v $i $d $F $G $L -$P$a$s$s$w$o$r$$d -$Q$w$$e$r$t$y -$Sl +$P $a $s $s $w $o $r $$ d +$Q $w $$ e$ r $t $y +$S l $Y $[ $\ $] $_ $_ $1 -$_$!$ -$_$0 -$_$0$0 -$_$0$1 -$_$0$5 -$_$0$6 -$_$0$7 -$_$0$8 -$_$0$9 -$_$1 -$_$1$0 -$_$1$1 -$_$1$2 -$_$1$2$3 -$_$1$3 -$_$1$4 -$_$1$5 -$_$1$6 -$_$1$7 -$_$1$8 -$_$1$9 -$_$2 -$_$2$0 -$_$2$0$0$0 -$_$2$0$1$0$! -$_$2$1 -$_$2$2 -$_$2$3 -$_$2$4 -$_$2$5 -$_$2$7 -$_$3 -$_$4 -$_$5 -$_$6 -$_$6$9 -$_$7 -$_$7$7 -$_$8 -$_$8$6 -$_$8$7 -$_$8$8 -$_$8$9 -$_$9 -$_$9$0 -$_$9$1 -$_$9$2 -$_$9$3 -$_$9$4 -$_$9$5 -$_$9$9 -$_$_ -$_$_$_ -$_$_$_$_ +$_ $! $ +$_ $0 +$_ $0 $0 +$_ $0 $1 +$_ $0 $5 +$_ $0 $6 +$_ $0 $7 +$_ $0 $8 +$_ $0 $9 +$_ $1 $0 +$_ $1 $1 +$_ $1 $2 +$_ $1 $2 $3 +$_ $1 $3 +$_ $1 $4 +$_ $1 $5 +$_ $1 $6 +$_ $1 $7 +$_ $1 $8 +$_ $1 $9 +$_ $2 +$_ $2 $0 +$_ $2 $0 $0 $0 +$_ $2 $0 $1 $0 $! +$_ $2 $1 +$_ $2 $2 +$_ $2 $3 +$_ $2 $4 +$_ $2 $5 +$_ $2 $7 +$_ $3 +$_ $4 +$_ $5 +$_ $6 +$_ $6 $9 +$_ $7 +$_ $7 $7 +$_ $8 +$_ $8 $6 +$_ $8 $7 +$_ $8 $8 +$_ $8 $9 +$_ $9 +$_ $9 $0 +$_ $9 $1 +$_ $9 $2 +$_ $9 $3 +$_ $9 $4 +$_ $9 $5 +$_ $9 $9 +$_ $_ +$_ $_ $_ +$_ $_ $_ $_ $` -$`'5 +$` '5 $a -$a$a$r$o$n -$a$b$c$d$e -$a$b$l$e -$a$c$l$e -$a$d$$r$i$a$n -$a$d$m$i$n -$a$g$e -$a$h$m$e$d -$a$l -$a$l$e$k$s -$a$l$e$n$a -$a$l$e$x$i$s -$a$l$i$c$e -$a$l$i$n$a -$a$l$l$y -$a$m$a$n$d$a -$a$m$b$e$r -$a$n$a -$a$n$c$e -$a$n$d -$a$n$d$$r$e -$a$n$d$$r$e$a -$a$n$d$r$e$i -$a$n$d$r$e$s -$a$n$d$r$e$w -$a$n$d$r$e$y -$a$n$e -$a$n$g$e$l -$a$n$g$e$l$a -$a$n$t -$a$n$t$h$o$n$y -$a$n$t$o$n -$a$n$t$o$n$i$o -$a$p$p$$l$e -$a$p$r$i$l -$a$r$t$e$m -$a$r$t$u$r -$a$r$y -$a$s$d$a$s$$d -$a$s$d$f$g -$a$s$e -$a$s$h$l$e$y -$a$t$i$o$n -$a$t$i$v$e -$a$u$g$u$s$t -$a$u$x +$a $a $r $o $n +$a $b $c $d $e +$a $b $l $e +$a $c $l $e +$a $d $$ r $i $a $n +$a $d $m $i $n +$a $g $e +$a $h $m $e $d +$a $l +$a $l $e $k $s +$a $l $e $n $a +$a $l $e $x $i $s +$a $l $i $c $e +$a $l $i $n $a +$a $l $l $y +$a $m $a $n $d $a +$a $m $b $e $r +$a $n $a +$a $n $c $e +$a $n $d +$a $n $d $$ r $e +$a $n $d $$ r $e $a +$a $n $d $r $e $i +$a $n $d $r $e $s +$a $n $d $r $e $w +$a $n $d $r $e $y +$a $n $e +$a $n $g $e $l +$a $n $g $e $l $a +$a $n $t +$a $n $t $h $o $n $y +$a $n $t $o $n +$a $n $t $o $n $i $o +$a $p $p $$ l $e +$a $p $r $i $l +$a $r $t $e $m +$a $r $t $u $r +$a $r $y +$a $s $d $a $s $$ d +$a $s $d $f $g +$a $s $e +$a $s $h $l $e $y +$a $t $i $o $n +$a $t $i $v $e +$a $u $g $u $s $t +$a $u $x $b -$b$a$c$k -$b$a$c$o$n -$b$a$l$l -$b$e$$l$l$a -$b$e$l$l -$b$l$a$c$k -$b$o$o$k -$b$o$y -$b$r$i$a$n -$b$r$o$w$n -$b$r$u$n$o -$b$u$d$d$y +$b $a $c $k +$b $a $c $o $n +$b $a $l $l +$b $e $$ l $l $a +$b $e $l $l +$b $l $a $c $k +$b $o $o $k +$b $o $y +$b $r $i $a $n +$b $r $o $w $n +$b $r $u $n $o +$b $u $d $d $y $c -$c$a$$r$l$o$s -$c$a$n$d$y -$c$a$r$o$$l -$c$h$a$r$l$i$e -$c$h$e$n$g -$c$h$e$r$r$y -$c$h$l$o$e -$c$h$r$i$s -$c$i$n$d$y -$c$y +$c $a $$ r $l $o $s +$c $a $n $d $y +$c $a $r $o $$ l +$c $h $a $r $l $i $e +$c $h $e $n $g +$c $h $e $r $r $y +$c $h $l $o $e +$c $h $r $i $s +$c $i $n $d $y +$c $y $d -$d$a$i$s$y -$d$a$n$i$e$l -$d$a$n$i$l -$d$a$n$n$y -$d$a$s$h$a -$d$a$v$i$d -$d$a$y -$d$e$m$o$n -$d$e$n$i$s -$d$e$n$n$i$s -$d$g$k$j$h$s -$d$i$a$n$a -$d$i$e$g$o -$d$i$m$o$n -$d$o$g -$d$o$m$e -$d$r$a$g$o$n +$d $a $i $s $y +$d $a $n $i $e $l +$d $a $n $i $l +$d $a $n $n $y +$d $a $s $h $a +$d $a $v $i $d +$d $a $y +$d $e $m $o $n +$d $e $n $i $s +$d $e $n $n $i $s +$d $g $k $j $h $s +$d $i $a $n $a +$d $i $e $g $o +$d $i $m $o $n +$d $o $g +$d $o $m $e +$d $r $a $g $o $n $e $e $d -$e$a$u -$e$d -$e$e -$e$l$e$n$a -$e$l$l$a -$e$m$i$l$y -$e$n -$e$n$c$e -$e$n$t -$e$o$u$s -$e$r -$e$r$y -$e$s$s -$e$s$t -$e$t -$e$t$t$e -$e$v$e$n$$t$p +$e $a $u +$e $e +$e $l $e $n $a +$e $l $l $a +$e $m $i $l $y +$e $n +$e $n $c $e +$e $n $t +$e $o $u $s +$e $r +$e $r $y +$e $s $s +$e $s $t +$e $t +$e $t $t $e +$e $v $e $n $$ t $p $f -$f$a$m$i$$l$y -$f$a$r$m$v$i$l$l$e -$f$b$o$b$h -$f$e$l$i$x -$f$o$r$e$v$e$r -$f$o$r$m -$f$r$a$m$e -$f$r$a$n$k -$f$u$l -$f$u$l$l$y +$f $a $m $i $$ l $y +$f $a $r $m $v $i $l $l $e +$f $b $o $b $h +$f $e $l $i $x +$f $o $r $e $v $e $r +$f $o $r $m +$f $r $a $m $e +$f $r $a $n $k +$f $u $l +$f $u $l $l $y $g -$g$a$b$r$i$e$l -$g$a$d$g$a$d -$g$e$n$y -$g$e$o$$r$g$e -$g$f$h$j$$k$m -$g$l$a$s$s -$g$r$a$c$e -$g$r$e$e$n +$g $a $b $r $i $e $l +$g $a $d $g $a $d +$g $e $n $y +$g $e $o $$ r $g $e +$g $f $h $j $$ k $m +$g $l $a $s $s +$g $r $a $c $e +$g $r $e $e $n $h -$h$a$c$k$e$r -$h$a$n$n$a$h -$h$a$p$p$y -$h$a$r$r$y -$h$e$a$d -$h$e$l$l$o -$h$e$n$r$y -$h$o$n$d$a -$h$o$n$e$y -$h$o$o$d -$h$u$a$n$g -$h$u$n$t$e$r +$h $a $c $k $e $r +$h $a $n $n $a $h +$h $a $p $p $y +$h $a $r $r $y +$h $e $a $d +$h $e $l $l $o +$h $e $n $r $y +$h $o $n $d $a +$h $o $n $e $y +$h $o $o $d +$h $u $a $n $g +$h $u $n $t $e $r $i -$i$$l$o$v$e -$i$a$l -$i$b$l$e -$i$c -$i$c$e$s -$i$c$l$e -$i$d$e -$i$e$r -$i$e$s -$i$e$s$t -$i$f$y -$i$l$e -$i$l$i$a -$i$l$o$v$e$y$o$u -$i$l$y -$i$n$e -$i$n$g -$i$n$v$a$l$i$d$l$o$g$i$n -$i$o$n -$i$o$u$s -$i$r$i$n$a -$i$s$e -$i$s$h -$i$s$m -$i$s$t -$i$t$e -$i$t$i$c -$i$t$i$o$n -$i$t$i$v$e -$i$t$y -$i$v$e -$i$x -$i$z$e -$j$$e$s$s$i$c$a -$j$a$c$o$b -$j$a$m$e$s -$j$a$s$o$n -$j$e$$r$r$y -$j$e$n$n$y -$j$e$s$u$s -$j$i$a$n$g -$j$i$m$m$y -$j$o$$r$g$e -$j$o$h$n -$j$o$h$n$s$o$n -$j$o$k$e$r -$j$o$n$e$s -$j$o$r$$d$a$n -$j$o$s$h$u$a -$j$u$l$i$a -$j$u$l$i$o -$j$u$n$i$o$r -$j$u$s$t$i$n +$i $$ l $o $v $e +$i $a $l +$i $b $l $e +$i $c +$i $c $e $s +$i $c $l $e +$i $d $e +$i $e $r +$i $e $s +$i $e $s $t +$i $f $y +$i $l $e +$i $l $i $a +$i $l $o $v $e $y $o $u +$i $l $y +$i $n $e +$i $n $g +$i $n $v $a $l $i $d $l $o $g $i $n +$i $o $n +$i $o $u $s +$i $r $i $n $a +$i $s $e +$i $s $h +$i $s $m +$i $s $t +$i $t $e +$i $t $i $c +$i $t $i $o $n +$i $t $i $v $e +$i $t $y +$i $v $e +$i $x +$i $z $e +$j $$ e$ s$s $i $c $a +$j $a $c $o $b +$j $a $m $e $s +$j $a $s $o $n +$j $e $$ r $r $y +$j $e $n $n $y +$j $e $s $u $s +$j $i $a $n $g +$j $i $m $m $y +$j $o $$ r $g $e +$j $o $h $n +$j $o $h $n $s $o $n +$j $o $k $e $r +$j $o $n $e $s +$j $o $r $$ d $a $n +$j $o $s $h $u $a +$j $u $l $i $a +$j $u $l $i $o +$j $u $n $i $o $r +$j $u $s $t $i $n $k -$k$a$r$e$n -$k$a$r$i$n$a -$k$a$t$$$a -$k$e$l$l$y -$k$e$v$i$n -$k$h$a$n -$k$i$l$l$e$r -$k$i$n -$k$i$r$i$$l$l -$k$i$t$t$y +$k $a $r $e $n +$k $a $r $i $n $a +$k $a $t $$ $a +$k $e $l $l $y +$k $e $v $i $n +$k $h $a $n +$k $i $l $l $e $r +$k $i $n +$k $i $r $i $$ l $l +$k $i $t $t $y $l -$l$a$$u$r$a -$l$a$n$d -$l$e$e -$l$e$s$s -$l$e$t -$l$i$a$n$g -$l$i$k$e -$l$i$n$d$a -$l$i$n$e -$l$i$n$g -$l$o$n$g -$l$u$c$a$s -$l$u$c$k$y -$l$u$n$c$h -$l$y +$l $a $$ u $r $a +$l $a $n $d +$l $e $e +$l $e $s $s +$l $e $t +$l $i $a $n $g +$l $i $k $e +$l $i $n $d $a +$l $i $n $e +$l $i $n $g +$l $o $n $g +$l $u $c $a $s +$l $u $c $k $y +$l $u $n $c $h +$l $y $m -$m$a$g$g$i$e -$m$a$k$s$i$m -$m$a$n -$m$a$r$$c$o -$m$a$r$c$h -$m$a$r$i$a -$m$a$r$i$e -$m$a$r$i$n$a -$m$a$r$i$o -$m$a$r$t$a -$m$a$r$t$i$n -$m$a$s$h$a -$m$a$s$t$e$r -$m$a$x$i$m -$m$e -$m$e$n -$m$e$n$t -$m$i$c$h$a$$e$l -$m$i$c$h$a$e$l -$m$i$c$h$e$l$l$e -$m$i$g$u$e$l -$m$i$k$e -$m$i$s$h$a -$m$o$l$l$y -$m$o$n$e$y -$m$o$n$k$e$y -$m$u$s$i$c -$m$y$s$p$a$c$e +$m $a $g $g $i $e +$m $a $k $s $i $m +$m $a $n +$m $a $r $$ c $o +$m $a $r $c $h +$m $a $r $i $a +$m $a $r $i $e +$m $a $r $i $n $a +$m $a $r $i $o +$m $a $r $t $a +$m $a $r $t $i $n +$m $a $s $h $a +$m $a $s $t $e $r +$m $a $x $i $m +$m $e +$m $e $n +$m $e $n $t +$m $i $c $h $a $$ l +$m $i $c $h $a $e $l +$m $i $c $h $e $l $l $e +$m $i $g $u $e $l +$m $i $k $e +$m $i $s $h $a +$m $o $l $l $y +$m $o $n $e $y +$m $o $n $k $e $y +$m $u $s $i $c +$m $y $s $p $a $c $e $n -$n$a$r$u$t$o -$n$a$s$t$y$a -$n$a$t$a$l$i -$n$a$t$a$s$h$a -$n$e$s$s -$n$i$c$o$l$e -$n$i$k$i$t$a -$n$o$k$i$a +$n $a $r $u $t $o +$n $a $s $t $y $a +$n $a $t $a $l $i +$n $a $t $a $s $h $a +$n $e $s $s +$n $i $c $o $l $e +$n $i $k $i $t $a +$n $o $k $i $a $o -$o$e$s -$o$i$d -$o$k$s$a$n$a -$o$l -$o$l$i$v$$e$r -$o$l$o$g$y -$o$m$y -$o$r -$o$r$a$n$g$e -$o$r$y -$o$s$c$a$r -$o$s$e -$o$u$r -$o$u$s -$o$u$t -$o$v$e$r +$o $e $s +$o $i $d +$o $k $s $a $n $a +$o $l +$o $l $i $v $$ e$ r +$o $l $o $g $y +$o $m $y +$o $r +$o $r $a $n $g $e +$o $r $y +$o $s $c $a $r +$o $s $e +$o $u $r +$o $u $s +$o $u $t +$o $v $e $r $p -$p$a$b$l$o -$p$a$n$d$a -$p$a$s$h$a -$p$a$s$s -$p$a$s$s$w$o$$r$d -$p$a$v$e$l -$p$e$d$r$o -$p$e$t$e$r -$p$h$o$n$e -$p$h$p$b$b -$p$o$l$i$n$a -$p$o$w$e$r -$p$r$i$n$c$e$s$s -$p$u$$r$p$l$e -$q$a$z$w$s$x -$q$w$e$r$t -$q$w$e$r$t$y -$q$w$e$r$t$y$u$i$o$p +$p $a $b $l $o +$p $a $n $d $a +$p $a $s $h $a +$p $a $s $s +$p $a $s $s $w $o $$ r $d +$p $a $v $e $l +$p $e $d $r $o +$p $e $t $e $r +$p $h $o $n $e +$p $h $p $b $b +$p $o $l $i $n $a +$p $o $w $e $r +$p $r $i $n $c $e $s $s +$p $u $$ r $p $l $e +$q $a $z $w $s $x +$q $w $e $r $t +$q $w $e $r $t $y +$q $w $e $r $t $y $u $i $o $p $r -$r$o$b$e$r$t -$r$o$c$k$y -$r$o$m$a$n -$r$o$o$m -$r$u$$s$l$a$n +$r $o $b $e $r $t +$r $o $c $k $y +$r $o $m $a $n +$r $o $o $m +$r $u $$ s$l $a $n $s -$s$$e$r$g$e$i -$s$a$l$a$s$a$n$a -$s$a$m$m$y -$s$a$m$s$u$n$g -$s$a$m$u$e$l -$s$a$n$d$r$a -$s$a$n$d$y -$s$a$n$y$a -$s$a$r$a$h -$s$a$s$h$a -$s$e$r$e$g$a -$s$e$r$g$e$y -$s$e$r$v$e$r -$s$e$s -$s$h$a$d$o$w -$s$h$a$r$k -$s$h$i$p -$s$i$d$e -$s$i$m$o$n -$s$i$o$n -$s$i$s -$s$l$a$v$a -$s$m$i$l$e -$s$m$i$t$h -$s$o$c$c$e$r -$s$o$f$i$a -$s$o$m$e -$s$o$p$h$i$e -$s$t$e$v$e -$s$t$e$v$e$n -$s$u$m$m$e$r -$s$u$n$$s$h$i$n$e -$s$u$n$n$y -$s$u$p$e$r -$s$v$$e$t$a -$s$w$$e$e$t +$s $$ e$ r $g $e $i +$s $a $l $a $s $a $n $a +$s $a $m $m $y +$s $a $m $s $u $n $g +$s $a $m $u $e $l +$s $a $n $d $r $a +$s $a $n $d $y +$s $a $n $y $a +$s $a $r $a $h +$s $a $s $h $a +$s $e $r $e $g $a +$s $e $r $g $e $y +$s $e $r $v $e $r +$s $e $s +$s $h $a $d $o $w +$s $h $a $r $k +$s $h $i $p +$s $i $d $e +$s $i $m $o $n +$s $i $o $n +$s $i $s +$s $l $a $v $a +$s $m $i $l $e +$s $m $i $t $h +$s $o $c $c $e $r +$s $o $f $i $a +$s $o $m $e +$s $o $p $h $i $e +$s $t $e $v $e +$s $t $e $v $e $n +$s $u $m $m $e $r +$s $u $n $$ s$h $i $n $e +$s $u $n $n $y +$s $u $p $e $r +$s $v $$ e$ t $a +$s $w $$ e$ t $t -$t$a$b$l$e -$t$a$n$y$a -$t$a$y$l$o$r -$t$e$a$m$o -$t$e$s$t -$t$h$a$n$h -$t$h$e -$t$h$o$m$a$s -$t$i$g$e$r -$t$i$o$n -$t$o$m$m$y -$t$y -$t$y$l$e$r +$t $a $b $l $e +$t $a $n $y $a +$t $a $y $l $o $r +$t $e $a $m $o +$t $e $s $t +$t $h $a $n $h +$t $h $e +$t $h $o $m $a $s +$t $i $g $e $r +$t $i $o $n +$t $o $m $m $y +$t $y +$t $y $l $e $r $u -$u$m -$u$p +$u $m +$u $p $v -$v$a$d$i$m -$v$i$c$t$o$r -$w$a$y -$w$i$l$l$i$a$m -$w$i$s$e -$w$o$a$i$n$i -$w$o$o$d +$v $a $d $i $m +$v $i $c $t $o $r +$w $a $y +$w $i $l $l $i $a $m +$w $i $s $e +$w $o $a $i $n $i +$w $o $o $d $x $y -$y$$f$c$n$z +$y $$ f $c $n $z $z -$z$a$c$k$s -$z$h$a$n$g -$z$h$e$n$g -$z$o$m$a$t$o -$z$x$c$v$b$n$m -${x12] +$z $a $c $k $s +$z $h $a $n $g +$z $h $e $n $g +$z $o $m $a $t $o +$z $x $c $v $b $n $m +${ x12 ] $| -$~$!$@$#$$ -'0 +$~ $! $@ $# $$ '1 '2 -'2$. +'2 $. '3 -'3$. -'3$1$2$3 -'3d +'3 $. +'3 $1 $2 $3 +'3 d '4 -'4 d -'4$. -'4$y -'4d -'4i4y -'4p1 -'4y4 +'4 p1 +'4 $. +'4 $y +'4 i4y '5 '5 $1 -'5$. -'5$1 -'5D2d -'5D2p1 -'5D3 -'5[ +'5 $. +'5 D2 p1 +'5 D3 +'5 [ '6 -'6 -'6$! -'6$!$! -'6$!$!$! -'6$!$!$!$! -'6$!$!$!$!$!$! -'6$!$!$!$!$!$!$!$! -'6$!$!$!$!$!$!$!$!$! -'6$!$!$!$!$!$!$!$!$!$! -'6$!$!$!$!$!$!$!$!$!$!$!$! -'6$# -'6$$ -'6$% -'6$& -'6$( -'6$* -'6$+ -'6$- -'6$. -'6$0 -'6$1 -'6$1$2$3 -'6$2 -'6$3 -'6$4 -'6$5 -'6$6 -'6$7 -'6$8 -'6$9 -'6$: -'6$; -'6$< -'6$= -'6$> -'6$? -'6$[ -'6$\ -'6$] -'6$^ -'6$_ -'6$i$2$3$4 -'6${ -'6$| -'6$} -'6$~ +'6 $! +'6 $! $! +'6 $! $! $! +'6 $! $! $! $! +'6 $! $! $! $! $! $! +'6 $! $! $! $! $! $! $! $! +'6 $! $! $! $! $! $! $! $! $! +'6 $! $! $! $! $! $! $! $! $! $! +'6 $! $! $! $! $! $! $! $! $! $! $! $! +'6 $# +'6 $$ +'6 $% +'6 $& +'6 $( +'6 $* +'6 $+ +'6 $- +'6 $. +'6 $0 +'6 $1 +'6 $1 $2 $3 +'6 $2 +'6 $3 +'6 $4 +'6 $5 +'6 $6 +'6 $7 +'6 $8 +'6 $9 +'6 $: +'6 $; +'6 $< +'6 $= +'6 $> +'6 $? +'6 $[ +'6 $\ +'6 $] +'6 $^ +'6 $_ +'6 $i $2 $3 $4 +'6 ${ +'6 $| +'6 $} +'6 $~ '7 -'7 -'7$! -'7$!$! -'7$!$!$! -'7$!$!$!$! -'7$!$!$!$!$!$! -'7$!$!$!$!$!$!$! -'7$!$!$!$!$!$!$!$! -'7$!$!$!$!$!$!$!$!$! -'7$!$!$!$!$!$!$!$!$!$! -'7$!$!$!$!$!$!$!$!$!$!$!$! -'7$# -'7$$ -'7$% -'7$& -'7$) -'7$* -'7$+ -'7$- -'7$0 -'7$1 -'7$1$2$3 -'7$1$2$3$4 -'7$2 -'7$3 -'7$4 -'7$5 -'7$6 -'7$7 -'7$8 -'7$9 -'7$: -'7$; -'7$< -'7$= -'7$> -'7$? -'7$[ -'7$\ -'7$] -'7$^ -'7$_ -'7${ -'7$| -'7$} -'7$~ +'7 $! +'7 $! $! +'7 $! $! $! +'7 $! $! $! $! +'7 $! $! $! $! $! $! +'7 $! $! $! $! $! $! $! +'7 $! $! $! $! $! $! $! $! +'7 $! $! $! $! $! $! $! $! $! +'7 $! $! $! $! $! $! $! $! $! $! +'7 $! $! $! $! $! $! $! $! $! $! $! $! +'7 $# +'7 $$ +'7 $% +'7 $& +'7 $) +'7 $* +'7 $+ +'7 $- +'7 $0 +'7 $1 +'7 $1 $2 $3 +'7 $1 $2 $3 $4 +'7 $2 +'7 $3 +'7 $4 +'7 $5 +'7 $6 +'7 $7 +'7 $8 +'7 $9 +'7 $: +'7 $; +'7 $< +'7 $= +'7 $> +'7 $? +'7 $[ +'7 $\ +'7 $] +'7 $^ +'7 $_ +'7 ${ +'7 $| +'7 $} +'7 $~ '8 -'8$! -'8$# -'8$* +'8 $! +'8 $# +'8 $* '9 -'9$! +'9 $! 'A -'A$! +'A $! 'B 'C 'D @@ -3450,41 +3311,37 @@ $~$!$@$#$$ 'Y 'Z *02 -*04+0'4l +*04 +0 '4 l *06 -*11$2$2 -*12'5D0 -*13x12 +*12 '5 D0 +*13 x12 *14 *15 -*15'3y3 -*15'4d'3p1 +*15 '3 y3 +*15 d '3 p1 *17 -*21][ -*22se3 +*21 ] [ +se3 *23 -*23x32 +*23 x32 *25 -*32 *40 -*41x13 +*41 x13 *45 *46 -*52 -*53l +*53 l *56 *57 +0 +0 +0 +0 +0 +0 +0 +0 +0 -+0+0 -+0+0+0+0+0+0+0+0 -+0+0+0x12 ++0 +0 ++0 +0 +0 x12 +1 +3 -+3x32 ++3 x32 +4 +5 -+5]}}}}'4 ++5 ] } } } } '4 +6 +8 +9 @@ -3503,12 +3360,12 @@ $~$!$@$#$$ .0 .2 .3 -.3$J'4y4 +.3 $J '4 y4 .4 .6 30 30 31 32 33 34 35 36 37 38 39 3A -30 31 32 33 34 35 36 37 38 39 3A @ +30 31 32 33 34 35 36 37 38 39 3A @ 31 32 33 @@ -3522,182 +3379,180 @@ $~$!$@$#$$ : @ C -C$S -C$a -C$a$b$l$e -C$a$c$l$e -C$a$g$e -C$a$l -C$a$l$l$y -C$a$m -C$a$n -C$a$n$a -C$a$n$c$e -C$a$n$d -C$a$n$e -C$a$n$t -C$a$r$y -C$a$s$e -C$a$t$i$o$n -C$a$t$i$v$e -C$a$u$x -C$b -C$b$a$b$y -C$b$a$c$k -C$b$a$l$l -C$b$e$l$l -C$b$o$o$k -C$b$o$y -C$c -C$c$y -C$d -C$d$a$y -C$d$o$m$e -C$e -C$e$a$u -C$e$d -C$e$e -C$e$l$l$a -C$e$n -C$e$n$c$e -C$e$n$t -C$e$o$u$s -C$e$r -C$e$r$y -C$e$s -C$e$s$s -C$e$s$t -C$e$t -C$e$t$t$e -C$f -C$f$o$r$m -C$f$u$l -C$f$u$l$l$y -C$g -C$g$e$n$y -C$h -C$h$e$a$d -C$h$o$o$d -C$i -C$i$a$l -C$i$a$n -C$i$b$l$e -C$i$c -C$i$c$e$s -C$i$c$l$e -C$i$d$e -C$i$e$r -C$i$e$s -C$i$e$s$t -C$i$f$y -C$i$l$e -C$i$l$i$a -C$i$l$y -C$i$n$e -C$i$n$g -C$i$o$n -C$i$o$u$s -C$i$s$e -C$i$s$h -C$i$s$m -C$i$s$t -C$i$t$e -C$i$t$i$c -C$i$t$i$o$n -C$i$t$i$v$e -C$i$t$y -C$i$v$e -C$i$x -C$i$z$e -C$j -C$k -C$k$i$n -C$l -C$l$a$n$d -C$l$e$s$s -C$l$e$t -C$l$i$k$e -C$l$i$n$e -C$l$i$n$g -C$l$o$n$g -C$l$o$o$p -C$l$y -C$m -C$m$a$n -C$m$e$n -C$m$e$n$t -C$n -C$n$e$s$s -C$o -C$o$e$s -C$o$i$d -C$o$l -C$o$l$o$g$y -C$o$m$y -C$o$n -C$o$r -C$o$r$y -C$o$s$e -C$o$u$r -C$o$u$s -C$o$u$t -C$o$v$e$r -C$p -C$p$a$s$s -C$q -C$r -C$r$o$o$m -C$s -C$s$e$s -C$s$e$x$y -C$s$h -C$s$h$i$p -C$s$i$d$e -C$s$i$o$n -C$s$i$s -C$s$o$m$e -C$t -C$t$h$e -C$t$i$o$n -C$t$y -C$u -C$u$m -C$u$p -C$v -C$w -C$w$a$y -C$w$i$s$e -C$w$o$o$d -C$x -C$y -C$z -C$~$!$@$#$$ -D0D3 +C $S +C $a +C $a $b $l $e +C $a $c $l $e +C $a $g $e +C $a $l +C $a $l $l $y +C $a $m +C $a $n +C $a $n $a +C $a $n $c $e +C $a $n $d +C $a $n $e +C $a $n $t +C $a $r $y +C $a $s $e +C $a $t $i $o $n +C $a $t $i $v $e +C $a $u $x +C $b +C $b $a $b $y +C $b $a $c $k +C $b $a $l $l +C $b $e $l $l +C $b $o $o $k +C $b $o $y +C $c +C $c $y +C $d +C $d $a $y +C $d $o $m $e +C $e +C $e $a $u +C $e $d +C $e $e +C $e $l $l $a +C $e $n +C $e $n $c $e +C $e $n $t +C $e $o $u $s +C $e $r +C $e $r $y +C $e $s +C $e $s $s +C $e $s $t +C $e $t +C $e $t $t $e +C $f +C $f $o $r $m +C $f $u $l +C $f $u $l $l $y +C $g +C $g $e $n $y +C $h +C $h $e $a $d +C $h $o $o $d +C $i +C $i $a $l +C $i $a $n +C $i $b $l $e +C $i $c +C $i $c $e $s +C $i $c $l $e +C $i $d $e +C $i $e $r +C $i $e $s +C $i $e $s $t +C $i $f $y +C $i $l $e +C $i $l $i $a +C $i $l $y +C $i $n $e +C $i $n $g +C $i $o $n +C $i $o $u $s +C $i $s $e +C $i $s $h +C $i $s $m +C $i $s $t +C $i $t $e +C $i $t $i $c +C $i $t $i $o $n +C $i $t $i $v $e +C $i $t $y +C $i $v $e +C $i $x +C $i $z $e +C $j +C $k +C $k $i $n +C $l +C $l $a $n $d +C $l $e $s $s +C $l $e $t +C $l $i $k $e +C $l $i $n $e +C $l $i $n $g +C $l $o $n $g +C $l $o $o $p +C $l $y +C $m +C $m $a $n +C $m $e $n +C $m $e $n $t +C $n +C $n $e $s $s +C $o +C $o $e $s +C $o $i $d +C $o $l +C $o $l $o $g $y +C $o $m $y +C $o $n +C $o $r +C $o $r $y +C $o $s $e +C $o $u $r +C $o $u $s +C $o $u $t +C $o $v $e $r +C $p +C $p $a $s $s +C $q +C $r +C $r $o $o $m +C $s +C $s $e $s +C $s $e $x $y +C $s $h +C $s $h $i $p +C $s $i $d $e +C $s $i $o $n +C $s $i $s +C $s $o $m $e +C $t +C $t $h $e +C $t $i $o $n +C $t $y +C $u +C $u $m +C $u $p +C $v +C $w +C $w $a $y +C $w $i $s $e +C $w $o $o $d +C $x +C $y +C $z +C $~ $! $@ $# $$ +D0 D3 D1 -D1D3D5 -D1D4 -D1] -D1lCl] +D1 D3 D5 +D1 D4 +D1 ] +D1 l ] D2 -D2 D2 -D2D1 -D2D2z3x13 -D2D3 -D2D4 -D2] +D3 D2 +D2 D1 +D2 D3 +D2 D4 +D2 ] D3 D3 ] -D3D2 D4 D5 D6 D7 D8 E -E$sT0 +E $s T0 K -K*54x31'4 -Kx32p2*A5'4 +K x31 +K x32 p2 '4 R0 R1 R4 @@ -3705,7 +3560,7 @@ R6 R8 R9 T0 -T0] +T0 ] T1 T2 T3 @@ -3722,101 +3577,96 @@ TD TE TF Y1 -Y2*72'4 +Y2 *72 '4 Y3 -Y3x35 +Y3 x35 Y4 -Y4x26 -Y5i4-x28 -Z1 +Y4 x26 +Y5 i4- x28 Z2 -Z2o5y'6 -Z4'8x42 -Z5*75'5$Sl -Z5*75'5i01{ -Z5*75'5{x02 +Z2 o5y '6 +Z4 x42 +Z5 '5 $S l +Z5 '5 i01 { +Z5 { x02 [ -[ $1 [ $1 [ [ [ [ [ [ ] -[[ -[[[ -[[[$1 -[[[$1$2$3 -[[[[ -[[[[[ -[[[[[[ -[[[[[[[ -[[[[[[[[ -[[[[[[[[[ -[[[[[[[[[[ -[[[[[]]]]] -[[[[]]] -[[]] -[] -[]d -[^A -[^B -[^C -[^D -[^E -[^F -[^G -[^H -[^I -[^J -[^K -[^L -[^M -[^N -[^O -[^P -[^Q -[^R -[^S -[^T -[^U -[^V -[^W -[^X -[^Y -[^Z -[^a -[^b -[^c -[^d -[^f -[^g -[^h -[^i -[^j -[^k -[^l -[^m -[^n -[^o -[^p -[^q -[^r -[^s -[^t -[^u -[^v -[^w -[^x -[^y -[^z +[ [ [ $1 +[ [ [ $1 $2 $3 +[ [ [ [ +[ [ [ [ [ +[ [ [ [ [ [ +[ [ [ [ [ [ [ +[ [ [ [ [ [ [ [ +[ [ [ [ [ [ [ [ [ +[ [ [ [ [ [ [ [ [ [ +[ [ [ [ [ ] ] ] ] ] +[ [ [ [ ] ] ] +[ [ ] ] +[ ] d +[ ^A +o0B +o0C +[ ^D +o0E +o0F +o0G +[ ^H +[ ^I +o0J +o0K +[ ^L +o0M +o0N +[ ^O +o0P +[ ^Q +[ ^R +[ ^S +[ ^T +[ ^U +[ ^V +[ ^W +[ ^X +[ ^Y +[ ^Z +o0a +o0b +o0c +o0d +o0f +o0g +[ ^h +[ ^i +o0j +o0k +o0l +o0m +o0n +[ ^o +o0p +[ ^q +o0r +o0s +o0t +[ ^u +o0v +o0w +o0x +o0y +o0z ] -] $0 +] $0 ] $a ] ] ] ] $a ] ] $e $r ] ] $i $e ] ] $s -] ] K +] ] K ] ] ] ] ] ] $1 $2 $3 ] ] ] $d $o $g @@ -3826,256 +3676,232 @@ Z5*75'5{x02 ] ] ] $y ] ] ] ] ] ] ] d -] { [ } -]$1 -]$a -]$d -]$e -]$e$d -]$e$s -]$i$n$g -]$o -]$ol -]$s -]$y -],1[ -]D1 -]Kx01{Z1'4 -]Y1 -][ -]] -]] $1$2 -]]$1 -]]$a -]]$e$r -]]$i$e -]]$o -]]$s -]]$y -]]D1] -]]] -]]]$1 -]]]$1$2$3 -]]]$a -]]]$e -]]]$i -]]]$m$a$n -]]]$o -]]]$s -]]]$y -]]]Z1 -]]]] -]]]]$p$h$p$b$b -]]]]] -]]]]]] -]]]]]]] -]]]]]]]] -]]]]]]]]] -]]]]]]]]]] -]]]d -]]]l$p$h$p$b$b -]]l]$o -]]l]$y -]c -]l]$a -]l]$e +] $1 +] $d +] $e +] $e $d +] $e $s +] $i $n $g +] $o +] $o l +] $s +] $y +] D1 +] K x01 Z1 +] Y1 +] ] $1 $2 +] ] $1 +] ] $o +] ] $y +] ] D1 ] +] ] ] $1 +] ] ] $a +] ] ] $e +] ] ] $i +] ] ] $s +] ] ] Z1 +] ] ] ] $p $h $p $b $b +] ] ] ] ] +] ] ] ] ] ] +] ] ] ] ] ] ] +] ] ] ] ] ] ] ] +] ] ] ] ] ] ] ] ] +] ] ] ] ] ] ] ] ] ] +] ] ] l $p $h $p $b $b +] ] l ] $o +] ] l ] $y +] c +] l ] $a +] l ] $e ^ -^ ^I -^ ^a -^ ^a^ ^m^i -^ ^d^n^a^s -^ ^e^h^t -^ ^e^r^a^ ^e^w -^ ^e^r^a^ ^u^o^y -^ ^e^r^a^ ^y^e^h^t -^ ^e^v^a^h^ ^i -^ ^i -^ ^l^l^i^m -^ ^m^'^I -^ ^m^'^i -^ ^m^a^ ^i -^ ^p^o^t -^ ^r^ ^e^w -^ ^r^ ^u^o^y -^ ^r^ ^y^e^h^t -^ ^s^i^ ^e^h -^ ^s^i^ ^e^h^s -^ ^s^i^ ^s^i^h^t -^ ^s^i^ ^t^i -^ ^t^'^n^o^d^ ^i -^ ^t^n^o^d^ ^i -^ ^t^o^n^ ^m^a^ ^i -^ ^u -^ ^u^o^y -^ ^y^m +^ ^I +^ ^a +^ ^a ^ ^m ^i +^ ^d ^n ^a ^s +^ ^e ^h ^t +^ ^e ^r ^a ^ ^e ^w +^ ^e ^r ^a ^ ^u ^o ^y +^ ^e ^r ^a ^ ^y ^e ^h ^t +^ ^e ^v ^a ^h ^ ^i +^ ^i +^ ^l ^l ^i ^m +^ ^m ^' ^I +^ ^m ^' ^i +^ ^m ^a ^ ^i +^ ^p ^o ^t +^ ^r ^ ^e ^w +^ ^r ^ ^u ^o ^y +^ ^r ^ ^y ^e ^h ^t +^ ^s ^i ^ ^e ^h +^ ^s ^i ^ ^e ^h ^s +^ ^s ^i ^ ^s ^i ^h ^t +^ ^s ^i ^ ^t ^i +^ ^t ^' ^n ^o ^d ^ ^i +^ ^t ^n ^o ^d ^ ^i +^ ^t ^o ^n ^ ^m ^a ^ ^i +^ ^u +^ ^u ^o ^y +^ ^y ^m ^! ^! $! -^!$! ^" ^# -^#$# +^# $# ^$ $$ -^$$$ ^% $% -^%$% ^& -^&$& +^& $& ^( -^($) +^( $) ^* -^*$* -^+$+ +^* $* +^+ $+ ^, ^- -^-$- -^-^i^m^e^s -^-^n^o^n -^-^r^e^p^y^h -^-^r^e^v^o -^-^s^i^m -^-^t^n^a -^-^x^e +^- $- +^- ^i ^m ^e ^s +^- ^n ^o ^n +^- ^r ^e ^p ^y ^h +^- ^r ^e ^v ^o +^- ^s ^i ^m +^- ^t ^n ^a +^- ^x ^e ^. -^.$. +^. $. ^/ ^0 -^0^0^0^2 -^0^1^0^2 -^0^2^0^2 -^0^3^0^2 -^0^4^0^2 -^0^4^9^1 -^0^5^9^1 -^0^6^9^1 -^0^7^9^1 -^0^8^9^1 -^0^9^9^1 +^0 ^0 ^0 ^2 +^0 ^1 ^0 ^2 +^0 ^2 ^0 ^2 +^0 ^3 ^0 ^2 +^0 ^4 ^0 ^2 +^0 ^4 ^9 ^1 +^0 ^5 ^9 ^1 +^0 ^6 ^9 ^1 +^0 ^7 ^9 ^1 +^0 ^8 ^9 ^1 +^0 ^9 ^9 ^1 ^1 -^1^0 -^1^0^0^2 -^1^1^0^2 -^1^2^0^2 -^1^2^3 -^1^3^0^2 -^1^4^0^2 -^1^4^9^1 -^1^5^9^1 -^1^6^9^1 -^1^7^9^1 -^1^8^9^1 -^1^9^9^1 +^1 ^0 +^1 ^0 ^0 ^2 +^1 ^1 ^0 ^2 +^1 ^2 ^0 ^2 +^1 ^2 ^3 +^1 ^3 ^0 ^2 +^1 ^4 ^0 ^2 +^1 ^4 ^9 ^1 +^1 ^5 ^9 ^1 +^1 ^6 ^9 ^1 +^1 ^7 ^9 ^1 +^1 ^8 ^9 ^1 +^1 ^9 ^9 ^1 ^2 -^2^0^0^2 -^2^1 -^2^1^0^2 -^2^2^0^2 -^2^3^0^2 -^2^4^0^2 -^2^4^9^1 -^2^5^9^1 -^2^6^9^1 -^2^7^9^1 -^2^8^9^1 -^2^9^9^1 +^2 ^0 ^0 ^2 +^2 ^1 +^2 ^1 ^0 ^2 +^2 ^2 ^0 ^2 +^2 ^3 ^0 ^2 +^2 ^4 ^0 ^2 +^2 ^4 ^9 ^1 +^2 ^5 ^9 ^1 +^2 ^6 ^9 ^1 +^2 ^7 ^9 ^1 +^2 ^8 ^9 ^1 +^2 ^9 ^9 ^1 ^3 ^3 ^2 ^1 -^3^0^0^2 -^3^1^0^2 -^3^2^0^2 -^3^2^1 -^3^3^0^2 -^3^4^0^2 -^3^4^9^1 -^3^5^9^1 -^3^6^9^1 -^3^7^9^1 -^3^8^9^1 -^3^9^9^1 +^3 ^0 ^0 ^2 +^3 ^1 ^0 ^2 +^3 ^2 ^0 ^2 +^3 ^3 ^0 ^2 +^3 ^4 ^0 ^2 +^3 ^4 ^9 ^1 +^3 ^5 ^9 ^1 +^3 ^6 ^9 ^1 +^3 ^7 ^9 ^1 +^3 ^8 ^9 ^1 +^3 ^9 ^9 ^1 ^4 -^4^0^0^2 -^4^1^0^2 -^4^2^0^2 -^4^3^0^2 -^4^4^0^2 -^4^4^9^1 -^4^5^9^1 -^4^6^9^1 -^4^7^9^1 -^4^8^9^1 -^4^9^9^1 +^4 ^0 ^0 ^2 +^4 ^1 ^0 ^2 +^4 ^2 ^0 ^2 +^4 ^3 ^0 ^2 +^4 ^4 ^0 ^2 +^4 ^4 ^9 ^1 +^4 ^5 ^9 ^1 +^4 ^6 ^9 ^1 +^4 ^7 ^9 ^1 +^4 ^8 ^9 ^1 +^4 ^9 ^9 ^1 ^5 ^5 $5 ^5 ^4 ^3 ^2 ^1 -^5^0^0^2 -^5^1^0^2 -^5^2^0^2 -^5^3^0^2 -^5^4^0^2 -^5^4^9^1 -^5^5^9^1 -^5^6^9^1 -^5^7^9^1 -^5^8^9^1 -^5^9^9^1 -^5{ -^5{*33 +^5 ^0 ^0 ^2 +^5 ^1 ^0 ^2 +^5 ^2 ^0 ^2 +^5 ^3 ^0 ^2 +^5 ^4 ^0 ^2 +^5 ^4 ^9 ^1 +^5 ^5 ^9 ^1 +^5 ^6 ^9 ^1 +^5 ^7 ^9 ^1 +^5 ^8 ^9 ^1 +^5 ^9 ^9 ^1 ^6 -^6^0^0^2 -^6^1^0^2 -^6^2^0^2 -^6^3^0^2 -^6^4^0^2 -^6^4^9^1 -^6^5^9^1 -^6^6^9^1 -^6^7^9^1 -^6^8^9^1 -^6^9^9^1 -^6{ +^6 ^0 ^0 ^2 +^6 ^1 ^0 ^2 +^6 ^2 ^0 ^2 +^6 ^3 ^0 ^2 +^6 ^4 ^0 ^2 +^6 ^4 ^9 ^1 +^6 ^5 ^9 ^1 +^6 ^6 ^9 ^1 +^6 ^7 ^9 ^1 +^6 ^8 ^9 ^1 +^6 ^9 ^9 ^1 ^7 -^7^0^0^2 -^7^1^0^2 -^7^2^0^2 -^7^3^0^2 -^7^4^0^2 -^7^4^9^1 -^7^5^9^1 -^7^6^9^1 -^7^7^9^1 -^7^8^9^1 -^7^9^9^1 -^7{ +^7 ^0 ^0 ^2 +^7 ^1 ^0 ^2 +^7 ^2 ^0 ^2 +^7 ^3 ^0 ^2 +^7 ^4 ^0 ^2 +^7 ^4 ^9 ^1 +^7 ^5 ^9 ^1 +^7 ^6 ^9 ^1 +^7 ^7 ^9 ^1 +^7 ^8 ^9 ^1 +^7 ^9 ^9 ^1 ^8 -^8^0^0^2 -^8^1^0^2 -^8^2^0^2 -^8^3^0^2 -^8^4^0^2 -^8^4^9^1 -^8^5^9^1 -^8^6^9^1 -^8^7^9^1 -^8^8^9^1 -^8^9^9^1 +^8 ^0 ^0 ^2 +^8 ^1 ^0 ^2 +^8 ^2 ^0 ^2 +^8 ^3 ^0 ^2 +^8 ^4 ^0 ^2 +^8 ^4 ^9 ^1 +^8 ^5 ^9 ^1 +^8 ^6 ^9 ^1 +^8 ^7 ^9 ^1 +^8 ^8 ^9 ^1 +^8 ^9 ^9 ^1 ^9 -^9^0^0^2 -^9^1^0^2 -^9^2^0^2 -^9^3^0^2 -^9^4^0^2 -^9^4^9^1 -^9^5^9^1 -^9^6^9^1 -^9^7^9^1 -^9^8^9^1 -^9^9^9^1 +^9 ^0 ^0 ^2 +^9 ^1 ^0 ^2 +^9 ^2 ^0 ^2 +^9 ^3 ^0 ^2 +^9 ^4 ^0 ^2 +^9 ^4 ^9 ^1 +^9 ^5 ^9 ^1 +^9 ^6 ^9 ^1 +^9 ^7 ^9 ^1 +^9 ^8 ^9 ^1 +^9 ^9 ^9 ^1 ^< -^<$> +^< $> ^= -^=$= +^= $= ^? ^@ -^@$@ +^@ $@ ^A ^B ^C @@ -4102,262 +3928,262 @@ Z5*75'5{x02 ^X ^Y ^Z -^[$] -^\$\ -^^$^ +^[ $] +^\ $\ +^^ $^ ^_ -^_$_ +^_ $_ ^a -^a^e^s -^a^e^t -^a^g^e^m -^a^i^d -^a^n^a -^a^r^t^l^u +^a ^e ^s +^a ^e ^t +^a ^g ^e ^m +^a ^i ^d +^a ^n ^a +^a ^r ^t ^l ^u ^b -^b^b^p^h^p]]]] -^b^o -^b^u^s +^b ^b ^p ^h ^p ] ] ] ] +^b ^o +^b ^u ^s ^c -^c^c^a +^c ^c ^a ^d -^d^a^b -^d^a^e^d -^d^a^e^h -^d^a^e^l -^d^d^a -^d^e^b -^d^e^e^s -^d^e^r -^d^i^m -^d^l^o^g -^d^n^a^b -^d^n^a^h -^d^n^a^l -^d^n^i^h -^d^n^i^w -^d^o^o^g -^d^o^o^w -^d^r^a^h -^d^r^o^c -^d^r^o^w^s^s^a^p -^d^u^m +^d ^a ^b +^d ^a ^e ^d +^d ^a ^e ^h +^d ^a ^e ^l +^d ^d ^a +^d ^e ^b +^d ^e ^e ^s +^d ^e ^r +^d ^i ^m +^d ^l ^o ^g +^d ^n ^a ^b +^d ^n ^a ^h +^d ^n ^a ^l +^d ^n ^i ^h +^d ^n ^i ^w +^d ^o ^o ^g +^d ^o ^o ^w +^d ^r ^a ^h +^d ^r ^o ^c +^d ^r ^o ^w ^s ^s ^a ^p +^d ^u ^m ^e -^e^b -^e^c^a^f -^e^c^a^l -^e^c^i -^e^c^i^v -^e^d -^e^d^i^s -^e^e^n^k -^e^e^r^f -^e^h^t -^e^l^e^t -^e^n^i^l -^e^n^o^t^s -^e^r -^e^r^i^f -^e^r^o^f -^e^r^p -^e^s^o^n -^e^t^n^a -^e^v^a^h^i -^e^y^e +^e ^b +^e ^c ^a ^f +^e ^c ^a ^l +^e ^c ^i +^e ^c ^i ^v +^e ^d +^e ^d ^i ^s +^e ^e ^n ^k +^e ^e ^r ^f +^e ^h ^t +^e ^l ^e ^t +^e ^n ^i ^l +^e ^n ^o ^t ^s +^e ^r +^e ^r ^i ^f +^e ^r ^o ^f +^e ^r ^p +^e ^s ^o ^n +^e ^t ^n ^a +^e ^v ^a ^h ^i +^e ^y ^e ^f -^f^f^o -^f^l^a^h -^f^l^e^s +^f ^f ^o +^f ^l ^a ^h +^f ^l ^e ^s ^g -^g^e^l -^g^i^p -^g^n^i^k -^g^n^i^r -^g^n^i^w -^g^n^o^l -^g^o^d -^g^o^l +^g ^e ^l +^g ^i ^p +^g ^n ^i ^k +^g ^n ^i ^r +^g ^n ^i ^w +^g ^n ^o ^l +^g ^o ^d +^g ^o ^l ^h -^h^c^r^a -^h^g^i^h -^h^s^a -^h^s^a^w -^h^s^i^f -^h^t^a^b -^h^t^r^a^e +^h ^c ^r ^a +^h ^g ^i ^h +^h ^s ^a +^h ^s ^a ^w +^h ^s ^i ^f +^h ^t ^a ^b +^h ^t ^r ^a ^e ^i -^i^b -^i^l^e^h -^i^m^e^d -^i^m^e^s -^i^n^i^m -^i^n^m^o -^i^p^e -^i^r^t -^i^t^l^u^m -^i^t^n^a -^i^x^a^m +^i ^b +^i ^l ^e ^h +^i ^m ^e ^d +^i ^m ^e ^s +^i ^n ^i ^m +^i ^n ^m ^o +^i ^p ^e +^i ^r ^t +^i ^t ^l ^u ^m +^i ^t ^n ^a +^i ^x ^a ^m ^j ^k -^k^c^a^b -^k^l^i^m -^k^n^i -^k^o^o^b -^k^r^o^w +^k ^c ^a ^b +^k ^l ^i ^m +^k ^n ^i +^k ^o ^o ^b +^k ^r ^o ^w ^l -^l^a^m -^l^a^o^c -^l^i -^l^i^a^j -^l^i^a^r -^l^i^a^s -^l^i^a^t -^l^i^o -^l^l^a^f -^l^l^i -^l^l^i^p -^l^l^o^r -^l^o^o^w +^l ^a ^m +^l ^a ^o ^c +^l ^i +^l ^i ^a ^j +^l ^i ^a ^r +^l ^i ^a ^s +^l ^i ^a ^t +^l ^i ^o +^l ^l ^a ^f +^l ^l ^i +^l ^l ^i ^p +^l ^l ^o ^r +^l ^o ^o ^w ^m -^m^'^I -^m^'^i -^m^a^ ^i -^m^e -^m^i -^m^o^c -^m^r^a^f -^m^r^o^w -^m^u^g +^m ^' ^I +^m ^' ^i +^m ^a ^ ^i +^m ^e +^m ^i +^m ^o ^c +^m ^r ^a ^f +^m ^r ^o ^w +^m ^u ^g ^n -^n^a^m -^n^e -^n^e^p -^n^i -^n^i^m^d^a -^n^i^p -^n^i^t -^n^o -^n^o^c -^n^o^n -^n^o^o^m -^n^r^o^c -^n^u -^n^u^g -^n^u^s -^n^w^o^d +^n ^a ^m +^n ^e +^n ^e ^p +^n ^i +^n ^i ^m ^d ^a +^n ^i ^p +^n ^i ^t +^n ^o +^n ^o ^c +^n ^o ^n +^n ^o ^o ^m +^n ^r ^o ^c +^n ^u +^n ^u ^g +^n ^u ^s +^n ^w ^o ^d ^o -^o^c -^o^d^u^e^s^p -^o^e^n -^o^i^b -^o^l^i^k -^o^l^l^a -^o^n^o^m -^o^o^z -^o^p^y^h -^o^r^c^a -^o^r^c^a^m -^o^r^c^i^m -^o^r^e^a -^o^r^p -^o^r^y^g -^o^s^i -^o^t^c^e -^o^t^u^a +^o ^c +^o ^d ^u ^e ^s ^p +^o ^e ^n +^o ^i ^b +^o ^l ^i ^k +^o ^l ^l ^a +^o ^n ^o ^m +^o ^o ^z +^o ^p ^y ^h +^o ^r ^c ^a +^o ^r ^c ^a ^m +^o ^r ^c ^i ^m +^o ^r ^e ^a +^o ^r ^p +^o ^r ^y ^g +^o ^s ^i +^o ^t ^c ^e +^o ^t ^u ^a ^p -^p^m^a^c -^p^u +^p ^m ^a ^c +^p ^u ^q ^r -^r^a^e -^r^a^e^b -^r^a^o -^r^a^p -^r^a^w -^r^e^d^n^u -^r^e^p -^r^e^p^u^s -^r^e^p^y^h -^r^e^t^a^w -^r^e^t^f^a -^r^e^t^n^i -^r^e^t^n^u^o^c -^r^e^v^o -^r^i -^r^i^a -^r^i^a^h -^r^o^f -^r^o^o^d -^r^o^t^a^r^t^s^i^n^i^m^d^a -^r^u^s +^r ^a ^e +^r ^a ^e ^b +^r ^a ^o +^r ^a ^p +^r ^a ^w +^r ^e ^d ^n ^u +^r ^e ^p +^r ^e ^p ^u ^s +^r ^e ^p ^y ^h +^r ^e ^t ^a ^w +^r ^e ^t ^f ^a +^r ^e ^t ^n ^i +^r ^e ^t ^n ^u ^o ^c +^r ^e ^v ^o +^r ^i +^r ^i ^a +^r ^i ^a ^h +^r ^o ^f +^r ^o ^o ^d +^r ^o ^t ^a ^r ^t ^s ^i ^n ^i ^m ^d ^a +^r ^u ^s ^s -^s^i^d -^s^i^h^t -^s^i^m -^s^n^a^r^t -^s^s^a^p -^s^s^o^r^c -^s^y^d +^s ^i ^d +^s ^i ^h ^t +^s ^i ^m +^s ^n ^a ^r ^t +^s ^s ^a ^p +^s ^s ^o ^r ^c +^s ^y ^d ^t -^t^a^b -^t^a^c -^t^a^f -^t^a^h -^t^a^o^b -^t^a^r -^t^c^a^l -^t^e^j -^t^f^o^s -^t^h^g^i^n -^t^n^e^c -^t^o^h -^t^o^n^k -^t^o^o^b -^t^o^o^f -^t^o^p -^t^p^e^h -^t^s^o^p -^t^u^c -^t^u^o +^t ^a ^b +^t ^a ^c +^t ^a ^f +^t ^a ^h +^t ^a ^o ^b +^t ^a ^r +^t ^c ^a ^l +^t ^e ^j +^t ^f ^o ^s +^t ^h ^g ^i ^n +^t ^n ^e ^c +^t ^o ^h +^t ^o ^n ^k +^t ^o ^o ^b +^t ^o ^o ^f +^t ^o ^p +^t ^p ^e ^h +^t ^s ^o ^p +^t ^u ^c +^t ^u ^o ^u -^u^e +^u ^e ^v ^w -^w^a^j -^w^a^s -^w^e^n -^w^o^b -^w^o^c -^w^o^l -^w^o^n^s -^w^o^t +^w ^a ^j +^w ^a ^s +^w ^e ^n +^w ^o ^b +^w ^o ^c +^w ^o ^l +^w ^o ^n ^s +^w ^o ^t ^x -^x^a -^x^a^t -^x^e -^x^o +^x ^a +^x ^a ^t +^x ^e +^x ^o ^y -^y^a^d -^y^a^d^i^r^f -^y^a^d^n^o^m -^y^a^d^n^u^s -^y^a^d^r^u^t^a^s -^y^a^d^s^e^n^d^e^w -^y^a^d^s^r^u^h^t -^y^a^d^s^u^e^t -^y^a^l -^y^a^l^p -^y^a^p -^y^a^w -^y^b -^y^e^k -^y^k^s -^y^l^o^p -^y^m +^y ^a ^d +^y ^a ^d ^i ^r ^f +^y ^a ^d ^n ^o ^m +^y ^a ^d ^n ^u ^s +^y ^a ^d ^r ^u ^t ^a ^s +^y ^a ^d ^s ^e ^n ^d ^e ^w +^y ^a ^d ^s ^r ^u ^h ^t +^y ^a ^d ^s ^u ^e ^t +^y ^a ^l +^y ^a ^l ^p +^y ^a ^p +^y ^a ^w +^y ^b +^y ^e ^k +^y ^k ^s +^y ^l ^o ^p +^y ^m ^z -^{$} -^|$| -^~$~ +^{ $} +^| $| +^~ $~ c c $0 c $0 $1 @@ -4386,3173 +4212,3143 @@ c T6 c ^1 c ^2 c ^3 -c$ -c$ $0 -c$ $1 -c$ $2 -c$ $3 -c$ $4 -c$ $5 -c$ $6 -c$ $7 -c$ $8 -c$ $9 -c$! -c$!$0 -c$!$1 -c$!$2 -c$!$3 -c$!$4 -c$!$5 -c$!$6 -c$!$7 -c$!$8 -c$!$9 -c$" -c$"$0 -c$"$1 -c$"$2 -c$"$3 -c$"$4 -c$"$5 -c$"$6 -c$"$7 -c$"$8 -c$"$9 -c$# -c$#$0 -c$#$1 -c$#$2 -c$#$3 -c$#$4 -c$#$5 -c$#$6 -c$#$7 -c$#$8 -c$#$9 -c$$ -c$$$0 -c$$$1 -c$$$2 -c$$$3 -c$$$4 -c$$$5 -c$$$6 -c$$$7 -c$$$8 -c$$$9 -c$% -c$%$0 -c$%$1 -c$%$2 -c$%$3 -c$%$4 -c$%$5 -c$%$6 -c$%$7 -c$%$8 -c$%$9 -c$& -c$&$0 -c$&$1 -c$&$2 -c$&$3 -c$&$4 -c$&$5 -c$&$6 -c$&$7 -c$&$8 -c$&$9 -c$&$a$m$p$; -c$' -c$'$0 -c$'$1 -c$'$2 -c$'$3 -c$'$4 -c$'$5 -c$'$6 -c$'$7 -c$'$8 -c$'$9 -c$( -c$($0 -c$($1 -c$($2 -c$($3 -c$($4 -c$($5 -c$($6 -c$($7 -c$($8 -c$($9 -c$) -c$)$0 -c$)$1 -c$)$2 -c$)$3 -c$)$4 -c$)$5 -c$)$6 -c$)$7 -c$)$8 -c$)$9 -c$* -c$*$0 -c$*$1 -c$*$2 -c$*$3 -c$*$4 -c$*$5 -c$*$6 -c$*$7 -c$*$8 -c$*$9 -c$+ -c$+$0 -c$+$1 -c$+$2 -c$+$3 -c$+$4 -c$+$5 -c$+$6 -c$+$7 -c$+$8 -c$+$9 -c$, -c$,$0 -c$,$1 -c$,$2 -c$,$3 -c$,$4 -c$,$5 -c$,$6 -c$,$7 -c$,$8 -c$,$9 -c$- -c$-$0 -c$-$1 -c$-$2 -c$-$3 -c$-$4 -c$-$5 -c$-$6 -c$-$7 -c$-$8 -c$-$9 -c$. -c$.$0 -c$.$1 -c$.$2 -c$.$3 -c$.$4 -c$.$5 -c$.$6 -c$.$7 -c$.$8 -c$.$9 -c$.$a$c -c$.$a$d -c$.$a$e -c$.$a$e$r$o -c$.$a$f -c$.$a$g -c$.$a$i -c$.$a$l -c$.$a$m -c$.$a$n -c$.$a$o -c$.$a$q -c$.$a$r -c$.$a$r$p$a -c$.$a$s -c$.$a$t -c$.$a$u -c$.$a$w -c$.$a$x -c$.$a$z -c$.$b$a -c$.$b$b -c$.$b$d -c$.$b$e -c$.$b$f -c$.$b$g -c$.$b$h -c$.$b$i -c$.$b$i$z -c$.$b$j -c$.$b$m -c$.$b$n -c$.$b$o -c$.$b$r -c$.$b$s -c$.$b$t -c$.$b$v -c$.$b$w -c$.$b$y -c$.$b$z -c$.$c$a -c$.$c$a$t -c$.$c$c -c$.$c$d -c$.$c$f -c$.$c$g -c$.$c$h -c$.$c$i -c$.$c$k -c$.$c$l -c$.$c$m -c$.$c$n -c$.$c$o -c$.$c$o$m -c$.$c$o$o$p -c$.$c$r -c$.$c$u -c$.$c$v -c$.$c$x -c$.$c$y -c$.$c$z -c$.$d$e -c$.$d$j -c$.$d$k -c$.$d$m -c$.$d$o -c$.$d$z -c$.$e$c -c$.$e$d$u -c$.$e$e -c$.$e$g -c$.$e$r -c$.$e$s -c$.$e$t -c$.$e$u -c$.$f$i -c$.$f$j -c$.$f$k -c$.$f$m -c$.$f$o -c$.$f$r -c$.$g$a -c$.$g$b -c$.$g$d -c$.$g$e -c$.$g$f -c$.$g$g -c$.$g$h -c$.$g$i -c$.$g$l -c$.$g$m -c$.$g$n -c$.$g$o$v -c$.$g$p -c$.$g$q -c$.$g$r -c$.$g$s -c$.$g$t -c$.$g$u -c$.$g$w -c$.$g$y -c$.$h$k -c$.$h$m -c$.$h$n -c$.$h$r -c$.$h$t -c$.$h$u -c$.$i$d -c$.$i$e -c$.$i$l -c$.$i$m -c$.$i$n -c$.$i$n$f$o -c$.$i$n$t -c$.$i$o -c$.$i$q -c$.$i$r -c$.$i$s -c$.$i$t -c$.$j$e -c$.$j$m -c$.$j$o -c$.$j$o$b$s -c$.$j$p -c$.$k$e -c$.$k$g -c$.$k$h -c$.$k$i -c$.$k$m -c$.$k$n -c$.$k$r -c$.$k$w -c$.$k$y -c$.$k$z -c$.$l$a -c$.$l$b -c$.$l$c -c$.$l$i -c$.$l$k -c$.$l$r -c$.$l$s -c$.$l$t -c$.$l$u -c$.$l$v -c$.$l$y -c$.$m$a -c$.$m$c -c$.$m$d -c$.$m$g -c$.$m$h -c$.$m$i$l -c$.$m$k -c$.$m$l -c$.$m$m -c$.$m$n -c$.$m$o -c$.$m$o$b$i -c$.$m$p -c$.$m$q -c$.$m$r -c$.$m$s -c$.$m$t -c$.$m$u -c$.$m$v -c$.$m$w -c$.$m$x -c$.$m$y -c$.$m$z -c$.$n$a -c$.$n$a$m$e -c$.$n$c -c$.$n$e -c$.$n$e$t -c$.$n$f -c$.$n$g -c$.$n$i -c$.$n$l -c$.$n$o -c$.$n$p -c$.$n$r -c$.$n$u -c$.$n$z -c$.$o$m -c$.$o$r$g -c$.$p$a -c$.$p$e -c$.$p$f -c$.$p$g -c$.$p$h -c$.$p$k -c$.$p$l -c$.$p$m -c$.$p$n -c$.$p$r -c$.$p$r$o -c$.$p$s -c$.$p$t -c$.$p$w -c$.$p$y -c$.$q$a -c$.$r$e -c$.$r$o -c$.$r$o$o$t -c$.$r$u -c$.$r$w -c$.$s$a -c$.$s$b -c$.$s$c -c$.$s$d -c$.$s$e -c$.$s$g -c$.$s$h -c$.$s$i -c$.$s$j -c$.$s$k -c$.$s$l -c$.$s$m -c$.$s$n -c$.$s$o -c$.$s$r -c$.$s$t -c$.$s$u -c$.$s$v -c$.$s$y -c$.$s$z -c$.$t$c -c$.$t$d -c$.$t$f -c$.$t$g -c$.$t$h -c$.$t$j -c$.$t$k -c$.$t$l -c$.$t$m -c$.$t$n -c$.$t$o -c$.$t$p -c$.$t$r -c$.$t$r$a$v$e$l -c$.$t$t -c$.$t$v -c$.$t$w -c$.$t$z -c$.$u$a -c$.$u$g -c$.$u$k -c$.$u$m -c$.$u$s -c$.$u$y -c$.$u$z -c$.$v$a -c$.$v$c -c$.$v$e -c$.$v$g -c$.$v$i -c$.$v$n -c$.$v$u -c$.$w$f -c$.$w$s -c$.$y$e -c$.$y$t -c$.$y$u -c$.$z$a -c$.$z$m -c$.$z$w -c$/ -c$/$0 -c$/$1 -c$/$2 -c$/$3 -c$/$4 -c$/$5 -c$/$6 -c$/$7 -c$/$8 -c$/$9 -c$0 -c$0$ -c$0$! -c$0$" -c$0$# -c$0$$ -c$0$% -c$0$& -c$0$' -c$0$( -c$0$) -c$0$* -c$0$+ -c$0$, -c$0$- -c$0$. -c$0$/ -c$0$0 -c$0$1 -c$0$1$2$3$4$5$6$7$8$9 -c$0$2 -c$0$3 -c$0$4 -c$0$5 -c$0$6 -c$0$7 -c$0$8 -c$0$9 -c$0$: -c$0$; -c$0$< -c$0$= -c$0$> -c$0$? -c$0$@ -c$0$[ -c$0$\ -c$0$] -c$0$^ -c$0$_ -c$0$` -c$0${ -c$0$| -c$0$} -c$0$~ -c$1 -c$1$ -c$1$! -c$1$" -c$1$# -c$1$$ -c$1$% -c$1$& -c$1$' -c$1$( -c$1$) -c$1$* -c$1$+ -c$1$, -c$1$- -c$1$. -c$1$/ -c$1$0 -c$1$1 -c$1$2 -c$1$2$3 -c$1$2$3$4 -c$1$2$3$4$5 -c$1$2$3$4$5$6 -c$1$2$3$4$5$6$7 -c$1$2$3$4$5$6$7$8 -c$1$2$3$4$5$6$7$8$9 -c$1$2$3$4$5$6$7$8$9$0 -c$1$3 -c$1$4 -c$1$5 -c$1$6 -c$1$7 -c$1$8 -c$1$9 -c$1$9$9$0$ -c$1$9$9$0$! -c$1$9$9$0$" -c$1$9$9$0$# -c$1$9$9$0$$ -c$1$9$9$0$% -c$1$9$9$0$& -c$1$9$9$0$' -c$1$9$9$0$( -c$1$9$9$0$) -c$1$9$9$0$* -c$1$9$9$0$+ -c$1$9$9$0$, -c$1$9$9$0$- -c$1$9$9$0$. -c$1$9$9$0$/ -c$1$9$9$0$: -c$1$9$9$0$; -c$1$9$9$0$< -c$1$9$9$0$= -c$1$9$9$0$> -c$1$9$9$0$? -c$1$9$9$0$@ -c$1$9$9$0$[ -c$1$9$9$0$\ -c$1$9$9$0$] -c$1$9$9$0$^ -c$1$9$9$0$_ -c$1$9$9$0$` -c$1$9$9$0${ -c$1$9$9$0$| -c$1$9$9$0$} -c$1$9$9$0$~ -c$1$9$9$1$ -c$1$9$9$1$! -c$1$9$9$1$" -c$1$9$9$1$# -c$1$9$9$1$$ -c$1$9$9$1$% -c$1$9$9$1$& -c$1$9$9$1$' -c$1$9$9$1$( -c$1$9$9$1$) -c$1$9$9$1$* -c$1$9$9$1$+ -c$1$9$9$1$, -c$1$9$9$1$- -c$1$9$9$1$. -c$1$9$9$1$/ -c$1$9$9$1$: -c$1$9$9$1$; -c$1$9$9$1$< -c$1$9$9$1$= -c$1$9$9$1$> -c$1$9$9$1$? -c$1$9$9$1$@ -c$1$9$9$1$[ -c$1$9$9$1$\ -c$1$9$9$1$] -c$1$9$9$1$^ -c$1$9$9$1$_ -c$1$9$9$1$` -c$1$9$9$1${ -c$1$9$9$1$| -c$1$9$9$1$} -c$1$9$9$1$~ -c$1$9$9$2$ -c$1$9$9$2$! -c$1$9$9$2$" -c$1$9$9$2$# -c$1$9$9$2$$ -c$1$9$9$2$% -c$1$9$9$2$& -c$1$9$9$2$' -c$1$9$9$2$( -c$1$9$9$2$) -c$1$9$9$2$* -c$1$9$9$2$+ -c$1$9$9$2$, -c$1$9$9$2$- -c$1$9$9$2$. -c$1$9$9$2$/ -c$1$9$9$2$: -c$1$9$9$2$; -c$1$9$9$2$< -c$1$9$9$2$= -c$1$9$9$2$> -c$1$9$9$2$? -c$1$9$9$2$@ -c$1$9$9$2$[ -c$1$9$9$2$\ -c$1$9$9$2$] -c$1$9$9$2$^ -c$1$9$9$2$_ -c$1$9$9$2$` -c$1$9$9$2${ -c$1$9$9$2$| -c$1$9$9$2$} -c$1$9$9$2$~ -c$1$9$9$3$ -c$1$9$9$3$! -c$1$9$9$3$" -c$1$9$9$3$# -c$1$9$9$3$$ -c$1$9$9$3$% -c$1$9$9$3$& -c$1$9$9$3$' -c$1$9$9$3$( -c$1$9$9$3$) -c$1$9$9$3$* -c$1$9$9$3$+ -c$1$9$9$3$, -c$1$9$9$3$- -c$1$9$9$3$. -c$1$9$9$3$/ -c$1$9$9$3$: -c$1$9$9$3$; -c$1$9$9$3$< -c$1$9$9$3$= -c$1$9$9$3$> -c$1$9$9$3$? -c$1$9$9$3$@ -c$1$9$9$3$[ -c$1$9$9$3$\ -c$1$9$9$3$] -c$1$9$9$3$^ -c$1$9$9$3$_ -c$1$9$9$3$` -c$1$9$9$3${ -c$1$9$9$3$| -c$1$9$9$3$} -c$1$9$9$3$~ -c$1$9$9$4$ -c$1$9$9$4$! -c$1$9$9$4$" -c$1$9$9$4$# -c$1$9$9$4$$ -c$1$9$9$4$% -c$1$9$9$4$& -c$1$9$9$4$' -c$1$9$9$4$( -c$1$9$9$4$) -c$1$9$9$4$* -c$1$9$9$4$+ -c$1$9$9$4$, -c$1$9$9$4$- -c$1$9$9$4$. -c$1$9$9$4$/ -c$1$9$9$4$: -c$1$9$9$4$; -c$1$9$9$4$< -c$1$9$9$4$= -c$1$9$9$4$> -c$1$9$9$4$? -c$1$9$9$4$@ -c$1$9$9$4$[ -c$1$9$9$4$\ -c$1$9$9$4$] -c$1$9$9$4$^ -c$1$9$9$4$_ -c$1$9$9$4$` -c$1$9$9$4${ -c$1$9$9$4$| -c$1$9$9$4$} -c$1$9$9$4$~ -c$1$9$9$5$ -c$1$9$9$5$! -c$1$9$9$5$" -c$1$9$9$5$# -c$1$9$9$5$$ -c$1$9$9$5$% -c$1$9$9$5$& -c$1$9$9$5$' -c$1$9$9$5$( -c$1$9$9$5$) -c$1$9$9$5$* -c$1$9$9$5$+ -c$1$9$9$5$, -c$1$9$9$5$- -c$1$9$9$5$. -c$1$9$9$5$/ -c$1$9$9$5$: -c$1$9$9$5$; -c$1$9$9$5$< -c$1$9$9$5$= -c$1$9$9$5$> -c$1$9$9$5$? -c$1$9$9$5$@ -c$1$9$9$5$[ -c$1$9$9$5$\ -c$1$9$9$5$] -c$1$9$9$5$^ -c$1$9$9$5$_ -c$1$9$9$5$` -c$1$9$9$5${ -c$1$9$9$5$| -c$1$9$9$5$} -c$1$9$9$5$~ -c$1$9$9$6$ -c$1$9$9$6$! -c$1$9$9$6$" -c$1$9$9$6$# -c$1$9$9$6$$ -c$1$9$9$6$% -c$1$9$9$6$& -c$1$9$9$6$' -c$1$9$9$6$( -c$1$9$9$6$) -c$1$9$9$6$* -c$1$9$9$6$+ -c$1$9$9$6$, -c$1$9$9$6$- -c$1$9$9$6$. -c$1$9$9$6$/ -c$1$9$9$6$: -c$1$9$9$6$; -c$1$9$9$6$< -c$1$9$9$6$= -c$1$9$9$6$> -c$1$9$9$6$? -c$1$9$9$6$@ -c$1$9$9$6$[ -c$1$9$9$6$\ -c$1$9$9$6$] -c$1$9$9$6$^ -c$1$9$9$6$_ -c$1$9$9$6$` -c$1$9$9$6${ -c$1$9$9$6$| -c$1$9$9$6$} -c$1$9$9$6$~ -c$1$9$9$7$ -c$1$9$9$7$! -c$1$9$9$7$" -c$1$9$9$7$# -c$1$9$9$7$$ -c$1$9$9$7$% -c$1$9$9$7$& -c$1$9$9$7$' -c$1$9$9$7$( -c$1$9$9$7$) -c$1$9$9$7$* -c$1$9$9$7$+ -c$1$9$9$7$, -c$1$9$9$7$- -c$1$9$9$7$. -c$1$9$9$7$/ -c$1$9$9$7$: -c$1$9$9$7$; -c$1$9$9$7$< -c$1$9$9$7$= -c$1$9$9$7$> -c$1$9$9$7$? -c$1$9$9$7$@ -c$1$9$9$7$[ -c$1$9$9$7$\ -c$1$9$9$7$] -c$1$9$9$7$^ -c$1$9$9$7$_ -c$1$9$9$7$` -c$1$9$9$7${ -c$1$9$9$7$| -c$1$9$9$7$} -c$1$9$9$7$~ -c$1$9$9$8$ -c$1$9$9$8$! -c$1$9$9$8$" -c$1$9$9$8$# -c$1$9$9$8$$ -c$1$9$9$8$% -c$1$9$9$8$& -c$1$9$9$8$' -c$1$9$9$8$( -c$1$9$9$8$) -c$1$9$9$8$* -c$1$9$9$8$+ -c$1$9$9$8$, -c$1$9$9$8$- -c$1$9$9$8$. -c$1$9$9$8$/ -c$1$9$9$8$: -c$1$9$9$8$; -c$1$9$9$8$< -c$1$9$9$8$= -c$1$9$9$8$> -c$1$9$9$8$? -c$1$9$9$8$@ -c$1$9$9$8$[ -c$1$9$9$8$\ -c$1$9$9$8$] -c$1$9$9$8$^ -c$1$9$9$8$_ -c$1$9$9$8$` -c$1$9$9$8${ -c$1$9$9$8$| -c$1$9$9$8$} -c$1$9$9$8$~ -c$1$9$9$9$ -c$1$9$9$9$! -c$1$9$9$9$" -c$1$9$9$9$# -c$1$9$9$9$$ -c$1$9$9$9$% -c$1$9$9$9$& -c$1$9$9$9$' -c$1$9$9$9$( -c$1$9$9$9$) -c$1$9$9$9$* -c$1$9$9$9$+ -c$1$9$9$9$, -c$1$9$9$9$- -c$1$9$9$9$. -c$1$9$9$9$/ -c$1$9$9$9$: -c$1$9$9$9$; -c$1$9$9$9$< -c$1$9$9$9$= -c$1$9$9$9$> -c$1$9$9$9$? -c$1$9$9$9$@ -c$1$9$9$9$[ -c$1$9$9$9$\ -c$1$9$9$9$] -c$1$9$9$9$^ -c$1$9$9$9$_ -c$1$9$9$9$` -c$1$9$9$9${ -c$1$9$9$9$| -c$1$9$9$9$} -c$1$9$9$9$~ -c$1$: -c$1$; -c$1$< -c$1$= -c$1$> -c$1$? -c$1$@ -c$1$[ -c$1$\ -c$1$] -c$1$^ -c$1$_ -c$1$` -c$1${ -c$1$| -c$1$} -c$1$~ -c$2 -c$2$ -c$2$! -c$2$" -c$2$# -c$2$$ -c$2$% -c$2$& -c$2$' -c$2$( -c$2$) -c$2$* -c$2$+ -c$2$, -c$2$- -c$2$. -c$2$/ -c$2$0 -c$2$0$1$0$! -c$2$0$1$0$$ -c$2$0$1$0$* -c$2$0$1$0$@ -c$2$0$1$0$~ -c$2$0$2$0$ -c$2$0$2$0$! -c$2$0$2$0$" -c$2$0$2$0$# -c$2$0$2$0$$ -c$2$0$2$0$% -c$2$0$2$0$& -c$2$0$2$0$' -c$2$0$2$0$( -c$2$0$2$0$) -c$2$0$2$0$* -c$2$0$2$0$+ -c$2$0$2$0$, -c$2$0$2$0$- -c$2$0$2$0$. -c$2$0$2$0$/ -c$2$0$2$0$: -c$2$0$2$0$; -c$2$0$2$0$< -c$2$0$2$0$= -c$2$0$2$0$> -c$2$0$2$0$? -c$2$0$2$0$@ -c$2$0$2$0$[ -c$2$0$2$0$\ -c$2$0$2$0$] -c$2$0$2$0$^ -c$2$0$2$0$_ -c$2$0$2$0$` -c$2$0$2$0${ -c$2$0$2$0$| -c$2$0$2$0$} -c$2$0$2$0$~ -c$2$0$2$1$ -c$2$0$2$1$! -c$2$0$2$1$" -c$2$0$2$1$# -c$2$0$2$1$$ -c$2$0$2$1$% -c$2$0$2$1$& -c$2$0$2$1$' -c$2$0$2$1$( -c$2$0$2$1$) -c$2$0$2$1$* -c$2$0$2$1$+ -c$2$0$2$1$, -c$2$0$2$1$- -c$2$0$2$1$. -c$2$0$2$1$/ -c$2$0$2$1$: -c$2$0$2$1$; -c$2$0$2$1$< -c$2$0$2$1$= -c$2$0$2$1$> -c$2$0$2$1$? -c$2$0$2$1$@ -c$2$0$2$1$[ -c$2$0$2$1$\ -c$2$0$2$1$] -c$2$0$2$1$^ -c$2$0$2$1$_ -c$2$0$2$1$` -c$2$0$2$1${ -c$2$0$2$1$| -c$2$0$2$1$} -c$2$0$2$1$~ -c$2$0$2$2$ -c$2$0$2$2$! -c$2$0$2$2$" -c$2$0$2$2$# -c$2$0$2$2$$ -c$2$0$2$2$% -c$2$0$2$2$& -c$2$0$2$2$' -c$2$0$2$2$( -c$2$0$2$2$) -c$2$0$2$2$* -c$2$0$2$2$+ -c$2$0$2$2$, -c$2$0$2$2$- -c$2$0$2$2$. -c$2$0$2$2$/ -c$2$0$2$2$: -c$2$0$2$2$; -c$2$0$2$2$< -c$2$0$2$2$= -c$2$0$2$2$> -c$2$0$2$2$? -c$2$0$2$2$@ -c$2$0$2$2$[ -c$2$0$2$2$\ -c$2$0$2$2$] -c$2$0$2$2$^ -c$2$0$2$2$_ -c$2$0$2$2$` -c$2$0$2$2${ -c$2$0$2$2$| -c$2$0$2$2$} -c$2$0$2$2$~ -c$2$0$2$3$ -c$2$0$2$3$! -c$2$0$2$3$" -c$2$0$2$3$# -c$2$0$2$3$$ -c$2$0$2$3$% -c$2$0$2$3$& -c$2$0$2$3$' -c$2$0$2$3$( -c$2$0$2$3$) -c$2$0$2$3$* -c$2$0$2$3$+ -c$2$0$2$3$, -c$2$0$2$3$- -c$2$0$2$3$. -c$2$0$2$3$/ -c$2$0$2$3$: -c$2$0$2$3$; -c$2$0$2$3$< -c$2$0$2$3$= -c$2$0$2$3$> -c$2$0$2$3$? -c$2$0$2$3$@ -c$2$0$2$3$[ -c$2$0$2$3$\ -c$2$0$2$3$] -c$2$0$2$3$^ -c$2$0$2$3$_ -c$2$0$2$3$` -c$2$0$2$3${ -c$2$0$2$3$| -c$2$0$2$3$} -c$2$0$2$3$~ -c$2$0$2$4$ -c$2$0$2$4$! -c$2$0$2$4$" -c$2$0$2$4$# -c$2$0$2$4$$ -c$2$0$2$4$% -c$2$0$2$4$& -c$2$0$2$4$' -c$2$0$2$4$( -c$2$0$2$4$) -c$2$0$2$4$* -c$2$0$2$4$+ -c$2$0$2$4$, -c$2$0$2$4$- -c$2$0$2$4$. -c$2$0$2$4$/ -c$2$0$2$4$: -c$2$0$2$4$; -c$2$0$2$4$< -c$2$0$2$4$= -c$2$0$2$4$> -c$2$0$2$4$? -c$2$0$2$4$@ -c$2$0$2$4$[ -c$2$0$2$4$\ -c$2$0$2$4$] -c$2$0$2$4$^ -c$2$0$2$4$_ -c$2$0$2$4$` -c$2$0$2$4${ -c$2$0$2$4$| -c$2$0$2$4$} -c$2$0$2$4$~ -c$2$0$2$5$ -c$2$0$2$5$! -c$2$0$2$5$" -c$2$0$2$5$# -c$2$0$2$5$$ -c$2$0$2$5$% -c$2$0$2$5$& -c$2$0$2$5$' -c$2$0$2$5$( -c$2$0$2$5$) -c$2$0$2$5$* -c$2$0$2$5$+ -c$2$0$2$5$, -c$2$0$2$5$- -c$2$0$2$5$. -c$2$0$2$5$/ -c$2$0$2$5$: -c$2$0$2$5$; -c$2$0$2$5$< -c$2$0$2$5$= -c$2$0$2$5$> -c$2$0$2$5$? -c$2$0$2$5$@ -c$2$0$2$5$[ -c$2$0$2$5$\ -c$2$0$2$5$] -c$2$0$2$5$^ -c$2$0$2$5$_ -c$2$0$2$5$` -c$2$0$2$5${ -c$2$0$2$5$| -c$2$0$2$5$} -c$2$0$2$5$~ -c$2$0$2$6$ -c$2$0$2$6$! -c$2$0$2$6$" -c$2$0$2$6$# -c$2$0$2$6$$ -c$2$0$2$6$% -c$2$0$2$6$& -c$2$0$2$6$' -c$2$0$2$6$( -c$2$0$2$6$) -c$2$0$2$6$* -c$2$0$2$6$+ -c$2$0$2$6$, -c$2$0$2$6$- -c$2$0$2$6$. -c$2$0$2$6$/ -c$2$0$2$6$: -c$2$0$2$6$; -c$2$0$2$6$< -c$2$0$2$6$= -c$2$0$2$6$> -c$2$0$2$6$? -c$2$0$2$6$@ -c$2$0$2$6$[ -c$2$0$2$6$\ -c$2$0$2$6$] -c$2$0$2$6$^ -c$2$0$2$6$_ -c$2$0$2$6$` -c$2$0$2$6${ -c$2$0$2$6$| -c$2$0$2$6$} -c$2$0$2$6$~ -c$2$0$2$7$ -c$2$0$2$7$! -c$2$0$2$7$" -c$2$0$2$7$# -c$2$0$2$7$$ -c$2$0$2$7$% -c$2$0$2$7$& -c$2$0$2$7$' -c$2$0$2$7$( -c$2$0$2$7$) -c$2$0$2$7$* -c$2$0$2$7$+ -c$2$0$2$7$, -c$2$0$2$7$- -c$2$0$2$7$. -c$2$0$2$7$/ -c$2$0$2$7$: -c$2$0$2$7$; -c$2$0$2$7$< -c$2$0$2$7$= -c$2$0$2$7$> -c$2$0$2$7$? -c$2$0$2$7$@ -c$2$0$2$7$[ -c$2$0$2$7$\ -c$2$0$2$7$] -c$2$0$2$7$^ -c$2$0$2$7$_ -c$2$0$2$7$` -c$2$0$2$7${ -c$2$0$2$7$| -c$2$0$2$7$} -c$2$0$2$7$~ -c$2$0$2$8$ -c$2$0$2$8$! -c$2$0$2$8$" -c$2$0$2$8$# -c$2$0$2$8$$ -c$2$0$2$8$% -c$2$0$2$8$& -c$2$0$2$8$' -c$2$0$2$8$( -c$2$0$2$8$) -c$2$0$2$8$* -c$2$0$2$8$+ -c$2$0$2$8$, -c$2$0$2$8$- -c$2$0$2$8$. -c$2$0$2$8$/ -c$2$0$2$8$: -c$2$0$2$8$; -c$2$0$2$8$< -c$2$0$2$8$= -c$2$0$2$8$> -c$2$0$2$8$? -c$2$0$2$8$@ -c$2$0$2$8$[ -c$2$0$2$8$\ -c$2$0$2$8$] -c$2$0$2$8$^ -c$2$0$2$8$_ -c$2$0$2$8$` -c$2$0$2$8${ -c$2$0$2$8$| -c$2$0$2$8$} -c$2$0$2$8$~ -c$2$0$2$9$ -c$2$0$2$9$! -c$2$0$2$9$" -c$2$0$2$9$# -c$2$0$2$9$$ -c$2$0$2$9$% -c$2$0$2$9$& -c$2$0$2$9$' -c$2$0$2$9$( -c$2$0$2$9$) -c$2$0$2$9$* -c$2$0$2$9$+ -c$2$0$2$9$, -c$2$0$2$9$- -c$2$0$2$9$. -c$2$0$2$9$/ -c$2$0$2$9$: -c$2$0$2$9$; -c$2$0$2$9$< -c$2$0$2$9$= -c$2$0$2$9$> -c$2$0$2$9$? -c$2$0$2$9$@ -c$2$0$2$9$[ -c$2$0$2$9$\ -c$2$0$2$9$] -c$2$0$2$9$^ -c$2$0$2$9$_ -c$2$0$2$9$` -c$2$0$2$9${ -c$2$0$2$9$| -c$2$0$2$9$} -c$2$0$2$9$~ -c$2$0$3$0$ -c$2$0$3$0$! -c$2$0$3$0$" -c$2$0$3$0$# -c$2$0$3$0$$ -c$2$0$3$0$% -c$2$0$3$0$& -c$2$0$3$0$' -c$2$0$3$0$( -c$2$0$3$0$) -c$2$0$3$0$* -c$2$0$3$0$+ -c$2$0$3$0$, -c$2$0$3$0$- -c$2$0$3$0$. -c$2$0$3$0$/ -c$2$0$3$0$: -c$2$0$3$0$; -c$2$0$3$0$< -c$2$0$3$0$= -c$2$0$3$0$> -c$2$0$3$0$? -c$2$0$3$0$@ -c$2$0$3$0$[ -c$2$0$3$0$\ -c$2$0$3$0$] -c$2$0$3$0$^ -c$2$0$3$0$_ -c$2$0$3$0$` -c$2$0$3$0${ -c$2$0$3$0$| -c$2$0$3$0$} -c$2$0$3$0$~ -c$2$0$3$1$ -c$2$0$3$1$! -c$2$0$3$1$" -c$2$0$3$1$# -c$2$0$3$1$$ -c$2$0$3$1$% -c$2$0$3$1$& -c$2$0$3$1$' -c$2$0$3$1$( -c$2$0$3$1$) -c$2$0$3$1$* -c$2$0$3$1$+ -c$2$0$3$1$, -c$2$0$3$1$- -c$2$0$3$1$. -c$2$0$3$1$/ -c$2$0$3$1$: -c$2$0$3$1$; -c$2$0$3$1$< -c$2$0$3$1$= -c$2$0$3$1$> -c$2$0$3$1$? -c$2$0$3$1$@ -c$2$0$3$1$[ -c$2$0$3$1$\ -c$2$0$3$1$] -c$2$0$3$1$^ -c$2$0$3$1$_ -c$2$0$3$1$` -c$2$0$3$1${ -c$2$0$3$1$| -c$2$0$3$1$} -c$2$0$3$1$~ -c$2$0$3$2$ -c$2$0$3$2$! -c$2$0$3$2$" -c$2$0$3$2$# -c$2$0$3$2$$ -c$2$0$3$2$% -c$2$0$3$2$& -c$2$0$3$2$' -c$2$0$3$2$( -c$2$0$3$2$) -c$2$0$3$2$* -c$2$0$3$2$+ -c$2$0$3$2$, -c$2$0$3$2$- -c$2$0$3$2$. -c$2$0$3$2$/ -c$2$0$3$2$: -c$2$0$3$2$; -c$2$0$3$2$< -c$2$0$3$2$= -c$2$0$3$2$> -c$2$0$3$2$? -c$2$0$3$2$@ -c$2$0$3$2$[ -c$2$0$3$2$\ -c$2$0$3$2$] -c$2$0$3$2$^ -c$2$0$3$2$_ -c$2$0$3$2$` -c$2$0$3$2${ -c$2$0$3$2$| -c$2$0$3$2$} -c$2$0$3$2$~ -c$2$0$3$3$ -c$2$0$3$3$! -c$2$0$3$3$" -c$2$0$3$3$# -c$2$0$3$3$$ -c$2$0$3$3$% -c$2$0$3$3$& -c$2$0$3$3$' -c$2$0$3$3$( -c$2$0$3$3$) -c$2$0$3$3$* -c$2$0$3$3$+ -c$2$0$3$3$, -c$2$0$3$3$- -c$2$0$3$3$. -c$2$0$3$3$/ -c$2$0$3$3$: -c$2$0$3$3$; -c$2$0$3$3$< -c$2$0$3$3$= -c$2$0$3$3$> -c$2$0$3$3$? -c$2$0$3$3$@ -c$2$0$3$3$[ -c$2$0$3$3$\ -c$2$0$3$3$] -c$2$0$3$3$^ -c$2$0$3$3$_ -c$2$0$3$3$` -c$2$0$3$3${ -c$2$0$3$3$| -c$2$0$3$3$} -c$2$0$3$3$~ -c$2$0$3$4$ -c$2$0$3$4$! -c$2$0$3$4$" -c$2$0$3$4$# -c$2$0$3$4$$ -c$2$0$3$4$% -c$2$0$3$4$& -c$2$0$3$4$' -c$2$0$3$4$( -c$2$0$3$4$) -c$2$0$3$4$* -c$2$0$3$4$+ -c$2$0$3$4$, -c$2$0$3$4$- -c$2$0$3$4$. -c$2$0$3$4$/ -c$2$0$3$4$: -c$2$0$3$4$; -c$2$0$3$4$< -c$2$0$3$4$= -c$2$0$3$4$> -c$2$0$3$4$? -c$2$0$3$4$@ -c$2$0$3$4$[ -c$2$0$3$4$\ -c$2$0$3$4$] -c$2$0$3$4$^ -c$2$0$3$4$_ -c$2$0$3$4$` -c$2$0$3$4${ -c$2$0$3$4$| -c$2$0$3$4$} -c$2$0$3$4$~ -c$2$0$3$5$ -c$2$0$3$5$! -c$2$0$3$5$" -c$2$0$3$5$# -c$2$0$3$5$$ -c$2$0$3$5$% -c$2$0$3$5$& -c$2$0$3$5$' -c$2$0$3$5$( -c$2$0$3$5$) -c$2$0$3$5$* -c$2$0$3$5$+ -c$2$0$3$5$, -c$2$0$3$5$- -c$2$0$3$5$. -c$2$0$3$5$/ -c$2$0$3$5$: -c$2$0$3$5$; -c$2$0$3$5$< -c$2$0$3$5$= -c$2$0$3$5$> -c$2$0$3$5$? -c$2$0$3$5$@ -c$2$0$3$5$[ -c$2$0$3$5$\ -c$2$0$3$5$] -c$2$0$3$5$^ -c$2$0$3$5$_ -c$2$0$3$5$` -c$2$0$3$5${ -c$2$0$3$5$| -c$2$0$3$5$} -c$2$0$3$5$~ -c$2$0$3$6$ -c$2$0$3$6$! -c$2$0$3$6$" -c$2$0$3$6$# -c$2$0$3$6$$ -c$2$0$3$6$% -c$2$0$3$6$& -c$2$0$3$6$' -c$2$0$3$6$( -c$2$0$3$6$) -c$2$0$3$6$* -c$2$0$3$6$+ -c$2$0$3$6$, -c$2$0$3$6$- -c$2$0$3$6$. -c$2$0$3$6$/ -c$2$0$3$6$: -c$2$0$3$6$; -c$2$0$3$6$< -c$2$0$3$6$= -c$2$0$3$6$> -c$2$0$3$6$? -c$2$0$3$6$@ -c$2$0$3$6$[ -c$2$0$3$6$\ -c$2$0$3$6$] -c$2$0$3$6$^ -c$2$0$3$6$_ -c$2$0$3$6$` -c$2$0$3$6${ -c$2$0$3$6$| -c$2$0$3$6$} -c$2$0$3$6$~ -c$2$0$3$7$ -c$2$0$3$7$! -c$2$0$3$7$" -c$2$0$3$7$# -c$2$0$3$7$$ -c$2$0$3$7$% -c$2$0$3$7$& -c$2$0$3$7$' -c$2$0$3$7$( -c$2$0$3$7$) -c$2$0$3$7$* -c$2$0$3$7$+ -c$2$0$3$7$, -c$2$0$3$7$- -c$2$0$3$7$. -c$2$0$3$7$/ -c$2$0$3$7$: -c$2$0$3$7$; -c$2$0$3$7$< -c$2$0$3$7$= -c$2$0$3$7$> -c$2$0$3$7$? -c$2$0$3$7$@ -c$2$0$3$7$[ -c$2$0$3$7$\ -c$2$0$3$7$] -c$2$0$3$7$^ -c$2$0$3$7$_ -c$2$0$3$7$` -c$2$0$3$7${ -c$2$0$3$7$| -c$2$0$3$7$} -c$2$0$3$7$~ -c$2$0$3$8$ -c$2$0$3$8$! -c$2$0$3$8$" -c$2$0$3$8$# -c$2$0$3$8$$ -c$2$0$3$8$% -c$2$0$3$8$& -c$2$0$3$8$' -c$2$0$3$8$( -c$2$0$3$8$) -c$2$0$3$8$* -c$2$0$3$8$+ -c$2$0$3$8$, -c$2$0$3$8$- -c$2$0$3$8$. -c$2$0$3$8$/ -c$2$0$3$8$: -c$2$0$3$8$; -c$2$0$3$8$< -c$2$0$3$8$= -c$2$0$3$8$> -c$2$0$3$8$? -c$2$0$3$8$@ -c$2$0$3$8$[ -c$2$0$3$8$\ -c$2$0$3$8$] -c$2$0$3$8$^ -c$2$0$3$8$_ -c$2$0$3$8$` -c$2$0$3$8${ -c$2$0$3$8$| -c$2$0$3$8$} -c$2$0$3$8$~ -c$2$0$3$9$ -c$2$0$3$9$! -c$2$0$3$9$" -c$2$0$3$9$# -c$2$0$3$9$$ -c$2$0$3$9$% -c$2$0$3$9$& -c$2$0$3$9$' -c$2$0$3$9$( -c$2$0$3$9$) -c$2$0$3$9$* -c$2$0$3$9$+ -c$2$0$3$9$, -c$2$0$3$9$- -c$2$0$3$9$. -c$2$0$3$9$/ -c$2$0$3$9$: -c$2$0$3$9$; -c$2$0$3$9$< -c$2$0$3$9$= -c$2$0$3$9$> -c$2$0$3$9$? -c$2$0$3$9$@ -c$2$0$3$9$[ -c$2$0$3$9$\ -c$2$0$3$9$] -c$2$0$3$9$^ -c$2$0$3$9$_ -c$2$0$3$9$` -c$2$0$3$9${ -c$2$0$3$9$| -c$2$0$3$9$} -c$2$0$3$9$~ -c$2$0$4$0$ -c$2$0$4$0$! -c$2$0$4$0$" -c$2$0$4$0$# -c$2$0$4$0$$ -c$2$0$4$0$% -c$2$0$4$0$& -c$2$0$4$0$' -c$2$0$4$0$( -c$2$0$4$0$) -c$2$0$4$0$* -c$2$0$4$0$+ -c$2$0$4$0$, -c$2$0$4$0$- -c$2$0$4$0$. -c$2$0$4$0$/ -c$2$0$4$0$: -c$2$0$4$0$; -c$2$0$4$0$< -c$2$0$4$0$= -c$2$0$4$0$> -c$2$0$4$0$? -c$2$0$4$0$@ -c$2$0$4$0$[ -c$2$0$4$0$\ -c$2$0$4$0$] -c$2$0$4$0$^ -c$2$0$4$0$_ -c$2$0$4$0$` -c$2$0$4$0${ -c$2$0$4$0$| -c$2$0$4$0$} -c$2$0$4$0$~ -c$2$0$4$1$ -c$2$0$4$1$! -c$2$0$4$1$" -c$2$0$4$1$# -c$2$0$4$1$$ -c$2$0$4$1$% -c$2$0$4$1$& -c$2$0$4$1$' -c$2$0$4$1$( -c$2$0$4$1$) -c$2$0$4$1$* -c$2$0$4$1$+ -c$2$0$4$1$, -c$2$0$4$1$- -c$2$0$4$1$. -c$2$0$4$1$/ -c$2$0$4$1$: -c$2$0$4$1$; -c$2$0$4$1$< -c$2$0$4$1$= -c$2$0$4$1$> -c$2$0$4$1$? -c$2$0$4$1$@ -c$2$0$4$1$[ -c$2$0$4$1$\ -c$2$0$4$1$] -c$2$0$4$1$^ -c$2$0$4$1$_ -c$2$0$4$1$` -c$2$0$4$1${ -c$2$0$4$1$| -c$2$0$4$1$} -c$2$0$4$1$~ -c$2$0$4$2$ -c$2$0$4$2$! -c$2$0$4$2$" -c$2$0$4$2$# -c$2$0$4$2$$ -c$2$0$4$2$% -c$2$0$4$2$& -c$2$0$4$2$' -c$2$0$4$2$( -c$2$0$4$2$) -c$2$0$4$2$* -c$2$0$4$2$+ -c$2$0$4$2$, -c$2$0$4$2$- -c$2$0$4$2$. -c$2$0$4$2$/ -c$2$0$4$2$: -c$2$0$4$2$; -c$2$0$4$2$< -c$2$0$4$2$= -c$2$0$4$2$> -c$2$0$4$2$? -c$2$0$4$2$@ -c$2$0$4$2$[ -c$2$0$4$2$\ -c$2$0$4$2$] -c$2$0$4$2$^ -c$2$0$4$2$_ -c$2$0$4$2$` -c$2$0$4$2${ -c$2$0$4$2$| -c$2$0$4$2$} -c$2$0$4$2$~ -c$2$0$4$3$ -c$2$0$4$3$! -c$2$0$4$3$" -c$2$0$4$3$# -c$2$0$4$3$$ -c$2$0$4$3$% -c$2$0$4$3$& -c$2$0$4$3$' -c$2$0$4$3$( -c$2$0$4$3$) -c$2$0$4$3$* -c$2$0$4$3$+ -c$2$0$4$3$, -c$2$0$4$3$- -c$2$0$4$3$. -c$2$0$4$3$/ -c$2$0$4$3$: -c$2$0$4$3$; -c$2$0$4$3$< -c$2$0$4$3$= -c$2$0$4$3$> -c$2$0$4$3$? -c$2$0$4$3$@ -c$2$0$4$3$[ -c$2$0$4$3$\ -c$2$0$4$3$] -c$2$0$4$3$^ -c$2$0$4$3$_ -c$2$0$4$3$` -c$2$0$4$3${ -c$2$0$4$3$| -c$2$0$4$3$} -c$2$0$4$3$~ -c$2$0$4$4$ -c$2$0$4$4$! -c$2$0$4$4$" -c$2$0$4$4$# -c$2$0$4$4$$ -c$2$0$4$4$% -c$2$0$4$4$& -c$2$0$4$4$' -c$2$0$4$4$( -c$2$0$4$4$) -c$2$0$4$4$* -c$2$0$4$4$+ -c$2$0$4$4$, -c$2$0$4$4$- -c$2$0$4$4$. -c$2$0$4$4$/ -c$2$0$4$4$: -c$2$0$4$4$; -c$2$0$4$4$< -c$2$0$4$4$= -c$2$0$4$4$> -c$2$0$4$4$? -c$2$0$4$4$@ -c$2$0$4$4$[ -c$2$0$4$4$\ -c$2$0$4$4$] -c$2$0$4$4$^ -c$2$0$4$4$_ -c$2$0$4$4$` -c$2$0$4$4${ -c$2$0$4$4$| -c$2$0$4$4$} -c$2$0$4$4$~ -c$2$0$4$5$ -c$2$0$4$5$! -c$2$0$4$5$" -c$2$0$4$5$# -c$2$0$4$5$$ -c$2$0$4$5$% -c$2$0$4$5$& -c$2$0$4$5$' -c$2$0$4$5$( -c$2$0$4$5$) -c$2$0$4$5$* -c$2$0$4$5$+ -c$2$0$4$5$, -c$2$0$4$5$- -c$2$0$4$5$. -c$2$0$4$5$/ -c$2$0$4$5$: -c$2$0$4$5$; -c$2$0$4$5$< -c$2$0$4$5$= -c$2$0$4$5$> -c$2$0$4$5$? -c$2$0$4$5$@ -c$2$0$4$5$[ -c$2$0$4$5$\ -c$2$0$4$5$] -c$2$0$4$5$^ -c$2$0$4$5$_ -c$2$0$4$5$` -c$2$0$4$5${ -c$2$0$4$5$| -c$2$0$4$5$} -c$2$0$4$5$~ -c$2$0$4$6$ -c$2$0$4$6$! -c$2$0$4$6$" -c$2$0$4$6$# -c$2$0$4$6$$ -c$2$0$4$6$% -c$2$0$4$6$& -c$2$0$4$6$' -c$2$0$4$6$( -c$2$0$4$6$) -c$2$0$4$6$* -c$2$0$4$6$+ -c$2$0$4$6$, -c$2$0$4$6$- -c$2$0$4$6$. -c$2$0$4$6$/ -c$2$0$4$6$: -c$2$0$4$6$; -c$2$0$4$6$< -c$2$0$4$6$= -c$2$0$4$6$> -c$2$0$4$6$? -c$2$0$4$6$@ -c$2$0$4$6$[ -c$2$0$4$6$\ -c$2$0$4$6$] -c$2$0$4$6$^ -c$2$0$4$6$_ -c$2$0$4$6$` -c$2$0$4$6${ -c$2$0$4$6$| -c$2$0$4$6$} -c$2$0$4$6$~ -c$2$0$4$7$ -c$2$0$4$7$! -c$2$0$4$7$" -c$2$0$4$7$# -c$2$0$4$7$$ -c$2$0$4$7$% -c$2$0$4$7$& -c$2$0$4$7$' -c$2$0$4$7$( -c$2$0$4$7$) -c$2$0$4$7$* -c$2$0$4$7$+ -c$2$0$4$7$, -c$2$0$4$7$- -c$2$0$4$7$. -c$2$0$4$7$/ -c$2$0$4$7$: -c$2$0$4$7$; -c$2$0$4$7$< -c$2$0$4$7$= -c$2$0$4$7$> -c$2$0$4$7$? -c$2$0$4$7$@ -c$2$0$4$7$[ -c$2$0$4$7$\ -c$2$0$4$7$] -c$2$0$4$7$^ -c$2$0$4$7$_ -c$2$0$4$7$` -c$2$0$4$7${ -c$2$0$4$7$| -c$2$0$4$7$} -c$2$0$4$7$~ -c$2$0$4$8$ -c$2$0$4$8$! -c$2$0$4$8$" -c$2$0$4$8$# -c$2$0$4$8$$ -c$2$0$4$8$% -c$2$0$4$8$& -c$2$0$4$8$' -c$2$0$4$8$( -c$2$0$4$8$) -c$2$0$4$8$* -c$2$0$4$8$+ -c$2$0$4$8$, -c$2$0$4$8$- -c$2$0$4$8$. -c$2$0$4$8$/ -c$2$0$4$8$: -c$2$0$4$8$; -c$2$0$4$8$< -c$2$0$4$8$= -c$2$0$4$8$> -c$2$0$4$8$? -c$2$0$4$8$@ -c$2$0$4$8$[ -c$2$0$4$8$\ -c$2$0$4$8$] -c$2$0$4$8$^ -c$2$0$4$8$_ -c$2$0$4$8$` -c$2$0$4$8${ -c$2$0$4$8$| -c$2$0$4$8$} -c$2$0$4$8$~ -c$2$0$4$9$ -c$2$0$4$9$! -c$2$0$4$9$" -c$2$0$4$9$# -c$2$0$4$9$$ -c$2$0$4$9$% -c$2$0$4$9$& -c$2$0$4$9$' -c$2$0$4$9$( -c$2$0$4$9$) -c$2$0$4$9$* -c$2$0$4$9$+ -c$2$0$4$9$, -c$2$0$4$9$- -c$2$0$4$9$. -c$2$0$4$9$/ -c$2$0$4$9$: -c$2$0$4$9$; -c$2$0$4$9$< -c$2$0$4$9$= -c$2$0$4$9$> -c$2$0$4$9$? -c$2$0$4$9$@ -c$2$0$4$9$[ -c$2$0$4$9$\ -c$2$0$4$9$] -c$2$0$4$9$^ -c$2$0$4$9$_ -c$2$0$4$9$` -c$2$0$4$9${ -c$2$0$4$9$| -c$2$0$4$9$} -c$2$0$4$9$~ -c$2$1 -c$2$2 -c$2$3 -c$2$4 -c$2$5 -c$2$6 -c$2$7 -c$2$8 -c$2$9 -c$2$: -c$2$; -c$2$< -c$2$= -c$2$> -c$2$? -c$2$@ -c$2$[ -c$2$\ -c$2$] -c$2$^ -c$2$_ -c$2$` -c$2${ -c$2$| -c$2$} -c$2$~ -c$3 -c$3$ -c$3$! -c$3$" -c$3$# -c$3$$ -c$3$% -c$3$& -c$3$' -c$3$( -c$3$) -c$3$* -c$3$+ -c$3$, -c$3$- -c$3$. -c$3$/ -c$3$0 -c$3$1 -c$3$2 -c$3$3 -c$3$4 -c$3$5 -c$3$6 -c$3$7 -c$3$8 -c$3$9 -c$3$: -c$3$; -c$3$< -c$3$= -c$3$> -c$3$? -c$3$@ -c$3$[ -c$3$\ -c$3$] -c$3$^ -c$3$_ -c$3$` -c$3${ -c$3$| -c$3$} -c$3$~ -c$4 -c$4$ -c$4$! -c$4$" -c$4$# -c$4$$ -c$4$% -c$4$& -c$4$' -c$4$( -c$4$) -c$4$* -c$4$+ -c$4$, -c$4$- -c$4$. -c$4$/ -c$4$0 -c$4$1 -c$4$2 -c$4$3 -c$4$4 -c$4$5 -c$4$6 -c$4$7 -c$4$8 -c$4$9 -c$4$: -c$4$; -c$4$< -c$4$= -c$4$> -c$4$? -c$4$@ -c$4$[ -c$4$\ -c$4$] -c$4$^ -c$4$_ -c$4$` -c$4${ -c$4$| -c$4$} -c$4$~ -c$5 -c$5$ -c$5$! -c$5$" -c$5$# -c$5$$ -c$5$% -c$5$& -c$5$' -c$5$( -c$5$) -c$5$* -c$5$+ -c$5$, -c$5$- -c$5$. -c$5$/ -c$5$0 -c$5$1 -c$5$2 -c$5$3 -c$5$4 -c$5$5 -c$5$6 -c$5$7 -c$5$8 -c$5$9 -c$5$: -c$5$; -c$5$< -c$5$= -c$5$> -c$5$? -c$5$@ -c$5$[ -c$5$\ -c$5$] -c$5$^ -c$5$_ -c$5$` -c$5${ -c$5$| -c$5$} -c$5$~ -c$6 -c$6$ -c$6$! -c$6$" -c$6$# -c$6$$ -c$6$% -c$6$& -c$6$' -c$6$( -c$6$) -c$6$* -c$6$+ -c$6$, -c$6$- -c$6$. -c$6$/ -c$6$0 -c$6$1 -c$6$2 -c$6$3 -c$6$4 -c$6$5 -c$6$6 -c$6$7 -c$6$8 -c$6$9 -c$6$: -c$6$; -c$6$< -c$6$= -c$6$> -c$6$? -c$6$@ -c$6$[ -c$6$\ -c$6$] -c$6$^ -c$6$_ -c$6$` -c$6${ -c$6$| -c$6$} -c$6$~ -c$7 -c$7$ -c$7$! -c$7$" -c$7$# -c$7$$ -c$7$% -c$7$& -c$7$' -c$7$( -c$7$) -c$7$* -c$7$+ -c$7$, -c$7$- -c$7$. -c$7$/ -c$7$0 -c$7$1 -c$7$2 -c$7$3 -c$7$4 -c$7$5 -c$7$6 -c$7$7 -c$7$8 -c$7$9 -c$7$: -c$7$; -c$7$< -c$7$= -c$7$> -c$7$? -c$7$@ -c$7$[ -c$7$\ -c$7$] -c$7$^ -c$7$_ -c$7$` -c$7${ -c$7$| -c$7$} -c$7$~ -c$8 -c$8$ -c$8$! -c$8$" -c$8$# -c$8$$ -c$8$% -c$8$& -c$8$' -c$8$( -c$8$) -c$8$* -c$8$+ -c$8$, -c$8$- -c$8$. -c$8$/ -c$8$0 -c$8$1 -c$8$2 -c$8$3 -c$8$4 -c$8$5 -c$8$6 -c$8$7 -c$8$8 -c$8$9 -c$8$: -c$8$; -c$8$< -c$8$= -c$8$> -c$8$? -c$8$@ -c$8$[ -c$8$\ -c$8$] -c$8$^ -c$8$_ -c$8$` -c$8${ -c$8$| -c$8$} -c$8$~ -c$9 -c$9$ -c$9$! -c$9$" -c$9$# -c$9$$ -c$9$% -c$9$& -c$9$' -c$9$( -c$9$) -c$9$* -c$9$+ -c$9$, -c$9$- -c$9$. -c$9$/ -c$9$0 -c$9$1 -c$9$2 -c$9$3 -c$9$4 -c$9$5 -c$9$6 -c$9$7 -c$9$8 -c$9$9 -c$9$: -c$9$; -c$9$< -c$9$= -c$9$> -c$9$? -c$9$@ -c$9$[ -c$9$\ -c$9$] -c$9$^ -c$9$_ -c$9$` -c$9${ -c$9$| -c$9$} -c$9$~ -c$: -c$:$0 -c$:$1 -c$:$2 -c$:$3 -c$:$4 -c$:$5 -c$:$6 -c$:$7 -c$:$8 -c$:$9 -c$; -c$;$0 -c$;$1 -c$;$2 -c$;$3 -c$;$4 -c$;$5 -c$;$6 -c$;$7 -c$;$8 -c$;$9 -c$< -c$<$0 -c$<$1 -c$<$2 -c$<$3 -c$<$4 -c$<$5 -c$<$6 -c$<$7 -c$<$8 -c$<$9 -c$= -c$=$0 -c$=$1 -c$=$2 -c$=$3 -c$=$4 -c$=$5 -c$=$6 -c$=$7 -c$=$8 -c$=$9 -c$> -c$>$0 -c$>$1 -c$>$2 -c$>$3 -c$>$4 -c$>$5 -c$>$6 -c$>$7 -c$>$8 -c$>$9 -c$? -c$?$0 -c$?$1 -c$?$2 -c$?$3 -c$?$4 -c$?$5 -c$?$6 -c$?$7 -c$?$8 -c$?$9 -c$@ -c$@$0 -c$@$1 -c$@$2 -c$@$3 -c$@$4 -c$@$5 -c$@$6 -c$@$7 -c$@$8 -c$@$9 -c$@$a$m$e$l$e$.$c$o$m -c$@$a$o$l$.$c$o$m -c$@$c$o$m$c$a$s$t$.$n$e$t -c$@$c$o$x$.$n$e$t -c$@$f$a$s$t$m$a$i$l$.$f$m -c$@$g$a$w$a$b$.$c$o$m -c$@$g$m$a$i$l$.$c$o$m -c$@$g$m$x$.$c$o$m -c$@$g$m$x$.$u$s -c$@$h$o$t$m$a$i$l$.$c$o$m -c$@$i$n$b$o$x$.$r$u -c$@$l$i$v$e$.$c$o$.$u$k -c$@$l$i$v$e$.$c$o$m -c$@$m$a$i$l$.$c$o$m -c$@$m$a$i$l$.$r$u -c$@$m$s$n$.$c$o$m -c$@$v$e$r$i$z$o$n$.$n$e$t -c$@$w$p$.$p$l -c$@$y$a$h$o$o$.$c$a -c$@$y$a$h$o$o$.$c$o$.$i$n -c$@$y$a$h$o$o$.$c$o$.$u$k -c$@$y$a$h$o$o$.$c$o$m -c$@$y$m$a$i$l$.$c$o$m -c$@$z$o$h$o$.$c$o$m -c$S -c$[ -c$[$0 -c$[$1 -c$[$2 -c$[$3 -c$[$4 -c$[$5 -c$[$6 -c$[$7 -c$[$8 -c$[$9 -c$\ -c$\$0 -c$\$1 -c$\$2 -c$\$3 -c$\$4 -c$\$5 -c$\$6 -c$\$7 -c$\$8 -c$\$9 -c$] -c$]$0 -c$]$1 -c$]$2 -c$]$3 -c$]$4 -c$]$5 -c$]$6 -c$]$7 -c$]$8 -c$]$9 -c$^ -c$^$0 -c$^$1 -c$^$2 -c$^$3 -c$^$4 -c$^$5 -c$^$6 -c$^$7 -c$^$8 -c$^$9 -c$_ -c$_$0 -c$_$1 -c$_$2 -c$_$3 -c$_$4 -c$_$5 -c$_$6 -c$_$7 -c$_$8 -c$_$9 -c$` -c$`$0 -c$`$1 -c$`$2 -c$`$3 -c$`$4 -c$`$5 -c$`$6 -c$`$7 -c$`$8 -c$`$9 -c$a -c$a$b$l$e -c$a$c$l$e -c$a$g$e -c$a$l -c$a$l$l$y -c$a$m -c$a$n -c$a$n$a -c$a$n$c$e -c$a$n$d -c$a$n$e -c$a$n$t -c$a$r$y -c$a$s$e -c$a$t$i$o$n -c$a$t$i$v$e -c$a$u$x -c$b -c$b$a$b$y -c$b$a$c$k -c$b$a$l$l -c$b$e$l$l -c$b$o$o$k -c$b$o$y -c$b$r$o$w$n -c$c -c$c$y -c$d -c$d$a$v$i$d -c$d$a$y -c$d$o$m$e -c$e -c$e$a$u -c$e$d -c$e$e -c$e$l$l$a -c$e$n -c$e$n$c$e -c$e$n$t -c$e$o$u$s -c$e$r -c$e$r$y -c$e$s -c$e$s$s -c$e$s$t -c$e$t -c$e$t$t$e -c$f -c$f$a$r$m$v$i$l$l$e -c$f$o$r$m -c$f$u$l -c$f$u$l$l$y -c$g -c$g$e$n$y -c$h -c$h$e$a$d -c$h$o$o$d -c$i -c$i$a$l -c$i$a$n -c$i$b$l$e -c$i$c -c$i$c$e$s -c$i$c$l$e -c$i$d$e -c$i$e$r -c$i$e$s -c$i$e$s$t -c$i$f$y -c$i$l$e -c$i$l$i$a -c$i$l$y -c$i$n$e -c$i$n$g -c$i$o$n -c$i$o$u$s -c$i$s$e -c$i$s$h -c$i$s$m -c$i$s$t -c$i$t$e -c$i$t$i$c -c$i$t$i$o$n -c$i$t$i$v$e -c$i$t$y -c$i$v$e -c$i$x -c$i$z$e -c$j -c$j$o$h$n -c$j$o$h$n$s$o$n -c$k -c$k$h$a$n -c$k$i$n -c$l -c$l$a$n$d -c$l$e$e -c$l$e$s$s -c$l$e$t -c$l$i$k$e -c$l$i$n$e -c$l$i$n$g -c$l$o$n$g -c$l$o$o$p -c$l$y -c$m -c$m$a$n -c$m$e$n -c$m$e$n$t -c$m$i$c$h$a$e$l -c$m$i$k$e -c$n -c$n$e$s$s -c$o -c$o$e$s -c$o$i$d -c$o$l -c$o$l$o$g$y -c$o$m$y -c$o$n -c$o$r -c$o$r$y -c$o$s$e -c$o$u$r -c$o$u$s -c$o$u$t -c$o$v$e$r -c$p -c$p$a$s$s -c$p$h$p$b$b -c$q -c$q$w$e$r$t$y -c$r -c$r$o$o$m -c$s -c$s$a$l$a$s$a$n$a -c$s$e$r$v$e$r -c$s$e$s -c$s$e$x$y -c$s$h -c$s$h$i$p -c$s$i$d$e -c$s$i$o$n -c$s$i$s -c$s$m$i$t$h -c$s$o$m$e -c$t -c$t$e$s$t -c$t$h$e -c$t$i$o$n -c$t$y -c$u -c$u$m -c$u$p -c$v -c$w -c$w$a$y -c$w$i$s$e -c$w$o$o$d -c$x -c$y -c$z -c${ -c${$0 -c${$1 -c${$2 -c${$3 -c${$4 -c${$5 -c${$6 -c${$7 -c${$8 -c${$9 -c$| -c$|$0 -c$|$1 -c$|$2 -c$|$3 -c$|$4 -c$|$5 -c$|$6 -c$|$7 -c$|$8 -c$|$9 -c$} -c$}$0 -c$}$1 -c$}$2 -c$}$3 -c$}$4 -c$}$5 -c$}$6 -c$}$7 -c$}$8 -c$}$9 -c$~ -c$~$!$@$#$$ -c$~$0 -c$~$1 -c$~$2 -c$~$3 -c$~$4 -c$~$5 -c$~$6 -c$~$7 -c$~$8 -c$~$9 -c^ ^I -c^ ^a -c^ ^a^ ^m^i -c^ ^d^n^a^s -c^ ^e^h^t -c^ ^e^r^a^ ^e^w -c^ ^e^r^a^ ^u^o^y -c^ ^e^r^a^ ^y^e^h^t -c^ ^e^v^a^h^ ^i -c^ ^i -c^ ^l^l^i^m -c^ ^m^'^I -c^ ^m^'^i -c^ ^m^a^ ^i -c^ ^p^o^t -c^ ^r^ ^e^w -c^ ^r^ ^u^o^y -c^ ^r^ ^y^e^h^t -c^ ^s^i^ ^e^h -c^ ^s^i^ ^e^h^s -c^ ^s^i^ ^s^i^h^t -c^ ^s^i^ ^t^i -c^ ^t^'^n^o^d^ ^i -c^ ^t^n^o^d^ ^i -c^ ^t^o^n^ ^m^a^ ^i -c^ ^u -c^ ^u^o^y -c^ ^y^m -c^-^i^m^e^s -c^-^n^o^n -c^-^r^e^p^y^h -c^-^r^e^v^o -c^-^s^i^m -c^-^t^n^a -c^-^x^e -c^0^0^0^2 -c^0^1^0^2 -c^0^4^9^1 -c^0^5^9^1 -c^0^6^9^1 -c^0^7^9^1 -c^0^8^9^1 -c^0^9^9^1 -c^1 -c^1^0^0^2 -c^1^1^0^2 -c^1^2^3 -c^1^4^9^1 -c^1^5^9^1 -c^1^6^9^1 -c^1^7^9^1 -c^1^8^9^1 -c^1^9^9^1 -c^2^0^0^2 -c^2^1^0^2 -c^2^4^9^1 -c^2^5^9^1 -c^2^6^9^1 -c^2^7^9^1 -c^2^8^9^1 -c^2^9^9^1 -c^3^0^0^2 -c^3^1^0^2 -c^3^2^1 -c^3^4^9^1 -c^3^5^9^1 -c^3^6^9^1 -c^3^7^9^1 -c^3^8^9^1 -c^3^9^9^1 -c^4^0^0^2 -c^4^1^0^2 -c^4^4^9^1 -c^4^5^9^1 -c^4^6^9^1 -c^4^7^9^1 -c^4^8^9^1 -c^4^9^9^1 -c^5^0^0^2 -c^5^1^0^2 -c^5^4^9^1 -c^5^5^9^1 -c^5^6^9^1 -c^5^7^9^1 -c^5^8^9^1 -c^5^9^9^1 -c^6^0^0^2 -c^6^1^0^2 -c^6^4^9^1 -c^6^5^9^1 -c^6^6^9^1 -c^6^7^9^1 -c^6^8^9^1 -c^6^9^9^1 -c^7^0^0^2 -c^7^1^0^2 -c^7^4^9^1 -c^7^5^9^1 -c^7^6^9^1 -c^7^7^9^1 -c^7^8^9^1 -c^7^9^9^1 -c^8^0^0^2 -c^8^1^0^2 -c^8^4^9^1 -c^8^5^9^1 -c^8^6^9^1 -c^8^7^9^1 -c^8^8^9^1 -c^8^9^9^1 -c^9^0^0^2 -c^9^1^0^2 -c^9^4^9^1 -c^9^5^9^1 -c^9^6^9^1 -c^9^7^9^1 -c^9^8^9^1 -c^9^9^9^1 -c^A -c^B -c^C -c^D -c^E -c^F -c^G -c^H -c^I -c^J -c^K -c^L -c^M -c^N -c^O -c^P -c^Q -c^R -c^S -c^T -c^U -c^V -c^W -c^X -c^Y -c^Z -c^a -c^a^e^s -c^a^e^t -c^a^g^e^m -c^a^i^d -c^a^n^a -c^a^r^t^l^u -c^b -c^b^o -c^b^u^s -c^c -c^c^c^a -c^d -c^d^a^b -c^d^a^e^d -c^d^a^e^h -c^d^a^e^l -c^d^d^a -c^d^e^b -c^d^e^e^s -c^d^e^r -c^d^i^m -c^d^l^o^g -c^d^n^a^b -c^d^n^a^h -c^d^n^a^l -c^d^n^i^h -c^d^n^i^w -c^d^o^o^g -c^d^o^o^w -c^d^r^a^h -c^d^r^o^c -c^d^r^o^w^s^s^a^p -c^d^u^m -c^e -c^e^b -c^e^c^a^f -c^e^c^a^l -c^e^c^i -c^e^c^i^v -c^e^d -c^e^d^i^s -c^e^e^n^k -c^e^e^r^f -c^e^l^e^t -c^e^n^i^l -c^e^n^o^t^s -c^e^r -c^e^r^i^f -c^e^r^o^f -c^e^r^p -c^e^s^o^n -c^e^t^n^a -c^e^v^a^h^i -c^e^y^e -c^f -c^f^f^o -c^f^l^a^h -c^f^l^e^s -c^g -c^g^e^l -c^g^i^p -c^g^n^i^k -c^g^n^i^r -c^g^n^i^w -c^g^n^o^l -c^g^o^d -c^g^o^l -c^h -c^h^c^r^a -c^h^g^i^h -c^h^s^a -c^h^s^a^w -c^h^s^i^f -c^h^t^a^b -c^h^t^r^a^e -c^i -c^i^b -c^i^l^e^h -c^i^m^e^d -c^i^m^e^s -c^i^n^i^m -c^i^n^m^o -c^i^p^e -c^i^r^t -c^i^t^l^u^m -c^i^t^n^a -c^i^x^a^m -c^j -c^k -c^k^c^a^b -c^k^l^i^m -c^k^n^i -c^k^o^o^b -c^k^r^o^w -c^l -c^l^a^m -c^l^a^o^c -c^l^i -c^l^i^a^j -c^l^i^a^r -c^l^i^a^s -c^l^i^a^t -c^l^i^o -c^l^l^a^f -c^l^l^i -c^l^l^i^p -c^l^l^o^r -c^l^o^o^w -c^m -c^m^'^I -c^m^'^i -c^m^a^ ^i -c^m^e -c^m^i -c^m^o^c -c^m^r^a^f -c^m^r^o^w -c^m^u^g -c^n -c^n^a^m -c^n^e -c^n^e^p -c^n^i -c^n^i^m^d^a -c^n^i^p -c^n^i^t -c^n^o -c^n^o^c -c^n^o^n -c^n^o^o^m -c^n^r^o^c -c^n^u -c^n^u^g -c^n^u^s -c^n^w^o^d -c^o -c^o^c -c^o^d^u^e^s^p -c^o^e^n -c^o^i^b -c^o^l^i^k -c^o^l^l^a -c^o^n^o^m -c^o^o^z -c^o^p^y^h -c^o^r^c^a -c^o^r^c^a^m -c^o^r^c^i^m -c^o^r^e^a -c^o^r^p -c^o^r^y^g -c^o^s^i -c^o^t^c^e -c^o^t^u^a -c^p -c^p^m^a^c -c^p^u -c^q -c^r -c^r^a^e -c^r^a^e^b -c^r^a^o -c^r^a^p -c^r^a^w -c^r^e^d^n^u -c^r^e^p -c^r^e^p^u^s -c^r^e^p^y^h -c^r^e^t^a^w -c^r^e^t^f^a -c^r^e^t^n^i -c^r^e^t^n^u^o^c -c^r^e^v^o -c^r^i -c^r^i^a -c^r^i^a^h -c^r^o^f -c^r^o^o^d -c^r^o^t^a^r^t^s^i^n^i^m^d^a -c^r^u^s -c^s -c^s^i^d -c^s^i^h^t -c^s^i^m -c^s^n^a^r^t -c^s^s^a^p -c^s^s^o^r^c -c^s^y^d -c^t -c^t^a^b -c^t^a^c -c^t^a^f -c^t^a^h -c^t^a^o^b -c^t^a^r -c^t^c^a^l -c^t^e^j -c^t^f^o^s -c^t^h^g^i^n -c^t^n^e^c -c^t^o^h -c^t^o^n^k -c^t^o^o^b -c^t^o^o^f -c^t^o^p -c^t^p^e^h -c^t^s^o^p -c^t^u^c -c^t^u^o -c^u -c^u^e -c^v -c^w -c^w^a^j -c^w^a^s -c^w^e^n -c^w^o^b -c^w^o^c -c^w^o^l -c^w^o^n^s -c^w^o^t -c^x -c^x^a -c^x^a^t -c^x^e -c^x^o -c^y -c^y^a^d -c^y^a^d^i^r^f -c^y^a^d^n^o^m -c^y^a^d^n^u^s -c^y^a^d^r^u^t^a^s -c^y^a^d^s^e^n^d^e^w -c^y^a^d^s^r^u^h^t -c^y^a^d^s^u^e^t -c^y^a^l -c^y^a^l^p -c^y^a^p -c^y^a^w -c^y^b -c^y^e^k -c^y^k^s -c^y^l^o^p -c^y^m -c^z -cl -co0k -co0p -d -d$S -d$a -d$a$b$l$e -d$a$c$l$e -d$a$g$e -d$a$l -d$a$l$l$y -d$a$m -d$a$n -d$a$n$a -d$a$n$c$e -d$a$n$d -d$a$n$e -d$a$n$t -d$a$r$y -d$a$s$e -d$a$t$i$o$n -d$a$t$i$v$e -d$a$u$x -d$b -d$b$a$b$y -d$b$a$c$k -d$b$a$l$l -d$b$e$l$l -d$b$o$o$k -d$b$o$y -d$c -d$c$y -d$d -d$d$a$y -d$d$o$m$e -d$e -d$e$a$u -d$e$d -d$e$e -d$e$l$l$a -d$e$n -d$e$n$c$e -d$e$n$t -d$e$o$u$s -d$e$r -d$e$r$y -d$e$s -d$e$s$s -d$e$s$t -d$e$t -d$e$t$t$e -d$f -d$f$o$r$m -d$f$u$l -d$f$u$l$l$y -d$g -d$g$e$n$y -d$h -d$h$e$a$d -d$h$o$o$d -d$i -d$i$a$l -d$i$a$n -d$i$b$l$e -d$i$c -d$i$c$e$s -d$i$c$l$e -d$i$d$e -d$i$e$r -d$i$e$s -d$i$e$s$t -d$i$f$y -d$i$l$e -d$i$l$i$a -d$i$l$y -d$i$n$e -d$i$n$g -d$i$o$n -d$i$o$u$s -d$i$s$e -d$i$s$h -d$i$s$m -d$i$s$t -d$i$t$e -d$i$t$i$c -d$i$t$i$o$n -d$i$t$i$v$e -d$i$t$y -d$i$v$e -d$i$x -d$i$z$e -d$j -d$j$o$n$e$s -d$k -d$k$i$n -d$l -d$l$a$n$d -d$l$e$s$s -d$l$e$t -d$l$i$k$e -d$l$i$n$e -d$l$i$n$g -d$l$o$n$g -d$l$o$o$p -d$l$y -d$m -d$m$a$n -d$m$e$n -d$m$e$n$t -d$n -d$n$e$s$s -d$o -d$o$e$s -d$o$i$d -d$o$l -d$o$l$o$g$y -d$o$m$y -d$o$n -d$o$r -d$o$r$y -d$o$s$e -d$o$u$r -d$o$u$s -d$o$u$t -d$o$v$e$r -d$p -d$p$a$s$s -d$q -d$r -d$r$o$o$m -d$s -d$s$e$s -d$s$e$x$y -d$s$h -d$s$h$i$p -d$s$i$d$e -d$s$i$o$n -d$s$i$s -d$s$o$m$e -d$t -d$t$h$e -d$t$i$o$n -d$t$y -d$u -d$u$m -d$u$p -d$v -d$w -d$w$a$y -d$w$i$s$e -d$w$o$o$d -d$x -d$y -d$z -d$~$!$@$#$$ -dx27f'4y4 +c $ +c $ $0 +c $ $1 +c $ $2 +c $ $3 +c $ $4 +c $ $5 +c $ $6 +c $ $7 +c $ $8 +c $ $9 +c $! +c $! $0 +c $! $1 +c $! $2 +c $! $3 +c $! $4 +c $! $5 +c $! $6 +c $! $7 +c $! $8 +c $! $9 +c $" +c $" $0 +c $" $1 +c $" $2 +c $" $3 +c $" $4 +c $" $5 +c $" $6 +c $" $7 +c $" $8 +c $" $9 +c $# +c $# $0 +c $# $1 +c $# $2 +c $# $3 +c $# $4 +c $# $5 +c $# $6 +c $# $7 +c $# $8 +c $# $9 +c $$ +c $$ $0 +c $$ $1 +c $$ $2 +c $$ $3 +c $$ $4 +c $$ $5 +c $$ $6 +c $$ $7 +c $$ $8 +c $$ $9 +c $% +c $% $0 +c $% $1 +c $% $2 +c $% $3 +c $% $4 +c $% $5 +c $% $6 +c $% $7 +c $% $8 +c $% $9 +c $& +c $& $0 +c $& $1 +c $& $2 +c $& $3 +c $& $4 +c $& $5 +c $& $6 +c $& $7 +c $& $8 +c $& $9 +c $& $a $m $p $; +c $' +c $' $0 +c $' $1 +c $' $2 +c $' $3 +c $' $4 +c $' $5 +c $' $6 +c $' $7 +c $' $8 +c $' $9 +c $( +c $( $0 +c $( $1 +c $( $2 +c $( $3 +c $( $4 +c $( $5 +c $( $6 +c $( $7 +c $( $8 +c $( $9 +c $) +c $) $0 +c $) $1 +c $) $2 +c $) $3 +c $) $4 +c $) $5 +c $) $6 +c $) $7 +c $) $8 +c $) $9 +c $* +c $* $0 +c $* $1 +c $* $2 +c $* $3 +c $* $4 +c $* $5 +c $* $6 +c $* $7 +c $* $8 +c $* $9 +c $+ +c $+ $0 +c $+ $1 +c $+ $2 +c $+ $3 +c $+ $4 +c $+ $5 +c $+ $6 +c $+ $7 +c $+ $8 +c $+ $9 +c $, +c $, $0 +c $, $1 +c $, $2 +c $, $3 +c $, $4 +c $, $5 +c $, $6 +c $, $7 +c $, $8 +c $, $9 +c $- +c $- $0 +c $- $1 +c $- $2 +c $- $3 +c $- $4 +c $- $5 +c $- $6 +c $- $7 +c $- $8 +c $- $9 +c $. +c $. $0 +c $. $1 +c $. $2 +c $. $3 +c $. $4 +c $. $5 +c $. $6 +c $. $7 +c $. $8 +c $. $9 +c $. $a $c +c $. $a $d +c $. $a $e +c $. $a $e $r $o +c $. $a $f +c $. $a $g +c $. $a $i +c $. $a $l +c $. $a $m +c $. $a $n +c $. $a $o +c $. $a $q +c $. $a $r +c $. $a $r $p $a +c $. $a $s +c $. $a $t +c $. $a $u +c $. $a $w +c $. $a $x +c $. $a $z +c $. $b $a +c $. $b $b +c $. $b $d +c $. $b $e +c $. $b $f +c $. $b $g +c $. $b $h +c $. $b $i +c $. $b $i $z +c $. $b $j +c $. $b $m +c $. $b $n +c $. $b $o +c $. $b $r +c $. $b $s +c $. $b $t +c $. $b $v +c $. $b $w +c $. $b $y +c $. $b $z +c $. $c $a +c $. $c $a $t +c $. $c $c +c $. $c $d +c $. $c $f +c $. $c $g +c $. $c $h +c $. $c $i +c $. $c $k +c $. $c $l +c $. $c $m +c $. $c $n +c $. $c $o +c $. $c $o $m +c $. $c $o $o $p +c $. $c $r +c $. $c $u +c $. $c $v +c $. $c $x +c $. $c $y +c $. $c $z +c $. $d $e +c $. $d $j +c $. $d $k +c $. $d $m +c $. $d $o +c $. $d $z +c $. $e $c +c $. $e $d $u +c $. $e $e +c $. $e $g +c $. $e $r +c $. $e $s +c $. $e $t +c $. $e $u +c $. $f $i +c $. $f $j +c $. $f $k +c $. $f $m +c $. $f $o +c $. $f $r +c $. $g $a +c $. $g $b +c $. $g $d +c $. $g $e +c $. $g $f +c $. $g $g +c $. $g $h +c $. $g $i +c $. $g $l +c $. $g $m +c $. $g $n +c $. $g $o $v +c $. $g $p +c $. $g $q +c $. $g $r +c $. $g $s +c $. $g $t +c $. $g $u +c $. $g $w +c $. $g $y +c $. $h $k +c $. $h $m +c $. $h $n +c $. $h $r +c $. $h $t +c $. $h $u +c $. $i $d +c $. $i $e +c $. $i $l +c $. $i $m +c $. $i $n +c $. $i $n $f $o +c $. $i $n $t +c $. $i $o +c $. $i $q +c $. $i $r +c $. $i $s +c $. $i $t +c $. $j $e +c $. $j $m +c $. $j $o +c $. $j $o $b $s +c $. $j $p +c $. $k $e +c $. $k $g +c $. $k $h +c $. $k $i +c $. $k $m +c $. $k $n +c $. $k $r +c $. $k $w +c $. $k $y +c $. $k $z +c $. $l $a +c $. $l $b +c $. $l $c +c $. $l $i +c $. $l $k +c $. $l $r +c $. $l $s +c $. $l $t +c $. $l $u +c $. $l $v +c $. $l $y +c $. $m $a +c $. $m $c +c $. $m $d +c $. $m $g +c $. $m $h +c $. $m $i $l +c $. $m $k +c $. $m $l +c $. $m $m +c $. $m $n +c $. $m $o +c $. $m $o $b $i +c $. $m $p +c $. $m $q +c $. $m $r +c $. $m $s +c $. $m $t +c $. $m $u +c $. $m $v +c $. $m $w +c $. $m $x +c $. $m $y +c $. $m $z +c $. $n $a +c $. $n $a $m $e +c $. $n $c +c $. $n $e +c $. $n $e $t +c $. $n $f +c $. $n $g +c $. $n $i +c $. $n $l +c $. $n $o +c $. $n $p +c $. $n $r +c $. $n $u +c $. $n $z +c $. $o $m +c $. $o $r $g +c $. $p $a +c $. $p $e +c $. $p $f +c $. $p $g +c $. $p $h +c $. $p $k +c $. $p $l +c $. $p $m +c $. $p $n +c $. $p $r +c $. $p $r $o +c $. $p $s +c $. $p $t +c $. $p $w +c $. $p $y +c $. $q $a +c $. $r $e +c $. $r $o +c $. $r $o $o $t +c $. $r $u +c $. $r $w +c $. $s $a +c $. $s $b +c $. $s $c +c $. $s $d +c $. $s $e +c $. $s $g +c $. $s $h +c $. $s $i +c $. $s $j +c $. $s $k +c $. $s $l +c $. $s $m +c $. $s $n +c $. $s $o +c $. $s $r +c $. $s $t +c $. $s $u +c $. $s $v +c $. $s $y +c $. $s $z +c $. $t $c +c $. $t $d +c $. $t $f +c $. $t $g +c $. $t $h +c $. $t $j +c $. $t $k +c $. $t $l +c $. $t $m +c $. $t $n +c $. $t $o +c $. $t $p +c $. $t $r +c $. $t $r $a $v $e $l +c $. $t $t +c $. $t $v +c $. $t $w +c $. $t $z +c $. $u $a +c $. $u $g +c $. $u $k +c $. $u $m +c $. $u $s +c $. $u $y +c $. $u $z +c $. $v $a +c $. $v $c +c $. $v $e +c $. $v $g +c $. $v $i +c $. $v $n +c $. $v $u +c $. $w $f +c $. $w $s +c $. $y $e +c $. $y $t +c $. $y $u +c $. $z $a +c $. $z $m +c $. $z $w +c $/ +c $/ $0 +c $/ $1 +c $/ $2 +c $/ $3 +c $/ $4 +c $/ $5 +c $/ $6 +c $/ $7 +c $/ $8 +c $/ $9 +c $0 $ +c $0 $! +c $0 $" +c $0 $# +c $0 $$ +c $0 $% +c $0 $& +c $0 $' +c $0 $( +c $0 $) +c $0 $* +c $0 $+ +c $0 $, +c $0 $- +c $0 $. +c $0 $/ +c $0 $0 +c $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 +c $0 $2 +c $0 $3 +c $0 $4 +c $0 $5 +c $0 $6 +c $0 $7 +c $0 $9 +c $0 $: +c $0 $; +c $0 $< +c $0 $= +c $0 $> +c $0 $? +c $0 $@ +c $0 $[ +c $0 $\ +c $0 $] +c $0 $^ +c $0 $_ +c $0 $` +c $0 ${ +c $0 $| +c $0 $} +c $0 $~ +c $1 $ +c $1 $! +c $1 $" +c $1 $# +c $1 $$ +c $1 $% +c $1 $& +c $1 $' +c $1 $( +c $1 $) +c $1 $* +c $1 $+ +c $1 $, +c $1 $- +c $1 $. +c $1 $/ +c $1 $0 +c $1 $1 +c $1 $2 $3 $4 +c $1 $2 $3 $4 $5 $6 +c $1 $2 $3 $4 $5 $6 $7 +c $1 $2 $3 $4 $5 $6 $7 $8 +c $1 $2 $3 $4 $5 $6 $7 $8 $9 +c $1 $2 $3 $4 $5 $6 $7 $8 $9 $0 +c $1 $5 +c $1 $7 +c $1 $8 +c $1 $9 +c $1 $9 $9 $0 $ +c $1 $9 $9 $0 $! +c $1 $9 $9 $0 $" +c $1 $9 $9 $0 $# +c $1 $9 $9 $0 $$ +c $1 $9 $9 $0 $% +c $1 $9 $9 $0 $& +c $1 $9 $9 $0 $' +c $1 $9 $9 $0 $( +c $1 $9 $9 $0 $) +c $1 $9 $9 $0 $* +c $1 $9 $9 $0 $+ +c $1 $9 $9 $0 $, +c $1 $9 $9 $0 $- +c $1 $9 $9 $0 $. +c $1 $9 $9 $0 $/ +c $1 $9 $9 $0 $: +c $1 $9 $9 $0 $; +c $1 $9 $9 $0 $< +c $1 $9 $9 $0 $= +c $1 $9 $9 $0 $> +c $1 $9 $9 $0 $? +c $1 $9 $9 $0 $@ +c $1 $9 $9 $0 $[ +c $1 $9 $9 $0 $\ +c $1 $9 $9 $0 $] +c $1 $9 $9 $0 $^ +c $1 $9 $9 $0 $_ +c $1 $9 $9 $0 $` +c $1 $9 $9 $0 ${ +c $1 $9 $9 $0 $| +c $1 $9 $9 $0 $} +c $1 $9 $9 $0 $~ +c $1 $9 $9 $1 $ +c $1 $9 $9 $1 $! +c $1 $9 $9 $1 $" +c $1 $9 $9 $1 $# +c $1 $9 $9 $1 $$ +c $1 $9 $9 $1 $% +c $1 $9 $9 $1 $& +c $1 $9 $9 $1 $' +c $1 $9 $9 $1 $( +c $1 $9 $9 $1 $) +c $1 $9 $9 $1 $* +c $1 $9 $9 $1 $+ +c $1 $9 $9 $1 $, +c $1 $9 $9 $1 $- +c $1 $9 $9 $1 $. +c $1 $9 $9 $1 $/ +c $1 $9 $9 $1 $: +c $1 $9 $9 $1 $; +c $1 $9 $9 $1 $< +c $1 $9 $9 $1 $= +c $1 $9 $9 $1 $> +c $1 $9 $9 $1 $? +c $1 $9 $9 $1 $@ +c $1 $9 $9 $1 $[ +c $1 $9 $9 $1 $\ +c $1 $9 $9 $1 $] +c $1 $9 $9 $1 $^ +c $1 $9 $9 $1 $_ +c $1 $9 $9 $1 $` +c $1 $9 $9 $1 ${ +c $1 $9 $9 $1 $| +c $1 $9 $9 $1 $} +c $1 $9 $9 $1 $~ +c $1 $9 $9 $2 $ +c $1 $9 $9 $2 $! +c $1 $9 $9 $2 $" +c $1 $9 $9 $2 $# +c $1 $9 $9 $2 $$ +c $1 $9 $9 $2 $% +c $1 $9 $9 $2 $& +c $1 $9 $9 $2 $' +c $1 $9 $9 $2 $( +c $1 $9 $9 $2 $) +c $1 $9 $9 $2 $* +c $1 $9 $9 $2 $+ +c $1 $9 $9 $2 $, +c $1 $9 $9 $2 $- +c $1 $9 $9 $2 $. +c $1 $9 $9 $2 $/ +c $1 $9 $9 $2 $: +c $1 $9 $9 $2 $; +c $1 $9 $9 $2 $< +c $1 $9 $9 $2 $= +c $1 $9 $9 $2 $> +c $1 $9 $9 $2 $? +c $1 $9 $9 $2 $@ +c $1 $9 $9 $2 $[ +c $1 $9 $9 $2 $\ +c $1 $9 $9 $2 $] +c $1 $9 $9 $2 $^ +c $1 $9 $9 $2 $_ +c $1 $9 $9 $2 $` +c $1 $9 $9 $2 ${ +c $1 $9 $9 $2 $| +c $1 $9 $9 $2 $} +c $1 $9 $9 $2 $~ +c $1 $9 $9 $3 $ +c $1 $9 $9 $3 $! +c $1 $9 $9 $3 $" +c $1 $9 $9 $3 $# +c $1 $9 $9 $3 $$ +c $1 $9 $9 $3 $% +c $1 $9 $9 $3 $& +c $1 $9 $9 $3 $' +c $1 $9 $9 $3 $( +c $1 $9 $9 $3 $) +c $1 $9 $9 $3 $* +c $1 $9 $9 $3 $+ +c $1 $9 $9 $3 $, +c $1 $9 $9 $3 $- +c $1 $9 $9 $3 $. +c $1 $9 $9 $3 $/ +c $1 $9 $9 $3 $: +c $1 $9 $9 $3 $; +c $1 $9 $9 $3 $< +c $1 $9 $9 $3 $= +c $1 $9 $9 $3 $> +c $1 $9 $9 $3 $? +c $1 $9 $9 $3 $@ +c $1 $9 $9 $3 $[ +c $1 $9 $9 $3 $\ +c $1 $9 $9 $3 $] +c $1 $9 $9 $3 $^ +c $1 $9 $9 $3 $_ +c $1 $9 $9 $3 $` +c $1 $9 $9 $3 ${ +c $1 $9 $9 $3 $| +c $1 $9 $9 $3 $} +c $1 $9 $9 $3 $~ +c $1 $9 $9 $4 $ +c $1 $9 $9 $4 $! +c $1 $9 $9 $4 $" +c $1 $9 $9 $4 $# +c $1 $9 $9 $4 $$ +c $1 $9 $9 $4 $% +c $1 $9 $9 $4 $& +c $1 $9 $9 $4 $' +c $1 $9 $9 $4 $( +c $1 $9 $9 $4 $) +c $1 $9 $9 $4 $* +c $1 $9 $9 $4 $+ +c $1 $9 $9 $4 $, +c $1 $9 $9 $4 $- +c $1 $9 $9 $4 $. +c $1 $9 $9 $4 $/ +c $1 $9 $9 $4 $: +c $1 $9 $9 $4 $; +c $1 $9 $9 $4 $< +c $1 $9 $9 $4 $= +c $1 $9 $9 $4 $> +c $1 $9 $9 $4 $? +c $1 $9 $9 $4 $@ +c $1 $9 $9 $4 $[ +c $1 $9 $9 $4 $\ +c $1 $9 $9 $4 $] +c $1 $9 $9 $4 $^ +c $1 $9 $9 $4 $_ +c $1 $9 $9 $4 $` +c $1 $9 $9 $4 ${ +c $1 $9 $9 $4 $| +c $1 $9 $9 $4 $} +c $1 $9 $9 $4 $~ +c $1 $9 $9 $5 $ +c $1 $9 $9 $5 $! +c $1 $9 $9 $5 $" +c $1 $9 $9 $5 $# +c $1 $9 $9 $5 $$ +c $1 $9 $9 $5 $% +c $1 $9 $9 $5 $& +c $1 $9 $9 $5 $' +c $1 $9 $9 $5 $( +c $1 $9 $9 $5 $) +c $1 $9 $9 $5 $* +c $1 $9 $9 $5 $+ +c $1 $9 $9 $5 $, +c $1 $9 $9 $5 $- +c $1 $9 $9 $5 $. +c $1 $9 $9 $5 $/ +c $1 $9 $9 $5 $: +c $1 $9 $9 $5 $; +c $1 $9 $9 $5 $< +c $1 $9 $9 $5 $= +c $1 $9 $9 $5 $> +c $1 $9 $9 $5 $? +c $1 $9 $9 $5 $@ +c $1 $9 $9 $5 $[ +c $1 $9 $9 $5 $\ +c $1 $9 $9 $5 $] +c $1 $9 $9 $5 $^ +c $1 $9 $9 $5 $_ +c $1 $9 $9 $5 $` +c $1 $9 $9 $5 ${ +c $1 $9 $9 $5 $| +c $1 $9 $9 $5 $} +c $1 $9 $9 $5 $~ +c $1 $9 $9 $6 $ +c $1 $9 $9 $6 $! +c $1 $9 $9 $6 $" +c $1 $9 $9 $6 $# +c $1 $9 $9 $6 $$ +c $1 $9 $9 $6 $% +c $1 $9 $9 $6 $& +c $1 $9 $9 $6 $' +c $1 $9 $9 $6 $( +c $1 $9 $9 $6 $) +c $1 $9 $9 $6 $* +c $1 $9 $9 $6 $+ +c $1 $9 $9 $6 $, +c $1 $9 $9 $6 $- +c $1 $9 $9 $6 $. +c $1 $9 $9 $6 $/ +c $1 $9 $9 $6 $: +c $1 $9 $9 $6 $; +c $1 $9 $9 $6 $< +c $1 $9 $9 $6 $= +c $1 $9 $9 $6 $> +c $1 $9 $9 $6 $? +c $1 $9 $9 $6 $@ +c $1 $9 $9 $6 $[ +c $1 $9 $9 $6 $\ +c $1 $9 $9 $6 $] +c $1 $9 $9 $6 $^ +c $1 $9 $9 $6 $_ +c $1 $9 $9 $6 $` +c $1 $9 $9 $6 ${ +c $1 $9 $9 $6 $| +c $1 $9 $9 $6 $} +c $1 $9 $9 $6 $~ +c $1 $9 $9 $7 $ +c $1 $9 $9 $7 $! +c $1 $9 $9 $7 $" +c $1 $9 $9 $7 $# +c $1 $9 $9 $7 $$ +c $1 $9 $9 $7 $% +c $1 $9 $9 $7 $& +c $1 $9 $9 $7 $' +c $1 $9 $9 $7 $( +c $1 $9 $9 $7 $) +c $1 $9 $9 $7 $* +c $1 $9 $9 $7 $+ +c $1 $9 $9 $7 $, +c $1 $9 $9 $7 $- +c $1 $9 $9 $7 $. +c $1 $9 $9 $7 $/ +c $1 $9 $9 $7 $: +c $1 $9 $9 $7 $; +c $1 $9 $9 $7 $< +c $1 $9 $9 $7 $= +c $1 $9 $9 $7 $> +c $1 $9 $9 $7 $? +c $1 $9 $9 $7 $@ +c $1 $9 $9 $7 $[ +c $1 $9 $9 $7 $\ +c $1 $9 $9 $7 $] +c $1 $9 $9 $7 $^ +c $1 $9 $9 $7 $_ +c $1 $9 $9 $7 $` +c $1 $9 $9 $7 ${ +c $1 $9 $9 $7 $| +c $1 $9 $9 $7 $} +c $1 $9 $9 $7 $~ +c $1 $9 $9 $8 $ +c $1 $9 $9 $8 $! +c $1 $9 $9 $8 $" +c $1 $9 $9 $8 $# +c $1 $9 $9 $8 $$ +c $1 $9 $9 $8 $% +c $1 $9 $9 $8 $& +c $1 $9 $9 $8 $' +c $1 $9 $9 $8 $( +c $1 $9 $9 $8 $) +c $1 $9 $9 $8 $* +c $1 $9 $9 $8 $+ +c $1 $9 $9 $8 $, +c $1 $9 $9 $8 $- +c $1 $9 $9 $8 $. +c $1 $9 $9 $8 $/ +c $1 $9 $9 $8 $: +c $1 $9 $9 $8 $; +c $1 $9 $9 $8 $< +c $1 $9 $9 $8 $= +c $1 $9 $9 $8 $> +c $1 $9 $9 $8 $? +c $1 $9 $9 $8 $@ +c $1 $9 $9 $8 $[ +c $1 $9 $9 $8 $\ +c $1 $9 $9 $8 $] +c $1 $9 $9 $8 $^ +c $1 $9 $9 $8 $_ +c $1 $9 $9 $8 $` +c $1 $9 $9 $8 ${ +c $1 $9 $9 $8 $| +c $1 $9 $9 $8 $} +c $1 $9 $9 $8 $~ +c $1 $9 $9 $9 $ +c $1 $9 $9 $9 $! +c $1 $9 $9 $9 $" +c $1 $9 $9 $9 $# +c $1 $9 $9 $9 $$ +c $1 $9 $9 $9 $% +c $1 $9 $9 $9 $& +c $1 $9 $9 $9 $' +c $1 $9 $9 $9 $( +c $1 $9 $9 $9 $) +c $1 $9 $9 $9 $* +c $1 $9 $9 $9 $+ +c $1 $9 $9 $9 $, +c $1 $9 $9 $9 $- +c $1 $9 $9 $9 $. +c $1 $9 $9 $9 $/ +c $1 $9 $9 $9 $: +c $1 $9 $9 $9 $; +c $1 $9 $9 $9 $< +c $1 $9 $9 $9 $= +c $1 $9 $9 $9 $> +c $1 $9 $9 $9 $? +c $1 $9 $9 $9 $@ +c $1 $9 $9 $9 $[ +c $1 $9 $9 $9 $\ +c $1 $9 $9 $9 $] +c $1 $9 $9 $9 $^ +c $1 $9 $9 $9 $_ +c $1 $9 $9 $9 $` +c $1 $9 $9 $9 ${ +c $1 $9 $9 $9 $| +c $1 $9 $9 $9 $} +c $1 $9 $9 $9 $~ +c $1 $: +c $1 $; +c $1 $< +c $1 $= +c $1 $> +c $1 $? +c $1 $@ +c $1 $[ +c $1 $\ +c $1 $] +c $1 $^ +c $1 $_ +c $1 $` +c $1 ${ +c $1 $| +c $1 $} +c $1 $~ +c $2 $ +c $2 $! +c $2 $" +c $2 $# +c $2 $$ +c $2 $% +c $2 $& +c $2 $' +c $2 $( +c $2 $) +c $2 $* +c $2 $+ +c $2 $, +c $2 $- +c $2 $. +c $2 $/ +c $2 $0 +c $2 $0 $1 $0 $! +c $2 $0 $1 $0 $$ +c $2 $0 $1 $0 $* +c $2 $0 $1 $0 $@ +c $2 $0 $1 $0 $~ +c $2 $0 $2 $0 $ +c $2 $0 $2 $0 $! +c $2 $0 $2 $0 $" +c $2 $0 $2 $0 $# +c $2 $0 $2 $0 $$ +c $2 $0 $2 $0 $% +c $2 $0 $2 $0 $& +c $2 $0 $2 $0 $' +c $2 $0 $2 $0 $( +c $2 $0 $2 $0 $) +c $2 $0 $2 $0 $* +c $2 $0 $2 $0 $+ +c $2 $0 $2 $0 $, +c $2 $0 $2 $0 $- +c $2 $0 $2 $0 $. +c $2 $0 $2 $0 $/ +c $2 $0 $2 $0 $: +c $2 $0 $2 $0 $; +c $2 $0 $2 $0 $< +c $2 $0 $2 $0 $= +c $2 $0 $2 $0 $> +c $2 $0 $2 $0 $? +c $2 $0 $2 $0 $@ +c $2 $0 $2 $0 $[ +c $2 $0 $2 $0 $\ +c $2 $0 $2 $0 $] +c $2 $0 $2 $0 $^ +c $2 $0 $2 $0 $_ +c $2 $0 $2 $0 $` +c $2 $0 $2 $0 ${ +c $2 $0 $2 $0 $| +c $2 $0 $2 $0 $} +c $2 $0 $2 $0 $~ +c $2 $0 $2 $1 $ +c $2 $0 $2 $1 $! +c $2 $0 $2 $1 $" +c $2 $0 $2 $1 $# +c $2 $0 $2 $1 $$ +c $2 $0 $2 $1 $% +c $2 $0 $2 $1 $& +c $2 $0 $2 $1 $' +c $2 $0 $2 $1 $( +c $2 $0 $2 $1 $) +c $2 $0 $2 $1 $* +c $2 $0 $2 $1 $+ +c $2 $0 $2 $1 $, +c $2 $0 $2 $1 $- +c $2 $0 $2 $1 $. +c $2 $0 $2 $1 $/ +c $2 $0 $2 $1 $: +c $2 $0 $2 $1 $; +c $2 $0 $2 $1 $< +c $2 $0 $2 $1 $= +c $2 $0 $2 $1 $> +c $2 $0 $2 $1 $? +c $2 $0 $2 $1 $@ +c $2 $0 $2 $1 $[ +c $2 $0 $2 $1 $\ +c $2 $0 $2 $1 $] +c $2 $0 $2 $1 $^ +c $2 $0 $2 $1 $_ +c $2 $0 $2 $1 $` +c $2 $0 $2 $1 ${ +c $2 $0 $2 $1 $| +c $2 $0 $2 $1 $} +c $2 $0 $2 $1 $~ +c $2 $0 $2 $2 $ +c $2 $0 $2 $2 $! +c $2 $0 $2 $2 $" +c $2 $0 $2 $2 $# +c $2 $0 $2 $2 $$ +c $2 $0 $2 $2 $% +c $2 $0 $2 $2 $& +c $2 $0 $2 $2 $' +c $2 $0 $2 $2 $( +c $2 $0 $2 $2 $) +c $2 $0 $2 $2 $* +c $2 $0 $2 $2 $+ +c $2 $0 $2 $2 $, +c $2 $0 $2 $2 $- +c $2 $0 $2 $2 $. +c $2 $0 $2 $2 $/ +c $2 $0 $2 $2 $: +c $2 $0 $2 $2 $; +c $2 $0 $2 $2 $< +c $2 $0 $2 $2 $= +c $2 $0 $2 $2 $> +c $2 $0 $2 $2 $? +c $2 $0 $2 $2 $@ +c $2 $0 $2 $2 $[ +c $2 $0 $2 $2 $\ +c $2 $0 $2 $2 $] +c $2 $0 $2 $2 $^ +c $2 $0 $2 $2 $_ +c $2 $0 $2 $2 $` +c $2 $0 $2 $2 ${ +c $2 $0 $2 $2 $| +c $2 $0 $2 $2 $} +c $2 $0 $2 $2 $~ +c $2 $0 $2 $3 $ +c $2 $0 $2 $3 $! +c $2 $0 $2 $3 $" +c $2 $0 $2 $3 $# +c $2 $0 $2 $3 $$ +c $2 $0 $2 $3 $% +c $2 $0 $2 $3 $& +c $2 $0 $2 $3 $' +c $2 $0 $2 $3 $( +c $2 $0 $2 $3 $) +c $2 $0 $2 $3 $* +c $2 $0 $2 $3 $+ +c $2 $0 $2 $3 $, +c $2 $0 $2 $3 $- +c $2 $0 $2 $3 $. +c $2 $0 $2 $3 $/ +c $2 $0 $2 $3 $: +c $2 $0 $2 $3 $; +c $2 $0 $2 $3 $< +c $2 $0 $2 $3 $= +c $2 $0 $2 $3 $> +c $2 $0 $2 $3 $? +c $2 $0 $2 $3 $@ +c $2 $0 $2 $3 $[ +c $2 $0 $2 $3 $\ +c $2 $0 $2 $3 $] +c $2 $0 $2 $3 $^ +c $2 $0 $2 $3 $_ +c $2 $0 $2 $3 $` +c $2 $0 $2 $3 ${ +c $2 $0 $2 $3 $| +c $2 $0 $2 $3 $} +c $2 $0 $2 $3 $~ +c $2 $0 $2 $4 $ +c $2 $0 $2 $4 $! +c $2 $0 $2 $4 $" +c $2 $0 $2 $4 $# +c $2 $0 $2 $4 $$ +c $2 $0 $2 $4 $% +c $2 $0 $2 $4 $& +c $2 $0 $2 $4 $' +c $2 $0 $2 $4 $( +c $2 $0 $2 $4 $) +c $2 $0 $2 $4 $* +c $2 $0 $2 $4 $+ +c $2 $0 $2 $4 $, +c $2 $0 $2 $4 $- +c $2 $0 $2 $4 $. +c $2 $0 $2 $4 $/ +c $2 $0 $2 $4 $: +c $2 $0 $2 $4 $; +c $2 $0 $2 $4 $< +c $2 $0 $2 $4 $= +c $2 $0 $2 $4 $> +c $2 $0 $2 $4 $? +c $2 $0 $2 $4 $@ +c $2 $0 $2 $4 $[ +c $2 $0 $2 $4 $\ +c $2 $0 $2 $4 $] +c $2 $0 $2 $4 $^ +c $2 $0 $2 $4 $_ +c $2 $0 $2 $4 $` +c $2 $0 $2 $4 ${ +c $2 $0 $2 $4 $| +c $2 $0 $2 $4 $} +c $2 $0 $2 $4 $~ +c $2 $0 $2 $5 $ +c $2 $0 $2 $5 $! +c $2 $0 $2 $5 $" +c $2 $0 $2 $5 $# +c $2 $0 $2 $5 $$ +c $2 $0 $2 $5 $% +c $2 $0 $2 $5 $& +c $2 $0 $2 $5 $' +c $2 $0 $2 $5 $( +c $2 $0 $2 $5 $) +c $2 $0 $2 $5 $* +c $2 $0 $2 $5 $+ +c $2 $0 $2 $5 $, +c $2 $0 $2 $5 $- +c $2 $0 $2 $5 $. +c $2 $0 $2 $5 $/ +c $2 $0 $2 $5 $: +c $2 $0 $2 $5 $; +c $2 $0 $2 $5 $< +c $2 $0 $2 $5 $= +c $2 $0 $2 $5 $> +c $2 $0 $2 $5 $? +c $2 $0 $2 $5 $@ +c $2 $0 $2 $5 $[ +c $2 $0 $2 $5 $\ +c $2 $0 $2 $5 $] +c $2 $0 $2 $5 $^ +c $2 $0 $2 $5 $_ +c $2 $0 $2 $5 $` +c $2 $0 $2 $5 ${ +c $2 $0 $2 $5 $| +c $2 $0 $2 $5 $} +c $2 $0 $2 $5 $~ +c $2 $0 $2 $6 $ +c $2 $0 $2 $6 $! +c $2 $0 $2 $6 $" +c $2 $0 $2 $6 $# +c $2 $0 $2 $6 $$ +c $2 $0 $2 $6 $% +c $2 $0 $2 $6 $& +c $2 $0 $2 $6 $' +c $2 $0 $2 $6 $( +c $2 $0 $2 $6 $) +c $2 $0 $2 $6 $* +c $2 $0 $2 $6 $+ +c $2 $0 $2 $6 $, +c $2 $0 $2 $6 $- +c $2 $0 $2 $6 $. +c $2 $0 $2 $6 $/ +c $2 $0 $2 $6 $: +c $2 $0 $2 $6 $; +c $2 $0 $2 $6 $< +c $2 $0 $2 $6 $= +c $2 $0 $2 $6 $> +c $2 $0 $2 $6 $? +c $2 $0 $2 $6 $@ +c $2 $0 $2 $6 $[ +c $2 $0 $2 $6 $\ +c $2 $0 $2 $6 $] +c $2 $0 $2 $6 $^ +c $2 $0 $2 $6 $_ +c $2 $0 $2 $6 $` +c $2 $0 $2 $6 ${ +c $2 $0 $2 $6 $| +c $2 $0 $2 $6 $} +c $2 $0 $2 $6 $~ +c $2 $0 $2 $7 $ +c $2 $0 $2 $7 $! +c $2 $0 $2 $7 $" +c $2 $0 $2 $7 $# +c $2 $0 $2 $7 $$ +c $2 $0 $2 $7 $% +c $2 $0 $2 $7 $& +c $2 $0 $2 $7 $' +c $2 $0 $2 $7 $( +c $2 $0 $2 $7 $) +c $2 $0 $2 $7 $* +c $2 $0 $2 $7 $+ +c $2 $0 $2 $7 $, +c $2 $0 $2 $7 $- +c $2 $0 $2 $7 $. +c $2 $0 $2 $7 $/ +c $2 $0 $2 $7 $: +c $2 $0 $2 $7 $; +c $2 $0 $2 $7 $< +c $2 $0 $2 $7 $= +c $2 $0 $2 $7 $> +c $2 $0 $2 $7 $? +c $2 $0 $2 $7 $@ +c $2 $0 $2 $7 $[ +c $2 $0 $2 $7 $\ +c $2 $0 $2 $7 $] +c $2 $0 $2 $7 $^ +c $2 $0 $2 $7 $_ +c $2 $0 $2 $7 $` +c $2 $0 $2 $7 ${ +c $2 $0 $2 $7 $| +c $2 $0 $2 $7 $} +c $2 $0 $2 $7 $~ +c $2 $0 $2 $8 $ +c $2 $0 $2 $8 $! +c $2 $0 $2 $8 $" +c $2 $0 $2 $8 $# +c $2 $0 $2 $8 $$ +c $2 $0 $2 $8 $% +c $2 $0 $2 $8 $& +c $2 $0 $2 $8 $' +c $2 $0 $2 $8 $( +c $2 $0 $2 $8 $) +c $2 $0 $2 $8 $* +c $2 $0 $2 $8 $+ +c $2 $0 $2 $8 $, +c $2 $0 $2 $8 $- +c $2 $0 $2 $8 $. +c $2 $0 $2 $8 $/ +c $2 $0 $2 $8 $: +c $2 $0 $2 $8 $; +c $2 $0 $2 $8 $< +c $2 $0 $2 $8 $= +c $2 $0 $2 $8 $> +c $2 $0 $2 $8 $? +c $2 $0 $2 $8 $@ +c $2 $0 $2 $8 $[ +c $2 $0 $2 $8 $\ +c $2 $0 $2 $8 $] +c $2 $0 $2 $8 $^ +c $2 $0 $2 $8 $_ +c $2 $0 $2 $8 $` +c $2 $0 $2 $8 ${ +c $2 $0 $2 $8 $| +c $2 $0 $2 $8 $} +c $2 $0 $2 $8 $~ +c $2 $0 $2 $9 $ +c $2 $0 $2 $9 $! +c $2 $0 $2 $9 $" +c $2 $0 $2 $9 $# +c $2 $0 $2 $9 $$ +c $2 $0 $2 $9 $% +c $2 $0 $2 $9 $& +c $2 $0 $2 $9 $' +c $2 $0 $2 $9 $( +c $2 $0 $2 $9 $) +c $2 $0 $2 $9 $* +c $2 $0 $2 $9 $+ +c $2 $0 $2 $9 $, +c $2 $0 $2 $9 $- +c $2 $0 $2 $9 $. +c $2 $0 $2 $9 $/ +c $2 $0 $2 $9 $: +c $2 $0 $2 $9 $; +c $2 $0 $2 $9 $< +c $2 $0 $2 $9 $= +c $2 $0 $2 $9 $> +c $2 $0 $2 $9 $? +c $2 $0 $2 $9 $@ +c $2 $0 $2 $9 $[ +c $2 $0 $2 $9 $\ +c $2 $0 $2 $9 $] +c $2 $0 $2 $9 $^ +c $2 $0 $2 $9 $_ +c $2 $0 $2 $9 $` +c $2 $0 $2 $9 ${ +c $2 $0 $2 $9 $| +c $2 $0 $2 $9 $} +c $2 $0 $2 $9 $~ +c $2 $0 $3 $0 $ +c $2 $0 $3 $0 $! +c $2 $0 $3 $0 $" +c $2 $0 $3 $0 $# +c $2 $0 $3 $0 $$ +c $2 $0 $3 $0 $% +c $2 $0 $3 $0 $& +c $2 $0 $3 $0 $' +c $2 $0 $3 $0 $( +c $2 $0 $3 $0 $) +c $2 $0 $3 $0 $* +c $2 $0 $3 $0 $+ +c $2 $0 $3 $0 $, +c $2 $0 $3 $0 $- +c $2 $0 $3 $0 $. +c $2 $0 $3 $0 $/ +c $2 $0 $3 $0 $: +c $2 $0 $3 $0 $; +c $2 $0 $3 $0 $< +c $2 $0 $3 $0 $= +c $2 $0 $3 $0 $> +c $2 $0 $3 $0 $? +c $2 $0 $3 $0 $@ +c $2 $0 $3 $0 $[ +c $2 $0 $3 $0 $\ +c $2 $0 $3 $0 $] +c $2 $0 $3 $0 $^ +c $2 $0 $3 $0 $_ +c $2 $0 $3 $0 $` +c $2 $0 $3 $0 ${ +c $2 $0 $3 $0 $| +c $2 $0 $3 $0 $} +c $2 $0 $3 $0 $~ +c $2 $0 $3 $1 $ +c $2 $0 $3 $1 $! +c $2 $0 $3 $1 $" +c $2 $0 $3 $1 $# +c $2 $0 $3 $1 $$ +c $2 $0 $3 $1 $% +c $2 $0 $3 $1 $& +c $2 $0 $3 $1 $' +c $2 $0 $3 $1 $( +c $2 $0 $3 $1 $) +c $2 $0 $3 $1 $* +c $2 $0 $3 $1 $+ +c $2 $0 $3 $1 $, +c $2 $0 $3 $1 $- +c $2 $0 $3 $1 $. +c $2 $0 $3 $1 $/ +c $2 $0 $3 $1 $: +c $2 $0 $3 $1 $; +c $2 $0 $3 $1 $< +c $2 $0 $3 $1 $= +c $2 $0 $3 $1 $> +c $2 $0 $3 $1 $? +c $2 $0 $3 $1 $@ +c $2 $0 $3 $1 $[ +c $2 $0 $3 $1 $\ +c $2 $0 $3 $1 $] +c $2 $0 $3 $1 $^ +c $2 $0 $3 $1 $_ +c $2 $0 $3 $1 $` +c $2 $0 $3 $1 ${ +c $2 $0 $3 $1 $| +c $2 $0 $3 $1 $} +c $2 $0 $3 $1 $~ +c $2 $0 $3 $2 $ +c $2 $0 $3 $2 $! +c $2 $0 $3 $2 $" +c $2 $0 $3 $2 $# +c $2 $0 $3 $2 $$ +c $2 $0 $3 $2 $% +c $2 $0 $3 $2 $& +c $2 $0 $3 $2 $' +c $2 $0 $3 $2 $( +c $2 $0 $3 $2 $) +c $2 $0 $3 $2 $* +c $2 $0 $3 $2 $+ +c $2 $0 $3 $2 $, +c $2 $0 $3 $2 $- +c $2 $0 $3 $2 $. +c $2 $0 $3 $2 $/ +c $2 $0 $3 $2 $: +c $2 $0 $3 $2 $; +c $2 $0 $3 $2 $< +c $2 $0 $3 $2 $= +c $2 $0 $3 $2 $> +c $2 $0 $3 $2 $? +c $2 $0 $3 $2 $@ +c $2 $0 $3 $2 $[ +c $2 $0 $3 $2 $\ +c $2 $0 $3 $2 $] +c $2 $0 $3 $2 $^ +c $2 $0 $3 $2 $_ +c $2 $0 $3 $2 $` +c $2 $0 $3 $2 ${ +c $2 $0 $3 $2 $| +c $2 $0 $3 $2 $} +c $2 $0 $3 $2 $~ +c $2 $0 $3 $3 $ +c $2 $0 $3 $3 $! +c $2 $0 $3 $3 $" +c $2 $0 $3 $3 $# +c $2 $0 $3 $3 $$ +c $2 $0 $3 $3 $% +c $2 $0 $3 $3 $& +c $2 $0 $3 $3 $' +c $2 $0 $3 $3 $( +c $2 $0 $3 $3 $) +c $2 $0 $3 $3 $* +c $2 $0 $3 $3 $+ +c $2 $0 $3 $3 $, +c $2 $0 $3 $3 $- +c $2 $0 $3 $3 $. +c $2 $0 $3 $3 $/ +c $2 $0 $3 $3 $: +c $2 $0 $3 $3 $; +c $2 $0 $3 $3 $< +c $2 $0 $3 $3 $= +c $2 $0 $3 $3 $> +c $2 $0 $3 $3 $? +c $2 $0 $3 $3 $@ +c $2 $0 $3 $3 $[ +c $2 $0 $3 $3 $\ +c $2 $0 $3 $3 $] +c $2 $0 $3 $3 $^ +c $2 $0 $3 $3 $_ +c $2 $0 $3 $3 $` +c $2 $0 $3 $3 ${ +c $2 $0 $3 $3 $| +c $2 $0 $3 $3 $} +c $2 $0 $3 $3 $~ +c $2 $0 $3 $4 $ +c $2 $0 $3 $4 $! +c $2 $0 $3 $4 $" +c $2 $0 $3 $4 $# +c $2 $0 $3 $4 $$ +c $2 $0 $3 $4 $% +c $2 $0 $3 $4 $& +c $2 $0 $3 $4 $' +c $2 $0 $3 $4 $( +c $2 $0 $3 $4 $) +c $2 $0 $3 $4 $* +c $2 $0 $3 $4 $+ +c $2 $0 $3 $4 $, +c $2 $0 $3 $4 $- +c $2 $0 $3 $4 $. +c $2 $0 $3 $4 $/ +c $2 $0 $3 $4 $: +c $2 $0 $3 $4 $; +c $2 $0 $3 $4 $< +c $2 $0 $3 $4 $= +c $2 $0 $3 $4 $> +c $2 $0 $3 $4 $? +c $2 $0 $3 $4 $@ +c $2 $0 $3 $4 $[ +c $2 $0 $3 $4 $\ +c $2 $0 $3 $4 $] +c $2 $0 $3 $4 $^ +c $2 $0 $3 $4 $_ +c $2 $0 $3 $4 $` +c $2 $0 $3 $4 ${ +c $2 $0 $3 $4 $| +c $2 $0 $3 $4 $} +c $2 $0 $3 $4 $~ +c $2 $0 $3 $5 $ +c $2 $0 $3 $5 $! +c $2 $0 $3 $5 $" +c $2 $0 $3 $5 $# +c $2 $0 $3 $5 $$ +c $2 $0 $3 $5 $% +c $2 $0 $3 $5 $& +c $2 $0 $3 $5 $' +c $2 $0 $3 $5 $( +c $2 $0 $3 $5 $) +c $2 $0 $3 $5 $* +c $2 $0 $3 $5 $+ +c $2 $0 $3 $5 $, +c $2 $0 $3 $5 $- +c $2 $0 $3 $5 $. +c $2 $0 $3 $5 $/ +c $2 $0 $3 $5 $: +c $2 $0 $3 $5 $; +c $2 $0 $3 $5 $< +c $2 $0 $3 $5 $= +c $2 $0 $3 $5 $> +c $2 $0 $3 $5 $? +c $2 $0 $3 $5 $@ +c $2 $0 $3 $5 $[ +c $2 $0 $3 $5 $\ +c $2 $0 $3 $5 $] +c $2 $0 $3 $5 $^ +c $2 $0 $3 $5 $_ +c $2 $0 $3 $5 $` +c $2 $0 $3 $5 ${ +c $2 $0 $3 $5 $| +c $2 $0 $3 $5 $} +c $2 $0 $3 $5 $~ +c $2 $0 $3 $6 $ +c $2 $0 $3 $6 $! +c $2 $0 $3 $6 $" +c $2 $0 $3 $6 $# +c $2 $0 $3 $6 $$ +c $2 $0 $3 $6 $% +c $2 $0 $3 $6 $& +c $2 $0 $3 $6 $' +c $2 $0 $3 $6 $( +c $2 $0 $3 $6 $) +c $2 $0 $3 $6 $* +c $2 $0 $3 $6 $+ +c $2 $0 $3 $6 $, +c $2 $0 $3 $6 $- +c $2 $0 $3 $6 $. +c $2 $0 $3 $6 $/ +c $2 $0 $3 $6 $: +c $2 $0 $3 $6 $; +c $2 $0 $3 $6 $< +c $2 $0 $3 $6 $= +c $2 $0 $3 $6 $> +c $2 $0 $3 $6 $? +c $2 $0 $3 $6 $@ +c $2 $0 $3 $6 $[ +c $2 $0 $3 $6 $\ +c $2 $0 $3 $6 $] +c $2 $0 $3 $6 $^ +c $2 $0 $3 $6 $_ +c $2 $0 $3 $6 $` +c $2 $0 $3 $6 ${ +c $2 $0 $3 $6 $| +c $2 $0 $3 $6 $} +c $2 $0 $3 $6 $~ +c $2 $0 $3 $7 $ +c $2 $0 $3 $7 $! +c $2 $0 $3 $7 $" +c $2 $0 $3 $7 $# +c $2 $0 $3 $7 $$ +c $2 $0 $3 $7 $% +c $2 $0 $3 $7 $& +c $2 $0 $3 $7 $' +c $2 $0 $3 $7 $( +c $2 $0 $3 $7 $) +c $2 $0 $3 $7 $* +c $2 $0 $3 $7 $+ +c $2 $0 $3 $7 $, +c $2 $0 $3 $7 $- +c $2 $0 $3 $7 $. +c $2 $0 $3 $7 $/ +c $2 $0 $3 $7 $: +c $2 $0 $3 $7 $; +c $2 $0 $3 $7 $< +c $2 $0 $3 $7 $= +c $2 $0 $3 $7 $> +c $2 $0 $3 $7 $? +c $2 $0 $3 $7 $@ +c $2 $0 $3 $7 $[ +c $2 $0 $3 $7 $\ +c $2 $0 $3 $7 $] +c $2 $0 $3 $7 $^ +c $2 $0 $3 $7 $_ +c $2 $0 $3 $7 $` +c $2 $0 $3 $7 ${ +c $2 $0 $3 $7 $| +c $2 $0 $3 $7 $} +c $2 $0 $3 $7 $~ +c $2 $0 $3 $8 $ +c $2 $0 $3 $8 $! +c $2 $0 $3 $8 $" +c $2 $0 $3 $8 $# +c $2 $0 $3 $8 $$ +c $2 $0 $3 $8 $% +c $2 $0 $3 $8 $& +c $2 $0 $3 $8 $' +c $2 $0 $3 $8 $( +c $2 $0 $3 $8 $) +c $2 $0 $3 $8 $* +c $2 $0 $3 $8 $+ +c $2 $0 $3 $8 $, +c $2 $0 $3 $8 $- +c $2 $0 $3 $8 $. +c $2 $0 $3 $8 $/ +c $2 $0 $3 $8 $: +c $2 $0 $3 $8 $; +c $2 $0 $3 $8 $< +c $2 $0 $3 $8 $= +c $2 $0 $3 $8 $> +c $2 $0 $3 $8 $? +c $2 $0 $3 $8 $@ +c $2 $0 $3 $8 $[ +c $2 $0 $3 $8 $\ +c $2 $0 $3 $8 $] +c $2 $0 $3 $8 $^ +c $2 $0 $3 $8 $_ +c $2 $0 $3 $8 $` +c $2 $0 $3 $8 ${ +c $2 $0 $3 $8 $| +c $2 $0 $3 $8 $} +c $2 $0 $3 $8 $~ +c $2 $0 $3 $9 $ +c $2 $0 $3 $9 $! +c $2 $0 $3 $9 $" +c $2 $0 $3 $9 $# +c $2 $0 $3 $9 $$ +c $2 $0 $3 $9 $% +c $2 $0 $3 $9 $& +c $2 $0 $3 $9 $' +c $2 $0 $3 $9 $( +c $2 $0 $3 $9 $) +c $2 $0 $3 $9 $* +c $2 $0 $3 $9 $+ +c $2 $0 $3 $9 $, +c $2 $0 $3 $9 $- +c $2 $0 $3 $9 $. +c $2 $0 $3 $9 $/ +c $2 $0 $3 $9 $: +c $2 $0 $3 $9 $; +c $2 $0 $3 $9 $< +c $2 $0 $3 $9 $= +c $2 $0 $3 $9 $> +c $2 $0 $3 $9 $? +c $2 $0 $3 $9 $@ +c $2 $0 $3 $9 $[ +c $2 $0 $3 $9 $\ +c $2 $0 $3 $9 $] +c $2 $0 $3 $9 $^ +c $2 $0 $3 $9 $_ +c $2 $0 $3 $9 $` +c $2 $0 $3 $9 ${ +c $2 $0 $3 $9 $| +c $2 $0 $3 $9 $} +c $2 $0 $3 $9 $~ +c $2 $0 $4 $0 $ +c $2 $0 $4 $0 $! +c $2 $0 $4 $0 $" +c $2 $0 $4 $0 $# +c $2 $0 $4 $0 $$ +c $2 $0 $4 $0 $% +c $2 $0 $4 $0 $& +c $2 $0 $4 $0 $' +c $2 $0 $4 $0 $( +c $2 $0 $4 $0 $) +c $2 $0 $4 $0 $* +c $2 $0 $4 $0 $+ +c $2 $0 $4 $0 $, +c $2 $0 $4 $0 $- +c $2 $0 $4 $0 $. +c $2 $0 $4 $0 $/ +c $2 $0 $4 $0 $: +c $2 $0 $4 $0 $; +c $2 $0 $4 $0 $< +c $2 $0 $4 $0 $= +c $2 $0 $4 $0 $> +c $2 $0 $4 $0 $? +c $2 $0 $4 $0 $@ +c $2 $0 $4 $0 $[ +c $2 $0 $4 $0 $\ +c $2 $0 $4 $0 $] +c $2 $0 $4 $0 $^ +c $2 $0 $4 $0 $_ +c $2 $0 $4 $0 $` +c $2 $0 $4 $0 ${ +c $2 $0 $4 $0 $| +c $2 $0 $4 $0 $} +c $2 $0 $4 $0 $~ +c $2 $0 $4 $1 $ +c $2 $0 $4 $1 $! +c $2 $0 $4 $1 $" +c $2 $0 $4 $1 $# +c $2 $0 $4 $1 $$ +c $2 $0 $4 $1 $% +c $2 $0 $4 $1 $& +c $2 $0 $4 $1 $' +c $2 $0 $4 $1 $( +c $2 $0 $4 $1 $) +c $2 $0 $4 $1 $* +c $2 $0 $4 $1 $+ +c $2 $0 $4 $1 $, +c $2 $0 $4 $1 $- +c $2 $0 $4 $1 $. +c $2 $0 $4 $1 $/ +c $2 $0 $4 $1 $: +c $2 $0 $4 $1 $; +c $2 $0 $4 $1 $< +c $2 $0 $4 $1 $= +c $2 $0 $4 $1 $> +c $2 $0 $4 $1 $? +c $2 $0 $4 $1 $@ +c $2 $0 $4 $1 $[ +c $2 $0 $4 $1 $\ +c $2 $0 $4 $1 $] +c $2 $0 $4 $1 $^ +c $2 $0 $4 $1 $_ +c $2 $0 $4 $1 $` +c $2 $0 $4 $1 ${ +c $2 $0 $4 $1 $| +c $2 $0 $4 $1 $} +c $2 $0 $4 $1 $~ +c $2 $0 $4 $2 $ +c $2 $0 $4 $2 $! +c $2 $0 $4 $2 $" +c $2 $0 $4 $2 $# +c $2 $0 $4 $2 $$ +c $2 $0 $4 $2 $% +c $2 $0 $4 $2 $& +c $2 $0 $4 $2 $' +c $2 $0 $4 $2 $( +c $2 $0 $4 $2 $) +c $2 $0 $4 $2 $* +c $2 $0 $4 $2 $+ +c $2 $0 $4 $2 $, +c $2 $0 $4 $2 $- +c $2 $0 $4 $2 $. +c $2 $0 $4 $2 $/ +c $2 $0 $4 $2 $: +c $2 $0 $4 $2 $; +c $2 $0 $4 $2 $< +c $2 $0 $4 $2 $= +c $2 $0 $4 $2 $> +c $2 $0 $4 $2 $? +c $2 $0 $4 $2 $@ +c $2 $0 $4 $2 $[ +c $2 $0 $4 $2 $\ +c $2 $0 $4 $2 $] +c $2 $0 $4 $2 $^ +c $2 $0 $4 $2 $_ +c $2 $0 $4 $2 $` +c $2 $0 $4 $2 ${ +c $2 $0 $4 $2 $| +c $2 $0 $4 $2 $} +c $2 $0 $4 $2 $~ +c $2 $0 $4 $3 $ +c $2 $0 $4 $3 $! +c $2 $0 $4 $3 $" +c $2 $0 $4 $3 $# +c $2 $0 $4 $3 $$ +c $2 $0 $4 $3 $% +c $2 $0 $4 $3 $& +c $2 $0 $4 $3 $' +c $2 $0 $4 $3 $( +c $2 $0 $4 $3 $) +c $2 $0 $4 $3 $* +c $2 $0 $4 $3 $+ +c $2 $0 $4 $3 $, +c $2 $0 $4 $3 $- +c $2 $0 $4 $3 $. +c $2 $0 $4 $3 $/ +c $2 $0 $4 $3 $: +c $2 $0 $4 $3 $; +c $2 $0 $4 $3 $< +c $2 $0 $4 $3 $= +c $2 $0 $4 $3 $> +c $2 $0 $4 $3 $? +c $2 $0 $4 $3 $@ +c $2 $0 $4 $3 $[ +c $2 $0 $4 $3 $\ +c $2 $0 $4 $3 $] +c $2 $0 $4 $3 $^ +c $2 $0 $4 $3 $_ +c $2 $0 $4 $3 $` +c $2 $0 $4 $3 ${ +c $2 $0 $4 $3 $| +c $2 $0 $4 $3 $} +c $2 $0 $4 $3 $~ +c $2 $0 $4 $4 $ +c $2 $0 $4 $4 $! +c $2 $0 $4 $4 $" +c $2 $0 $4 $4 $# +c $2 $0 $4 $4 $$ +c $2 $0 $4 $4 $% +c $2 $0 $4 $4 $& +c $2 $0 $4 $4 $' +c $2 $0 $4 $4 $( +c $2 $0 $4 $4 $) +c $2 $0 $4 $4 $* +c $2 $0 $4 $4 $+ +c $2 $0 $4 $4 $, +c $2 $0 $4 $4 $- +c $2 $0 $4 $4 $. +c $2 $0 $4 $4 $/ +c $2 $0 $4 $4 $: +c $2 $0 $4 $4 $; +c $2 $0 $4 $4 $< +c $2 $0 $4 $4 $= +c $2 $0 $4 $4 $> +c $2 $0 $4 $4 $? +c $2 $0 $4 $4 $@ +c $2 $0 $4 $4 $[ +c $2 $0 $4 $4 $\ +c $2 $0 $4 $4 $] +c $2 $0 $4 $4 $^ +c $2 $0 $4 $4 $_ +c $2 $0 $4 $4 $` +c $2 $0 $4 $4 ${ +c $2 $0 $4 $4 $| +c $2 $0 $4 $4 $} +c $2 $0 $4 $4 $~ +c $2 $0 $4 $5 $ +c $2 $0 $4 $5 $! +c $2 $0 $4 $5 $" +c $2 $0 $4 $5 $# +c $2 $0 $4 $5 $$ +c $2 $0 $4 $5 $% +c $2 $0 $4 $5 $& +c $2 $0 $4 $5 $' +c $2 $0 $4 $5 $( +c $2 $0 $4 $5 $) +c $2 $0 $4 $5 $* +c $2 $0 $4 $5 $+ +c $2 $0 $4 $5 $, +c $2 $0 $4 $5 $- +c $2 $0 $4 $5 $. +c $2 $0 $4 $5 $/ +c $2 $0 $4 $5 $: +c $2 $0 $4 $5 $; +c $2 $0 $4 $5 $< +c $2 $0 $4 $5 $= +c $2 $0 $4 $5 $> +c $2 $0 $4 $5 $? +c $2 $0 $4 $5 $@ +c $2 $0 $4 $5 $[ +c $2 $0 $4 $5 $\ +c $2 $0 $4 $5 $] +c $2 $0 $4 $5 $^ +c $2 $0 $4 $5 $_ +c $2 $0 $4 $5 $` +c $2 $0 $4 $5 ${ +c $2 $0 $4 $5 $| +c $2 $0 $4 $5 $} +c $2 $0 $4 $5 $~ +c $2 $0 $4 $6 $ +c $2 $0 $4 $6 $! +c $2 $0 $4 $6 $" +c $2 $0 $4 $6 $# +c $2 $0 $4 $6 $$ +c $2 $0 $4 $6 $% +c $2 $0 $4 $6 $& +c $2 $0 $4 $6 $' +c $2 $0 $4 $6 $( +c $2 $0 $4 $6 $) +c $2 $0 $4 $6 $* +c $2 $0 $4 $6 $+ +c $2 $0 $4 $6 $, +c $2 $0 $4 $6 $- +c $2 $0 $4 $6 $. +c $2 $0 $4 $6 $/ +c $2 $0 $4 $6 $: +c $2 $0 $4 $6 $; +c $2 $0 $4 $6 $< +c $2 $0 $4 $6 $= +c $2 $0 $4 $6 $> +c $2 $0 $4 $6 $? +c $2 $0 $4 $6 $@ +c $2 $0 $4 $6 $[ +c $2 $0 $4 $6 $\ +c $2 $0 $4 $6 $] +c $2 $0 $4 $6 $^ +c $2 $0 $4 $6 $_ +c $2 $0 $4 $6 $` +c $2 $0 $4 $6 ${ +c $2 $0 $4 $6 $| +c $2 $0 $4 $6 $} +c $2 $0 $4 $6 $~ +c $2 $0 $4 $7 $ +c $2 $0 $4 $7 $! +c $2 $0 $4 $7 $" +c $2 $0 $4 $7 $# +c $2 $0 $4 $7 $$ +c $2 $0 $4 $7 $% +c $2 $0 $4 $7 $& +c $2 $0 $4 $7 $' +c $2 $0 $4 $7 $( +c $2 $0 $4 $7 $) +c $2 $0 $4 $7 $* +c $2 $0 $4 $7 $+ +c $2 $0 $4 $7 $, +c $2 $0 $4 $7 $- +c $2 $0 $4 $7 $. +c $2 $0 $4 $7 $/ +c $2 $0 $4 $7 $: +c $2 $0 $4 $7 $; +c $2 $0 $4 $7 $< +c $2 $0 $4 $7 $= +c $2 $0 $4 $7 $> +c $2 $0 $4 $7 $? +c $2 $0 $4 $7 $@ +c $2 $0 $4 $7 $[ +c $2 $0 $4 $7 $\ +c $2 $0 $4 $7 $] +c $2 $0 $4 $7 $^ +c $2 $0 $4 $7 $_ +c $2 $0 $4 $7 $` +c $2 $0 $4 $7 ${ +c $2 $0 $4 $7 $| +c $2 $0 $4 $7 $} +c $2 $0 $4 $7 $~ +c $2 $0 $4 $8 $ +c $2 $0 $4 $8 $! +c $2 $0 $4 $8 $" +c $2 $0 $4 $8 $# +c $2 $0 $4 $8 $$ +c $2 $0 $4 $8 $% +c $2 $0 $4 $8 $& +c $2 $0 $4 $8 $' +c $2 $0 $4 $8 $( +c $2 $0 $4 $8 $) +c $2 $0 $4 $8 $* +c $2 $0 $4 $8 $+ +c $2 $0 $4 $8 $, +c $2 $0 $4 $8 $- +c $2 $0 $4 $8 $. +c $2 $0 $4 $8 $/ +c $2 $0 $4 $8 $: +c $2 $0 $4 $8 $; +c $2 $0 $4 $8 $< +c $2 $0 $4 $8 $= +c $2 $0 $4 $8 $> +c $2 $0 $4 $8 $? +c $2 $0 $4 $8 $@ +c $2 $0 $4 $8 $[ +c $2 $0 $4 $8 $\ +c $2 $0 $4 $8 $] +c $2 $0 $4 $8 $^ +c $2 $0 $4 $8 $_ +c $2 $0 $4 $8 $` +c $2 $0 $4 $8 ${ +c $2 $0 $4 $8 $| +c $2 $0 $4 $8 $} +c $2 $0 $4 $8 $~ +c $2 $0 $4 $9 $ +c $2 $0 $4 $9 $! +c $2 $0 $4 $9 $" +c $2 $0 $4 $9 $# +c $2 $0 $4 $9 $$ +c $2 $0 $4 $9 $% +c $2 $0 $4 $9 $& +c $2 $0 $4 $9 $' +c $2 $0 $4 $9 $( +c $2 $0 $4 $9 $) +c $2 $0 $4 $9 $* +c $2 $0 $4 $9 $+ +c $2 $0 $4 $9 $, +c $2 $0 $4 $9 $- +c $2 $0 $4 $9 $. +c $2 $0 $4 $9 $/ +c $2 $0 $4 $9 $: +c $2 $0 $4 $9 $; +c $2 $0 $4 $9 $< +c $2 $0 $4 $9 $= +c $2 $0 $4 $9 $> +c $2 $0 $4 $9 $? +c $2 $0 $4 $9 $@ +c $2 $0 $4 $9 $[ +c $2 $0 $4 $9 $\ +c $2 $0 $4 $9 $] +c $2 $0 $4 $9 $^ +c $2 $0 $4 $9 $_ +c $2 $0 $4 $9 $` +c $2 $0 $4 $9 ${ +c $2 $0 $4 $9 $| +c $2 $0 $4 $9 $} +c $2 $0 $4 $9 $~ +c $2 $1 +c $2 $4 +c $2 $5 +c $2 $7 +c $2 $8 +c $2 $9 +c $2 $: +c $2 $; +c $2 $< +c $2 $= +c $2 $> +c $2 $? +c $2 $@ +c $2 $[ +c $2 $\ +c $2 $] +c $2 $^ +c $2 $_ +c $2 $` +c $2 ${ +c $2 $| +c $2 $} +c $2 $~ +c $3 +c $3 $ +c $3 $! +c $3 $" +c $3 $# +c $3 $$ +c $3 $% +c $3 $& +c $3 $' +c $3 $( +c $3 $) +c $3 $* +c $3 $+ +c $3 $, +c $3 $- +c $3 $. +c $3 $/ +c $3 $0 +c $3 $1 +c $3 $2 +c $3 $3 +c $3 $4 +c $3 $5 +c $3 $6 +c $3 $7 +c $3 $8 +c $3 $9 +c $3 $: +c $3 $; +c $3 $< +c $3 $= +c $3 $> +c $3 $? +c $3 $@ +c $3 $[ +c $3 $\ +c $3 $] +c $3 $^ +c $3 $_ +c $3 $` +c $3 ${ +c $3 $| +c $3 $} +c $3 $~ +c $4 $ +c $4 $! +c $4 $" +c $4 $# +c $4 $$ +c $4 $% +c $4 $& +c $4 $' +c $4 $( +c $4 $) +c $4 $* +c $4 $+ +c $4 $, +c $4 $- +c $4 $. +c $4 $/ +c $4 $0 +c $4 $1 +c $4 $2 +c $4 $3 +c $4 $4 +c $4 $5 +c $4 $6 +c $4 $7 +c $4 $8 +c $4 $9 +c $4 $: +c $4 $; +c $4 $< +c $4 $= +c $4 $> +c $4 $? +c $4 $@ +c $4 $[ +c $4 $\ +c $4 $] +c $4 $^ +c $4 $_ +c $4 $` +c $4 ${ +c $4 $| +c $4 $} +c $4 $~ +c $5 $ +c $5 $! +c $5 $" +c $5 $# +c $5 $$ +c $5 $% +c $5 $& +c $5 $' +c $5 $( +c $5 $) +c $5 $* +c $5 $+ +c $5 $, +c $5 $- +c $5 $. +c $5 $/ +c $5 $0 +c $5 $1 +c $5 $2 +c $5 $3 +c $5 $4 +c $5 $5 +c $5 $6 +c $5 $7 +c $5 $8 +c $5 $9 +c $5 $: +c $5 $; +c $5 $< +c $5 $= +c $5 $> +c $5 $? +c $5 $@ +c $5 $[ +c $5 $\ +c $5 $] +c $5 $^ +c $5 $_ +c $5 $` +c $5 ${ +c $5 $| +c $5 $} +c $5 $~ +c $6 +c $6 $ +c $6 $! +c $6 $" +c $6 $# +c $6 $$ +c $6 $% +c $6 $& +c $6 $' +c $6 $( +c $6 $) +c $6 $* +c $6 $+ +c $6 $, +c $6 $- +c $6 $. +c $6 $/ +c $6 $0 +c $6 $1 +c $6 $2 +c $6 $3 +c $6 $4 +c $6 $5 +c $6 $6 +c $6 $7 +c $6 $8 +c $6 $9 +c $6 $: +c $6 $; +c $6 $< +c $6 $= +c $6 $> +c $6 $? +c $6 $@ +c $6 $[ +c $6 $\ +c $6 $] +c $6 $^ +c $6 $_ +c $6 $` +c $6 ${ +c $6 $| +c $6 $} +c $6 $~ +c $7 $ +c $7 $! +c $7 $" +c $7 $# +c $7 $$ +c $7 $% +c $7 $& +c $7 $' +c $7 $( +c $7 $) +c $7 $* +c $7 $+ +c $7 $, +c $7 $- +c $7 $. +c $7 $/ +c $7 $0 +c $7 $1 +c $7 $2 +c $7 $3 +c $7 $4 +c $7 $5 +c $7 $6 +c $7 $7 +c $7 $8 +c $7 $9 +c $7 $: +c $7 $; +c $7 $< +c $7 $= +c $7 $> +c $7 $? +c $7 $@ +c $7 $[ +c $7 $\ +c $7 $] +c $7 $^ +c $7 $_ +c $7 $` +c $7 ${ +c $7 $| +c $7 $} +c $7 $~ +c $8 $ +c $8 $! +c $8 $" +c $8 $# +c $8 $$ +c $8 $% +c $8 $& +c $8 $' +c $8 $( +c $8 $) +c $8 $* +c $8 $+ +c $8 $, +c $8 $- +c $8 $. +c $8 $/ +c $8 $0 +c $8 $1 +c $8 $2 +c $8 $3 +c $8 $4 +c $8 $5 +c $8 $6 +c $8 $7 +c $8 $8 +c $8 $9 +c $8 $: +c $8 $; +c $8 $< +c $8 $= +c $8 $> +c $8 $? +c $8 $@ +c $8 $[ +c $8 $\ +c $8 $] +c $8 $^ +c $8 $_ +c $8 $` +c $8 ${ +c $8 $| +c $8 $} +c $8 $~ +c $9 +c $9 $ +c $9 $! +c $9 $" +c $9 $# +c $9 $$ +c $9 $% +c $9 $& +c $9 $' +c $9 $( +c $9 $) +c $9 $* +c $9 $+ +c $9 $, +c $9 $- +c $9 $. +c $9 $/ +c $9 $0 +c $9 $1 +c $9 $2 +c $9 $3 +c $9 $4 +c $9 $5 +c $9 $6 +c $9 $8 +c $9 $: +c $9 $; +c $9 $< +c $9 $= +c $9 $> +c $9 $? +c $9 $@ +c $9 $[ +c $9 $\ +c $9 $] +c $9 $^ +c $9 $_ +c $9 $` +c $9 ${ +c $9 $| +c $9 $} +c $9 $~ +c $: +c $: $0 +c $: $1 +c $: $2 +c $: $3 +c $: $4 +c $: $5 +c $: $6 +c $: $7 +c $: $8 +c $: $9 +c $; +c $; $0 +c $; $1 +c $; $2 +c $; $3 +c $; $4 +c $; $5 +c $; $6 +c $; $7 +c $; $8 +c $; $9 +c $< +c $< $0 +c $< $1 +c $< $2 +c $< $3 +c $< $4 +c $< $5 +c $< $6 +c $< $7 +c $< $8 +c $< $9 +c $= +c $= $0 +c $= $1 +c $= $2 +c $= $3 +c $= $4 +c $= $5 +c $= $6 +c $= $7 +c $= $8 +c $= $9 +c $> +c $> $0 +c $> $1 +c $> $2 +c $> $3 +c $> $4 +c $> $5 +c $> $6 +c $> $7 +c $> $8 +c $> $9 +c $? +c $? $0 +c $? $1 +c $? $2 +c $? $3 +c $? $4 +c $? $5 +c $? $6 +c $? $7 +c $? $8 +c $? $9 +c $@ +c $@ $0 +c $@ $1 +c $@ $2 +c $@ $3 +c $@ $4 +c $@ $5 +c $@ $6 +c $@ $7 +c $@ $8 +c $@ $9 +c $@ $a $m $e $l $e $. $c $o $m +c $@ $a $o $l $. $c $o $m +c $@ $c $o $m $c $a $s $t $. $n $e $t +c $@ $c $o $x $. $n $e $t +c $@ $f $a $s $t $m $a $i $l $. $f $m +c $@ $g $a $w $a $b $. $c $o $m +c $@ $g $m $a $i $l $. $c $o $m +c $@ $g $m $x $. $c $o $m +c $@ $g $m $x $. $u $s +c $@ $h $o $t $m $a $i $l $. $c $o $m +c $@ $i $n $b $o $x $. $r $u +c $@ $l $i $v $e $. $c $o $. $u $k +c $@ $l $i $v $e $. $c $o $m +c $@ $m $a $i $l $. $c $o $m +c $@ $m $a $i $l $. $r $u +c $@ $m $s $n $. $c $o $m +c $@ $v $e $r $i $z $o $n $. $n $e $t +c $@ $w $p $. $p $l +c $@ $y $a $h $o $o $. $c $a +c $@ $y $a $h $o $o $. $c $o $. $i $n +c $@ $y $a $h $o $o $. $c $o $. $u $k +c $@ $y $a $h $o $o $. $c $o $m +c $@ $y $m $a $i $l $. $c $o $m +c $@ $z $o $h $o $. $c $o $m +c $S +c $[ +c $[ $0 +c $[ $1 +c $[ $2 +c $[ $3 +c $[ $4 +c $[ $5 +c $[ $6 +c $[ $7 +c $[ $8 +c $[ $9 +c $\ +c $\ $0 +c $\ $1 +c $\ $2 +c $\ $3 +c $\ $4 +c $\ $5 +c $\ $6 +c $\ $7 +c $\ $8 +c $\ $9 +c $] +c $] $0 +c $] $1 +c $] $2 +c $] $3 +c $] $4 +c $] $5 +c $] $6 +c $] $7 +c $] $8 +c $] $9 +c $^ +c $^ $0 +c $^ $1 +c $^ $2 +c $^ $3 +c $^ $4 +c $^ $5 +c $^ $6 +c $^ $7 +c $^ $8 +c $^ $9 +c $_ +c $_ $0 +c $_ $1 +c $_ $2 +c $_ $3 +c $_ $4 +c $_ $5 +c $_ $6 +c $_ $7 +c $_ $8 +c $_ $9 +c $` +c $` $0 +c $` $1 +c $` $2 +c $` $3 +c $` $4 +c $` $5 +c $` $6 +c $` $7 +c $` $8 +c $` $9 +c $a +c $a $b $l $e +c $a $c $l $e +c $a $g $e +c $a $l +c $a $l $l $y +c $a $m +c $a $n +c $a $n $a +c $a $n $c $e +c $a $n $d +c $a $n $e +c $a $n $t +c $a $r $y +c $a $s $e +c $a $t $i $o $n +c $a $t $i $v $e +c $a $u $x +c $b +c $b $a $b $y +c $b $a $c $k +c $b $a $l $l +c $b $e $l $l +c $b $o $o $k +c $b $o $y +c $b $r $o $w $n +c $c +c $c $y +c $d +c $d $a $v $i $d +c $d $a $y +c $d $o $m $e +c $e +c $e $a $u +c $e $d +c $e $e +c $e $l $l $a +c $e $n +c $e $n $c $e +c $e $n $t +c $e $o $u $s +c $e $r +c $e $r $y +c $e $s +c $e $s $s +c $e $s $t +c $e $t +c $e $t $t $e +c $f +c $f $a $r $m $v $i $l $l $e +c $f $o $r $m +c $f $u $l +c $f $u $l $l $y +c $g +c $g $e $n $y +c $h +c $h $e $a $d +c $h $o $o $d +c $i +c $i $a $l +c $i $a $n +c $i $b $l $e +c $i $c +c $i $c $e $s +c $i $c $l $e +c $i $d $e +c $i $e $r +c $i $e $s +c $i $e $s $t +c $i $f $y +c $i $l $e +c $i $l $i $a +c $i $l $y +c $i $n $e +c $i $n $g +c $i $o $n +c $i $o $u $s +c $i $s $e +c $i $s $h +c $i $s $m +c $i $s $t +c $i $t $e +c $i $t $i $c +c $i $t $i $o $n +c $i $t $i $v $e +c $i $t $y +c $i $v $e +c $i $x +c $i $z $e +c $j +c $j $o $h $n +c $j $o $h $n $s $o $n +c $k +c $k $h $a $n +c $k $i $n +c $l +c $l $a $n $d +c $l $e $e +c $l $e $s $s +c $l $e $t +c $l $i $k $e +c $l $i $n $e +c $l $i $n $g +c $l $o $n $g +c $l $o $o $p +c $l $y +c $m +c $m $a $n +c $m $e $n +c $m $e $n $t +c $m $i $c $h $a $e $l +c $m $i $k $e +c $n +c $n $e $s $s +c $o +c $o $e $s +c $o $i $d +c $o $l +c $o $l $o $g $y +c $o $m $y +c $o $n +c $o $r +c $o $r $y +c $o $s $e +c $o $u $r +c $o $u $s +c $o $u $t +c $o $v $e $r +c $p +c $p $a $s $s +c $p $h $p $b $b +c $q +c $q $w $e $r $t $y +c $r +c $r $o $o $m +c $s +c $s $a $l $a $s $a $n $a +c $s $e $r $v $e $r +c $s $e $s +c $s $e $x $y +c $s $h +c $s $h $i $p +c $s $i $d $e +c $s $i $o $n +c $s $i $s +c $s $m $i $t $h +c $s $o $m $e +c $t +c $t $e $s $t +c $t $h $e +c $t $i $o $n +c $t $y +c $u +c $u $m +c $u $p +c $v +c $w +c $w $a $y +c $w $i $s $e +c $w $o $o $d +c $x +c $y +c $z +c ${ +c ${ $0 +c ${ $1 +c ${ $2 +c ${ $3 +c ${ $4 +c ${ $5 +c ${ $6 +c ${ $7 +c ${ $8 +c ${ $9 +c $| +c $| $0 +c $| $1 +c $| $2 +c $| $3 +c $| $4 +c $| $5 +c $| $6 +c $| $7 +c $| $8 +c $| $9 +c $} +c $} $0 +c $} $1 +c $} $2 +c $} $3 +c $} $4 +c $} $5 +c $} $6 +c $} $7 +c $} $8 +c $} $9 +c $~ +c $~ $! $@ $# $$ +c $~ $0 +c $~ $1 +c $~ $2 +c $~ $3 +c $~ $4 +c $~ $5 +c $~ $6 +c $~ $7 +c $~ $8 +c $~ $9 +c ^ ^I +c ^ ^a +c ^ ^a ^ ^m ^i +c ^ ^d ^n ^a ^s +c ^ ^e ^h ^t +c ^ ^e ^r ^a ^ ^e ^w +c ^ ^e ^r ^a ^ ^u ^o ^y +c ^ ^e ^r ^a ^ ^y ^e ^h ^t +c ^ ^e ^v ^a ^h ^ ^i +c ^ ^i +c ^ ^l ^l ^i ^m +c ^ ^m ^' ^I +c ^ ^m ^' ^i +c ^ ^m ^a ^ ^i +c ^ ^p ^o ^t +c ^ ^r ^ ^e ^w +c ^ ^r ^ ^u ^o ^y +c ^ ^r ^ ^y ^e ^h ^t +c ^ ^s ^i ^ ^e ^h +c ^ ^s ^i ^ ^e ^h ^s +c ^ ^s ^i ^ ^s ^i ^h ^t +c ^ ^s ^i ^ ^t ^i +c ^ ^t ^' ^n ^o ^d ^ ^i +c ^ ^t ^n ^o ^d ^ ^i +c ^ ^t ^o ^n ^ ^m ^a ^ ^i +c ^ ^u +c ^ ^u ^o ^y +c ^ ^y ^m +c ^- ^i ^m ^e ^s +c ^- ^n ^o ^n +c ^- ^r ^e ^p ^y ^h +c ^- ^r ^e ^v ^o +c ^- ^s ^i ^m +c ^- ^t ^n ^a +c ^- ^x ^e +c ^0 ^0 ^0 ^2 +c ^0 ^1 ^0 ^2 +c ^0 ^4 ^9 ^1 +c ^0 ^5 ^9 ^1 +c ^0 ^6 ^9 ^1 +c ^0 ^7 ^9 ^1 +c ^0 ^8 ^9 ^1 +c ^0 ^9 ^9 ^1 +c ^1 ^0 ^0 ^2 +c ^1 ^1 ^0 ^2 +c ^1 ^2 ^3 +c ^1 ^4 ^9 ^1 +c ^1 ^5 ^9 ^1 +c ^1 ^6 ^9 ^1 +c ^1 ^7 ^9 ^1 +c ^1 ^8 ^9 ^1 +c ^1 ^9 ^9 ^1 +c ^2 ^0 ^0 ^2 +c ^2 ^1 ^0 ^2 +c ^2 ^4 ^9 ^1 +c ^2 ^5 ^9 ^1 +c ^2 ^6 ^9 ^1 +c ^2 ^7 ^9 ^1 +c ^2 ^8 ^9 ^1 +c ^2 ^9 ^9 ^1 +c ^3 ^0 ^0 ^2 +c ^3 ^1 ^0 ^2 +c ^3 ^2 ^1 +c ^3 ^4 ^9 ^1 +c ^3 ^5 ^9 ^1 +c ^3 ^6 ^9 ^1 +c ^3 ^7 ^9 ^1 +c ^3 ^8 ^9 ^1 +c ^3 ^9 ^9 ^1 +c ^4 ^0 ^0 ^2 +c ^4 ^1 ^0 ^2 +c ^4 ^4 ^9 ^1 +c ^4 ^5 ^9 ^1 +c ^4 ^6 ^9 ^1 +c ^4 ^7 ^9 ^1 +c ^4 ^8 ^9 ^1 +c ^4 ^9 ^9 ^1 +c ^5 ^0 ^0 ^2 +c ^5 ^1 ^0 ^2 +c ^5 ^4 ^9 ^1 +c ^5 ^5 ^9 ^1 +c ^5 ^6 ^9 ^1 +c ^5 ^7 ^9 ^1 +c ^5 ^8 ^9 ^1 +c ^5 ^9 ^9 ^1 +c ^6 ^0 ^0 ^2 +c ^6 ^1 ^0 ^2 +c ^6 ^4 ^9 ^1 +c ^6 ^5 ^9 ^1 +c ^6 ^6 ^9 ^1 +c ^6 ^7 ^9 ^1 +c ^6 ^8 ^9 ^1 +c ^6 ^9 ^9 ^1 +c ^7 ^0 ^0 ^2 +c ^7 ^1 ^0 ^2 +c ^7 ^4 ^9 ^1 +c ^7 ^5 ^9 ^1 +c ^7 ^6 ^9 ^1 +c ^7 ^7 ^9 ^1 +c ^7 ^8 ^9 ^1 +c ^7 ^9 ^9 ^1 +c ^8 ^0 ^0 ^2 +c ^8 ^1 ^0 ^2 +c ^8 ^4 ^9 ^1 +c ^8 ^5 ^9 ^1 +c ^8 ^6 ^9 ^1 +c ^8 ^7 ^9 ^1 +c ^8 ^8 ^9 ^1 +c ^8 ^9 ^9 ^1 +c ^9 ^0 ^0 ^2 +c ^9 ^1 ^0 ^2 +c ^9 ^4 ^9 ^1 +c ^9 ^5 ^9 ^1 +c ^9 ^6 ^9 ^1 +c ^9 ^7 ^9 ^1 +c ^9 ^8 ^9 ^1 +c ^9 ^9 ^9 ^1 +c ^A +c ^B +c ^C +c ^D +c ^E +c ^F +c ^G +c ^H +c ^I +c ^J +c ^K +c ^L +c ^M +c ^N +c ^O +c ^P +c ^Q +c ^R +c ^S +c ^T +c ^U +c ^V +c ^W +c ^X +c ^Y +c ^Z +c ^a +c ^a ^e ^s +c ^a ^e ^t +c ^a ^g ^e ^m +c ^a ^i ^d +c ^a ^n ^a +c ^a ^r ^t ^l ^u +c ^b +c ^b ^o +c ^b ^u ^s +c ^c +c ^c ^c ^a +c ^d +c ^d ^a ^b +c ^d ^a ^e ^d +c ^d ^a ^e ^h +c ^d ^a ^e ^l +c ^d ^d ^a +c ^d ^e ^b +c ^d ^e ^e ^s +c ^d ^e ^r +c ^d ^i ^m +c ^d ^l ^o ^g +c ^d ^n ^a ^b +c ^d ^n ^a ^h +c ^d ^n ^a ^l +c ^d ^n ^i ^h +c ^d ^n ^i ^w +c ^d ^o ^o ^g +c ^d ^o ^o ^w +c ^d ^r ^a ^h +c ^d ^r ^o ^c +c ^d ^r ^o ^w ^s ^s ^a ^p +c ^d ^u ^m +c ^e +c ^e ^b +c ^e ^c ^a ^f +c ^e ^c ^a ^l +c ^e ^c ^i +c ^e ^c ^i ^v +c ^e ^d +c ^e ^d ^i ^s +c ^e ^e ^n ^k +c ^e ^e ^r ^f +c ^e ^l ^e ^t +c ^e ^n ^i ^l +c ^e ^n ^o ^t ^s +c ^e ^r +c ^e ^r ^i ^f +c ^e ^r ^o ^f +c ^e ^r ^p +c ^e ^s ^o ^n +c ^e ^t ^n ^a +c ^e ^v ^a ^h ^i +c ^e ^y ^e +c ^f +c ^f ^f ^o +c ^f ^l ^a ^h +c ^f ^l ^e ^s +c ^g +c ^g ^e ^l +c ^g ^i ^p +c ^g ^n ^i ^k +c ^g ^n ^i ^r +c ^g ^n ^i ^w +c ^g ^n ^o ^l +c ^g ^o ^d +c ^g ^o ^l +c ^h +c ^h ^c ^r ^a +c ^h ^g ^i ^h +c ^h ^s ^a +c ^h ^s ^a ^w +c ^h ^s ^i ^f +c ^h ^t ^a ^b +c ^h ^t ^r ^a ^e +c ^i +c ^i ^b +c ^i ^l ^e ^h +c ^i ^m ^e ^d +c ^i ^m ^e ^s +c ^i ^n ^i ^m +c ^i ^n ^m ^o +c ^i ^p ^e +c ^i ^r ^t +c ^i ^t ^l ^u ^m +c ^i ^t ^n ^a +c ^i ^x ^a ^m +c ^j +c ^k +c ^k ^c ^a ^b +c ^k ^l ^i ^m +c ^k ^n ^i +c ^k ^o ^o ^b +c ^k ^r ^o ^w +c ^l +c ^l ^a ^m +c ^l ^a ^o ^c +c ^l ^i +c ^l ^i ^a ^j +c ^l ^i ^a ^r +c ^l ^i ^a ^s +c ^l ^i ^a ^t +c ^l ^i ^o +c ^l ^l ^a ^f +c ^l ^l ^i +c ^l ^l ^i ^p +c ^l ^l ^o ^r +c ^l ^o ^o ^w +c ^m +c ^m ^' ^I +c ^m ^' ^i +c ^m ^a ^ ^i +c ^m ^e +c ^m ^i +c ^m ^o ^c +c ^m ^r ^a ^f +c ^m ^r ^o ^w +c ^m ^u ^g +c ^n +c ^n ^a ^m +c ^n ^e +c ^n ^e ^p +c ^n ^i +c ^n ^i ^m ^d ^a +c ^n ^i ^p +c ^n ^i ^t +c ^n ^o +c ^n ^o ^c +c ^n ^o ^n +c ^n ^o ^o ^m +c ^n ^r ^o ^c +c ^n ^u +c ^n ^u ^g +c ^n ^u ^s +c ^n ^w ^o ^d +c ^o +c ^o ^c +c ^o ^d ^u ^e ^s ^p +c ^o ^e ^n +c ^o ^i ^b +c ^o ^l ^i ^k +c ^o ^l ^l ^a +c ^o ^n ^o ^m +c ^o ^o ^z +c ^o ^p ^y ^h +c ^o ^r ^c ^a +c ^o ^r ^c ^a ^m +c ^o ^r ^c ^i ^m +c ^o ^r ^e ^a +c ^o ^r ^p +c ^o ^r ^y ^g +c ^o ^s ^i +c ^o ^t ^c ^e +c ^o ^t ^u ^a +c ^p +c ^p ^m ^a ^c +c ^p ^u +c ^q +c ^r +c ^r ^a ^e +c ^r ^a ^e ^b +c ^r ^a ^o +c ^r ^a ^p +c ^r ^a ^w +c ^r ^e ^d ^n ^u +c ^r ^e ^p +c ^r ^e ^p ^u ^s +c ^r ^e ^p ^y ^h +c ^r ^e ^t ^a ^w +c ^r ^e ^t ^f ^a +c ^r ^e ^t ^n ^i +c ^r ^e ^t ^n ^u ^o ^c +c ^r ^e ^v ^o +c ^r ^i +c ^r ^i ^a +c ^r ^i ^a ^h +c ^r ^o ^f +c ^r ^o ^o ^d +c ^r ^o ^t ^a ^r ^t ^s ^i ^n ^i ^m ^d ^a +c ^r ^u ^s +c ^s +c ^s ^i ^d +c ^s ^i ^h ^t +c ^s ^i ^m +c ^s ^n ^a ^r ^t +c ^s ^s ^a ^p +c ^s ^s ^o ^r ^c +c ^s ^y ^d +c ^t +c ^t ^a ^b +c ^t ^a ^c +c ^t ^a ^f +c ^t ^a ^h +c ^t ^a ^o ^b +c ^t ^a ^r +c ^t ^c ^a ^l +c ^t ^e ^j +c ^t ^f ^o ^s +c ^t ^h ^g ^i ^n +c ^t ^n ^e ^c +c ^t ^o ^h +c ^t ^o ^n ^k +c ^t ^o ^o ^b +c ^t ^o ^o ^f +c ^t ^o ^p +c ^t ^p ^e ^h +c ^t ^s ^o ^p +c ^t ^u ^c +c ^t ^u ^o +c ^u +c ^u ^e +c ^v +c ^w +c ^w ^a ^j +c ^w ^a ^s +c ^w ^e ^n +c ^w ^o ^b +c ^w ^o ^c +c ^w ^o ^l +c ^w ^o ^n ^s +c ^w ^o ^t +c ^x +c ^x ^a +c ^x ^a ^t +c ^x ^e +c ^x ^o +c ^y +c ^y ^a ^d +c ^y ^a ^d ^i ^r ^f +c ^y ^a ^d ^n ^o ^m +c ^y ^a ^d ^n ^u ^s +c ^y ^a ^d ^r ^u ^t ^a ^s +c ^y ^a ^d ^s ^e ^n ^d ^e ^w +c ^y ^a ^d ^s ^r ^u ^h ^t +c ^y ^a ^d ^s ^u ^e ^t +c ^y ^a ^l +c ^y ^a ^l ^p +c ^y ^a ^p +c ^y ^a ^w +c ^y ^b +c ^y ^e ^k +c ^y ^k ^s +c ^y ^l ^o ^p +c ^y ^m +c ^z +l +c o0k +c o0p +p1 +d $S +d $a +d $a $b $l $e +d $a $c $l $e +d $a $g $e +d $a $l +d $a $l $l $y +d $a $m +d $a $n +d $a $n $a +d $a $n $c $e +d $a $n $d +d $a $n $e +d $a $n $t +d $a $r $y +d $a $s $e +d $a $t $i $o $n +d $a $t $i $v $e +d $a $u $x +d $b +d $b $a $b $y +d $b $a $c $k +d $b $a $l $l +d $b $e $l $l +d $b $o $o $k +d $b $o $y +d $c +d $c $y +d $d +d $d $a $y +d $d $o $m $e +d $e +d $e $a $u +d $e $d +d $e $e +d $e $l $l $a +d $e $n +d $e $n $c $e +d $e $n $t +d $e $o $u $s +d $e $r +d $e $r $y +d $e $s +d $e $s $s +d $e $s $t +d $e $t +d $e $t $t $e +d $f +d $f $o $r $m +d $f $u $l +d $f $u $l $l $y +d $g +d $g $e $n $y +d $h +d $h $e $a $d +d $h $o $o $d +d $i +d $i $a $l +d $i $a $n +d $i $b $l $e +d $i $c +d $i $c $e $s +d $i $c $l $e +d $i $d $e +d $i $e $r +d $i $e $s +d $i $e $s $t +d $i $f $y +d $i $l $e +d $i $l $i $a +d $i $l $y +d $i $n $e +d $i $n $g +d $i $o $n +d $i $o $u $s +d $i $s $e +d $i $s $h +d $i $s $m +d $i $s $t +d $i $t $e +d $i $t $i $c +d $i $t $i $o $n +d $i $t $i $v $e +d $i $t $y +d $i $v $e +d $i $x +d $i $z $e +d $j +d $j $o $n $e $s +d $k +d $k $i $n +d $l +d $l $a $n $d +d $l $e $s $s +d $l $e $t +d $l $i $k $e +d $l $i $n $e +d $l $i $n $g +d $l $o $n $g +d $l $o $o $p +d $l $y +d $m +d $m $a $n +d $m $e $n +d $m $e $n $t +d $n +d $n $e $s $s +d $o +d $o $e $s +d $o $i $d +d $o $l +d $o $l $o $g $y +d $o $m $y +d $o $n +d $o $r +d $o $r $y +d $o $s $e +d $o $u $r +d $o $u $s +d $o $u $t +d $o $v $e $r +d $p +d $p $a $s $s +d $q +d $r +d $r $o $o $m +d $s +d $s $e $s +d $s $e $x $y +d $s $h +d $s $h $i $p +d $s $i $d $e +d $s $i $o $n +d $s $i $s +d $s $o $m $e +d $t +d $t $h $e +d $t $i $o $n +d $t $y +d $u +d $u $m +d $u $p +d $v +d $w +d $w $a $y +d $w $i $s $e +d $w $o $o $d +d $x +d $y +d $z +d $~ $! $@ $# $$ +p1 x28 Y4 '4 d f -f'4y4 -i0 -i0! +f '4 y4 i0! i1! i0! i1! i2! i0! i11 i0! i11 i22 i33 i0! i12 i23 i0! i1@ i2# -i0" -i0# i0# i11 i0# i11 i22 i33 i0$ i0$ i1$ i0$ i11 i0% -i0& i0' -i0( i0( i1) i0) -i0* i0* i1* i0* i1* i2* i0+ -i0, -i0- i0- i1- i0- i1- i2- i0- i10 i21 @@ -7563,7 +7359,6 @@ i0- i11 i22 i0- i11 i22 i33 i0- i11 i23 i0- i12 -i0. i0. i1. i0. i1. i2. i0. i1. i2. i3. @@ -7579,8 +7374,6 @@ i0. i12 i0. i12 i20 i31 i40 i0. i12 i20 i31 i41 i0. i12 i22 -i0/ -i00 i00 i1! i00 i1$ i00 i10 @@ -7588,7 +7381,6 @@ i00 i10 i2! i00 i10 i20 i00 i10 i21 i00 i10 i27 -i00 i11 i00 i11 i2! i00 i11 i20 i00 i11 i22 @@ -7608,7 +7400,6 @@ i00 i18 i20 i00 i19 i00 i19 i20 i00 i19 i21 -i01 i01 i1! i01 i1# i01 i1$ @@ -7628,14 +7419,12 @@ i01 i11 i21 i01 i11 i21 i31 i01 i11 i22 i01 i11 i22 i33 -i01 i12 i01 i12 i2! i01 i12 i2. i01 i12 i20 i01 i12 i21 i01 i12 i21 i32 i01 i12 i22 -i01 i12 i23 i01 i12 i23 i3! i01 i12 i23 i3# i01 i12 i23 i3$ @@ -7645,7 +7434,6 @@ i01 i12 i23 i31 i01 i12 i23 i31 i42 i53 i01 i12 i23 i34 i01 i12 i23 i34 i4! -i01 i12 i23 i34 i45 i01 i12 i23 i34 i45 i56 i01 i12 i23 i3@ i01 i12 i23 i3_ @@ -7675,57 +7463,15 @@ i01 i18 i20 i01 i19 i01 i19 i20 i01 i19 i27 -i01 i19 i27 i36 -i01 i19 i27 i37 -i01 i19 i27 i38 -i01 i19 i27 i39 i01 i19 i28 -i01 i19 i28 i30 -i01 i19 i28 i31 -i01 i19 i28 i32 -i01 i19 i28 i33 -i01 i19 i28 i34 -i01 i19 i28 i35 -i01 i19 i28 i36 -i01 i19 i28 i37 -i01 i19 i28 i38 -i01 i19 i28 i39 i01 i19 i29 -i01 i19 i29 i30 -i01 i19 i29 i31 -i01 i19 i29 i32 -i01 i19 i29 i33 -i01 i19 i29 i34 -i01 i19 i29 i35 -i01 i19 i29 i36 -i01 i19 i29 i37 -i01 i19 i29 i38 -i01 i19 i29 i39 i01 i1@ i01 i1_ -i02 i02 i1! i02 i1. i02 i10 i02 i10 i20 -i02 i10 i20 i30 -i02 i10 i20 i31 -i02 i10 i20 i32 -i02 i10 i20 i33 -i02 i10 i20 i34 -i02 i10 i20 i35 -i02 i10 i20 i36 -i02 i10 i20 i37 -i02 i10 i20 i38 -i02 i10 i20 i39 i02 i10 i21 -i02 i10 i21 i30 -i02 i10 i21 i31 -i02 i10 i21 i32 -i02 i10 i21 i33 -i02 i10 i21 i34 -i02 i10 i21 i35 -i02 i10 i21 i36 i02 i11 i02 i11 i2! i02 i11 i20 @@ -7747,13 +7493,11 @@ i02 i16 i20 i02 i17 i02 i18 i02 i19 -i03 i03 i1! i03 i10 i03 i10 i20 i03 i11 i03 i12 -i03 i12 i21 i03 i13 i03 i13 i2! i03 i13 i23 @@ -7764,7 +7508,6 @@ i03 i16 i03 i17 i03 i18 i03 i19 -i04 i04 i1! i04 i10 i04 i11 @@ -7778,7 +7521,6 @@ i04 i16 i04 i17 i04 i18 i04 i19 -i05 i05 i1! i05 i10 i05 i11 @@ -7793,7 +7535,6 @@ i05 i16 i05 i17 i05 i18 i05 i19 -i06 i06 i10 i06 i11 i06 i12 @@ -7805,7 +7546,6 @@ i06 i16 i26 i06 i17 i06 i18 i06 i19 -i07 i07 i1! i07 i10 i07 i11 @@ -7819,7 +7559,6 @@ i07 i17 i27 i07 i18 i07 i18 i29 i07 i19 -i08 i08 i10 i08 i11 i08 i12 @@ -7832,7 +7571,6 @@ i08 i18 i08 i18 i2! i08 i18 i28 i08 i19 -i09 i09 i10 i09 i11 i09 i11 i21 @@ -7849,12 +7587,8 @@ i09 i19 i09 i19 i2! i0: i0; -i0< i0< i13 -i0= i0> -i0? -i0@ i0@ i1. i2: i0@ i10 i21 i0@ i11 @@ -7868,70 +7602,43 @@ i0@ i11 i23 i0@ i12 i0@ i12 i22 i0@ i1@ -i0A i0A i1l i0A i1n i0A i1n i2g i3e i4l i0A i1p i2r i3i i4l -i0B i0B i1a i0B i1l i0B i1r -i0C i0C i1a i0C i1h i0C i1h i2r i3i i4s i0C i1o -i0D i0D i1a i0D i1a i2n i3i i4e i5l i0D i1a i2v i3i i4d i0D i1e i0D i1r -i0E -i0F -i0G -i0H i0H i1a -i0I -i0J i0J i1a -i0K i0K i1a i0K i1i -i0L i0L i1o -i0M i0M i1a i0M i1e i0M i1i i0M i1o -i0N -i0O -i0P i0P i1a i0P i1a i2s i3s i4w i5o i6r i7d -i0Q i0Q i1w i2e i3r i4t i5y -i0R i0R i1a i0R i1o -i0S i0S i1a i0S i1h i0S i1t -i0T -i0U -i0V -i0W -i0X -i0Y -i0Z i0[ i0\ i0] i0^ -i0_ i0_ i1! i0_ i10 i0_ i10 i20 @@ -7987,7 +7694,6 @@ i0_ i1_ i0_ i1_ i2_ i0_ i1_ i2_ i3_ i0` -i0a i0a i11 i0a i1a i0a i1a i2r i3o i4n @@ -7996,7 +7702,6 @@ i0a i1b i2c i0a i1b i2c i3d i4e i0a i1c i0a i1d -i0a i1d i2m i3i i4n i0a i1d i2r i3i i4a i5n i0a i1g i0a i1h i2m i3e i4d @@ -8017,7 +7722,6 @@ i0a i1m i2a i0a i1m i2a i3n i4d i5a i0a i1m i2b i3e i4r i0a i1n -i0a i1n i2a i0a i1n i2d i0a i1n i2d i3r i4e i0a i1n i2d i3r i4e i5a @@ -8044,7 +7748,6 @@ i0a i1s i0a i1s i2d i0a i1s i2d i3a i4s i5d i0a i1s i2d i3f i4g -i0a i1s i2h i0a i1s i2h i3l i4e i5y i0a i1s i2s i0a i1t @@ -8053,7 +7756,6 @@ i0a i1u i2g i3u i4s i5t i0a i1v i0a i1w i0a i1z -i0b i0b i1a i0b i1a i2b i0b i1a i2c i3o i4n @@ -8061,14 +7763,11 @@ i0b i1a i2l i0b i1a i2n i0b i1a i2r i0b i1a i2s -i0b i1a i2t -i0b i1e i0b i1e i2a i0b i1e i2l i0b i1e i2l i3l i4a i0b i1e i2n i0b i1e i2r -i0b i1i i0b i1i i2g i0b i1l i0b i1l i2a @@ -8089,8 +7788,6 @@ i0b i1r i2u i3n i4o i0b i1u i0b i1u i2b i0b i1u i2d i3d i4y -i0b i1y -i0c i0c i1a i0c i1a i2l i0c i1a i2m @@ -8100,7 +7797,6 @@ i0c i1a i2r i0c i1a i2r i3l i4o i5s i0c i1a i2r i3o i4l i0c i1a i2s -i0c i1a i2t i0c i1e i0c i1h i0c i1h i2a @@ -8118,18 +7814,14 @@ i0c i1i i0c i1i i2n i3d i4y i0c i1l i0c i1l i2a -i0c i1o i0c i1o i2c i0c i1o i2l -i0c i1o i2m -i0c i1o i2n i0c i1o i2o i0c i1o i2r i0c i1r i0c i1r i2a i0c i1r i2i i0c i1u -i0d i0d i1a i0d i1a i2d i0d i1a i2i i3s i4y @@ -8142,7 +7834,6 @@ i0d i1a i2r i0d i1a i2s i3h i4a i0d i1a i2v i0d i1a i2v i3i i4d -i0d i1e i0d i1e i2a i0d i1e i2l i0d i1e i2m @@ -8154,40 +7845,33 @@ i0d i1e i2s i0d i1e i2v i0d i1g i2k i3j i4h i5s i0d i1i -i0d i1i i2a i0d i1i i2a i3n i4a i0d i1i i2e i3g i4o i0d i1i i2m i3o i4n i0d i1i i2n i0d i1j i0d i1o -i0d i1o i2g i0d i1o i2m i0d i1o i2n i0d i1r i0d i1r i2a i0d i1r i2a i3g i4o i5n i0d i1u -i0e i0e i1a i0e i1d i0e i1l i0e i1l i2e i3n i4a i0e i1l i2i -i0e i1m i0e i1m i2i i0e i1m i2i i3l i4y -i0e i1n i0e i1r i0e i1r i2i i0e i1s i0e i1v i0e i1v i2e i3n i4t i5p -i0f i0f i1a i0f i1a i2m i3i i4l i5y i0f i1a i2r -i0f i1a i2t i0f i1b i2o i3b i4h i0f i1e i0f i1e i2l i3i i4x @@ -8198,7 +7882,6 @@ i0f i1l i0f i1l i2a i0f i1l i2o i0f i1o -i0f i1o i2r i0f i1o i2r i3e i4v i5e i6r i0f i1r i0f i1r i2a @@ -8207,7 +7890,6 @@ i0f i1r i2a i3n i4k i0f i1r i2e i0f i1u i0f i1u i2c -i0g i0g i1a i0g i1a i2b i0g i1a i2b i3r i4i i5e i6l @@ -8231,7 +7913,6 @@ i0g i1r i2e i0g i1r i2e i3e i4n i0g i1u i0g i1u i2i -i0h i0h i1a i0h i1a i2l i0h i1a i2m @@ -8251,27 +7932,20 @@ i0h i1o i0h i1o i2l i0h i1o i2n i3d i4a i0h i1o i2n i3e i4y -i0h i1o i2t i0h i1u i0h i1u i2a i3n i4g i0h i1u i2n i0h i1u i2n i3t i4e i5r -i0i i0i i1a i0i i1a i2m i0i i1c -i0i i1l i0i i1l i2o i0i i1l i2o i3v i4e i0i i1l i2o i3v i4e i5y i6o i7u -i0i i1m -i0i i1n i0i i1n i2a -i0i i1r i0i i1r i2i i3n i4a i0i i1s i0i i1t -i0j i0j i1a i0j i1a i2c i0j i1a i2c i3o i4b @@ -8310,7 +7984,6 @@ i0j i1u i2n i0j i1u i2n i3i i4o i5r i0j i1u i2s i0j i1u i2s i3t i4i i5n -i0k i0k i1a i0k i1a i2k i0k i1a i2m @@ -8340,7 +8013,6 @@ i0k i1o i0k i1r i0k i1u i0k i1y -i0l i0l i1a i0l i1a i2n i0l i1a i2u i3r i4a @@ -8362,16 +8034,13 @@ i0l i1u i2c i3a i4s i0l i1u i2c i3k i4y i0l i1u i2i i0l i1u i2n i3c i4h -i0m i0m i1a i0m i1a i2c i0m i1a i2d i0m i1a i2g i0m i1a i2g i3g i4i i5e i0m i1a i2k i3s i4i i5m -i0m i1a i2l i0m i1a i2m -i0m i1a i2n i0m i1a i2r i0m i1a i2r i3c i4h i0m i1a i2r i3c i4o @@ -8402,7 +8071,6 @@ i0m i1i i2g i3u i4e i5l i0m i1i i2k i0m i1i i2l i0m i1i i2n -i0m i1i i2s i0m i1i i2s i3h i4a i0m i1o i0m i1o i2l i3l i4y @@ -8415,9 +8083,7 @@ i0m i1o i2r i0m i1u i0m i1u i2s i0m i1u i2s i3i i4c -i0m i1y i0m i1y i2s i3p i4a i5c i6e -i0n i0n i1a i0n i1a i2n i0n i1a i2r @@ -8427,7 +8093,6 @@ i0n i1a i2t i0n i1a i2t i3a i4l i5i i0n i1a i2t i3a i4s i5h i6a i0n i1e -i0n i1e i2w i0n i1i i0n i1i i2c i0n i1i i2c i3o i4l i5e @@ -8438,42 +8103,34 @@ i0n i1i i2n i0n i1o i0n i1o i2k i3i i4a i0n i1u -i0o i0o i1k i2s i3a i4n i5a i0o i1l i0o i1l i2i i3v i4e i5r i0o i1m -i0o i1n i0o i1n i2l i3i i4n i5e i0o i1p i0o i1r i0o i1r i2a i3n i4g i5e i0o i1s i0o i1s i2c i3a i4r -i0p i0p i1a i0p i1a i2b i3l i4o i0p i1a i2l i0p i1a i2n i0p i1a i2n i3d i4a i0p i1a i2p -i0p i1a i2r i0p i1a i2s i0p i1a i2s i3h i4a -i0p i1a i2s i3s i4w i5o i6r i7d i0p i1a i2t i0p i1a i2v i3e i4l i0p i1e i0p i1e i2d i3r i4o -i0p i1e i2n i0p i1e i2p -i0p i1e i2r i0p i1e i2t i0p i1e i2t i3e i4r i0p i1h i0p i1h i2o i3n i4e i0p i1i -i0p i1i i2n i0p i1l i0p i1l i2a i0p i1o @@ -8485,13 +8142,10 @@ i0p i1o i2p i0p i1o i2r i0p i1o i2w i3e i4r i0p i1r -i0p i1r i2e i0p i1r i2i i0p i1r i2i i3n i4c i5e i6s i7s -i0p i1r i2o i0p i1u i0p i1u i2r i3p i4l i5e -i0q i0q i1a i0q i1a i2z i3w i4s i5x i0q i1u @@ -8499,13 +8153,10 @@ i0q i1w i0q i1w i2e i0q i1w i2e i3r i4t i0q i1w i2e i3r i4t i5y -i0r i0r i1a i0r i1a i2i i0r i1a i2m i0r i1a i2n -i0r i1e -i0r i1e i2d i0r i1e i2n i0r i1i i0r i1i i2c @@ -8520,7 +8171,6 @@ i0r i1o i2s i0r i1u i0r i1u i2s i3l i4a i5n i0r i1y -i0s i0s i1a i0s i1a i2l i0s i1a i2m @@ -8583,16 +8233,13 @@ i0s i1t i2e i3v i4e i5n i0s i1t i2r i0s i1u i0s i1u i2m i3m i4e i5r -i0s i1u i2n i0s i1u i2n i3n i4y i0s i1u i2n i3s i4h i5i i6n i7e i0s i1u i2p -i0s i1u i2p i3e i4r i0s i1v i2e i3t i4a i0s i1w i0s i1w i2e i3e i4t i0s i1y -i0t i0t i1a i0t i1a i2b i3l i4e i0t i1a i2n @@ -8603,13 +8250,11 @@ i0t i1e i2a i3m i4o i0t i1e i2r i0t i1h i0t i1h i2a i3n i4h -i0t i1h i2e i0t i1h i2o i3m i4a i5s i0t i1i i0t i1i i2g i0t i1i i2g i3e i4r i0t i1i i2m -i0t i1i i2n i0t i1o i0t i1o i2m i0t i1o i2m i3m i4y @@ -8617,14 +8262,10 @@ i0t i1o i2n i0t i1r i0t i1r i2a i0t i1r i2e -i0t i1r i2i i0t i1u i0t i1w i0t i1y i0t i1y i2l i3e i4r -i0u -i0u i1n -i0v i0v i1a i0v i1a i2d i3i i4m i0v i1a i2l @@ -8634,9 +8275,7 @@ i0v i1e i2r i0v i1i i0v i1i i2c i3t i4o i5r i0v i1o -i0w i0w i1a -i0w i1a i2r i0w i1e i0w i1e i2r i0w i1h @@ -8647,15 +8286,12 @@ i0w i1i i2n i0w i1o i0w i1o i2a i3i i4n i5i i0w i1o i2l -i0x -i0y i0y i1a i0y i1e i0y i1f i2c i3n i4z i0y i1o i0y i1o i2u i0y i1u -i0z i0z i1a i0z i1a i2c i3k i4s i0z i1e @@ -10927,7 +10563,7 @@ i2z i3z i2z i3z i4a i2{ i2| -i2|x23 +i2| x23 i2} i2~ i3 @@ -11981,7 +11617,7 @@ i3z i4h i5e i6n i7g i3z i4y i3{ i3| -i3|x33 +i3| x33 i3} i3~ i4 @@ -12887,11 +12523,10 @@ i4y i5b i6o i4y i5o i4y i5o i6u i4y i5s -i4y'5 i4z i4{ i4| -i4|x32 +i4| x32 i4} i4~ i5 @@ -13723,7 +13358,7 @@ i5y i63 i5y i69 i5y i6o i5y i6o i7u -i5y'6 +i5y '6 i5z i5z i61 i5{ @@ -13823,8 +13458,7 @@ i61 i79 i89 i61 i79 i89 i91 i61 i7@ i61 i7_ -i61i72i83 -i61i72i83i94 +i61 i72 i83 i94 i62 i62 i7! i62 i7. @@ -14543,8 +14177,8 @@ i71 i89 i71 i89 i97 i71 i89 i98 i71 i89 i99 -i71i72i83 -i71i72i83i94 +i71 i72 i83 +i71 i72 i83 i94 i72 i72 i80 i72 i80 i90 @@ -14560,7 +14194,6 @@ i72 i82 i92 i72 i82 i93 i72 i83 i72 i83 i90 -i72 i83 i91 i72 i83 i92 i72 i83 i93 i72 i83 i94 @@ -17053,9 +16686,8 @@ iG| iG} iG~ k -krKz3x13 -kz5x06 -l +r z3 x13 +k z5 x06 l $1 $2 l $2 $0 $1 $1 l $4 @@ -17063,2345 +16695,2331 @@ l $7 l $e $d l $i l $m -l $s l $t l D4 l ] -l$! -l$!$! -l$!$!$! -l$!$!$!$! -l$!$!$!$!$! -l$!$!$!$!$!$! -l$!$!$!$!$!$!$! -l$!$!$!$!$!$!$!$! -l$!$!$!$!$!$!$!$!$! -l$!$!$!$!$!$!$!$!$!$! -l$!$!$!$!$!$!$!$!$!$!$! -l$&$a$m$p$; -l$.$a$c -l$.$a$d -l$.$a$e -l$.$a$e$r$o -l$.$a$f -l$.$a$g -l$.$a$i -l$.$a$l -l$.$a$m -l$.$a$n -l$.$a$o -l$.$a$q -l$.$a$r -l$.$a$r$p$a -l$.$a$s -l$.$a$t -l$.$a$u -l$.$a$w -l$.$a$x -l$.$a$z -l$.$b$a -l$.$b$b -l$.$b$d -l$.$b$e -l$.$b$f -l$.$b$g -l$.$b$h -l$.$b$i -l$.$b$i$z -l$.$b$j -l$.$b$m -l$.$b$n -l$.$b$o -l$.$b$r -l$.$b$s -l$.$b$t -l$.$b$v -l$.$b$w -l$.$b$y -l$.$b$z -l$.$c$a -l$.$c$a$t -l$.$c$c -l$.$c$d -l$.$c$f -l$.$c$g -l$.$c$h -l$.$c$i -l$.$c$k -l$.$c$l -l$.$c$m -l$.$c$n -l$.$c$o -l$.$c$o$m -l$.$c$o$o$p -l$.$c$r -l$.$c$u -l$.$c$v -l$.$c$x -l$.$c$y -l$.$c$z -l$.$d$e -l$.$d$j -l$.$d$k -l$.$d$m -l$.$d$o -l$.$d$z -l$.$e$c -l$.$e$d$u -l$.$e$e -l$.$e$g -l$.$e$r -l$.$e$s -l$.$e$t -l$.$e$u -l$.$f$i -l$.$f$j -l$.$f$k -l$.$f$m -l$.$f$o -l$.$f$r -l$.$g$a -l$.$g$b -l$.$g$d -l$.$g$e -l$.$g$f -l$.$g$g -l$.$g$h -l$.$g$i -l$.$g$l -l$.$g$m -l$.$g$n -l$.$g$o$v -l$.$g$p -l$.$g$q -l$.$g$r -l$.$g$s -l$.$g$t -l$.$g$u -l$.$g$w -l$.$g$y -l$.$h$k -l$.$h$m -l$.$h$n -l$.$h$r -l$.$h$t -l$.$h$u -l$.$i$d -l$.$i$e -l$.$i$l -l$.$i$m -l$.$i$n -l$.$i$n$f$o -l$.$i$n$t -l$.$i$o -l$.$i$q -l$.$i$r -l$.$i$s -l$.$i$t -l$.$j$e -l$.$j$m -l$.$j$o -l$.$j$o$b$s -l$.$j$p -l$.$k$e -l$.$k$g -l$.$k$h -l$.$k$i -l$.$k$m -l$.$k$n -l$.$k$r -l$.$k$w -l$.$k$y -l$.$k$z -l$.$l$a -l$.$l$b -l$.$l$c -l$.$l$i -l$.$l$k -l$.$l$r -l$.$l$s -l$.$l$t -l$.$l$u -l$.$l$v -l$.$l$y -l$.$m$a -l$.$m$c -l$.$m$d -l$.$m$g -l$.$m$h -l$.$m$i$l -l$.$m$k -l$.$m$l -l$.$m$m -l$.$m$n -l$.$m$o -l$.$m$o$b$i -l$.$m$p -l$.$m$q -l$.$m$r -l$.$m$s -l$.$m$t -l$.$m$u -l$.$m$u$s$e$u$m -l$.$m$v -l$.$m$w -l$.$m$x -l$.$m$y -l$.$m$z -l$.$n$a -l$.$n$a$m$e -l$.$n$c -l$.$n$e -l$.$n$e$t -l$.$n$f -l$.$n$g -l$.$n$i -l$.$n$l -l$.$n$o -l$.$n$p -l$.$n$r -l$.$n$u -l$.$n$z -l$.$o$m -l$.$o$r$g -l$.$p$a -l$.$p$e -l$.$p$f -l$.$p$g -l$.$p$h -l$.$p$k -l$.$p$l -l$.$p$m -l$.$p$n -l$.$p$r -l$.$p$r$o -l$.$p$s -l$.$p$t -l$.$p$w -l$.$p$y -l$.$q$a -l$.$r$e -l$.$r$o -l$.$r$o$o$t -l$.$r$u -l$.$r$w -l$.$s$a -l$.$s$b -l$.$s$c -l$.$s$d -l$.$s$e -l$.$s$g -l$.$s$h -l$.$s$i -l$.$s$j -l$.$s$k -l$.$s$l -l$.$s$m -l$.$s$n -l$.$s$o -l$.$s$r -l$.$s$t -l$.$s$u -l$.$s$v -l$.$s$y -l$.$s$z -l$.$t$c -l$.$t$d -l$.$t$f -l$.$t$g -l$.$t$h -l$.$t$j -l$.$t$k -l$.$t$l -l$.$t$m -l$.$t$n -l$.$t$o -l$.$t$p -l$.$t$r -l$.$t$r$a$v$e$l -l$.$t$t -l$.$t$v -l$.$t$w -l$.$t$z -l$.$u$a -l$.$u$g -l$.$u$k -l$.$u$m -l$.$u$s -l$.$u$y -l$.$u$z -l$.$v$a -l$.$v$c -l$.$v$e -l$.$v$g -l$.$v$i -l$.$v$n -l$.$v$u -l$.$w$f -l$.$w$s -l$.$y$e -l$.$y$t -l$.$y$u -l$.$z$a -l$.$z$m -l$.$z$w -l$0$1 -l$0$1$2$3$4$5$6$7$8$9 -l$0$2 -l$0$3 -l$0$4 -l$0$5 -l$0$6 -l$0$7 -l$0$8 -l$0$9 -l$1 -l$1$0 -l$1$1 -l$1$2 -l$1$2$3 -l$1$2$3$4 -l$1$2$3$4$5 -l$1$2$3$4$5$6 -l$1$2$3$4$5$6$7 -l$1$2$3$4$5$6$7$8 -l$1$2$3$4$5$6$7$8$9 -l$1$2$3$4$5$6$7$8$9$0 -l$1$3 -l$1$4 -l$1$5 -l$1$6 -l$1$7 -l$1$8 -l$1$9 -l$2 -l$2$0 -l$2$0$1$0$! -l$2$0$1$0$# -l$2$0$1$0$$ -l$2$0$1$0$% -l$2$0$1$0$& -l$2$0$1$0$( -l$2$0$1$0$) -l$2$0$1$0$* -l$2$0$1$0$+ -l$2$0$1$0$- -l$2$0$1$0$. -l$2$0$1$0$= -l$2$0$1$0$? -l$2$0$1$0$@ -l$2$0$1$0$^ -l$2$0$1$0$_ -l$2$0$1$0$` -l$2$0$1$0$| -l$2$0$1$0$~ -l$2$0$1$1$! -l$2$0$1$1$# -l$2$0$1$1$$ -l$2$0$1$1$% -l$2$0$1$1$& -l$2$0$1$1$( -l$2$0$1$1$) -l$2$0$1$1$* -l$2$0$1$1$+ -l$2$0$1$1$- -l$2$0$1$1$. -l$2$0$1$1$= -l$2$0$1$1$? -l$2$0$1$1$@ -l$2$0$1$1$^ -l$2$0$1$1$_ -l$2$0$1$1$` -l$2$0$1$1$| -l$2$0$1$1$~ -l$2$0$1$2$! -l$2$0$1$2$# -l$2$0$1$2$$ -l$2$0$1$2$% -l$2$0$1$2$& -l$2$0$1$2$( -l$2$0$1$2$) -l$2$0$1$2$* -l$2$0$1$2$+ -l$2$0$1$2$- -l$2$0$1$2$. -l$2$0$1$2$= -l$2$0$1$2$? -l$2$0$1$2$@ -l$2$0$1$2$^ -l$2$0$1$2$_ -l$2$0$1$2$` -l$2$0$1$2$| -l$2$0$1$2$~ -l$2$0$1$3$! -l$2$0$1$3$# -l$2$0$1$3$$ -l$2$0$1$3$% -l$2$0$1$3$& -l$2$0$1$3$( -l$2$0$1$3$) -l$2$0$1$3$* -l$2$0$1$3$+ -l$2$0$1$3$- -l$2$0$1$3$. -l$2$0$1$3$= -l$2$0$1$3$? -l$2$0$1$3$@ -l$2$0$1$3$^ -l$2$0$1$3$_ -l$2$0$1$3$` -l$2$0$1$3$| -l$2$0$1$3$~ -l$2$0$1$4$ -l$2$0$1$4$! -l$2$0$1$4$" -l$2$0$1$4$# -l$2$0$1$4$$ -l$2$0$1$4$% -l$2$0$1$4$& -l$2$0$1$4$' -l$2$0$1$4$( -l$2$0$1$4$) -l$2$0$1$4$* -l$2$0$1$4$+ -l$2$0$1$4$, -l$2$0$1$4$- -l$2$0$1$4$. -l$2$0$1$4$/ -l$2$0$1$4$: -l$2$0$1$4$; -l$2$0$1$4$< -l$2$0$1$4$= -l$2$0$1$4$> -l$2$0$1$4$? -l$2$0$1$4$@ -l$2$0$1$4$[ -l$2$0$1$4$\ -l$2$0$1$4$] -l$2$0$1$4$^ -l$2$0$1$4$_ -l$2$0$1$4$` -l$2$0$1$4${ -l$2$0$1$4$| -l$2$0$1$4$} -l$2$0$1$4$~ -l$2$0$1$5$ -l$2$0$1$5$! -l$2$0$1$5$" -l$2$0$1$5$# -l$2$0$1$5$$ -l$2$0$1$5$% -l$2$0$1$5$& -l$2$0$1$5$' -l$2$0$1$5$( -l$2$0$1$5$) -l$2$0$1$5$* -l$2$0$1$5$+ -l$2$0$1$5$, -l$2$0$1$5$- -l$2$0$1$5$. -l$2$0$1$5$/ -l$2$0$1$5$: -l$2$0$1$5$; -l$2$0$1$5$< -l$2$0$1$5$= -l$2$0$1$5$> -l$2$0$1$5$? -l$2$0$1$5$@ -l$2$0$1$5$[ -l$2$0$1$5$\ -l$2$0$1$5$] -l$2$0$1$5$^ -l$2$0$1$5$_ -l$2$0$1$5$` -l$2$0$1$5${ -l$2$0$1$5$| -l$2$0$1$5$} -l$2$0$1$5$~ -l$2$0$1$6$ -l$2$0$1$6$! -l$2$0$1$6$" -l$2$0$1$6$# -l$2$0$1$6$$ -l$2$0$1$6$% -l$2$0$1$6$& -l$2$0$1$6$' -l$2$0$1$6$( -l$2$0$1$6$) -l$2$0$1$6$* -l$2$0$1$6$+ -l$2$0$1$6$, -l$2$0$1$6$- -l$2$0$1$6$. -l$2$0$1$6$/ -l$2$0$1$6$: -l$2$0$1$6$; -l$2$0$1$6$< -l$2$0$1$6$= -l$2$0$1$6$> -l$2$0$1$6$? -l$2$0$1$6$@ -l$2$0$1$6$[ -l$2$0$1$6$\ -l$2$0$1$6$] -l$2$0$1$6$^ -l$2$0$1$6$_ -l$2$0$1$6$` -l$2$0$1$6${ -l$2$0$1$6$| -l$2$0$1$6$} -l$2$0$1$6$~ -l$2$0$1$7$ -l$2$0$1$7$! -l$2$0$1$7$" -l$2$0$1$7$# -l$2$0$1$7$$ -l$2$0$1$7$% -l$2$0$1$7$& -l$2$0$1$7$' -l$2$0$1$7$( -l$2$0$1$7$) -l$2$0$1$7$* -l$2$0$1$7$+ -l$2$0$1$7$, -l$2$0$1$7$- -l$2$0$1$7$. -l$2$0$1$7$/ -l$2$0$1$7$: -l$2$0$1$7$; -l$2$0$1$7$< -l$2$0$1$7$= -l$2$0$1$7$> -l$2$0$1$7$? -l$2$0$1$7$@ -l$2$0$1$7$[ -l$2$0$1$7$\ -l$2$0$1$7$] -l$2$0$1$7$^ -l$2$0$1$7$_ -l$2$0$1$7$` -l$2$0$1$7${ -l$2$0$1$7$| -l$2$0$1$7$} -l$2$0$1$7$~ -l$2$0$1$8$ -l$2$0$1$8$! -l$2$0$1$8$" -l$2$0$1$8$# -l$2$0$1$8$$ -l$2$0$1$8$% -l$2$0$1$8$& -l$2$0$1$8$' -l$2$0$1$8$( -l$2$0$1$8$) -l$2$0$1$8$* -l$2$0$1$8$+ -l$2$0$1$8$, -l$2$0$1$8$- -l$2$0$1$8$. -l$2$0$1$8$/ -l$2$0$1$8$: -l$2$0$1$8$; -l$2$0$1$8$< -l$2$0$1$8$= -l$2$0$1$8$> -l$2$0$1$8$? -l$2$0$1$8$@ -l$2$0$1$8$[ -l$2$0$1$8$\ -l$2$0$1$8$] -l$2$0$1$8$^ -l$2$0$1$8$_ -l$2$0$1$8$` -l$2$0$1$8${ -l$2$0$1$8$| -l$2$0$1$8$} -l$2$0$1$8$~ -l$2$0$1$9$ -l$2$0$1$9$! -l$2$0$1$9$" -l$2$0$1$9$# -l$2$0$1$9$$ -l$2$0$1$9$% -l$2$0$1$9$& -l$2$0$1$9$' -l$2$0$1$9$( -l$2$0$1$9$) -l$2$0$1$9$* -l$2$0$1$9$+ -l$2$0$1$9$, -l$2$0$1$9$- -l$2$0$1$9$. -l$2$0$1$9$/ -l$2$0$1$9$: -l$2$0$1$9$; -l$2$0$1$9$< -l$2$0$1$9$= -l$2$0$1$9$> -l$2$0$1$9$? -l$2$0$1$9$@ -l$2$0$1$9$[ -l$2$0$1$9$\ -l$2$0$1$9$] -l$2$0$1$9$^ -l$2$0$1$9$_ -l$2$0$1$9$` -l$2$0$1$9${ -l$2$0$1$9$| -l$2$0$1$9$} -l$2$0$1$9$~ -l$2$0$2$0$ -l$2$0$2$0$! -l$2$0$2$0$" -l$2$0$2$0$# -l$2$0$2$0$$ -l$2$0$2$0$% -l$2$0$2$0$& -l$2$0$2$0$' -l$2$0$2$0$( -l$2$0$2$0$) -l$2$0$2$0$* -l$2$0$2$0$+ -l$2$0$2$0$, -l$2$0$2$0$- -l$2$0$2$0$. -l$2$0$2$0$/ -l$2$0$2$0$: -l$2$0$2$0$; -l$2$0$2$0$< -l$2$0$2$0$= -l$2$0$2$0$> -l$2$0$2$0$? -l$2$0$2$0$@ -l$2$0$2$0$[ -l$2$0$2$0$\ -l$2$0$2$0$] -l$2$0$2$0$^ -l$2$0$2$0$_ -l$2$0$2$0$` -l$2$0$2$0${ -l$2$0$2$0$| -l$2$0$2$0$} -l$2$0$2$0$~ -l$2$0$2$1$ -l$2$0$2$1$! -l$2$0$2$1$" -l$2$0$2$1$# -l$2$0$2$1$$ -l$2$0$2$1$% -l$2$0$2$1$& -l$2$0$2$1$' -l$2$0$2$1$( -l$2$0$2$1$) -l$2$0$2$1$* -l$2$0$2$1$+ -l$2$0$2$1$, -l$2$0$2$1$- -l$2$0$2$1$. -l$2$0$2$1$/ -l$2$0$2$1$: -l$2$0$2$1$; -l$2$0$2$1$< -l$2$0$2$1$= -l$2$0$2$1$> -l$2$0$2$1$? -l$2$0$2$1$@ -l$2$0$2$1$[ -l$2$0$2$1$\ -l$2$0$2$1$] -l$2$0$2$1$^ -l$2$0$2$1$_ -l$2$0$2$1$` -l$2$0$2$1${ -l$2$0$2$1$| -l$2$0$2$1$} -l$2$0$2$1$~ -l$2$0$2$2$ -l$2$0$2$2$! -l$2$0$2$2$" -l$2$0$2$2$# -l$2$0$2$2$$ -l$2$0$2$2$% -l$2$0$2$2$& -l$2$0$2$2$' -l$2$0$2$2$( -l$2$0$2$2$) -l$2$0$2$2$* -l$2$0$2$2$+ -l$2$0$2$2$, -l$2$0$2$2$- -l$2$0$2$2$. -l$2$0$2$2$/ -l$2$0$2$2$: -l$2$0$2$2$; -l$2$0$2$2$< -l$2$0$2$2$= -l$2$0$2$2$> -l$2$0$2$2$? -l$2$0$2$2$@ -l$2$0$2$2$[ -l$2$0$2$2$\ -l$2$0$2$2$] -l$2$0$2$2$^ -l$2$0$2$2$_ -l$2$0$2$2$` -l$2$0$2$2${ -l$2$0$2$2$| -l$2$0$2$2$} -l$2$0$2$2$~ -l$2$0$2$3$ -l$2$0$2$3$! -l$2$0$2$3$" -l$2$0$2$3$# -l$2$0$2$3$$ -l$2$0$2$3$% -l$2$0$2$3$& -l$2$0$2$3$' -l$2$0$2$3$( -l$2$0$2$3$) -l$2$0$2$3$* -l$2$0$2$3$+ -l$2$0$2$3$, -l$2$0$2$3$- -l$2$0$2$3$. -l$2$0$2$3$/ -l$2$0$2$3$: -l$2$0$2$3$; -l$2$0$2$3$< -l$2$0$2$3$= -l$2$0$2$3$> -l$2$0$2$3$? -l$2$0$2$3$@ -l$2$0$2$3$[ -l$2$0$2$3$\ -l$2$0$2$3$] -l$2$0$2$3$^ -l$2$0$2$3$_ -l$2$0$2$3$` -l$2$0$2$3${ -l$2$0$2$3$| -l$2$0$2$3$} -l$2$0$2$3$~ -l$2$0$2$4$ -l$2$0$2$4$! -l$2$0$2$4$" -l$2$0$2$4$# -l$2$0$2$4$$ -l$2$0$2$4$% -l$2$0$2$4$& -l$2$0$2$4$' -l$2$0$2$4$( -l$2$0$2$4$) -l$2$0$2$4$* -l$2$0$2$4$+ -l$2$0$2$4$, -l$2$0$2$4$- -l$2$0$2$4$. -l$2$0$2$4$/ -l$2$0$2$4$: -l$2$0$2$4$; -l$2$0$2$4$< -l$2$0$2$4$= -l$2$0$2$4$> -l$2$0$2$4$? -l$2$0$2$4$@ -l$2$0$2$4$[ -l$2$0$2$4$\ -l$2$0$2$4$] -l$2$0$2$4$^ -l$2$0$2$4$_ -l$2$0$2$4$` -l$2$0$2$4${ -l$2$0$2$4$| -l$2$0$2$4$} -l$2$0$2$4$~ -l$2$0$2$5$ -l$2$0$2$5$! -l$2$0$2$5$" -l$2$0$2$5$# -l$2$0$2$5$$ -l$2$0$2$5$% -l$2$0$2$5$& -l$2$0$2$5$' -l$2$0$2$5$( -l$2$0$2$5$) -l$2$0$2$5$* -l$2$0$2$5$+ -l$2$0$2$5$, -l$2$0$2$5$- -l$2$0$2$5$. -l$2$0$2$5$/ -l$2$0$2$5$: -l$2$0$2$5$; -l$2$0$2$5$< -l$2$0$2$5$= -l$2$0$2$5$> -l$2$0$2$5$? -l$2$0$2$5$@ -l$2$0$2$5$[ -l$2$0$2$5$\ -l$2$0$2$5$] -l$2$0$2$5$^ -l$2$0$2$5$_ -l$2$0$2$5$` -l$2$0$2$5${ -l$2$0$2$5$| -l$2$0$2$5$} -l$2$0$2$5$~ -l$2$0$2$6$ -l$2$0$2$6$! -l$2$0$2$6$" -l$2$0$2$6$# -l$2$0$2$6$$ -l$2$0$2$6$% -l$2$0$2$6$& -l$2$0$2$6$' -l$2$0$2$6$( -l$2$0$2$6$) -l$2$0$2$6$* -l$2$0$2$6$+ -l$2$0$2$6$, -l$2$0$2$6$- -l$2$0$2$6$. -l$2$0$2$6$/ -l$2$0$2$6$: -l$2$0$2$6$; -l$2$0$2$6$< -l$2$0$2$6$= -l$2$0$2$6$> -l$2$0$2$6$? -l$2$0$2$6$@ -l$2$0$2$6$[ -l$2$0$2$6$\ -l$2$0$2$6$] -l$2$0$2$6$^ -l$2$0$2$6$_ -l$2$0$2$6$` -l$2$0$2$6${ -l$2$0$2$6$| -l$2$0$2$6$} -l$2$0$2$6$~ -l$2$0$2$7$ -l$2$0$2$7$! -l$2$0$2$7$" -l$2$0$2$7$# -l$2$0$2$7$$ -l$2$0$2$7$% -l$2$0$2$7$& -l$2$0$2$7$' -l$2$0$2$7$( -l$2$0$2$7$) -l$2$0$2$7$* -l$2$0$2$7$+ -l$2$0$2$7$, -l$2$0$2$7$- -l$2$0$2$7$. -l$2$0$2$7$/ -l$2$0$2$7$: -l$2$0$2$7$; -l$2$0$2$7$< -l$2$0$2$7$= -l$2$0$2$7$> -l$2$0$2$7$? -l$2$0$2$7$@ -l$2$0$2$7$[ -l$2$0$2$7$\ -l$2$0$2$7$] -l$2$0$2$7$^ -l$2$0$2$7$_ -l$2$0$2$7$` -l$2$0$2$7${ -l$2$0$2$7$| -l$2$0$2$7$} -l$2$0$2$7$~ -l$2$0$2$8$ -l$2$0$2$8$! -l$2$0$2$8$" -l$2$0$2$8$# -l$2$0$2$8$$ -l$2$0$2$8$% -l$2$0$2$8$& -l$2$0$2$8$' -l$2$0$2$8$( -l$2$0$2$8$) -l$2$0$2$8$* -l$2$0$2$8$+ -l$2$0$2$8$, -l$2$0$2$8$- -l$2$0$2$8$. -l$2$0$2$8$/ -l$2$0$2$8$: -l$2$0$2$8$; -l$2$0$2$8$< -l$2$0$2$8$= -l$2$0$2$8$> -l$2$0$2$8$? -l$2$0$2$8$@ -l$2$0$2$8$[ -l$2$0$2$8$\ -l$2$0$2$8$] -l$2$0$2$8$^ -l$2$0$2$8$_ -l$2$0$2$8$` -l$2$0$2$8${ -l$2$0$2$8$| -l$2$0$2$8$} -l$2$0$2$8$~ -l$2$0$2$9$ -l$2$0$2$9$! -l$2$0$2$9$" -l$2$0$2$9$# -l$2$0$2$9$$ -l$2$0$2$9$% -l$2$0$2$9$& -l$2$0$2$9$' -l$2$0$2$9$( -l$2$0$2$9$) -l$2$0$2$9$* -l$2$0$2$9$+ -l$2$0$2$9$, -l$2$0$2$9$- -l$2$0$2$9$. -l$2$0$2$9$/ -l$2$0$2$9$: -l$2$0$2$9$; -l$2$0$2$9$< -l$2$0$2$9$= -l$2$0$2$9$> -l$2$0$2$9$? -l$2$0$2$9$@ -l$2$0$2$9$[ -l$2$0$2$9$\ -l$2$0$2$9$] -l$2$0$2$9$^ -l$2$0$2$9$_ -l$2$0$2$9$` -l$2$0$2$9${ -l$2$0$2$9$| -l$2$0$2$9$} -l$2$0$2$9$~ -l$2$0$3$0$ -l$2$0$3$0$! -l$2$0$3$0$" -l$2$0$3$0$# -l$2$0$3$0$$ -l$2$0$3$0$% -l$2$0$3$0$& -l$2$0$3$0$' -l$2$0$3$0$( -l$2$0$3$0$) -l$2$0$3$0$* -l$2$0$3$0$+ -l$2$0$3$0$, -l$2$0$3$0$- -l$2$0$3$0$. -l$2$0$3$0$/ -l$2$0$3$0$: -l$2$0$3$0$; -l$2$0$3$0$< -l$2$0$3$0$= -l$2$0$3$0$> -l$2$0$3$0$? -l$2$0$3$0$@ -l$2$0$3$0$[ -l$2$0$3$0$\ -l$2$0$3$0$] -l$2$0$3$0$^ -l$2$0$3$0$_ -l$2$0$3$0$` -l$2$0$3$0${ -l$2$0$3$0$| -l$2$0$3$0$} -l$2$0$3$0$~ -l$2$0$3$1$ -l$2$0$3$1$! -l$2$0$3$1$" -l$2$0$3$1$# -l$2$0$3$1$$ -l$2$0$3$1$% -l$2$0$3$1$& -l$2$0$3$1$' -l$2$0$3$1$( -l$2$0$3$1$) -l$2$0$3$1$* -l$2$0$3$1$+ -l$2$0$3$1$, -l$2$0$3$1$- -l$2$0$3$1$. -l$2$0$3$1$/ -l$2$0$3$1$: -l$2$0$3$1$; -l$2$0$3$1$< -l$2$0$3$1$= -l$2$0$3$1$> -l$2$0$3$1$? -l$2$0$3$1$@ -l$2$0$3$1$[ -l$2$0$3$1$\ -l$2$0$3$1$] -l$2$0$3$1$^ -l$2$0$3$1$_ -l$2$0$3$1$` -l$2$0$3$1${ -l$2$0$3$1$| -l$2$0$3$1$} -l$2$0$3$1$~ -l$2$0$3$2$ -l$2$0$3$2$! -l$2$0$3$2$" -l$2$0$3$2$# -l$2$0$3$2$$ -l$2$0$3$2$% -l$2$0$3$2$& -l$2$0$3$2$' -l$2$0$3$2$( -l$2$0$3$2$) -l$2$0$3$2$* -l$2$0$3$2$+ -l$2$0$3$2$, -l$2$0$3$2$- -l$2$0$3$2$. -l$2$0$3$2$/ -l$2$0$3$2$: -l$2$0$3$2$; -l$2$0$3$2$< -l$2$0$3$2$= -l$2$0$3$2$> -l$2$0$3$2$? -l$2$0$3$2$@ -l$2$0$3$2$[ -l$2$0$3$2$\ -l$2$0$3$2$] -l$2$0$3$2$^ -l$2$0$3$2$_ -l$2$0$3$2$` -l$2$0$3$2${ -l$2$0$3$2$| -l$2$0$3$2$} -l$2$0$3$2$~ -l$2$0$3$3$ -l$2$0$3$3$! -l$2$0$3$3$" -l$2$0$3$3$# -l$2$0$3$3$$ -l$2$0$3$3$% -l$2$0$3$3$& -l$2$0$3$3$' -l$2$0$3$3$( -l$2$0$3$3$) -l$2$0$3$3$* -l$2$0$3$3$+ -l$2$0$3$3$, -l$2$0$3$3$- -l$2$0$3$3$. -l$2$0$3$3$/ -l$2$0$3$3$: -l$2$0$3$3$; -l$2$0$3$3$< -l$2$0$3$3$= -l$2$0$3$3$> -l$2$0$3$3$? -l$2$0$3$3$@ -l$2$0$3$3$[ -l$2$0$3$3$\ -l$2$0$3$3$] -l$2$0$3$3$^ -l$2$0$3$3$_ -l$2$0$3$3$` -l$2$0$3$3${ -l$2$0$3$3$| -l$2$0$3$3$} -l$2$0$3$3$~ -l$2$0$3$4$ -l$2$0$3$4$! -l$2$0$3$4$" -l$2$0$3$4$# -l$2$0$3$4$$ -l$2$0$3$4$% -l$2$0$3$4$& -l$2$0$3$4$' -l$2$0$3$4$( -l$2$0$3$4$) -l$2$0$3$4$* -l$2$0$3$4$+ -l$2$0$3$4$, -l$2$0$3$4$- -l$2$0$3$4$. -l$2$0$3$4$/ -l$2$0$3$4$: -l$2$0$3$4$; -l$2$0$3$4$< -l$2$0$3$4$= -l$2$0$3$4$> -l$2$0$3$4$? -l$2$0$3$4$@ -l$2$0$3$4$[ -l$2$0$3$4$\ -l$2$0$3$4$] -l$2$0$3$4$^ -l$2$0$3$4$_ -l$2$0$3$4$` -l$2$0$3$4${ -l$2$0$3$4$| -l$2$0$3$4$} -l$2$0$3$4$~ -l$2$0$3$5$ -l$2$0$3$5$! -l$2$0$3$5$" -l$2$0$3$5$# -l$2$0$3$5$$ -l$2$0$3$5$% -l$2$0$3$5$& -l$2$0$3$5$' -l$2$0$3$5$( -l$2$0$3$5$) -l$2$0$3$5$* -l$2$0$3$5$+ -l$2$0$3$5$, -l$2$0$3$5$- -l$2$0$3$5$. -l$2$0$3$5$/ -l$2$0$3$5$: -l$2$0$3$5$; -l$2$0$3$5$< -l$2$0$3$5$= -l$2$0$3$5$> -l$2$0$3$5$? -l$2$0$3$5$@ -l$2$0$3$5$[ -l$2$0$3$5$\ -l$2$0$3$5$] -l$2$0$3$5$^ -l$2$0$3$5$_ -l$2$0$3$5$` -l$2$0$3$5${ -l$2$0$3$5$| -l$2$0$3$5$} -l$2$0$3$5$~ -l$2$0$3$6$ -l$2$0$3$6$! -l$2$0$3$6$" -l$2$0$3$6$# -l$2$0$3$6$$ -l$2$0$3$6$% -l$2$0$3$6$& -l$2$0$3$6$' -l$2$0$3$6$( -l$2$0$3$6$) -l$2$0$3$6$* -l$2$0$3$6$+ -l$2$0$3$6$, -l$2$0$3$6$- -l$2$0$3$6$. -l$2$0$3$6$/ -l$2$0$3$6$: -l$2$0$3$6$; -l$2$0$3$6$< -l$2$0$3$6$= -l$2$0$3$6$> -l$2$0$3$6$? -l$2$0$3$6$@ -l$2$0$3$6$[ -l$2$0$3$6$\ -l$2$0$3$6$] -l$2$0$3$6$^ -l$2$0$3$6$_ -l$2$0$3$6$` -l$2$0$3$6${ -l$2$0$3$6$| -l$2$0$3$6$} -l$2$0$3$6$~ -l$2$0$3$7$ -l$2$0$3$7$! -l$2$0$3$7$" -l$2$0$3$7$# -l$2$0$3$7$$ -l$2$0$3$7$% -l$2$0$3$7$& -l$2$0$3$7$' -l$2$0$3$7$( -l$2$0$3$7$) -l$2$0$3$7$* -l$2$0$3$7$+ -l$2$0$3$7$, -l$2$0$3$7$- -l$2$0$3$7$. -l$2$0$3$7$/ -l$2$0$3$7$: -l$2$0$3$7$; -l$2$0$3$7$< -l$2$0$3$7$= -l$2$0$3$7$> -l$2$0$3$7$? -l$2$0$3$7$@ -l$2$0$3$7$[ -l$2$0$3$7$\ -l$2$0$3$7$] -l$2$0$3$7$^ -l$2$0$3$7$_ -l$2$0$3$7$` -l$2$0$3$7${ -l$2$0$3$7$| -l$2$0$3$7$} -l$2$0$3$7$~ -l$2$0$3$8$ -l$2$0$3$8$! -l$2$0$3$8$" -l$2$0$3$8$# -l$2$0$3$8$$ -l$2$0$3$8$% -l$2$0$3$8$& -l$2$0$3$8$' -l$2$0$3$8$( -l$2$0$3$8$) -l$2$0$3$8$* -l$2$0$3$8$+ -l$2$0$3$8$, -l$2$0$3$8$- -l$2$0$3$8$. -l$2$0$3$8$/ -l$2$0$3$8$: -l$2$0$3$8$; -l$2$0$3$8$< -l$2$0$3$8$= -l$2$0$3$8$> -l$2$0$3$8$? -l$2$0$3$8$@ -l$2$0$3$8$[ -l$2$0$3$8$\ -l$2$0$3$8$] -l$2$0$3$8$^ -l$2$0$3$8$_ -l$2$0$3$8$` -l$2$0$3$8${ -l$2$0$3$8$| -l$2$0$3$8$} -l$2$0$3$8$~ -l$2$0$3$9$ -l$2$0$3$9$! -l$2$0$3$9$" -l$2$0$3$9$# -l$2$0$3$9$$ -l$2$0$3$9$% -l$2$0$3$9$& -l$2$0$3$9$' -l$2$0$3$9$( -l$2$0$3$9$) -l$2$0$3$9$* -l$2$0$3$9$+ -l$2$0$3$9$, -l$2$0$3$9$- -l$2$0$3$9$. -l$2$0$3$9$/ -l$2$0$3$9$: -l$2$0$3$9$; -l$2$0$3$9$< -l$2$0$3$9$= -l$2$0$3$9$> -l$2$0$3$9$? -l$2$0$3$9$@ -l$2$0$3$9$[ -l$2$0$3$9$\ -l$2$0$3$9$] -l$2$0$3$9$^ -l$2$0$3$9$_ -l$2$0$3$9$` -l$2$0$3$9${ -l$2$0$3$9$| -l$2$0$3$9$} -l$2$0$3$9$~ -l$2$0$4$0$ -l$2$0$4$0$! -l$2$0$4$0$" -l$2$0$4$0$# -l$2$0$4$0$$ -l$2$0$4$0$% -l$2$0$4$0$& -l$2$0$4$0$' -l$2$0$4$0$( -l$2$0$4$0$) -l$2$0$4$0$* -l$2$0$4$0$+ -l$2$0$4$0$, -l$2$0$4$0$- -l$2$0$4$0$. -l$2$0$4$0$/ -l$2$0$4$0$: -l$2$0$4$0$; -l$2$0$4$0$< -l$2$0$4$0$= -l$2$0$4$0$> -l$2$0$4$0$? -l$2$0$4$0$@ -l$2$0$4$0$[ -l$2$0$4$0$\ -l$2$0$4$0$] -l$2$0$4$0$^ -l$2$0$4$0$_ -l$2$0$4$0$` -l$2$0$4$0${ -l$2$0$4$0$| -l$2$0$4$0$} -l$2$0$4$0$~ -l$2$0$4$1$ -l$2$0$4$1$! -l$2$0$4$1$" -l$2$0$4$1$# -l$2$0$4$1$$ -l$2$0$4$1$% -l$2$0$4$1$& -l$2$0$4$1$' -l$2$0$4$1$( -l$2$0$4$1$) -l$2$0$4$1$* -l$2$0$4$1$+ -l$2$0$4$1$, -l$2$0$4$1$- -l$2$0$4$1$. -l$2$0$4$1$/ -l$2$0$4$1$: -l$2$0$4$1$; -l$2$0$4$1$< -l$2$0$4$1$= -l$2$0$4$1$> -l$2$0$4$1$? -l$2$0$4$1$@ -l$2$0$4$1$[ -l$2$0$4$1$\ -l$2$0$4$1$] -l$2$0$4$1$^ -l$2$0$4$1$_ -l$2$0$4$1$` -l$2$0$4$1${ -l$2$0$4$1$| -l$2$0$4$1$} -l$2$0$4$1$~ -l$2$0$4$2$ -l$2$0$4$2$! -l$2$0$4$2$" -l$2$0$4$2$# -l$2$0$4$2$$ -l$2$0$4$2$% -l$2$0$4$2$& -l$2$0$4$2$' -l$2$0$4$2$( -l$2$0$4$2$) -l$2$0$4$2$* -l$2$0$4$2$+ -l$2$0$4$2$, -l$2$0$4$2$- -l$2$0$4$2$. -l$2$0$4$2$/ -l$2$0$4$2$: -l$2$0$4$2$; -l$2$0$4$2$< -l$2$0$4$2$= -l$2$0$4$2$> -l$2$0$4$2$? -l$2$0$4$2$@ -l$2$0$4$2$[ -l$2$0$4$2$\ -l$2$0$4$2$] -l$2$0$4$2$^ -l$2$0$4$2$_ -l$2$0$4$2$` -l$2$0$4$2${ -l$2$0$4$2$| -l$2$0$4$2$} -l$2$0$4$2$~ -l$2$0$4$3$ -l$2$0$4$3$! -l$2$0$4$3$" -l$2$0$4$3$# -l$2$0$4$3$$ -l$2$0$4$3$% -l$2$0$4$3$& -l$2$0$4$3$' -l$2$0$4$3$( -l$2$0$4$3$) -l$2$0$4$3$* -l$2$0$4$3$+ -l$2$0$4$3$, -l$2$0$4$3$- -l$2$0$4$3$. -l$2$0$4$3$/ -l$2$0$4$3$: -l$2$0$4$3$; -l$2$0$4$3$< -l$2$0$4$3$= -l$2$0$4$3$> -l$2$0$4$3$? -l$2$0$4$3$@ -l$2$0$4$3$[ -l$2$0$4$3$\ -l$2$0$4$3$] -l$2$0$4$3$^ -l$2$0$4$3$_ -l$2$0$4$3$` -l$2$0$4$3${ -l$2$0$4$3$| -l$2$0$4$3$} -l$2$0$4$3$~ -l$2$0$4$4$ -l$2$0$4$4$! -l$2$0$4$4$" -l$2$0$4$4$# -l$2$0$4$4$$ -l$2$0$4$4$% -l$2$0$4$4$& -l$2$0$4$4$' -l$2$0$4$4$( -l$2$0$4$4$) -l$2$0$4$4$* -l$2$0$4$4$+ -l$2$0$4$4$, -l$2$0$4$4$- -l$2$0$4$4$. -l$2$0$4$4$/ -l$2$0$4$4$: -l$2$0$4$4$; -l$2$0$4$4$< -l$2$0$4$4$= -l$2$0$4$4$> -l$2$0$4$4$? -l$2$0$4$4$@ -l$2$0$4$4$[ -l$2$0$4$4$\ -l$2$0$4$4$] -l$2$0$4$4$^ -l$2$0$4$4$_ -l$2$0$4$4$` -l$2$0$4$4${ -l$2$0$4$4$| -l$2$0$4$4$} -l$2$0$4$4$~ -l$2$0$4$5$ -l$2$0$4$5$! -l$2$0$4$5$" -l$2$0$4$5$# -l$2$0$4$5$$ -l$2$0$4$5$% -l$2$0$4$5$& -l$2$0$4$5$' -l$2$0$4$5$( -l$2$0$4$5$) -l$2$0$4$5$* -l$2$0$4$5$+ -l$2$0$4$5$, -l$2$0$4$5$- -l$2$0$4$5$. -l$2$0$4$5$/ -l$2$0$4$5$: -l$2$0$4$5$; -l$2$0$4$5$< -l$2$0$4$5$= -l$2$0$4$5$> -l$2$0$4$5$? -l$2$0$4$5$@ -l$2$0$4$5$[ -l$2$0$4$5$\ -l$2$0$4$5$] -l$2$0$4$5$^ -l$2$0$4$5$_ -l$2$0$4$5$` -l$2$0$4$5${ -l$2$0$4$5$| -l$2$0$4$5$} -l$2$0$4$5$~ -l$2$0$4$6$ -l$2$0$4$6$! -l$2$0$4$6$" -l$2$0$4$6$# -l$2$0$4$6$$ -l$2$0$4$6$% -l$2$0$4$6$& -l$2$0$4$6$' -l$2$0$4$6$( -l$2$0$4$6$) -l$2$0$4$6$* -l$2$0$4$6$+ -l$2$0$4$6$, -l$2$0$4$6$- -l$2$0$4$6$. -l$2$0$4$6$/ -l$2$0$4$6$: -l$2$0$4$6$; -l$2$0$4$6$< -l$2$0$4$6$= -l$2$0$4$6$> -l$2$0$4$6$? -l$2$0$4$6$@ -l$2$0$4$6$[ -l$2$0$4$6$\ -l$2$0$4$6$] -l$2$0$4$6$^ -l$2$0$4$6$_ -l$2$0$4$6$` -l$2$0$4$6${ -l$2$0$4$6$| -l$2$0$4$6$} -l$2$0$4$6$~ -l$2$0$4$7$ -l$2$0$4$7$! -l$2$0$4$7$" -l$2$0$4$7$# -l$2$0$4$7$$ -l$2$0$4$7$% -l$2$0$4$7$& -l$2$0$4$7$' -l$2$0$4$7$( -l$2$0$4$7$) -l$2$0$4$7$* -l$2$0$4$7$+ -l$2$0$4$7$, -l$2$0$4$7$- -l$2$0$4$7$. -l$2$0$4$7$/ -l$2$0$4$7$: -l$2$0$4$7$; -l$2$0$4$7$< -l$2$0$4$7$= -l$2$0$4$7$> -l$2$0$4$7$? -l$2$0$4$7$@ -l$2$0$4$7$[ -l$2$0$4$7$\ -l$2$0$4$7$] -l$2$0$4$7$^ -l$2$0$4$7$_ -l$2$0$4$7$` -l$2$0$4$7${ -l$2$0$4$7$| -l$2$0$4$7$} -l$2$0$4$7$~ -l$2$0$4$8$ -l$2$0$4$8$! -l$2$0$4$8$" -l$2$0$4$8$# -l$2$0$4$8$$ -l$2$0$4$8$% -l$2$0$4$8$& -l$2$0$4$8$' -l$2$0$4$8$( -l$2$0$4$8$) -l$2$0$4$8$* -l$2$0$4$8$+ -l$2$0$4$8$, -l$2$0$4$8$- -l$2$0$4$8$. -l$2$0$4$8$/ -l$2$0$4$8$: -l$2$0$4$8$; -l$2$0$4$8$< -l$2$0$4$8$= -l$2$0$4$8$> -l$2$0$4$8$? -l$2$0$4$8$@ -l$2$0$4$8$[ -l$2$0$4$8$\ -l$2$0$4$8$] -l$2$0$4$8$^ -l$2$0$4$8$_ -l$2$0$4$8$` -l$2$0$4$8${ -l$2$0$4$8$| -l$2$0$4$8$} -l$2$0$4$8$~ -l$2$0$4$9$ -l$2$0$4$9$! -l$2$0$4$9$" -l$2$0$4$9$# -l$2$0$4$9$$ -l$2$0$4$9$% -l$2$0$4$9$& -l$2$0$4$9$' -l$2$0$4$9$( -l$2$0$4$9$) -l$2$0$4$9$* -l$2$0$4$9$+ -l$2$0$4$9$, -l$2$0$4$9$- -l$2$0$4$9$. -l$2$0$4$9$/ -l$2$0$4$9$: -l$2$0$4$9$; -l$2$0$4$9$< -l$2$0$4$9$= -l$2$0$4$9$> -l$2$0$4$9$? -l$2$0$4$9$@ -l$2$0$4$9$[ -l$2$0$4$9$\ -l$2$0$4$9$] -l$2$0$4$9$^ -l$2$0$4$9$_ -l$2$0$4$9$` -l$2$0$4$9${ -l$2$0$4$9$| -l$2$0$4$9$} -l$2$0$4$9$~ -l$2$1 -l$2$2 -l$2$3 -l$2$4 -l$2$5 -l$2$6 -l$2$7 -l$2$8 -l$2$9 -l$3 -l$3$0 -l$3$1 -l$3$2 -l$3$3 -l$3$4 -l$3$5 -l$3$6 -l$3$7 -l$3$8 -l$3$9 -l$4 -l$4$0 -l$4$1 -l$4$2 -l$4$3 -l$4$4 -l$4$5 -l$4$6 -l$4$7 -l$4$8 -l$4$9 -l$5 -l$5$0 -l$5$1 -l$5$2 -l$5$3 -l$5$4 -l$5$5 -l$5$6 -l$5$7 -l$5$8 -l$5$9 -l$6 -l$6$0 -l$6$1 -l$6$2 -l$6$3 -l$6$4 -l$6$5 -l$6$6 -l$6$7 -l$6$8 -l$6$9 -l$7 -l$7$0 -l$7$1 -l$7$2 -l$7$3 -l$7$4 -l$7$5 -l$7$6 -l$7$7 -l$7$8 -l$7$9 -l$8 -l$8$0 -l$8$1 -l$8$2 -l$8$3 -l$8$4 -l$8$5 -l$8$6 -l$8$7 -l$8$8 -l$8$9 -l$9 -l$9$0 -l$9$1 -l$9$2 -l$9$3 -l$9$4 -l$9$5 -l$9$6 -l$9$7 -l$9$8 -l$9$9 -l$@$a$m$e$l$e$.$c$o$m -l$@$a$o$l$.$c$o$m -l$@$c$o$m$c$a$s$t$.$n$e$t -l$@$c$o$x$.$n$e$t -l$@$f$a$s$t$m$a$i$l$.$f$m -l$@$g$a$w$a$b$.$c$o$m -l$@$g$m$a$i$l$.$c$o$m -l$@$g$m$x$.$c$o$m -l$@$g$m$x$.$u$s -l$@$h$o$t$m$a$i$l$.$c$o$m -l$@$i$n$b$o$x$.$r$u -l$@$l$i$v$e$.$c$o$.$u$k -l$@$l$i$v$e$.$c$o$m -l$@$m$a$i$l$.$c$o$m -l$@$m$a$i$l$.$r$u -l$@$m$s$n$.$c$o$m -l$@$v$e$r$i$z$o$n$.$n$e$t -l$@$w$p$.$p$l -l$@$y$a$h$o$o$.$c$a -l$@$y$a$h$o$o$.$c$o$.$i$n -l$@$y$a$h$o$o$.$c$o$.$u$k -l$@$y$a$h$o$o$.$c$o$m -l$@$y$m$a$i$l$.$c$o$m -l$@$z$o$h$o$.$c$o$m -l$S -l$a -l$a$b$l$e -l$a$c$l$e -l$a$g$e -l$a$l -l$a$l$l$y -l$a$m -l$a$n -l$a$n$a -l$a$n$c$e -l$a$n$d -l$a$n$e -l$a$n$t -l$a$r$y -l$a$s$e -l$a$t$i$o$n -l$a$t$i$v$e -l$a$u$x -l$b -l$b$a$b$y -l$b$a$c$k -l$b$a$l$l -l$b$e$l$l -l$b$o$o$k -l$b$o$y -l$b$r$o$w$n -l$c -l$c$y -l$d -l$d$a$v$i$d -l$d$a$y -l$d$o$m$e -l$e -l$e$a$u -l$e$d -l$e$e -l$e$l$l$a -l$e$n -l$e$n$c$e -l$e$n$t -l$e$o$u$s -l$e$r -l$e$r$y -l$e$s -l$e$s$s -l$e$s$t -l$e$t -l$e$t$t$e -l$f -l$f$a$r$m$v$i$l$l$e -l$f$o$r$m -l$f$u$l -l$f$u$l$l$y -l$g -l$g$e$n$y -l$h -l$h$e$a$d -l$h$o$o$d -l$i -l$i$a$l -l$i$a$n -l$i$b$l$e -l$i$c -l$i$c$e$s -l$i$c$l$e -l$i$d$e -l$i$e$r -l$i$e$s -l$i$e$s$t -l$i$f$y -l$i$l$e -l$i$l$i$a -l$i$l$y -l$i$n$e -l$i$n$g -l$i$o$n -l$i$o$u$s -l$i$s$e -l$i$s$h -l$i$s$m -l$i$s$t -l$i$t$e -l$i$t$i$c -l$i$t$i$o$n -l$i$t$i$v$e -l$i$t$y -l$i$v$e -l$i$x -l$i$z$e -l$j -l$j$o$h$n -l$j$o$h$n$s$o$n -l$j$o$n$e$s -l$k -l$k$h$a$n -l$k$i$n -l$l -l$l$a$n$d -l$l$e$e -l$l$e$s$s -l$l$e$t -l$l$i$k$e -l$l$i$n$e -l$l$i$n$g -l$l$o$n$g -l$l$o$o$p -l$l$y -l$m -l$m$a$n -l$m$e$n -l$m$e$n$t -l$m$i$c$h$a$e$l -l$m$i$k$e -l$n -l$n$e$s$s -l$o -l$o$e$s -l$o$i$d -l$o$l -l$o$l$o$g$y -l$o$m$y -l$o$n -l$o$r -l$o$r$y -l$o$s$e -l$o$u$r -l$o$u$s -l$o$u$t -l$o$v$e$r -l$p -l$p$a$s$s -l$p$h$p$b$b -l$q -l$q$w$e$r$t$y -l$r -l$r$o$o$m -l$s -l$s$a$l$a$s$a$n$a -l$s$e$r$v$e$r -l$s$e$s -l$s$e$x$y -l$s$h -l$s$h$i$p -l$s$i$d$e -l$s$i$o$n -l$s$i$s -l$s$m$i$t$h -l$s$o$m$e -l$t -l$t$e$s$t -l$t$h$e -l$t$i$o$n -l$t$y -l$u -l$u$m -l$u$p -l$v -l$w -l$w$a$y -l$w$i$s$e -l$w$o$o$d -l$x -l$y -l$z -l$~$!$@$#$$ -l'5 -lT1 -lZ3Y2$4x54'6 -l[^A -l[^B -l[^C -l[^D -l[^E -l[^F -l[^G -l[^H -l[^I -l[^J -l[^K -l[^L -l[^M -l[^N -l[^O -l[^P -l[^Q -l[^R -l[^S -l[^T -l[^U -l[^V -l[^W -l[^X -l[^Y -l[^Z -l[^a -l[^b -l[^c -l[^d -l[^f -l[^g -l[^h -l[^i -l[^j -l[^k -l[^l -l[^m -l[^n -l[^o -l[^p -l[^q -l[^r -l[^s -l[^t -l[^u -l[^v -l[^w -l[^x -l[^y -l[^z -l]$A -l]$B -l]$C -l]$D -l]$E -l]$F -l]$G -l]$H -l]$I -l]$J -l]$K -l]$L -l]$M -l]$N -l]$O -l]$P -l]$Q -l]$R -l]$S -l]$T -l]$U -l]$V -l]$W -l]$X -l]$Y -l]$Z -l]$a -l]$b -l]$c -l]$d -l]$e -l]$e$d -l]$e$s -l]$f -l]$g -l]$h -l]$i -l]$i$n$g -l]$j -l]$k -l]$l -l]$m -l]$n -l]$o -l]$p -l]$q -l]$r -l]$s -l]$t -l]$u -l]$v -l]$w -l]$x -l]$y -l]$z -l^ ^I -l^ ^a -l^ ^a^ ^m^i -l^ ^d^n^a^s -l^ ^e^h^t -l^ ^e^r^a^ ^e^w -l^ ^e^r^a^ ^u^o^y -l^ ^e^r^a^ ^y^e^h^t -l^ ^e^v^a^h^ ^i -l^ ^i -l^ ^l^l^i^m -l^ ^m^'^I -l^ ^m^'^i -l^ ^m^a^ ^i -l^ ^p^o^t -l^ ^r^ ^e^w -l^ ^r^ ^u^o^y -l^ ^r^ ^y^e^h^t -l^ ^s^i^ ^e^h -l^ ^s^i^ ^e^h^s -l^ ^s^i^ ^s^i^h^t -l^ ^s^i^ ^t^i -l^ ^t^'^n^o^d^ ^i -l^ ^t^n^o^d^ ^i -l^ ^t^o^n^ ^m^a^ ^i -l^ ^u -l^ ^u^o^y^ -l^ ^y^m -l^! -l^-^i^m^e^s -l^-^n^o^n -l^-^r^e^p^y^h -l^-^r^e^v^o -l^-^s^i^m -l^-^t^n^a -l^-^x^e -l^0^0^0^2 -l^0^1^0^2 -l^0^2^0^2 -l^0^3^0^2 -l^0^4^0^2 -l^0^4^9^1 -l^0^5^9^1 -l^0^6^9^1 -l^0^7^9^1 -l^0^8^9^1 -l^0^9^9^1 -l^1 -l^1^0^0^2 -l^1^1^0^2 -l^1^2^0^2 -l^1^2^3 -l^1^3^0^2 -l^1^4^0^2 -l^1^4^9^1 -l^1^5^9^1 -l^1^6^9^1 -l^1^7^9^1 -l^1^8^9^1 -l^1^9^9^1 -l^2^0^0^2 -l^2^1^0^2 -l^2^2^0^2 -l^2^3^0^2 -l^2^4^0^2 -l^2^4^9^1 -l^2^5^9^1 -l^2^6^9^1 -l^2^7^9^1 -l^2^8^9^1 -l^2^9^9^1 -l^3^0^0^2 -l^3^1^0^2 -l^3^2^0^2 -l^3^2^1 -l^3^3^0^2 -l^3^4^0^2 -l^3^4^9^1 -l^3^5^9^1 -l^3^6^9^1 -l^3^7^9^1 -l^3^8^9^1 -l^3^9^9^1 -l^4^0^0^2 -l^4^1^0^2 -l^4^2^0^2 -l^4^3^0^2 -l^4^4^0^2 -l^4^4^9^1 -l^4^5^9^1 -l^4^6^9^1 -l^4^7^9^1 -l^4^8^9^1 -l^4^9^9^1 -l^5^0^0^2 -l^5^1^0^2 -l^5^2^0^2 -l^5^3^0^2 -l^5^4^0^2 -l^5^4^9^1 -l^5^5^9^1 -l^5^6^9^1 -l^5^7^9^1 -l^5^8^9^1 -l^5^9^9^1 -l^6^0^0^2 -l^6^1^0^2 -l^6^2^0^2 -l^6^3^0^2 -l^6^4^0^2 -l^6^4^9^1 -l^6^5^9^1 -l^6^6^9^1 -l^6^7^9^1 -l^6^8^9^1 -l^6^9^9^1 -l^7^0^0^2 -l^7^1^0^2 -l^7^2^0^2 -l^7^3^0^2 -l^7^4^0^2 -l^7^4^9^1 -l^7^5^9^1 -l^7^6^9^1 -l^7^7^9^1 -l^7^8^9^1 -l^7^9^9^1 -l^8^0^0^2 -l^8^1^0^2 -l^8^2^0^2 -l^8^3^0^2 -l^8^4^0^2 -l^8^4^9^1 -l^8^5^9^1 -l^8^6^9^1 -l^8^7^9^1 -l^8^8^9^1 -l^8^9^9^1 -l^9^0^0^2 -l^9^1^0^2 -l^9^2^0^2 -l^9^3^0^2 -l^9^4^0^2 -l^9^4^9^1 -l^9^5^9^1 -l^9^6^9^1 -l^9^7^9^1 -l^9^8^9^1 -l^9^9^9^1 -l^@ -l^a^e^s -l^a^e^t -l^a^g^e^m -l^a^i^d -l^a^n^a -l^a^r^t^l^u -l^b^b^p^h^p]]]] -l^b^o -l^b^u^s -l^c^c^a -l^d^a^b -l^d^a^e^d -l^d^a^e^h -l^d^a^e^l -l^d^d^a -l^d^e^b -l^d^e^e^s -l^d^e^r -l^d^i^m -l^d^l^o^g -l^d^n^a^b -l^d^n^a^h -l^d^n^a^l -l^d^n^i^h -l^d^n^i^w -l^d^o^o^g -l^d^o^o^w -l^d^r^a^h -l^d^r^o^c -l^d^r^o^w^s^s^a^p -l^d^u^m -l^e^b -l^e^c^a^f -l^e^c^a^l -l^e^c^i -l^e^c^i^v -l^e^d -l^e^d^i^s -l^e^e^n^k -l^e^e^r^f -l^e^l^e^t -l^e^n^i^l -l^e^n^o^t^s -l^e^r -l^e^r^i^f -l^e^r^o^f -l^e^r^p -l^e^s^o^n -l^e^t^n^a -l^e^v^a^h^i -l^e^y^e -l^f^f^o -l^f^l^a^h -l^f^l^e^s -l^g^e^l -l^g^i^p -l^g^n^i^k -l^g^n^i^r -l^g^n^i^w -l^g^n^o^l -l^g^o^d -l^g^o^l -l^h^c^r^a -l^h^g^i^h -l^h^s^a -l^h^s^a^w -l^h^s^i^f -l^h^t^a^b -l^h^t^r^a^e -l^i -l^i^b -l^i^l^e^h -l^i^m^e^d -l^i^m^e^s -l^i^n^i^m -l^i^n^m^o -l^i^p^e -l^i^r^t -l^i^t^l^u^m -l^i^t^n^a -l^i^x^a^m -l^k^c^a^b -l^k^l^i^m -l^k^n^i -l^k^o^o^b -l^k^r^o^w -l^l^a^m -l^l^a^o^c -l^l^i -l^l^i^a^j -l^l^i^a^r -l^l^i^a^s -l^l^i^a^t -l^l^i^o -l^l^l^a^f -l^l^l^i -l^l^l^i^p -l^l^l^o^r -l^l^o^o^w -l^m^'^I -l^m^'^i -l^m^a^ ^i -l^m^e -l^m^i -l^m^o^c -l^m^r^a^f -l^m^r^o^w -l^m^u^g -l^n^a^m -l^n^e -l^n^e^p -l^n^i -l^n^i^m^d^a -l^n^i^p -l^n^i^t -l^n^o -l^n^o^c -l^n^o^n -l^n^o^o^m -l^n^r^o^c -l^n^u -l^n^u^g -l^n^u^s -l^n^w^o^d -l^o^c -l^o^d^u^e^s^p -l^o^e^n -l^o^i^b -l^o^l^i^k -l^o^l^l^a -l^o^n^o^m -l^o^o^z -l^o^p^y^h -l^o^r^c^a -l^o^r^c^a^m -l^o^r^c^i^m -l^o^r^e^a -l^o^r^p -l^o^r^y^g -l^o^s^i -l^o^t^c^e -l^o^t^u^a -l^p^m^a^c -l^p^u -l^r^a^e -l^r^a^e^b -l^r^a^o -l^r^a^p -l^r^a^w -l^r^e^d^n^u -l^r^e^p -l^r^e^p^u^s -l^r^e^p^y^h -l^r^e^t^a^w -l^r^e^t^f^a -l^r^e^t^n^i -l^r^e^t^n^u^o^c -l^r^e^v^o -l^r^i -l^r^i^a -l^r^i^a^h -l^r^o^f -l^r^o^o^d -l^r^o^t^a^r^t^s^i^n^i^m^d^a -l^r^u^s -l^s^i^d -l^s^i^h^t -l^s^i^m -l^s^n^a^r^t -l^s^s^a^p -l^s^s^o^r^c -l^s^y^d -l^t^a^b -l^t^a^c -l^t^a^f -l^t^a^h -l^t^a^o^b -l^t^a^r -l^t^c^a^l -l^t^e^j -l^t^f^o^s -l^t^h^g^i^n -l^t^n^e^c -l^t^o^h -l^t^o^n^k -l^t^o^o^b -l^t^o^o^f -l^t^o^p -l^t^p^e^h -l^t^s^o^p -l^t^u^c -l^t^u^o -l^u^e -l^w^a^j -l^w^a^s -l^w^e^n -l^w^o^b -l^w^o^c -l^w^o^l -l^w^o^n^s -l^w^o^t -l^x^a -l^x^a^t -l^x^e -l^x^o -l^y^a^d -l^y^a^d^i^r^f -l^y^a^d^n^o^m -l^y^a^d^n^u^s -l^y^a^d^r^u^t^a^s -l^y^a^d^s^e^n^d^e^w -l^y^a^d^s^r^u^h^t -l^y^a^d^s^u^e^t -l^y^a^l -l^y^a^l^p -l^y^a^p -l^y^a^w -l^y^b -l^y^e^k -l^y^k^s -l^y^l^o^p -l^y^m -li5s'6 -lx12 -lx23d -lx31ul -o0![^b +l $! +l $! $! +l $! $! $! +l $! $! $! $! +l $! $! $! $! $! +l $! $! $! $! $! $! +l $! $! $! $! $! $! $! +l $! $! $! $! $! $! $! $! +l $! $! $! $! $! $! $! $! $! +l $! $! $! $! $! $! $! $! $! $! +l $! $! $! $! $! $! $! $! $! $! $! +l $& $a $m $p $; +l $. $a $c +l $. $a $d +l $. $a $e +l $. $a $e $r $o +l $. $a $f +l $. $a $g +l $. $a $i +l $. $a $l +l $. $a $m +l $. $a $n +l $. $a $o +l $. $a $q +l $. $a $r +l $. $a $r $p $a +l $. $a $s +l $. $a $t +l $. $a $u +l $. $a $w +l $. $a $x +l $. $a $z +l $. $b $a +l $. $b $b +l $. $b $d +l $. $b $e +l $. $b $f +l $. $b $g +l $. $b $h +l $. $b $i +l $. $b $i $z +l $. $b $j +l $. $b $m +l $. $b $n +l $. $b $o +l $. $b $r +l $. $b $s +l $. $b $t +l $. $b $v +l $. $b $w +l $. $b $y +l $. $b $z +l $. $c $a +l $. $c $a $t +l $. $c $c +l $. $c $d +l $. $c $f +l $. $c $g +l $. $c $h +l $. $c $i +l $. $c $k +l $. $c $l +l $. $c $m +l $. $c $n +l $. $c $o +l $. $c $o $m +l $. $c $o $o $p +l $. $c $r +l $. $c $u +l $. $c $v +l $. $c $x +l $. $c $y +l $. $c $z +l $. $d $e +l $. $d $j +l $. $d $k +l $. $d $m +l $. $d $o +l $. $d $z +l $. $e $c +l $. $e $d $u +l $. $e $e +l $. $e $g +l $. $e $r +l $. $e $s +l $. $e $t +l $. $e $u +l $. $f $i +l $. $f $j +l $. $f $k +l $. $f $m +l $. $f $o +l $. $f $r +l $. $g $a +l $. $g $b +l $. $g $d +l $. $g $e +l $. $g $f +l $. $g $g +l $. $g $h +l $. $g $i +l $. $g $l +l $. $g $m +l $. $g $n +l $. $g $o $v +l $. $g $p +l $. $g $q +l $. $g $r +l $. $g $s +l $. $g $t +l $. $g $u +l $. $g $w +l $. $g $y +l $. $h $k +l $. $h $m +l $. $h $n +l $. $h $r +l $. $h $t +l $. $h $u +l $. $i $d +l $. $i $e +l $. $i $l +l $. $i $m +l $. $i $n +l $. $i $n $f $o +l $. $i $n $t +l $. $i $o +l $. $i $q +l $. $i $r +l $. $i $s +l $. $i $t +l $. $j $e +l $. $j $m +l $. $j $o +l $. $j $o $b $s +l $. $j $p +l $. $k $e +l $. $k $g +l $. $k $h +l $. $k $i +l $. $k $m +l $. $k $n +l $. $k $r +l $. $k $w +l $. $k $y +l $. $k $z +l $. $l $a +l $. $l $b +l $. $l $c +l $. $l $i +l $. $l $k +l $. $l $r +l $. $l $s +l $. $l $t +l $. $l $u +l $. $l $v +l $. $l $y +l $. $m $a +l $. $m $c +l $. $m $d +l $. $m $g +l $. $m $h +l $. $m $i $l +l $. $m $k +l $. $m $l +l $. $m $m +l $. $m $n +l $. $m $o +l $. $m $o $b $i +l $. $m $p +l $. $m $q +l $. $m $r +l $. $m $s +l $. $m $t +l $. $m $u +l $. $m $u $s $e $u $m +l $. $m $v +l $. $m $w +l $. $m $x +l $. $m $y +l $. $m $z +l $. $n $a +l $. $n $a $m $e +l $. $n $c +l $. $n $e +l $. $n $e $t +l $. $n $f +l $. $n $g +l $. $n $i +l $. $n $l +l $. $n $o +l $. $n $p +l $. $n $r +l $. $n $u +l $. $n $z +l $. $o $m +l $. $o $r $g +l $. $p $a +l $. $p $e +l $. $p $f +l $. $p $g +l $. $p $h +l $. $p $k +l $. $p $l +l $. $p $m +l $. $p $n +l $. $p $r +l $. $p $r $o +l $. $p $s +l $. $p $t +l $. $p $w +l $. $p $y +l $. $q $a +l $. $r $e +l $. $r $o +l $. $r $o $o $t +l $. $r $u +l $. $r $w +l $. $s $a +l $. $s $b +l $. $s $c +l $. $s $d +l $. $s $e +l $. $s $g +l $. $s $h +l $. $s $i +l $. $s $j +l $. $s $k +l $. $s $l +l $. $s $m +l $. $s $n +l $. $s $o +l $. $s $r +l $. $s $t +l $. $s $u +l $. $s $v +l $. $s $y +l $. $s $z +l $. $t $c +l $. $t $d +l $. $t $f +l $. $t $g +l $. $t $h +l $. $t $j +l $. $t $k +l $. $t $l +l $. $t $m +l $. $t $n +l $. $t $o +l $. $t $p +l $. $t $r +l $. $t $r $a $v $e $l +l $. $t $t +l $. $t $v +l $. $t $w +l $. $t $z +l $. $u $a +l $. $u $g +l $. $u $k +l $. $u $m +l $. $u $s +l $. $u $y +l $. $u $z +l $. $v $a +l $. $v $c +l $. $v $e +l $. $v $g +l $. $v $i +l $. $v $n +l $. $v $u +l $. $w $f +l $. $w $s +l $. $y $e +l $. $y $t +l $. $y $u +l $. $z $a +l $. $z $m +l $. $z $w +l $0 $1 +l $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 +l $0 $2 +l $0 $3 +l $0 $4 +l $0 $5 +l $0 $6 +l $0 $7 +l $0 $8 +l $0 $9 +l $1 $0 +l $1 $1 +l $1 $2 $3 +l $1 $2 $3 $4 +l $1 $2 $3 $4 $5 +l $1 $2 $3 $4 $5 $6 +l $1 $2 $3 $4 $5 $6 $7 +l $1 $2 $3 $4 $5 $6 $7 $8 +l $1 $2 $3 $4 $5 $6 $7 $8 $9 +l $1 $2 $3 $4 $5 $6 $7 $8 $9 $0 +l $1 $3 +l $1 $4 +l $1 $5 +l $1 $6 +l $1 $7 +l $1 $8 +l $1 $9 +l $2 +l $2 $0 +l $2 $0 $1 $0 $! +l $2 $0 $1 $0 $# +l $2 $0 $1 $0 $$ +l $2 $0 $1 $0 $% +l $2 $0 $1 $0 $& +l $2 $0 $1 $0 $( +l $2 $0 $1 $0 $) +l $2 $0 $1 $0 $* +l $2 $0 $1 $0 $+ +l $2 $0 $1 $0 $- +l $2 $0 $1 $0 $. +l $2 $0 $1 $0 $= +l $2 $0 $1 $0 $? +l $2 $0 $1 $0 $@ +l $2 $0 $1 $0 $^ +l $2 $0 $1 $0 $_ +l $2 $0 $1 $0 $` +l $2 $0 $1 $0 $| +l $2 $0 $1 $0 $~ +l $2 $0 $1 $1 $! +l $2 $0 $1 $1 $# +l $2 $0 $1 $1 $$ +l $2 $0 $1 $1 $% +l $2 $0 $1 $1 $& +l $2 $0 $1 $1 $( +l $2 $0 $1 $1 $) +l $2 $0 $1 $1 $* +l $2 $0 $1 $1 $+ +l $2 $0 $1 $1 $- +l $2 $0 $1 $1 $. +l $2 $0 $1 $1 $= +l $2 $0 $1 $1 $? +l $2 $0 $1 $1 $@ +l $2 $0 $1 $1 $^ +l $2 $0 $1 $1 $_ +l $2 $0 $1 $1 $` +l $2 $0 $1 $1 $| +l $2 $0 $1 $1 $~ +l $2 $0 $1 $2 $! +l $2 $0 $1 $2 $# +l $2 $0 $1 $2 $$ +l $2 $0 $1 $2 $% +l $2 $0 $1 $2 $& +l $2 $0 $1 $2 $( +l $2 $0 $1 $2 $) +l $2 $0 $1 $2 $* +l $2 $0 $1 $2 $+ +l $2 $0 $1 $2 $- +l $2 $0 $1 $2 $. +l $2 $0 $1 $2 $= +l $2 $0 $1 $2 $? +l $2 $0 $1 $2 $@ +l $2 $0 $1 $2 $^ +l $2 $0 $1 $2 $_ +l $2 $0 $1 $2 $` +l $2 $0 $1 $2 $| +l $2 $0 $1 $2 $~ +l $2 $0 $1 $3 $! +l $2 $0 $1 $3 $# +l $2 $0 $1 $3 $$ +l $2 $0 $1 $3 $% +l $2 $0 $1 $3 $& +l $2 $0 $1 $3 $( +l $2 $0 $1 $3 $) +l $2 $0 $1 $3 $* +l $2 $0 $1 $3 $+ +l $2 $0 $1 $3 $- +l $2 $0 $1 $3 $. +l $2 $0 $1 $3 $= +l $2 $0 $1 $3 $? +l $2 $0 $1 $3 $@ +l $2 $0 $1 $3 $^ +l $2 $0 $1 $3 $_ +l $2 $0 $1 $3 $` +l $2 $0 $1 $3 $| +l $2 $0 $1 $3 $~ +l $2 $0 $1 $4 $ +l $2 $0 $1 $4 $! +l $2 $0 $1 $4 $" +l $2 $0 $1 $4 $# +l $2 $0 $1 $4 $$ +l $2 $0 $1 $4 $% +l $2 $0 $1 $4 $& +l $2 $0 $1 $4 $' +l $2 $0 $1 $4 $( +l $2 $0 $1 $4 $) +l $2 $0 $1 $4 $* +l $2 $0 $1 $4 $+ +l $2 $0 $1 $4 $, +l $2 $0 $1 $4 $- +l $2 $0 $1 $4 $. +l $2 $0 $1 $4 $/ +l $2 $0 $1 $4 $: +l $2 $0 $1 $4 $; +l $2 $0 $1 $4 $< +l $2 $0 $1 $4 $= +l $2 $0 $1 $4 $> +l $2 $0 $1 $4 $? +l $2 $0 $1 $4 $@ +l $2 $0 $1 $4 $[ +l $2 $0 $1 $4 $\ +l $2 $0 $1 $4 $] +l $2 $0 $1 $4 $^ +l $2 $0 $1 $4 $_ +l $2 $0 $1 $4 $` +l $2 $0 $1 $4 ${ +l $2 $0 $1 $4 $| +l $2 $0 $1 $4 $} +l $2 $0 $1 $4 $~ +l $2 $0 $1 $5 $ +l $2 $0 $1 $5 $! +l $2 $0 $1 $5 $" +l $2 $0 $1 $5 $# +l $2 $0 $1 $5 $$ +l $2 $0 $1 $5 $% +l $2 $0 $1 $5 $& +l $2 $0 $1 $5 $' +l $2 $0 $1 $5 $( +l $2 $0 $1 $5 $) +l $2 $0 $1 $5 $* +l $2 $0 $1 $5 $+ +l $2 $0 $1 $5 $, +l $2 $0 $1 $5 $- +l $2 $0 $1 $5 $. +l $2 $0 $1 $5 $/ +l $2 $0 $1 $5 $: +l $2 $0 $1 $5 $; +l $2 $0 $1 $5 $< +l $2 $0 $1 $5 $= +l $2 $0 $1 $5 $> +l $2 $0 $1 $5 $? +l $2 $0 $1 $5 $@ +l $2 $0 $1 $5 $[ +l $2 $0 $1 $5 $\ +l $2 $0 $1 $5 $] +l $2 $0 $1 $5 $^ +l $2 $0 $1 $5 $_ +l $2 $0 $1 $5 $` +l $2 $0 $1 $5 ${ +l $2 $0 $1 $5 $| +l $2 $0 $1 $5 $} +l $2 $0 $1 $5 $~ +l $2 $0 $1 $6 $ +l $2 $0 $1 $6 $! +l $2 $0 $1 $6 $" +l $2 $0 $1 $6 $# +l $2 $0 $1 $6 $$ +l $2 $0 $1 $6 $% +l $2 $0 $1 $6 $& +l $2 $0 $1 $6 $' +l $2 $0 $1 $6 $( +l $2 $0 $1 $6 $) +l $2 $0 $1 $6 $* +l $2 $0 $1 $6 $+ +l $2 $0 $1 $6 $, +l $2 $0 $1 $6 $- +l $2 $0 $1 $6 $. +l $2 $0 $1 $6 $/ +l $2 $0 $1 $6 $: +l $2 $0 $1 $6 $; +l $2 $0 $1 $6 $< +l $2 $0 $1 $6 $= +l $2 $0 $1 $6 $> +l $2 $0 $1 $6 $? +l $2 $0 $1 $6 $@ +l $2 $0 $1 $6 $[ +l $2 $0 $1 $6 $\ +l $2 $0 $1 $6 $] +l $2 $0 $1 $6 $^ +l $2 $0 $1 $6 $_ +l $2 $0 $1 $6 $` +l $2 $0 $1 $6 ${ +l $2 $0 $1 $6 $| +l $2 $0 $1 $6 $} +l $2 $0 $1 $6 $~ +l $2 $0 $1 $7 $ +l $2 $0 $1 $7 $! +l $2 $0 $1 $7 $" +l $2 $0 $1 $7 $# +l $2 $0 $1 $7 $$ +l $2 $0 $1 $7 $% +l $2 $0 $1 $7 $& +l $2 $0 $1 $7 $' +l $2 $0 $1 $7 $( +l $2 $0 $1 $7 $) +l $2 $0 $1 $7 $* +l $2 $0 $1 $7 $+ +l $2 $0 $1 $7 $, +l $2 $0 $1 $7 $- +l $2 $0 $1 $7 $. +l $2 $0 $1 $7 $/ +l $2 $0 $1 $7 $: +l $2 $0 $1 $7 $; +l $2 $0 $1 $7 $< +l $2 $0 $1 $7 $= +l $2 $0 $1 $7 $> +l $2 $0 $1 $7 $? +l $2 $0 $1 $7 $@ +l $2 $0 $1 $7 $[ +l $2 $0 $1 $7 $\ +l $2 $0 $1 $7 $] +l $2 $0 $1 $7 $^ +l $2 $0 $1 $7 $_ +l $2 $0 $1 $7 $` +l $2 $0 $1 $7 ${ +l $2 $0 $1 $7 $| +l $2 $0 $1 $7 $} +l $2 $0 $1 $7 $~ +l $2 $0 $1 $8 $ +l $2 $0 $1 $8 $! +l $2 $0 $1 $8 $" +l $2 $0 $1 $8 $# +l $2 $0 $1 $8 $$ +l $2 $0 $1 $8 $% +l $2 $0 $1 $8 $& +l $2 $0 $1 $8 $' +l $2 $0 $1 $8 $( +l $2 $0 $1 $8 $) +l $2 $0 $1 $8 $* +l $2 $0 $1 $8 $+ +l $2 $0 $1 $8 $, +l $2 $0 $1 $8 $- +l $2 $0 $1 $8 $. +l $2 $0 $1 $8 $/ +l $2 $0 $1 $8 $: +l $2 $0 $1 $8 $; +l $2 $0 $1 $8 $< +l $2 $0 $1 $8 $= +l $2 $0 $1 $8 $> +l $2 $0 $1 $8 $? +l $2 $0 $1 $8 $@ +l $2 $0 $1 $8 $[ +l $2 $0 $1 $8 $\ +l $2 $0 $1 $8 $] +l $2 $0 $1 $8 $^ +l $2 $0 $1 $8 $_ +l $2 $0 $1 $8 $` +l $2 $0 $1 $8 ${ +l $2 $0 $1 $8 $| +l $2 $0 $1 $8 $} +l $2 $0 $1 $8 $~ +l $2 $0 $1 $9 $ +l $2 $0 $1 $9 $! +l $2 $0 $1 $9 $" +l $2 $0 $1 $9 $# +l $2 $0 $1 $9 $$ +l $2 $0 $1 $9 $% +l $2 $0 $1 $9 $& +l $2 $0 $1 $9 $' +l $2 $0 $1 $9 $( +l $2 $0 $1 $9 $) +l $2 $0 $1 $9 $* +l $2 $0 $1 $9 $+ +l $2 $0 $1 $9 $, +l $2 $0 $1 $9 $- +l $2 $0 $1 $9 $. +l $2 $0 $1 $9 $/ +l $2 $0 $1 $9 $: +l $2 $0 $1 $9 $; +l $2 $0 $1 $9 $< +l $2 $0 $1 $9 $= +l $2 $0 $1 $9 $> +l $2 $0 $1 $9 $? +l $2 $0 $1 $9 $@ +l $2 $0 $1 $9 $[ +l $2 $0 $1 $9 $\ +l $2 $0 $1 $9 $] +l $2 $0 $1 $9 $^ +l $2 $0 $1 $9 $_ +l $2 $0 $1 $9 $` +l $2 $0 $1 $9 ${ +l $2 $0 $1 $9 $| +l $2 $0 $1 $9 $} +l $2 $0 $1 $9 $~ +l $2 $0 $2 $0 $ +l $2 $0 $2 $0 $! +l $2 $0 $2 $0 $" +l $2 $0 $2 $0 $# +l $2 $0 $2 $0 $$ +l $2 $0 $2 $0 $% +l $2 $0 $2 $0 $& +l $2 $0 $2 $0 $' +l $2 $0 $2 $0 $( +l $2 $0 $2 $0 $) +l $2 $0 $2 $0 $* +l $2 $0 $2 $0 $+ +l $2 $0 $2 $0 $, +l $2 $0 $2 $0 $- +l $2 $0 $2 $0 $. +l $2 $0 $2 $0 $/ +l $2 $0 $2 $0 $: +l $2 $0 $2 $0 $; +l $2 $0 $2 $0 $< +l $2 $0 $2 $0 $= +l $2 $0 $2 $0 $> +l $2 $0 $2 $0 $? +l $2 $0 $2 $0 $@ +l $2 $0 $2 $0 $[ +l $2 $0 $2 $0 $\ +l $2 $0 $2 $0 $] +l $2 $0 $2 $0 $^ +l $2 $0 $2 $0 $_ +l $2 $0 $2 $0 $` +l $2 $0 $2 $0 ${ +l $2 $0 $2 $0 $| +l $2 $0 $2 $0 $} +l $2 $0 $2 $0 $~ +l $2 $0 $2 $1 $ +l $2 $0 $2 $1 $! +l $2 $0 $2 $1 $" +l $2 $0 $2 $1 $# +l $2 $0 $2 $1 $$ +l $2 $0 $2 $1 $% +l $2 $0 $2 $1 $& +l $2 $0 $2 $1 $' +l $2 $0 $2 $1 $( +l $2 $0 $2 $1 $) +l $2 $0 $2 $1 $* +l $2 $0 $2 $1 $+ +l $2 $0 $2 $1 $, +l $2 $0 $2 $1 $- +l $2 $0 $2 $1 $. +l $2 $0 $2 $1 $/ +l $2 $0 $2 $1 $: +l $2 $0 $2 $1 $; +l $2 $0 $2 $1 $< +l $2 $0 $2 $1 $= +l $2 $0 $2 $1 $> +l $2 $0 $2 $1 $? +l $2 $0 $2 $1 $@ +l $2 $0 $2 $1 $[ +l $2 $0 $2 $1 $\ +l $2 $0 $2 $1 $] +l $2 $0 $2 $1 $^ +l $2 $0 $2 $1 $_ +l $2 $0 $2 $1 $` +l $2 $0 $2 $1 ${ +l $2 $0 $2 $1 $| +l $2 $0 $2 $1 $} +l $2 $0 $2 $1 $~ +l $2 $0 $2 $2 $ +l $2 $0 $2 $2 $! +l $2 $0 $2 $2 $" +l $2 $0 $2 $2 $# +l $2 $0 $2 $2 $$ +l $2 $0 $2 $2 $% +l $2 $0 $2 $2 $& +l $2 $0 $2 $2 $' +l $2 $0 $2 $2 $( +l $2 $0 $2 $2 $) +l $2 $0 $2 $2 $* +l $2 $0 $2 $2 $+ +l $2 $0 $2 $2 $, +l $2 $0 $2 $2 $- +l $2 $0 $2 $2 $. +l $2 $0 $2 $2 $/ +l $2 $0 $2 $2 $: +l $2 $0 $2 $2 $; +l $2 $0 $2 $2 $< +l $2 $0 $2 $2 $= +l $2 $0 $2 $2 $> +l $2 $0 $2 $2 $? +l $2 $0 $2 $2 $@ +l $2 $0 $2 $2 $[ +l $2 $0 $2 $2 $\ +l $2 $0 $2 $2 $] +l $2 $0 $2 $2 $^ +l $2 $0 $2 $2 $_ +l $2 $0 $2 $2 $` +l $2 $0 $2 $2 ${ +l $2 $0 $2 $2 $| +l $2 $0 $2 $2 $} +l $2 $0 $2 $2 $~ +l $2 $0 $2 $3 $ +l $2 $0 $2 $3 $! +l $2 $0 $2 $3 $" +l $2 $0 $2 $3 $# +l $2 $0 $2 $3 $$ +l $2 $0 $2 $3 $% +l $2 $0 $2 $3 $& +l $2 $0 $2 $3 $' +l $2 $0 $2 $3 $( +l $2 $0 $2 $3 $) +l $2 $0 $2 $3 $* +l $2 $0 $2 $3 $+ +l $2 $0 $2 $3 $, +l $2 $0 $2 $3 $- +l $2 $0 $2 $3 $. +l $2 $0 $2 $3 $/ +l $2 $0 $2 $3 $: +l $2 $0 $2 $3 $; +l $2 $0 $2 $3 $< +l $2 $0 $2 $3 $= +l $2 $0 $2 $3 $> +l $2 $0 $2 $3 $? +l $2 $0 $2 $3 $@ +l $2 $0 $2 $3 $[ +l $2 $0 $2 $3 $\ +l $2 $0 $2 $3 $] +l $2 $0 $2 $3 $^ +l $2 $0 $2 $3 $_ +l $2 $0 $2 $3 $` +l $2 $0 $2 $3 ${ +l $2 $0 $2 $3 $| +l $2 $0 $2 $3 $} +l $2 $0 $2 $3 $~ +l $2 $0 $2 $4 $ +l $2 $0 $2 $4 $! +l $2 $0 $2 $4 $" +l $2 $0 $2 $4 $# +l $2 $0 $2 $4 $$ +l $2 $0 $2 $4 $% +l $2 $0 $2 $4 $& +l $2 $0 $2 $4 $' +l $2 $0 $2 $4 $( +l $2 $0 $2 $4 $) +l $2 $0 $2 $4 $* +l $2 $0 $2 $4 $+ +l $2 $0 $2 $4 $, +l $2 $0 $2 $4 $- +l $2 $0 $2 $4 $. +l $2 $0 $2 $4 $/ +l $2 $0 $2 $4 $: +l $2 $0 $2 $4 $; +l $2 $0 $2 $4 $< +l $2 $0 $2 $4 $= +l $2 $0 $2 $4 $> +l $2 $0 $2 $4 $? +l $2 $0 $2 $4 $@ +l $2 $0 $2 $4 $[ +l $2 $0 $2 $4 $\ +l $2 $0 $2 $4 $] +l $2 $0 $2 $4 $^ +l $2 $0 $2 $4 $_ +l $2 $0 $2 $4 $` +l $2 $0 $2 $4 ${ +l $2 $0 $2 $4 $| +l $2 $0 $2 $4 $} +l $2 $0 $2 $4 $~ +l $2 $0 $2 $5 $ +l $2 $0 $2 $5 $! +l $2 $0 $2 $5 $" +l $2 $0 $2 $5 $# +l $2 $0 $2 $5 $$ +l $2 $0 $2 $5 $% +l $2 $0 $2 $5 $& +l $2 $0 $2 $5 $' +l $2 $0 $2 $5 $( +l $2 $0 $2 $5 $) +l $2 $0 $2 $5 $* +l $2 $0 $2 $5 $+ +l $2 $0 $2 $5 $, +l $2 $0 $2 $5 $- +l $2 $0 $2 $5 $. +l $2 $0 $2 $5 $/ +l $2 $0 $2 $5 $: +l $2 $0 $2 $5 $; +l $2 $0 $2 $5 $< +l $2 $0 $2 $5 $= +l $2 $0 $2 $5 $> +l $2 $0 $2 $5 $? +l $2 $0 $2 $5 $@ +l $2 $0 $2 $5 $[ +l $2 $0 $2 $5 $\ +l $2 $0 $2 $5 $] +l $2 $0 $2 $5 $^ +l $2 $0 $2 $5 $_ +l $2 $0 $2 $5 $` +l $2 $0 $2 $5 ${ +l $2 $0 $2 $5 $| +l $2 $0 $2 $5 $} +l $2 $0 $2 $5 $~ +l $2 $0 $2 $6 $ +l $2 $0 $2 $6 $! +l $2 $0 $2 $6 $" +l $2 $0 $2 $6 $# +l $2 $0 $2 $6 $$ +l $2 $0 $2 $6 $% +l $2 $0 $2 $6 $& +l $2 $0 $2 $6 $' +l $2 $0 $2 $6 $( +l $2 $0 $2 $6 $) +l $2 $0 $2 $6 $* +l $2 $0 $2 $6 $+ +l $2 $0 $2 $6 $, +l $2 $0 $2 $6 $- +l $2 $0 $2 $6 $. +l $2 $0 $2 $6 $/ +l $2 $0 $2 $6 $: +l $2 $0 $2 $6 $; +l $2 $0 $2 $6 $< +l $2 $0 $2 $6 $= +l $2 $0 $2 $6 $> +l $2 $0 $2 $6 $? +l $2 $0 $2 $6 $@ +l $2 $0 $2 $6 $[ +l $2 $0 $2 $6 $\ +l $2 $0 $2 $6 $] +l $2 $0 $2 $6 $^ +l $2 $0 $2 $6 $_ +l $2 $0 $2 $6 $` +l $2 $0 $2 $6 ${ +l $2 $0 $2 $6 $| +l $2 $0 $2 $6 $} +l $2 $0 $2 $6 $~ +l $2 $0 $2 $7 $ +l $2 $0 $2 $7 $! +l $2 $0 $2 $7 $" +l $2 $0 $2 $7 $# +l $2 $0 $2 $7 $$ +l $2 $0 $2 $7 $% +l $2 $0 $2 $7 $& +l $2 $0 $2 $7 $' +l $2 $0 $2 $7 $( +l $2 $0 $2 $7 $) +l $2 $0 $2 $7 $* +l $2 $0 $2 $7 $+ +l $2 $0 $2 $7 $, +l $2 $0 $2 $7 $- +l $2 $0 $2 $7 $. +l $2 $0 $2 $7 $/ +l $2 $0 $2 $7 $: +l $2 $0 $2 $7 $; +l $2 $0 $2 $7 $< +l $2 $0 $2 $7 $= +l $2 $0 $2 $7 $> +l $2 $0 $2 $7 $? +l $2 $0 $2 $7 $@ +l $2 $0 $2 $7 $[ +l $2 $0 $2 $7 $\ +l $2 $0 $2 $7 $] +l $2 $0 $2 $7 $^ +l $2 $0 $2 $7 $_ +l $2 $0 $2 $7 $` +l $2 $0 $2 $7 ${ +l $2 $0 $2 $7 $| +l $2 $0 $2 $7 $} +l $2 $0 $2 $7 $~ +l $2 $0 $2 $8 $ +l $2 $0 $2 $8 $! +l $2 $0 $2 $8 $" +l $2 $0 $2 $8 $# +l $2 $0 $2 $8 $$ +l $2 $0 $2 $8 $% +l $2 $0 $2 $8 $& +l $2 $0 $2 $8 $' +l $2 $0 $2 $8 $( +l $2 $0 $2 $8 $) +l $2 $0 $2 $8 $* +l $2 $0 $2 $8 $+ +l $2 $0 $2 $8 $, +l $2 $0 $2 $8 $- +l $2 $0 $2 $8 $. +l $2 $0 $2 $8 $/ +l $2 $0 $2 $8 $: +l $2 $0 $2 $8 $; +l $2 $0 $2 $8 $< +l $2 $0 $2 $8 $= +l $2 $0 $2 $8 $> +l $2 $0 $2 $8 $? +l $2 $0 $2 $8 $@ +l $2 $0 $2 $8 $[ +l $2 $0 $2 $8 $\ +l $2 $0 $2 $8 $] +l $2 $0 $2 $8 $^ +l $2 $0 $2 $8 $_ +l $2 $0 $2 $8 $` +l $2 $0 $2 $8 ${ +l $2 $0 $2 $8 $| +l $2 $0 $2 $8 $} +l $2 $0 $2 $8 $~ +l $2 $0 $2 $9 $ +l $2 $0 $2 $9 $! +l $2 $0 $2 $9 $" +l $2 $0 $2 $9 $# +l $2 $0 $2 $9 $$ +l $2 $0 $2 $9 $% +l $2 $0 $2 $9 $& +l $2 $0 $2 $9 $' +l $2 $0 $2 $9 $( +l $2 $0 $2 $9 $) +l $2 $0 $2 $9 $* +l $2 $0 $2 $9 $+ +l $2 $0 $2 $9 $, +l $2 $0 $2 $9 $- +l $2 $0 $2 $9 $. +l $2 $0 $2 $9 $/ +l $2 $0 $2 $9 $: +l $2 $0 $2 $9 $; +l $2 $0 $2 $9 $< +l $2 $0 $2 $9 $= +l $2 $0 $2 $9 $> +l $2 $0 $2 $9 $? +l $2 $0 $2 $9 $@ +l $2 $0 $2 $9 $[ +l $2 $0 $2 $9 $\ +l $2 $0 $2 $9 $] +l $2 $0 $2 $9 $^ +l $2 $0 $2 $9 $_ +l $2 $0 $2 $9 $` +l $2 $0 $2 $9 ${ +l $2 $0 $2 $9 $| +l $2 $0 $2 $9 $} +l $2 $0 $2 $9 $~ +l $2 $0 $3 $0 $ +l $2 $0 $3 $0 $! +l $2 $0 $3 $0 $" +l $2 $0 $3 $0 $# +l $2 $0 $3 $0 $$ +l $2 $0 $3 $0 $% +l $2 $0 $3 $0 $& +l $2 $0 $3 $0 $' +l $2 $0 $3 $0 $( +l $2 $0 $3 $0 $) +l $2 $0 $3 $0 $* +l $2 $0 $3 $0 $+ +l $2 $0 $3 $0 $, +l $2 $0 $3 $0 $- +l $2 $0 $3 $0 $. +l $2 $0 $3 $0 $/ +l $2 $0 $3 $0 $: +l $2 $0 $3 $0 $; +l $2 $0 $3 $0 $< +l $2 $0 $3 $0 $= +l $2 $0 $3 $0 $> +l $2 $0 $3 $0 $? +l $2 $0 $3 $0 $@ +l $2 $0 $3 $0 $[ +l $2 $0 $3 $0 $\ +l $2 $0 $3 $0 $] +l $2 $0 $3 $0 $^ +l $2 $0 $3 $0 $_ +l $2 $0 $3 $0 $` +l $2 $0 $3 $0 ${ +l $2 $0 $3 $0 $| +l $2 $0 $3 $0 $} +l $2 $0 $3 $0 $~ +l $2 $0 $3 $1 $ +l $2 $0 $3 $1 $! +l $2 $0 $3 $1 $" +l $2 $0 $3 $1 $# +l $2 $0 $3 $1 $$ +l $2 $0 $3 $1 $% +l $2 $0 $3 $1 $& +l $2 $0 $3 $1 $' +l $2 $0 $3 $1 $( +l $2 $0 $3 $1 $) +l $2 $0 $3 $1 $* +l $2 $0 $3 $1 $+ +l $2 $0 $3 $1 $, +l $2 $0 $3 $1 $- +l $2 $0 $3 $1 $. +l $2 $0 $3 $1 $/ +l $2 $0 $3 $1 $: +l $2 $0 $3 $1 $; +l $2 $0 $3 $1 $< +l $2 $0 $3 $1 $= +l $2 $0 $3 $1 $> +l $2 $0 $3 $1 $? +l $2 $0 $3 $1 $@ +l $2 $0 $3 $1 $[ +l $2 $0 $3 $1 $\ +l $2 $0 $3 $1 $] +l $2 $0 $3 $1 $^ +l $2 $0 $3 $1 $_ +l $2 $0 $3 $1 $` +l $2 $0 $3 $1 ${ +l $2 $0 $3 $1 $| +l $2 $0 $3 $1 $} +l $2 $0 $3 $1 $~ +l $2 $0 $3 $2 $ +l $2 $0 $3 $2 $! +l $2 $0 $3 $2 $" +l $2 $0 $3 $2 $# +l $2 $0 $3 $2 $$ +l $2 $0 $3 $2 $% +l $2 $0 $3 $2 $& +l $2 $0 $3 $2 $' +l $2 $0 $3 $2 $( +l $2 $0 $3 $2 $) +l $2 $0 $3 $2 $* +l $2 $0 $3 $2 $+ +l $2 $0 $3 $2 $, +l $2 $0 $3 $2 $- +l $2 $0 $3 $2 $. +l $2 $0 $3 $2 $/ +l $2 $0 $3 $2 $: +l $2 $0 $3 $2 $; +l $2 $0 $3 $2 $< +l $2 $0 $3 $2 $= +l $2 $0 $3 $2 $> +l $2 $0 $3 $2 $? +l $2 $0 $3 $2 $@ +l $2 $0 $3 $2 $[ +l $2 $0 $3 $2 $\ +l $2 $0 $3 $2 $] +l $2 $0 $3 $2 $^ +l $2 $0 $3 $2 $_ +l $2 $0 $3 $2 $` +l $2 $0 $3 $2 ${ +l $2 $0 $3 $2 $| +l $2 $0 $3 $2 $} +l $2 $0 $3 $2 $~ +l $2 $0 $3 $3 $ +l $2 $0 $3 $3 $! +l $2 $0 $3 $3 $" +l $2 $0 $3 $3 $# +l $2 $0 $3 $3 $$ +l $2 $0 $3 $3 $% +l $2 $0 $3 $3 $& +l $2 $0 $3 $3 $' +l $2 $0 $3 $3 $( +l $2 $0 $3 $3 $) +l $2 $0 $3 $3 $* +l $2 $0 $3 $3 $+ +l $2 $0 $3 $3 $, +l $2 $0 $3 $3 $- +l $2 $0 $3 $3 $. +l $2 $0 $3 $3 $/ +l $2 $0 $3 $3 $: +l $2 $0 $3 $3 $; +l $2 $0 $3 $3 $< +l $2 $0 $3 $3 $= +l $2 $0 $3 $3 $> +l $2 $0 $3 $3 $? +l $2 $0 $3 $3 $@ +l $2 $0 $3 $3 $[ +l $2 $0 $3 $3 $\ +l $2 $0 $3 $3 $] +l $2 $0 $3 $3 $^ +l $2 $0 $3 $3 $_ +l $2 $0 $3 $3 $` +l $2 $0 $3 $3 ${ +l $2 $0 $3 $3 $| +l $2 $0 $3 $3 $} +l $2 $0 $3 $3 $~ +l $2 $0 $3 $4 $ +l $2 $0 $3 $4 $! +l $2 $0 $3 $4 $" +l $2 $0 $3 $4 $# +l $2 $0 $3 $4 $$ +l $2 $0 $3 $4 $% +l $2 $0 $3 $4 $& +l $2 $0 $3 $4 $' +l $2 $0 $3 $4 $( +l $2 $0 $3 $4 $) +l $2 $0 $3 $4 $* +l $2 $0 $3 $4 $+ +l $2 $0 $3 $4 $, +l $2 $0 $3 $4 $- +l $2 $0 $3 $4 $. +l $2 $0 $3 $4 $/ +l $2 $0 $3 $4 $: +l $2 $0 $3 $4 $; +l $2 $0 $3 $4 $< +l $2 $0 $3 $4 $= +l $2 $0 $3 $4 $> +l $2 $0 $3 $4 $? +l $2 $0 $3 $4 $@ +l $2 $0 $3 $4 $[ +l $2 $0 $3 $4 $\ +l $2 $0 $3 $4 $] +l $2 $0 $3 $4 $^ +l $2 $0 $3 $4 $_ +l $2 $0 $3 $4 $` +l $2 $0 $3 $4 ${ +l $2 $0 $3 $4 $| +l $2 $0 $3 $4 $} +l $2 $0 $3 $4 $~ +l $2 $0 $3 $5 $ +l $2 $0 $3 $5 $! +l $2 $0 $3 $5 $" +l $2 $0 $3 $5 $# +l $2 $0 $3 $5 $$ +l $2 $0 $3 $5 $% +l $2 $0 $3 $5 $& +l $2 $0 $3 $5 $' +l $2 $0 $3 $5 $( +l $2 $0 $3 $5 $) +l $2 $0 $3 $5 $* +l $2 $0 $3 $5 $+ +l $2 $0 $3 $5 $, +l $2 $0 $3 $5 $- +l $2 $0 $3 $5 $. +l $2 $0 $3 $5 $/ +l $2 $0 $3 $5 $: +l $2 $0 $3 $5 $; +l $2 $0 $3 $5 $< +l $2 $0 $3 $5 $= +l $2 $0 $3 $5 $> +l $2 $0 $3 $5 $? +l $2 $0 $3 $5 $@ +l $2 $0 $3 $5 $[ +l $2 $0 $3 $5 $\ +l $2 $0 $3 $5 $] +l $2 $0 $3 $5 $^ +l $2 $0 $3 $5 $_ +l $2 $0 $3 $5 $` +l $2 $0 $3 $5 ${ +l $2 $0 $3 $5 $| +l $2 $0 $3 $5 $} +l $2 $0 $3 $5 $~ +l $2 $0 $3 $6 $ +l $2 $0 $3 $6 $! +l $2 $0 $3 $6 $" +l $2 $0 $3 $6 $# +l $2 $0 $3 $6 $$ +l $2 $0 $3 $6 $% +l $2 $0 $3 $6 $& +l $2 $0 $3 $6 $' +l $2 $0 $3 $6 $( +l $2 $0 $3 $6 $) +l $2 $0 $3 $6 $* +l $2 $0 $3 $6 $+ +l $2 $0 $3 $6 $, +l $2 $0 $3 $6 $- +l $2 $0 $3 $6 $. +l $2 $0 $3 $6 $/ +l $2 $0 $3 $6 $: +l $2 $0 $3 $6 $; +l $2 $0 $3 $6 $< +l $2 $0 $3 $6 $= +l $2 $0 $3 $6 $> +l $2 $0 $3 $6 $? +l $2 $0 $3 $6 $@ +l $2 $0 $3 $6 $[ +l $2 $0 $3 $6 $\ +l $2 $0 $3 $6 $] +l $2 $0 $3 $6 $^ +l $2 $0 $3 $6 $_ +l $2 $0 $3 $6 $` +l $2 $0 $3 $6 ${ +l $2 $0 $3 $6 $| +l $2 $0 $3 $6 $} +l $2 $0 $3 $6 $~ +l $2 $0 $3 $7 $ +l $2 $0 $3 $7 $! +l $2 $0 $3 $7 $" +l $2 $0 $3 $7 $# +l $2 $0 $3 $7 $$ +l $2 $0 $3 $7 $% +l $2 $0 $3 $7 $& +l $2 $0 $3 $7 $' +l $2 $0 $3 $7 $( +l $2 $0 $3 $7 $) +l $2 $0 $3 $7 $* +l $2 $0 $3 $7 $+ +l $2 $0 $3 $7 $, +l $2 $0 $3 $7 $- +l $2 $0 $3 $7 $. +l $2 $0 $3 $7 $/ +l $2 $0 $3 $7 $: +l $2 $0 $3 $7 $; +l $2 $0 $3 $7 $< +l $2 $0 $3 $7 $= +l $2 $0 $3 $7 $> +l $2 $0 $3 $7 $? +l $2 $0 $3 $7 $@ +l $2 $0 $3 $7 $[ +l $2 $0 $3 $7 $\ +l $2 $0 $3 $7 $] +l $2 $0 $3 $7 $^ +l $2 $0 $3 $7 $_ +l $2 $0 $3 $7 $` +l $2 $0 $3 $7 ${ +l $2 $0 $3 $7 $| +l $2 $0 $3 $7 $} +l $2 $0 $3 $7 $~ +l $2 $0 $3 $8 $ +l $2 $0 $3 $8 $! +l $2 $0 $3 $8 $" +l $2 $0 $3 $8 $# +l $2 $0 $3 $8 $$ +l $2 $0 $3 $8 $% +l $2 $0 $3 $8 $& +l $2 $0 $3 $8 $' +l $2 $0 $3 $8 $( +l $2 $0 $3 $8 $) +l $2 $0 $3 $8 $* +l $2 $0 $3 $8 $+ +l $2 $0 $3 $8 $, +l $2 $0 $3 $8 $- +l $2 $0 $3 $8 $. +l $2 $0 $3 $8 $/ +l $2 $0 $3 $8 $: +l $2 $0 $3 $8 $; +l $2 $0 $3 $8 $< +l $2 $0 $3 $8 $= +l $2 $0 $3 $8 $> +l $2 $0 $3 $8 $? +l $2 $0 $3 $8 $@ +l $2 $0 $3 $8 $[ +l $2 $0 $3 $8 $\ +l $2 $0 $3 $8 $] +l $2 $0 $3 $8 $^ +l $2 $0 $3 $8 $_ +l $2 $0 $3 $8 $` +l $2 $0 $3 $8 ${ +l $2 $0 $3 $8 $| +l $2 $0 $3 $8 $} +l $2 $0 $3 $8 $~ +l $2 $0 $3 $9 $ +l $2 $0 $3 $9 $! +l $2 $0 $3 $9 $" +l $2 $0 $3 $9 $# +l $2 $0 $3 $9 $$ +l $2 $0 $3 $9 $% +l $2 $0 $3 $9 $& +l $2 $0 $3 $9 $' +l $2 $0 $3 $9 $( +l $2 $0 $3 $9 $) +l $2 $0 $3 $9 $* +l $2 $0 $3 $9 $+ +l $2 $0 $3 $9 $, +l $2 $0 $3 $9 $- +l $2 $0 $3 $9 $. +l $2 $0 $3 $9 $/ +l $2 $0 $3 $9 $: +l $2 $0 $3 $9 $; +l $2 $0 $3 $9 $< +l $2 $0 $3 $9 $= +l $2 $0 $3 $9 $> +l $2 $0 $3 $9 $? +l $2 $0 $3 $9 $@ +l $2 $0 $3 $9 $[ +l $2 $0 $3 $9 $\ +l $2 $0 $3 $9 $] +l $2 $0 $3 $9 $^ +l $2 $0 $3 $9 $_ +l $2 $0 $3 $9 $` +l $2 $0 $3 $9 ${ +l $2 $0 $3 $9 $| +l $2 $0 $3 $9 $} +l $2 $0 $3 $9 $~ +l $2 $0 $4 $0 $ +l $2 $0 $4 $0 $! +l $2 $0 $4 $0 $" +l $2 $0 $4 $0 $# +l $2 $0 $4 $0 $$ +l $2 $0 $4 $0 $% +l $2 $0 $4 $0 $& +l $2 $0 $4 $0 $' +l $2 $0 $4 $0 $( +l $2 $0 $4 $0 $) +l $2 $0 $4 $0 $* +l $2 $0 $4 $0 $+ +l $2 $0 $4 $0 $, +l $2 $0 $4 $0 $- +l $2 $0 $4 $0 $. +l $2 $0 $4 $0 $/ +l $2 $0 $4 $0 $: +l $2 $0 $4 $0 $; +l $2 $0 $4 $0 $< +l $2 $0 $4 $0 $= +l $2 $0 $4 $0 $> +l $2 $0 $4 $0 $? +l $2 $0 $4 $0 $@ +l $2 $0 $4 $0 $[ +l $2 $0 $4 $0 $\ +l $2 $0 $4 $0 $] +l $2 $0 $4 $0 $^ +l $2 $0 $4 $0 $_ +l $2 $0 $4 $0 $` +l $2 $0 $4 $0 ${ +l $2 $0 $4 $0 $| +l $2 $0 $4 $0 $} +l $2 $0 $4 $0 $~ +l $2 $0 $4 $1 $ +l $2 $0 $4 $1 $! +l $2 $0 $4 $1 $" +l $2 $0 $4 $1 $# +l $2 $0 $4 $1 $$ +l $2 $0 $4 $1 $% +l $2 $0 $4 $1 $& +l $2 $0 $4 $1 $' +l $2 $0 $4 $1 $( +l $2 $0 $4 $1 $) +l $2 $0 $4 $1 $* +l $2 $0 $4 $1 $+ +l $2 $0 $4 $1 $, +l $2 $0 $4 $1 $- +l $2 $0 $4 $1 $. +l $2 $0 $4 $1 $/ +l $2 $0 $4 $1 $: +l $2 $0 $4 $1 $; +l $2 $0 $4 $1 $< +l $2 $0 $4 $1 $= +l $2 $0 $4 $1 $> +l $2 $0 $4 $1 $? +l $2 $0 $4 $1 $@ +l $2 $0 $4 $1 $[ +l $2 $0 $4 $1 $\ +l $2 $0 $4 $1 $] +l $2 $0 $4 $1 $^ +l $2 $0 $4 $1 $_ +l $2 $0 $4 $1 $` +l $2 $0 $4 $1 ${ +l $2 $0 $4 $1 $| +l $2 $0 $4 $1 $} +l $2 $0 $4 $1 $~ +l $2 $0 $4 $2 $ +l $2 $0 $4 $2 $! +l $2 $0 $4 $2 $" +l $2 $0 $4 $2 $# +l $2 $0 $4 $2 $$ +l $2 $0 $4 $2 $% +l $2 $0 $4 $2 $& +l $2 $0 $4 $2 $' +l $2 $0 $4 $2 $( +l $2 $0 $4 $2 $) +l $2 $0 $4 $2 $* +l $2 $0 $4 $2 $+ +l $2 $0 $4 $2 $, +l $2 $0 $4 $2 $- +l $2 $0 $4 $2 $. +l $2 $0 $4 $2 $/ +l $2 $0 $4 $2 $: +l $2 $0 $4 $2 $; +l $2 $0 $4 $2 $< +l $2 $0 $4 $2 $= +l $2 $0 $4 $2 $> +l $2 $0 $4 $2 $? +l $2 $0 $4 $2 $@ +l $2 $0 $4 $2 $[ +l $2 $0 $4 $2 $\ +l $2 $0 $4 $2 $] +l $2 $0 $4 $2 $^ +l $2 $0 $4 $2 $_ +l $2 $0 $4 $2 $` +l $2 $0 $4 $2 ${ +l $2 $0 $4 $2 $| +l $2 $0 $4 $2 $} +l $2 $0 $4 $2 $~ +l $2 $0 $4 $3 $ +l $2 $0 $4 $3 $! +l $2 $0 $4 $3 $" +l $2 $0 $4 $3 $# +l $2 $0 $4 $3 $$ +l $2 $0 $4 $3 $% +l $2 $0 $4 $3 $& +l $2 $0 $4 $3 $' +l $2 $0 $4 $3 $( +l $2 $0 $4 $3 $) +l $2 $0 $4 $3 $* +l $2 $0 $4 $3 $+ +l $2 $0 $4 $3 $, +l $2 $0 $4 $3 $- +l $2 $0 $4 $3 $. +l $2 $0 $4 $3 $/ +l $2 $0 $4 $3 $: +l $2 $0 $4 $3 $; +l $2 $0 $4 $3 $< +l $2 $0 $4 $3 $= +l $2 $0 $4 $3 $> +l $2 $0 $4 $3 $? +l $2 $0 $4 $3 $@ +l $2 $0 $4 $3 $[ +l $2 $0 $4 $3 $\ +l $2 $0 $4 $3 $] +l $2 $0 $4 $3 $^ +l $2 $0 $4 $3 $_ +l $2 $0 $4 $3 $` +l $2 $0 $4 $3 ${ +l $2 $0 $4 $3 $| +l $2 $0 $4 $3 $} +l $2 $0 $4 $3 $~ +l $2 $0 $4 $4 $ +l $2 $0 $4 $4 $! +l $2 $0 $4 $4 $" +l $2 $0 $4 $4 $# +l $2 $0 $4 $4 $$ +l $2 $0 $4 $4 $% +l $2 $0 $4 $4 $& +l $2 $0 $4 $4 $' +l $2 $0 $4 $4 $( +l $2 $0 $4 $4 $) +l $2 $0 $4 $4 $* +l $2 $0 $4 $4 $+ +l $2 $0 $4 $4 $, +l $2 $0 $4 $4 $- +l $2 $0 $4 $4 $. +l $2 $0 $4 $4 $/ +l $2 $0 $4 $4 $: +l $2 $0 $4 $4 $; +l $2 $0 $4 $4 $< +l $2 $0 $4 $4 $= +l $2 $0 $4 $4 $> +l $2 $0 $4 $4 $? +l $2 $0 $4 $4 $@ +l $2 $0 $4 $4 $[ +l $2 $0 $4 $4 $\ +l $2 $0 $4 $4 $] +l $2 $0 $4 $4 $^ +l $2 $0 $4 $4 $_ +l $2 $0 $4 $4 $` +l $2 $0 $4 $4 ${ +l $2 $0 $4 $4 $| +l $2 $0 $4 $4 $} +l $2 $0 $4 $4 $~ +l $2 $0 $4 $5 $ +l $2 $0 $4 $5 $! +l $2 $0 $4 $5 $" +l $2 $0 $4 $5 $# +l $2 $0 $4 $5 $$ +l $2 $0 $4 $5 $% +l $2 $0 $4 $5 $& +l $2 $0 $4 $5 $' +l $2 $0 $4 $5 $( +l $2 $0 $4 $5 $) +l $2 $0 $4 $5 $* +l $2 $0 $4 $5 $+ +l $2 $0 $4 $5 $, +l $2 $0 $4 $5 $- +l $2 $0 $4 $5 $. +l $2 $0 $4 $5 $/ +l $2 $0 $4 $5 $: +l $2 $0 $4 $5 $; +l $2 $0 $4 $5 $< +l $2 $0 $4 $5 $= +l $2 $0 $4 $5 $> +l $2 $0 $4 $5 $? +l $2 $0 $4 $5 $@ +l $2 $0 $4 $5 $[ +l $2 $0 $4 $5 $\ +l $2 $0 $4 $5 $] +l $2 $0 $4 $5 $^ +l $2 $0 $4 $5 $_ +l $2 $0 $4 $5 $` +l $2 $0 $4 $5 ${ +l $2 $0 $4 $5 $| +l $2 $0 $4 $5 $} +l $2 $0 $4 $5 $~ +l $2 $0 $4 $6 $ +l $2 $0 $4 $6 $! +l $2 $0 $4 $6 $" +l $2 $0 $4 $6 $# +l $2 $0 $4 $6 $$ +l $2 $0 $4 $6 $% +l $2 $0 $4 $6 $& +l $2 $0 $4 $6 $' +l $2 $0 $4 $6 $( +l $2 $0 $4 $6 $) +l $2 $0 $4 $6 $* +l $2 $0 $4 $6 $+ +l $2 $0 $4 $6 $, +l $2 $0 $4 $6 $- +l $2 $0 $4 $6 $. +l $2 $0 $4 $6 $/ +l $2 $0 $4 $6 $: +l $2 $0 $4 $6 $; +l $2 $0 $4 $6 $< +l $2 $0 $4 $6 $= +l $2 $0 $4 $6 $> +l $2 $0 $4 $6 $? +l $2 $0 $4 $6 $@ +l $2 $0 $4 $6 $[ +l $2 $0 $4 $6 $\ +l $2 $0 $4 $6 $] +l $2 $0 $4 $6 $^ +l $2 $0 $4 $6 $_ +l $2 $0 $4 $6 $` +l $2 $0 $4 $6 ${ +l $2 $0 $4 $6 $| +l $2 $0 $4 $6 $} +l $2 $0 $4 $6 $~ +l $2 $0 $4 $7 $ +l $2 $0 $4 $7 $! +l $2 $0 $4 $7 $" +l $2 $0 $4 $7 $# +l $2 $0 $4 $7 $$ +l $2 $0 $4 $7 $% +l $2 $0 $4 $7 $& +l $2 $0 $4 $7 $' +l $2 $0 $4 $7 $( +l $2 $0 $4 $7 $) +l $2 $0 $4 $7 $* +l $2 $0 $4 $7 $+ +l $2 $0 $4 $7 $, +l $2 $0 $4 $7 $- +l $2 $0 $4 $7 $. +l $2 $0 $4 $7 $/ +l $2 $0 $4 $7 $: +l $2 $0 $4 $7 $; +l $2 $0 $4 $7 $< +l $2 $0 $4 $7 $= +l $2 $0 $4 $7 $> +l $2 $0 $4 $7 $? +l $2 $0 $4 $7 $@ +l $2 $0 $4 $7 $[ +l $2 $0 $4 $7 $\ +l $2 $0 $4 $7 $] +l $2 $0 $4 $7 $^ +l $2 $0 $4 $7 $_ +l $2 $0 $4 $7 $` +l $2 $0 $4 $7 ${ +l $2 $0 $4 $7 $| +l $2 $0 $4 $7 $} +l $2 $0 $4 $7 $~ +l $2 $0 $4 $8 $ +l $2 $0 $4 $8 $! +l $2 $0 $4 $8 $" +l $2 $0 $4 $8 $# +l $2 $0 $4 $8 $$ +l $2 $0 $4 $8 $% +l $2 $0 $4 $8 $& +l $2 $0 $4 $8 $' +l $2 $0 $4 $8 $( +l $2 $0 $4 $8 $) +l $2 $0 $4 $8 $* +l $2 $0 $4 $8 $+ +l $2 $0 $4 $8 $, +l $2 $0 $4 $8 $- +l $2 $0 $4 $8 $. +l $2 $0 $4 $8 $/ +l $2 $0 $4 $8 $: +l $2 $0 $4 $8 $; +l $2 $0 $4 $8 $< +l $2 $0 $4 $8 $= +l $2 $0 $4 $8 $> +l $2 $0 $4 $8 $? +l $2 $0 $4 $8 $@ +l $2 $0 $4 $8 $[ +l $2 $0 $4 $8 $\ +l $2 $0 $4 $8 $] +l $2 $0 $4 $8 $^ +l $2 $0 $4 $8 $_ +l $2 $0 $4 $8 $` +l $2 $0 $4 $8 ${ +l $2 $0 $4 $8 $| +l $2 $0 $4 $8 $} +l $2 $0 $4 $8 $~ +l $2 $0 $4 $9 $ +l $2 $0 $4 $9 $! +l $2 $0 $4 $9 $" +l $2 $0 $4 $9 $# +l $2 $0 $4 $9 $$ +l $2 $0 $4 $9 $% +l $2 $0 $4 $9 $& +l $2 $0 $4 $9 $' +l $2 $0 $4 $9 $( +l $2 $0 $4 $9 $) +l $2 $0 $4 $9 $* +l $2 $0 $4 $9 $+ +l $2 $0 $4 $9 $, +l $2 $0 $4 $9 $- +l $2 $0 $4 $9 $. +l $2 $0 $4 $9 $/ +l $2 $0 $4 $9 $: +l $2 $0 $4 $9 $; +l $2 $0 $4 $9 $< +l $2 $0 $4 $9 $= +l $2 $0 $4 $9 $> +l $2 $0 $4 $9 $? +l $2 $0 $4 $9 $@ +l $2 $0 $4 $9 $[ +l $2 $0 $4 $9 $\ +l $2 $0 $4 $9 $] +l $2 $0 $4 $9 $^ +l $2 $0 $4 $9 $_ +l $2 $0 $4 $9 $` +l $2 $0 $4 $9 ${ +l $2 $0 $4 $9 $| +l $2 $0 $4 $9 $} +l $2 $0 $4 $9 $~ +l $2 $1 +l $2 $2 +l $2 $3 +l $2 $4 +l $2 $5 +l $2 $6 +l $2 $7 +l $2 $8 +l $2 $9 +l $3 +l $3 $0 +l $3 $1 +l $3 $2 +l $3 $3 +l $3 $4 +l $3 $5 +l $3 $6 +l $3 $7 +l $3 $8 +l $3 $9 +l $4 $0 +l $4 $1 +l $4 $2 +l $4 $3 +l $4 $4 +l $4 $5 +l $4 $6 +l $4 $7 +l $4 $8 +l $4 $9 +l $5 +l $5 $0 +l $5 $1 +l $5 $2 +l $5 $3 +l $5 $4 +l $5 $5 +l $5 $6 +l $5 $7 +l $5 $8 +l $5 $9 +l $6 +l $6 $0 +l $6 $1 +l $6 $2 +l $6 $3 +l $6 $4 +l $6 $5 +l $6 $6 +l $6 $7 +l $6 $8 +l $6 $9 +l $7 $0 +l $7 $1 +l $7 $2 +l $7 $3 +l $7 $4 +l $7 $5 +l $7 $6 +l $7 $7 +l $7 $8 +l $7 $9 +l $8 +l $8 $0 +l $8 $1 +l $8 $2 +l $8 $3 +l $8 $4 +l $8 $5 +l $8 $6 +l $8 $7 +l $8 $8 +l $8 $9 +l $9 +l $9 $0 +l $9 $1 +l $9 $2 +l $9 $3 +l $9 $4 +l $9 $5 +l $9 $6 +l $9 $7 +l $9 $8 +l $9 $9 +l $@ $a $m $e $l $e $. $c $o $m +l $@ $a $o $l $. $c $o $m +l $@ $c $o $m $c $a $s $t $. $n $e $t +l $@ $c $o $x $. $n $e $t +l $@ $f $a $s $t $m $a $i $l $. $f $m +l $@ $g $a $w $a $b $. $c $o $m +l $@ $g $m $a $i $l $. $c $o $m +l $@ $g $m $x $. $c $o $m +l $@ $g $m $x $. $u $s +l $@ $h $o $t $m $a $i $l $. $c $o $m +l $@ $i $n $b $o $x $. $r $u +l $@ $l $i $v $e $. $c $o $. $u $k +l $@ $l $i $v $e $. $c $o $m +l $@ $m $a $i $l $. $c $o $m +l $@ $m $a $i $l $. $r $u +l $@ $m $s $n $. $c $o $m +l $@ $v $e $r $i $z $o $n $. $n $e $t +l $@ $w $p $. $p $l +l $@ $y $a $h $o $o $. $c $a +l $@ $y $a $h $o $o $. $c $o $. $i $n +l $@ $y $a $h $o $o $. $c $o $. $u $k +l $@ $y $a $h $o $o $. $c $o $m +l $@ $y $m $a $i $l $. $c $o $m +l $@ $z $o $h $o $. $c $o $m +l $S +l $a +l $a $b $l $e +l $a $c $l $e +l $a $g $e +l $a $l +l $a $l $l $y +l $a $m +l $a $n +l $a $n $a +l $a $n $c $e +l $a $n $d +l $a $n $e +l $a $n $t +l $a $r $y +l $a $s $e +l $a $t $i $o $n +l $a $t $i $v $e +l $a $u $x +l $b +l $b $a $b $y +l $b $a $c $k +l $b $a $l $l +l $b $e $l $l +l $b $o $o $k +l $b $o $y +l $b $r $o $w $n +l $c +l $c $y +l $d +l $d $a $v $i $d +l $d $a $y +l $d $o $m $e +l $e +l $e $a $u +l $e $e +l $e $l $l $a +l $e $n +l $e $n $c $e +l $e $n $t +l $e $o $u $s +l $e $r +l $e $r $y +l $e $s +l $e $s $s +l $e $s $t +l $e $t +l $e $t $t $e +l $f +l $f $a $r $m $v $i $l $l $e +l $f $o $r $m +l $f $u $l +l $f $u $l $l $y +l $g +l $g $e $n $y +l $h +l $h $e $a $d +l $h $o $o $d +l $i $a $l +l $i $a $n +l $i $b $l $e +l $i $c +l $i $c $e $s +l $i $c $l $e +l $i $d $e +l $i $e $r +l $i $e $s +l $i $e $s $t +l $i $f $y +l $i $l $e +l $i $l $i $a +l $i $l $y +l $i $n $e +l $i $n $g +l $i $o $n +l $i $o $u $s +l $i $s $e +l $i $s $h +l $i $s $m +l $i $s $t +l $i $t $e +l $i $t $i $c +l $i $t $i $o $n +l $i $t $i $v $e +l $i $t $y +l $i $v $e +l $i $x +l $i $z $e +l $j +l $j $o $h $n +l $j $o $h $n $s $o $n +l $j $o $n $e $s +l $k +l $k $h $a $n +l $k $i $n +l $l +l $l $a $n $d +l $l $e $e +l $l $e $s $s +l $l $e $t +l $l $i $k $e +l $l $i $n $e +l $l $i $n $g +l $l $o $n $g +l $l $o $o $p +l $l $y +l $m $a $n +l $m $e $n +l $m $e $n $t +l $m $i $c $h $a $e $l +l $m $i $k $e +l $n +l $n $e $s $s +l $o +l $o $e $s +l $o $i $d +l $o $l +l $o $l $o $g $y +l $o $m $y +l $o $n +l $o $r +l $o $r $y +l $o $s $e +l $o $u $r +l $o $u $s +l $o $u $t +l $o $v $e $r +l $p +l $p $a $s $s +l $p $h $p $b $b +l $q +l $q $w $e $r $t $y +l $r +l $r $o $o $m +l $s $a $l $a $s $a $n $a +l $s $e $r $v $e $r +l $s $e $s +l $s $e $x $y +l $s $h +l $s $h $i $p +l $s $i $d $e +l $s $i $o $n +l $s $i $s +l $s $m $i $t $h +l $s $o $m $e +l $t $e $s $t +l $t $h $e +l $t $i $o $n +l $t $y +l $u +l $u $m +l $u $p +l $v +l $w +l $w $a $y +l $w $i $s $e +l $w $o $o $d +l $x +l $y +l $z +l $~ $! $@ $# $$ +l '5 +l T1 +l Z3 Y2 $4 x54 '6 +l [ ^A +l [ ^B +l [ ^C +l [ ^D +l [ ^E +l [ ^F +l [ ^G +l [ ^H +l [ ^I +l [ ^J +l [ ^K +l [ ^L +l [ ^M +l [ ^N +l [ ^O +l [ ^P +l [ ^Q +l [ ^R +l [ ^S +l [ ^T +l [ ^U +l [ ^V +l [ ^W +l [ ^X +l [ ^Y +l [ ^Z +l [ ^a +o0b l +l [ ^c +l [ ^d +l [ ^f +l [ ^g +l [ ^h +l [ ^i +l [ ^j +l [ ^l +l [ ^m +l [ ^n +l [ ^o +l [ ^q +l [ ^r +l [ ^s +l [ ^t +l [ ^u +l [ ^v +l [ ^w +l [ ^x +l [ ^y +l [ ^z +l ] $A +l ] $B +l ] $C +l ] $D +l ] $E +l ] $F +l ] $G +l ] $H +l ] $I +l ] $J +l ] $K +l ] $L +l ] $M +l ] $N +l ] $O +l ] $P +l ] $Q +l ] $R +l ] $S +l ] $T +l ] $U +l ] $V +l ] $W +l ] $X +l ] $Y +l ] $Z +l ] $a +l ] $b +l ] $c +l ] $d +l ] $e +l ] $e $d +l ] $e $s +l ] $f +l ] $g +l ] $h +l ] $i +l ] $i $n $g +l ] $j +l ] $k +l ] $l +l ] $m +l ] $n +l ] $p +l ] $q +l ] $r +l ] $s +l ] $t +l ] $u +l ] $v +l ] $w +l ] $x +l ] $y +l ] $z +l ^ ^I +l ^ ^a +l ^ ^a ^ ^m ^i +l ^ ^d ^n ^a ^s +l ^ ^e ^h ^t +l ^ ^e ^r ^a ^ ^e ^w +l ^ ^e ^r ^a ^ ^u ^o ^y +l ^ ^e ^r ^a ^ ^y ^e ^h ^t +l ^ ^e ^v ^a ^h ^ ^i +l ^ ^i +l ^ ^l ^l ^i ^m +l ^ ^m ^' ^I +l ^ ^m ^' ^i +l ^ ^m ^a ^ ^i +l ^ ^p ^o ^t +l ^ ^r ^ ^e ^w +l ^ ^r ^ ^u ^o ^y +l ^ ^r ^ ^y ^e ^h ^t +l ^ ^s ^i ^ ^e ^h +l ^ ^s ^i ^ ^e ^h ^s +l ^ ^s ^i ^ ^s ^i ^h ^t +l ^ ^s ^i ^ ^t ^i +l ^ ^t ^' ^n ^o ^d ^ ^i +l ^ ^t ^n ^o ^d ^ ^i +l ^ ^t ^o ^n ^ ^m ^a ^ ^i +l ^ ^u +l ^ ^u ^o ^y ^ +l ^ ^y ^m +l ^! +l ^- ^i ^m ^e ^s +l ^- ^n ^o ^n +l ^- ^r ^e ^p ^y ^h +l ^- ^r ^e ^v ^o +l ^- ^s ^i ^m +l ^- ^t ^n ^a +l ^- ^x ^e +l ^0 ^0 ^0 ^2 +l ^0 ^1 ^0 ^2 +l ^0 ^2 ^0 ^2 +l ^0 ^3 ^0 ^2 +l ^0 ^4 ^0 ^2 +l ^0 ^4 ^9 ^1 +l ^0 ^5 ^9 ^1 +l ^0 ^6 ^9 ^1 +l ^0 ^7 ^9 ^1 +l ^0 ^8 ^9 ^1 +l ^0 ^9 ^9 ^1 +l ^1 +l ^1 ^0 ^0 ^2 +l ^1 ^1 ^0 ^2 +l ^1 ^2 ^0 ^2 +l ^1 ^2 ^3 +l ^1 ^3 ^0 ^2 +l ^1 ^4 ^0 ^2 +l ^1 ^4 ^9 ^1 +l ^1 ^5 ^9 ^1 +l ^1 ^6 ^9 ^1 +l ^1 ^7 ^9 ^1 +l ^1 ^8 ^9 ^1 +l ^1 ^9 ^9 ^1 +l ^2 ^0 ^0 ^2 +l ^2 ^1 ^0 ^2 +l ^2 ^2 ^0 ^2 +l ^2 ^3 ^0 ^2 +l ^2 ^4 ^0 ^2 +l ^2 ^4 ^9 ^1 +l ^2 ^5 ^9 ^1 +l ^2 ^6 ^9 ^1 +l ^2 ^7 ^9 ^1 +l ^2 ^8 ^9 ^1 +l ^2 ^9 ^9 ^1 +l ^3 ^0 ^0 ^2 +l ^3 ^1 ^0 ^2 +l ^3 ^2 ^0 ^2 +l ^3 ^2 ^1 +l ^3 ^3 ^0 ^2 +l ^3 ^4 ^0 ^2 +l ^3 ^4 ^9 ^1 +l ^3 ^5 ^9 ^1 +l ^3 ^6 ^9 ^1 +l ^3 ^7 ^9 ^1 +l ^3 ^8 ^9 ^1 +l ^3 ^9 ^9 ^1 +l ^4 ^0 ^0 ^2 +l ^4 ^1 ^0 ^2 +l ^4 ^2 ^0 ^2 +l ^4 ^3 ^0 ^2 +l ^4 ^4 ^0 ^2 +l ^4 ^4 ^9 ^1 +l ^4 ^5 ^9 ^1 +l ^4 ^6 ^9 ^1 +l ^4 ^7 ^9 ^1 +l ^4 ^8 ^9 ^1 +l ^4 ^9 ^9 ^1 +l ^5 ^0 ^0 ^2 +l ^5 ^1 ^0 ^2 +l ^5 ^2 ^0 ^2 +l ^5 ^3 ^0 ^2 +l ^5 ^4 ^0 ^2 +l ^5 ^4 ^9 ^1 +l ^5 ^5 ^9 ^1 +l ^5 ^6 ^9 ^1 +l ^5 ^7 ^9 ^1 +l ^5 ^8 ^9 ^1 +l ^5 ^9 ^9 ^1 +l ^6 ^0 ^0 ^2 +l ^6 ^1 ^0 ^2 +l ^6 ^2 ^0 ^2 +l ^6 ^3 ^0 ^2 +l ^6 ^4 ^0 ^2 +l ^6 ^4 ^9 ^1 +l ^6 ^5 ^9 ^1 +l ^6 ^6 ^9 ^1 +l ^6 ^7 ^9 ^1 +l ^6 ^8 ^9 ^1 +l ^6 ^9 ^9 ^1 +l ^7 ^0 ^0 ^2 +l ^7 ^1 ^0 ^2 +l ^7 ^2 ^0 ^2 +l ^7 ^3 ^0 ^2 +l ^7 ^4 ^0 ^2 +l ^7 ^4 ^9 ^1 +l ^7 ^5 ^9 ^1 +l ^7 ^6 ^9 ^1 +l ^7 ^7 ^9 ^1 +l ^7 ^8 ^9 ^1 +l ^7 ^9 ^9 ^1 +l ^8 ^0 ^0 ^2 +l ^8 ^1 ^0 ^2 +l ^8 ^2 ^0 ^2 +l ^8 ^3 ^0 ^2 +l ^8 ^4 ^0 ^2 +l ^8 ^4 ^9 ^1 +l ^8 ^5 ^9 ^1 +l ^8 ^6 ^9 ^1 +l ^8 ^7 ^9 ^1 +l ^8 ^8 ^9 ^1 +l ^8 ^9 ^9 ^1 +l ^9 ^0 ^0 ^2 +l ^9 ^1 ^0 ^2 +l ^9 ^2 ^0 ^2 +l ^9 ^3 ^0 ^2 +l ^9 ^4 ^0 ^2 +l ^9 ^4 ^9 ^1 +l ^9 ^5 ^9 ^1 +l ^9 ^6 ^9 ^1 +l ^9 ^7 ^9 ^1 +l ^9 ^8 ^9 ^1 +l ^9 ^9 ^9 ^1 +l ^@ +l ^a ^e ^s +l ^a ^e ^t +l ^a ^g ^e ^m +l ^a ^i ^d +l ^a ^n ^a +l ^a ^r ^t ^l ^u +l ^b ^b ^p ^h ^p ] ] ] ] +l ^b ^o +l ^b ^u ^s +l ^c ^c ^a +l ^d ^a ^b +l ^d ^a ^e ^d +l ^d ^a ^e ^h +l ^d ^a ^e ^l +l ^d ^d ^a +l ^d ^e ^b +l ^d ^e ^e ^s +l ^d ^e ^r +l ^d ^i ^m +l ^d ^l ^o ^g +l ^d ^n ^a ^b +l ^d ^n ^a ^h +l ^d ^n ^a ^l +l ^d ^n ^i ^h +l ^d ^n ^i ^w +l ^d ^o ^o ^g +l ^d ^o ^o ^w +l ^d ^r ^a ^h +l ^d ^r ^o ^c +l ^d ^r ^o ^w ^s ^s ^a ^p +l ^d ^u ^m +l ^e ^b +l ^e ^c ^a ^f +l ^e ^c ^a ^l +l ^e ^c ^i +l ^e ^c ^i ^v +l ^e ^d +l ^e ^d ^i ^s +l ^e ^e ^n ^k +l ^e ^e ^r ^f +l ^e ^l ^e ^t +l ^e ^n ^i ^l +l ^e ^n ^o ^t ^s +l ^e ^r +l ^e ^r ^i ^f +l ^e ^r ^o ^f +l ^e ^r ^p +l ^e ^s ^o ^n +l ^e ^t ^n ^a +l ^e ^v ^a ^h ^i +l ^e ^y ^e +l ^f ^f ^o +l ^f ^l ^a ^h +l ^f ^l ^e ^s +l ^g ^e ^l +l ^g ^i ^p +l ^g ^n ^i ^k +l ^g ^n ^i ^r +l ^g ^n ^i ^w +l ^g ^n ^o ^l +l ^g ^o ^d +l ^g ^o ^l +l ^h ^c ^r ^a +l ^h ^g ^i ^h +l ^h ^s ^a +l ^h ^s ^a ^w +l ^h ^s ^i ^f +l ^h ^t ^a ^b +l ^h ^t ^r ^a ^e +l ^i +l ^i ^b +l ^i ^l ^e ^h +l ^i ^m ^e ^d +l ^i ^m ^e ^s +l ^i ^n ^i ^m +l ^i ^n ^m ^o +l ^i ^p ^e +l ^i ^r ^t +l ^i ^t ^l ^u ^m +l ^i ^t ^n ^a +l ^i ^x ^a ^m +l ^k ^c ^a ^b +l ^k ^l ^i ^m +l ^k ^n ^i +l ^k ^o ^o ^b +l ^k ^r ^o ^w +l ^l ^a ^m +l ^l ^a ^o ^c +l ^l ^i +l ^l ^i ^a ^j +l ^l ^i ^a ^r +l ^l ^i ^a ^s +l ^l ^i ^a ^t +l ^l ^i ^o +l ^l ^l ^a ^f +l ^l ^l ^i +l ^l ^l ^i ^p +l ^l ^l ^o ^r +l ^l ^o ^o ^w +l ^m ^' ^I +l ^m ^' ^i +l ^m ^a ^ ^i +l ^m ^e +l ^m ^i +l ^m ^o ^c +l ^m ^r ^a ^f +l ^m ^r ^o ^w +l ^m ^u ^g +l ^n ^a ^m +l ^n ^e +l ^n ^e ^p +l ^n ^i +l ^n ^i ^m ^d ^a +l ^n ^i ^p +l ^n ^i ^t +l ^n ^o +l ^n ^o ^c +l ^n ^o ^n +l ^n ^o ^o ^m +l ^n ^r ^o ^c +l ^n ^u +l ^n ^u ^g +l ^n ^u ^s +l ^n ^w ^o ^d +l ^o ^c +l ^o ^d ^u ^e ^s ^p +l ^o ^e ^n +l ^o ^i ^b +l ^o ^l ^i ^k +l ^o ^l ^l ^a +l ^o ^n ^o ^m +l ^o ^o ^z +l ^o ^p ^y ^h +l ^o ^r ^c ^a +l ^o ^r ^c ^a ^m +l ^o ^r ^c ^i ^m +l ^o ^r ^e ^a +l ^o ^r ^p +l ^o ^r ^y ^g +l ^o ^s ^i +l ^o ^t ^c ^e +l ^o ^t ^u ^a +l ^p ^m ^a ^c +l ^p ^u +l ^r ^a ^e +l ^r ^a ^e ^b +l ^r ^a ^o +l ^r ^a ^p +l ^r ^a ^w +l ^r ^e ^d ^n ^u +l ^r ^e ^p +l ^r ^e ^p ^u ^s +l ^r ^e ^p ^y ^h +l ^r ^e ^t ^a ^w +l ^r ^e ^t ^f ^a +l ^r ^e ^t ^n ^i +l ^r ^e ^t ^n ^u ^o ^c +l ^r ^e ^v ^o +l ^r ^i +l ^r ^i ^a +l ^r ^i ^a ^h +l ^r ^o ^f +l ^r ^o ^o ^d +l ^r ^o ^t ^a ^r ^t ^s ^i ^n ^i ^m ^d ^a +l ^r ^u ^s +l ^s ^i ^d +l ^s ^i ^h ^t +l ^s ^i ^m +l ^s ^n ^a ^r ^t +l ^s ^s ^a ^p +l ^s ^s ^o ^r ^c +l ^s ^y ^d +l ^t ^a ^b +l ^t ^a ^c +l ^t ^a ^f +l ^t ^a ^h +l ^t ^a ^o ^b +l ^t ^a ^r +l ^t ^c ^a ^l +l ^t ^e ^j +l ^t ^f ^o ^s +l ^t ^h ^g ^i ^n +l ^t ^n ^e ^c +l ^t ^o ^h +l ^t ^o ^n ^k +l ^t ^o ^o ^b +l ^t ^o ^o ^f +l ^t ^o ^p +l ^t ^p ^e ^h +l ^t ^s ^o ^p +l ^t ^u ^c +l ^t ^u ^o +l ^u ^e +l ^w ^a ^j +l ^w ^a ^s +l ^w ^e ^n +l ^w ^o ^b +l ^w ^o ^c +l ^w ^o ^l +l ^w ^o ^n ^s +l ^w ^o ^t +l ^x ^a +l ^x ^a ^t +l ^x ^e +l ^x ^o +l ^y ^a ^d +l ^y ^a ^d ^i ^r ^f +l ^y ^a ^d ^n ^o ^m +l ^y ^a ^d ^n ^u ^s +l ^y ^a ^d ^r ^u ^t ^a ^s +l ^y ^a ^d ^s ^e ^n ^d ^e ^w +l ^y ^a ^d ^s ^r ^u ^h ^t +l ^y ^a ^d ^s ^u ^e ^t +l ^y ^a ^l +l ^y ^a ^l ^p +l ^y ^a ^p +l ^y ^a ^w +l ^y ^b +l ^y ^e ^k +l ^y ^k ^s +l ^y ^l ^o ^p +l ^y ^m +l i5s '6 +l x12 +l x23 d +l x31 o0$ o0% o0* @@ -19413,42 +19031,11 @@ o02 o03 o08 o0@ -o0B -o0C -o0E -o0F -o0G -o0J -o0K -o0M -o0N -o0P -o0a -o0b -o0bl -o0bo1lo2uo3e -o0c -o0d -o0f -o0g -o0j -o0k -o0l -o0m +o0b o1l o2u o3e o0m o1a -o0n -o0p -o0po1ho2po3b,4 -o0r -o0s -o0t -o0to1eo2so3t -o0to1ho2e -o0v -o0w -o0x -o0y -o0z +o0p o1h o2p o3b ,4 +o0t o1e o2s o3t +o0t o1h o2e o10 o11 o13 @@ -19599,172 +19186,170 @@ oAl oAw oB6 oB9 -p1 -p1x26 -p1x28Y4'4d +p1 x26 p2 p2 '7 p1 O58 p3 -p4x5A'6 +p4 x5A '6 p5 q r r k r t -r$S -r$a -r$a$b$l$e -r$a$c$l$e -r$a$g$e -r$a$l -r$a$l$l$y -r$a$m -r$a$n -r$a$n$a -r$a$n$c$e -r$a$n$d -r$a$n$e -r$a$n$t -r$a$r$y -r$a$s$e -r$a$t$i$o$n -r$a$t$i$v$e -r$a$u$x -r$b -r$b$a$b$y -r$b$a$c$k -r$b$a$l$l -r$b$e$l$l -r$b$o$o$k -r$b$o$y -r$c -r$c$y -r$d -r$d$a$y -r$d$o$m$e -r$e -r$e$a$u -r$e$d -r$e$e -r$e$l$l$a -r$e$n -r$e$n$c$e -r$e$n$t -r$e$o$u$s -r$e$r -r$e$r$y -r$e$s -r$e$s$s -r$e$s$t -r$e$t -r$e$t$t$e -r$f -r$f$o$r$m -r$f$u$l -r$f$u$l$l$y -r$g -r$g$e$n$y -r$h -r$h$e$a$d -r$h$o$o$d -r$i -r$i$a$l -r$i$a$n -r$i$b$l$e -r$i$c -r$i$c$e$s -r$i$c$l$e -r$i$d$e -r$i$e$r -r$i$e$s -r$i$e$s$t -r$i$f$y -r$i$l$e -r$i$l$i$a -r$i$l$y -r$i$n$e -r$i$n$g -r$i$o$n -r$i$o$u$s -r$i$s$e -r$i$s$h -r$i$s$m -r$i$s$t -r$i$t$e -r$i$t$i$c -r$i$t$i$o$n -r$i$t$i$v$e -r$i$t$y -r$i$v$e -r$i$x -r$i$z$e -r$j -r$k -r$k$i$n -r$l -r$l$a$n$d -r$l$e$s$s -r$l$e$t -r$l$i$k$e -r$l$i$n$e -r$l$i$n$g -r$l$o$n$g -r$l$o$o$p -r$l$y -r$m -r$m$a$n -r$m$e$n -r$m$e$n$t -r$n -r$n$e$s$s -r$o -r$o$e$s -r$o$i$d -r$o$l -r$o$l$o$g$y -r$o$m$y -r$o$n -r$o$r -r$o$r$y -r$o$s$e -r$o$u$r -r$o$u$s -r$o$u$t -r$o$v$e$r -r$p -r$p$a$s$s -r$q -r$r -r$r$o$o$m -r$s -r$s$e$s -r$s$e$x$y -r$s$h -r$s$h$i$p -r$s$i$d$e -r$s$i$o$n -r$s$i$s -r$s$o$m$e -r$t -r$t$h$e -r$t$i$o$n -r$t$y -r$u -r$u$m -r$u$p -r$v -r$w -r$w$a$y -r$w$i$s$e -r$w$o$o$d -r$x -r$y -r$z -r$~$!$@$#$$ +r $S +r $a +r $a $b $l $e +r $a $c $l $e +r $a $g $e +r $a $l +r $a $l $l $y +r $a $m +r $a $n +r $a $n $a +r $a $n $c $e +r $a $n $d +r $a $n $e +r $a $n $t +r $a $r $y +r $a $s $e +r $a $t $i $o $n +r $a $t $i $v $e +r $a $u $x +r $b +r $b $a $b $y +r $b $a $c $k +r $b $a $l $l +r $b $e $l $l +r $b $o $o $k +r $b $o $y +r $c +r $c $y +r $d +r $d $a $y +r $d $o $m $e +r $e +r $e $a $u +r $e $d +r $e $e +r $e $l $l $a +r $e $n +r $e $n $c $e +r $e $n $t +r $e $o $u $s +r $e $r +r $e $r $y +r $e $s +r $e $s $s +r $e $s $t +r $e $t +r $e $t $t $e +r $f +r $f $o $r $m +r $f $u $l +r $f $u $l $l $y +r $g +r $g $e $n $y +r $h +r $h $e $a $d +r $h $o $o $d +r $i +r $i $a $l +r $i $a $n +r $i $b $l $e +r $i $c +r $i $c $e $s +r $i $c $l $e +r $i $d $e +r $i $e $r +r $i $e $s +r $i $e $s $t +r $i $f $y +r $i $l $e +r $i $l $i $a +r $i $l $y +r $i $n $e +r $i $n $g +r $i $o $n +r $i $o $u $s +r $i $s $e +r $i $s $h +r $i $s $m +r $i $s $t +r $i $t $e +r $i $t $i $c +r $i $t $i $o $n +r $i $t $i $v $e +r $i $t $y +r $i $v $e +r $i $x +r $i $z $e +r $j +r $k +r $k $i $n +r $l +r $l $a $n $d +r $l $e $s $s +r $l $e $t +r $l $i $k $e +r $l $i $n $e +r $l $i $n $g +r $l $o $n $g +r $l $o $o $p +r $l $y +r $m +r $m $a $n +r $m $e $n +r $m $e $n $t +r $n +r $n $e $s $s +r $o +r $o $e $s +r $o $i $d +r $o $l +r $o $l $o $g $y +r $o $m $y +r $o $n +r $o $r +r $o $r $y +r $o $s $e +r $o $u $r +r $o $u $s +r $o $u $t +r $o $v $e $r +r $p +r $p $a $s $s +r $q +r $r +r $r $o $o $m +r $s +r $s $e $s +r $s $e $x $y +r $s $h +r $s $h $i $p +r $s $i $d $e +r $s $i $o $n +r $s $i $s +r $s $o $m $e +r $t +r $t $h $e +r $t $i $o $n +r $t $y +r $u +r $u $m +r $u $p +r $v +r $w +r $w $a $y +r $w $i $s $e +r $w $o $o $d +r $x +r $y +r $z +r $~ $! $@ $# $$ s - s . s _ -s _c$0$0 +s _ c $0 $0 sa1 sa2 sa4 @@ -19773,8 +19358,8 @@ sa@ sa@ st+ sa@ st+ sv^ sa@ sv^ -sa@sc*73 -$2^r -$2^x'6 -$2c$H -$2d -$2dD4 -$2dD5 -$2dD6 -$2dD7 -$2d] -$2i2a -$2i57 -$2i6R -$2i6a -$2i8B -$2l -$2o0p -$2o2T -$2o62 -$2o67 -$2o6F -$2o8b -$2o9 -$2q -$2r -$2sbR -$2sqrt -$2t -$2tO62 -$2O24O64 -$2O32 -$2O42O16 -$2O51 -$2O53 -$2O61 -$2O73 -$2O74O04 -$2O82 -$2OA2 -$2z3 -$2z4 -$2{ +$2 $! +$2 $" +$2 $% +$2 $* +$2 $0 +$2 $0 $0 $0 +$2 $0 $0 $1 +$2 $0 $0 $2 +$2 $0 $0 $3 +$2 $0 $0 $4 +$2 $0 $0 $5 +$2 $0 $0 $6 +$2 $0 $0 $7 +$2 $0 $0 $8 +$2 $0 $0 $9 +$2 $0 $1 $0 +$2 $0 $1 $1 +$2 $0 $1 $2 +$2 $0 $1 $3 +$2 $0 $1 $4 +$2 $0 $1 $5 +$2 $0 $1 $6 +$2 $0 $1 $7 +$2 $0 $1 $8 +$2 $0 $1 $9 +$2 $0 $2 $0 +$2 $0 $2 $1 +$2 $0 $2 $2 +$2 $0 $2 $3 +$2 $0 $2 $4 +$2 $0 $2 $5 +$2 $0 $2 $6 +$2 $0 $2 $7 +$2 $0 $2 $8 +$2 $0 $2 $9 +$2 $1 +$2 $2 +$2 $2 $2 +$2 $3 +$2 $3 $4 +$2 $4 +$2 $5 +$2 $6 +$2 $7 +$2 $8 +$2 $9 +$2 $U +$2 $] +$2 $d +$2 $i +$2 $k +$2 $m $e +$2 $o +$2 $u +$2 $x +$2 *03 $i +$2 *14 +$2 *30 +$2 *32 +$2 *52 +$2 *57 +$2 *68 +$2 *78 +$2 *81 +$2 +3 +$2 +4 +$2 +7 +$2 -3 +$2 -9 +$2 @u +$2 C +$2 D4 +$2 L1 +$2 L5 Z1 +$2 R1 +$2 R3 +$2 R6 +$2 T0 +$2 Z2 *29 +$2 Z3 +$2 Z4 +$2 Z5 D9 +$2 [ z3 +$2 ^4 +$2 ^> *73 +$2 ^r +$2 ^x '6 +$2 c $H +$2 d +$2 d D4 +$2 d D5 +$2 d D6 +$2 d D7 +$2 d ] +$2 i2a +$2 i57 +$2 i6R +$2 i6a +$2 i8B +$2 l +$2 o0p +$2 o2T +$2 o62 +$2 o67 +$2 o6F +$2 o8b +$2 o9 +$2 q +$2 r +$2 sbR +$2 sqr t +$2 t +$2 t O62 +$2 O24 O64 +$2 O32 +$2 O42 O16 +$2 O51 +$2 O53 +$2 O61 +$2 O73 +$2 O74 O04 +$2 O82 +$2 OA2 +$2 z3 +$2 z4 +$2 { $3 -$3$% -$3$* -$3$0 -$3$0$0$0 -$3$1 -$3$2 -$3$2$1 -$3$3 -$3$3$3 -$3$4 -$3$4$5 -$3$5 -$3$6 -$3$7 -$3$8 -$3$9 -$3$d -$3$f -$3$i -$3$j -$3$k -$3*12 -$3*57 -$3*74 -$3*97 -$3+2 -$3+5 -$3+8 -$3-8 -$3-9*57 -$3@e -$3@o -$3C -$3D2 -$3D3 -$3D4z1 -$3DA -$3L0 -$3T2 -$3Z3 -$3Z4 -$3Z5 -$3^5T7 -$3^N -$3^d -$3c -$3d -$3dD4 -$3dD5 -$3dD6 -$3dD7 -$3dZ1 -$3d] -$3dO58 -$3f -$3i1a -$3i2h*41 -$3i3f -$3i66 -$3i6@ -$3i7< -$3i7y -$3i8< -$3k -$3o4/ -$3o4g -$3o58 -$3o62 -$3o6= -$3o6z -$3r -$3s5aO12 -$3sfs -$3snk -$3srl -$3szb -$3t -$3t^q -$3ti9? -$3u -$3O02 -$3O09 -$3O28 -$3O42u -$3O61 -$3O71 -$3O92 -$3z2 -$3{ +$3 $% +$3 $* +$3 $0 +$3 $0 $0 $0 +$3 $1 +$3 $2 +$3 $2 $1 +$3 $3 +$3 $3 $3 +$3 $4 +$3 $4 $5 +$3 $5 +$3 $6 +$3 $7 +$3 $8 +$3 $9 +$3 $d +$3 $f +$3 $i +$3 $j +$3 $k +$3 *12 +$3 *57 +$3 *74 +$3 *97 +$3 +2 +$3 +5 +$3 +8 +$3 -8 +$3 -9 *57 +$3 @e +$3 @o +$3 C +$3 D2 +$3 D3 +$3 D4 z1 +$3 DA +$3 L0 +$3 T2 +$3 Z3 +$3 Z4 +$3 Z5 +$3 ^5 T7 +$3 ^N +$3 ^d +$3 c +$3 d +$3 d D4 +$3 d D5 +$3 d D6 +$3 d D7 +$3 d Z1 +$3 d ] +$3 d O58 +$3 f +$3 i1a +$3 i2h *41 +$3 i3f +$3 i66 +$3 i6@ +$3 i7< +$3 i7y +$3 i8< +$3 k +$3 o4/ +$3 o4g +$3 o58 +$3 o62 +$3 o6= +$3 o6z +$3 r +$3 s5a O12 +$3 sfs +$3 snk +$3 srl +$3 szb +$3 t +$3 t ^q +$3 t i9? +$3 u +$3 O02 +$3 O09 +$3 O28 +$3 O42 u +$3 O61 +$3 O71 +$3 O92 +$3 z2 +$3 { $4 -$4$0 -$4$0$0$0 -$4$1 -$4$2 -$4$3 -$4$3$2$1 -$4$4 -$4$4$4 -$4$5 -$4$5$6 -$4$6 -$4$7 -$4$8 -$4$9 -$4$M$e -$4$a$l$l -$4$e$v$e$r -$4$f$r$e$e -$4$l$i$f$e -$4$m$e -$4$m$y -$4$u -$4$u$s -$4'8 -$4*85 -$4*86 -$4*89 -$4+0 -$4+2 -$4+8 -$4+9 -$4-7 -$4-8 -$4-9 -$4@5t -$4D7 -$4D9 -$4DA -$4L0Z1 -$4L4$q -$4R0'7 -$4T5 -$4Z3 -$4Z4 -$4Z5 -$4^& -$4^2o60 -$4^c -$4^r -$4d -$4dD4 -$4dD5 -$4dD6 -$4dD7 -$4d] -$4dO49 -$4i5- -$4i5N+7 -$4i5q*15 -$4i5r -$4i8! -$4k -$4o0E -$4o2YO46 -$4o2o -$4o4o -$4o5dO54 -$4o5gZ3 -$4o7R -$4q -$4qq -$4r -$4sdr -$4sma@r -$4sr1 -$4sxm -$4t -$4O02 -$4O13 -$4O21 -$4O23 -$4O35i3b -$4O47 -$4O62 -$4O81 -$4O82 -$4z3 -$4{ -$5 -$5$0 -$5$0$0$0 -$5$1 -$5$2 -$5$3 -$5$4 -$5$4$3$2$1 -$5$5 -$5$5$5 -$5$6 -$5$6$7 -$5$7 -$5$8 -$5$9 -$5*56 -$5*57 -$5*73OA2 -$5*75O63 -$5+1 -$5+5 -$5-1 -$5-7 -$5-8 -$5@6 -$5@w -$5CZ5 -$5D8 -$5DA -$5L8+3 -$5R0 -$5R4 -$5T6 -$5Z1*30 -$5Z3 -$5Z3L4 -$5Z4 -$5Z5O56 -$5[ -$5^$ -$5^+ -$5^j -$5d -$5dD4 -$5dD5 -$5dD6 -$5dD7 -$5d] -$5fL1 -$5i2! -$5i2E -$5i5b*24 -$5i6 -$5i9% -$5l -$5o4- -$5o5l -$5o65 -$5o66 -$5o7o -$5p1O53 -$5q -$5sk1 -$5skw -$5sr#O12 -$5t -$5O21 -$5O32 -$5O41 -$5O51 -$5O52 -$5O91 -$5OB1OB1 -$5z1 -$5z2 -$6 -$6$- -$6$0 -$6$0$0$0 -$6$1 -$6$2 -$6$3 -$6$3sys -$6$4 -$6$5 -$6$5$4$3$2$1 -$6$6 -$6$6$6 -$6$7 -$6$7$8 -$6$8 -$6$9 -$6$B -$6$V -$6$m -$6'4Z5 -$6*05 -$6*57 -$6*9B -$6+4@k -$6+7 -$6+8 -$6-0 -$6-2 -$6-8 -$6-9 -$6@o -$6D6 -$6L1 -$6L5c -$6R1 -$6T2 -$6T3 -$6Z1i4c -$6Z3 -$6Z4 -$6Z5 -$6[ -$6^6o1Q -$6^H -$6c -$6d -$6dD4 -$6dD5 -$6dD6 -$6dD7 -$6d] -$6i0D -$6i1DT4 -$6i2j -$6i39 -$6i7ao6< -$6i7g -$6i8t -$6k -$6o2Z -$6o2r -$6o4D -$6r -$6r+5 -$6s19 -$6svV -$6sw' -$6O05 -$6O16 -$6O23 -$6O26 -$6O34c -$6O53 -$6O61O62 -$6O62 -$6O73 -$6OB4 -$6z4 -$6{ +$4 $0 +$4 $0 $0 $0 +$4 $1 +$4 $2 +$4 $3 +$4 $3 $2 $1 +$4 $4 +$4 $4 $4 +$4 $5 +$4 $5 $6 +$4 $6 +$4 $7 +$4 $8 +$4 $9 +$4 $M $e +$4 $a $l $l +$4 $e $v $e $r +$4 $f $r $e $e +$4 $l $i $f $e +$4 $m $e +$4 $m $y +$4 $u +$4 $u $s +$4 '8 +$4 *85 +$4 *86 +$4 *89 +$4 +0 +$4 +2 +$4 +8 +$4 +9 +$4 -7 +$4 -8 +$4 -9 +$4 @5 t +$4 D7 +$4 D9 +$4 DA +$4 L0 Z1 +$4 L4 $q +$4 R0 '7 +$4 T5 +$4 Z3 +$4 Z4 +$4 Z5 +$4 ^& +$4 ^2 o60 +$4 ^c +$4 ^r +$4 d +$4 d D4 +$4 d D5 +$4 d D6 +$4 d D7 +$4 d ] +$4 d O49 +$4 i5- +$4 i5N +7 +$4 i5q *15 +$4 i5r +$4 i8! +$4 k +$4 o0E +$4 o2Y O46 +$4 o2o +$4 o4o +$4 o5d O54 +$4 o5g Z3 +$4 o7R +$4 q +$4 q q +$4 r +$4 sdr +$4 sma @r +$4 sr1 +$4 sxm +$4 t +$4 O02 +$4 O13 +$4 O21 +$4 O23 +$4 O35 i3b +$4 O47 +$4 O62 +$4 O81 +$4 O82 +$4 z3 +$4 { +$5 +$5 $0 +$5 $0 $0 $0 +$5 $1 +$5 $2 +$5 $3 +$5 $4 +$5 $4 $3 $2 $1 +$5 $5 +$5 $5 $5 +$5 $6 +$5 $6 $7 +$5 $7 +$5 $8 +$5 $9 +$5 *56 +$5 *57 +$5 *73 OA2 +$5 *75 O63 +$5 +1 +$5 +5 +$5 -1 +$5 -7 +$5 -8 +$5 @6 +$5 @w +$5 C Z5 +$5 D8 +$5 DA +$5 L8 +3 +$5 R0 +$5 R4 +$5 T6 +$5 Z1 *30 +$5 Z3 +$5 Z3 L4 +$5 Z4 +$5 Z5 O56 +$5 [ +$5 ^$ +$5 ^+ +$5 ^j +$5 d +$5 d D4 +$5 d D5 +$5 d D6 +$5 d D7 +$5 d ] +$5 f L1 +$5 i2! +$5 i2E +$5 i5b *24 +$5 i6 +$5 i9% +$5 l +$5 o4- +$5 o5l +$5 o65 +$5 o66 +$5 o7o +$5 p1 O53 +$5 q +$5 sk1 +$5 skw +$5 sr# O12 +$5 t +$5 O21 +$5 O32 +$5 O41 +$5 O51 +$5 O52 +$5 O91 +$5 OB1 OB1 +$5 z1 +$5 z2 +$6 +$6 $- +$6 $0 +$6 $0 $0 $0 +$6 $1 +$6 $2 +$6 $3 +$6 $3 sys +$6 $4 +$6 $5 +$6 $5 $4 $3 $2 $1 +$6 $6 +$6 $6 $6 +$6 $7 +$6 $7 $8 +$6 $8 +$6 $9 +$6 $B +$6 $V +$6 $m +$6 '4 Z5 +$6 *05 +$6 *57 +$6 *9B +$6 +4 @k +$6 +7 +$6 +8 +$6 -0 +$6 -2 +$6 -8 +$6 -9 +$6 @o +$6 D6 +$6 L1 +$6 L5 c +$6 R1 +$6 T2 +$6 T3 +$6 Z1 i4c +$6 Z3 +$6 Z4 +$6 Z5 +$6 [ +$6 ^6 o1Q +$6 ^H +$6 c +$6 d +$6 d D4 +$6 d D5 +$6 d D6 +$6 d D7 +$6 d ] +$6 i0D +$6 i1D T4 +$6 i2j +$6 i39 +$6 i7a o6< +$6 i7g +$6 i8t +$6 k +$6 o2Z +$6 o2r +$6 o4D +$6 r +$6 r +5 +$6 s19 +$6 svV +$6 sw' +$6 O05 +$6 O16 +$6 O23 +$6 O26 +$6 O34 c +$6 O53 +$6 O61 O62 +$6 O62 +$6 O73 +$6 OB4 +$6 z4 +$6 { $7 -$7$0 -$7$0$0$0 -$7$1 -$7$2 -$7$3 -$7$4 -$7$5 -$7$6 -$7$7 -$7$7$7 -$7$8 -$7$8$9 -$7$9 -$7$b -$7$e-2 -$7$j -$7$n -$7'6$t -$7*47O61 -$7*51O31 -$7*64 -$7*87 -$7*98 -$7+1 -$7+3 -$7+A -$7-7 -$7@b -$7@i -$7C -$7D2 -$7L0 -$7L1 -$7R7 -$7Z3 -$7Z4 -$7Z5 -$7[ -$7^4 -$7d -$7dD4 -$7dD5 -$7dD6 -$7dD7 -$7d] -$7dO62 -$7i0x -$7i2\O03 -$7i63 -$7k -$7l-0 -$7o0Z -$7o0ksmc -$7o1A -$7o61 -$7o6T -$7p2 -$7s4_ -$7sgc -$7t+0 -$7O03*20 -$7O46'5 -$7O52 -$7O54 -$7O62 -$7O82 -$7O95 -$7OB3 -$7z1 -$7z2 -$7z5 -$7z5O08 -$8 -$8$+ -$8$/ -$8$0 -$8$0$0$0 -$8$1 -$8$2 -$8$3 -$8$4 -$8$5 -$8$6 -$8$7 -$8$8 -$8$8$8 -$8$9 -$8$d -$8$p -$8*01$? -$8*04 -$8*13 -$8*23 -$8*62 -$8*68 -$8*75 -$8*78 -$8*A5 -$8+0*43 -$8-5 -$8-7 -$8@f -$8@m -$8@y -$8D2 -$8D4 -$8DB -$8L1 -$8R1 -$8T2 -$8T8T4 -$8Z3 -$8Z5 -$8^b -$8c -$8d -$8dD4 -$8dD5 -$8dD6 -$8dD7 -$8d] -$8i3N -$8i4e -$8o0dO42 -$8o1u -$8o4cL6 -$8o88 -$8q -$8r -$8s61 -$8s9a -$8t -$8u -$8O23 -$8O42 -$8O46z2 -$8O63 -$8O83 -$8O83-7 -$8O92 -$8z1c -$8z1l -$8z2 -$8z3 -$8{ -$9 -$9$% -$9$0 -$9$0$0$0 -$9$1 -$9$2 -$9$3 -$9$4 -$9$5 -$9$6 -$9$7 -$9$8 -$9$9 -$9$9$9 -$9$O -$9$g -$9$i -$9*01 -$9*04 -$9*12 -$9*14 -$9*15 -$9*20 -$9+4 -$9-4 -$9-6 -$9-8 -$9@8 -$9@g -$9D5 -$9L1 -$9R5 -$9R8 -$9T2 -$9Z3 -$9Z4 -$9Z5 -$9[ -$9^# -$9^D -$9^g -$9^i -$9^l -$9d -$9dD4 -$9dD5 -$9dD6 -$9dD7 -$9d] -$9f+2 -$9i5. -$9i8k -$9i95 -$9l -$9o0% -$9o2yt -$9o5V -$9o5it -$9o76 -$9o84 -$9q -$9r -$9t -$9O04 -$9O07 -$9O25R5 -$9O53 -$9O65 -$9O72 -$9OA2 -$9OB1 -$9z1 -$9z3 -$9z3O35 -$9{ +$7 $0 +$7 $0 $0 $0 +$7 $1 +$7 $2 +$7 $3 +$7 $4 +$7 $5 +$7 $6 +$7 $7 +$7 $7 $7 +$7 $8 +$7 $8 $9 +$7 $9 +$7 $b +$7 $e -2 +$7 $j +$7 $n +$7 '6 $t +$7 *47 O61 +$7 *51 O31 +$7 *64 +$7 *87 +$7 *98 +$7 +1 +$7 +3 +$7 +A +$7 -7 +$7 @b +$7 @i +$7 C +$7 D2 +$7 L0 +$7 L1 +$7 R7 +$7 Z3 +$7 Z4 +$7 Z5 +$7 [ +$7 ^4 +$7 d +$7 d D4 +$7 d D5 +$7 d D6 +$7 d D7 +$7 d ] +$7 d O62 +$7 i0x +$7 i2\ O03 +$7 i63 +$7 k +$7 l -0 +$7 o0Z +$7 o0k smc +$7 o1A +$7 o61 +$7 o6T +$7 p2 +$7 s4_ +$7 sgc +$7 t +0 +$7 O03 *20 +$7 O46 '5 +$7 O52 +$7 O54 +$7 O62 +$7 O82 +$7 O95 +$7 OB3 +$7 z1 +$7 z2 +$7 z5 +$7 z5 O08 +$8 +$8 $+ +$8 $/ +$8 $0 +$8 $0 $0 $0 +$8 $1 +$8 $2 +$8 $3 +$8 $4 +$8 $5 +$8 $6 +$8 $7 +$8 $8 +$8 $8 $8 +$8 $9 +$8 $d +$8 $p +$8 *01 $? +$8 *04 +$8 *13 +$8 *23 +$8 *62 +$8 *68 +$8 *75 +$8 *78 +$8 *A5 +$8 +0 *43 +$8 -5 +$8 -7 +$8 @f +$8 @m +$8 @y +$8 D2 +$8 D4 +$8 DB +$8 L1 +$8 R1 +$8 T2 +$8 T8 T4 +$8 Z3 +$8 Z5 +$8 ^b +$8 c +$8 d +$8 d D4 +$8 d D5 +$8 d D6 +$8 d D7 +$8 d ] +$8 i3N +$8 i4e +$8 o0d O42 +$8 o1u +$8 o4c L6 +$8 o88 +$8 q +$8 r +$8 s61 +$8 s9a +$8 t +$8 u +$8 O23 +$8 O42 +$8 O46 z2 +$8 O63 +$8 O83 +$8 O83 -7 +$8 O92 +$8 z1 c +$8 z1 l +$8 z2 +$8 z3 +$8 { +$9 +$9 $% +$9 $0 +$9 $0 $0 $0 +$9 $1 +$9 $2 +$9 $3 +$9 $4 +$9 $5 +$9 $6 +$9 $7 +$9 $8 +$9 $9 +$9 $9 $9 +$9 $O +$9 $g +$9 $i +$9 *01 +$9 *04 +$9 *12 +$9 *14 +$9 *15 +$9 *20 +$9 +4 +$9 -4 +$9 -6 +$9 -8 +$9 @8 +$9 @g +$9 D5 +$9 L1 +$9 R5 +$9 R8 +$9 T2 +$9 Z3 +$9 Z4 +$9 Z5 +$9 [ +$9 ^# +$9 ^D +$9 ^g +$9 ^i +$9 ^l +$9 d +$9 d D4 +$9 d D5 +$9 d D6 +$9 d D7 +$9 d ] +$9 f +2 +$9 i5. +$9 i8k +$9 i95 +$9 l +$9 o0% +$9 o2y t +$9 o5V +$9 o5i t +$9 o76 +$9 o84 +$9 q +$9 r +$9 t +$9 O04 +$9 O07 +$9 O25 R5 +$9 O53 +$9 O65 +$9 O72 +$9 OA2 +$9 OB1 +$9 z1 +$9 z3 +$9 z3 O35 +$9 { $: -$:$) -$:$1 -$:'7 -$:+0 -$:C -$:D2 -$:D4 -$:R0 -$:T6 -$:Z1 -$:Z2 -$:c -$:d -$:o6( -$:r -$:s:%t +$: $) +$: $1 +$: '7 +$: +0 +$: C +$: D2 +$: D4 +$: R0 +$: T6 +$: Z1 +$: Z2 +$: c +$: d +$: o6( +$: r +$: s:% t $; -$;$) -$;$/ -$;$7 -$;$; -$;*01 -$;*61 -$;-7 -$;D9O81 -$;R4 -$;T0 -$;Z2 -$;Z3o2% -$;[ -$;^no4w -$;o7$ -$;o7i -$;u -$;O02 -$;z4 +$; $) +$; $/ +$; $7 +$; $; +$; *01 +$; *61 +$; -7 +$; D9 O81 +$; R4 +$; T0 +$; Z2 +$; Z3 o2% +$; [ +$; ^n o4w +$; o7$ +$; o7i +$; u +$; O02 +$; z4 $< -$<$1 -$<$3 -$<$uo61 -$<'6o2& -$<*12 -$<*46 -$ -$ +$< c +$< o98 +$< r $= -$=$) -$=$9 -$=*43 -$=@ou -$=T5 -$=Z1 -$=Z2l -$=Z3t -$=^\ -$=i5f -$=i5l -$=l -$=lO01 -$=o3y -$=O02 -$=O31 +$= $) +$= $9 +$= *43 +$= @o u +$= T5 +$= Z1 +$= Z2 l +$= Z3 t +$= ^\ +$= i5f +$= i5l +$= l +$= l O01 +$= o3y +$= O02 +$= O31 $> -$>$D*18 -$>$a -$>*27^b -$>D1 -$>Z4 -$>k +$> $D *18 +$> $a +$> *27 ^b +$> D1 +$> Z4 +$> k $? -$?$! -$?$2 -$?*06 -$?*34 -$?*35 -$?*47sfx -$?*62 -$?*87 -$?+5 -$?+6 -$?D5 -$?L4 -$?L8 -$?Z1 -$?Z2 -$?Z3u -$?Z4 -$?[ -$?^! -$?^n -$?^z -$?d -$?i3| -$?q -$?O26 -$?O45 -$?O52 -$?O63 +$? $! +$? $2 +$? *06 +$? *34 +$? *35 +$? *47 sfx +$? *62 +$? *87 +$? +5 +$? +6 +$? D5 +$? L4 +$? L8 +$? Z1 +$? Z2 +$? Z3 u +$? Z4 +$? [ +$? ^! +$? ^n +$? ^z +$? d +$? i3| +$? q +$? O26 +$? O45 +$? O52 +$? O63 $@ -$@$g$m$a$i$l$.$c$o$m -$@$g$m$x$.$d$e -$@$m$a$i$l$.$r$u -$@$y$a$n$d$e$x$.$r$u -$@*76i2M -$@-1^t -$@@i -$@L4 -$@L6 -$@T6 -$@Z1 -$@Z2 -$@Z3 -$@c -$@d -$@i61 -$@o3bO06 -$@o58 -$@t -$@tD4 -$@O02 -$@O12 +$@ $g $m $a $i $l $. $c $o $m +$@ $g $m $x $. $d $e +$@ $m $a $i $l $. $r $u +$@ $y $a $n $d $e $x $. $r $u +$@ *76 i2M +$@ -1 ^t +$@ @i +$@ L4 +$@ L6 +$@ T6 +$@ Z1 +$@ Z2 +$@ Z3 +$@ c +$@ d +$@ i61 +$@ o3b O06 +$@ o58 +$@ t +$@ t D4 +$@ O02 +$@ O12 $A -$A$Y -$A$a -$A$v -$A*54sl* -$A*58O58 -$A+7 -$ACD2 -$AD6 -$AL6 -$AR8@M -$AT2 -$AZ1 -$AZ1r -$AZ3 -$A[ -$A^< -$Ac -$Ak -$Al -$AO16Z3 -$AO24u -$A{ +$A $Y +$A $a +$A $v +$A *54 sl* +$A *58 O58 +$A +7 +$A C D2 +$A D6 +$A L6 +$A R8 @M +$A T2 +$A Z1 +$A Z1 r +$A Z3 +$A [ +$A ^< +$A c +$A k +$A l +$A O16 Z3 +$A O24 u +$A { $B -$B$1 -$B$G -$B$J -$B$e -$B*72 -$B-3 -$BL1 -$BR4O43 -$BZ1 -$BZ2 -$B^*C -$Bi0L -$Bk@8 -$Bl -$BsjBL5 -$BO19c -$BO46 +$B $1 +$B $G +$B $J +$B $e +$B *72 +$B -3 +$B L1 +$B R4 O43 +$B Z1 +$B Z2 +$B ^* C +$B i0L +$B k @8 +$B l +$B sjB L5 +$B O19 c +$B O46 $C -$C$D -$C$R -$C-1 -$CZ1 -$CZ1i2G -$Ci1S -$Cr -$CO12 -$CO18 -$CO91 -$Cz1 +$C $D +$C $R +$C -1 +$C Z1 +$C Z1 i2G +$C i1S +$C r +$C O12 +$C O18 +$C O91 +$C z1 $D -$D$E -$D$I -$D$S -$D$r -$D+0 -$DD1 -$DZ1 -$D^S -$Dc -$Di1nT5 -$Dt -$Du -$DOA3iA( -$Dz2O05 -$Dz4z5 +$D $E +$D $I +$D $S +$D $r +$D +0 +$D D1 +$D Z1 +$D ^S +$D c +$D i1n T5 +$D t +$D u +$D OA3 iA( +$D z2 O05 +$D z4 z5 $E -$E*65 -$E*76o0C -$E+4 -$E-6 -$ED4-3 -$ED8 -$EZ1 -$E[c -$Eo0S -$EtO04 -$EO25 -$EO32 -$EO38 -$E{$S +$E *65 +$E *76 o0C +$E +4 +$E -6 +$E D4 -3 +$E D8 +$E Z1 +$E [ c +$E o0S +$E t O04 +$E O25 +$E O32 +$E O38 +$E { $S $F -$F$C -$F$M -$F$U -$F$m -$F*23 -$F+7 -$FL6o40 -$FR2Z1 -$F[ -$Fo7r -$Fo9w$c -$Ft -$Fu -$FO13 -$FO32*67 -$FO34 -$FO36 +$F $C +$F $M +$F $U +$F $m +$F *23 +$F +7 +$F L6 o40 +$F R2 Z1 +$F [ +$F o7r +$F o9w $c +$F t +$F u +$F O13 +$F O32 *67 +$F O34 +$F O36 $G -$G$A -$G$E -$G$R -$G*09 -$G*75 -$GC$s -$GD5 -$GR8[ -$GZ2 -$GZ5*14 -$G^2 -$Gc -$Gc-0 -$Gi6D -$GlO37 -$Gr -$Gs5D+4 -$Gss3 -$GO02 +$G $A +$G $E +$G $R +$G *09 +$G *75 +$G C $s +$G D5 +$G R8 [ +$G Z2 +$G Z5 *14 +$G ^2 +$G c +$G c -0 +$G i6D +$G l O37 +$G r +$G s5D +4 +$G ss3 +$G O02 $H -$H$t*30 -$H+0 -$H+5 -$H-5o4L -$HD3 -$HTAO62 -$HZ1 -$H^)R5 -$Hi31Z2 -$Hls2f -$Ho0lZ3 -$HsaA -$HsmA$7 +$H $t *30 +$H +0 +$H +5 +$H -5 o4L +$H D3 +$H TA O62 +$H Z1 +$H ^) R5 +$H i31 Z2 +$H l s2f +$H o0l Z3 +$H saA +$H smA $7 $I -$I$! -$I$G -$I$L -$I$Qo1$ -$I$p -$I*10*24 -$I*24 -$I-3u -$I@c -$IT6 -$IZ1 -$IZ2 -$I^R -$Ic -$Ii68O34 -$Il -$Io1_ -$Io79 -$IO08$p -$IO27 -$IO45 -$IO63O31 +$I $! +$I $G +$I $L +$I $Q o1$ +$I $p +$I *10 *24 +$I *24 +$I -3 u +$I @c +$I T6 +$I Z1 +$I Z2 +$I ^R +$I c +$I i68 O34 +$I l +$I o1_ +$I o79 +$I O08 $p +$I O27 +$I O45 +$I O63 O31 $J -$J$B -$J$O -$J$jl -$J*64[ -$J*80 -$J+0^f -$J+2O38 -$JL5 -$J[ -$Jo1iZ1 -$Jo1o -$Js3Y -$JO58 -$JO63 +$J $B +$J $O +$J $j l +$J *64 [ +$J *80 +$J +0 ^f +$J +2 O38 +$J L5 +$J [ +$J o1i Z1 +$J o1o +$J s3Y +$J O58 +$J O63 $K -$K$! -$K$A -$K$Q -$K$l -$K$s -$KD3 -$KT5 -$KZ1 -$KZ1R2 -$K[ -$K^M -$KcoAC -$KcO34 -$Ki6F -$Ki6V -$Kl -$Ko5B -$Kr -$KsbC -$Kt -$Ku^K -$KO17 -$KO18 -$KO32 -$KO52 -$K{T4 +$K $! +$K $A +$K $Q +$K $l +$K $s +$K D3 +$K T5 +$K Z1 +$K Z1 R2 +$K [ +$K ^M +$K c oAC +$K c O34 +$K i6F +$K i6V +$K l +$K o5B +$K r +$K sbC +$K t +$K u ^K +$K O17 +$K O18 +$K O32 +$K O52 +$K { T4 $L -$L$n -$L*16 -$L+0 -$LC -$LT6 -$LZ1 -$LZ2 -$L^%z1 -$L^\ -$Lk^_ -$Lo1n} -$Lro7e -$Lt -$LO12 -$LO1A -$LO63 -$LO68 -$LO73 -$Lz2 +$L $n +$L *16 +$L +0 +$L C +$L T6 +$L Z1 +$L Z2 +$L ^% z1 +$L ^\ +$L k ^_ +$L o1n } +$L r o7e +$L t +$L O12 +$L O1A +$L O63 +$L O68 +$L O73 +$L z2 $M -$M$* -$M$B -$M$L -$M$W -$M+0 -$M+7 -$MD3 -$MZ1 -$MZ2 -$M[-7 -$M^m -$Mc -$Mc@K -$Ml -$Ms2e[ -$MO04 -$MO12 -$MO27 -$MO51 +$M $* +$M $B +$M $L +$M $W +$M +0 +$M +7 +$M D3 +$M Z1 +$M Z2 +$M [ -7 +$M ^m +$M c +$M c @K +$M l +$M s2e [ +$M O04 +$M O12 +$M O27 +$M O51 $N -$N$q*40 -$N'6^m -$N*47 -$N*65 -$N@h'7 -$ND4 -$NT0 -$Nc -$Ni3RO04 -$Ni78 -$Nl{ -$No2F*02 -$No62 -$No8ssiu -$Nr -$Nu -$NO27 -$N{ -$N}Z1 +$N $q *40 +$N '6 ^m +$N *47 +$N *65 +$N @h '7 +$N D4 +$N T0 +$N c +$N i3R O04 +$N i78 +$N l { +$N o2F *02 +$N o62 +$N o8s siu +$N r +$N u +$N O27 +$N { +$N } Z1 $O -$O$K -$O*18 -$O*5BO1A -$O*86 -$OD4 -$OL6 -$OZ1 -$O^3-0 -$OO24 -$OO45o6e -$OO53 -$O{ +$O $K +$O *18 +$O *5B O1A +$O *86 +$O D4 +$O L6 +$O Z1 +$O ^3 -0 +$O O24 +$O O45 o6e +$O O53 +$O { $P -$P$# -$P$D -$P$E -$P$I -$P$s -$P*36O06 -$P*43$H -$P-1$O -$PD0O17 -$PD1 -$PL9 -$PR1^a -$P^No72 -$P^^ -$Pi3zl -$PlO41 -$Po6. -$Pp1o2w -$Pq -$PO26 -$PO64 -$P{o31 +$P $# +$P $D +$P $E +$P $I +$P $s +$P *36 O06 +$P *43 $H +$P -1 $O +$P D0 O17 +$P D1 +$P L9 +$P R1 ^a +$P ^N o72 +$P ^^ +$P i3z l +$P l O41 +$P o6. +$P p1 o2w +$P q +$P O26 +$P O64 +$P { o31 $Q -$QD3 -$QD5O14 -$QL1*40 -$QR4 -$QZ1 -$QZ3 -$Qc -$Qo2yO3B -$QO04$1 -$QO31T0 +$Q D3 +$Q D5 O14 +$Q L1 *40 +$Q R4 +$Q Z1 +$Q Z3 +$Q c +$Q o2y O3B +$Q O04 $1 +$Q O31 T0 $R -$R$#*03 -$R$1c -$R*06 -$R@oc -$RL0 -$RT3$O -$RZ2] -$Rc -$Ri6& -$Ru -$RO23 -$RO41 -$RO92 -$Rz5 -$R}o11 +$R $# *03 +$R $1 c +$R *06 +$R @o c +$R L0 +$R T3 $O +$R Z2 ] +$R c +$R i6& +$R u +$R O23 +$R O41 +$R O92 +$R z5 +$R } o11 $S -$S$V -$S$y -$S*51O46 -$S-4*60 -$SD3 -$SKC -$SL5*34 -$SZ1 -$SZ1soA -$SZ2 -$S^]o0N -$S^p -$Si5' -$Sl -$Ssn8 -$SssPc -$SO12 -$SO74 -$S{ +$S $V +$S $y +$S *51 O46 +$S -4 *60 +$S D3 +$S K C +$S L5 *34 +$S Z1 +$S Z1 soA +$S Z2 +$S ^] o0N +$S ^p +$S i5' +$S l +$S sn8 +$S ssP c +$S O12 +$S O74 +$S { $T -$T'8Z2 -$T*62 -$T*87u -$T@2 -$TC$O -$TL6 -$TZ1 -$T[ -$T^vRA -$Tl -$To0Q -$To13 -$Tp1O18 -$TO03 -$TO31 -$TO32 -$TO52 -$Tz1 +$T '8 Z2 +$T *62 +$T *87 u +$T @2 +$T C $O +$T L6 +$T Z1 +$T [ +$T ^v RA +$T l +$T o0Q +$T o13 +$T p1 O18 +$T O03 +$T O31 +$T O32 +$T O52 +$T z1 $U -$U$R -$U*27O26 -$UD5 -$UR5T6 -$UT4 -$U[ -$Uc -$Ui41 -$Uu[ -$Uz1 +$U $R +$U *27 O26 +$U D5 +$U R5 T6 +$U T4 +$U [ +$U c +$U i41 +$U u [ +$U z1 $V -$V$6 -$V$8 -$V$C -$V$T -$VZ1 -$VZ1'8 -$Vc'9 -$Vi15o7H -$Vi6% -$Vl -$Vo5F^? -$Vr -$Vu +$V $6 +$V $8 +$V $C +$V $T +$V Z1 +$V Z1 '8 +$V c '9 +$V i15 o7H +$V i6% +$V l +$V o5F ^? +$V r +$V u $W -$W$8 -$W$I -$W$K -$W$S -$W*65 -$WD4 -$WL8 -$WZ1 -$W^wr -$Wc -$Wl -$Wo5- -$WrK -$WO35L2 -$Wz1 +$W $8 +$W $I +$W $K +$W $S +$W *65 +$W D4 +$W L8 +$W Z1 +$W ^w r +$W c +$W l +$W o5- +$W r K +$W O35 L2 +$W z1 $X -$X$2 -$X$Y -$X$x -$X*41$a -$X-7D0 -$XZ1 -$XZ2 -$XZ3s4/ -$X[ -$X^3 -$X^S -$X^v -$Xi0:o62 -$Xo1m -$Xt -$XO62 -$Xz1 +$X $2 +$X $Y +$X $x +$X *41 $a +$X -7 D0 +$X Z1 +$X Z2 +$X Z3 s4/ +$X [ +$X ^3 +$X ^S +$X ^v +$X i0: o62 +$X o1m +$X t +$X O62 +$X z1 $Y -$Y$2 -$Y$= -$Y*67 -$Y+3l -$YL6 -$YL7 -$YL8 -$YT1 -$Y[$N -$Y^V -$Yc -$Yfz3 -$Yu[ -$YO08 -$YO0A$u -$YO24C -$YO36 -$YO41 -$YO42 -$Yz2O64 +$Y $2 +$Y $= +$Y *67 +$Y +3 l +$Y L6 +$Y L7 +$Y L8 +$Y T1 +$Y [ $N +$Y ^V +$Y c +$Y f z3 +$Y u [ +$Y O08 +$Y O0A $u +$Y O24 C +$Y O36 +$Y O41 +$Y O42 +$Y z2 O64 $Z -$Z$3R6 -$Z$5 -$Z$9OA5 -$Z*76 -$Z*80 -$ZD2 -$ZD5 -$ZZ1 -$ZZ1T8 -$ZZ2 -$Z[ -$Z^0 -$Z^1*15 -$Z^V*26 -$Z^g$A -$Zc -$Zd -$Zi0Z -$Zo09 -$Zt -$ZO05L1 -$Zz4 +$Z $3 R6 +$Z $5 +$Z $9 OA5 +$Z *76 +$Z *80 +$Z D2 +$Z D5 +$Z Z1 +$Z Z1 T8 +$Z Z2 +$Z [ +$Z ^0 +$Z ^1 *15 +$Z ^V *26 +$Z ^g $A +$Z c +$Z d +$Z i0Z +$Z o09 +$Z t +$Z O05 L1 +$Z z4 $[ -$[*05$; -$[C -$[L4 -$[Z1 -$[Z2 -$[Z4 -$[[ -$[t +$[ *05 $; +$[ C +$[ L4 +$[ Z1 +$[ Z2 +$[ Z4 +$[ [ +$[ t $\ -$\@a -$\L2*20 -$\Z1 -$\l -$\o0J -$\t -$\u +$\ @a +$\ L2 *20 +$\ Z1 +$\ l +$\ o0J +$\ t +$\ u $] -$]+1 -$]-0 -$][ -$]^?o6= -$]i3[ -$]i6: -$]o4[ -$]o55 -$]O32 -$]z1 -$^$^ -$^+9+0 -$^@j -$^R8i07 -$^Z2 -$^Z2} -$^Z3 -$^i4 ^r -$^l -$^{*12 +$] +1 +$] -0 +$] [ +$] ^? o6= +$] i3[ +$] i6: +$] o4[ +$] o55 +$] O32 +$] z1 +$^ $^ +$^ +9 +0 +$^ @j +$^ R8 i07 +$^ Z2 +$^ Z2 } +$^ Z3 +$^ i4 ^r +$^ l +$^ { *12 $_ -$_$+ -$_$0 -$_$? -$_$_ -$_$i -$_$p -$_$r -$_$s -$_$t -$_$x -$_+0o6m -$_-0 -$_@0 -$_Z2 -$_Z3si? -$_[ -$_[[ -$_d -$_d] -$_i0mk -$_i1U -$_i6i -$_l -$_o96 -$_s_Y -$_smz -$_t -$_O13 -$_O25 -$_O41 -$_O53 -$_O75 -$_z3 -$_{ +$_ $+ +$_ $0 +$_ $? +$_ $_ +$_ $i +$_ $p +$_ $r +$_ $s +$_ $t +$_ $x +$_ +0 o6m +$_ -0 +$_ @0 +$_ Z2 +$_ Z3 si? +$_ [ +$_ [ [ +$_ d +$_ d ] +$_ i0m k +$_ i1U +$_ i6i +$_ l +$_ o96 +$_ s_Y +$_ smz +$_ t +$_ O13 +$_ O25 +$_ O41 +$_ O53 +$_ O75 +$_ z3 +$_ { $` -$`$1 -$`-1 -$`R5o5Z -$`Z1 -$`Z2 -$`c -$`l -$`o0h -$`o64z4 -$`u -$`O02 -$`O05 -$`{i2k +$` $1 +$` -1 +$` o5Z +$` Z1 +$` Z2 +$` c +$` l +$` o0h +$` o64 z4 +$` u +$` O02 +$` O05 +$` { i2k $a -$a$ -$a$3 -$a$6 -$a$b -$a$b$c -$a$b$c$d -$a$b$c$d$e -$a$bt -$a$f -$a$p -$a*01 -$a*16 -$a*26 -$a*28 -$a*38 -$a*73O03 -$a*81 -$a+0 -$a+0u -$a+2 -$a+3 -$a+7 -$a-5 -$aD4 -$aDA -$aR2 -$aT3 -$aT5 -$aZ1 -$aZ2 -$aZ4Z5 -$a^A -$a^D^1 -$a^kt -$af -$ai02 -$ai2q -$ai5r -$ai6p -$ao1ep1 -$ao3+ -$ao3dC -$ao6E -$ao7f -$aoB8 -$ap1 -$aq -$assj -$aswc -$au -$au$3 -$auO43 -$aO02 -$aO31 -$aO45 -$aO54 -$aO67 -$aO73 -$aO85 -$aO91 -$aOB1 -$aOB3 -$aOB4 -$az1*47 -$az2 -$az3 -$az4 +$a $ +$a $3 +$a $6 +$a $b +$a $b $c +$a $b $c $d +$a $b $c $d $e +$a $b t +$a $f +$a $p +$a *01 +$a *16 +$a *26 +$a *28 +$a *38 +$a *73 O03 +$a *81 +$a +0 +$a +0 u +$a +2 +$a +3 +$a +7 +$a -5 +$a D4 +$a DA +$a R2 +$a T3 +$a T5 +$a Z1 +$a Z2 +$a Z4 Z5 +$a ^A +$a ^D ^1 +$a ^k t +$a f +$a i02 +$a i2q +$a i5r +$a i6p +$a o1e p1 +$a o3+ +$a o3d C +$a o6E +$a o7f +$a oB8 +$a p1 +$a q +$a ssj +$a swc +$a u +$a u $3 +$a u O43 +$a O02 +D3 $a +$a O45 +$a O54 +$a O67 +$a O73 +$a O85 +D9 $a +$a OB1 +$a OB3 +$a OB4 +$a z1 *47 +$a z2 +$a z3 +$a z4 $b -$b$. -$b$1 -$b$4 -$b$a -$b$b -$b$d -$b$l -$b$t -$b$u -$b$wr -$b$y -$b*02 -$b*34 -$b*56 -$b*58 -$b*69 -$b*73 -$b+6 -$b-1 -$b@0 -$bL3o0k -$bL5 -$bL7O15 -$bT0 -$bZ3 -$bZ5 -$b[ -$b[R2 -$b^[s2H -$b^` -$b^a -$b^h -$b^p -$bf -$bi1r -$bi5p -$bo3b^A -$bo3t -$bp1 -$br -$brq -$bsaF -$bsbf -$bshb -$bt -$buo4# -$bO13 -$bO35 -$bO45 -$bO56 -$bO72 -$bOA3 -$bOA4 -$bz2 -$b{ -$b{i2G +$b $. +$b $1 +$b $4 +$b $a +$b $b +$b $d +$b $l +$b $t +$b $u +$b $w r +$b $y +$b *02 +$b *34 +$b *56 +$b *58 +$b *69 +$b *73 +$b +6 +$b -1 +$b @0 +$b L3 o0k +$b L5 +$b L7 O15 +$b T0 +$b Z3 +$b Z5 +$b [ +$b [ R2 +$b ^[ s2H +$b ^` +$b ^a +$b ^h +$b ^p +$b f +$b i1r +$b i5p +$b o3b ^A +$b o3t +$b p1 +$b r +$b r q +$b saF +$b sbf +$b shb +$b t +$b u o4# +$b O13 +$b O35 +$b O45 +$b O56 +$b O72 +$b OA3 +$b OA4 +$b z2 +$b { +$b { i2G $c -$c$b -$c$e -$c$t -$c$w -$c*67 -$c*72^: -$c+7 -$c+B -$cD2 -$cL6 -$cT0 -$cZ1 -$cZ2 -$c[ -$c[*56 -$c^?o3Q -$c^G$z -$c^Pk -$c^t -$cci4C -$cfc -$ci2c -$ci6h -$cl -$co1UT7 -$co4n -$co8i -$coARiBs -$csmw$4 -$ct -$cO06 -$cO24 -$cO29 -$cO36 -$cO73 -$cz1 -$cz2R0 -$cz5 +$c $b +$c $e +$c $t +$c $w +$c *67 +$c *72 ^: +$c +7 +$c +B +$c D2 +$c L6 +$c T0 +$c Z1 +$c Z2 +$c [ +$c [ *56 +$c ^? o3Q +$c ^G $z +$c ^P k +$c ^t +$c c i4C +$c f c +$c i2c +$c i6h +$c l +$c o1U T7 +$c o4n +$c o8i +$c oAR iBs +$c smw $4 +$c t +$c O06 +$c O24 +$c O29 +$c O36 +$c O73 +$c z1 +$c z2 R0 +$c z5 $d -$d$ -$d$. -$d$4 -$d$b -$d$k -$d$t -$d$w -$d*19 -$d*21 -$d*23 -$d*57 -$d*61 -$d*69 -$d+3 -$d+6 -$d-5 -$d@. -$d@p -$dD1 -$dD5 -$dD6 -$dR0 -$dR3Z2 -$dZ2 -$d^d -$d^l -$dc+0 -$dcZ1 -$dd -$di0^ -$di0t -$di4 -$di7a -$dl -$do0kZ5 -$do0p -$do11 -$do41 -$do6t -$dstm -$dO02 -$dO45p1 -$dO52 -$dO75 -$dO95 -$dO96 -$dOA6 -$dz1 -$dz4 -$d{^o +$d $ +$d $. +$d $4 +$d $b +$d $k +$d $t +$d $w +$d *19 +$d *21 +$d *23 +$d *57 +$d *61 +$d *69 +$d +3 +$d +6 +$d -5 +$d @. +$d @p +$d D1 +$d D5 +$d D6 +$d R0 +$d R3 Z2 +$d Z2 +$d ^d +$d ^l +$d c +0 +$d c Z1 +$d d +$d i0^ +$d i0t +$d i4 +$d i7a +$d l +$d o0k Z5 +$d o0p +$d o11 +$d o41 +$d o6t +$d stm +$d O02 +$d O45 p1 +$d O52 +$d O75 +$d O95 +$d O96 +$d OA6 +$d z1 +$d z4 +$d { ^o $e $e $d -$e$c -$e$l -$e$m -$e$n -$e$q -$e$qk -$e$r -$e$w -$e*53 -$e*67 -$e*73 -$e+0 -$e+B -$e-2*34 -$eD8 -$eL8 -$eR3 -$eT2 -$eZ1 -$eZ2 -$eZ2o7- -$eZ3 -$eZ4 -$e[ -$e[u -$e^*i2> -$e^3$7 -$e^E -$e^H -$e^d -$e^g -$e^}k -$ei0p*52 -$ei9_ -$el -$eo0F -$eo0d -$eo0p -$eo4I -$eo4l -$eo5% -$eo8v -$eo9k -$eo9l -$ep1 -$er -$esm6 -$esmp -$eO02sz$ -$eO25 -$eO28i3c -$eO53 -$eO71 -$eO93 +$e $c +$e $l +$e $m +$e $n +$e $q +$e $q k +$e $r +$e $w +$e *53 +$e *67 +$e *73 +$e +0 +$e +B +$e -2 *34 +$e D8 +$e L8 +$e R3 +$e T2 +$e Z1 +$e Z2 +$e Z2 o7- +$e Z3 +$e Z4 +$e [ +$e [ u +$e ^* i2> +$e ^3 $7 +$e ^E +$e ^H +$e ^d +$e ^g +$e ^} k +$e i0p *52 +$e i9_ +$e l +$e o0F +$e o0d +$e o0p +$e o4I +$e o4l +$e o5% +$e o8v +$e o9k +$e o9l +$e p1 +$e r +$e sm6 +$e smp +$e O02 sz$ +$e O25 +$e O28 i3c +$e O53 +$e O71 +$e O93 z2 -$ez4 +$e z4 $f -$f$1 -$f$j -$f$u -$f*25 -$f*32 -$f*34 -$f*79 -$f*96 -$f+1 -$f-3 -$f-5 -$f@t -$fK$2 -$fL6 -$fZ1 -$fZ1O57 -$fZ2 -$f^= -$f^f -$f^q'B -$f^v -$fc -$fi4u -$fi8r -$fl -$fo1e -$fo8/O01 -$fq -$fs39 -$fO05 -$fO28D3 -$fO52 -$fO62 -$fO82 -$fO91 -$fOB1 +$f $1 +$f $j +$f $u +$f *25 +$f *32 +$f *34 +$f *79 +$f *96 +$f +1 +$f -3 +$f -5 +$f @t +$f K $2 +$f L6 +$f Z1 +$f Z1 O57 +$f Z2 +$f ^= +$f ^f +$f ^q 'B +$f ^v +$f c +$f i4u +$f i8r +$f l +$f o1e +$f o8/ O01 +$f q +$f s39 +$f O05 +$f O28 D3 +$f O52 +$f O62 +$f O82 +$f O91 +$f OB1 $g -$g$N -$g$n -$g$o -$g$s -$g*36 -$g*54 -$g+4 -$g+6 -$g-0 -$gK+6 -$gZ1 -$gZ2 -$gZ3o5o -$gZ4 -$g^3 -$g^Ko0_ -$g^S -$g^U -$g^sz2 -$g^t -$g^vO31 -$gd -$gfo4# -$gi0r -$gi2p*91 -$gi2u -$gi3@i0$ -$gi5 @6 -$gi5; -$gi7VR9 -$gl -$go06 -$go0ht -$go2) -$gr -$gsaI -$gsr( -$gsutO47 -$gt -$gu -$gO34 -$gO36 -$gO37 -$gO43 -$gO52 -$gO73 -$gO83O52 -$gz2 -$gz3 +$g $N +$g $n +$g $o +$g $s +$g *36 +$g *54 +$g +4 +$g +6 +$g -0 +$g K +6 +$g Z1 +$g Z2 +$g Z3 o5o +$g Z4 +$g ^3 +$g ^K o0_ +$g ^S +$g ^U +$g ^s z2 +$g ^t +$g ^v O31 +$g d +$g f o4# +$g i0r +$g i2p *91 +$g i2u +$g i3@ i0$ +$g i5 @6 +$g i5; +$g i7V R9 +$g l +$g o06 +$g o0h t +$g o2) +$g r +$g saI +$g sr( +$g sut O47 +$g t +$g u +$g O34 +$g O36 +$g O37 +$g O43 +$g O52 +$g O73 +$g O83 O52 +$g z2 +$g z3 $h -$h$ -$h$5 -$h$g -$h$k -$h$x -$h$z -$h*02 -$h*37 -$h*50*25 -$h*54 -$h*71 -$h-3 -$h-5t -$hD3 -$hL8 -$hZ1i1g -$hZ2 -$hZ2L5 -$hZ3 -$h[ -$h[O13 -$h^T -$h^aslI -$hc -$hd -$hi2t -$hi4X -$hi6t*67 -$hi8% -$hi92O49 -$hl -$hlT1 -$ho1h -$hr -$hr$y -$hsd1 -$hO12 -$hO41 -$hO53 -$h}K +$h $ +$h $5 +$h $g +$h $k +$h $x +$h $z +$h *02 +$h *37 +$h *50 *25 +$h *54 +$h *71 +$h -3 +$h -5 t +$h D3 +$h L8 +$h Z1 i1g +$h Z2 +$h Z2 L5 +$h Z3 +$h [ +$h [ O13 +$h ^T +$h ^a slI +$h c +$h d +$h i2t +$h i4X +$h i6t *67 +$h i8% +$h i92 O49 +$h l +$h l T1 +$h o1h +$h r +$h r $y +$h sd1 +$h O12 +$h O41 +$h O53 +$h } K $i $i $n $g -$i$*z1 -$i$F$F -$i$d -$i$n -$i*10O41 -$i*41 -$i*60D2 -$i*62 -$i*79 -$i*86 -$i*89 -$i*A4 -$i+3 -$i+6 -$i+6l -$i+9 -$i-0 -$i-7 -$i-9 -$i@a -$iD2 -$iR0 -$iZ1 -$iZ2O15 -$i^d -$i^ki75 -$i^p -$id -$ii3 -$ii8d -$io2% -$io2S -$io5V -$iq -$ir -$it -$iu -$iO09 -$iO12 -$iO13 -$iO36 -$iO54 -$iO62 -$iO73 -$iO92 -$iz2*17 -$i{ +$i $* z1 +$i $F $F +$i $d +$i $n +$i *10 O41 +$i *41 +$i *60 D2 +$i *62 +$i *79 +$i *86 +$i *89 +$i *A4 +$i +3 +$i +6 +$i +6 l +$i +9 +$i -0 +$i -7 +$i -9 +$i @a +$i D2 +$i R0 +$i Z1 +$i Z2 O15 +$i ^d +$i ^k i75 +$i ^p +$i d +$i i3 +$i i8d +$i o2% +$i o2S +$i o5V +$i q +$i r +$i t +$i u +$i O09 +$i O12 +$i O13 +$i O36 +$i O54 +$i O62 +$i O73 +$i O92 +$i z2 *17 +$i { $j -$j$3 -$j$F -$j$o -$j*02 -$j*07 -$j*68 -$j-4^? -$j-7 -$jZ1 -$jZ2 -$j[ -$j^2 -$j^k -$j^s -$jc -$ji49$u -$ji5n^0 -$jo17 -$joAn -$jp1 -$jr -$jsik -$jt -$ju -$jO12 -$jO62 -$jz2 -$jz3 -$j{ +$j $3 +$j $F +$j $o +$j *02 +$j *07 +$j *68 +$j -4 ^? +$j -7 +$j Z1 +$j Z2 +$j [ +$j ^2 +$j ^k +$j ^s +$j c +$j i49 $u +$j i5n ^0 +$j o17 +$j oAn +$j p1 +$j r +$j sik +$j t +$j u +$j O12 +$j O62 +$j z2 +$j z3 +$j { $k -$k$4 -$k$d -$k$e -$k$k -$k$y -$k*54 -$k*57 -$k*67 -$k+0 -$k+8 -$k@5 -$k@6 -$kC -$kD3u -$kD5O26 -$kR4 -$kR7 -$k[ -$k^3 -$k^D +$k $4 +$k $d +$k $e +$k $k +$k $y +$k *54 +$k *57 +$k *67 +$k +0 +$k +8 +$k @5 +$k @6 +$k C +$k D3 u +$k D5 O26 +$k R4 +$k R7 +$k [ +$k ^3 +$k ^D ^_ -$k^m -$ki5f -$ki8o -$ko78 -$ko7n -$kp1 -$kp1O26 -$ks17 -$kt -$kO13 -$kO53 -$kO73 -$kO92 -$k{ +$k ^m +$k i5f +$k i8o +$k o78 +$k o7n +$k p1 +$k p1 O26 +$k s17 +$k t +$k O13 +$k O53 +$k O73 +$k O92 +$k { $l -$l$g -$l$v -$l$y -$l$z -$l*23 -$l*43 -$l*53*32 -$l*57 -$l+1 -$l-0 -$l-4Z2 -$l-5 -$l-6 -$lC*21 -$lD4 -$lZ1 -$lZ2 -$lZ4 -$l[ -$l^O -$l^a -$l^b -$ld -$li78R9 -$li83 -$lk -$lo5p^k -$lq -$lu -$lu$C -$lO4B -$lO62 -$lO92 -$lz3 -$lz5 -$l{ +$l $g +$l $v +$l $y +$l $z +$l *23 +$l *43 +$l *53 *32 +$l *57 +$l +1 +$l -0 +$l -4 Z2 +$l -5 +$l -6 +$l C *21 +$l D4 +$l Z1 +$l Z2 +$l Z4 +$l [ +$l ^O +$l ^a +$l ^b +$l d +$l i78 R9 +$l i83 +$l k +$l o5p ^k +$l q +$l u +$l u $C +$l O4B +$l O62 +$l O92 +$l z3 +$l z5 +$l { $m -$m$0 -$m$1c -$m$E -$m$b -$m$e -$m$oZ2 -$m$p -$m$qR7 -$m$w -$m$x -$m'BO05 -$m*28 -$m*43 -$m*71z1 -$m*86 -$m+4 -$m+5 -$m+6 -$m-0 -$m-1 -$m-2 -$m-6 -$mCi4E -$mT0 -$mZ1 -$mZ2 -$mZ5 -$m^+ -$m^1 -$m^6 -$m^? -$m^i -$md -$mf -$mi1P*83 -$mi1\ -$mi2i -$mi7g -$mk -$ml^k -$mo0g -$mo2r -$mo37 -$mo5F -$mo8ul -$ms17 -$ms24 -$mt -$mu^C -$mO04 -$mO05 -$mO16 -$mO18 -$mO32 -$mO34 -$mO43 -$mO57 -$mO72 -$mOA4 -$mz1 -$mz4z3 -$m{k -$m{t +$m $0 +$m $1 c +$m $E +$m $b +$m $e +$m $o Z2 +$m $p +$m $q R7 +$m $w +$m $x +$m 'B O05 +$m *28 +$m *43 +$m *71 z1 +$m *86 +$m +4 +$m +5 +$m +6 +$m -0 +$m -1 +$m -2 +$m -6 +$m C i4E +$m T0 +$m Z1 +$m Z2 +$m Z5 +$m ^+ +$m ^1 +$m ^6 +$m ^? +$m ^i +$m d +$m f +$m i1P *83 +$m i1\ +$m i2i +$m i7g +$m k +$m l ^k +$m o0g +$m o2r +$m o37 +$m o5F +$m o8u l +$m s17 +$m s24 +$m t +$m u ^C +$m O04 +$m O05 +$m O16 +$m O18 +$m O32 +$m O34 +$m O43 +$m O57 +$m O72 +$m OA4 +$m z1 +$m z4 z3 +$m { k +$m { t $n -$n$a -$n$b -$n$qO47 -$n*07 -$n*15*12 -$n*24 -$n*24Z4 -$n*27 -$n*83z4 -$n*93'4 -$n+0 -$n+7 -$n-7 -$n@0 -$nC -$nD2 -$nL1 -$nT5 -$nZ2 -$nZ3 -$nZ5O7B -$n[$z -$n[L2 -$n^C -$n^I*36 -$n^f*23 -$ni0R -$ni3+ -$ni3p -$ni5e -$nk -$nl -$no00O46 -$no2- -$no4_ -$no7l -$no9e -$nq -$nO14^3 -$nO51 -$nO65 -$nO71 -$nO82 -$nO93 +$n $a +$n $b +$n $q O47 +$n *07 +$n *15 *12 +$n *24 +$n *24 Z4 +$n *27 +$n *83 z4 +$n *93 '4 +$n +0 +$n +7 +$n -7 +$n @0 +$n C +$n D2 +$n L1 +$n T5 +$n Z2 +$n Z3 +$n Z5 O7B +$n [ $z +$n [ L2 +$n ^C +$n ^I *36 +$n ^f *23 +$n i0R +$n i3+ +$n i3p +$n i5e +$n k +$n l +$n o00 O46 +$n o2- +$n o4_ +$n o7l +$n o9e +$n q +$n O14 ^3 +$n O51 +$n O65 +$n O71 +$n O82 +$n O93 $o -$o$O -$o$h -$o$ni4Y -$o$s -$o$x -$o*03 -$o*46O43 -$o*82 -$o+4 -$o+8 -$o@1 -$oT0 -$oT7 -$oZ1 -$oZ2 -$o^C -$o^si0c -$oc -$od -$oi1 -$oi6O -$ok -$oo0v -$oo6g -$oo6w -$or -$osbf -$ou -$oO04'5 -$oO05 -$oO12 -$oO13 -$oO15 -$oO29 -$oO42sk$ -$oO65 -$oO71 -$oO87 -$oz3 -$oz4 +$o $O +$o $h +$o $n i4Y +$o $s +$o $x +$o *03 +$o *46 O43 +$o *82 +$o +4 +$o +8 +$o @1 +$o T0 +$o T7 +$o Z1 +$o Z2 +$o ^C +$o ^s i0c +$o c +$o d +$o i1 +$o i6O +$o k +$o o0v +$o o6g +$o o6w +$o r +$o sbf +$o u +$o O04 '5 +$o O05 +$o O12 +$o O13 +$o O15 +$o O29 +$o O42 sk$ +$o O65 +$o O71 +$o O87 +$o z3 +$o z4 $p -$p$0 -$p$k -$p$l -$p*04 -$p*05 -$p*27 -$p*34i9d -$p*42 -$p*61 -$p*64 -$p*73 -$p*86 -$p+0 -$p-4 -$pD2 -$pD3 -$pL6 -$pR1 -$pZ1 -$pZ2 -$pZ5 -$p^9 -$p^V -$pi4t -$pi7q -$pl -$po0b -$po29 -$pr -$psph -$pu-5 -$pO4A@p -$pO51[ -$pO75 -$pO87 -$pO92 -$pz5 -$p{sdo +$p $0 +$p $k +$p $l +$p *04 +$p *05 +$p *27 +$p *34 i9d +$p *42 +$p *61 +$p *64 +$p *73 +$p *86 +$p +0 +$p -4 +$p D2 +$p D3 +$p L6 +$p R1 +$p Z1 +$p Z2 +$p Z5 +$p ^9 +$p ^V +$p i4t +$p i7q +$p l +$p o0b +$p o29 +$p r +$p sph +$p u -5 +$p O4A @p +$p O51 [ +$p O75 +$p O87 +$p O92 +$p z5 +$p { sdo $q -$q$Q -$q$a -$q$w -$q*02 -$q*34 -$q+0O02 -$q+5f -$q-0 -$q-7 -$qD2 -$qKr -$qL6 -$qL7 -$qLA -$qT0@T -$qZ1 -$qZ2 -$qZ2o2+ -$qZ2u -$qZ3 -$qZ4 -$qZ5 -$q^pT6 -$qcO21 -$qd -$qi1= -$qi3JZ1 -$qk -$qkl -$qsq# -$qt -$qO15 -$qO31 -$qO43 -$qz1^n -$qz2 -$qz2^# +$q $Q +$q $a +$q $w +$q *02 +$q *34 +$q +0 O02 +$q +5 f +$q -0 +$q -7 +$q D2 +$q K r +$q L6 +$q L7 +$q LA +$q T0 @T +$q Z1 +$q Z2 +$q Z2 o2+ +$q Z2 u +$q Z3 +$q Z4 +$q Z5 +$q ^p T6 +$q c O21 +$q d +$q i1= +$q i3J Z1 +$q k +$q k l +$q sq# +$q t +$q O15 +$q O31 +$q O43 +$q z1 ^n +$q z2 +$q z2 ^# $r -$r$! -$r$0 -$r$8 -$r$a -$r$n -$r$p -$r'9 -$r*21 -$r*24 -$r*74o2V -$r*78 -$r*98 -$r*A9 -$r+0 -$r+6 -$r-1 -$r-4z2 -$r-8 -$r-A -$rL5 -$rL8 -$rR1 -$rZ1 -$rZ1T6 -$r^J -$r^p -$r^q -$ri2fZ5 -$ri4E -$ri6Do6v -$ri6n -$ri7t -$ri8jshR -$rl -$ro10 -$ro6 -$ro7- -$roAg -$rsnR -$rO31 -$rO46d -$rOB4 -$rz1 -$rz1l +$r $! +$r $0 +$r $8 +$r $a +$r $n +$r $p +$r '9 +$r *21 +$r *24 +$r *74 o2V +$r *78 +$r *98 +$r *A9 +$r +0 +$r +6 +$r -1 +$r -4 z2 +$r -8 +$r -A +$r L5 +$r L8 +$r R1 +$r Z1 +$r Z1 T6 +$r ^J +$r ^p +$r ^q +$r i2f Z5 +$r i4E +$r i6D o6v +$r i6n +$r i7t +$r i8j shR +$r l +$r o10 +$r o6 +$r o7- +$r oAg +$r snR +$r O31 +$r O46 d +$r OB4 +$r z1 +$r z1 l $s -$s$ -$s$1 -$s$4 -$s$j -$s$m -$s$u -$s*01 -$s*17 -$s*20z3 -$s*21 -$s*31 -$s*56 -$s*68 -$s*75t -$s+3 -$s+4 -$s-1 -$s-2 -$s-5 -$s-6 -$s-7 -$s-8 -$s@y -$sC -$sD7 -$sL7s1_ -$sR7^T -$sT4 -$sZ1 -$sZ2 -$sZ3 -$s[O32 +$s $ +$s $1 +$s $4 +$s $j +$s $m +$s $u +$s *01 +$s *17 +$s *20 z3 +$s *21 +$s *31 +$s *56 +$s *68 +$s *75 t +$s +3 +$s +4 +$s -1 +$s -2 +$s -5 +$s -6 +$s -7 +$s -8 +$s @y +$s C +$s D7 +$s L7 s1_ +$s R7 ^T +$s T4 +$s Z1 +$s Z2 +$s Z3 +$s [ O32 z5 -$s^1 -$s^b -$s^fr -$s^k -$sc -$si0h -$si3t -$si52 -$si6V -$siAi -$so13 -$so1bl -$so2b -$so5J -$so7m -$so9*'A -$sr -$ssr4$7 -$st -$su -$sO34 -$sO43 -$sO53 -$sO64 -$sO82 -$sO83 -$sO87 -$sO94 -$sz1 -$sz1u -$sz4z5 +$s ^1 +$s ^b +$s ^f r +$s ^k +$s c +$s i0h +$s i3t +$s i52 +$s i6V +$s iAi +$s o13 +$s o1b l +$s o2b +$s o5J +$s o7m +$s o9* 'A +$s r +$s sr4 $7 +$s t +$s u +$s O34 +$s O43 +$s O53 +$s O64 +$s O82 +$s O83 +$s O87 +$s O94 +$s z1 +$s z1 u +$s z4 z5 $t -$t$# -$t$7 -$t$b -$t$c -$t$g -$t$h -$t*03 -$t*13 -$t*25 -$t*57 -$t*86 -$t*91 -$t+7 -$t+9 -$tZ1 -$tZ2 -$t^3 -$t^n -$t^p -$tc -$tco6y -$ti2$o4f -$ti4C -$ti4f -$ti7a -$tk -$to1J -$to6k -$to6w -$tsbL -$tu -$tuO01 -$tO02 -$tO04 -$tO08 -$tO09c -$tO42 -$tO51 -$tO85 -$tz1 -$tz4 +$t $# +$t $7 +$t $b +$t $c +$t $g +$t $h +$t *03 +$t *13 +$t *25 +$t *57 +$t *86 +$t *91 +$t +7 +$t +9 +$t Z1 +$t Z2 +$t ^3 +$t ^n +$t ^p +$t c +$t c o6y +$t i2$ o4f +$t i4C +$t i4f +$t i7a +$t k +$t o1J +$t o6k +$t o6w +$t sbL +$t u +$t u O01 +$t O02 +$t O04 +$t O08 +$t O09 c +$t O42 +$t O51 +$t O85 +$t z1 +$t z4 $u -$u$$ -$u$8 -$u$r -$u$w -$u*30 -$u*43i4D -$u-1 -$u-6 -$u@k -$uD9 -$uL6 -$uZ1 -$uZ2 -$u[ -$u^1i36 -$u^8 -$u^? -$u^Xz2 -$u^g -$u^i -$u^l*25 -$ud -$udO58 -$ui0y -$ui5- -$ui7'O69 -$ukK -$uo1r -$uo3w -$uo4o -$uo7u -$uq -$ur -$us5,O67 -$usma -$ut -$utr -$uO12 -$uO34 -$uO39 -$uO41$= -$uO43 -$uO52 -$uO62 -$uO65 -$uO72 -$uO9B -$uz1 -$uz5-3 +$u $$ +$u $8 +$u $r +$u $w +$u *30 +$u *43 i4D +$u -1 +$u -6 +$u @k +$u D9 +$u L6 +$u Z1 +$u Z2 +$u [ +$u ^1 i36 +$u ^8 +$u ^? +$u ^X z2 +$u ^g +$u ^i +$u ^l *25 +$u d +$u d O58 +$u i0y +$u i5- +$u i7' O69 +$u k K +$u o1r +$u o3w +$u o4o +$u o7u +$u q +$u r +$u s5, O67 +$u sma +$u t +$u t r +$u O12 +$u O34 +$u O39 +$u O41 $= +$u O43 +$u O52 +$u O62 +$u O65 +$u O72 +$u O9B +$u z1 +$u z5 -3 $v -$v$&^I -$v$+ -$v$3u -$v$6 -$v$P -$v$i -$v$l -$v*16 -$v*43 -$v*62k -$v*81O58 -$v+0 -$v-5 -$v-6o8> -$v-7O69 -$vD3 -$vD5 -$vD7 -$vD7O21 -$vL5 -$vL6 -$vZ1 -$vZ2 -$vZ3 -$v^* -$v^> -$v^w^G -$vdO5B -$vo3s -$vp1 -$vri0r -$vstk -$vO13 -$vO24 -$vO38 -$vO83 -$vz1o6G +$v $& ^I +$v $+ +$v $3 u +$v $6 +$v $P +$v $i +$v $l +$v *16 +$v *43 +$v *62 k +$v *81 O58 +$v +0 +$v -5 +$v -6 o8> +$v -7 O69 +$v D3 +$v D5 +$v D7 +$v D7 O21 +$v L5 +$v L6 +$v Z1 +$v Z2 +$v Z3 +$v ^* +$v ^> +$v ^w ^G +$v d O5B +$v o3s +$v p1 +$v r i0r +$v stk +$v O13 +$v O24 +$v O38 +$v O83 +$v z1 o6G $w -$w$e -$w$q -$w*21 -$w*31 -$w*43 -$w*45 -$w*86 -$w+4 -$w@! -$w@g -$wC -$wD8 -$wZ1 -$wZ4 -$w[ -$wcz2 -$wi0q -$wi1I -$wi2d -$wi6q -$wi7_ -$wi9q -$wo4m -$wo6a -$wo7m -$wp1 -$wq -$wr-4 -$wsF[O36 -$wu -$wO18 -$wO37 -$wO67-4 -$wz2 -$wz3 -$w{[ +$w $e +$w $q +$w *21 +$w *31 +$w *43 +$w *45 +$w *86 +$w +4 +$w @! +$w @g +$w C +$w D8 +$w Z1 +$w Z4 +$w [ +$w c z2 +$w i0q +$w i1I +$w i2d +$w i6q +$w i7_ +$w i9q +$w o4m +$w o6a +$w o7m +$w p1 +$w q +$w r -4 +$w sF[ O36 +$w u +$w O18 +$w O37 +$w O67 -4 +$w z2 +$w z3 +$w { [ $x -$x$? -$x$g -$x$g*41 -$x$hO69 -$x$i -$x$p -$x$s -$x$t -$x$x$x -$x'AC -$x*20r -$x*31 -$x*45 -$x*62^) -$x*65 -$x*71 -$x*78 -$x+5 -$x+A*A0 -$x-6 -$x@c -$xD2 -$xD5 -$xD5t -$xD6 -$xR4-2 -$xR6 -$xZ1 -$xZ3 -$xZ4 -$xZ5 -$x^! -$x^S -$x^b -$x^j -$x^o -$x^v -$xf -$xi1)o5n -$xi1H -$xi6d -$xk -$xl -$xo1m -$xp1 -$xp1o2i -$xq -$xsw0 -$xt -$xO21@v -$xO25 -$xO32 -$xO37 -$xO45 -$xO64 -$xO71 -$xO76 -$xO92 -$xO93 -$xz4 -$x{ +$x $? +$x $g +$x $g *41 +$x $h O69 +$x $i +$x $p +$x $s +$x $t +$x $x $x +$x 'A C +$x *20 r +$x *31 +$x *45 +$x *62 ^) +$x *65 +$x *71 +$x *78 +$x +5 +$x +A *A0 +$x -6 +$x @c +$x D2 +$x D5 +$x D5 t +$x D6 +$x R4 -2 +$x R6 +$x Z1 +$x Z3 +$x Z4 +$x Z5 +$x ^! +$x ^S +$x ^b +$x ^j +$x ^o +$x ^v +$x f +$x i1) o5n +$x i1H +$x i6d +$x k +$x l +$x o1m +$x p1 +$x p1 o2i +$x q +$x sw0 +$x t +$x O21 @v +$x O25 +$x O32 +$x O37 +$x O45 +$x O64 +$x O71 +$x O76 +$x O92 +$x O93 +$x z4 +$x { $y -$y$a -$y$s -$y*16*13 -$y*81 -$y+0 -$y+3 -$y+6 -$y+6T6 -$y+7 -$y@n -$y@nO07 -$y@q -$yD1 -$yD5d -$yD8 -$yL8 -$yZ1 -$yZ2 -$yZ4 -$y^i -$yf -$yi19'5 -$yi20 -$yi3R -$yi6m -$yk -$yo4f -$yo5x -$yp1 -$yq -$yt -$yO04 -$yO07 -$yO23 -$yO27i1p -$yO53 -$yz2 +$y $a +$y $s +$y *16 *13 +$y *81 +$y +0 +$y +3 +$y +6 +$y +6 T6 +$y +7 +$y @n +$y @n O07 +$y @q +$y D1 +$y D5 d +$y D8 +$y L8 +$y Z1 +$y Z2 +$y Z4 +$y ^i +$y f +$y i19 '5 +$y i20 +$y i3R +$y i6m +$y k +$y o4f +$y o5x +$y p1 +$y q +$y t +$y O04 +$y O07 +$y O23 +$y O27 i1p +$y O53 +$y z2 $z -$z$2 -$z$dZ1 -$z$o -$z$x -$z*23 -$z*37 -$z*43 -$z*72 -$z+4z3 -$z+5 -$z-2 -$z-4 -$z@s -$zC -$zD4 -$zR0D5 -$zR5 -$zT0 -$zZ1 -$zZ2 -$zZ3 -$zZ3'6 -$zZ3Z4 -$z^- -$z^l -$z^v -$z^x -$zd -$zf -$zi1l -$zl -$zo00T0 -$zo3 -$zp1T4 -$zq -$zsAS -$zsc^ -$zsry -$zssc -$zu -$zuD2 -$zO06 -$zO24 -$zO43 -$zO63 -$zO83 -$zO95 -$zOA2 -$zOB2 -$zz1 -$zz1O36 -$zz2^o -$zz5 -$z{ +$z $2 +$z $d Z1 +$z $o +$z $x +$z *23 +$z *37 +$z *43 +$z *72 +$z +4 z3 +$z +5 +$z -2 +$z -4 +$z @s +$z C +$z D4 +$z R0 D5 +$z R5 +$z T0 +$z Z1 +$z Z2 +$z Z3 +$z Z3 '6 +$z Z3 Z4 +$z ^- +$z ^l +$z ^v +$z ^x +$z d +$z f +$z i1l +$z l +$z o00 +$z o3 +$z p1 T4 +$z q +$z sAS +$z sc^ +$z sry +$z ssc +$z u +$z u D2 +$z O06 +$z O24 +$z O43 +$z O63 +$z O83 +$z O95 +$z OA2 +$z OB2 +$z z1 +$z z1 O36 +$z z2 ^o +$z z5 +$z { ${ -${K -${L4 -${L5 -${L8 -${o70sr@ +${ K +${ L4 +${ L5 +${ L8 +${ o70 sr@ $| -$|$* -$|L0 -$|u +$| $* +$| L0 +$| u $} -$}$o -$}+0 -$}+5 -$}+A -$}c -$}kO01 -$}l -$}lr -$}t -$}z2r -'1+0z4 -'1Z4 -'1Z5 -'1p3 -'1z4Z4 -'2+0p4 -'2L1 -'2Z4 -'2Z4z2 -'2Z5$o -'2[p3 -'2i0Dp2 -'2k -'2o0< -'2o0> -'2p2 -'2p3 -'2z2 -'2z3 -'2z3+2 -'2z4 -'2z5 +$} $o +$} +0 +$} +5 +$} +A +$} c +$} k O01 +$} l +$} l r +$} t +$} z2 r +'1 +0 z4 +'1 Z4 +'1 Z5 +'1 p3 +'1 z4 Z4 +'2 +0 p4 +'2 L1 +'2 Z4 +'2 Z4 z2 +'2 Z5 $o +'2 [ p3 +'2 i0D p2 +'2 k +'2 o0< +'2 o0> +'2 p2 +'2 p3 +'2 z2 +'2 z3 +'2 z3 +2 +'2 z4 +'2 z5 '3 -'3$L -'3$S -'3$g -'3+2 -'3Z2 -'3Z3 -'3Z5 -'3[ -'3[$f -'3^0^3 -'3^a -'3^p -'3d -'3p2 -'3q -'3qd -'3sjX -'3t -'3tq -'3us1= -'3z1 -'3z3 -'3z4 -'3z5 -'3z5z4 -'3z5} +'3 $L +'3 $S +'3 $g +'3 +2 +'3 Z2 +'3 Z3 +'3 Z5 +'3 [ +'3 [ $f +'3 ^0 ^3 +'3 ^a +'3 ^p +'3 d +'3 p2 +'3 q +'3 q d +'3 sjX +'3 t +'3 t q +'3 u s1= +'3 z1 +'3 z3 +'3 z4 +'3 z5 +'3 z5 z4 +'3 z5 } '4 -'4$ -'4$0 -'4$m -'4$o -'4+0 -'4+1 -'4+2^! -'4@q^J -'4T2$q -'4Z1 -'4Z2 -'4Z3 -'4Z5 -'4Z5Z3 -'4[ -'4^8 -'4^L -'4^P -'4^S -'4^d -'4^l -'4c -'4d[ -'4dt -'4f -'4i11*02 -'4i1f -'4i2: -'4i3t -'4o0$ -'4o04 -'4o1m -'4o3' -'4o3S -'4p1 -'4p2+9 -'4q^? -'4r -'4s1* -'4s2R -'4s5? -'4uR3 -'4z1q -'4z2 -'4z4 -'4z5 +'4 $ +'4 $0 +'4 $m +'4 $o +'4 +0 +'4 +1 +'4 +2 ^! +'4 @q ^J +'4 T2 $q +'4 Z1 +'4 Z2 +'4 Z3 +'4 Z5 +'4 Z5 Z3 +'4 [ +'4 ^8 +'4 ^L +'4 ^P +'4 ^S +'4 ^d +'4 ^l +'4 c +'4 d [ +'4 d t +'4 f +'4 i11 *02 +'4 i1f +'4 i2: +'4 i3t +'4 o0$ +'4 o04 +'4 o1m +'4 o3' +'4 o3S +'4 p1 +'4 p2 +9 +'4 q ^? +'4 r +'4 s1* +'4 s2R +'4 s5? +'4 u R3 +'4 z1 q +'4 z2 +'4 z4 +'4 z5 '5 -'5$& -'5$1 -'5$1@0 -'5$2 -'5$3 -'5$3L5 -'5$7 -'5$: -'5$I -'5$\*10 -'5$e-5 -'5$i -'5$kz1 -'5$r -'5$x -'5*13 -'5*14*20 -'5+3 -'5+4 -'5-1 -'5C -'5L3Z1 -'5L4O21 -'5Z1 -'5Z2@d -'5Z3 -'5Z4 -'5Z5 -'5Z5T9 -'5Z5O31 -'5[ -'5^9 -'5^F -'5^b -'5^i -'5^z -'5c$R -'5c@r -'5d -'5d^B -'5f -'5i1l -'5i2. -'5i2l -'5i3e -'5i3r -'5l -'5o0b -'5o0d -'5o0i -'5o0m -'5o1g -'5o25 -'5o2Wo21 -'5o2k -'5o2z -'5o3k -'5o4& -'5o4d -'5q -'5s1N -'5s1i -'5sL7 -'5sgm -'5shH -'5t -'5O01Z2 -'5O02 -'5z1 -'5z2 -'5z4 -'5z5 +'5 $& +'5 $1 +'5 $1 @0 +'5 $2 +'5 $3 +'5 $3 L5 +'5 $7 +'5 $: +'5 $I +'5 $\ *10 +'5 $e -5 +'5 $i +'5 $k z1 +'5 $r +'5 $x +'5 *13 +'5 *14 *20 +'5 +3 +'5 +4 +'5 -1 +'5 C +'5 L3 Z1 +'5 L4 O21 +'5 Z1 +'5 Z2 @d +'5 Z3 +'5 Z4 +'5 Z5 +'5 Z5 T9 +'5 Z5 O31 +'5 [ +'5 ^9 +'5 ^F +'5 ^b +'5 ^i +'5 ^z +'5 c $R +'5 c @r +'5 d +'5 d ^B +'5 f +'5 i1l +'5 i2. +'5 i2l +'5 i3e +'5 i3r +'5 l +'5 o0b +'5 o0d +'5 o0i +'5 o0m +'5 o1g +'5 o25 +'5 o21 +'5 o2k +'5 o2z +'5 o3k +'5 o4& +'5 o4d +'5 q +'5 s1N +'5 s1i +'5 sL7 +'5 sgm +'5 shH +'5 t +'5 O01 Z2 +'5 O02 +'5 z1 +'5 z2 +'5 z4 +'5 z5 '6 -'6$ -'6$, -'6$0 -'6$2 -'6$7 -'6$9 -'6$Q -'6$i -'6$k -'6$k^w -'6$kz3 -'6$l -'6$p -'6$r -'6*03 -'6*21u -'6*51 -'6*54 -'6+1 -'6+3 -'6+4c -'6-1 -'6@3 -'6@4 -'6@Z -'6D1 -'6D1o0K -'6D2 -'6L0 -'6L1s61 -'6L2 -'6R2sob -'6R5 -'6T0o5* -'6T1 -'6Z1 -'6Z1$} -'6Z2 -'6Z3 -'6Z4*64 -'6Z5 -'6[ -'6^2 -'6^G -'6^L -'6^O -'6^a -'6^h -'6^j -'6^lD1 -'6^p -'6^w -'6^yz3 -'6c -'6cZ1 -'6d -'6dz1 -'6fO45 -'6i1* -'6i23^, -'6i3- -'6i3m -'6i3r -'6i4g -'6i4p -'6i5% -'6i5r -'6l -'6o0*} -'6o1l -'6o3P -'6o3e -'6o3t -'6o4O -'6o5% -'6o5V -'6o5` -'6o5l -'6p2 -'6q -'6s0g -'6sfs -'6shb -'6sjv -'6snG -'6sqg -'6O13 -'6z1 -'6z1z3 -'6z2 -'6z3o1s -'6z4o9o -'6z5 +'6 $ +'6 $, +'6 $0 +'6 $2 +'6 $7 +'6 $9 +'6 $Q +'6 $i +'6 $k +'6 $k ^w +'6 $k z3 +'6 $l +'6 $p +'6 $r +'6 *03 +'6 *21 u +'6 *51 +'6 *54 +'6 +1 +'6 +3 +'6 +4 c +'6 -1 +'6 @3 +'6 @4 +'6 @Z +'6 D1 +'6 D1 o0K +'6 D2 +'6 L0 +'6 L1 s61 +'6 L2 +'6 R2 sob +'6 R5 +'6 T0 o5* +'6 T1 +'6 Z1 +'6 Z1 $} +'6 Z2 +'6 Z3 +'6 Z4 *64 +'6 Z5 +'6 [ +'6 ^2 +'6 ^G +'6 ^L +'6 ^O +'6 ^a +'6 ^h +'6 ^j +'6 ^l D1 +'6 ^p +'6 ^w +'6 ^y z3 +'6 c +'6 c Z1 +'6 d +'6 d z1 +'6 f O45 +'6 i1* +'6 i23 ^, +'6 i3- +'6 i3m +'6 i3r +'6 i4g +'6 i4p +'6 i5% +'6 i5r +'6 l +'6 o0* } +'6 o1l +'6 o3P +'6 o3e +'6 o3t +'6 o4O +'6 o5% +'6 o5V +'6 o5` +'6 o5l +'6 p2 +'6 q +'6 s0g +'6 sfs +'6 shb +'6 sjv +'6 snG +'6 sqg +'6 O13 +'6 z1 +'6 z1 z3 +'6 z2 +'6 z3 o1s +'6 z4 o9o +'6 z5 '7 -'7$! -'7$* -'7$*D4 -'7$. -'7$1 -'7$8 -'7$9 -'7$J -'7$P -'7$T^s -'7$U -'7$e -'7$n -'7$s -'7$t -'7*30 -'7*46 -'7+0+4 -'7+5 -'7+6 -'7-3 -'7-4 -'7-5 -'7C -'7C-5 -'7D4 -'7R5 -'7R5o2c -'7T3 -'7Z1 -'7Z1T0 -'7Z2 -'7Z3 -'7Z4 -'7Z5 -'7[*41 -'7]*14 -'7^ -'7^< -'7^@ -'7^C -'7^D -'7^T -'7^[ -'7^n -'7^tsxt -'7c -'7cO01 -'7d -'7f -'7i0Ad -'7i29 -'7i4; -'7i5_ -'7i6+ -'7l -'7o0b -'7o11-6 -'7o1n -'7o3 -'7o3g -'7o5. -'7o59 -'7o6! -'7o6w{ -'7o6z -'7q -'7s1- -'7s6/ -'7saZ -'7sat -'7sdr -'7sfn -'7srv -'7u -'7ud -'7O13$s -'7O51 -'7z4z5 -'7} +'7 $! +'7 $* +'7 $* D4 +'7 $. +'7 $1 +'7 $8 +'7 $9 +'7 $J +'7 $P +'7 $T ^s +'7 $U +'7 $e +'7 $n +'7 $s +'7 $t +'7 *30 +'7 *46 +'7 +0 +4 +'7 +5 +'7 +6 +'7 -3 +'7 -4 +'7 -5 +'7 C +'7 C -5 +'7 D4 +'7 R5 +'7 R5 o2c +'7 T3 +'7 Z1 +'7 Z1 T0 +'7 Z2 +'7 Z3 +'7 Z4 +'7 Z5 +'7 [ *41 +'7 ] *14 +'7 ^ +'7 ^< +'7 ^@ +'7 ^C +'7 ^D +'7 ^T +'7 ^[ +'7 ^n +'7 ^t sxt +'7 c +'7 c O01 +'7 d +'7 f +'7 i0A d +'7 i29 +'7 i4; +'7 i5_ +'7 i6+ +'7 l +'7 o0b +'7 o11 -6 +'7 o1n +'7 o3 +'7 o3g +'7 o5. +'7 o59 +'7 o6! +'7 o6w { +'7 o6z +'7 q +'7 s1- +'7 s6/ +'7 saZ +'7 sat +'7 sdr +'7 sfn +'7 srv +'7 u +'7 u d +'7 O13 $s +'7 O51 +'7 z4 z5 +'7 } '8 -'8$, -'8$0 -'8$@ -'8$K -'8$N -'8$Q -'8$a -'8$h -'8$i -'8$s -'8$y -'8*02 -'8*12 -'8*32 -'8*56 -'8*70 -'8*74 -'8+0 -'8+3s2+ -'8+6 -'8-2 -'8-5 -'8-6 -'8@p -'8@z@g -'8CO43 -'8D4+6 -'8Ko5p -'8L3 -'8R2 -'8T7 -'8Z1 -'8Z2 -'8Z4 -'8Z5 -'8[ -'8[L6 -'8^4 -'8^R -'8^a -'8^t -'8^|z2 -'8c -'8d -'8dz2 -'8i02 -'8i1. -'8i2d -'8i4_ -'8i4u -'8i4{ -'8i52 -'8i5e -'8i6P -'8i6j -'8i7_ -'8i7w -'8o0E -'8o12 -'8o2tD1 -'8o34 -'8o7/ -'8o7; -'8o7a -'8s 5 -'8s2<$, -'8siz -'8t -'8u -'8O51 -'8O61 -'8z1 -'8z1O12 +'8 $, +'8 $0 +'8 $@ +'8 $K +'8 $N +'8 $Q +'8 $a +'8 $h +'8 $i +'8 $s +'8 $y +'8 *02 +'8 *12 +'8 *32 +'8 *56 +'8 *70 +'8 *74 +'8 +0 +'8 +3 s2+ +'8 +6 +'8 -2 +'8 -5 +'8 -6 +'8 @p +'8 @z @g +'8 C O43 +'8 D4 +6 +'8 K o5p +'8 L3 +'8 R2 +'8 T7 +'8 Z1 +'8 Z2 +'8 Z4 +'8 Z5 +'8 [ +'8 [ L6 +'8 ^4 +'8 ^R +'8 ^a +'8 ^t +'8 ^| z2 +'8 c +'8 d +'8 d z2 +'8 i02 +'8 i1. +'8 i2d +'8 i4_ +'8 i4u +'8 i4{ +'8 i52 +'8 i5e +'8 i6P +'8 i6j +'8 i7_ +'8 i7w +'8 o0E +'8 o12 +'8 o2t D1 +'8 o34 +'8 o7/ +'8 o7; +'8 o7a +'8 s 5 +'8 s2< $, +'8 siz +'8 t +'8 u +'8 O51 +'8 O61 +'8 z1 +'8 z1 O12 '9 -'9$' -'9$. -'9$1 -'9$2 -'9$B -'9$D+1 -'9$M -'9$c -'9$h -'9$k -'9$r -'9*08 -'9*53 -'9*76 -'9*83 -'9*85 -'9+0 -'9+2 -'9-2 -'9-3 -'9-4 -'9-6 -'9@a -'9D2 -'9D4 -'9R8 -'9T2 -'9T4 -'9T5 -'9T8 -'9Z1 -'9Z2 -'9Z3 -'9Z5 -'9[ -'9^1 -'9^d -'9^e@c -'9^k -'9c -'9i1t -'9i2l -'9i3n -'9i4 -'9i45 -'9i50 -'9i7w -'9i8K -'9i8e -'9i8r -'9i8t -'9l -'9o2l -'9o2z -'9o4. -'9o4h -'9o4j -'9o5j -'9o6m -'9o7n -'9o7s -'9o7y -'9q -'9r -'9sah -'9se2 -'9sfg -'9u -'9O06 -'9O43 -'9O61 -'9z2 +'9 $' +'9 $. +'9 $1 +'9 $2 +'9 $B +'9 $D +1 +'9 $M +'9 $c +'9 $h +'9 $k +'9 $r +'9 *08 +'9 *53 +'9 *76 +'9 *83 +'9 *85 +'9 +0 +'9 +2 +'9 -2 +'9 -3 +'9 -4 +'9 -6 +'9 @a +'9 D2 +'9 D4 +'9 R8 +'9 T2 +'9 T4 +'9 T5 +'9 T8 +'9 Z1 +'9 Z2 +'9 Z3 +'9 Z5 +'9 [ +'9 ^1 +'9 ^d +'9 ^e @c +'9 ^k +'9 c +'9 i1t +'9 i2l +'9 i3n +'9 i4 +'9 i45 +'9 i50 +'9 i7w +'9 i8K +'9 i8e +'9 i8r +'9 i8t +'9 l +'9 o2l +'9 o2z +'9 o4. +'9 o4h +'9 o4j +'9 o5j +'9 o6m +'9 o7n +'9 o7s +'9 o7y +'9 q +'9 r +'9 sah +'9 se2 +'9 sfg +'9 u +'9 O06 +'9 O43 +'9 O61 +'9 z2 'A -'A$-[ -'A$7 -'A$? -'A$a -'A$e -'A$k -'A$w -'A+1 -'A+2 -'A+3 -'A+7 -'A@a -'AD1 -'AD3 -'AD7 -'AL1 -'AR9 -'AT5 -'AT8 -'AT9 -'AZ1 -'A^T -'A^t -'Ac -'Ai7s -'Ai81 -'Ai9 -'Al -'Ao3k -'Ao43 -'Ao7b -'Ao7h -'Ao7l -'Ao8ml -'Ao9q -'Ap1 -'Aq -'As97 -'At -'AO41 -'AO42 -'AO43 -'AO52 -'AO62+6 +'A $- [ +'A $7 +'A $? +'A $a +'A $e +'A $k +'A $w +'A +1 +'A +2 +'A +3 +'A +7 +'A @a +'A D1 +'A D3 +'A D7 +'A L1 +'A R9 +'A T5 +'A T8 +'A T9 +'A Z1 +'A ^T +'A ^t +'A c +'A i7s +'A i81 +'A i9 +'A l +'A o3k +'A o43 +'A o7b +'A o7h +'A o7l +'A o8m l +'A o9q +'A p1 +'A q +'A s97 +'A t +'A O41 +'A O42 +'A O43 +'A O52 +'A O62 +6 'B -'B$4 -'B$6 -'B$8 -'B$I -'B$\*5B -'B$c -'B$e -'B$l -'B$m -'B*23 -'B*35 -'B*97 -'B+5 -'B+7 -'B+A -'B@y -'BD3 -'BD4 -'BT1 -'BT7 -'BZ1[ -'BZ2 -'B[R1 -'B^1 -'Bk -'Bl -'Bo00 -'Bo6? -'Bo6l -'Bo8f -'Bo9. -'Bo9@ -'Bo9i -'Br -'Bsoa -'Bt -'BO36 -'BO51 -'BO71 -'BO72 -'Bz5 -*01$f -*01*41 -*01*53R6 -*01*65R7 -*01*83 -*01+1 -*01L1 -*01L5 -*01R0 -*01Z2^g -*01[$t -*01[i6v -*01^*i3g -*01^0 -*01^O -*01^R -*01^v -*01d$k -*01i11 -*01i3-[ -*01o3v+4 -*01o6! -*01o7) -*01o8s -*01s x[ -*01s81 -*01scx -*01soi -*01sx5 -*01t*51 -*01O42 -*01O61 -*01z4] -*01z5 -*01{$6 +'B $4 +'B $6 +'B $8 +'B $I +'B $\ *5B +'B $c +'B $e +'B $l +'B $m +'B *23 +'B *35 +'B *97 +'B +5 +'B +7 +'B +A +'B @y +'B D3 +'B D4 +'B T1 +'B T7 +'B Z1 [ +'B Z2 +'B [ R1 +'B ^1 +'B k +'B l +'B o00 +'B o6? +'B o6l +'B o8f +'B o9. +'B o9@ +'B o9i +'B r +'B soa +'B t +'B O36 +'B O51 +'B O71 +'B O72 +'B z5 +*01 $f +*01 *41 +*01 *53 R6 +*01 *65 R7 +*01 *83 +*01 +1 +*01 L1 +*01 L5 +*01 R0 +*01 Z2 ^g +*01 [ $t +*01 [ i6v +*01 ^* i3g +*01 ^0 +*01 ^O +*01 ^R +*01 ^v +*01 d $k +*01 i11 +*01 i3- [ +*01 o3v +4 +*01 o6! +*01 o7) +*01 o8s +*01 s x [ +*01 s81 +*01 scx +*01 soi +*01 sx5 +*01 t *51 +*01 O42 +*01 O61 +*01 z4 ] +*01 z5 +*01 { $6 *02 -*02$d -*02$g -*02$i -*02*06 -*02*10$K -*02*57sdl -*02*97 -*02+5 -*02+9 -*02D3 -*02L3 -*02R4 -*02T6 -*02T7 -*02Z2 -*02[ -*02^0 -*02^b -*02^f -*02^j -*02^s*24 -*02^y -*02i0s -*02i1L-2 -*02i1isih -*02i3& -*02i3\ -*02i3p -*02k*13 -*02o1a -*02o20 -*02o2w -*02o2z -*02o3a -*02o3e -*02o3m -*02o51 -*02o5_ -*02o6M -*02o7Yl -*02q -*02s0P*17 -*02scl -*02O21 -*02O24 -*02O42 -*02O63 -*02z2 +*02 $d +*02 $g +*02 $i +*02 *06 +*02 *10 $K +*02 *57 sdl +*02 *97 +*02 +5 +*02 +9 +*02 D3 +*02 L3 +*02 R4 +*02 T6 +*02 T7 +*02 Z2 +*02 [ +*02 ^0 +*02 ^b +*02 ^f +*02 ^j +*02 ^s *24 +*02 ^y +*02 i0s +*02 i1L -2 +*02 i1i sih +*02 i3& +*02 i3\ +*02 i3p +*02 k *13 +*02 o1a +*02 o20 +*02 o2w +*02 o2z +*02 o3a +*02 o3e +*02 o3m +*02 o51 +*02 o5_ +*02 o6M +*02 o7Y l +*02 q +*02 s0P *17 +*02 scl +*02 O21 +*02 O24 +*02 O42 +*02 O63 +*02 z2 *03 -*03$c*51 -*03$r -*03$t -*03$w -*03'5 -*03*05 -*03*36 -*03*41 -*03*47 -*03+1o2r -*03CZ4 -*03D1 -*03R3 -*03T8*70 -*03Z3O07 -*03^O -*03^a -*03i1b -*03i1r -*03i3e -*03l+0 -*03o0h -*03o0l -*03o0p -*03o1! -*03o1t -*03o1y[ -*03o2P -*03o3a -*03o3t -*03o3w -*03o5_ -*03q -*03r^z -*03sbe -*03sjx -*03snti1; -*03sqt -*03O34 -*03O43 -*03z3 +*03 $c *51 +*03 $r +*03 $t +*03 $w +*03 '5 +*03 *05 +*03 *36 +*03 *41 +*03 *47 +*03 +1 o2r +*03 C Z4 +*03 D1 +*03 R3 +*03 T8 *70 +*03 Z3 O07 +*03 ^O +*03 ^a +*03 i1b +*03 i1r +*03 i3e +*03 l +0 +*03 o0h +*03 o0l +*03 o0p +*03 o1! +*03 o1t +*03 o1y [ +*03 o2P +*03 o3a +*03 o3t +*03 o3w +*03 o5_ +*03 q +*03 r ^z +*03 sbe +*03 sjx +*03 snt i1; +*03 sqt +*03 O34 +*03 O43 +*03 z3 *04 -*04$5 -*04$nO41 -*04$pZ1 -*04$y*53 -*04*07 -*04*17 -*04*31Z2 -*04*73 -*04+3 -*04+4 -*04+6 -*04+8D0 -*04D1 -*04T0 -*04T6 -*04Z1 -*04[ -*04^# -*04^9 -*04i0K*43 -*04i0m -*04i3R -*04i4t -*04l -*04li6* -*04o0`O23 -*04o0t -*04o41 -*04oAw[ -*04smv -*04son -*04sry] -*04u -*04O07p3 -*04O32 -*04z4 -*04{ +*04 $5 +*04 $n O41 +*04 $p Z1 +*04 $y *53 +*04 *07 +*04 *17 +*04 *31 Z2 +*04 *73 +*04 +3 +*04 +4 +*04 +6 +*04 +8 D0 +*04 D1 +*04 T0 +*04 T6 +*04 Z1 +*04 [ +*04 ^# +*04 ^9 +*04 i0K *43 +*04 i0m +*04 i3R +*04 i4t +*04 l +*04 l i6* +*04 o0` O23 +*04 o0t +*04 o41 +*04 oAw [ +*04 smv +*04 son +*04 sry ] +*04 u +*04 O07 p3 +*04 O32 +*04 z4 +*04 { *05 -*05$@ -*05'5 -*05*12 -*05*26 -*05+3 -*05-1 -*05K -*05R1 -*05R4*06 -*05T1 -*05T6 -*05Z1 -*05Z1i5i -*05[ -*05]-5 -*05^(z1 -*05^o -*05^r -*05^y -*05c -*05d -*05i01 -*05i1y -*05i3#^` -*05l -*05o00 -*05o0r -*05o2f -*05o4i -*05o5B -*05q -*05r -*05saC -*05uD0 -*05O02 -*05O03 -*05O21 -*05O35 -*05O45 -*05O52Z1 -*05z2*39 +*05 $@ +*05 '5 +*05 *12 +*05 *26 +*05 +3 +*05 -1 +*05 K +*05 R1 +*05 R4 *06 +*05 T1 +*05 T6 +*05 Z1 +*05 Z1 i5i +*05 [ +*05 ] -5 +*05 ^( z1 +*05 ^o +*05 ^r +*05 ^y +*05 c +*05 d +*05 i01 +*05 i1y +*05 i3# ^` +*05 l +*05 o00 +*05 o0r +*05 o2f +*05 o4i +*05 o5B +*05 q +*05 r +*05 saC +*05 u D0 +*05 O02 +*05 O03 +*05 O21 +*05 O35 +*05 O45 +*05 O52 Z1 +*05 z2 *39 *06 -*06$) -*06$1 -*06$6'5 -*06'6 -*06*15 -*06*67 -*06*87 -*06+6 -*06D2 -*06D3sMf -*06R0 -*06R7 -*06T4 -*06T6 -*06^h -*06^w -*06d -*06i6y -*06l -*06o2y -*06o3m -*06o4k -*06o4m -*06o5j -*06o69 -*06s7A -*06t -*06O02 -*06O34 -*06O41 -*06z1 +*06 $) +*06 $1 +*06 $6 '5 +*06 '6 +*06 *15 +*06 *67 +*06 *87 +*06 +6 +*06 D2 +*06 D3 sMf +*06 R0 +*06 R7 +*06 T4 +*06 T6 +*06 ^h +*06 ^w +*06 d +*06 i6y +*06 l +*06 o2y +*06 o3m +*06 o4k +*06 o4m +*06 o5j +*06 o69 +*06 s7A +*06 t +*06 O02 +*06 O34 +*06 O41 +*06 z1 *07 -*07$g -*07$p -*07*18 -*07*24T1 -*07*53O31 -*07+0 -*07-4z2 -*07D2 -*07D6 -*07R7 -*07c -*07i8b[ -*07O04O31 -*07O58 -*07z4 +*07 $g +*07 $p +*07 *18 +*07 *24 T1 +*07 *53 O31 +*07 +0 +*07 -4 z2 +*07 D2 +*07 D6 +*07 R7 +*07 c +*07 i8b [ +*07 O04 O31 +*07 O58 +*07 z4 *08 -*08'5 -*08D6 -*08T0*13 -*08Z1s1( -*08[ -*08i7t -*08O06 -*08O45 -*08O47 +*08 '5 +*08 D6 +*08 T0 *13 +*08 Z1 s1( +*08 [ +*08 i7t +*08 O06 +*08 O45 +*08 O47 *09 -*09'6 -*09*91 -*09*97 -*09l[ -*09o6@ -*09s86 -*09O03 -*09O34 -*0ALBO06 -*0A[ -*0At -*0AO7A -*0Bl -*0BO08 -*0BO74 -*10$6{ -*10*30z3 -*10*42 -*10+4i1: -*10-8 -*10R1 -*10Z2d -*10^9 -*10^a -*10^q -*10i03 -*10i1b -*10i2b -*10i38 -*10i3r -*10i4{ -*10lz2 -*10o1. -*10o2Xi7; -*10o4wZ1 -*10o4z -*10rD3 -*10tO81 -*10O04@t -*10O19 -*10{c +*09 '6 +*09 *91 +*09 *97 +*09 l [ +*09 o6@ +*09 s86 +*09 O03 +*09 O34 +*0A LB O06 +*0A [ +*0A t +*0A O7A +*0B l +*0B O08 +*0B O74 +*10 $6 { +*10 *30 z3 +*10 *42 +*10 +4 i1: +*10 -8 +*10 R1 +*10 Z2 d +*10 ^9 +*10 ^a +*10 ^q +*10 i03 +*10 i1b +*10 i2b +*10 i38 +*10 i3r +*10 i4{ +*10 l z2 +*10 o1. +*10 o2X i7; +*10 o4w Z1 +*10 o4z +*10 r D3 +*10 t O81 +*10 O04 @t +*10 O19 +*10 { c *12 -*12$ -*12$! -*12$4 -*12$= -*12$Ku -*12$R -*12'5 -*12*68 -*12+1 -*12K -*12R3 -*12Z2 -*12[^R -*12[o6o -*12^'^, -*12^0 -*12^P -*12^k -*12dO6B -*12f -*12i0o -*12i1; -*12i1g -*12i2-*43 -*12i2p -*12i4! -*12kss2 -*12l -*12lk -*12o0D -*12o1b -*12o1j -*12o2y -*12p1 -*12s34 -*12sma -*12snp -*12uf -*12O42$v -*12z3 -*12} -*12}i01 +*12 $ +*12 $! +*12 $4 +*12 $= +*12 $K u +*12 $R +*12 '5 +*12 *68 +*12 +1 +*12 K +*12 R3 +*12 Z2 +*12 [ ^R +*12 [ o6o +*12 ^' ^, +*12 ^0 +*12 ^P +*12 ^k +*12 d O6B +*12 f +*12 i0o +*12 i1; +*12 i1g +*12 i2- *43 +*12 i2p +*12 i4! +*12 k ss2 +*12 l +*12 l k +*12 o0D +*12 o1b +*12 o1j +*12 o2y +*12 p1 +*12 s34 +*12 sma +*12 snp +*12 u f +*12 O42 $v +*12 z3 +*12 } +*12 } i01 *13 -*13$8 -*13$M -*13$q -*13*04 -*13*26 -*13*42 -*13*45R1 -*13*65 -*13D1 -*13D9 -*13KO31 -*13Z1[ -*13[p1 -*13^*i3p -*13^/*72 -*13^8 -*13^T -*13^u -*13^z -*13c -*13dO52 -*13i4y -*13i5u -*13i64 -*13k -*13o0f -*13o2- -*13o4B -*13p1 -*13s73 -*13sau -*13sbci1& -*13sc2 -*13svr -*13O03i0q -*13O12 -*13O43 -*13z1*16 -*13z2 -*13z5 -*13{i0t +*13 $8 +*13 $M +*13 $q +*13 *04 +*13 *26 +*13 *42 +*13 *45 R1 +*13 *65 +*13 D1 +*13 D9 +*13 K O31 +*13 Z1 [ +*13 [ p1 +*13 ^* i3p +*13 ^/ *72 +*13 ^8 +*13 ^T +*13 ^u +*13 ^z +*13 c +*13 d O52 +*13 i4y +*13 i5u +*13 i64 +*13 k +*13 o0f +*13 o2- +*13 o4B +*13 p1 +*13 s73 +*13 sau +*13 sbc i1& +*13 sc2 +*13 svr +*13 O03 i0q +*13 O12 +*13 O43 +*13 z1 *16 +*13 z2 +*13 z5 +*13 { i0t *14 -*14$7 -*14'5q -*14*27] -*14*34 -*14+3i2w -*14-2 -*14-2$i -*14C -*14C*10 -*14R2 -*14R3 -*14Z1 -*14Z2 -*14Z3*36 -*14^1 -*14^f -*14^q -*14^t -*14c -*14i0m -*14i2- -*14i2v -*14o1! -*14o1X -*14o5z -*14o9z -*14q'6 -*14svm -*14O02 -*14z1i0T -*14z2+7 -*14z5 -*14} -*14}i38 +*14 $7 +*14 '5 q +*14 *27 ] +*14 *34 +*14 +3 i2w +*14 -2 +*14 -2 $i +*14 C +*14 C *10 +*14 R2 +*14 R3 +*14 Z1 +*14 Z2 +*14 Z3 *36 +*14 ^1 +*14 ^f +*14 ^q +*14 ^t +*14 c +*14 i0m +*14 i2- +*14 i2v +*14 o1! +*14 o1X +*14 o5z +*14 o9z +*14 q '6 +*14 svm +*14 O02 +*14 z1 i0T +*14 z2 +7 +*14 z5 +*14 } +*14 } i38 *15 -*15$' -*15$9Z1 -*15$n -*15$p -*15$t -*15$u -*15*10 -*15*23 -*15*41*43 -*15+3 -*15D1 -*15T4 -*15Z1 -*15Z2o86 -*15] -*15^H -*15^p*71 -*15f -*15i1^o7f -*15ki3u -*15o1u -*15o5 -*15p1 -*15snpr -*15uO01 -*15O04@5 -*15O13 -*15O34 -*15O42 -*15z2'6 -*15} +*15 $' +*15 $9 Z1 +*15 $n +*15 $p +*15 $t +*15 $u +*15 *10 +*15 *23 +*15 *41 *43 +*15 +3 +*15 D1 +*15 T4 +*15 Z1 +*15 Z2 o86 +*15 ] +*15 ^H +*15 ^p *71 +*15 f +*15 i1^ o7f +*15 k i3u +*15 o1u +*15 o5 +*15 p1 +*15 snp r +*15 u O01 +*15 O04 @5 +*15 O13 +*15 O34 +*15 O42 +*15 z2 '6 +*15 } *16 -*16$R -*16$d -*16'7 -*16*05 -*16*05*30 -*16*23 -*16*47 -*16*48 -*16D5u -*16] -*16^1 -*16i5a -*16o1y -*16o27 -*16o3/^C -*16o5s -*16o5w -*16r -*16snp -*16O03 -*16O04D0 -*16O43 -*16z2 +*16 $R +*16 $d +*16 '7 +*16 *05 +*16 *05 *30 +*16 *23 +*16 *47 +*16 *48 +*16 D5 u +*16 ] +*16 ^1 +*16 i5a +*16 o1y +*16 o27 +*16 o3/ ^C +*16 o5s +*16 o5w +*16 r +*16 snp +*16 O03 +*16 O04 D0 +*16 O43 +*16 z2 *17 -*17$y -*17'6 -*17*73 -*17+7 -*17+7z2 -*17-8 -*17Z2D1 -*17Z3 -*17Z5 -*17i13$5 -*17i5N*56 -*17r -*17O06 -*17O12 -*17O15 -*17O42 -*17O51 +*17 $y +*17 '6 +*17 *73 +*17 +7 +*17 +7 z2 +*17 -8 +*17 Z2 D1 +*17 Z3 +*17 Z5 +*17 i13 $5 +*17 i5N *56 +*17 r +*17 O06 +*17 O12 +*17 O15 +*17 O42 +*17 O51 *18 -*18@sO05 -*18D7 -*18D8 -*18^& -*18^} -*18l -*18o5g -*18O03 -*18O62 -*18O75 +*18 @s O05 +*18 D7 +*18 D8 +*18 ^& +*18 ^} +*18 l +*18 o5g +*18 O03 +*18 O62 +*18 O75 *19 -*19$2 -*19i6Y -*19O08-4 -*19O41 -*19z3O07 -*1A'A -*1AO03'9 -*1AOA1 -*1BO01 -*1BO17 -*20$$Z1 -*20$/ -*20$2 -*20$9+4 -*20'4 -*20*03 -*20*14c -*20*43 -*20*50 -*20+2 -*20-0 -*20@p*27 -*20D5 -*20Z3*71 -*20^1 -*20c -*20d$7 -*20i3i -*20o0l -*20o2. -*20o3i -*20o4 -*20o5X -*20o5s -*20o6 -*20o7R -*20oBm*A7 -*20p1 -*20p2O14 -*20r -*20s29 -*20s4q -*20s52 -*20s9! -*20slm^9 -*20sri -*20svt -*20syt -*20td -*20O05o3U -*20O18O06 -*20O23 -*20O32 -*20O41 -*20O41[ -*20O71 -*20z4$z -*20} -*20}u -*21*02z5 -*21*03 -*21*13 -*21*20 -*21*28 -*21*36 -*21*56 -*21*72 -*21*78 -*21+4l -*21-3 -*21C -*21D3*42 -*21R0 -*21Z1} -*21^ -*21^6*61 -*21^j -*21i0m -*21i4t -*21i5 -*21i50 -*21i61 -*21i8| -*21kd -*21o0m -*21o1e -*21o2g -*21o61 -*21sdEO24 -*21suo -*21O25 -*21O25^p -*21O31c -*21O41 -*21z1O42 -*21z2 -*21z4 +*19 $2 +*19 i6Y +*19 O08 -4 +*19 O41 +*19 z3 O07 +*1A 'A +*1A O03 '9 +*1A OA1 +*1B O01 +*1B O17 +*20 $$ Z1 +*20 $/ +*20 $2 +*20 $9 +4 +*20 '4 +*20 *03 +*20 *14 c +*20 *43 +*20 *50 +*20 +2 +*20 -0 +*20 @p *27 +*20 D5 +*20 Z3 *71 +*20 ^1 +*20 c +*20 d $7 +*20 i3i +*20 o0l +*20 o2. +*20 o3i +*20 o4 +*20 o5X +*20 o5s +*20 o6 +*20 o7R +*20 oBm *A7 +*20 p1 +*20 p2 O14 +*20 r +*20 s29 +*20 s4q +*20 s52 +*20 s9! +*20 slm ^9 +*20 sri +*20 svt +*20 syt +*20 t d +*20 O05 o3U +*20 O18 O06 +*20 O23 +*20 O32 +*20 O41 +*20 O41 [ +*20 O71 +*20 z4 $z +*20 } +*20 } u +*21 *02 z5 +*21 *03 +*21 *13 +*21 *20 +*21 *28 +*21 *36 +*21 *56 +*21 *72 +*21 *78 +*21 +4 l +*21 -3 +*21 C +*21 D3 *42 +*21 R0 +*21 Z1 } +*21 ^ +*21 ^6 *61 +*21 ^j +*21 i0m +*21 i4t +*21 i5 +*21 i50 +*21 i61 +*21 i8| +*21 k d +*21 o0m +*21 o1e +*21 o2g +*21 o61 +*21 sdE O24 +*21 suo +*21 O25 +*21 O25 ^p +*21 O31 c +*21 O41 +*21 z1 O42 +*21 z2 +*21 z4 *23 -*23$* -*23$+i3# -*23$ir -*23$k -*23'5i1x -*23*05 -*23*31 -*23*86 -*23-6 -*23C -*23Kd -*23Z4*61 -*23^' -*23c -*23i0F -*23i1/ -*23i2-} -*23i3/$j -*23k -*23o0j -*23o1d -*23o2e -*23o3q -*23o3y -*23o4_ -*23t -*23O03 -*23O19i1H -*23O42 -*23O51 -*23z3 -*23z4o1= -*23} +*23 $* +*23 $+ i3# +*23 $i r +*23 $k +*23 '5 i1x +*23 *05 +*23 *31 +*23 *86 +*23 -6 +*23 C +*23 K d +*23 Z4 *61 +*23 ^' +*23 c +*23 i0F +*23 i1/ +*23 i2- } +*23 i3/ $j +*23 k +*23 o0j +*23 o1d +*23 o2e +*23 o3q +*23 o3y +*23 o4_ +*23 t +*23 O03 +*23 O19 i1H +*23 O42 +*23 O51 +*23 z3 +*23 z4 o1= +*23 } *24 -*24$m -*24*15 -*24*30 -*24*37c -*24*70] -*24+2 -*24-0 -*24-4 -*24D2 -*24K -*24R3 -*24Z2 -*24]p1 -*24^K -*24^O -*24^d -*24co29 -*24f -*24i3Tz2 -*24i3a$p -*24i6^ -*24o2L -*24o2x -*24o31 -*24o5K -*24src -*24O14L2 -*24z2 +*24 $m +*24 *15 +*24 *30 +*24 *37 c +*24 *70 ] +*24 +2 +*24 -0 +*24 -4 +*24 D2 +*24 K +*24 R3 +*24 Z2 +*24 ] p1 +*24 ^K +*24 ^O +*24 ^d +*24 c o29 +*24 f +*24 i3T z2 +*24 i3a $p +*24 i6^ +*24 o2L +*24 o2x +*24 o31 +*24 o5K +*24 src +*24 O14 L2 +*24 z2 *25 -*25$0O63 -*25$r -*25'5 -*25*13c -*25*24*10 -*25*40 -*25*42R5 -*25*45$p -*25*54 -*25*84'7 -*25+2 -*25+5 -*25+8^0 -*25-7O03 -*25D1 -*25D4o3m -*25R5 -*25T0 -*25T5 -*25Z1[ -*25Z3 -*25^2 -*25^a -*25^d -*25^m$% -*25i5a -*25lO32 -*25o0B -*25o0m -*25o2p -*25o4C -*25ssv -*25z2 -*25z2r -*25z2O41 +*25 $0 O63 +*25 $r +*25 '5 +*25 *13 c +*25 *24 *10 +*25 *40 +*25 *42 R5 +*25 *45 $p +*25 *54 +*25 *84 '7 +*25 +2 +*25 +5 +*25 +8 ^0 +*25 -7 O03 +*25 D1 +*25 D4 o3m +*25 R5 +*25 T0 +*25 T5 +*25 Z1 [ +*25 Z3 +*25 ^2 +*25 ^a +*25 ^d +*25 ^m $% +*25 i5a +*25 l O32 +*25 o0B +*25 o0m +*25 o2p +*25 o4C +*25 ssv +*25 z2 +*25 z2 r +*25 z2 O41 *26 -*26'5 -*26*37] -*26*48 -*26+4z1 -*26-2$5 -*26D2Z2 -*26D3 -*26D6 -*26T6O15 -*26^f -*26i4 -*26l^" -*26o33 -*26o5[Z1 -*26r -*26t$< -*26u -*26O06o28 -*26O41z4 -*26O62 -*26z1 -*26z2 +*26 '5 +*26 *37 ] +*26 *48 +*26 +4 z1 +*26 -2 $5 +*26 D2 Z2 +*26 D3 +*26 D6 +*26 T6 O15 +*26 ^f +*26 i4 +*26 l ^" +*26 o33 +*26 o5[ Z1 +*26 r +*26 t $< +*26 u +*26 O06 o28 +*26 O41 z4 +*26 O62 +*26 z1 +*26 z2 *27 -*27$y -*27*65 -*27*74 -*27*76 -*27D2 -*27^2 -*27i55 -*27k -*27o2n -*27O07Z2 -*27O12 -*27O15f -*27O26D5 -*27O43^p -*27O52 -*27z2 +*27 $y +*27 *65 +*27 *74 +*27 *76 +*27 D2 +*27 ^2 +*27 i55 +*27 k +*27 o2n +*27 O07 Z2 +*27 O12 +*27 O15 f +*27 O26 D5 +*27 O43 ^p +*27 O52 +*27 z2 *28 -*28'7 -*28T1 -*28T2 -*28c -*28o2. -*28O05 -*28z2seb -*28z3 +*28 '7 +*28 T1 +*28 T2 +*28 c +*28 o2. +*28 O05 +*28 z2 seb +*28 z3 *29 -*29T0O04 -*29s4wO13 -*29O03 -*29O04 -*29O04o0m -*29O14 -*2A^U -*2AO06 -*2BDA -*2BO14 -*30$*K -*30$z -*30*02 -*30*43 -*30+3 -*30-0 -*30-2 -*30-4 -*30-9 -*30C -*30D3T8 -*30R5 -*30R6 -*30T1 -*30Z1o59 -*30Z2 -*30[ -*30[f -*30^$ -*30^3 -*30^T -*30^g^j -*30^h -*30c -*30dK -*30f -*30i1Q -*30i2p -*30o2y -*30o82 -*30p1 -*30sdD -*30u -*30u{ -*30O23 -*30O26 -*30O27o4R -*30O32 -*30O41 -*30z2 -*30z2Z1 -*30z4 -*30{*35 -*30{O53 -*31$$ -*31$5O2A -*31$_ -*31$bsby -*31$r -*31'8 -*31'A -*31*20 -*31*34 -*31*74 -*31*91 -*31+2 -*31-0] -*31D2 -*31D4 -*31L6Z2 -*31T3 -*31Z3 -*31Z4 -*31Z5 -*31^i -*31^m -*31^t -*31f -*31i1a -*31i1j -*31i3& -*31i3n -*31i43 -*31i4d -*31l -*31o1u -*31o32 -*31o3^ -*31o3j -*31q -*31r -*31sg' -*31snsT6 -*31tk -*31O02 -*31O24 -*31O29 -*31O32 -*31z1c -*31z3L2 -*31z4 -*32$6 -*32$g*41 -*32'9 -*32*04 -*32*25 -*32*34 -*32*43*16 -*32*45 -*32*67 -*32+5 -*32+Az1 -*32-2 -*32-8 -*32D6 -*32D7 -*32R5 -*32T0 -*32T7 -*32Z1 -*32Z1O18 -*32Z2 -*32^3c -*32^A -*32^I -*32^s -*32d -*32dt -*32i05 -*32i1\*52 -*32i1u -*32i4s -*32i6_ -*32i7yc -*32i9n -*32l -*32o2c -*32o3h -*32o7y -*32r -*32s9* -*32O38 -*32O74 -*32z1 +*29 T0 O04 +*29 s4w O13 +*29 O03 +*29 O04 +*29 O04 o0m +*29 O14 +*2A ^U +*2A O06 +*2B DA +*2B O14 +*30 $* K +*30 $z +*30 *02 +*30 *43 +*30 +3 +*30 -0 +*30 -2 +*30 -4 +*30 -9 +*30 C +*30 D3 T8 +*30 R5 +*30 R6 +*30 T1 +*30 Z1 o59 +*30 Z2 +*30 [ +*30 [ f +*30 ^$ +*30 ^3 +*30 ^T +*30 ^g ^j +*30 ^h +*30 c +*30 d K +*30 f +*30 i1Q +*30 i2p +*30 o2y +*30 o82 +*30 p1 +*30 sdD +*30 u +*30 u { +*30 O23 +*30 O26 +*30 O27 o4R +*30 O32 +*30 O41 +*30 z2 +*30 z2 Z1 +*30 z4 +*30 { *35 +*30 { O53 +*31 $$ +*31 $5 O2A +*31 $_ +*31 $b sby +*31 $r +*31 '8 +*31 'A +*31 *20 +*31 *34 +*31 *74 +*31 *91 +*31 +2 +*31 -0 ] +*31 D2 +*31 D4 +*31 L6 Z2 +*31 T3 +*31 Z3 +*31 Z4 +*31 Z5 +*31 ^i +*31 ^m +*31 ^t +*31 f +*31 i1a +*31 i1j +*31 i3& +*31 i3n +*31 i43 +*31 i4d +*31 l +*31 o1u +*31 o32 +*31 o3^ +*31 o3j +*31 q +*31 r +*31 sg' +*31 sns T6 +*31 t k +*31 O02 +*31 O24 +*31 O29 +*31 O32 +*31 z1 c +*31 z3 L2 +*31 z4 +*32 $6 +*32 $g *41 +*32 '9 +*32 *04 +*32 *25 +*32 *34 +*32 *43 *16 +*32 *45 +*32 *67 +*32 +5 +*32 +A z1 +*32 -2 +*32 -8 +*32 D6 +*32 D7 +*32 R5 +*32 T0 +*32 T7 +*32 Z1 +*32 Z1 O18 +*32 Z2 +*32 ^3 c +*32 ^A +*32 ^I +*32 ^s +*32 d +*32 d t +*32 i05 +*32 i1\ *52 +*32 i1u +*32 i4s +*32 i6_ +*32 i7y c +*32 i9n +*32 l +*32 o2c +*32 o3h +*32 o7y +*32 r +*32 s9* +*32 O38 +*32 O74 +*32 z1 *34 -*34$6 -*34$c -*34$n -*34$y -*34*62 -*34*74 -*34+0 -*34+3 -*34+5 -*34D7 -*34K} -*34]$m -*34^M -*34^Z -*34^m^, -*34^p -*34^x -*34i1R$h -*34i2 -1 -*34i3ni1| -*34i5- -*34i5T -*34i6tz1 -*34l -*34o0z -*34o2t -*34o2x -*34o3h -*34o3r -*34o4d -*34p1} -*34q -*34r -*34sd>c -*34sdg -*34sl+ -*34sm_ -*34ur -*34O13stc -*34O51 -*34O52 -*34z3 -*34} +*34 $6 +*34 $c +*34 $n +*34 $y +*34 *62 +*34 *74 +*34 +0 +*34 +3 +*34 +5 +*34 D7 +*34 K } +*34 ] $m +*34 ^M +*34 ^Z +*34 ^m ^, +*34 ^p +*34 ^x +*34 i1R $h +*34 i2 -1 +*34 i3n i1| +*34 i5- +*34 i5T +*34 i6t z1 +*34 l +*34 o0z +*34 o2t +*34 o2x +*34 o3h +*34 o3r +*34 o4d +*34 p1 } +*34 q +*34 r +*34 sd> c +*34 sdg +*34 sl+ +*34 sm_ +*34 u r +*34 O13 stc +*34 O51 +*34 O52 +*34 z3 +*34 } *35 -*35$9 -*35*04 -*35*24 -*35*31 -*35*41 -*35*50+5 -*35*54 -*35*56 -*35+1 -*35+4 -*35D2 -*35L2 -*35L3 -*35R4 -*35Z2 -*35^# -*35^& -*35^< -*35^_ -*35^c -*35^g -*35^h -*35^v$a -*35i3i -*35o0X -*35o2m -*35o3( -*35o5q -*35o6M -*35o7A -*35q -*35r -*35t -*35ti5g -*35O12 -*35O23 -*35O43 +*35 $9 +*35 *04 +*35 *24 +*35 *31 +*35 *41 +*35 *50 +5 +*35 *54 +*35 *56 +*35 +1 +*35 +4 +*35 D2 +*35 L2 +*35 L3 +*35 R4 +*35 Z2 +*35 ^# +*35 ^& +*35 ^< +*35 ^_ +*35 ^c +*35 ^g +*35 ^h +*35 ^v $a +*35 i3i +*35 o0X +*35 o2m +*35 o3( +*35 o5q +*35 o6M +*35 o7A +*35 q +*35 r +*35 t +*35 t i5g +*35 O12 +*35 O23 +*35 O43 *36 -*36$1O48 -*36'6 -*36*13O62 -*36*17 -*36*19 -*36*26 -*36*50 -*36+4o4z -*36+5-0 -*36D3[ -*36D5 -*36R0D3 -*36T9 -*36Z1Z1 -*36Z2*21 -*36[*05 -*36^Bl -*36^m -*36c -*36i1w -*36i5^i8- -*36o0B -*36o3g -*36o50z2 -*36o55 -*36O04 -*36O32 -*36O62 -*36z1L3 -*36{ +*36 $1 O48 +*36 '6 +*36 *13 O62 +*36 *17 +*36 *19 +*36 *26 +*36 *50 +*36 o4z +*36 +5 -0 +*36 D3 [ +*36 D5 +*36 R0 D3 +*36 T9 +*36 Z1 Z1 +*36 Z2 *21 +*36 [ *05 +*36 ^B l +*36 ^m +*36 c +*36 i1w +*36 i5^ i8- +*36 o0B +*36 o3g +*36 o50 z2 +*36 o55 +*36 O04 +*36 O32 +*36 O62 +*36 z1 L3 +*36 { *37 -*37$4 -*37$A -*37$k -*37$z -*37*05 -*37*14 -*37*32 -*37*87 -*37c -*37i5<*30 -*37O12 -*37O13 -*37O25 -*37z5O32 -*37{z2 +*37 $4 +*37 $A +*37 $k +*37 $z +*37 *05 +*37 *14 +*37 *32 +*37 *87 +*37 c +*37 i5< *30 +*37 O12 +*37 O13 +*37 O25 +*37 z5 O32 +*37 { z2 *38 -*38'A -*38@rO32 -*38D0 -*38O23 -*38O26 -*38O57 -*39'A -*39+5 -*39+8O38 -*39D3-5 -*39L3O05 -*39o58 -*39O04 -*39O32 -*3A'8 -*3A-0O05 -*3AO08 -*3AO24 -*3AO36 -*3AO38z5 -*3B'8 -*3BTBO28 -*3Bl -*3BO09i18 -*3BO37 -*40$jO02 -*40$l -*40$s -*40'9 -*40*02 -*40*06 -*40*12 -*40*15 -*40*34 -*40*35z1 -*40*54 -*40*57 -*40*96 -*40D3 -*40D4 -*40D6O41 -*40Z1$h -*40^g -*40c -*40i0b -*40i4C -*40i8j -*40o0B -*40o3n -*40o5m -*40o7y -*40p1 -*40q -*40t -*40O24 -*40O27 -*40O34 -*40O34u -*40O42 -*40O42O61 -*40O45 -*40O75O24 -*40z1 -*40z2D5 -*40}$8 -*40}z2 -*41$) -*41$s -*41$z -*41*16 -*41*32 -*41*47 -*41*86 -*41+0^G -*41-0 -*41D1 -*41Z1*04 -*41^2^k -*41^j -*41^v -*41c] -*41d -*41f -*41i68 -*41k{ -*41o2zu -*41o5t -*41o82 -*41q -*41O14f -*41O21 -*41O32 -*41O34 -*41O37 -*41O47 -*41z2 -*41z3 -*41z3O61 -*41z4'8 -*41}} -*42$0 -*42$g -*42$rZ2 -*42$s -*42*14i0Y -*42*21 -*42*41 -*42*64 -*42*B6 -*42+6 -*42R0 -*42R5 -*42R6 -*42T0 -*42Z1D1 -*42]^g -*42^S -*42^f -*42^g -*42^k -*42^w -*42d -*42dc -*42li5n -*42o4aZ4 -*42r -*42skL -*42t -*42O3A -*42O46 -*42z1 -*42} -*43$" -*43$- -*43$3 -*43$a -*43$e -*43*01} -*43*12 -*43*48 -*43*52 -*43+2 -*43-0 -*43-6 -*43D2 -*43K*35 -*43R3 -*43T6 -*43[{ -*43]*20 -*43^7O18 -*43^8'5 -*43^y*23 -*43i2b -*43i2f -*43k -*43o4l -*43o9p -*43s25 -*43skC -*43suo -*43t-5 -*43t{ -*43O53 -*43z1 -*43z4 +*38 'A +*38 @r O32 +*38 D0 +*38 O23 +*38 O26 +*38 O57 +*39 'A +*39 +5 +*39 +8 O38 +*39 D3 -5 +*39 L3 O05 +*39 o58 +*39 O04 +*39 O32 +*3A '8 +*3A -0 O05 +*3A O08 +*3A O24 +*3A O36 +*3A O38 z5 +*3B '8 +*3B TB O28 +*3B l +*3B O09 i18 +*3B O37 +*40 $j O02 +*40 $l +*40 $s +*40 '9 +*40 *02 +*40 *06 +*40 *12 +*40 *15 +*40 *34 +*40 *35 z1 +*40 *54 +*40 *57 +*40 *96 +*40 D3 +*40 D4 +*40 D6 O41 +*40 Z1 $h +*40 ^g +*40 c +*40 i0b +*40 i4C +*40 i8j +*40 o0B +*40 o3n +*40 o5m +*40 o7y +*40 p1 +*40 q +*40 t +*40 O24 +*40 O27 +*40 O34 +*40 O34 u +*40 O42 +*40 O42 O61 +*40 O45 +*40 O75 O24 +*40 z1 +*40 z2 D5 +*40 } $8 +*40 } z2 +*41 $) +*41 $s +*41 $z +*41 *16 +*41 *32 +*41 *47 +*41 *86 +*41 +0 ^G +*41 -0 +*41 D1 +*41 Z1 *04 +*41 ^2 ^k +*41 ^j +*41 ^v +*41 c ] +*41 d +*41 f +*41 i68 +*41 k { +*41 o2z u +*41 o5t +*41 o82 +*41 q +*41 O14 f +*41 O21 +*41 O32 +*41 O34 +*41 O37 +*41 O47 +*41 z2 +*41 z3 +*41 z3 O61 +*41 z4 '8 +*41 } } +*42 $0 +*42 $g +*42 $r Z2 +*42 $s +*42 *14 i0Y +*42 *21 +*42 *41 +*42 *64 +*42 *B6 +*42 +6 +*42 R0 +*42 R5 +*42 R6 +*42 T0 +*42 Z1 D1 +*42 ] ^g +*42 ^S +*42 ^f +*42 ^g +*42 ^k +*42 ^w +*42 d +*42 d c +*42 l i5n +*42 o4a Z4 +*42 r +*42 skL +*42 t +*42 O3A +*42 O46 +*42 z1 +*42 } +*43 $" +*43 $- +*43 $3 +*43 $a +*43 $e +*43 *01 } +*43 *12 +*43 *48 +*43 *52 +*43 +2 +*43 -0 +*43 -6 +*43 D2 +*43 K *35 +*43 R3 +*43 T6 +*43 [ { +*43 ] *20 +*43 ^7 O18 +*43 ^8 '5 +*43 ^y *23 +*43 i2b +*43 i2f +*43 k +*43 o4l +*43 o9p +*43 s25 +*43 skC +*43 suo +*43 t -5 +*43 t { +*43 O53 +*43 z1 +*43 z4 *45 -*45$1-4 -*45$8 -*45*03 -*45*35 -*45*62 -*45*71 -*45-2 -*45-7 -*45-7^0 -*45D0 -*45R4 -*45Z1 -*45Z2 -*45^1 -*45^p -*45i1,Z2 -*45i8' -*45o0g -*45o0n -*45o2y -*45o39 -*45o3g -*45o4M -*45o4h -*45o69 -*45o6` -*45p1 -*45r -*45s2_ -*45sl8 -*45so9 -*45u -*45O04 -*45O08z4 -*45O32 -*45O52} -*45z1 -*45z2{ -*45{*25 +*45 $1 -4 +*45 $8 +*45 *03 +*45 *35 +*45 *62 +*45 *71 +*45 -2 +*45 -7 +*45 -7 ^0 +*45 D0 +*45 R4 +*45 Z1 +*45 Z2 +*45 ^1 +*45 ^p +*45 i1, Z2 +*45 i8' +*45 o0g +*45 o0n +*45 o2y +*45 o39 +*45 o3g +*45 o4M +*45 o4h +*45 o69 +*45 o6` +*45 p1 +*45 r +*45 s2_ +*45 sl8 +*45 so9 +*45 u +*45 O04 +*45 O08 z4 +*45 O32 +*45 O52 } +*45 z1 +*45 z2 { +*45 { *25 *46 -*46$_D4 -*46$d -*46$v -*46'6 -*46*16 -*46*23 -*46*25 -*46*60 -*46+4 -*46-4 -*46-7 -*46D1 -*46D4 -*46L7 -*46T0 -*46T5 -*46Z1 -*46[ -*46] -*46^P -*46i58 -*46i5L$9 -*46i5] -*46i5g -*46l -*46o2d -*46o54 -*46o7E -*46s6b -*46O05 -*46O24] -*46O34$C -*46{ -*46}'6 +*46 $_ D4 +*46 $d +*46 $v +*46 '6 +*46 *16 +*46 *23 +*46 *25 +*46 *60 +*46 +4 +*46 -4 +*46 -7 +*46 D1 +*46 D4 +*46 L7 +*46 T0 +*46 T5 +*46 Z1 +*46 [ +*46 ] +*46 ^P +*46 i58 +*46 i5L $9 +*46 i5] +*46 i5g +*46 l +*46 o2d +*46 o54 +*46 o7E +*46 s6b +*46 O05 +*46 O24 ] +*46 O34 $C +*46 { +*46 } '6 *47 -*47$t -*47*34 -*47*36 -*47*58 -*47*65 -*47*67 -*47*75 -*47-9 -*47C*81 -*47Co2q -*47D4 -*47L1O06 -*47T4 -*47Z1 -*47Z1O71 -*47o4v -*47z3 +*47 $t +*47 *34 +*47 *36 +*47 *58 +*47 *65 +*47 *67 +*47 *75 +*47 -9 +*47 C *81 +*47 C o2q +*47 D4 +*47 L1 O06 +*47 T4 +*47 Z1 +*47 Z1 O71 +*47 o4v +*47 z3 *48 -*48'6+5 -*48*08 -*48*86 -*48T7 -*48Z1 -*48[ -*48^9 -*48i2nO52 -*48l -*48tD1 -*48O07 -*48O43 -*48O43C -*48z1 +*48 '6 +5 +*48 *08 +*48 *86 +*48 T7 +*48 Z1 +*48 [ +*48 ^9 +*48 i2n O52 +*48 l +*48 t D1 +*48 O07 +*48 O43 +*48 O43 C +*48 z1 *49 -*49$RO29 -*49'9 -*49^, -*49swh -*49O14 -*49O24 -*49O47L4 -*49O53 +*49 $R O29 +*49 '9 +*49 ^, +*49 swh +*49 O14 +*49 O24 +*49 O47 L4 +*49 O53 *4A -*4A*74O65 -*4Bi8/k -*4BO16 -*4BO19 -*4BO63 -*50$0Z1 -*50$e -*50*02 -*50*25^_ -*50*31 -*50*41 -*50+0 -*50+2 -*50+3{ -*50-4 -*50L5 -*50R5 -*50Z1O32 -*50Z4O4B -*50cK -*50i0B -*50o0[ -*50o34 -*50o3j -*50o3l -*50o3t -*50o6L -*50to6Z -*50u -*50O16 -*50O18 -*50O23 -*50O26 -*50O32 -*50O43 -*50O51 -*50O53 -*50O56 -*50z1 -*50{ -*51$D -*51$z -*51*14 -*51*25] -*51*31 -*51*37 -*51*52 -*51*54 -*51+1 -*51-0 -*51-3 -*51C -*51D1*12 -*51D2 -*51K -*51KR6 -*51R1 -*51T6 -*51Z1O53 -*51Z3O23 -*51[ -*51^' -*51^H+7 -*51^o -*51i0d -*51i1g -*51o71D5 -*51rK -*51O32*30 -*51O35 -*51{ -*51{+6 -*52$3 -*52$9 -*52$?*63 -*52$e -*52'6 -*52*24 -*52*53u -*52*70 -*52+1 -*52+6 -*52L0 -*52Z1 -*52Z2 -*52[k -*52^b -*52^p -*52c] -*52d -*52i13^J -*52o3k -*52o5 -*52o5B -*52s3vD1 -*52se0 -*52shl -*52srd] -*52O04 -*52O12 -*52O13p1 -*52O56 -*52O61 -*52z1 -*53$L -*53$N -*53$` -*53$g -*53$y -*53'5saj -*53*12 -*53*12L5 -*53*20 -*53*46 -*53*50 -*53*72z2 -*53+0 -*53+8 -*53-4 -*53-7 -*53@z*35 -*53C -*53D3 -*53L7u -*53R5 -*53R6 -*53T4 -*53T5 -*53[ -*53] -*53^d -*53f -*53i32 -*53o0z -*53o1$ -*53o15 -*53o8o -*53p1 -*53p2 -*53s5s -*53sbm -*53sbn -*53smb -*53sun -*53sur -*53t^m -*53O13 -*53O52T5 -*53O5B -*53OB2 -*53z1 -*54$3 -*54'B -*54*35t -*54*71'5 -*54*74 -*54*86 -*54+0 -*54+7 -*54-4 -*54-8 -*54C -*54D2 -*54D6$n -*54D7 -*54^0 -*54^9{ -*54^Z -*54^b -*54^c'7 -*54c -*54i1L -*54i35$a -*54i6t -*54l -*54o0K -*54o3 -*54o3l -*54o4q -*54o5m -*54o6h -*54o7_ -*54rZ4 -*54svN -*54syn -*54usBN -*54O12 -*54O23 -*54O52@p -*54O64 -*54} +*4A *74 O65 +*4B i8/ k +*4B O16 +*4B O19 +*4B O63 +*50 $0 Z1 +*50 $e +*50 *02 +*50 *25 ^_ +*50 *31 +*50 *41 +*50 +0 +*50 +2 +*50 +3 { +*50 -4 +*50 L5 +*50 R5 +*50 Z1 O32 +*50 Z4 O4B +*50 c K +*50 i0B +*50 o0[ +*50 o34 +*50 o3j +*50 o3l +*50 o3t +*50 o6L +*50 t o6Z +*50 u +*50 O16 +*50 O18 +*50 O23 +*50 O26 +*50 O32 +*50 O43 +*50 O51 +*50 O53 +*50 O56 +*50 z1 +*50 { +*51 $D +*51 $z +*51 *14 +*51 *25 ] +*51 *31 +*51 *37 +*51 *52 +*51 *54 +*51 +1 +*51 -0 +*51 -3 +*51 C +*51 D1 *12 +*51 D2 +*51 K +*51 K R6 +*51 R1 +*51 T6 +*51 Z1 O53 +*51 Z3 O23 +*51 [ +*51 ^' +*51 ^H +7 +*51 ^o +*51 i0d +*51 i1g +*51 o71 D5 +*51 r K +*51 O32 *30 +*51 O35 +*51 { +*51 { +6 +*52 $3 +*52 $9 +*52 $? *63 +*52 $e +*52 '6 +*52 *24 +*52 *53 u +*52 *70 +*52 +1 +*52 +6 +*52 L0 +*52 Z1 +*52 Z2 +*52 [ k +*52 ^b +*52 ^p +*52 c ] +*52 d +*52 i13 ^J +*52 o3k +*52 o5 +*52 o5B +*52 s3v D1 +*52 se0 +*52 shl +*52 srd ] +*52 O04 +*52 O12 +*52 O13 p1 +*52 O56 +*52 O61 +*52 z1 +*53 $L +*53 $N +*53 $` +*53 $g +*53 $y +*53 '5 saj +*53 *12 +*53 *12 L5 +*53 *20 +*53 *46 +*53 *50 +*53 *72 z2 +*53 +0 +*53 +8 +*53 -4 +*53 -7 +*53 @z *35 +*53 C +*53 D3 +*53 L7 u +*53 R5 +*53 R6 +*53 T4 +*53 T5 +*53 [ +*53 ] +*53 ^d +*53 f +*53 i32 +*53 o0z +*53 o1$ +*53 o15 +*53 o8o +*53 p1 +*53 p2 +*53 s5s +*53 sbm +*53 sbn +*53 smb +*53 sun +*53 sur +*53 t ^m +*53 O13 +*53 O52 T5 +*53 O5B +*53 OB2 +*53 z1 +*54 $3 +*54 'B +*54 *35 t +*54 *71 '5 +*54 *74 +*54 *86 +*54 +0 +*54 +7 +*54 -4 +*54 -8 +*54 C +*54 D2 +*54 D6 $n +*54 D7 +*54 ^0 +*54 ^9 { +*54 ^Z +*54 ^b +*54 ^c '7 +*54 c +*54 i1L +*54 i35 $a +*54 i6t +*54 l +*54 o0K +*54 o3 +*54 o3l +*54 o4q +*54 o5m +*54 o6h +*54 o7_ +*54 r Z4 +*54 svN +*54 syn +*54 u sBN +*54 O12 +*54 O23 +*54 O52 @p +*54 O64 +*54 } *56 -*56$1 -*56$3 -*56$4 -*56'7 -*56'A -*56*12z3 -*56*13u -*56*30 -*56*76 -*56*81O03 -*56*85 -*56+4 -*56+5 -*56-4 -*56-6 -*56Cz3 -*56D0 -*56L0L5 -*56R4 -*56Z2 -*56^a -*56^l -*56l -*56o2l -*56o5d -*56o5j -*56o69 -*56o6b -*56o6q -*56r -*56s40 -*56se2 -*56sgo -*56O0Ap3 -*56}-6 +*56 $1 +*56 $3 +*56 $4 +*56 '7 +*56 'A +*56 *12 z3 +*56 *13 u +*56 *30 +*56 *76 +*56 *81 O03 +*56 *85 +*56 +4 +*56 +5 +*56 -4 +*56 -6 +*56 C z3 +*56 D0 +*56 L0 L5 +*56 R4 +*56 Z2 +*56 ^a +*56 ^l +*56 l +*56 o2l +*56 o5d +*56 o5j +*56 o69 +*56 o6b +*56 o6q +*56 r +*56 s40 +*56 se2 +*56 sgo +*56 O0A p3 +*56 } -6 *57 -*57$% -*57$0 -*57$9 -*57$a -*57$n -*57$oO56 -*57*06 -*57*25 -*57*36] -*57*46 -*57D8 -*57T5D3 -*57Z1 -*57Z2o4( -*57c -*57cD6 -*57i3s -*57i8b -*57i9mO18 -*57o0C -*57o5R -*57o7a -*57o7s -*57p1 -*57O06 -*57O16 -*57O32 -*57} +*57 $% +*57 $0 +*57 $9 +*57 $a +*57 $n +*57 $o O56 +*57 *06 +*57 *25 +*57 *36 ] +*57 *46 +*57 D8 +*57 T5 D3 +*57 Z1 +*57 Z2 o4( +*57 c +*57 c D6 +*57 i3s +*57 i8b +*57 i9m O18 +*57 o0C +*57 o5R +*57 o7a +*57 o7s +*57 p1 +*57 O06 +*57 O16 +*57 O32 +*57 } *58 -*58'8 -*58*76 -*58D4 -*58D5s13 -*58D7 -*58]{ -*58l -*58o5M -*58O06 -*58O25Z1 -*58O91 +*58 '8 +*58 *76 +*58 D4 +*58 D5 s13 +*58 D7 +*58 ] { +*58 l +*58 o5M +*58 O06 +*58 O25 Z1 +*58 O91 *59 -*59*56^_ -*59C^$ -*59D2 -*59Z1O53 -*59i6Vk -*59o0!} -*59o90 -*59O25 -*59O27 -*59O42 +*59 *56 ^_ +*59 C ^$ +*59 D2 +*59 Z1 O53 +*59 i6V k +*59 o0! } +*59 o90 +*59 O25 +*59 O27 +*59 O42 *5A -*5AO06 -*5AO08D2 -*5AO36 -*5AO45Z2 -*5AO53@M -*5AO73 -*60$3 -*60$s -*60*02 -*60*07 -*60*54 -*60-1 -*60-5 -*60-8 -*60C -*60Co2k -*60D0 -*60D1 -*60D6 -*60^A -*60^S -*60c -*60kT5 -*60o3R -*60o6l -*60O03 -*60O34u -*60O35 -*60O51 -*60O54 -*60z2O65 -*60}D4 -*61$[o8e -*61'4 -*61'5 -*61*21 -*61-1 -*61-4 -*61@c$] -*61D1 -*61D6 -*61T0 -*61T2 -*61^3*43 -*61^R -*61^l -*61i6n -*61o6* -*61o6O -*61o6g -*61o7u -*61sd{O52 -*61O03k -*61O12 -*61O21*13 -*61O54 -*61O61+6 -*62*46o18 -*62*52 -*62*73 -*62+2 -*62-0 -*62-2 -*62T9O35 -*62^Lz1 -*62i0z -*62i8q -*62l -*62o12 -*62o2k -*62o2s -*62o61} -*62O01r -*62O02 -*62O03 -*62O32 -*62O38 -*62O43D4 -*62O45 -*62O46 -*62O51 -*62z3 -*63$j -*63+1 -*63+7 -*63D3 -*63D7 -*63L6O62 -*63T2 -*63Z1 -*63Z3 -*63]'5 -*63^Gi0b -*63csv# -*63i2| -*63i5"*49 -*63o1l -*63o3q -*63o4h -*63o5t -*63o6^ -*63slp -*63u -*63uo2` -*63O53 -*63} -*64$x -*64'5 -*64*20 -*64*34 -*64*65[ -*64D0+1 -*64K -*64R3 -*64^cO26 -*64^j -*64^r -*64o3`$P -*64o3i -*64o66 -*64O43@p -*64O53 -*64O61 -*64O72 -*64O73 -*65$! -*65$n -*65'9 -*65*35 -*65*51 -*65*73 -*65*8A -*65+3 -*65-5 -*65D3 -*65R3 -*65Z3 -*65[{ -*65^+ -*65^S -*65^z -*65i4h -*65i66 -*65i7w -*65l$* -*65o0r -*65o2t*24 -*65o67 -*65o6` -*65O14Z1 -*65O42 -*65O65 +*5A O06 +O08 D2 +*5A O36 +*5A O45 Z2 +*5A O53 @M +*5A O73 +*60 $3 +*60 $s +*60 *02 +*60 *07 +*60 *54 +*60 -1 +*60 -5 +*60 -8 +*60 C +*60 C o2k +*60 D0 +*60 D1 +*60 D6 +*60 ^A +*60 ^S +*60 c +*60 k T5 +*60 o3R +*60 o6l +*60 O03 +*60 O34 u +*60 O35 +*60 O51 +*60 O54 +*60 z2 O65 +*60 } D4 +*61 $[ o8e +*61 '4 +*61 '5 +*61 *21 +*61 -1 +*61 -4 +*61 @c $] +*61 D1 +*61 D6 +*61 T0 +*61 T2 +*61 ^3 *43 +*61 ^R +*61 ^l +*61 i6n +*61 o6* +*61 o6O +*61 o6g +*61 o7u +*61 sd{ O52 +*61 O03 k +*61 O12 +*61 O21 *13 +*61 O54 +*61 O61 +6 +*62 *46 o18 +*62 *52 +*62 *73 +*62 +2 +*62 -0 +*62 -2 +*62 T9 O35 +*62 ^L z1 +*62 i0z +*62 i8q +*62 l +*62 o12 +*62 o2k +*62 o2s +*62 o61 } +*62 O01 r +*62 O02 +*62 O03 +*62 O32 +*62 O38 +*62 O43 D4 +*62 O45 +*62 O46 +*62 O51 +*62 z3 +*63 $j +*63 +1 +*63 +7 +*63 D3 +*63 D7 +*63 L6 O62 +*63 T2 +*63 Z1 +*63 Z3 +*63 ] '5 +*63 ^G i0b +*63 c sv# +*63 i2| +*63 i5" *49 +*63 o1l +*63 o3q +*63 o4h +*63 o5t +*63 o6^ +*63 slp +*63 u +*63 u o2` +*63 O53 +*63 } +*64 $x +*64 '5 +*64 *20 +*64 *34 +*64 *65 [ +*64 D0 +1 +*64 K +*64 R3 +*64 ^c O26 +*64 ^j +*64 ^r +*64 o3` $P +*64 o3i +*64 o66 +*64 O43 @p +*64 O53 +*64 O61 +*64 O72 +*64 O73 +*65 $! +*65 $n +*65 '9 +*65 *35 +*65 *51 +*65 *73 +*65 *8A +*65 +3 +*65 -5 +*65 D3 +*65 R3 +*65 Z3 +*65 [ { +*65 ^+ +*65 ^S +*65 ^z +*65 i4h +*65 i66 +*65 i7w +*65 l $* +*65 o0r +*65 o2t *24 +*65 o67 +*65 o6` +*65 O14 Z1 +*65 O42 +*65 O65 *67 -*67$1 -*67$e -*67'7scu -*67*56 -*67*86 -*67-5 -*67@b -*67D9 -*67K -*67R4 -*67T3 -*67Z2 -*67^V -*67c -*67i20i6v -*67i65 -*67i6; -*67k -*67o4Z -*67o6- -*67o75 -*67o7r -*67r -*67s- -*67s1/ +*67 $1 +*67 $e +*67 '7 scu +*67 *56 +*67 *86 +*67 -5 +*67 @b +*67 D9 +*67 K +*67 R4 +*67 T3 +*67 Z2 +*67 ^V +*67 c +*67 i20 i6v +*67 i65 +*67 i6; +*67 k +*67 o4Z +*67 o6- +*67 o75 +*67 o7r +*67 r +*67 s- +*67 s1/ *68 -*68*20 -*68*B3*85 -*68-6 -*68D6 -*68Z1 -*68o0k -*68o6r -*68q -*68O42 -*68O43^j -*68O52{ +*68 *20 +*68 *B3 *85 +*68 -6 +*68 D6 +*68 Z1 +*68 o0k +*68 o6r +*68 q +*68 O42 +*68 O43 ^j +*68 O52 { *69 -*69'8 -*69'A -*69o67 -*69o95 -*69O92 -*6A$GO18 -*6AD7 -*6As70O34 -*6AO37 -*6AO94 -*6BO16 -*6BO84 -*70$"^! -*70$2 -*70'5 -*70*05 -*70*2A -*70+9O56 -*70T1L0 -*70^Q -*70i4g -*70t -*70O01 -*70O05o28 -*70O52*41 -*70O53 -*70O72 -*70z1 -*71'7 -*71'9 -*71*29 -*71*62 -*71-7 -*71Cl -*71D2r -*71D6 -*71[ -*71c -*71cO38 -*71i7+ -*71o4= -*71o68 -*71O02 -*71O03 -*71O04 -*71O13 -*71O35 -*71O54Z3 -*72$q -*72'4 -*72'6 -*72-2 -*72-4 -*72D7 -*72i3r -*72i7sz2 -*72o3w -*72o7r -*72o8h -*72s32 -*72O03 -*72O23 -*72O28+3 -*72O39 -*72O53 -*72O59 -*72O73 -*73$_ -*73$g -*73$m -*73*02o6k -*73*72C -*73D1 -*73L5 -*73[ -*73^s -*73^z -*73o0d -*73o3m -*73o5zO03 -*73r -*73O04 -*73O21 -*73O31 -*73O38^y -*73O62 -*73O74 -*73O7A -*73O96 -*74$k -*74+4 -*74+5 -*74-3 -*74D1 -*74L5 -*74Z2 -*74Z3 -*74i57 -*74i5_ -*74i5r -*74k -*74k$8 -*74o5 -*74o85 -*74o9- -*74s6a -*74sds -*74uO72 -*74O31 -*74O34 -*74O54 -*74O56 -*74O64 -*74O6A -*74O6B -*75$5 -*75$m -*75@?'7 -*75D1 -*75D4 -*75D6 -*75T5 -*75[ -*75i3|^W -*75i6e -*75o0J -*75o1h -*75o6e -*75o7R -*75o87 -*75sGwO41 -*75si^ -*75t -*75u*76 -*75O47Z1 -*75O53R5 -*75{ -*76$5 -*76$h -*76$o -*76'8 -*76'B -*76*31 -*76*34 -*76*36 -*76*47 -*76+5 -*76+6 -*76+6O42 -*76+7 -*76+8 -*76-9 -*76]sti -*76^2 -*76d -*76i44 -*76i5 -*76i6r -*76i7e -*76i7u -*76l -*76o2r -*76o5t -*76o6F -*76o6a -*76o6g -*76o7! -*76s17 -*76s51 -*76scv -*76O1Ad -*76O21 -*76O41 -*76O42 -*76O52 -*76O63Z4 -*76O72$t -*76O74 -*76z1 -*76} +*69 '8 +*69 'A +*69 o67 +*69 o95 +*69 O92 +*6A $G O18 +*6A D7 +*6A s70 O34 +*6A O37 +*6A O94 +*6B O16 +*6B O84 +*70 $" ^! +*70 $2 +*70 '5 +*70 *05 +*70 *2A +*70 +9 O56 +*70 T1 L0 +*70 ^Q +*70 i4g +*70 t +*70 O01 +O05 o28 +*70 O52 *41 +*70 O53 +*70 O72 +*70 z1 +*71 '7 +*71 '9 +*71 *29 +*71 *62 +*71 -7 +*71 l +*71 D2 r +*71 D6 +*71 [ +*71 c +*71 c O38 +*71 i7+ +*71 o4= +*71 o68 +*71 O02 +*71 O03 +*71 O04 +*71 O13 +*71 O35 +*71 O54 Z3 +*72 $q +*72 '4 +*72 '6 +*72 -2 +*72 -4 +*72 D7 +*72 i3r +*72 i7s z2 +*72 o3w +*72 o7r +*72 o8h +*72 s32 +*72 O03 +*72 O23 +*72 O28 +3 +*72 O39 +*72 O53 +*72 O59 +*72 O73 +*73 $_ +*73 $g +*73 $m +*73 *02 o6k +*73 *72 C +*73 D1 +*73 L5 +*73 [ +*73 ^s +*73 ^z +*73 o0d +*73 o3m +*73 o5z O03 +*73 r +*73 O04 +*73 O21 +*73 O31 +*73 O38 ^y +*73 O62 +*73 O74 +*73 O7A +*73 O96 +*74 $k +*74 +4 +*74 +5 +*74 -3 +*74 D1 +*74 L5 +*74 Z2 +*74 Z3 +*74 i57 +*74 i5_ +*74 i5r +*74 k +*74 k $8 +*74 o5 +*74 o85 +*74 o9- +*74 s6a +*74 sds +*74 u O72 +*74 O31 +*74 O34 +*74 O54 +*74 O56 +*74 O64 +*74 O6A +*74 O6B +*75 $5 +*75 $m +*75 @? '7 +*75 D1 +*75 D4 +*75 D6 +*75 T5 +*75 [ +*75 i3| ^W +*75 i6e +*75 o0J +*75 o1h +*75 o6e +*75 o7R +*75 o87 +*75 sGw O41 +*75 si^ +*75 t +*75 u *76 +*75 O47 Z1 +*75 O53 R5 +*75 { +*76 $5 +*76 $h +*76 $o +*76 '8 +*76 'B +*76 *31 +*76 *34 +*76 *36 +*76 *47 +*76 +5 +*76 +6 +*76 +6 O42 +*76 +7 +*76 +8 +*76 -9 +*76 ] sti +*76 ^2 +*76 d +*76 i44 +*76 i5 +*76 i6r +*76 i7e +*76 i7u +*76 l +*76 o2r +*76 o5t +*76 o6F +*76 o6a +*76 o6g +*76 o7! +*76 s17 +*76 s51 +*76 scv +*76 O1A d +*76 O21 +*76 O41 +*76 O42 +*76 O52 +*76 O63 Z4 +*76 O72 $t +*76 O74 +*76 z1 +*76 } *78 -*78$6 -*78$9 -*78$a -*78$w -*78'9 -*78*31 -*78*62 -*78+6 -*78-6 -*78-A -*78T3 -*78Z1 -*78^n -*78i6k -*78o4! -*78s71 -*78O31 -*78O53 -*78O62 +*78 $6 +*78 $9 +*78 $a +*78 $w +*78 '9 +*78 *31 +*78 *62 +*78 +6 +*78 -6 +*78 -A +*78 T3 +*78 Z1 +*78 ^n +*78 i6k +*78 o4! +*78 s71 +*78 O31 +*78 O53 +*78 O62 *79 -*79'A -*79*95 -*79-8 -*79-9 -*79i9n -*79O36+7 -*79O81 +*79 'A +*79 *95 +*79 -8 +*79 -9 +*79 i9n +*79 O36 +7 +*79 O81 *7A -*7A'A -*7AD4'5 -*7AO53 -*7AO62 -*7AO64 -*7AO92 -*7BO17 -*7BO27 -*7BO64 -*80'6 -*80*38 -*80Z4O47 -*80o79 -*80O04 -*80O28D3 -*80O31 -*80O36 -*80O45l -*81$f -*81'8 -*81+8 -*81T6o8$ -*81t'7 -*81tO27 -*82$:*41 -*82'A -*82T5 -*82T8O38 -*82i3l -*82l -*82o84 -*82O06 -*82O39 -*82O45 -*82O72 -*82O81 -*83'5 -*83*47 -*83+3 -*83D5 -*83Z1O54 -*83i54 -*83o1} -*83O04 -*83O54 -*83O59 -*83O64-7 -*83O81 -*84'6 -*84D8 -*84^s'8 -*84i6c -*84o84 -*84u -*84O06 -*84O23 -*84O53 -*84O5A -*85'6 -*85'7 -*85*63 -*85+1D8 -*85+5 -*85D8 -*85Z1 -*85^"} -*85i7e -*85O23 -*85O42 -*86$3 -*86$r -*86'8 -*86*50 -*86*70O64 -*86*95 -*86+7 -*86D3 -*86R0 -*86o0]i3x -*86o30 -*86o5 -*86o7j -*86o8s -*86sr5 -*86O14 -*86O34 -*86O41 -*86O57-8 -*87$1 -*87*36 -*87+8 -*87c -*87i88 -*87o0p -*87o76 -*87o7z -*87o81 -*87o8A -*87s81 -*87sti -*87O26t -*87O72^x -*87{t +*7A 'A +D4 '5 +*7A O53 +*7A O62 +*7A O64 +*7A O92 +*7B O17 +*7B O27 +*7B O64 +*80 '6 +*80 *38 +*80 Z4 O47 +*80 o79 +*80 O04 +*80 O28 D3 +*80 O31 +*80 O36 +*80 O45 l +*81 $f +*81 '8 +*81 +8 +*81 T6 o8$ +*81 t '7 +*81 t O27 +*82 $: *41 +*82 'A +*82 T5 +*82 T8 O38 +*82 i3l +*82 l +*82 o84 +*82 O06 +*82 O39 +*82 O45 +*82 O72 +*82 O81 +*83 '5 +*83 *47 +*83 +3 +*83 D5 +*83 Z1 O54 +*83 i54 +*83 o1} +*83 O04 +*83 O54 +*83 O59 +*83 O64 -7 +*83 O81 +*84 '6 +*84 D8 +*84 ^s '8 +*84 i6c +*84 o84 +*84 u +*84 O06 +*84 O23 +*84 O53 +*84 O5A +*85 '6 +*85 '7 +*85 *63 +*85 +1 D8 +*85 +5 +*85 D8 +*85 Z1 +*85 ^" } +*85 i7e +*85 O23 +*85 O42 +*86 $3 +*86 $r +*86 '8 +*86 *50 +*86 *70 O64 +*86 *95 +*86 +7 +*86 D3 +*86 R0 +*86 o0] i3x +*86 o30 +*86 o5 +*86 o7j +*86 o8s +*86 sr5 +*86 O14 +*86 O34 +*86 O41 +*86 O57 -8 +*87 $1 +*87 *36 +*87 +8 +*87 c +*87 i88 +*87 o0p +*87 o76 +*87 o7z +*87 o81 +*87 o8A +*87 s81 +*87 sti +*87 O26 t +*87 O72 ^x +*87 { t *89 -*89'5$g -*89+8 -*89-7 -*89D5 -*89Z1 -*89[ -*89^q -*89o7p -*89O18 -*89O46'9 -*89O63O04 -*89} +'5 $g +*89 +8 +*89 -7 +*89 D5 +*89 Z1 +*89 [ +*89 ^q +*89 o7p +*89 O18 +*89 O46 '9 +*89 O63 O04 +*89 } *8A -*8AD8 -*8AoB3 -*8As6VO54 -*8At -*8AO38d -*8B*BA -*8Bur -*8BO38 -*8BO64 -*90L0 -*90i1t*14 -*90o9D -*90O1A -*90O26 -*91*37 -*91R3 -*91R8 -*91o1a -*91oA7 -*91O43 -*91O67 -*92$g'5 -*92'9 -*92t -*92O18 -*92O46 -*92O56 -*92O57 -*92O58 -*93'9 -*93cO56 -*93O07 -*93O21 -*93O48 -*94'8 -*94*89^T -*94o0t -*94uO56 -*94O06 -*94O34 -*94O61 -*94O73 -*94O85Z1 -*95*27 -*95*5A -*95*87 -*95o93 -*95uD8 -*95O19u -*95O76 -*96D7 -*96O02 -*96O15 -*96O52 -*97$q -*97*21 -*97*32O34 -*97D1 -*97c -*97i1FO62 -*97o93 -*97o95 -*97syi -*97u -*97O07 -*97O36 -*98$eO52 -*98'9 -*98*85 -*98+0 -*98+1 -*98+9 -*98D9*32 -*98^1 -*98o7 -*98o8_ -*98O71 -*9A$3 -*9A$mO83 -*9A*89 -*9Ao9J -*9As1c -*9AO46saC -*9AO73 -*9B*68 -*9BL2L3 -*9B^gO2A -*9BO62 -*A0$:DA -*A0'6 -*A0*5AO46 -*A0-7'5 -*A0O4B -*A0O56 -*A0O69O5A -*A0{ -*A1'6 -*A1D1 -*A1RA -*A1O07 -*A1O16 -*A1O59t -*A1O83 +*8A D8 +*8A oB3 +*8A s6V O54 +*8A t +*8A O38 d +*8B *BA +*8B u r +*8B O38 +*8B O64 +*90 L0 +*90 i1t *14 +*90 o9D +*90 O1A +*90 O26 +*91 *37 +*91 R3 +*91 R8 +*91 o1a +*91 oA7 +*91 O43 +*91 O67 +*92 $g '5 +*92 '9 +*92 t +*92 O18 +*92 O46 +*92 O56 +*92 O57 +*92 O58 +*93 '9 +*93 c O56 +*93 O07 +*93 O21 +*93 O48 +*94 '8 +*94 *89 ^T +*94 o0t +*94 u O56 +*94 O06 +*94 O34 +*94 O61 +*94 O73 +*94 O85 Z1 +*95 *27 +*95 *5A +*95 *87 +*95 o93 +*95 u D8 +*95 O19 u +*95 O76 +*96 D7 +*96 O02 +*96 O15 +*96 O52 +*97 $q +*97 *21 +*97 *32 O34 +*97 D1 +*97 c +*97 i1F O62 +*97 o93 +*97 o95 +*97 syi +*97 u +*97 O07 +*97 O36 +*98 $e O52 +O81 '9 +*98 *85 +*98 +0 +*98 +1 +*98 +9 +*98 D9 *32 +*98 ^1 +*98 o7 +*98 o8_ +*98 O71 +*9A $3 +$m O83 +*9A *89 +*9A o9J +*9A s1c +*9A O46 saC +*9A O73 +*9B *68 +*9B L2 L3 +*9B ^g O2A +*9B O62 +*A0 $: DA +*A0 '6 +*A0 *5A O46 +*A0 '5 +*A0 O4B +*A0 O56 +*A0 O69 O5A +*A0 { +*A1 '6 +*A1 D1 +*A1 RA +*A1 O07 +*A1 O16 +*A1 O59 t +*A1 O83 *A2 -*A2'8 -*A2O38z2 -*A2O49 -*A2O76 -*A3'7 -*A3i9YO52 -*A3O06 -*A3O75 -*A3O93 -*A4'9 -*A4'A-4 -*A4R8 -*A4O05 -*A4O86 -*A5*B7'8 -*A5o2n -*A5O3A$I -*A5O76 -*A6'7 -*A6*A9 -*A6l -*A6O26 -*A6O42 -*A7'8 -*A7[ -*A7^C -*A8[ -*A8l -*A8oAe -*A8s0x -*A8O35 +*A2 '8 +*A2 O38 z2 +*A2 O49 +*A2 O76 +*A3 '7 +*A3 i9Y O52 +*A3 O06 +*A3 O75 +*A3 O93 +*A4 '9 +*A4 'A -4 +*A4 R8 +*A4 O05 +*A4 O86 +*A5 *B7 '8 +*A5 o2n +*A5 O3A $I +*A5 O76 +*A6 '7 +*A6 *A9 +*A6 l +*A6 O26 +*A6 O42 +*A7 '8 +*A7 [ +*A7 ^C +*A8 [ +*A8 l +*A8 oAe +*A8 s0x +*A8 O35 *A9 -*A9'AZ2 -*A9o9n -*A9oA2 -*A9s05 -*A9O52 +*A9 'A Z2 +*A9 o9n +*A9 oA2 +*A9 s05 +*A9 O52 *AB -*ABT7'A -*ABO68+6 -*B0$3'6 -*B0'8 -*B1'6$R -*B1O03 -*B1O45 -*B2'7 -*B2'8 -*B4'7 -*B5o8HR8 -*B5O76 -*B5OA1 -*B6'7[ -*B6^lO69 +T7 'A +*AB O68 +6 +*B0 $3 '6 +*B0 '8 +*B1 '6 $R +*B1 O03 +*B1 O45 +*B2 '7 +*B2 '8 +*B4 '7 +*B5 o8H R8 +*B5 O76 +*B5 OA1 +*B6 '7 [ +*B6 ^l O69 *B7 -*B7'8 -*B7O85 -*B8*A9 -*B8f'A -*B9'A -*B9*30i4l -*B9o2o -*B9s29 -*B9O65 -*BAD9 -*BAc -*BAiA_ -*BAO02 -*BAO83 +*B7 '8 +*B7 O85 +*B8 *A9 +*B8 f 'A +*B9 'A +*B9 *30 i4l +*B9 o2o +*B9 s29 +*B9 O65 +*BA D9 +*BA c +*BA iA_ +*BA O02 +*BA O83 +0 -+0$! -+0$$ -+0$1o2k -+0$2 -+0$= -+0$C -+0$V -+0$` -+0$d -+0$i -+0$j -+0$l -+0$s -+0'2 -+0'5 -+0'5k -+0'6 -+0'7 -+0'B -+0*05 -+0*08 -+0*18 -+0*20 -+0*31 -+0*32 -+0*32} -+0*37 -+0*58 -+0*86 -+0+0 -+0+0+0 -+0+0+0+0 -+0+1 -+0+1+2 -+0+1+2+3 -+0+3 -+0+6 -+0-1 -+0-3 -+0@t -+0@z -+0C -+0D2 -+0D3 -+0D4 -+0D8 -+0L4 -+0L5t -+0L7 -+0R1 -+0R4 -+0R6 -+0T2 -+0Z1 -+0Z2 -+0Z5@j -+0^$ -+0^% -+0^/ -+0^1 -+0^3 -+0^9 -+0^B -+0^L -+0^N -+0^a -+0^g -+0^i -+0^p -+0^r -+0f -+0i0z -+0i1l -+0i2j -+0i4z -+0i5t -+0i6+ -+0i64O3A -+0i6J -+0i6v -+0l -+0o1i -+0o2q -+0o33 -+0o3v -+0o44 -+0o4i -+0o4o -+0o5P -+0o5t -+0o6& -+0o64 -+0o7n -+0o83 -+0o8m -+0p1 -+0p2'6 -+0q -+0qo3R -+0s1y+1 -+0s23 -+0s4k -+0s7S -+0sc. -+0ssW -+0t -+0O12 -+0O12R8 -+0O13 -+0O24 -+0O25 -+0O25D3 -+0O38Z4 -+0O42 -+0O51@m -+0O52 -+0O53O73 -+0O56 -+0O72 -+0O82 -+0O92 -+0OA1 -+0OB3O19 -+0z1 -+0z2 -+0z3 -+0z4 -+0z5 -+0z5@x -+0{Z3 -+0} -+0}o6Q ++0 $! ++0 $$ ++0 $1 o2k ++0 $2 ++0 $= ++0 $C ++0 $V ++0 $` ++0 $d ++0 $i ++0 $j ++0 $l ++0 $s ++0 '2 ++0 '5 ++0 '5 k ++0 '6 ++0 '7 ++0 'B ++0 *05 ++0 *08 ++0 *18 ++0 *20 ++0 *31 ++0 *32 ++0 *32 } ++0 *37 ++0 *58 ++0 *86 ++0 +0 ++0 +0 +0 ++0 +0 +0 +0 ++0 +1 ++0 +1 +2 ++0 +1 +2 +3 ++0 +3 ++0 +6 ++0 -1 ++0 -3 ++0 @t ++0 @z ++0 C ++0 D2 ++0 D3 ++0 D4 ++0 D8 ++0 L4 ++0 L5 t ++0 L7 ++0 R1 ++0 R4 ++0 R6 ++0 T2 ++0 Z1 ++0 Z2 ++0 Z5 @j ++0 ^$ ++0 ^% ++0 ^/ ++0 ^1 ++0 ^3 ++0 ^9 ++0 ^B ++0 ^L ++0 ^N ++0 ^a ++0 ^g ++0 ^i ++0 ^p ++0 ^r ++0 f ++0 i0z ++0 i1l ++0 i2j ++0 i4z ++0 i5t ++0 i6+ ++0 i64 O3A ++0 i6J ++0 i6v ++0 l ++0 o1i ++0 o2q ++0 o33 ++0 o3v ++0 o44 ++0 o4i ++0 o4o ++0 o5P ++0 o5t ++0 o6& ++0 o64 ++0 o7n ++0 o83 ++0 o8m ++0 p1 ++0 p2 '6 ++0 q ++0 q o3R ++0 s1y +1 ++0 s23 ++0 s4k ++0 s7S ++0 sc. ++0 ssW ++0 t ++0 O12 ++0 O12 R8 ++0 O13 ++0 O24 ++0 O25 ++0 O25 D3 ++0 O38 Z4 ++0 O42 ++0 O51 @m ++0 O52 ++0 O53 O73 ++0 O56 ++0 O72 ++0 O82 ++0 O92 ++0 OA1 ++0 OB3 O19 ++0 z1 ++0 z2 ++0 z3 ++0 z4 ++0 z5 ++0 z5 @x ++0 { Z3 ++0 } ++0 } o6Q +1 -+1$' -+1$0 -+1$5 -+1$f -+1$h -+1$i -+1$j -+1$n -+1$p -+1$s -+1$t -+1'2 -+1'5 -+1'7 -+1'B -+1*04slk -+1*06 -+1*14 -+1*91 -+1+1 -+1+1+1 -+1+1+1+1 -+1+2 -+1+2+3 -+1+2+3+4 -+1+3 -+1-4 -+1-5 -+1-8 -+1@B -+1@a -+1CO14 -+1D4-6 -+1D4d -+1D7 -+1D9 -+1KZ2 -+1L2O29 -+1L7 -+1R0 -+1R1 -+1R4 -+1T2 -+1Z1 -+1Z1D3 -+1Z1O01 -+1Z2 -+1Z4 -+1[ -+1^= -+1^DsG! -+1^J -+1^b -+1^e -+1^l -+1^n -+1^z -+1c -+1csrD -+1du -+1f -+1i0h -+1i0i -+1i18 -+1i1l -+1i1u -+1i22 -+1i24 -+1i2g -+1i2xZ1 -+1i3}$< -+1i4X -+1i4a -+1i76 -+1l -+1li5a -+1o0& -+1o0' -+1o0A -+1o0a -+1o0b -+1o0f -+1o0r -+1o25 -+1o2b -+1o2g -+1o3o -+1o8A -+1o8wO12 -+1p1 -+1s.qo2w -+1s0Q -+1sbq -+1sel -+1skw -+1smd -+1srg -+1szl -+1t -+1O23 -+1O24 -+1O28 -+1O42-3 -+1O45 -+1O52 -+1O62 -+1O63 -+1O67[ -+1O92 -+1z1 -+1z2 -+1z3 -+1z4o69 -+1z5O82 -+1{ -+1} ++1 $' ++1 $0 ++1 $5 ++1 $f ++1 $h ++1 $i ++1 $j ++1 $n ++1 $p ++1 $s ++1 $t ++1 '2 ++1 '5 ++1 '7 ++1 'B ++1 *04 slk ++1 *06 ++1 *14 ++1 *91 ++1 +1 ++1 +1 +1 ++1 +1 +1 +1 ++1 +2 ++1 +2 +3 ++1 +2 +3 +4 ++1 +3 ++1 -4 ++1 -5 ++1 -8 ++1 @B ++1 @a ++1 C O14 ++1 D4 -6 ++1 D4 d ++1 D7 ++1 D9 ++1 K Z2 ++1 L2 O29 ++1 L7 ++1 R0 ++1 R1 ++1 R4 ++1 T2 ++1 Z1 ++1 Z1 D3 ++1 Z1 O01 ++1 Z2 ++1 Z4 ++1 [ ++1 ^= ++1 ^D sG! ++1 ^J ++1 ^b ++1 ^e ++1 ^l ++1 ^n ++1 ^z ++1 c ++1 c srD ++1 d u ++1 f ++1 i0h ++1 i0i ++1 i18 ++1 i1l ++1 i1u ++1 i22 ++1 i24 ++1 i2g ++1 i2x Z1 ++1 i3} $< ++1 i4X ++1 i4a ++1 i76 ++1 l ++1 l i5a ++1 o0& ++1 o0' ++1 o0A ++1 o0a ++1 o0b ++1 o0f ++1 o0r ++1 o25 ++1 o2b ++1 o2g ++1 o3o ++1 o8A ++1 o8w O12 ++1 p1 ++1 s.q o2w ++1 s0Q ++1 sbq ++1 sel ++1 skw ++1 smd ++1 srg ++1 szl ++1 t ++1 O23 ++1 O24 ++1 O28 ++1 O42 -3 ++1 O45 ++1 O52 ++1 O62 ++1 O63 ++1 O67 [ ++1 O92 ++1 z1 ++1 z2 ++1 z3 ++1 z4 o69 ++1 z5 O82 ++1 { ++1 } +2 -+2$ -+2$+ -+2$6 -+2$7T7 -+2$Mt -+2$W -+2$f -+2$iq -+2$it -+2$w -+2$y^d -+2'4 -+2*02 -+2*30 -+2*32 -+2*62O5B -+2*75 -+2+0 -+2+2 -+2+2+2 -+2+2+2+2 -+2+3 -+2+3+4 -+2+3+4+5 -+2+5 -+2@0 -+2D1 -+2D3 -+2D5 -+2D5*79 -+2L2 -+2L5 -+2L6u -+2T1d -+2T5z3 -+2Z2 -+2Z3 -+2Z3i22 -+2^# -+2^8 -+2^h -+2^u -+2c -+2d -+2f -+2i2K -+2i2d -+2i4?*53 -+2iA5O38 -+2l -+2l$% -+2li0D -+2o0* -+2o0z -+2o1b -+2o4A -+2o71 -+2oAs -+2p1O23 -+2q -+2sCy -+2sGq -+2sgb -+2sui -+2t*57 -+2up1 -+2O02 -+2O39t -+2O41 -+2O57 -+2z1 -+2z2 -+2z3*08 -+2z3*57 -+2z3D4 -+2z3t -+2z4 -+2z5O81 ++2 $ ++2 $+ ++2 $6 ++2 $7 T7 ++2 $M t ++2 $W ++2 $f ++2 $i q ++2 $i t ++2 $w ++2 $y ^d ++2 '4 ++2 *02 ++2 *30 ++2 *32 ++2 *62 O5B ++2 *75 ++2 +0 ++2 +2 ++2 +2 +2 ++2 +2 +2 +2 ++2 +3 ++2 +3 +4 ++2 +3 +4 +5 ++2 +5 ++2 @0 ++2 D1 ++2 D3 ++2 D5 ++2 D5 *79 ++2 L2 ++2 L5 ++2 L6 u ++2 T1 d ++2 T5 z3 ++2 Z2 ++2 Z3 ++2 Z3 i22 ++2 ^# ++2 ^8 ++2 ^h ++2 ^u ++2 c ++2 d ++2 f ++2 i2K ++2 i2d ++2 i4? *53 ++2 iA5 O38 ++2 l ++2 l $% ++2 l i0D ++2 o0* ++2 o0z ++2 o1b ++2 o4A ++2 o71 ++2 oAs ++2 p1 O23 ++2 q ++2 sCy ++2 sGq ++2 sgb ++2 sui ++2 t *57 ++2 u p1 ++2 O02 ++2 O39 t ++2 O41 ++2 O57 ++2 z1 ++2 z2 ++2 z3 *08 ++2 z3 *57 ++2 z3 D4 ++2 z3 t ++2 z4 ++2 z5 O81 +3 -+3$! -+3$. -+3$1 -+3$4 -+3$4D5 -+3$7-6 -+3$Ri2D -+3$Y -+3$c} -+3$m -+3$v -+3$w -+3'9 -+3*12 -+3*34r -+3*42 -+3*62 -+3+3 -+3+3+3 -+3+3+3+3 -+3+4 -+3+4+5 -+3+4+5+6 -+3+5 -+3+6 -+3-1 -+3-2 -+3@1 -+3@t -+3@v -+3@vo33 -+3D5o5e -+3D6 -+3K -+3R4z3 -+3R5sc6 -+3T5 -+3Z1 -+3Z1R6 -+3Z2 -+3Z2o1u -+3Z4 -+3^- -+3^2 -+3^G -+3^W} -+3^b -+3^d -+3^m -+3^p -+3c -+3i04 -+3i1L -+3i1m -+3i20 -+3i2Ac -+3i2| -+3i4a -+3i4e -+3i4k -+3k*23 -+3o0c -+3o0d -+3o1O -+3o1q -+3o2+ -+3o4_ -+3o4i -+3o5, -+3o6e -+3o8a -+3p1 -+3r -+3s1d -+3sjLZ1 -+3sl0 -+3snz -+3soe -+3spjo6q -+3ssv -+3stg -+3suf -+3ts27 -+3u -+3O03$w -+3O06Z4 -+3O12 -+3O47 -+3O53 -+3O71 -+3z1+2 -+3z1@6 -+3z2 -+3z3o33 -+3z4 -+3{ -+3{K ++3 $! ++3 $. ++3 $1 ++3 $4 ++3 $4 D5 ++3 $7 -6 ++3 $R i2D ++3 $Y ++3 $c } ++3 $m ++3 $v ++3 $w ++3 '9 ++3 *12 ++3 *34 r ++3 *42 ++3 *62 ++3 +3 ++3 +3 +3 ++3 +3 +3 +3 ++3 +4 ++3 +4 +5 ++3 +4 +5 +6 ++3 +5 ++3 +6 ++3 -1 ++3 -2 ++3 @1 ++3 @t ++3 @v ++3 @v o33 ++3 D5 o5e ++3 D6 ++3 K ++3 R4 z3 ++3 R5 sc6 ++3 T5 ++3 Z1 ++3 Z1 R6 ++3 Z2 ++3 Z2 o1u ++3 Z4 ++3 ^- ++3 ^2 ++3 ^G ++3 ^W } ++3 ^b ++3 ^d ++3 ^m ++3 ^p ++3 c ++3 i04 ++3 i1L ++3 i1m ++3 i20 ++3 i2A c ++3 i2| ++3 i4a ++3 i4e ++3 i4k ++3 k *23 ++3 o0c ++3 o0d ++3 o1O ++3 o1q ++3 o2+ ++3 o4_ ++3 o4i ++3 o5, ++3 o6e ++3 o8a ++3 p1 ++3 r ++3 s1d ++3 sjL Z1 ++3 sl0 ++3 snz ++3 soe ++3 spj o6q ++3 ssv ++3 stg ++3 suf ++3 t s27 ++3 u ++3 O03 $w ++3 O06 Z4 ++3 O12 ++3 O47 ++3 O53 ++3 O71 ++3 z1 +2 ++3 z1 @6 ++3 z2 ++3 z3 o33 ++3 z4 ++3 { ++3 { K +4 -+4$$u -+4$0 -+4$5 -+4$G -+4$N -+4$ZO58 -+4$_'6 -+4$a -+4$g[ -+4$k -+4$u -+4$v -+4'4l -+4'9 -+4*02 -+4*04z2 -+4*23 -+4*24O03 -+4*25 -+4*40 -+4*86 -+4+0 -+4+1 -+4+4 -+4+4+4 -+4+4+4+4 -+4+5 -+4+5+6 -+4+5+6+7 -+4-1Z2 -+4-2Z3 -+4@a -+4@y -+4C -+4C$O -+4D3 -+4D5 -+4L5 -+4L7 -+4R1o0L -+4T5 -+4Z1 -+4Z2 -+4Z2*52 -+4Z3 -+4Z4 -+4Z5O58 -+4[ -+4^c^S -+4c -+4d -+4i03C -+4i1lD3 -+4i2P -+4i44 -+4i4TO01 -+4i4b -+4i4z -+4i66 -+4o0m -+4o0t -+4o0z -+4o2; -+4o3g -+4o5y -+4o97 -+4q -+4qO53 -+4r -+4s.z -+4sK9 -+4seg -+4so5 -+4srB -+4t -+4O03 -+4O54 -+4O57 -+4O62 -+4O74 -+4O84 -+4z1 -+4z3 -+4z4 -+4{ -+4} ++4 $$ u ++4 $0 ++4 $5 ++4 $G ++4 $N ++4 $Z O58 ++4 $_ '6 ++4 $a ++4 $g [ ++4 $k ++4 $u ++4 $v +'4 l ++4 '9 ++4 *02 ++4 *04 z2 ++4 *23 +*24 O03 ++4 *25 ++4 *40 ++4 *86 ++4 +0 ++4 +1 ++4 +4 ++4 +4 +4 ++4 +4 +4 +4 ++4 +5 ++4 +5 +6 ++4 +5 +6 +7 ++4 -1 Z2 ++4 -2 Z3 ++4 @a ++4 @y ++4 C ++4 C $O ++4 D3 ++4 D5 ++4 L5 ++4 L7 ++4 R1 o0L ++4 T5 ++4 Z1 ++4 Z2 ++4 Z2 *52 ++4 Z3 ++4 Z4 ++4 Z5 O58 ++4 [ ++4 ^c ^S ++4 c ++4 d ++4 i03 C ++4 i1l D3 ++4 i2P ++4 i44 ++4 i4T O01 ++4 i4b ++4 i4z ++4 i66 ++4 o0m ++4 o0t ++4 o0z ++4 o2; ++4 o3g ++4 o5y ++4 o97 ++4 q ++4 q O53 ++4 r ++4 s.z ++4 sK9 ++4 seg ++4 so5 ++4 srB ++4 t ++4 O03 ++4 O54 ++4 O57 ++4 O62 ++4 O74 ++4 O84 ++4 z1 ++4 z3 ++4 z4 ++4 { ++4 } +5 -+5$- -+5$4 -+5$D -+5$I -+5$`R8 -+5$g -+5$u -+5$xO06 -+5$y -+5$z^X -+5'6 -+5'8 -+5'9 -+5*35 -+5*54 -+5*60 -+5*65 -+5*78 -+5*79 -+5+0D5 -+5+0^r -+5+5 -+5+5+5 -+5+5+5+5 -+5+6 -+5+6+7 -+5+6+7+8 -+5+7 -+5-0 -+5-4 -+5-6 -+5-7 -+5@6 -+5D1 -+5D2O41 -+5D4 -+5D6 -+5L0 -+5L6 -+5T3 -+5T4 -+5T4z4 -+5T7 -+5Z1 -+5Z2 -+5Z3 -+5Z4 -+5[-2 -+5[Z4 -+5] -+5]i3x -+5^# -+5^2 -+5^6 -+5^C -+5^K -+5^] -+5^g -+5^ri2o -+5^w -+5c -+5d -+5dO75 -+5f -+5i3/Z1 -+5i3o -+5i51 -+5i5z -+5ko0j -+5l -+5o0N -+5o2q -+5o37 -+5o3k -+5o4 -+5o47 -+5o4v -+5o79 -+5o94 -+5o9y -+5r -+5s36 -+5s6a -+5s6b -+5sfm$f -+5t -+5O04 -+5O62 -+5O63 -+5z1 -+5z1D4 -+5z2 -+5z4 -+5{ ++5 $- ++5 $4 ++5 $D ++5 $I ++5 $` R8 ++5 $g ++5 $u +$x O06 ++5 $y ++5 $z ^X ++5 '6 ++5 '8 ++5 '9 ++5 *35 ++5 *54 ++5 *60 ++5 *65 ++5 *78 ++5 *79 ++0 D5 ++5 +0 ^r ++5 +5 ++5 +5 +5 ++5 +5 +5 +5 ++5 +6 ++5 +6 +7 ++5 +6 +7 +8 ++5 +7 ++5 -0 ++5 -4 ++5 -6 ++5 -7 ++5 @6 ++5 D1 ++5 D2 O41 ++5 D4 ++5 D6 ++5 L0 ++5 L6 ++5 T3 ++5 T4 ++5 T4 z4 ++5 T7 ++5 Z1 ++5 Z2 ++5 Z3 ++5 Z4 ++5 [ -2 ++5 [ Z4 ++5 ] ++5 ] i3x ++5 ^# ++5 ^2 ++5 ^6 ++5 ^C ++5 ^K ++5 ^] ++5 ^g ++5 ^r i2o ++5 ^w ++5 c ++5 d ++5 d O75 ++5 f ++5 i3/ Z1 ++5 i3o ++5 i51 ++5 i5z ++5 k o0j ++5 l ++5 o0N ++5 o2q ++5 o37 ++5 o3k ++5 o4 ++5 o47 ++5 o4v ++5 o79 ++5 o94 ++5 o9y ++5 r ++5 s36 ++5 s6a ++5 s6b ++5 sfm $f ++5 t ++5 O04 ++5 O62 ++5 O63 ++5 z1 ++5 z1 D4 ++5 z2 ++5 z4 ++5 { +6 -+6$! -+6$& -+6$+ -+6$0 -+6$7 -+6$; -+6$@ -+6$A -+6$L -+6$U -+6$b -+6$e -+6$p -+6$u -+6'9 -+6'A -+6*02 -+6*14 -+6*43 -+6*57 -+6*60 -+6*63 -+6*73 -+6*83D3 -+6+1 -+6+4 -+6+6 -+6+6+6 -+6+6+6+6 -+6+7 -+6+7+8 -+6+7+8+9 -+6-5 -+6-7 -+6@d -+6@p -+6@u -+6D2 -+6D4 -+6D7 -+6D8 -+6R2 -+6R5 -+6T7 -+6Z1 -+6Z1i4c -+6Z2 -+6Z3 -+6Z4 -+6Z5 -+6[ -+6^*'5 -+6^- -+6^S -+6^a -+6^p -+6c -+6c^M -+6d -+6i3_ -+6i3j -+6i4. -+6i5 -+6i5m -+6i64 -+6i7u -+6k -+6l -+6l*32 -+6o2s -+6o5w -+6o7. -+6o77 -+6o78 -+6o92 -+6s3* -+6s57 -+6s87 -+6skP -+6slK -+6slg -+6u -+6O02 -+6O06o03 -+6O12 -+6O21[ -+6O31 -+6O32 -+6O42 -+6O51 -+6O73 -+6O74 -+6O76 -+6z1 -+6z1{ -+6z2 -+6{ ++6 $! ++6 $& ++6 $+ ++6 $0 ++6 $7 ++6 $; ++6 $@ ++6 $A ++6 $L ++6 $U ++6 $b ++6 $e ++6 $p ++6 $u ++6 '9 ++6 'A ++6 *02 ++6 *14 ++6 *43 ++6 *57 ++6 *60 ++6 *63 ++6 *73 ++6 *83 D3 ++6 +1 ++6 +4 ++6 +6 ++6 +6 +6 ++6 +6 +6 +6 ++6 +7 ++6 +7 +8 ++6 +7 +8 +9 ++6 -5 ++6 -7 ++6 @d ++6 @p ++6 @u ++6 D2 ++6 D4 ++6 D7 ++6 D8 ++6 R2 ++6 R5 ++6 T7 ++6 Z1 ++6 Z1 i4c ++6 Z2 ++6 Z3 ++6 Z4 ++6 Z5 ++6 [ +^* '5 ++6 ^- ++6 ^S ++6 ^a ++6 ^p ++6 c ++6 c ^M ++6 d ++6 i3_ ++6 i3j ++6 i4. ++6 i5 ++6 i5m ++6 i64 ++6 i7u ++6 k ++6 l ++6 l *32 ++6 o2s ++6 o5w ++6 o7. ++6 o77 ++6 o78 ++6 o92 ++6 s3* ++6 s57 ++6 s87 ++6 skP ++6 slK ++6 slg ++6 u ++6 O02 +O06 o03 ++6 O12 ++6 O21 [ ++6 O31 ++6 O32 ++6 O42 ++6 O51 ++6 O73 ++6 O74 ++6 O76 ++6 z1 ++6 z1 { ++6 z2 ++6 { +7 -+7$% -+7$0 -+7$3 -+7$4 -+7$P -+7$a -+7$bi18 -+7$bO4A -+7$g -+7'9 -+7*07 -+7*13+0 -+7*56[ -+7*57 -+7*59 -+7*98 -+7+7 -+7+7+7 -+7+7+7+7 -+7+7@. -+7+8 -+7+8+9 -+7-1 -+7-5 -+7-6 -+7-8 -+7-8O31 -+7@0 -+7@R -+7@k -+7@o -+7@r -+7D1 -+7D2 -+7R3 -+7R5 -+7R6 -+7T2 -+7Z1 -+7Z1*30 -+7Z1swg -+7Z2 -+7Z2L5 -+7[ -+7^, -+7^b -+7^o -+7^w -+7c -+7f -+7i1p -+7i34 -+7i4/ -+7i5j -+7i6y -+7i7& -+7i7S -+7i7_ -+7i7f -+7l -+7o3"C -+7o3< -+7o46 -+7o54 -+7o6_ -+7o6x -+7o6y -+7o83 -+7oB}*68 -+7p1 -+7r -+7r[ -+7s0sR5 -+7s7r -+7sfb -+7skD -+7u -+7O0BT4 -+7O12 -+7O24 -+7O27O43 -+7O32D2 -+7O41 -+7O48$u -+7O82 -+7OA2 -+7z2^) -+7z3 -+7} ++7 $% ++7 $0 ++7 $3 ++7 $4 ++7 $P ++7 $a ++7 $b i18 ++7 $b O4A ++7 $g ++7 '9 ++7 *07 ++7 *13 +0 ++7 *56 [ ++7 *57 ++7 *59 ++7 *98 ++7 +7 ++7 +7 +7 ++7 +7 +7 +7 ++7 +7 @. ++7 +8 ++7 +8 +9 ++7 -1 ++7 -5 ++7 -6 ++7 -8 ++7 -8 O31 ++7 @0 ++7 @R ++7 @k ++7 @o ++7 @r ++7 D1 ++7 D2 ++7 R3 ++7 R5 ++7 R6 ++7 T2 ++7 Z1 ++7 Z1 *30 ++7 Z1 swg ++7 Z2 ++7 Z2 L5 ++7 [ ++7 ^, ++7 ^b ++7 ^o ++7 ^w ++7 c ++7 f ++7 i1p ++7 i34 ++7 i4/ ++7 i5j ++7 i6y ++7 i7& ++7 i7S ++7 i7_ ++7 i7f ++7 l ++7 o3" C ++7 o3< ++7 o46 ++7 o54 ++7 o6_ ++7 o6x ++7 o6y ++7 o83 ++7 oB} *68 ++7 p1 ++7 r ++7 r [ ++7 s0s R5 ++7 s7r ++7 sfb ++7 skD ++7 u ++7 O0B T4 ++7 O12 ++7 O24 ++7 O27 O43 ++7 O32 D2 ++7 O41 ++7 O48 $u ++7 O82 ++7 OA2 ++7 z2 ^) ++7 z3 ++7 } +8 -+8$g -+8$m -+8'9 -+8*70 -+8*78 -+8*9A -+8+6 -+8+8 -+8+8+8 -+8+8+8+8 -+8+9 -+8+A -+8-2u -+8-6 -+8-7 -+8-9 -+8@9 -+8C+6 -+8D4 -+8R6 -+8R7 -+8T2 -+8Z1 -+8Z2 -+8^a -+8c -+8i7- -+8l -+8o0y -+8o13 -+8o4l -+8o5s -+8o6B -+8o6a -+8o7_ -+8o7b -+8s_ -+8sjs -+8spi -+8u -+8O08 -+8O17 -+8O21 -+8O26 -+8O42 -+8O47T6 -+8O52 -+8O53p1 -+8z1 -+8} ++8 $g ++8 $m ++8 '9 ++8 *70 ++8 *78 ++8 *9A ++8 +6 ++8 +8 ++8 +8 +8 ++8 +8 +8 +8 ++8 +9 ++8 +A ++8 -2 u ++8 -6 ++8 -7 ++8 -9 ++8 @9 ++8 C +6 ++8 D4 ++8 R6 ++8 R7 ++8 T2 ++8 Z1 ++8 Z2 ++8 ^a ++8 c ++8 i7- ++8 l ++8 o0y ++8 o13 ++8 o4l ++8 o5s ++8 o6B ++8 o6a ++8 o7_ ++8 o7b ++8 s_ ++8 sjs ++8 spi ++8 u ++8 O08 ++8 O17 ++8 O21 ++8 O26 ++8 O42 ++8 O47 T6 ++8 O52 ++8 O53 p1 ++8 z1 ++8 } +9 -+9$8D8 -+9$B -+9$a -+9'A -+9+0 -+9+6 -+9+7 -+9+9 -+9+9+9 -+9+9+9+9 -+9-8Z1 -+9D0+6 -+9D3 -+9D5 -+9D5z1 -+9D7 -+9D8 -+9R1 -+9Z1 -+9Z2 -+9Z2OA2 -+9[ -+9c -+9i6s$2 -+9i8d -+9i91 -+9l -+9o0IO15 -+9o0l -+9o43 -+9o76 -+9o83 -+9o8i -+9o8j -+9u -+9O15 -+9O19 -+9O23 -+9O37Z5 -+9O45 -+9O72 -+9OA4 ++9 $8 D8 ++9 $B ++9 $a ++9 'A ++9 +0 ++9 +6 ++9 +7 ++9 +9 ++9 +9 +9 ++9 +9 +9 +9 ++9 -8 Z1 ++9 D0 +6 ++9 D3 ++9 D5 ++9 D5 z1 ++9 D7 ++9 D8 ++9 R1 ++9 Z1 ++9 Z2 ++9 Z2 OA2 ++9 [ ++9 c ++9 i6s $2 ++9 i8d ++9 i91 ++9 l ++9 o0I O15 ++9 o0l ++9 o43 ++9 o76 ++9 o83 ++9 o8i ++9 o8j ++9 u ++9 O15 ++9 O19 ++9 O23 ++9 O37 Z5 ++9 O45 ++9 O72 ++9 OA4 +A -+A$! -+A$9 -+A*8A -+A*9A -+AD4 -+ADB -+AR5'9 -+AR9 -+AZ2 -+A^5c -+At -+AO62 -+AO82 -+AO91 ++A $! ++A $9 ++A *8A ++A *9A ++A D4 ++A DB +R5 '9 ++A R9 ++A Z2 ++A ^5 c ++A t ++A O62 ++A O82 ++A O91 +B -+B$3 -+B*9A -+B+5O0A -+B@2 -+B@8 -+B[ -+Bl -+Bo10 -+BO02 -+BO62 -+BO73 -+BO92 ++B $3 ++B *9A ++B +5 O0A ++B @2 ++B @8 ++B [ ++B l ++B o10 ++B O02 ++B O62 ++B O73 ++B O92 -0 --0$) --0$1 --0$? --0$E --0$K --0$P --0$` --0$a --0$b@4 --0$c --0$e --0$f --0$n --0$p --0$u --0$z --0'4z1 --0'7 --0'8O41 --0'A --0*02 --0*02[ --0*04 --0*05D0 --0*21 --0*31 --0*52 --0*63 --0*64 --0+2 --0+2s1q --0+3 --0+6 --0+7 --0+8 --0-0 --0-0-0 --0-0-0-0 --0-1 --0-1-2 --0-1-2-3 --0-2^B --0-5 --0-7 --0@2 --0@z --0C --0C*34 --0CT0 --0D1 --0D7 --0K --0L7 --0R3 --0R5O12 --0Z1 --0Z2 --0Z3 --0Z3*6A --0Z4 --0^& --0^+ --0^2 --0^5 --0^9 --0^; --0^;*56 --0^< --0^= --0^[ --0^d --0^g*02 --0^pO12 --0^u --0c --0d --0f --0f*56 --0i0C --0i18 --0i1l --0i1r --0i2n --0i2t --0i3j --0i3t --0i52 --0i57t --0i7s --0i7}O61 --0k --0kD2 --0l --0l$; --0lO24 --0o0fq --0o1wz3 --0o2H --0o3Z --0o3c --0o4=O3A --0o4f --0o52 --0o6p --0o7w --0o7z --0o8a --0o9b --0p2 --0p4 --0q --0r --0sao --0spH --0spm --0ss#l --0st2 --0t --0t^T --0O12 --0O13 --0O16 --0O18^e --0O23 --0O24 --0O25 --0O26 --0O4A --0O52sfT --0O53 --0O56 --0O84 --0z1 --0z1u --0z2 --0z2z4 --0z3 --0z3z2 --0z4 --0{ +-0 $) +-0 $1 +-0 $? +-0 $E +-0 $K +-0 $P +-0 $` +-0 $a +-0 $b @4 +-0 $c +-0 $e +-0 $f +-0 $n +-0 $p +-0 $u +-0 $z +-0 '4 z1 +-0 '7 +-0 '8 O41 +-0 'A +-0 *02 +-0 *02 [ +-0 *04 +-0 *05 D0 +-0 *21 +-0 *31 +-0 *52 +-0 *63 +-0 *64 +-0 +2 +-0 +2 s1q +-0 +3 +-0 +6 +-0 +7 +-0 +8 +-0 -0 +-0 -0 -0 +-0 -0 -0 -0 +-0 -1 +-0 -1 -2 +-0 -1 -2 -3 +-0 -2 ^B +-0 -5 +-0 -7 +-0 @2 +-0 @z +-0 C +-0 C *34 +-0 C T0 +-0 D1 +-0 D7 +-0 K +-0 L7 +-0 R3 +-0 R5 O12 +-0 Z1 +-0 Z2 +-0 Z3 +-0 Z3 *6A +-0 Z4 +-0 ^& +-0 ^+ +-0 ^2 +-0 ^5 +-0 ^9 +-0 ^; +-0 ^; *56 +-0 ^< +-0 ^= +-0 ^[ +-0 ^d +-0 ^g *02 +-0 ^p O12 +-0 ^u +-0 c +-0 d +-0 f +-0 f *56 +-0 i0C +-0 i18 +-0 i1l +-0 i1r +-0 i2n +-0 i2t +-0 i3j +-0 i3t +-0 i52 +-0 i57 t +-0 i7s +-0 i7} O61 +-0 k +-0 k D2 +-0 l +-0 l $; +-0 l O24 +o0f q +-0 o1w z3 +-0 o2H +-0 o3Z +-0 o3c +-0 o4= O3A +-0 o4f +-0 o52 +-0 o6p +-0 o7w +-0 o7z +-0 o8a +-0 o9b +-0 p2 +-0 p4 +-0 q +-0 r +-0 sao +-0 spH +-0 spm +-0 ss# l +-0 st2 +-0 t +-0 t ^T +-0 O12 +-0 O13 +-0 O16 +-0 O18 ^e +-0 O23 +-0 O24 +-0 O25 +-0 O26 +-0 O4A +-0 O52 sfT +-0 O53 +-0 O56 +-0 O84 +-0 z1 +-0 z1 u +-0 z2 +-0 z2 z4 +-0 z3 +-0 z3 z2 +-0 z4 +-0 { -1 --1$3 --1$5 --1$7 --1$8 --1$; --1$R@R --1$q --1$r --1$v --1$x --1'7 --1'A --1*12 --1*13 --1*20 --1*23 --1*27 --1*31r --1*43 --1*52K --1*90 --1*91 --1+2 --1-1 --1-1-1 --1-1-1-1 --1-2 --1-2-3 --1-2-3-4 --1-5 --1@2 --1@6 --1@v --1C --1C-2 --1DA --1K{ --1L0 --1R0 --1T2 --1T5+6 --1Z4 --1Z5i05 --1[-5 --1[Z2 --1[z4 --1^0 --1^3 --1^8 --1^A --1^i --1^n --1c --1d --1i0P --1i1l --1i2Oi0g --1i2R --1i5d --1i62 --1i82 --1l --1o01 --1o08 --1o0T --1o0t --1o3P --1o7m --1r --1ro3/ --1s9s --1sfr --1skv --1skx --1sly --1ssik --1t --1to3l --1u --1O07i1_ --1O23 --1O32 --1O37^b --1O73 --1z1 --1z2 --1z3 --1z5 --1} --1}*50 --1}i5` +-1 $3 +-1 $5 +-1 $7 +-1 $8 +-1 $; +-1 @R +-1 $q +-1 $r +-1 $v +-1 $x +-1 '7 +-1 'A +-1 *12 +-1 *13 +-1 *20 +-1 *23 +-1 *27 +-1 *31 r +-1 *43 +-1 *52 K +-1 *90 +-1 *91 +-1 +2 +-1 -1 +-1 -1 -1 +-1 -1 -1 -1 +-1 -2 +-1 -2 -3 +-1 -2 -3 -4 +-1 -5 +-1 @2 +-1 @6 +-1 @v +-1 C +-1 C -2 +-1 DA +-1 K { +-1 L0 +-1 R0 +-1 T2 +-1 T5 +6 +-1 Z4 +-1 Z5 i05 +-1 [ -5 +-1 [ Z2 +-1 [ z4 +-1 ^0 +-1 ^3 +-1 ^8 +-1 ^A +-1 ^i +-1 ^n +-1 c +-1 d +-1 i0P +-1 i1l +-1 i2O i0g +-1 i2R +-1 i5d +-1 i62 +-1 i82 +-1 l +-1 o01 +-1 o08 +-1 o0T +-1 o0t +-1 o3P +-1 o7m +-1 r +-1 r o3/ +-1 s9s +-1 sfr +-1 skv +-1 skx +-1 sly +-1 ssi k +-1 t +-1 t o3l +-1 u +-1 O07 i1_ +-1 O23 +-1 O32 +-1 O37 ^b +-1 O73 +-1 z1 +-1 z2 +-1 z3 +-1 z5 +-1 } +-1 } *50 +-1 } i5` -2 --2$3 --2$4 --2$7 --2$8 --2$< --2$K --2$c --2$cO42 --2$hO54 --2'7 --2'A --2*05 --2*10 --2*23 --2*26 --2*52 --2*75c --2-2 --2-2-2 --2-2-2-2 --2-3 --2-3-4 --2-3-4-5 --2-6 --2-8 --2@1o4h --2@6 --2@8 --2D0*54 --2D1 --2L0 --2L1 --2L2 --2L3 --2R0 --2R1 --2R4 --2R4^d --2R6 --2T4 --2Z1 --2Z2 --2Z3 --2Z4q --2^C --2^c --2^g --2^k --2^p --2^s} --2d --2f --2f[ --2i0m --2i14 --2i2xT3 --2i3 --2i3b --2i3h --2i3l --2i6u --2i7b --2l --2l+7 --2o04 --2o0G --2o0T --2o0d --2o0g --2o1[ --2o1dZ1 --2o1k --2o33z2 --2o3P --2o3j --2o3x --2o40 --2o4y --2o5a --2o7* --2o7A --2o7G --2o7r --2p1O83 --2q --2q+0 --2r --2rz1 --2s7i --2scu*03 --2sdy --2si5 --2sw;D2 --2u --2u*31 --2O47 --2O52 --2O53 --2O53z2 --2O54swc --2z1Z1 --2z2 --2{ +-2 $3 +-2 $4 +-2 $7 +-2 $8 +-2 $< +-2 $K +-2 $c +-2 $c O42 +-2 $h O54 +-2 '7 +-2 'A +-2 *05 +-2 *10 +-2 *23 +-2 *26 +-2 *52 +-2 *75 c +-2 -2 +-2 -2 -2 +-2 -2 -2 -2 +-2 -3 +-2 -3 -4 +-2 -3 -4 -5 +-2 -6 +-2 -8 +-2 @1 o4h +-2 @6 +-2 @8 +-2 D0 *54 +-2 D1 +-2 L0 +-2 L1 +-2 L2 +-2 L3 +-2 R0 +-2 R1 +-2 R4 +-2 R4 ^d +-2 R6 +-2 T4 +-2 Z1 +-2 Z2 +-2 Z3 +-2 Z4 q +-2 ^C +-2 ^c +-2 ^g +-2 ^k +-2 ^p +-2 ^s } +-2 d +-2 f +-2 f [ +-2 i0m +-2 i14 +-2 i2x T3 +-2 i3 +-2 i3b +-2 i3h +-2 i3l +-2 i6u +-2 i7b +-2 l +-2 l +7 +-2 o04 +-2 o0G +-2 o0T +-2 o0d +-2 o0g +-2 o1[ +-2 o1d Z1 +-2 o1k +-2 o33 z2 +-2 o3P +-2 o3j +-2 o3x +-2 o40 +-2 o4y +-2 o5a +-2 o7* +-2 o7A +-2 o7G +-2 o7r +-2 p1 O83 +-2 q +-2 q +0 +-2 r +-2 r z1 +-2 s7i +-2 scu *03 +-2 sdy +-2 si5 +sw; D2 +-2 u +-2 u *31 +-2 O47 +-2 O52 +-2 O53 +-2 O53 z2 +-2 O54 swc +-2 z1 Z1 +-2 z2 +-2 { -3 --3$#o86 --3$, --3$4 --3$9 --3$: --3$=O05 --3$I^N --3$b --3$k --3$tt --3$zi2p --3'6 --3'7u --3*16 --3*20 --3*24 --3*32sr1 --3*43 --3*45 --3*57 --3*64 --3*65 --3*82 --3+1 --3+2 --3+4 --3+6 --3-0 --3-1 --3-3 --3-3-3 --3-3-3-3 --3-4 --3-4-5 --3-4-5-6 --3@1 --3@3 --3@8 --3@g --3D2 --3D2u --3D3i0F --3D4Z2 --3D6 --3D7 --3L2 --3T3u --3T6 --3Z2 --3Z3 --3^$ --3^8 --3^b --3^g --3^oo7k --3^r --3^u --3^v --3d --3do1f --3fO12 --3i18l --3i33 --3i34 --3i4z*63 --3i5/ --3i5k --3i5s --3i5v --3k --3ks4| --3l --3o0G --3o0W --3o0a --3o1W --3o2a-6 --3o4. --3o4@ --3o4e --3o4i --3o4k --3o4s --3o97 --3p1O72 --3q --3r --3s0b --3sCg --3sTB --3sfk --3smu --3ssp --3t$n --3ui2D --3O02 --3O35*43 --3O41 --3O51 --3O52 --3O63$9 --3O72 --3O86'8 --3OB2^9 --3z1 --3z2 --3z2i0c --3z3 --3z4 --3z4s/4 --3z5'9 --3{ +-3 $# o86 +-3 $, +-3 $4 +-3 $9 +-3 $: +-3 $= O05 +-3 $I ^N +-3 $b +-3 $k +-3 $t t +-3 $z i2p +-3 '6 +-3 '7 u +-3 *16 +-3 *20 +-3 *24 +-3 *32 sr1 +-3 *43 +-3 *45 +-3 *57 +-3 *64 +-3 *65 +-3 *82 +-3 +1 +-3 +2 +-3 +4 +-3 +6 +-3 -0 +-3 -1 +-3 -3 +-3 -3 -3 +-3 -3 -3 -3 +-3 -4 +-3 -4 -5 +-3 -4 -5 -6 +-3 @1 +-3 @3 +-3 @8 +-3 @g +-3 D2 +-3 D2 u +D3 i0F +-3 D4 Z2 +-3 D6 +-3 D7 +-3 L2 +-3 u +-3 T6 +-3 Z2 +-3 Z3 +-3 ^$ +-3 ^8 +-3 ^b +-3 ^g +-3 ^o o7k +-3 ^r +-3 ^u +-3 ^v +-3 d +-3 d o1f +-3 f O12 +-3 i18 l +-3 i33 +-3 i34 +-3 i4z *63 +-3 i5/ +-3 i5k +-3 i5s +-3 i5v +-3 k +-3 k s4| +-3 l +-3 o0G +-3 o0W +-3 o0a +-3 o1W +-3 o2a -6 +-3 o4. +-3 o4@ +-3 o4e +-3 o4i +-3 o4k +-3 o4s +-3 o97 +-3 p1 O72 +-3 q +-3 r +-3 s0b +-3 sCg +-3 sTB +-3 sfk +-3 smu +-3 ssp +-3 t $n +-3 u i2D +-3 O02 +-3 O35 *43 +-3 O41 +-3 O51 +-3 O52 +-3 O63 $9 +-3 O72 +-3 '8 +-3 OB2 ^9 +-3 z1 +-3 z2 +-3 z2 i0c +-3 z3 +-3 z4 +-3 z4 s/4 +-3 z5 '9 +-3 { -4 --4$! --4$* --4$- --4$a{ --4$xo6K --4'6 --4*02 --4*14 --4*26 --4*34 --4*40 --4*42 --4*42O42 --4*45 --4+3 --4-0'7 --4-1 --4-2 --4-4 --4-4-4 --4-4-4-4 --4-5 --4-5-6 --4-5-6-7 --4-8 --4@m --4D2 --4D5 --4D5L6 --4D6 --4D7 --4L4 --4L5+5 --4Z1 --4Z1o61 --4Z1z2 --4Z2O78 --4Z3 --4[Z5 --4[^I --4]-1 --4^$ --4^4D4 --4^h --4^j --4^r --4c --4i0l --4i27O4A --4i5d --4i64 --4k --4l --4o05 --4o0G --4o0P --4o0dz2 --4o28 --4o2B --4o2t --4o52 --4o5k --4o67 --4o7e --4p1 --4s0M --4s2m --4s7 --4se. --4t --4u --4O03 --4O12 --4O14$m --4O26$B --4O31 --4O45^D --4O63 --4O75 --4O82 --4z1 --4z3 --4z4 --4} +-4 $! +-4 $* +-4 $- +-4 $a { +-4 $x o6K +-4 '6 +-4 *02 +-4 *14 +-4 *26 +-4 *34 +-4 *40 +-4 *42 +-4 *42 O42 +-4 *45 +-4 +3 +-4 -0 '7 +-4 -1 +-4 -2 +-4 -4 +-4 -4 -4 +-4 -4 -4 -4 +-4 -5 +-4 -5 -6 +-4 -5 -6 -7 +-4 -8 +-4 @m +-4 D2 +-4 D5 +-4 D5 L6 +-4 D6 +-4 D7 +-4 L4 +-4 L5 +5 +-4 Z1 +-4 Z1 o61 +-4 Z1 z2 +-4 Z2 O78 +-4 Z3 +-4 [ Z5 +-4 [ ^I +-4 ] -1 +-4 ^$ +-4 ^4 D4 +-4 ^h +-4 ^j +-4 ^r +-4 c +-4 i0l +-4 i27 O4A +-4 i5d +-4 i64 +-4 k +-4 l +-4 o05 +-4 o0G +-4 o0P +-4 o0d z2 +-4 o28 +-4 o2B +-4 o2t +-4 o52 +-4 o5k +-4 o67 +-4 o7e +-4 p1 +-4 s0M +-4 s2m +-4 s7 +-4 se. +-4 t +-4 u +-4 O03 +-4 O12 +-4 O14 $m +-4 O26 $B +-4 O31 +-4 O45 ^D +-4 O63 +-4 O75 +-4 O82 +-4 z1 +-4 z3 +-4 z4 +-4 } -5 --5$! --5$% --5$* --5$1 --5$2 --5$3 --5$? --5$I} --5$K --5$M --5$S --5$j --5$m --5$t --5$u --5'6 --5'9 --5*16 --5*21d --5*25l --5*46 --5*50K --5*62'6 --5*68 --5*74 --5*75*56 --5*79 --5+2 --5+3 --5+4 --5+8 --5-5 --5-5-5 --5-5-5-5 --5-6 --5-6-7 --5-6-7-8 --5-9 --5@0 --5@3 --5@7 --5@a --5C --5D1 --5D2 --5D3 --5D3sw7 --5D4 --5D6 --5L0+1 --5R3+3 --5R5+1 --5T0 --5T2 --5T3 --5Z1 --5Z1R6 --5Z2 --5Z3 --5Z3O43 --5Z4 --5[ --5[d --5^RO41 --5^UsrM --5^n --5c --5cZ1 --5d --5i19 --5i3g --5i4Mi0` --5i5n --5i5t^_ --5i7e --5i7o --5k --5l --5o0G --5o19 --5o1_ --5o2[ --5o2bD4 --5o3_ --5o61 --5o62 --5o6= --5o6g --5o8* --5r[ --5s6v --5sb- --5sjy --5srot --5suVc --5t --5O02 --5O03 --5O05 --5O42L4 --5O81 --5z2 --5z2{ --5z3 --5z3Z1 --5{ --5} +-5 $! +-5 $% +-5 $* +-5 $1 +-5 $2 +-5 $3 +-5 $? +-5 $I } +-5 $K +-5 $M +-5 $S +-5 $j +-5 $m +-5 $t +-5 $u +-5 '6 +-5 '9 +-5 *16 +-5 *21 d +-5 *25 l +-5 *46 +-5 *50 K +-5 *62 '6 +-5 *68 +-5 *74 +-5 *75 *56 +-5 *79 +-5 +2 +-5 +3 +-5 +4 +-5 +8 +-5 -5 +-5 -5 -5 +-5 -5 -5 -5 +-5 -6 +-5 -6 -7 +-5 -6 -7 -8 +-5 -9 +-5 @0 +-5 @3 +-5 @7 +-5 @a +-5 C +-5 D1 +-5 D2 +-5 D3 +-5 D3 sw7 +-5 D4 +-5 D6 +-5 L0 +1 +-5 R3 +3 +-5 R5 +1 +-5 T0 +-5 T2 +-5 T3 +-5 Z1 +-5 Z1 R6 +-5 Z2 +-5 Z3 +-5 Z3 O43 +-5 Z4 +-5 [ +-5 [ d +-5 ^R O41 +-5 ^U srM +-5 ^n +-5 c +-5 c Z1 +-5 d +-5 i19 +-5 i3g +-5 i4M i0` +-5 i5n +-5 i5t ^_ +-5 i7e +-5 i7o +-5 k +-5 l +-5 o0G +-5 o19 +-5 o1_ +-5 o2[ +-5 o2b D4 +-5 o3_ +-5 o61 +-5 o62 +-5 o6= +-5 o6g +-5 o8* +-5 r [ +-5 s6v +-5 sb- +-5 sjy +-5 sro t +-5 suV c +-5 t +-5 O02 +-5 O03 +-5 O05 +-5 O42 L4 +-5 O81 +-5 z2 +-5 z2 { +-5 z3 +-5 z3 Z1 +-5 { +-5 } -6 --6$4 --6$7 --6$8 --6$p-2 --6$x --6$z --6'7i3i --6*20 --6*24D0 --6*63 --6*67 --6*70 --6*85 --6+0 --6-0O51 --6-3 --6-6 --6-6-6 --6-6-6-6 --6-7 --6-7-8 --6-7-8-9 --6-8 --6-9 --64 --6@_ --6C --6D4 --6L0 --6L1o0j --6L5 --6L6 --6R4 --6R6u --6T0 --6T2 --6T7 --6Z1 --6Z2 --6Z2*68 --6Z4 --6[ --6]O74 --6^# --6^& --6^@ --6^a --6^k --6^r --6c --6ci6f --6d --6dO48 --6i06 --6i0f'9 --6i45 --6i4j --6i5, --6i5r --6i62 --6i7d --6i82 --6ki6x --6l --6o3l --6o56 --6o5t --6o5z --6o7r --6u --6uL2 --6O03 --6O04 --6O05 --6O13 --6O23 --6O31 --6O34T3 --6O51 --6O51T1 --6O65i4u --6O72 --6O75 --6O82 --6O84 --6z1 --6z1O73 --6} +-6 $4 +-6 $7 +-6 $8 +-6 $p -2 +-6 $x +-6 $z +-6 '7 i3i +-6 *20 +-6 *24 D0 +-6 *63 +-6 *67 +-6 *70 +-6 *85 +-6 +0 +-6 -0 O51 +-6 -3 +-6 -6 +-6 -6 -6 +-6 -6 -6 -6 +-6 -7 +-6 -7 -8 +-6 -7 -8 -9 +-6 -8 +-6 -9 +-6 @_ +-6 C +-6 D4 +-6 L0 +-6 L1 o0j +-6 L5 +-6 L6 +-6 R4 +-6 R6 u +-6 T0 +-6 T2 +-6 T7 +-6 Z1 +-6 Z2 +-6 Z2 *68 +-6 Z4 +-6 [ +-6 ] O74 +-6 ^# +-6 ^& +-6 ^@ +-6 ^a +-6 ^k +-6 ^r +-6 c +-6 c i6f +-6 d +-6 d O48 +-6 i06 +-6 i0f '9 +-6 i45 +-6 i4j +-6 i5, +-6 i5r +-6 i62 +-6 i7d +-6 i82 +-6 k i6x +-6 l +-6 o3l +-6 o56 +-6 o5t +-6 o5z +-6 o7r +-6 u +-6 u L2 +-6 O03 +-6 O04 +-6 O05 +-6 O13 +-6 O23 +-6 O31 +-6 O34 T3 +-6 O51 +-6 O51 T1 +-6 O65 i4u +-6 O72 +-6 O75 +-6 O82 +-6 O84 +-6 z1 +-6 z1 O73 +-6 } -7 --7$! --7$% --7$+ --7$0 --7$5 --7$9 --7$? --7$R --7$a --7$b --7$v --7'A --7*06u --7*43 --7*68 --7*70o10 --7*72 --7*73 --7*73z3 --7*76 --7*87 --7+9 --7-3 --7-3Z1 --7-7 --7-7-7 --7-7-7-7 --7-8 --7-8-9 --7-9 --7@j --7D4 --7D6 --7D8 --7R2 --7T4 --7Z1 --7Z2 --7Z3 --7[ --7^3 --7c --7ci6_ --7i0j --7i1R --7i4; --7i4w^7 --7i4x --7i59 --7i68 --7i7,t --7i7oO43 --7i7t --7i8+O06 --7l --7o14 --7o1@ --7o5# --7o5g --7o6- --7o6. --7o69 --7o6b --7o77i5I --7o8! --7o80 --7s4$ --7sull --7t --7u --7O03 --7O04$B --7O05D4 --7O26i4s --7O79 --7O94 --7z1 --7z1D2 --7z2 --7{Z1 --7} +-7 $! +-7 $% +-7 $+ +-7 $0 +-7 $5 +-7 $9 +-7 $? +-7 $R +-7 $a +-7 $b +-7 $v +-7 'A +-7 *06 u +-7 *43 +-7 *68 +-7 *70 o10 +-7 *72 +-7 *73 +-7 *73 z3 +-7 *76 +-7 *87 +-7 +9 +-7 -3 +-7 -3 Z1 +-7 -7 +-7 -7 -7 +-7 -7 -7 -7 +-7 -8 +-7 -8 -9 +-7 -9 +-7 @j +-7 D4 +-7 D6 +-7 D8 +-7 R2 +-7 T4 +-7 Z1 +-7 Z2 +-7 Z3 +-7 [ +-7 ^3 +-7 c +-7 c i6_ +-7 i0j +-7 i1R +-7 i4; +-7 i4w ^7 +-7 i4x +-7 i59 +-7 i68 +-7 i7, t +-7 i7o O43 +-7 i7t +-7 i8+ O06 +-7 l +-7 o14 +-7 o1@ +-7 o5# +-7 o5g +-7 o6- +-7 o6. +-7 o69 +-7 o6b +o77 i5I +-7 o8! +-7 o80 +-7 s4$ +-7 sul l +-7 t +-7 u +-7 O03 +-7 O04 $B +-7 O05 D4 +-7 O26 i4s +-7 O79 +-7 O94 +-7 z1 +-7 z1 D2 +-7 z2 +-7 { Z1 +-7 } -8 --8$! --8$% --8$5+A --8$8 --8$VO3A --8$f --8$n^O --8$s --8$w --8$y --8'8$I --8*53 --8*57 --8*76 --8*7BO62 --8*8A --8*BA --8+2 --8+4 --8+6 --8+9 --8-0 --8-3 --8-8 --8-8-8 --8-8-8-8 --8-9 --84 --8@k --8@u --8@uO12 --8D6 --8D7 --8DA --8R7 --8T4 --8Z1 --8Z2 --8[ --8[l --8c --8i2[ --8i8Qc --8l --8o3b --8o4b --8o5d --8o66 --8o6b --8o7f --8o9l --8oB3 --8q --8t --8O04 --8O12c --8O16 --8O25c --8O62 --8O91 --8z2 +-8 $! +-8 $% +-8 $5 +A +-8 $8 +-8 $V O3A +-8 $f +-8 $n ^O +-8 $s +-8 $w +-8 $y +'8 $I +-8 *53 +-8 *57 +-8 *76 +-8 *7B O62 +-8 *8A +-8 *BA +-8 +2 +-8 +4 +-8 +6 +-8 +9 +-8 -0 +-8 -3 +-8 -8 +-8 -8 -8 +-8 -8 -8 -8 +-8 -9 +-8 @k +-8 @u +-8 @u O12 +-8 D6 +-8 D7 +-8 DA +-8 R7 +-8 T4 +-8 Z1 +-8 Z2 +-8 [ +-8 [ l +-8 c +-8 i2[ +-8 i8Q c +-8 l +-8 o3b +-8 o4b +-8 o5d +-8 o66 +-8 o6b +-8 o7f +-8 o9l +-8 oB3 +-8 q +-8 t +-8 O04 +-8 O12 c +-8 O16 +-8 O25 c +-8 O62 +-8 O91 +-8 z2 -9 --9$! --9$5 --9*01 --9*56 --9*98 --9+0 --9-0 --9-4 --9-7'8 --9-9 --9-9-9 --9-9-9-9 --9D1 --9D4Z1 --9D7 --9L9 --9R8 --9T2 --9Z1 --9Z1-6 --9Z2 --9^1 --9^5O64 --9i6- --9l --9o64 --9o7b --9s09 --9s25 --9s4F --9s91 --9s9e --9u --9uO24 --9O02t --9O15o2* --9O16^p --9O17 --9O25 --9O35^f --9O41 --9O71+3 --9O92D0 --9O93$c --9OA2 --9} +-9 $! +-9 $5 +-9 *01 +-9 *56 +-9 *98 +-9 +0 +-9 -0 +-9 -4 +-7 '8 +-9 -9 +-9 -9 -9 +-9 -9 -9 -9 +-9 D1 +-9 D4 Z1 +-9 D7 +-9 L9 +-9 R8 +-9 T2 +-9 Z1 +-9 Z1 -6 +-9 Z2 +-9 ^1 +-9 ^5 O64 +-9 i6- +-9 l +-9 o64 +-9 o7b +-9 s09 +-9 s25 +-9 s4F +-9 s91 +-9 s9e +-9 u +-9 u O24 +-9 O02 t +-9 O15 o2* +-9 O16 ^p +-9 O17 +-9 O25 +-9 O35 ^f +-9 O41 +-9 O71 +3 +-9 O92 D0 +-9 O93 $c +-9 OA2 +-9 } -A --A*A8 --A+9 --ALA --AZ1 --Ai82 --Ao93 --AoB8 --AO01 --AO35 +-A *A8 +-A +9 +-A LA +-A Z1 +-A i82 +-A o93 +-A oB8 +-A O01 +-A O35 -B --B$3 --B$9 --B+A --B-8 --B-9 --B-A --BD7 --BZ1 --Bl --Bs21 --BO28'8 +-B $3 +-B $9 +-B +A +-B -8 +-B -9 +-B -A +-B D7 +-B Z1 +-B l +-B s21 +-B O28 '8 : -@ $sO62 -@ '9 -@ t -@ O49 -@!+5 -@#o88 -@*D3 +@ $s O62 +@ '9 +@ t +@ O49 +@! +5 +@# o88 +@* D3 @, -@.D6 -@.i5+ -@.t +@. D6 +@. i5+ +@. t @0 -@0$$ -@0+6R3 -@0+9 -@0-2 -@0@r -@0CC -@0D6 -@0T2 -@0Z1 -@0^4 -@0c -@0o4Y -@0o4x-7 -@0o8FO16 -@0s3- -@0s78 -@0O32 +@0 $$ +@0 +6 R3 +@0 +9 +@0 -2 +@0 @r +@0 C +@0 D6 +@0 T2 +@0 Z1 +@0 ^4 +@0 c +@0 o4Y +@0 o4x -7 +@0 o8F O16 +@0 s3- +@0 s78 +@0 O32 @1 -@1$5 -@1*9BO92 -@1+4o1@ -@1+6 -@1-5 -@1Z2 -@1Z3^S -@1Z5r -@1^a -@1d*13 -@1l -@1o5- -@1o64 -@1s3; -@1O42 -@1z1O23 -@1z3c +@1 $5 +@1 *9B O92 +@1 +4 o1@ +@1 +6 +@1 -5 +@1 Z2 +@1 Z3 ^S +@1 Z5 r +@1 ^a +@1 d *13 +@1 l +@1 o5- +@1 o64 +@1 s3; +@1 O42 +@1 z1 O23 +@1 z3 c @2 -@2$ -@2$1 -@2$5 -@2+2 -@2T7u -@2^7Z1 -@2^l -@2^n -@2i62u -@2l -@2l$x -@2o2e -@2o94 -@2oB9 -@2O42 -@2O71 -@2z1 +@2 $ +@2 $1 +@2 $5 +@2 +2 +@2 u +@2 ^7 Z1 +@2 ^l +@2 ^n +@2 i62 u +@2 l +@2 l $x +@2 o2e +@2 o94 +@2 oB9 +@2 O42 +@2 O71 +@2 z1 @3 -@3$9 -@3'A -@3*50 -@3-0c -@3Z1s52 -@3Z1z3 -@3i03 -@3i0y -@3o07 -@3se9 -@3z1 -@3z2 -@3z5q +@3 $9 +@3 'A +@3 *50 +@3 -0 c +@3 Z1 s52 +@3 Z1 z3 +@3 i03 +@3 i0y +@3 o07 +@3 se9 +@3 z1 +@3 z2 +@3 z5 q @4 -@4$_ -@4'6 -@4'A -@4-7'9 -@4D5 -@4L3r -@4[ -@4^K -@4d -@4l -@4O31 -@4O35 -@4O61c -@4O63C +@4 $_ +@4 '6 +@4 'A +@4 -7 '9 +@4 D5 +@4 L3 r +@4 [ +@4 ^K +@4 d +@4 l +@4 O31 +@4 O35 +@4 O61 c +@4 O63 C @5 -@5$ -@5$7 -@5+2 -@5+8'B -@5D2 -@5R3 -@5T4'8 -@5Z1L2 -@5^9 -@5^G+0 -@5^d -@5^j -@5^l -@5dO62 -@5o1e -@5o3r -@5O12Z3 -@5O25T0 -@5O43 +@5 $ +@5 $7 +@5 +2 +@5 +8 'B +@5 D2 +@5 R3 +@5 T4 '8 +@5 Z1 L2 +@5 ^9 +@5 ^G +0 +@5 ^d +@5 ^j +@5 ^l +@5 d O62 +@5 o1e +@5 o3r +@5 O12 Z3 +@5 O25 T0 +@5 O43 @6 -@6$! -@6$T'8 -@6'6 -@6*24[ -@6+8 -@6C -@6D4 -@6L2 -@6Z2 -@6i7_ -@6o57 -@6o5> -@6o5j[ -@6t -@6O31 +@6 $! +@6 $T '8 +@6 '6 +@6 *24 [ +@6 +8 +@6 C +@6 D4 +@6 L2 +@6 Z2 +@6 i7_ +@6 o57 +@6 o5> +@6 o5j [ +@6 t +@6 O31 @7 -@7$2 -@7'9 -@7+1 -@7+6 -@7@D -@7Z2*37 -@7[ -@7i42 -@7o1b -@7o3w -@7p1 -@7s50 -@7O04u -@7O26z1 -@7z1 -@7z4 +@7 $2 +@7 '9 +@7 +1 +@7 +6 +@7 @D +@7 Z2 *37 +@7 [ +@7 i42 +@7 o1b +@7 o3w +@7 p1 +@7 s50 +@7 O04 u +@7 O26 z1 +@7 z1 +@7 z4 @8 -@8'8 -@8+4s0A -@8@v -@8Z2O2A -@8^3 -@8i40 -@8i45C -@8i5V -@8o65 -@8t -@8z2 +@8 '8 +@8 +4 s0A +@8 @v +@8 Z2 O2A +@8 ^3 +@8 i40 +@8 i45 C +@8 i5V +@8 o65 +@8 t +@8 z2 @9 -@9$1 -@9'7 -@9D0Z3 -@9L2 -@9L4 -@9L5 -@9R1 -@9Z3 -@9[ -@9c -@9i3- -@9p1 -@9O53 -@9O65$1 -@9O92 -@9z1c -@9z4 -@@^f^7 -@BZ5 -@Do3) -@DO34 -@Fshr -@FO13 -@H'6^F -@H@1u -@Il -@Jc -@L[ -@Mi0D -@Mu +@9 $1 +@9 '7 +@9 D0 Z3 +@9 L2 +@9 L4 +@9 L5 +@9 R1 +@9 Z3 +@9 [ +@9 c +@9 i3- +@9 p1 +@9 O53 +@9 O65 $1 +@9 O92 +@9 z1 c +@9 z4 +@@ ^f ^7 +@B Z5 +@D o3) +@D O34 +@F shr +@F O13 +@H '6 ^F +@H @1 u +@I l +@J c +@L [ +@M i0D +@M u @N -@OO13 -@Qt -@XO04 +@O O13 +@Q t +@X O04 @a -@a$1 -@a$c -@a-3 -@aT0 -@ai7e -@al -@ao1g -@asw0 -@az2 -@az2O03 +@a $1 +@a $c +@a -3 +@a T0 +@a i7e +@a l +@a o1g +@a sw0 +@a z2 +@a z2 O03 @b -@b$Q -@bD1 -@b[z5 -@bcl -@bi0eO04 -@bi52 -@bs7b +@b $Q +@b D1 +@b [ z5 +@b l +@b i0e O04 +@b i52 +@b s7b @c -@c^O -@ct +@c ^O +@c t @d -@d'3Z5 -@d+2 -@d-0 -@dT3 -@dZ2i2v -@d[ -@di1q -@do6# -@du+1 -@dz3 +@d '3 Z5 +@d +2 +@d -0 +@d T3 +@d Z2 i2v +@d [ +@d i1q +@d o6# +@d u +1 +@d z3 @e -@ed -@ei6g'5 -@eo2j -@eo36i3d -@eo7k -@eO12 -@eO72 +@e d +@e '5 +@e o2j +@e o36 i3d +@e o7k +@e O12 +@e O72 @f -@f-2 -@fL4 -@fZ5 -@f[ -@f^# -@fd -@fz1 -@f{Z1 -@g'7 -@g*19O03 -@g*73 -@g+1 -@gC -@gD1 -@gZ2 -@gO05 -@gO61 +@f -2 +@f L4 +@f Z5 +@f [ +@f ^# +@f d +@f z1 +@f { Z1 +@g '7 +@g *19 O03 +@g *73 +@g +1 +@g C +@g D1 +@g Z2 +@g O05 +@g O61 @h -@h$4 -@h-2 -@h-3 -@h-7 -@hZ1 -@h[ -@h^a -@h^s -@hi2Z^H -@hi6sD5 -@hlp1 -@ho4g -@hO36 -@hO41 -@hO54 -@hO63 +@h $4 +@h -2 +@h -3 +@h -7 +@h Z1 +@h [ +@h ^a +@h ^s +@h i2Z ^H +@h i6s D5 +@h l p1 +@h o4g +@h O36 +@h O41 +@h O54 +@h O63 @i -@i$a -@i'9c -@i*06 -@iD1Z1 -@iD3 -@iR1 -@iZ1 -@ic -@il -@io4e -@itu -@iO36^g -@iz1 -@iz2O26 +@i $a +@i '9 c +@i *06 +@i D1 Z1 +@i D3 +@i R1 +@i Z1 +@i c +@i l +@i o4e +@i u +@i O36 ^g +@i z1 +@i z2 O26 @j -@j-0 -@jZ4 -@j^a -@jc -@jO32 +@j -0 +@j Z4 +@j ^a +@j c +@j O32 @k -@k*31L0 -@kD3 -@kD5 -@kR1 -@kZ1 -@kZ4t -@k^j -@k^w-1 -@kco3L -@kO46 -@kO53-3 -@kO67 -@l$c -@l'6 -@l'9 -@lT3-1 -@l^f -@li0nt -@li2E -@lO42 -@lz1 -@lz2O07 +@k *31 L0 +@k D3 +@k D5 +@k R1 +@k Z1 +@k Z4 t +@k ^j +@k ^w -1 +@k c o3L +@k O46 +@k O53 -3 +@k O67 +@l $c +@l '6 +@l '9 +@l T3 -1 +@l ^f +@l i0n t +@l i2E +@l O42 +@l z1 +@l z2 O07 @m -@m*27 -@m-1 -@m-4^4 -@mD2 -@mT3o2y -@mT6-2 -@mZ2L2 -@mi0T -@mi0d -@mqz4 -@mO24 +@m *27 +@m -1 +@m -4 ^4 +@m D2 +@m T3 o2y +@m T6 -2 +@m Z2 L2 +@m i0T +@m i0d +@m q z4 +@m O24 @n -@n$8Z3 -@n+3 -@n-3 -@n-5 -@nZ2 -@n[ -@n^m -@nl+7 -@np1 -@nsbd -@nO56 -@n}i7r +@n $8 Z3 +@n +3 +@n -3 +@n -5 +@n Z2 +@n [ +@n ^m +@n l +7 +@n p1 +@n sbd +@n O56 +@n } i7r @o -@o$t -@o'4 -@o'7 -@o+6 -@o@i -@o^Z -@oi1s -@oi5z -@oO12 -@oO25 -@oOA2O52 -@o} -@p-2i2l -@p-3 -@pO23 -@pO31 -@pO53 +@o $t +@o '4 +@o '7 +@o +6 +@o @i +@o ^Z +@o i1s +@o i5z +@o O12 +@o O25 +@o OA2 O52 +@o } +@p -2 i2l +@p -3 +@p O23 +@p O31 +@p O53 @q @r -@r$g -@r'5 -@r+8 -@r-7D3 -@rD2 -@r^$L9 -@r^n -@rl -@ro1s -@rO02Z3 -@rO09 -@rO16O32 -@rO41 -@rO48 -@rO71 +@r $g +@r '5 +@r +8 +@r -7 D3 +@r D2 +@r ^$ L9 +@r ^n +@r l +@r o1s +@r O02 Z3 +@r O09 +@r O16 O32 +@r O41 +@r O48 +@r O71 @s -@s*7AO39 -@sD6 -@s^l -@si1Ho1n -@sl -@ssix -@ssux -@su -@sO07 -@sO35 -@t+3o2t -@t+8 -@t-1 -@t@d -@tR1 -@t^c -@tc$d -@tp1 -@tqO64 -@t} -@u+2[ -@uR4 -@uZ4 -@ul -@uo3c -@uo53 -@uO12 -@uz1 +@s *7A O39 +@s D6 +@s ^l +@s i1H o1n +@s l +@s six +@s sux +@s u +@s O07 +@s O35 +@t +3 o2t +@t +8 +@t -1 +@t @d +@t R1 +@t ^c +@t c $d +@t p1 +@t q O64 +@t } +@u +2 [ +@u R4 +@u Z4 +@u l +@u o3c +@u o53 +@u O12 +@u z1 @v -@v$a -@v'6 -@v+0 -@vZ1$p -@v[ -@vk^w -@vo5g -@vz2O13 -@w[ -@wd -@wO02 -@wz1 +@v $a +@v '6 +@v +0 +@v Z1 $p +@v [ +@v k ^w +@v o5g +@v z2 O13 +@w [ +@w d +@w O02 +@w z1 @x -@x[ -@xc -@xO41o2X +@x [ +@x c +@x O41 o2X @y -@y$rO01 -@y'5R1 -@y^"O05 -@y^G -@y^i -@yi4- -@yo3" -@yO81R8 -@z$! -@z$8 -@z*04[ -@zD5 -@zo43 -@zrO07 -@zO31 -@zO53 -@zz1 +@y $r O01 +@y '5 R1 +@y ^" O05 +@y ^G +@y ^i +@y i4- +@y o3" +@y O81 R8 +@z $! +@z $8 +@z *04 [ +@z D5 +@z o43 +@z r O07 +@z O31 +@z O53 +@z z1 C -C$* -C$1 -C$5 -C$5z4 -C$? -C$E -C$F'8 -C$X -C$a@l -C$f^8 -C$g^9 -C$l -C$lsVu -C$m$? -C$m*15 -C$s -C$x -C'3 -C'5u -C*05^P -C*61 -C*71 -C+1 -C+2 -C+4 -C+5 -C+6 -C+7 -C+9O34 -C+AO53 -C-1 -C-2 -C-4 -C-5 -C-7 -C-9 -C@2o2f -C@g -CCi6Z -CD3 -CD4 -CD5 -CD9-5 -CL1Z1 -CL4 -CL5 -CR0 -CR1 -CR2R8 -CR4 -CT1 -CT3 -CT3sJw -CT4 -CT5 -CT7 -CT8 -CT8o1+ -CT9 -CTA -CZ2 -CZ2q -CZ3 -CZ3-5 -CZ3^% -CZ4 -CZ4O38 -CZ5 -C[+6 -C^0 -C^4z2 -C^5 -C^7 -C^G -C^Hi1/ -C^S -C^To1F -C^W -C^X -C^_ -C^a -C^g -C^k -C^l'6 -C^m -C^w -C^y -C^|i3$ -Cd -Cf -Ci0& -Ci18 -Ci1s -Ci20$a -Ci21 -Ci2I[ -Ci2cr -Ci3-sY| -Ci32'A -Ci3<$E -Ci4P -Ci64 -Ci9v -CiBiO37 -Ck -Ck$2 -Co0P -Co0R -Co1" -Co17 -Co1K] -Co1S -Co1Y -Co1a -Co1e -Co1i -Co1o -Co2 -Co2! -Co2( -Co21 -Co2V -Co2a -Co2i -Co2uz3 -Co31 -Co3D -Co3GC -Co3Sz1 -Co3d -Co4! -Co4$ -Co4( -Co4F -Co4b -Co5S -Co60 -Co6: -Co7( -Co77 -Cp1r -Cq -Cr -Cr$h -Cs.n -Cs04 -Cs29 -Cs49 -Cs4K -Cs4b -Cs5PD0 -Cs62 -Cs7?Z1 -Cs8M -CsMz -Csg5 -Csi2 -Csj'*52 -CsjyR5 -CssN -CuD9 -CO01-5 -CO02 -CO03q -CO04 -CO04O19 -CO12 -CO12^c -CO15 -CO25 -CO31[ -CO42 -CO42T3 -CO48 -CO52 -CO53 -CO73 -CO92 -Cz1 -Cz1'8 -Cz2 -Cz2o04 -Cz2O36 -Cz3O52 -Cz3z2 -Cz4 -C} -D0$) -D0$+ -D0$q -D0$t -D0'B -D0*01} -D0*14 -D0*30t -D0-0z5 -D0@7 -D0@8Z2 -D0@e$& -D0@x -D0D1k -D0L4D1 -D0R0Z5 -D0R2t -D0R4 -D0RA -D0T7O24 -D0Z1sbj -D0^" -D0^/ -D0^G -D0^N -D0^V -D0^u -D0i1 -D0i1V -D0i1h -D0i2m -D0i3m -D0i4o -D0i5ZO3A -D0i5x -D0k -D0kt -D0o0k -D0o1M -D0o1mz3 -D0o2R -D0o2eO35 -D0o3m -D0o3n -D0o3p -D0o4e -D0o6W -D0oB2 -D0p1O15 -D0p1O21 -D0p1z5 -D0s30 -D0s30z3 -D0s4C -D0s7b -D0s9A -D0s@# -D0se6 -D0seh -D0sfw -D0skv -D0smd -D0spe -D0u^E -D0O13 -D0O43 -D0O47 -D0O56 -D0O91c -D0z4o5' -D0} -D0}*54 +C $* +C $1 +C $5 +C $5 z4 +C $? +C $E +C $F '8 +C $X +C $a @l +C $f ^8 +C $g ^9 +C $l +C $l sVu +C $m $? +C $m *15 +C $s +C $x +C '3 +'5 u +C *05 ^P +C *61 +C *71 +C +1 +C +2 +C +4 +C +5 +C +6 +C +7 +C +9 O34 +C +A O53 +C -1 +C -2 +C -4 +C -5 +C -7 +C -9 +C @2 o2f +C @g +C i6Z +C D3 +C D4 +C D5 +C D9 -5 +C L1 Z1 +C L4 +C L5 +C R0 +C R1 +C R2 R8 +C R4 +C T1 +C T3 +C T3 sJw +C T4 +C T5 +C T7 +C T8 +C T8 o1+ +C T9 +C TA +C Z2 +C Z2 q +C Z3 +C Z3 -5 +C Z3 ^% +C Z4 +C Z4 O38 +C Z5 +C [ +6 +C ^0 +C ^4 z2 +C ^5 +C ^7 +C ^G +C ^H i1/ +C ^S +C ^T o1F +C ^W +C ^X +C ^_ +C ^a +C ^g +C ^k +C ^l '6 +C ^m +C ^w +C ^y +C ^| i3$ +C d +C f +C i0& +C i18 +C i1s +C i20 $a +C i21 +C i2I [ +C i2c r +C i3- sY| +C i32 'A +C i3< $E +C i4P +C i64 +C i9v +C iBi O37 +C k +C k $2 +C o0P +C o0R +C o1" +C o17 +C o1K ] +C o1S +C o1Y +C o1a +C o1e +C o1i +C o1o +C o2 +C o2! +C o2( +C o21 +C o2V +C o2a +C o2i +C o2u z3 +C o31 +C o3D +C o3G +C o3S z1 +C o3d +C o4! +C o4$ +C o4( +C o4F +C o4b +C o5S +C o60 +C o6: +C o7( +C o77 +C p1 r +C q +C r +C r $h +C s.n +C s04 +C s29 +C s49 +C s4K +C s4b +C s5P D0 +C s62 +C s7? Z1 +C s8M +C sMz +C sg5 +C si2 +C sj' *52 +C sjy R5 +C ssN +u D9 +C O01 -5 +C O02 +C O03 q +C O04 +C O04 O19 +C O12 +C O12 ^c +C O15 +C O25 +C O31 [ +C O42 +C O42 T3 +C O48 +C O52 +C O53 +C O73 +C O92 +C z1 +C z1 '8 +C z2 +C z2 o04 +C z2 O36 +C z3 O52 +C z3 z2 +C z4 +C } +D0 $) +D0 $q +D0 $t +D0 'B +D0 *01 } +D0 *14 +D0 *30 t +D0 -0 z5 +D0 @8 Z2 +D0 @e $& +D0 D1 k +D0 L4 D1 +D0 R0 Z5 +D0 R2 t +D0 R4 +D0 RA +D0 T7 O24 +D0 Z1 sbj +D0 ^" +o0/ +o0G +D0 ^N +o0V +o0u +D0 i1 +D0 i1V +D0 i1h +D0 i2m +D0 i3m +D0 i4o +D0 i5Z O3A +D0 i5x +D0 k +D0 k t +D0 o0k +D0 o1M +D0 o1m z3 +D0 o2R +D0 o2e O35 +D0 o3m +D0 o3n +D0 o3p +D0 o4e +D0 o6W +D0 oB2 +D0 p1 O15 +D0 p1 O21 +D0 p1 z5 +D0 s30 +D0 s30 z3 +D0 s4C +D0 s7b +D0 s9A +D0 s@# +D0 se6 +D0 seh +D0 sfw +D0 skv +D0 smd +D0 spe +D0 u ^E +D0 O13 +D0 O43 +D0 O47 +D0 O56 +D0 O91 c +D0 z4 o5' +D0 } +D0 } *54 D1 -D1$$ -D1$0 -D1$1 -D1$3 -D1$L -D1$^[ -D1$l -D1$m -D1$r -D1$u -D1'6-3 -D1'7 -D1'A -D1*10Z2 -D1*13 -D1*21 -D1+0 -D1+3 -D1+5 -D1@o -D1C -D1D2 -D1D2^I -D1D4 -D1D5 -D1K -D1L0 -D1L1 -D1L2@9 -D1L3 -D1R0 -D1T1 -D1T2 -D1T3 -D1Z1 -D1Z2O54 -D1Z4 -D1^% -D1^0 -D1^2 -D1^4 -D1^5 -D1^7 -D1^;i2P -D1^N -D1^Q -D1^U -D1^b -D1^d -D1^g -D1^p -D1^s -D1^sz2 -D1^t -D1^u -D1^v -D1fr -D1i0/ -D1i0Z-5 -D1i0h -D1i2t -D1i3! -D1i3K -D1i4p -D1i5+ -D1i5nO53 -D1i8yO23 -D1k -D1l -D1o1d -D1o2c -D1o2g -D1o2h -D1o3O -D1o3Y -D1o4?Z1 -D1o5h -D1o79l -D1o7o -D1p1 -D1p1i4- -D1q -D1r{ -D1sds -D1si6 -D1sih -D1sn_ -D1sv[ -D1t -D1u -D1usD4 -D1O24 -D1O27 -D1O72 -D1O91 -D1z1 -D1z2 -D1z4 -D1z4@4 +D1 $$ +D1 $0 +D1 $1 +D1 $3 +D1 $L +D1 $^ [ +D1 $l +D1 $m +D1 $r +D1 $u +D1 '6 -3 +D1 '7 +D1 'A +D1 *10 Z2 +D1 *13 +D1 *21 +D1 +0 +D1 +3 +D1 +5 +D1 @o +D1 C +D1 D2 +D1 D2 ^I +D1 D4 +D1 D5 +D1 K +D1 L0 +D1 L1 +D1 L2 @9 +D1 L3 +D1 R0 +D1 T1 +D1 T2 +D1 T3 +D1 Z1 +D1 Z2 O54 +D1 Z4 +D1 ^% +D1 ^0 +D1 ^2 +D1 ^4 +D1 ^5 +D1 ^7 +D1 ^; i2P +D1 ^N +D1 ^Q +D1 ^U +D1 ^b +D1 ^d +D1 ^g +D1 ^p +D1 ^s +D1 ^s z2 +D1 ^t +D1 ^u +D1 ^v +D1 f +D1 i0/ +D1 i0Z -5 +D1 i0h +D1 i2t +D1 i3! +D1 i3K +D1 i4p +D1 i5+ +D1 i5n O53 +D1 i8y O23 +D1 k +D1 l +D1 o1d +D1 o2c +D1 o2g +D1 o2h +D1 o3O +D1 o3Y +D1 o4? Z1 +D1 o5h +D1 o79 l +D1 o7o +D1 p1 +D1 p1 i4- +D1 q +D1 r { +D1 sds +D1 si6 +D1 sih +D1 sn_ +D1 sv[ +D1 t +D1 u +D1 u sD4 +D1 O24 +D1 O27 +D1 O72 +D1 O91 +D1 z1 +D1 z2 +D1 z4 +D1 z4 @4 D2 -D2$$ -D2$$u -D2$+D0 -D2$, -D2$. -D2$0 -D2$1 -D2$; -D2$@ -D2$IZ1 -D2$S -D2$` -D2$f -D2$l -D2$mo5: -D2$o -D2$t -D2$w -D2'6 -D2'7 -D2'A -D2*02 -D2*46 -D2*53 -D2+3 -D2+5i5# -D2-5 -D2-6 -D2@c -D2@iO32 -D2@n -D2C -D2D2 -D2D3 -D2L2 -D2R1 -D2R4 -D2R6 -D2T0 -D2T3 -D2T4 -D2T5 -D2T6 -D2T6sdy -D2Z1p1 -D2Z2 -D2Z4 -D2^, -D2^1 -D2^6 -D2^B -D2^N -D2^ar -D2^f -D2^m -D2c -D2c$N -D2cL3 -D2d -D2di1g -D2do5e -D2i49 -D2i5C -D2i6r -D2i6u -D2i7i -D2l -D2o0: -D2o0D -D2o0l -D2o1l{ -D2o1o -D2o2S -D2o4 -D2o6 -D2o6B -D2o6h -D2o6y -D2o7q -D2s1` -D2s3- -D2sgc -D2sgy -D2sm1 -D2soV -D2suq -D2t -D2tZ3 -D2u -D2u'4 -D2O07 -D2O14Z4 -D2O32z2 -D2O34-1 -D2O45 -D2O53 -D2O73 -D2O84 -D2z1 -D2z1u -D2z2 -D2z4 -D2z4u -D2} +D2 $$ +D2 $$ u +D2 $+ D0 +D2 $, +D2 $. +D2 $1 +D2 $; +D2 $@ +D2 $I Z1 +D2 $S +D2 $` +D2 $f +D2 $l +D2 $m o5: +D2 $o +D2 $t +D2 $w +D2 '6 +D2 '7 +D2 'A +D2 *02 +D2 *46 +D2 *53 +D2 +3 +D2 +5 i5# +D2 -5 +D2 -6 +D2 @c +D2 @i O32 +D2 @n +D2 C +D2 D2 +D2 D3 +D2 L2 +D2 R1 +D2 R4 +D2 R6 +D2 T0 +D2 T3 +D2 T4 +D2 T5 +D2 T6 +D2 T6 sdy +D2 Z1 p1 +D2 Z2 +D2 Z4 +D2 ^, +D2 ^1 +D2 ^6 +D2 ^B +D2 ^N +D2 ^a r +D2 ^f +D2 ^m +D2 c +D2 c $N +D2 c L3 +D2 d +D2 d i1g +D2 d o5e +D2 i49 +D2 i5C +D2 i6r +D2 i6u +D2 i7i +D2 l +D2 o0: +D2 o0D +D2 o0l +D2 o1l { +D2 o1o +D2 o2S +D2 o4 +D2 o6 +D2 o6B +D2 o6h +D2 o6y +D2 o7q +D2 s1` +D2 s3- +D2 sgc +D2 sgy +D2 sm1 +D2 soV +D2 suq +D2 t +D2 t Z3 +D2 u +D2 u '4 +D2 O07 +D2 O14 Z4 +D2 O32 z2 +D2 O34 -1 +D2 O45 +D2 O53 +D2 O73 +D2 O84 +D2 z1 +D2 z1 u +D2 z2 +D2 z4 +D2 z4 u +D2 } D3 -D3$ -D3$* -D3$. -D3$0 -D3$2 -D3$? -D3$H -D3$X -D3$a -D3$b -D3$g -D3$w -D3$x -D3$z -D3'7 -D3'B -D3*34 -D3*4AO06 -D3*51 -D3*56 -D3*56k -D3+1 -D3+4Z5 -D3+6 -D3+6} -D3+AO64 -D3-1 -D3-1c -D3-6 -D3-8 -D3@6 -D3@d -D3@j^A -D3@t -D3C$1 -D3D8 -D3DBO07 -D3R0 -D3R2 -D3R3 -D3T3 -D3T5 -D3Z1o1q -D3Z3 -D3Z4^H -D3] -D3^6 -D3^8 -D3^J -D3^O -D3^c -D3^eo2. -D3^i*42 -D3^p -D3^z -D3c -D3csAl -D3d -D3d*30 -D3i0' -D3i0L -D3i0i -D3i2. -D3i24 -D3i3_ -D3i4* -D3i4k -D3i4m -D3i5n -D3k -D3l -D3l$n -D3o0N -D3o0S -D3o0b -D3o0hs!n -D3o13 -D3o1g -D3o1h -D3o1z[ -D3o2_ -D3o33[ -D3o3hd -D3o3jZ2 -D3o55 -D3o5t -D3o6n -D3o71O54 -D3o8i -D3o8y -D3p1+6 -D3q -D3s3 -D3s9D -D3sao -D3sbz -D3sea -D3slWO65 -D3t -D3tZ1 -D3u$4 -D3O32C -D3O41^s -D3O47 -D3O71 -D3OA1D4 -D3OA1O54 -D3z1 -D3z2 -D3z3 -D3z3t -D3z4 -D3z5 +D3 $ +D3 $* +D3 $. +D3 $0 +D3 $2 +D3 $? +D3 $H +D3 $X +D3 $b +D3 $g +D3 $w +D3 $x +D3 $z +D3 '7 +D3 'B +D3 *34 +D3 *4A O06 +D3 *51 +D3 *56 +D3 *56 k +D3 +1 +D3 +4 Z5 +D3 +6 +D3 +6 } +D3 +A O64 +D3 -1 +D3 -1 c +D3 -6 +D3 -8 +D3 @6 +D3 @d +D3 @j ^A +D3 @t +D3 C $1 +D3 D8 +D3 DB O07 +D3 R0 +D3 R2 +D3 R3 +D3 T3 +D3 T5 +D3 Z1 o1q +D3 Z3 +D3 Z4 ^H +D3 ] +D3 ^6 +D3 ^8 +D3 ^J +D3 ^O +D3 ^c +D3 ^e o2. +D3 ^i *42 +D3 ^p +D3 ^z +D3 c +D3 c sAl +D3 d +D3 d *30 +D3 i0' +D3 i0L +D3 i0i +D3 i2. +D3 i24 +D3 i3_ +D3 i4* +D3 i4k +D3 i4m +D3 i5n +D3 k +D3 l +D3 l $n +D3 o0N +D3 o0S +D3 o0b +D3 o0h s!n +D3 o13 +D3 o1g +D3 o1h +D3 o1z [ +D3 o2_ +D3 o33 [ +D3 o3h d +D3 o3j Z2 +D3 o55 +D3 o5t +D3 o6n +D3 o71 O54 +D3 o8i +D3 o8y +D3 p1 +6 +D3 q +D3 s3 +D3 s9D +D3 sao +D3 sbz +D3 sea +D3 slW O65 +D3 t +D3 t Z1 +D3 u $4 +D3 O32 C +D3 O41 ^s +D3 O47 +D3 O71 +D3 OA1 D4 +D3 OA1 O54 +D3 z1 +D3 z2 +D3 z3 +D3 z3 t +D3 z4 +D3 z5 D4 -D4$# -D4$$ -D4$&-0 -D4$0 -D4$1 -D4$Q -D4$So1* -D4$` -D4$cc -D4$f -D4$q -D4$u -D4'7 -D4'7C -D4*14 -D4*15 -D4*21T4 -D4*25 -D4*62 -D4*85 -D4+3 -D4-7 -D4-B -D4@h -D4D1$/ -D4D2{ -D4D7 -D4L5 -D4L6 -D4R3 -D4T1 -D4T5 -D4T6 -D4Z1 -D4Z2D0 -D4Z3O32 -D4[$y -D4]o6m -D4^0*20 -D4^A -D4^K -D4^X -D4^Y -D4^p -D4^q -D4^x -D4^z -D4f -D4i20 -D4i3l -D4i4C -D4i6s -D4i7u -D4kL7 -D4l*87 -D4o0b -D4o0g -D4o0m -D4o13 -D4o2b -D4o4 -D4o4/ -D4o4@s9R -D4o4p -D4o4} -D4o5+D4 -D4o5_T0 -D4o5k -D4o7b -D4o7o -D4o83 -D4p1 -D4q -D4r -D4s.? -D4s3v -D4sahK -D4sg -D4sg- -D4sj# -D4sj9^H -D4skD -D4ssx -D4stG -D4sxp -D4t -D4t{ -D4O02 -D4O31Z5 -D4O32Z4 -D4O65 -D4OB1O04 -D4z1O62 -D4z1} -D4z2^h -D4z4i9a -D4{O21 -D4} +D4 $# +D4 $$ +D4 $& -0 +D4 $0 +D4 $1 +D4 $Q +D4 $S o1* +D4 $` +D4 $c c +D4 $f +D4 $q +D4 $u +D4 '7 +D4 '7 C +D4 *14 +D4 *15 +D4 *21 T4 +D4 *25 +D4 *62 +D4 *85 +D4 +3 +D4 -7 +D4 -B +D4 @h +D4 D1 $/ +D4 D2 { +D4 D7 +D4 L5 +D4 L6 +D4 R3 +D4 T1 +D4 T5 +D4 T6 +D4 Z1 +D4 Z2 D0 +D4 Z3 O32 +D4 [ $y +D4 ] o6m +D4 ^0 *20 +D4 ^A +D4 ^K +D4 ^X +D4 ^Y +D4 ^p +D4 ^q +D4 ^x +D4 ^z +D4 f +D4 i20 +D4 i3l +D4 i4C +D4 i6s +D4 i7u +D4 k L7 +D4 l *87 +D4 o0b +D4 o0g +D4 o0m +D4 o13 +D4 o2b +D4 o4 +D4 o4/ +D4 o4@ s9R +D4 o4p +D4 o4} +D4 o5+ D4 +D4 o5_ T0 +D4 o5k +D4 o7b +D4 o7o +D4 o83 +D4 p1 +D4 q +D4 r +D4 s.? +D4 s3v +D4 sah K +D4 sg +D4 sg- +D4 sj# +D4 sj9 ^H +D4 skD +D4 ssx +D4 stG +D4 sxp +D4 t +D4 t { +D4 O02 +D4 O31 Z5 +D4 O32 Z4 +D4 O65 +D4 OB1 O04 +D4 z1 O62 +D4 z1 } +D4 z2 ^h +D4 z4 i9a +D4 { O21 +D4 } D5 -D5$" -D5$1 -D5$1T6 -D5$7 -D5$R -D5$a -D5$i -D5$w -D5'B -D5*12 -D5*24 -D5*41 -D5*45 -D5*46 -D5*57 -D5*65 -D5+6 -D5-1i83 -D5-8 -D5@9z1 -D5@i -D5@k -D5@r -D5D7 -D5DA -D5K*43 -D5K+2 -D5L4 -D5L8 -D5R1 -D5R4 -D5T0 -D5Z2*05 -D5[$z -D5^) -D5^6 -D5^: -D5^J -D5^g -D5^o -D5d -D5i0p -D5i1j -D5i2 -D5i3o-3 -D5i4B -D5i6f -D5i72 -D5i7c -D5l -D5o0- -D5o0H -D5o1a -D5o2_ -D5o3%Z1 -D5o3q -D5o4# -D5o4+ -D5o4l -D5o57R6 -D5o5 -Kz2O23 -Kz3$3 -Kz4 -K{ -K{z2 -K} -K}o5v -K}} -L0$(Z2 -L0$O[ -L0$g -L0$l -L0*13T1 -L0+1 -L0+2 -L0+3o0$ -L0+4o5K -L0-5 -L0-7 -L0L0 -L0L1 -L0L5 -L0R0 -L0T0s67 -L0T2 -L0Z1 -L0Z2Z2 -L0Z5 -L0[o78 -L0^K -L0^f -L0^h -L0^sl -L0^w -L0^z -L0c -L0dO19 -L0i0O -L0i2/$i -L0i60 -L0l'7 -L0o1. -L0o21 -L0o21z1 -L0o2a -L0o4D -L0o56 -L0o5c -L0p1 -L0s6u -L0sdu -L0u -L0O02^A -L0O05$D -L0O12 -L0O14i14 -L0O14u -L0O16 -L0O17 -L0O26 -L0O31 -L0O41 -L0O46 -L0O51 -L0O53 -L0z1 -L0z2 -L0z3i8U -L0{ -L0} +DB $4 +DB $6 +DB $7 +DB $e +C 'B +DB D0 +DB l +DB l +A +DB oB! +DB s68 +DB O05 +DB O06 +DB O13 +DB O15 +DB O62 +DB O64 +DB O71 +DB O76 O41 +DB O91 +K $$ +K $0 z1 +K $2 +K $9 +K $G +K $H c +K $c +K $d i1: +K $e +K $f +K $g +K $h +K $i +K $j s-a +K $q +K $s +K $z [ +K *13 +K *16 +K *25 *30 +K *32 +K *43 +K *53 O41 +K *54 +K *62 z3 +K +1 +K +1 *50 +K +2 +K -5 *43 +K C ^c +K R3 +K T0 o6m +K Z1 +K Z1 R4 +K Z1 i6- +K Z2 +K Z3 +K Z4 +K Z4 *15 +K Z5 +K [ +K [ } +K ^0 +K ^0 +0 +K ^2 +K ^= +K ^H +K ^K +K ^S +K ^S i5w +K ^_ +K ^f +K ^g +K ^l +K ^o $z +K ^y +K c +K c i00 +K d u +K d O0B +K f +K i04 l +K i05 +K i0J +K i0x z1 +K i2- R4 +K i2F +K i37 +K i3N +K i3m +K i3t +K i4a l +K i4s +K i6s +K k $d +K k o4p +K o1F *74 +K o1i +K o2$ +K o2- +K o25 +K o3- +K o34 +K o3d +K o40 +K o40 Z1 +K o48 +K o56 +K o5o +K o5r i6= +K o5y +K o82 +K p1 c +K p2 O1A +K q +K r *46 +K r p1 +K se4 i4+ +K ser +K sex +K srp o4d +K szs +K t +K t *45 +K u Z1 +K u r +K O03 p1 +K O21 +K O32 +K O42 +K z1 +K z2 +K z2 R7 +K z2 i5> +K z2 O23 +K z3 $3 +K z4 +K { +K { z2 +K } +K } o5v +K } } +L0 $( Z2 +$O [ +L0 $g +L0 $l +L0 *13 T1 +L0 +1 +L0 +2 ++3 o0$ +L0 +4 o5K +L0 -5 +L0 -7 +L0 L0 +L0 L1 +L0 L5 +L0 R0 +L0 T0 s67 +L0 T2 +L0 Z1 +L0 Z2 Z2 +L0 Z5 +[ o78 +L0 ^K +L0 ^f +L0 ^h +L0 ^s l +L0 ^w +L0 ^z +L0 c +L0 d O19 +L0 i0O +L0 i2/ $i +L0 i60 +L0 l '7 +L0 o1. +L0 o21 +L0 o21 z1 +L0 o2a +L0 o4D +L0 o56 +L0 o5c +L0 p1 +L0 s6u +L0 sdu +L0 u +L0 O02 ^A +L0 O05 $D +L0 O12 +L0 O14 i14 +L0 O14 u +L0 O16 +L0 O17 +L0 O26 +L0 O31 +L0 O41 +L0 O46 +L0 O51 +L0 O53 +L0 z1 +L0 z2 +L0 z3 i8U +L0 { +L0 } L1 -L1$3R1 -L1$M$d -L1$d -L1$xO19 -L1'3 -L1*15 -L1*62 -L1*79D6 -L1+1 -L1+7 -L1-0 -L1-4 -L1-7 -L1D5'9 -L1R0 -L1R1 -L1R5 -L1T0 -L1Z1+5 -L1Z5O52 -L1[ -L1^Z*45 -L1^o -L1^r*7A -L1i0L -L1i0h -L1i0z -L1i27 -L1i2f -L1i3e -L1i4d -L1o0L -L1o1ti4b -L1o25 -L1o2n -L1o8`O67 -L1p1o3w -L1qz5 -L1s#U -L1sa3 -L1sw@'6 -L1t -L1O23 -L1O26 -L1O35 -L1O41 -L1O42 -L1O52 -L1z1 -L1z1*58 -L1z4^ -L1{ -L1{z4 +L1 $3 R1 +L1 $M $d +L1 $d +L1 $x O19 +L1 '3 +L1 *15 +L1 *62 +L1 *79 D6 +L1 +1 +L1 +7 +L1 -0 +L1 -4 +L1 -7 +L1 D5 '9 +L1 R0 +L1 R1 +L1 R5 +L1 T0 +L1 Z1 +5 +L1 Z5 O52 +L1 [ +L1 ^Z *45 +L1 ^o +L1 ^r *7A +L1 i0L +L1 i0h +L1 i0z +L1 i27 +L1 i2f +L1 i3e +L1 i4d +L1 o0L +o1t i4b +L1 o25 +L1 o2n +L1 o8` O67 +L1 p1 o3w +L1 q z5 +L1 s#U +L1 sa3 +L1 sw@ '6 +L1 t +L1 O23 +L1 O26 +L1 O35 +L1 O41 +L1 O42 +L1 O52 +L1 z1 +L1 z1 *58 +L1 z4 ^ +L1 { +L1 { z4 L2 -L2$-i4e -L2$7O26 -L2$al -L2'4z3 -L2'5i3d -L2*14$/ -L2*23d -L2*3AO34 -L2+5 -L2-1 -L2@3 -L2@9 -L2@l -L2@mR3 -L2D3 -L2L4 -L2L7D0 -L2LAO49 -L2R2 -L2R4 -L2T1 -L2Z1 -L2Z2 -L2Z5 -L2^b -L2i2vi2s -L2i3l -L2o6`$8 -L2o7a -L2p1 -L2r -L2r$; -L2s6u -L2s9d -L2sd_C -L2sds -L2t -L2u -L2O02 -L2O02Z1 -L2O38$Q -L2z2 -L2z3 -L2} +L2 $- i4e +L2 $7 O26 +L2 $a l +L2 '4 z3 +L2 '5 i3d +L2 *14 $/ +L2 *23 d +L2 *3A O34 +L2 +5 +L2 -1 +L2 @3 +L2 @9 +L2 @l +L2 @m R3 +L2 D3 +L2 L4 +L2 L7 D0 +L2 LA O49 +L2 R2 +L2 R4 +L2 T1 +L2 Z1 +L2 Z2 +L2 Z5 +L2 ^b +L2 i2v i2s +L2 i3l +L2 o6` $8 +L2 o7a +L2 p1 +L2 r +L2 r $; +L2 s6u +L2 s9d +L2 sd_ C +L2 sds +L2 t +L2 u +L2 O02 +L2 O02 Z1 +L2 O38 $Q +L2 z2 +L2 z3 +L2 } L3 -L3$a-1 -L3$q -L3$v[ -L3*32 -L3*35 -L3*79 -L3+0'6 -L3+1 -L3+2$4 -L3+3 -L3+3$l -L3+4 -L3+5 -L3-4 -L3-4$e -L3-5 -L3-6 -L3-8O24 -L3@6 -L3@z -L3C^T -L3Ko3c -L3L1 -L3R3 -L3Z1 -L3Z3 -L3Z4O67 -L3[ -L3^E -L3^H -L3^J -L3c^d -L3d -L3i4; -L3i4k -L3l -L3o0[ -L3o56 -L3sb` -L3sl` -L3slkT0 -L3swjO32 -L3O02 -L3O34Z4 -L3O52 -L3O62 -L3z1 -L3z2saV -L3z4 -L3{ -L3} +L3 $a -1 +L3 $q +L3 $v [ +L3 *32 +L3 *35 +L3 *79 +L3 +0 '6 +L3 +1 +L3 +2 $4 +L3 +3 +L3 +3 $l +L3 +4 +L3 +5 +L3 -4 +L3 -4 $e +L3 -5 +L3 -6 +L3 -8 O24 +L3 @6 +L3 @z +L3 C ^T +L3 K o3c +L3 L1 +L3 R3 +L3 Z1 +L3 Z3 +L3 Z4 O67 +L3 [ +L3 ^E +L3 ^H +L3 ^J +L3 c ^d +L3 d +L3 i4; +L3 i4k +L3 l +L3 o0[ +L3 o56 +L3 sb` +L3 sl` +L3 slk T0 +L3 swj O32 +L3 O02 +L3 O34 Z4 +L3 O52 +L3 O62 +L3 z1 +L3 z2 saV +L3 z4 +L3 { +L3 } L4 -L4$3 -L4'5 -L4'6 -L4*14 -L4+5o49 -L4-6 -L4@0 -L4D3 -L4L4 -L4R0 -L4T1-5 -L4Z1 -L4Z2 -L4Z3 -L4Z4 -L4[ -L4^aO16 -L4^e -L4i0X -L4i2Wo4z -L4i2a -L4l -L4o2a@< -L4r -L4tD2 -L4u -L4u$O -L4O04 -L4O37-3 -L4z1 +L4 $3 +L4 '5 +L4 '6 +L4 *14 ++5 o49 +L4 -6 +L4 @0 +L4 D3 +L4 L4 +L4 R0 +L4 T1 -5 +L4 Z1 +L4 Z2 +L4 Z3 +L4 Z4 +L4 [ +L4 ^a O16 +L4 ^e +L4 i0X +L4 i2W o4z +L4 i2a +L4 l +L4 o2a @< +L4 r +L4 t D2 +L4 u +L4 u $O +L4 O04 +L4 O37 -3 +L4 z1 L5 -L5$3 -L5$j -L5$n -L5$y -L5'7 -L5*02 -L5*21 -L5*23] -L5*34 -L5*39c -L5-2 -L5-5 -L5@9 -L5D0 -L5L5 -L5R1 -L5R5 -L5Z1 -L5Z1O62 -L5Z2 -L5Z3 -L5^G -L5^G} -L5^d -L5c -L5d -L5i4 +1 -L5i5h -L5i5o -L5i6g -L5l -L5o0W -L5o3 z2 -L5o3d -L5o6k -L5o6s -L5seo -L5sgw -L5st6R5 -L5t -L5O04 -L5O32 -L5O62 -L5z1 -L5{*30 -L5{i5# +L5 $3 +L5 $j +L5 $n +L5 $y +L5 '7 +L5 *02 +L5 *21 +L5 *23 ] +L5 *34 +L5 *39 c +L5 -2 +L5 -5 +L5 @9 +L5 D0 +L5 L5 +L5 R1 +L5 R5 +L5 Z1 +L5 Z1 O62 +L5 Z2 +L5 Z3 +L5 ^G +L5 ^G } +L5 ^d +L5 c +L5 d +L5 i4 +1 +L5 i5h +L5 i5o +L5 i6g +L5 l +L5 o0W +L5 o3 z2 +L5 o3d +L5 o6k +L5 o6s +L5 seo +L5 sgw +L5 st6 R5 +L5 t +L5 O04 +L5 O32 +L5 O62 +L5 z1 +L5 { *30 +L5 { i5# L6 -L6$* -L6$2 -L6$6L5 -L6$MT7 -L6$e -L6$h -L6$pO17 -L6$x -L6$y -L6'9 -L6*2A -L6*50] -L6+4 -L6+6'9 -L6D3 -L6D5 -L6L7 -L6R3 -L6R6 -L6Z1 -L6Z2 -L6[ -L6^VK -L6^a -L6^u$k -L6o2g -L6o9!Z2 -L6r -L6s61 -L6tT4 -L6O06 -L6O35$_ -L6O4B -L6O56sm2 -L6O71 -L6O72 -L6z1R0 +L6 $* +L6 $2 +L6 $6 L5 +L6 $M T7 +L6 $e +L6 $h +L6 $p O17 +L6 $x +L6 $y +L6 '9 +L6 *2A +L6 *50 ] +L6 +4 +L6 +6 '9 +L6 D3 +L6 D5 +L6 L7 +L6 R3 +L6 R6 +L6 Z1 +L6 Z2 +L6 [ +L6 ^V K +L6 ^a +L6 ^u $k +L6 o2g +L6 o9! Z2 +L6 r +L6 s61 +L6 t T4 +L6 O06 +L6 O35 $_ +L6 O4B +L6 O56 sm2 +L6 O71 +L6 O72 +L6 z1 R0 L7 -L7$4 -L7$j -L7$k -L7$r -L7$u -L7'8 -L7'9 -L7*03*38 -L7*13 -L7*17 -L7*47 -L7*63 -L7*67 -L7-1 -L7@3 -L7@9[ -L7R7 -L7Z1k -L7c -L7i6d -L7i75 -L7l -L7o07 -L7o6. -L7o6h -L7ri0x -L7sj=} -L7t -L7tT1 -L7O07 -L7O15 -L7O24d -L7O31 -L7O52 -L7O74 -L7O82 +L7 $4 +L7 $j +L7 $k +L7 $r +L7 $u +L7 '8 +L7 '9 +L7 *03 *38 +L7 *13 +L7 *17 +L7 *47 +L7 *63 +L7 *67 +L7 -1 +L7 @3 +L7 @9 [ +L7 R7 +L7 Z1 k +L7 c +L7 i6d +L7 i75 +L7 l +L7 o07 +L7 o6. +L7 o6h +L7 r i0x +L7 sj= } +L7 t +L7 t T1 +L7 O07 +L7 O15 +L7 O24 d +L7 O31 +L7 O52 +L7 O74 +L7 O82 L8 -L8$UO45 -L8'9 -L8*08 -L8*52 -L8+8 -L8Z2 -L8i2{ -L8i8m -L8s5s -L8sp` -L8O17 -L8O21 -L8O25 -L8O31 -L8O35 -L8O61O05 -L8O92 -L8{ -L8{*78 +$U O45 +L8 '9 +L8 *08 +L8 *52 +L8 +8 +L8 Z2 +L8 i2{ +L8 i8m +L8 s5s +L8 sp` +L8 O17 +L8 O21 +L8 O25 +L8 O31 +L8 O35 +L8 O61 O05 +L8 O92 +L8 { +L8 { *78 L9 -L9Z1 -L9[ -L9^jO58 -L9l -L9O24 -L9O35 -L9O42 -L9O62 -L9O6AZ1 -L9O72 -L9O82u +L9 Z1 +L9 [ +L9 ^j O58 +L9 l +L9 O24 +L9 O35 +L9 O42 +L9 O62 +L9 O6A Z1 +L9 O72 +L9 O82 u LA -LA*B5'8 -LAZ4O95 -LAZ5O4A -LAcO25 -LAi7eO85 -LAo4N@3 -LAO05 -LAO3BZ1 -LAO82 -LBshqO58 -LBO02 -LBO13O63 -LBO53 -LBO92 +*B5 '8 +LA Z4 O95 +LA Z5 O4A +LA c O25 +LA i7e O85 +LA o4N @3 +LA O05 +LA O3B Z1 +LA O82 +LB shq O58 +LB O02 +LB O13 O63 +LB O53 +LB O92 R0 -R0$!*06 -R0$3 -R0$8 -R0$m -R0$n -R0$o -R0'1 -R0'3 -R0'4 -R0*06 -R0*08 -R0*09 -R0*37 -R0+3 -R0+3t -R0-6 -R0-7 -R0@d -R0@e -R0C -R0D1i1I -R0D5 -R0D6 -R0K -R0L3 -R0R2 -R0T1*17 -R0Z1 -R0Z2 -R0Z4+1 -R0Z5 -R0[o58 -R0^# -R0^1 -R0^2 -R0^4 -R0^9 -R0^B -R0^D -R0^E -R0^T -R0^g -R0^s -R0^y -R0i0u -R0i1% -R0i15 -R0i16 -R0i1e -R0i2a -R0i4b -R0k*16 -R0l -R0o1 -R0o1L -R0o1r -R0o22 -R0o3$ -R0o5M -R0p1 -R0p2 -R0p5 -R0q -R0r -R0shd -R0u -R0O12$z -R0O12c -R0O13 -R0O24 -R0O26z1 -R0O35 -R0z1 -R0z1D2 -R0z2 -R0z2spt -R0z3 -R0z3C -R0z4 -R0z4+0 -R0z5 -R0z5O72 -R0} -R0}*38 +R0 $! *06 +R0 $3 +R0 $8 +R0 $m +R0 $n +R0 $o +R0 '1 +R0 '3 +R0 '4 +R0 *06 +R0 *08 +R0 *09 +R0 *37 +R0 +3 +R0 +3 t +R0 -6 +R0 -7 +R0 @d +R0 @e +R0 C +R0 D1 i1I +R0 D5 +R0 D6 +R0 K +R0 L3 +R0 R2 +R0 T1 *17 +R0 Z1 +R0 Z2 +R0 Z4 +1 +R0 Z5 +[ o58 +R0 ^# +R0 ^1 +R0 ^2 +R0 ^4 +R0 ^9 +R0 ^B +R0 ^D +R0 ^E +R0 ^T +R0 ^g +R0 ^s +R0 ^y +R0 i0u +R0 i1% +R0 i15 +R0 i16 +R0 i1e +R0 i2a +R0 i4b +R0 k *16 +R0 l +R0 o1 +R0 o1L +R0 o1r +R0 o22 +R0 o3$ +R0 o5M +R0 p1 +R0 p2 +R0 p5 +R0 q +R0 r +R0 shd +R0 u +R0 O12 $z +R0 O12 c +R0 O13 +R0 O24 +R0 O26 z1 +R0 O35 +R0 z1 +R0 z1 D2 +R0 z2 +R0 z2 spt +R0 z3 +R0 z3 C +R0 z4 +R0 z4 +0 +R0 z5 +R0 z5 O72 +R0 } +R0 } *38 R1 -R1$! -R1$$^> -R1$0 -R1$5 -R1$7 -R1$c -R1$u -R1$x*48 -R1'4 -R1'7 -R1*03 -R1*12 -R1+4 -R1-3 -R1-5 -R1-7 -R1@"+3 -R1@d -R1@i -R1C -R1Co0Q -R1D7 -R1L5i2m -R1L8k -R1R0{ -R1R2 -R1R3 -R1R4 -R1Z4 -R1Z4i4% -R1[] -R1] -R1^4 -R1^>i6l -R1^g -R1^p -R1^r -R1c -R1d -R1f -R1i01 -R1i03O49 -R1i1P -R1i3" -R1i5& -R1o07 -R1o0P -R1o0e -R1o2h -R1o3i -R1o4B -R1r -R1s9) -R1se< -R1sedO35 -R1sfn -R1shc -R1sx" -R1t -R1O02O76 -R1O03'5 -R1O23 -R1O28 -R1O42 -R1O53 -R1z2 -R1z3l -R1z4 -R1z5 -R1}k +R1 $! +R1 $$ ^> +R1 $0 +R1 $5 +R1 $7 +R1 $c +R1 $u +R1 $x *48 +R1 '4 +R1 '7 +R1 *03 +R1 *12 +R1 +4 +R1 -3 +R1 -5 +R1 -7 +R1 @" +3 +R1 @d +R1 @i +R1 C +R1 C o0Q +R1 D7 +R1 L5 i2m +R1 L8 k +R1 R0 { +R1 R2 +R1 R3 +R1 R4 +R1 Z4 +R1 Z4 i4% +R1 [ ] +R1 ] +R1 ^4 +R1 ^> i6l +R1 ^g +R1 ^p +R1 ^r +R1 c +R1 d +R1 f +R1 i01 +R1 i03 O49 +R1 i1P +R1 i3" +R1 i5& +R1 o07 +R1 o0P +R1 o0e +R1 o2h +R1 o3i +R1 o4B +R1 r +R1 s9) +R1 se< +R1 sed O35 +R1 sfn +R1 shc +R1 sx" +R1 t +R1 O02 O76 +R1 O03 '5 +R1 O23 +R1 O28 +R1 O42 +R1 O53 +R1 z2 +R1 z3 l +R1 z4 +R1 z5 +R1 } k R2 -R2$+@6 -R2$N -R2$Z+3 -R2*24 -R2*57O15 -R2*61 -R2*70O39 -R2+1 -R2+3 -R2-9O16 -R2@9 -R2D2^b -R2KZ1 -R2L1 -R2L7 -R2T2 -R2Z2Z5 -R2Z2O19 -R2^ -R2^V -R2^b -R2^d -R2d -R2f -R2i00 -R2i28 -R2l -R2o2n^c -R2o4(s(1 -R2o5o -R2o5v -R2r -R2u -R2O21@p -R2O41 -R2O51 -R2O62 -R2{^7 -R2} +R2 $+ @6 +R2 $N +R2 $Z +3 +R2 *24 +R2 *57 O15 +R2 *61 +R2 *70 O39 +R2 +1 +R2 +3 +R2 -9 O16 +R2 @9 +D2 ^b +R2 K Z1 +R2 L1 +R2 L7 +R2 T2 +R2 Z2 Z5 +R2 Z2 O19 +R2 ^ +R2 ^V +R2 ^b +R2 ^d +R2 d +R2 f +R2 i00 +R2 i28 +R2 l +o2n ^c +R2 o4( s(1 +R2 o5o +R2 o5v +R2 r +R2 u +R2 O21 @p +R2 O41 +R2 O51 +R2 O62 +R2 { ^7 +R2 } R3 -R3$m -R3$rO3B -R3$v -R3'4^z -R3'6 -R3*30 -R3*40 -R3+1 -R3+5 -R3+6 -R3-4 -R3-4o26 -R3-5 -R3-7 -R3@4t -R3@a -R3D5 -R3D9Z1 -R3K -R3Kd -R3L0 -R3L4 -R3Z1^M -R3Z2 -R3Z4 -R3Z5 -R3[ -R3^0 -R3^6 -R3^Wz1 -R3i1i -R3i3# -R3i4t -R3l*46 -R3o1g -R3o1t -R3o2c -R3o47 -R3p1 -R3q -R3qD6 -R3s1j -R3sd<$7 -R3t -R3t-4 -R3O21 -R3O32q -R3O54 -R3O73 -R3z1 -R3z2 +R3 $m +R3 $r O3B +R3 $v +R3 '4 ^z +R3 '6 +R3 *30 +R3 *40 +R3 +1 +R3 +5 +R3 +6 +R3 -4 +R3 -4 o26 +R3 -5 +R3 -7 +R3 @4 t +R3 @a +R3 D5 +R3 D9 Z1 +R3 K +R3 K d +R3 L0 +R3 L4 +R3 Z1 ^M +R3 Z2 +R3 Z4 +R3 Z5 +R3 [ +R3 ^0 +R3 ^6 +R3 ^W z1 +R3 i1i +R3 i3# +R3 i4t +R3 l *46 +R3 o1g +R3 o1t +R3 o2c +R3 o47 +R3 p1 +R3 q +R3 q D6 +R3 s1j +R3 sd< $7 +R3 t +R3 t -4 +R3 O21 +R3 O32 q +R3 O54 +R3 O73 +R3 z1 +R3 z2 R4 -R4$2 -R4$2s7Y -R4$9 -R4$?C -R4$o -R4$v -R4$x -R4'5^l -R4*30 -R4*41 -R4*45R4 -R4*64 -R4*74z2 -R4*87[ -R4+4 -R4+6-5 -R4-5 -R4-5o3o -R4@z+0 -R4D1 -R4D8O23 -R4L0R0 -R4R2 -R4R5 -R4RA -R4T0D2 -R4T5 -R4Z1 -R4Z2 -R4Z2-6 -R4Z3 -R4Z4 -R4Z4D1 -R4^T*03 -R4^Z -R4^_ -R4^e -R4^l -R4d -R4f -R4i0s -R4i2W -R4i2b -R4i2u -R4i3i -R4i45 -R4o0Yi3f -R4o27D0 -R4o2y -R4o59 -R4o7/ -R4oAk{ -R4r -R4s20 -R4s9H -R4smD -R4ss) -R4t -R4O02 -R4O04 -R4O21 -R4O39$r -R4O41@K -R4O53 -R4O56 -R4O57 -R4O63 -R4z1 -R4z3 +R4 $2 +R4 $2 s7Y +R4 $9 +R4 $? C +R4 $o +R4 $v +R4 $x +R4 '5 ^l +R4 *30 +R4 *41 +R4 *45 R4 +R4 *64 +R4 *74 z2 +R4 *87 [ +R4 +4 +R4 +6 -5 +R4 -5 +R4 -5 o3o +R4 @z +0 +R4 D1 +R4 D8 O23 +R4 L0 R0 +R4 R2 +R4 R5 +R4 RA +R4 T0 D2 +R4 T5 +R4 Z1 +R4 Z2 +R4 Z2 -6 +R4 Z3 +R4 Z4 +R4 Z4 D1 +R4 ^T *03 +R4 ^Z +R4 ^_ +R4 ^e +R4 ^l +R4 d +R4 f +R4 i0s +R4 i2W +R4 i2b +R4 i2u +R4 i3i +R4 i45 +R4 o0Y i3f +R4 o27 D0 +R4 o2y +R4 o59 +R4 o7/ +R4 oAk { +R4 r +R4 s20 +R4 s9H +R4 smD +R4 ss) +R4 t +R4 O02 +R4 O04 +R4 O21 +R4 O39 $r +R4 O41 @K +R4 O53 +R4 O56 +R4 O57 +R4 O63 +R4 z1 +R4 z3 R5 -R5$! -R5$-i1( -R5$4 -R5$b -R5$n -R5$v -R5*34 -R5*41Z2 -R5*53 -R5*64O63 -R5*65K -R5+1 -R5+2 -R5-4 -R5@pl -R5D4 -R5K -R5LB -R5R6 -R5T5o64 -R5Z1 -R5Z1O21 -R5Z2 -R5Z3o6> -R5Z4 -R5Z5 -R5[O04 -R5^5i5 -R5^> -R5^_O1B -R5^k -R5^v -R5co36 -R5i1b -R5i2I -R5i2o -R5i5= -R5i5T -R5k -R5l -R5o3Bz2 -R5o3h -R5o6Y$a -R5s1n -R5s1z -R5s2* -R5sd4 -R5se7 -R5sjxz3 -R5st3 -R5st9 -R5u -R5O04 -R5O05 -R5O31 -R5O4As4a -R5O51ssS -R5O63 -R5z1 -R5z1sl2 -R5z1O67 -R5z2 -R5z4O74 +R5 $! +R5 $- i1( +R5 $4 +R5 $b +R5 $n +R5 $v +R5 *34 +R5 *41 Z2 +R5 *53 +R5 *64 O63 +R5 *65 K +R5 +1 +R5 +2 +R5 -4 +R5 @p l +R5 D4 +R5 K +R5 LB +R5 R6 +R5 T5 o64 +R5 Z1 +R5 Z1 O21 +R5 Z2 +R5 Z3 o6> +R5 Z4 +R5 Z5 +R5 [ O04 +R5 ^5 i5 +R5 ^> +R5 ^_ O1B +R5 ^k +R5 ^v +R5 c o36 +R5 i1b +R5 i2I +R5 i2o +R5 i5= +R5 i5T +R5 k +R5 l +R5 o3B z2 +R5 o3h +R5 o6Y $a +R5 s1n +R5 s1z +R5 s2* +R5 sd4 +R5 se7 +R5 sjx z3 +R5 st3 +R5 st9 +R5 u +R5 O04 +R5 O05 +R5 O31 +R5 O4A s4a +R5 O51 ssS +R5 O63 +R5 z1 +R5 z1 sl2 +R5 z1 O67 +R5 z2 +R5 z4 O74 R6 -R6$-r -R6$4 -R6$z -R6*23 -R6*65 -R6*72^N -R6+4 -R6+5 -R6-3 -R6-4*07 -R6-7 -R6@. -R6C*64 -R6D1 -R6D2 -R6D5 -R6L2O62 -R6L6o55 -R6R0 -R6R2 -R6R7 -R6Z1[ -R6Z3 -R6Z4 -R6Z4C -R6[ -R6[$5 -R6^7{ -R6^P -R6^S -R6^p -R6i3a -R6i4LO32 -R6i52 -R6i6A -R6i74 -R6o1y -R6o3g -R6o4d -R6o5: -R6o5a -R6r -R6sc4 -R6ss8 -R6t -R6uo2M -R6O06 -R6O15 -R6O21{ -R6O24 -R6O36 -R6O41 -R6O75 -R6O76 -R6z2 -R6z2*17 -R6z3O18 +R6 $- r +R6 $4 +R6 $z +R6 *23 +R6 *65 +R6 *72 ^N +R6 +4 +R6 +5 +R6 -3 +R6 -4 *07 +R6 -7 +R6 @. +R6 C *64 +R6 D1 +R6 D2 +R6 D5 +R6 L2 O62 +R6 L6 o55 +R6 R0 +R6 R2 +R6 R7 +R6 Z1 [ +R6 Z3 +R6 Z4 +R6 Z4 C +R6 [ +R6 [ $5 +R6 ^7 { +R6 ^P +R6 ^S +R6 ^p +R6 i3a +R6 i4L O32 +R6 i52 +R6 i6A +R6 i74 +R6 o1y +R6 o3g +R6 o4d +R6 o5: +R6 o5a +R6 r +R6 sc4 +R6 ss8 +R6 t +R6 u o2M +R6 O06 +R6 O15 +R6 O21 { +R6 O24 +R6 O36 +R6 O41 +R6 O75 +R6 O76 +R6 z2 +R6 z2 *17 +R6 z3 O18 R7 -R7$x -R7'8 -R7*02 -R7*56 -R7*67 -R7*85z1 -R7*97 -R7+8o7V -R7+9 -R7-5 -R7-6 -R7-Ai80 -R7@E -R7@m -R7@n -R7@v -R7CO05 -R7D3[ -R7T0z4 -R7T4 -R7Z1 -R7Z2 -R7Z3 -R7[ -R7i2F -R7i6V -R7i75 -R7l -R7o0K -R7o0Ml -R7o6 -R7o6@r -R7o6G -R7o88 -R7qO19 -R7sgs -R7syi -R7t -R7O05 -R7O08z5 -R7O12-0 -R7O14 -R7O23d -R7O34 -R7O41 -R7O43 -R7O61 -R7O81 -R7z1 +R7 $x +R7 '8 +R7 *02 +R7 *56 +R7 *67 +R7 *85 z1 +R7 *97 ++8 o7V +R7 +9 +R7 -5 +R7 -6 +R7 -A i80 +R7 @E +R7 @m +R7 @n +R7 @v +R7 C O05 +R7 D3 [ +R7 T0 z4 +R7 T4 +R7 Z1 +R7 Z2 +R7 Z3 +R7 [ +R7 i2F +R7 i6V +R7 i75 +R7 l +R7 o0K +R7 o0M l +R7 o6 +R7 o6@ r +R7 o6G +R7 o88 +R7 q O19 +R7 sgs +R7 syi +R7 t +R7 O05 +R7 O08 z5 +R7 O12 -0 +R7 O14 +R7 O23 d +R7 O34 +R7 O41 +R7 O43 +R7 O61 +R7 O81 +R7 z1 R8 -R8$1 -R8$xO72 -R8-5 -R8D1 -R8R7 -R8Z1 -R8i83 -R8o0a -R8o7eO25 -R8o7x -R8O04 -R8O07 -R8O07z3 -R8O16 -R8O17 -R8O25 -R8O25$3 -R8O31 -R8O32 -R8O34 -R8O43O32 -R8O63@8 -R8z2 +R8 $1 +$x O72 +R8 -5 +R8 D1 +R8 R7 +R8 Z1 +R8 i83 +R8 o0a +R8 o7e O25 +R8 o7x +R8 O04 +R8 O07 +R8 O07 z3 +R8 O16 +R8 O17 +R8 O25 +R8 O25 $3 +R8 O31 +R8 O32 +R8 O34 +R8 O43 O32 +R8 O63 @8 +R8 z2 R9 -R9$0i2s -R9$9 -R9$yO06 -R9*25 -R9*36 -R9*39 -R9-9 -R9D7 -R9R4 -R9Z1 -R9[ -R9u -R9O02 -R9O08 -R9O14 -R9O19$r -R9O24o68 -R9O25 -RA$0 -RA+1O82 -RAD3O75 -RA[ -RAi9XO37 -RAO73 -RAO74z1 -RAOA2O16 -RBD8*02 -RBO02 -RBO09 -RBO74 +R9 $0 i2s +R9 $9 +R9 $y O06 +R9 *25 +R9 *36 +R9 *39 +R9 -9 +R9 D7 +R9 R4 +R9 Z1 +R9 [ +R9 u +R9 O02 +R9 O08 +R9 O14 +R9 O19 $r +R9 O24 o68 +R9 O25 +RA $0 +RA +1 O82 +RA D3 O75 +RA [ +RA i9X O37 +RA O73 +RA O74 z1 +RA OA2 O16 +RB D8 *02 +RB O02 +RB O09 +RB O74 T0 -T0$+ -T0$6 -T0$9 -T0$D -T0$V -T0$Y -T0$b^P -T0$h -T0$j -T0$k -T0$n -T0$o$s -T0$rs7# -T0$s -T0$x -T0'6 -T0'9 -T0*02 -T0*03 -T0*07O21 -T0*43 -T0*9A -T0+5 -T0+6 -T0+7 -T0-4 -T0D3 -T0D6 -T0D8D5 -T0D9 -T0L3 -T0L4 -T0L7 -T0R5 -T0T2 -T0T3 -T0T5 -T0T9 -T0^! -T0^A -T0^D -T0^F -T0^K -T0^S -T0^e -T0d -T0d[ -T0i0? -T0i1O^u -T0i1r -T0i2!k -T0i2d -T0i2p -T0i3: -T0i3m -T0i3s -T0i3u -T0i3y -T0i5H-5 -T0i6_ -T0i7_ -T0i85 -T0i8= -T0o2@i6/ -T0o2B -T0o2M -T0o2S -T0o3L -T0o3v -T0o4O -T0o4r -T0o5q -T0o6r -T0o6s -T0o7 -T0o8C -T0o9A -T0q -T0r*06 -T0s3! -T0sM -T0se4 -T0sgK -T0so -T0spR -T0sr@ -T0st5 -T0std -T0stj -T0t -T0uo6k -T0O06 -T0O12 -T0O13^1 -T0O16 -T0O17 -T0O47 -T0O63 -T0O73@D -T0O74 -T0z2@0 -T0{ +T0 $+ +T0 $6 +T0 $9 +T0 $D +T0 $V +T0 $Y +T0 $b ^P +T0 $h +T0 $j +T0 $k +T0 $n +T0 $o $s +T0 $r s7# +T0 $s +T0 $x +T0 '6 +T0 '9 +T0 *02 +T0 *03 +T0 *07 O21 +T0 *43 +T0 *9A +T0 +5 +T0 +6 +T0 +7 +T0 -4 +T0 D3 +T0 D6 +T0 D8 D5 +T0 D9 +T0 L3 +T0 L4 +T0 L7 +T0 R5 +T0 T2 +T0 T3 +T0 T5 +T0 T9 +T0 ^! +T0 ^A +T0 ^D +T0 ^F +T0 ^K +T0 ^S +T0 ^e +T0 d +T0 d [ +T0 i0? +T0 i1O ^u +T0 i1r +T0 i2! k +T0 i2d +T0 i2p +T0 i3: +T0 i3m +T0 i3s +T0 i3u +T0 i3y +T0 i5H -5 +T0 i6_ +T0 i7_ +T0 i85 +T0 i8= +T0 o2@ i6/ +T0 o2B +T0 o2M +T0 o2S +T0 o3L +T0 o3v +T0 o4O +T0 o4r +T0 o5q +T0 o6r +T0 o6s +T0 o7 +T0 o8C +T0 o9A +T0 q +T0 r *06 +T0 s3! +T0 sM +T0 se4 +T0 sgK +T0 so +T0 spR +T0 sr@ +T0 st5 +T0 std +T0 stj +T0 t +u o6k +T0 O06 +T0 O12 +T0 O13 ^1 +T0 O16 +T0 O17 +T0 O47 +T0 O63 +T0 O73 @D +T0 O74 +T0 z2 @0 +T0 { T1 -T1$' -T1$2Z4 -T1$6 -T1$6O56 -T1$_$W -T1$i -T1$l*63 -T1$qR3 -T1$w -T1'7 -T1'8 -T1'9 -T1*01$n -T1*34o1_ -T1+0 -T1+4 -T1+6 -T1+7 -T1+BO29 -T1-3 -T1@R -T1K -T1T0 -T1T3 -T1T3T5 -T1T3T5T7 -T1T3T5T7T9 -T1T3T5T7T9TB -T1T6 -T1T7 -T1Z1i0S -T1Z4O75 -T1Z5i8) -T1Z5sS7 -T1[ -T1^W -T1^o -T1d -T1f -T1i0@z2 -T1i3m -T1k -T1kC -T1o0' -T1o2g -T1o2w -T1o4w -T1o6- -T1o75@R -T1r -T1sAP+1 -T1sbN -T1si' -T1sr[^x -T1t -T1O15p2 -T1O42 -T1O54 -T1O57 -T1O89c -T1z1 -T1z5 +T1 $' +T1 $2 Z4 +T1 $6 +T1 $6 O56 +T1 $_ $W +T1 $i +T1 $l *63 +T1 $q R3 +T1 $w +T1 '7 +T1 '8 +T1 '9 +T1 *01 $n +*34 o1_ +T1 +0 +T1 +4 +T1 +6 +T1 +7 +T1 +B O29 +T1 -3 +T1 @R +T1 K +T1 T0 +T1 T3 +T1 T3 T5 +T1 T3 T5 T7 +T1 T3 T5 T7 T9 +T1 T3 T5 T7 T9 TB +T1 T6 +T1 T7 +T1 Z1 i0S +T1 Z4 O75 +T1 Z5 i8) +T1 Z5 sS7 +T1 [ +T1 ^W +T1 ^o +T1 d +T1 f +T1 i0@ z2 +T1 i3m +T1 k +k C +T1 o0' +T1 o2g +T1 o2w +T1 o4w +T1 o6- +T1 o75 @R +T1 r +T1 sAP +1 +T1 sbN +T1 si' +T1 sr[ ^x +T1 t +T1 O15 p2 +T1 O42 +T1 O54 +T1 O57 +O89 c +T1 z1 +T1 z5 T2 -T2$! -T2$2 -T2$bo5& -T2'4 -T2'7 -T2*03 -T2*57 -T2-0 -T2@aO64 -T2CD6 -T2D1^) -T2D7 -T2T4 -T2T5 -T2T6 -T2Z1 -T2]$8 -T2^< -T2^Q -T2^` -T2^w -T2d -T2f -T2i00*57 -T2i3m -T2i59 -T2k -T2o06i0* -T2o0V -T2o1A'8 -T2o38 -T2o3P -T2o3o -T2o6! -T2o94u -T2r -T2s03 -T2sA8K -T2sx3 -T2t -T2O02 -T2O41o49 -T2O52*52 -T2O57 -T2O62 -T2z1 +T2 $! +T2 $2 +T2 $b o5& +T2 '4 +T2 '7 +T2 *03 +T2 *57 +T2 -0 +T2 @a O64 +C D6 +T2 D1 ^) +T2 D7 +T2 T4 +T2 T5 +T2 T6 +T2 Z1 +T2 ] $8 +T2 ^< +T2 ^Q +T2 ^` +T2 ^w +T2 d +T2 f +T2 i00 *57 +T2 i3m +T2 i59 +T2 k +T2 o06 i0* +T2 o0V +T2 o1A '8 +T2 o38 +T2 o3P +T2 o3o +T2 o6! +o94 u +T2 r +T2 s03 +T2 sA8 K +T2 sx3 +T2 t +T2 O02 +T2 O41 o49 +T2 O52 *52 +T2 O57 +T2 O62 +T2 z1 T3 -T3$" -T3$1 -T3$4 -T3$D -T3$l -T3$t -T3'5^\ -T3'9 -T3*45^9 -T3+0 -T3-5O63 -T3D6 -T3D7 -T3L0 -T3L3'6 -T3R1O12 -T3T5 -T3T6 -T3T8 -T3Z2 -T3Z3 -T3[ -T3[o3i -T3[O27 -T3^! -T3^% -T3^H -T3^K-0 -T3^oz3 -T3ci4G -T3i3- -T3i3f -T3iBgO17 -T3o0p -T3o1n^t -T3o2C -T3o3iu -T3o4` -T3o71 -T3p1 -T3qL1 -T3qs7b -T3r -T3s0@ -T3si1 -T3smA -T3sr2 -T3tO27 -T3O12 -T3O43 -T3O53 -T3z2 -T3z2$9 -T3} +T3 $" +T3 $1 +T3 $4 +T3 $D +T3 $l +T3 $t +T3 '5 ^\ +T3 '9 +T3 *45 ^9 +T3 +0 +T3 -5 O63 +T3 D6 +T3 D7 +T3 L0 +T3 L3 '6 +T3 R1 O12 +T3 T5 +T3 T6 +T3 T8 +T3 Z2 +T3 Z3 +T3 [ +T3 [ o3i +T3 [ O27 +T3 ^! +T3 ^% +T3 ^H +T3 ^K -0 +T3 ^o z3 +c i4G +T3 i3- +T3 i3f +T3 iBg O17 +T3 o0p +T3 o1n ^t +T3 o2C +o3i u +T3 o4` +T3 o71 +T3 p1 +T3 q L1 +T3 q s7b +T3 r +T3 s0@ +T3 si1 +T3 smA +T3 sr2 +T3 t O27 +T3 O12 +T3 O43 +T3 O53 +T3 z2 +T3 z2 $9 +T3 } T4 -T4$1 -T4$3 -T4$5 -T4$y -T4'8 -T4'A -T4+2 -T4+4 -T4-5 -T4-6 -T4@6 -T4D5 -T4D7 -T4R4 -T4T3 -T4T5 -T4T6T8 -T4TB -T4Z1 -T4Z2 -T4Z4 -T4Z5 -T4[ -T4^2 -T4i3"+3 -T4i4! -T4i4;^4 -T4k -T4o0H -T4o0R -T4o0n -T4o0s -T4o2s -T4o5i -T4o6t -T4o9x -T4p1 -T4r -T4rz1 -T4s2u -T4s32 -T4s3H -T4s4t -T4sIs -T4sTIR6 -T4sau -T4tr -T4O02 -T4O31^7 -T4O36 -T4O54 -T4O56u -T4z3 +T4 $1 +T4 $3 +T4 $5 +T4 $y +T4 '8 +T4 'A +T4 +2 +T4 +4 +T4 -5 +T4 -6 +T4 @6 +T4 D5 +T4 D7 +T4 R4 +T4 T3 +T4 T5 +T4 T6 T8 +T4 TB +T4 Z1 +T4 Z2 +T4 Z4 +T4 Z5 +T4 [ +T4 ^2 +T4 i3" +3 +T4 i4! +T4 i4; ^4 +T4 k +T4 o0H +T4 o0R +T4 o0n +T4 o0s +T4 o2s +T4 o5i +T4 o6t +T4 o9x +T4 p1 +T4 r +T4 r z1 +T4 s2u +T4 s32 +T4 s3H +T4 s4t +T4 sIs +T4 sTI R6 +T4 sau +T4 t r +T4 O02 +T4 O31 ^7 +T4 O36 +T4 O54 +O56 u +T4 z3 T5 -T5$3 -T5$9 -T5$G -T5$e -T5$m*13 -T5$p -T5'6 -T5'B -T5*43 -T5*45 -T5*45T1 -T5*52Z3 -T5*67 -T5*71*92 -T5+6 -T5-0 -T5-3 -T5-6 -T5D1 -T5D3s85 -T5D4 -T5K -T5L5 -T5L9O13 -T5T7 -T5Z1 -T5Z2 -T5[ -T5^. -T5^6 -T5^I -T5^[ -T5^e -T5i0p -T5i11O23 -T5i6Y -T5o0S -T5o1& -T5o2K -T5o4_ -T5p1r -T5s+3 -T5s0+ -T5s2b -T5shn -T5O13 -T5O25u -T5O61 -T5O62 -T5O6A -T5O76 -T5{ -T5} +T5 $3 +T5 $9 +T5 $G +T5 $e +T5 $m *13 +T5 $p +T5 '6 +T5 'B +T5 *43 +T5 *45 +T5 *45 T1 +T5 *52 Z3 +T5 *67 +T5 *71 *92 +T5 +6 +T5 -0 +T5 -3 +T5 -6 +T5 D1 +T5 D3 s85 +T5 D4 +T5 K +T5 L5 +T5 L9 O13 +T5 T7 +T5 Z1 +T5 Z2 +T5 [ +T5 ^. +T5 ^6 +T5 ^I +T5 ^[ +T5 ^e +T5 i0p +T5 i11 O23 +T5 i6Y +T5 o0S +T5 o1& +T5 o2K +T5 o4_ +T5 p1 r +T5 s+3 +T5 s0+ +T5 s2b +T5 shn +T5 O13 +O25 u +T5 O61 +T5 O62 +T5 O6A +T5 O76 +T5 { +T5 } T6 -T6$9 -T6$T -T6$W -T6$Y -T6$a -T6$t -T6'7 -T6'9 -T6*23 -T6*74c -T6+2o5k -T6-7 -T6@h -T6D1 -T6D8 -T6L2*20 -T6R0 -T6T0 -T6T5 -T6T7 -T6T9 -T6Z1 -T6Z1o0l -T6Z2 -T6Z3 -T6[ -T6^2 -T6^9 -T6^V] -T6i0@ -T6i0N -T6o0f -T6o2m -T6o3fs4b -T6o53 -T6o56 -T6s7)@l -T6O02 -T6O12 -T6O14 -T6O24T3 -T6O71 -T6O72 -T6O83 +T6 $9 +T6 $T +T6 $W +T6 $Y +T6 $a +T6 $t +T6 '7 +T6 '9 +T6 *23 +*74 c +T6 +2 o5k +T6 -7 +T6 @h +T6 D1 +T6 D8 +T6 L2 *20 +T6 R0 +T6 T0 +T6 T5 +T6 T7 +T6 T9 +T6 Z1 +T6 Z1 o0l +T6 Z2 +T6 Z3 +T6 [ +T6 ^2 +T6 ^9 +T6 ^V ] +T6 i0@ +T6 i0N +T6 o0f +T6 o2m +T6 o3f s4b +T6 o53 +T6 o56 +T6 s7) @l +T6 O02 +T6 O12 +T6 O14 +T6 O24 T3 +T6 O71 +T6 O72 +T6 O83 T7 -T7$*Z1 -T7$-$m -T7$0 -T7$3 -T7$7 -T7$_ -T7$i -T7$w[ -T7+6t -T7@8 -T7L6O74 -T7RA -T7T0 -T7T2 -T7T3 -T7T4 -T7T8 -T7^1 -T7^2 -T7^Kz1 -T7cO39 -T7i2V -T7i2z -T7o0= -T7o22 -T7o3k -T7o49 -T7o5xu -T7o5z -T7s 6 -T7s6fs4] -T7sgp -T7sjnu -T7t -T7O05 -T7O05o47 -T7O24 +T7 $* Z1 +T7 $- $m +T7 $0 +T7 $3 +T7 $7 +T7 $_ +T7 $i +T7 $w [ +T7 +6 t +T7 @8 +T7 L6 O74 +T7 RA +T7 T0 +T7 T2 +T7 T3 +T7 T4 +T7 T8 +T7 ^1 +T7 ^2 +T7 ^K z1 +c O39 +T7 i2V +T7 i2z +T7 o0= +T7 o22 +T7 o3k +T7 o49 +o5x u +T7 o5z +T7 s 6 +T7 s6f s4] +T7 sgp +T7 sjn u +T7 t +T7 O05 +T7 O05 o47 +T7 O24 T8 -T8$1 -T8$dO52 -T8-7D4 -T8D2 -T8D5sKp -T8D6 -T8i4 -T8o04 -T8o11l -T8o9,O62 -T8s1f -T8sdn -T8t -T8O02 -T8O31 -T8O84o7v -T8}T8 +T8 $1 +T8 $d O52 +T8 -7 D4 +T8 D2 +T8 D5 sKp +T8 D6 +T8 i4 +T8 o04 +o11 l +T8 o9, O62 +T8 s1f +T8 sdn +T8 t +T8 O02 +T8 O31 +T8 O84 o7v +T8 } T8 T9 -T9*41 -T9*61 -T9T4 -T9T8 -T9i3' -T9o7f -T9o8#^v -T9o96[ -T9O13 -T9O14 -T9O23O51 -T9O27 -T9O71$1 +T9 *41 +T9 *61 +T9 T4 +T9 T8 +T9 i3' +T9 o7f +T9 o8# ^v +o96 [ +T9 O13 +T9 O14 +T9 O23 O51 +T9 O27 +T9 O71 $1 TA -TA'B -TARADB -TAT0 -TAZ3O05 -TAt -TAO02 -TAO25 -TAO53O41 -TAO61t +TA 'B +TA RA DB +TA T0 +TA Z3 O05 +TA t +TA O02 +TA O25 +TA O53 O41 +TA O61 t TB -TB*A1*8B -TBiBRk -TBs, -TBO05 -TBO17i4n -TBO19 +TB *A1 *8B +TB iBR k +TB s, +TB O05 +TB O17 i4n +TB O19 TC Z1 -Z1$ -Z1$! -Z1$% -Z1$& -Z1$&O52 -Z1$,O54 -Z1$- -Z1$. -Z1$0 -Z1$1 -Z1$1*21 -Z1$2 -Z1$3 -Z1$3i7e -Z1$6 -Z1$7 -Z1$8 -Z1$8O16 -Z1$9 -Z1$=O16 -Z1$A -Z1$D -Z1$Wu -Z1$Xi5' -Z1$b -Z1$c -Z1$e -Z1$g -Z1$j -Z1$k -Z1$l -Z1$n -Z1$o -Z1$o^" -Z1$oi7r -Z1$p -Z1$q -Z1$w -Z1'5-3 -Z1'9+3 -Z1*04 -Z1*06 -Z1*07 -Z1*0A[ -Z1*12*24 -Z1*14$j -Z1*15o3i -Z1*21 -Z1*24 -Z1*25D3 -Z1*31 -Z1*32 -Z1*34 -Z1*35 -Z1*38 -Z1*48O32 -Z1*50 -Z1*51 -Z1*52 -Z1*52K -Z1*56i5m -Z1*56ssu -Z1*57 -Z1*58 -Z1*59 -Z1*63 -Z1*68 -Z1*68i5< -Z1*69l -Z1*74 -Z1*85-6 -Z1*97 -Z1*A8 -Z1+0z1 -Z1+1 -Z1+1*31 -Z1+2 -Z1+4 -Z1+5 -Z1+7D4 -Z1+7o0a -Z1+7o5- -Z1+8 -Z1+8o7u -Z1+9 -Z1+9i85 -Z1-0 -Z1-0-0 -Z1-0@t -Z1-0u -Z1-1+7 -Z1-2 -Z1-2L6 -Z1-3 -Z1-4 -Z1-4t -Z1-5 -Z1-6 -Z1-6^* -Z1-A -Z1-A+B -Z1@6-2 -Z1@a -Z1@zO04 -Z1D1R4 -Z1D3+5 -Z1D3T1 -Z1D4 -Z1D5 -Z1D7sUE -Z1L0 -Z1L4O65 -Z1L5o2l -Z1R0o1i -Z1R1 -Z1R2$c -Z1R4 -Z1R6z1 -Z1R7D4 -Z1T1 -Z1T4 -Z1T5 -Z1T5^A -Z1T6sbK -Z1Z1sCk -Z1Z5 -Z1[ -Z1[i2< -Z1[O31 -Z1^" -Z1^$ -Z1^0 -Z1^2 -Z1^4 -Z1^4D4 -Z1^7*14 -Z1^8 -Z1^9O46 -Z1^B -Z1^D -Z1^P -Z1^U -Z1^W -Z1^X -Z1^\ -Z1^c -Z1^e -Z1^g -Z1^li4b -Z1^n -Z1^o -Z1^p -Z1^q -Z1^s -Z1^v*91 -Z1^| -Z1c -Z1c*73 -Z1c+3 -Z1cD7 -Z1d -Z1dO56 -Z1dO65 -Z1dO75 -Z1fO38 -Z1fO5A -Z1i0k -Z1i13D3 -Z1i1e -Z1i1j -Z1i1l -Z1i1p -Z1i2- -Z1i21 -Z1i2Z -Z1i2a -Z1i2c -Z1i2v -Z1i38 -Z1i3: -Z1i3I -Z1i3s -Z1i41 -Z1i43 -Z1i48 -Z1i4K -Z1i4] -Z1i4a[ -Z1i4bO18 -Z1i4eO71 -Z1i4h-3 -Z1i4s -Z1i4t -Z1i4y -Z1i5! -Z1i5- -Z1i56 -Z1i58 -Z1i5= -Z1i5O -Z1i5e -Z1i5p -Z1i5t -Z1i6& -Z1i6/ -Z1i62 -Z1i64 -Z1i69 -Z1i6L -Z1i6e -Z1i6f -Z1i6x -Z1i7% -Z1i71 -Z1i7N -Z1i7R[ -Z1i7mo6M -Z1i7n -Z1i7o -Z1i7r -Z1i7t -Z1i80 -Z1i81 -Z1i88 -Z1i8j -Z1i8v -Z1i8x -Z1i91 -Z1i93 -Z1i9s -Z1iA7 -Z1k -Z1ki3v -Z1l^D -Z1o04 -Z1o07 -Z1o0E -Z1o0F -Z1o0I -Z1o0K -Z1o0] -Z1o0b -Z1o0dO32 -Z1o0qi48 -Z1o0t -Z1o0v -Z1o15$b -Z1o17 -Z1o1Lo1c -Z1o1b -Z1o2A -Z1o2` -Z1o2o -Z1o2s -Z1o2u -Z1o3! -Z1o31 -Z1o39 -Z1o3:O37 -Z1o3n -Z1o3t -Z1o3v -Z1o4! -Z1o4/ -Z1o43l -Z1o44slF -Z1o49 -Z1o4a -Z1o4h -Z1o4n -Z1o5% -Z1o5- -Z1o54 -Z1o59 -Z1o5@ -Z1o5C -Z1o5_ -Z1o5c -Z1o6= -Z1o6F -Z1o6p -Z1o6t -Z1o7,{ -Z1o75 -Z1o7Ez2 -Z1o7e -Z1o7i -Z1o7p -Z1o7z -Z1o80T0 -Z1o9?O46 -Z1o9_ -Z1p2'A -Z1p2O13 -Z1q -Z1q'9 -Z1r -Z1r*24 -Z1s!T -Z1s0, -Z1s0a -Z1s2- -Z1s2^ -Z1s38 -Z1s3q -Z1s6) -Z1s64 -Z1s8* -Z1s9& -Z1s90 -Z1s@a -Z1sBHD6 -Z1sHW -Z1sa? -Z1sb+ -Z1sca -Z1sdu -Z1se7 -Z1seb -Z1seu -Z1sfjO43 -Z1sjB -Z1sjv -Z1sk -Z1sleO71 -Z1smN -Z1sn. -Z1sn5 -Z1snl -Z1so' -Z1soO -Z1sou -Z1srz -Z1ss& -Z1ssB -Z1stb -Z1stn -Z1sua -Z1svb -Z1sxt -Z1syh -Z1sz7 -Z1t -Z1t[ -Z1tr -Z1tO28 -Z1u -Z1u{ -Z1O03 -Z1O05 -Z1O12spu -Z1O13f -Z1O15 -Z1O15sbg -Z1O16 -Z1O16D5 -Z1O17 -Z1O21*01 -Z1O23z3 -Z1O24 -Z1O25t -Z1O27c -Z1O28 -Z1O32 -Z1O32^r -Z1O38 -Z1O42 -Z1O42d -Z1O43 -Z1O46$m -Z1O47 -Z1O52i0Z -Z1O54 -Z1O56 -Z1O57 -Z1O57c -Z1O62 -Z1O64 -Z1O72o48 -Z1O73 -Z1O74 -Z1O85 -Z1O95O42 -Z1OA2O17 -Z1OA3 -Z1OB2 -Z1z1 -Z1z1$s -Z1z1*09 -Z1z1p1 -Z1z2D7 -Z1z3 -Z1z5O25 -Z1{ -Z1{T1 -Z1}o12 +Z1 $ +Z1 $! +Z1 $% +Z1 $& +Z1 $& O52 +Z1 $, O54 +Z1 $- +Z1 $. +Z1 $0 +Z1 $1 +Z1 $1 *21 +Z1 $2 +Z1 $3 +Z1 $3 i7e +Z1 $6 +Z1 $7 +Z1 $8 +Z1 $8 O16 +Z1 $9 +Z1 $= O16 +Z1 $A +Z1 $D +Z1 $W u +Z1 $X i5' +Z1 $b +Z1 $c +Z1 $e +Z1 $g +Z1 $j +Z1 $k +Z1 $l +Z1 $n +Z1 $o +Z1 $o ^" +Z1 $o i7r +Z1 $p +Z1 $q +Z1 $w +Z1 '5 -3 +Z1 '9 +3 +Z1 *04 +Z1 *06 +Z1 *07 +Z1 *0A [ +Z1 *12 *24 +Z1 *14 $j +Z1 *15 o3i +Z1 *21 +Z1 *24 +Z1 *25 D3 +Z1 *31 +Z1 *32 +Z1 *34 +Z1 *35 +Z1 *38 +Z1 *48 O32 +Z1 *50 +Z1 *51 +Z1 *52 +Z1 *52 K +Z1 *56 i5m +Z1 *56 ssu +Z1 *57 +Z1 *58 +Z1 *59 +Z1 *63 +Z1 *68 +Z1 *68 i5< +Z1 *69 l +Z1 *74 +Z1 *85 -6 +Z1 *97 +Z1 *A8 +Z1 +0 z1 +Z1 +1 +Z1 +1 *31 +Z1 +2 +Z1 +4 +Z1 +5 +Z1 +7 D4 +Z1 +7 o0a +Z1 +7 o5- +Z1 +8 +Z1 +8 o7u +Z1 +9 +Z1 +9 i85 +Z1 -0 +Z1 -0 -0 +Z1 -0 @t +Z1 -0 u +Z1 -1 +7 +Z1 -2 +Z1 -2 L6 +Z1 -3 +Z1 -4 +Z1 -4 t +Z1 -5 +Z1 -6 +Z1 -6 ^* +Z1 -A +Z1 -A +B +Z1 @6 -2 +Z1 @a +Z1 @z O04 +Z1 D1 R4 +Z1 D3 +5 +Z1 D3 T1 +Z1 D4 +Z1 D5 +Z1 D7 sUE +Z1 L0 +Z1 L4 O65 +Z1 L5 o2l +Z1 R0 o1i +Z1 R1 +Z1 R2 $c +Z1 R4 +Z1 R6 z1 +Z1 R7 D4 +Z1 T1 +Z1 T4 +Z1 T5 +Z1 T5 ^A +Z1 T6 sbK +Z1 Z1 sCk +Z1 Z5 +Z1 [ +Z1 [ i2< +Z1 [ O31 +Z1 ^" +Z1 ^$ +Z1 ^0 +Z1 ^2 +Z1 ^4 +Z1 ^4 D4 +Z1 ^7 *14 +Z1 ^8 +Z1 ^9 O46 +Z1 ^B +Z1 ^D +Z1 ^P +Z1 ^U +Z1 ^W +Z1 ^X +Z1 ^\ +Z1 ^c +Z1 ^e +Z1 ^g +Z1 ^l i4b +Z1 ^n +Z1 ^o +Z1 ^p +Z1 ^q +Z1 ^s +Z1 ^v *91 +Z1 ^| +Z1 c +Z1 c *73 +Z1 c +3 +Z1 c D7 +Z1 d +Z1 d O56 +Z1 d O65 +Z1 d O75 +Z1 f O38 +Z1 f O5A +Z1 i0k +Z1 i13 D3 +Z1 i1e +Z1 i1j +Z1 i1l +Z1 i1p +Z1 i2- +Z1 i21 +Z1 i2Z +Z1 i2a +Z1 i2c +Z1 i2v +Z1 i38 +Z1 i3: +Z1 i3I +Z1 i3s +Z1 i41 +Z1 i43 +Z1 i48 +Z1 i4K +Z1 i4] +Z1 i4a [ +Z1 i4b O18 +Z1 i4e O71 +Z1 i4h -3 +Z1 i4s +Z1 i4t +Z1 i4y +Z1 i5! +Z1 i5- +Z1 i56 +Z1 i58 +Z1 i5= +Z1 i5O +Z1 i5e +Z1 i5p +Z1 i5t +Z1 i6& +Z1 i6/ +Z1 i62 +Z1 i64 +Z1 i69 +Z1 i6L +Z1 i6e +Z1 i6f +Z1 i6x +Z1 i7% +Z1 i71 +Z1 i7N +Z1 i7R [ +Z1 i7m o6M +Z1 i7n +Z1 i7o +Z1 i7r +Z1 i7t +Z1 i80 +Z1 i81 +Z1 i88 +Z1 i8j +Z1 i8v +Z1 i8x +Z1 i91 +Z1 i93 +Z1 i9s +Z1 iA7 +Z1 k +Z1 k i3v +Z1 l ^D +Z1 o04 +Z1 o07 +Z1 o0E +Z1 o0F +Z1 o0I +Z1 o0K +Z1 o0] +Z1 o0b +Z1 o0d O32 +Z1 o0q i48 +Z1 o0t +Z1 o0v +Z1 o15 $b +Z1 o17 +Z1 o1c +Z1 o1b +Z1 o2A +Z1 o2` +Z1 o2o +Z1 o2s +Z1 o2u +Z1 o3! +Z1 o31 +Z1 o39 +Z1 o3: O37 +Z1 o3n +Z1 o3t +Z1 o3v +Z1 o4! +Z1 o4/ +Z1 o43 l +Z1 o44 slF +Z1 o49 +Z1 o4a +Z1 o4h +Z1 o4n +Z1 o5% +Z1 o5- +Z1 o54 +Z1 o59 +Z1 o5@ +Z1 o5C +Z1 o5_ +Z1 o5c +Z1 o6= +Z1 o6F +Z1 o6p +Z1 o6t +Z1 o7, { +Z1 o75 +Z1 o7E z2 +Z1 o7e +Z1 o7i +Z1 o7p +Z1 o7z +Z1 o80 T0 +Z1 o9? O46 +Z1 o9_ +Z1 p2 'A +Z1 p2 O13 +Z1 q +Z1 q '9 +Z1 r +Z1 r *24 +Z1 s!T +Z1 s0, +Z1 s0a +Z1 s2- +Z1 s2^ +Z1 s38 +Z1 s3q +Z1 s6) +Z1 s64 +Z1 s8* +Z1 s9& +Z1 s90 +Z1 s@a +Z1 sBH D6 +Z1 sHW +Z1 sa? +Z1 sb+ +Z1 sca +Z1 sdu +Z1 se7 +Z1 seb +Z1 seu +Z1 sfj O43 +Z1 sjB +Z1 sjv +Z1 sk +Z1 sle O71 +Z1 smN +Z1 sn. +Z1 sn5 +Z1 snl +Z1 so' +Z1 soO +Z1 sou +Z1 srz +Z1 ss& +Z1 ssB +Z1 stb +Z1 stn +Z1 sua +Z1 svb +Z1 sxt +Z1 syh +Z1 sz7 +Z1 t +Z1 t [ +Z1 t r +Z1 t O28 +Z1 u +Z1 u { +Z1 O03 +Z1 O05 +Z1 O12 spu +Z1 O13 f +Z1 O15 +Z1 O15 sbg +Z1 O16 +Z1 O16 D5 +Z1 O17 +Z1 O21 *01 +Z1 O23 z3 +Z1 O24 +Z1 O25 t +Z1 O27 c +Z1 O28 +Z1 O32 +Z1 O32 ^r +Z1 O38 +Z1 O42 +Z1 O42 d +Z1 O43 +Z1 O46 $m +Z1 O47 +Z1 O52 i0Z +Z1 O54 +Z1 O56 +Z1 O57 +Z1 O57 c +Z1 O62 +Z1 O64 +Z1 O72 o48 +Z1 O73 +Z1 O74 +Z1 O85 +Z1 O95 O42 +Z1 OA2 O17 +Z1 OA3 +Z1 OB2 +Z1 z1 +Z1 z1 $s +Z1 z1 *09 +Z1 z1 p1 +Z1 z2 D7 +Z1 z3 +Z1 z5 O25 +Z1 { +Z1 { T1 +Z1 } o12 Z2 -Z2$! -Z2$'C -Z2$* -Z2$+ -Z2$. -Z2$.[ -Z2$/ -Z2$1 -Z2$2 -Z2$3 -Z2$4 -Z2$5 -Z2$6 -Z2$7 -Z2$8 -Z2$9 -Z2$9k -Z2$<$3 -Z2$M -Z2$O -Z2$b -Z2$d -Z2$e -Z2$eR5 -Z2$f^h -Z2$h -Z2$ho5[ -Z2$k -Z2$v -Z2$x -Z2$y{ -Z2$z -Z2'4q -Z2'6i4P -Z2'8u -Z2*02 -Z2*05 -Z2*06 -Z2*14 -Z2*15o0( -Z2*16 -Z2*17 -Z2*18*49 -Z2*20O14 -Z2*23 -Z2*24 -Z2*26 -Z2*27 -Z2*30 -Z2*31*21 -Z2*31r -Z2*37 -Z2*38 -Z2*42-5 -Z2*45 -Z2*45k -Z2*47 -Z2*48D4 -Z2*4AO05 -Z2*50[ -Z2*51 -Z2*53 -Z2*56su% -Z2*63 -Z2*63-5 -Z2*64 -Z2*64o4a -Z2*65 -Z2*67 -Z2*68 -Z2*73Z1 -Z2*79o70 -Z2*82O37 -Z2*85 -Z2*90$e -Z2*93 -Z2*94 -Z2+0 -Z2+2 -Z2+3 -Z2+4 -Z2+4l -Z2+5 -Z2+6 -Z2+6} -Z2+7 -Z2+7o50 -Z2+8 -Z2+9 -Z2+AD0 -Z2-0 -Z2-2 -Z2-3 -Z2-4 -Z2-4i38 -Z2-6 -Z2-7 -Z2-7L0 -Z2-8 -Z2-9 -Z2-A -Z2-AT0 -Z2@1u -Z2@4 -Z2@5 -Z2@b*74 -Z2C -Z2CZ2 -Z2D1 -Z2D2+7 -Z2D2c -Z2D5 -Z2L1 -Z2L2 -Z2L3 -Z2L4^3 -Z2L6 -Z2L9 -Z2R0-0 -Z2R1 -Z2R2u -Z2R3 -Z2R4 -Z2R4{ -Z2R5 -Z2R9 -Z2T0 -Z2T0o8n -Z2T2 -Z2T5 -Z2Z1O48 -Z2Z4r -Z2Z4O75 -Z2[ -Z2[t -Z2^$ -Z2^)*36 -Z2^, -Z2^3 -Z2^5 -Z2^6 -Z2^7O52 -Z2^@ -Z2^A -Z2^H -Z2^V -Z2^Wi3] -Z2^Y -Z2^_ -Z2^a -Z2^j -Z2^l -Z2^q -Z2^t -Z2^u -Z2^v^d -Z2^{o5& -Z2c -Z2c$z -Z2cD1 -Z2cz1 -Z2cz2 -Z2d -Z2i1n -Z2i1} -Z2i2G*75 -Z2i3, -Z2i3d -Z2i3w] -Z2i3y -Z2i4- -Z2i4e -Z2i4j] -Z2i5(O27 -Z2i5f -Z2i5r -Z2i5x -Z2i6-+9 -Z2i6. -Z2i60 -Z2i6n -Z2i6x -Z2i78 -Z2i7Y -Z2i7d -Z2i7u -Z2i88 -Z2i8o -Z2i8v -Z2k -Z2k*07 -Z2l -Z2o02R8 -Z2o0D -Z2o0K -Z2o0P -Z2o0_ -Z2o0a -Z2o0d -Z2o0h -Z2o0j -Z2o0o -Z2o0po1] -Z2o1- -Z2o1n -Z2o21 -Z2o29D1 -Z2o2bO01 -Z2o2d -Z2o2m -Z2o2s-7 -Z2o2y -Z2o3 -Z2o30 -Z2o3l -Z2o3u -Z2o3u*10 -Z2o4- -Z2o46 -Z2o4H -Z2o4_ -Z2o4h -Z2o5F -Z2o5L -Z2o5\ -Z2o5b -Z2o5ml -Z2o67 -Z2o68-4 -Z2o6no4* -Z2o70 -Z2o73 -Z2o76 -Z2o7N -Z2o7s -Z2o8# -Z2o8B -Z2o8_ -Z2o8h -Z2o8n -Z2o8o -Z2o8p -Z2o8s -Z2o8t -Z2o9m -Z2oAwO24 -Z2oBhO56 -Z2r -Z2r*46 -Z2rZ2 -Z2r^3 -Z2ri67 -Z2s06 -Z2s0R -Z2s1- -Z2s1t -Z2s1z -Z2s27 -Z2s5+ -Z2s52 -Z2s59 -Z2s5C -Z2s5b -Z2s85 -Z2s9fO31 -Z2s9j -Z2sa? -Z2saI -Z2se7 -Z2sfh -Z2sft -Z2sgx -Z2sgz -Z2shql -Z2shr -Z2shv -Z2si9 -Z2sipO19 -Z2slS -Z2slx -Z2smn -Z2ss+ -Z2ss5 -Z2svwO54 -Z2t -Z2ti5N -Z2u -Z2O02 -Z2O02s8K -Z2O03 -Z2O06 -Z2O08 -Z2O12 -Z2O12Z1 -Z2O12u -Z2O12O23 -Z2O13 -Z2O14^u -Z2O21 -Z2O23 -Z2O25 -Z2O26 -Z2O27 -Z2O28 -Z2O2A -Z2O31 -Z2O32 -Z2O32se# -Z2O35 -Z2O3A -Z2O43$7 -Z2O49 -Z2O49Z4 -Z2O4B -Z2O53[ -Z2O56 -Z2O64 -Z2O72 -Z2O82 -Z2O83 -Z2O84 -Z2O93-A -Z2O94 -Z2O94D7 -Z2O95 -Z2O96 -Z2OB5 -Z2z1 -Z2z1T0 -Z2z1O25 -Z2z1O73 -Z2z2 -Z2{+4 -Z2{o13 -Z2{u +Z2 $! +Z2 $' C +Z2 $* +Z2 $+ +Z2 $. +Z2 $. [ +Z2 $/ +Z2 $1 +Z2 $2 +Z2 $3 +Z2 $4 +Z2 $5 +Z2 $6 +Z2 $7 +Z2 $8 +Z2 $9 +Z2 $9 k +Z2 $< $3 +Z2 $M +Z2 $O +Z2 $b +Z2 $d +Z2 $e +Z2 $e R5 +Z2 $f ^h +Z2 $h +Z2 $h o5[ +Z2 $k +Z2 $v +Z2 $x +Z2 $y { +Z2 $z +Z2 '4 q +Z2 '6 i4P +Z2 '8 u +Z2 *02 +Z2 *05 +Z2 *06 +Z2 *14 +Z2 *15 o0( +Z2 *16 +Z2 *17 +Z2 *18 *49 +Z2 *20 O14 +Z2 *23 +Z2 *24 +Z2 *26 +Z2 *27 +Z2 *30 +Z2 *31 *21 +Z2 *31 r +Z2 *37 +Z2 *38 +Z2 *42 -5 +Z2 *45 +Z2 *45 k +Z2 *47 +Z2 *48 D4 +Z2 *4A O05 +Z2 *50 [ +Z2 *51 +Z2 *53 +Z2 *56 su% +Z2 *63 +Z2 *63 -5 +Z2 *64 +Z2 *64 o4a +Z2 *65 +Z2 *67 +Z2 *68 +Z2 *73 Z1 +Z2 *79 o70 +Z2 *82 O37 +Z2 *85 +Z2 *90 $e +Z2 *93 +Z2 *94 +Z2 +0 +Z2 +2 +Z2 +3 +Z2 +4 +Z2 +4 l +Z2 +5 +Z2 +6 +Z2 +6 } +Z2 +7 +Z2 +7 o50 +Z2 +8 +Z2 +9 +Z2 +A D0 +Z2 -0 +Z2 -2 +Z2 -3 +Z2 -4 +Z2 -4 i38 +Z2 -6 +Z2 -7 +Z2 -7 L0 +Z2 -8 +Z2 -9 +Z2 -A +Z2 -A T0 +Z2 @1 u +Z2 @4 +Z2 @5 +Z2 @b *74 +Z2 D1 +Z2 D2 +7 +Z2 D2 c +Z2 D5 +Z2 L1 +Z2 L2 +Z2 L3 +Z2 L4 ^3 +Z2 L6 +Z2 L9 +Z2 R0 -0 +Z2 R1 +Z2 R2 u +Z2 R3 +Z2 R4 +Z2 R4 { +Z2 R5 +Z2 R9 +Z2 T0 +Z2 T0 o8n +Z2 T2 +Z2 T5 +Z2 Z1 O48 +Z2 Z4 r +Z2 Z4 O75 +Z2 [ +Z2 [ t +Z2 ^$ +Z2 ^) *36 +Z2 ^, +Z2 ^3 +Z2 ^5 +Z2 ^6 +Z2 ^7 O52 +Z2 ^@ +Z2 ^A +Z2 ^H +Z2 ^V +Z2 ^W i3] +Z2 ^Y +Z2 ^_ +Z2 ^a +Z2 ^j +Z2 ^l +Z2 ^q +Z2 ^t +Z2 ^u +Z2 ^v ^d +Z2 ^{ o5& +Z2 c +Z2 c $z +Z2 c D1 +Z2 c z1 +Z2 c z2 +Z2 d +Z2 i1n +Z2 i1} +Z2 i2G *75 +Z2 i3, +Z2 i3d +Z2 i3w ] +Z2 i3y +Z2 i4- +Z2 i4e +Z2 i4j ] +Z2 i5( O27 +Z2 i5f +Z2 i5r +Z2 i5x +Z2 i6- +9 +Z2 i6. +Z2 i60 +Z2 i6n +Z2 i6x +Z2 i78 +Z2 i7Y +Z2 i7d +Z2 i7u +Z2 i88 +Z2 i8o +Z2 i8v +Z2 k +Z2 k *07 +Z2 l +Z2 o02 R8 +Z2 o0D +Z2 o0K +Z2 o0P +Z2 o0_ +Z2 o0a +Z2 o0d +Z2 o0h +Z2 o0j +Z2 o0o +Z2 o0p o1] +Z2 o1- +Z2 o1n +Z2 o21 +Z2 o29 D1 +Z2 o2b O01 +Z2 o2d +Z2 o2m +Z2 o2s -7 +Z2 o2y +Z2 o3 +Z2 o30 +Z2 o3l +Z2 o3u +Z2 o3u *10 +Z2 o4- +Z2 o46 +Z2 o4H +Z2 o4_ +Z2 o4h +Z2 o5F +Z2 o5L +Z2 o5\ +Z2 o5b +Z2 o5m l +Z2 o67 +Z2 o68 -4 +Z2 o6n o4* +Z2 o70 +Z2 o73 +Z2 o76 +Z2 o7N +Z2 o7s +Z2 o8# +Z2 o8B +Z2 o8_ +Z2 o8h +Z2 o8n +Z2 o8o +Z2 o8p +Z2 o8s +Z2 o8t +Z2 o9m +Z2 oAw O24 +Z2 oBh O56 +Z2 r +Z2 r *46 +Z2 r Z2 +Z2 r ^3 +Z2 r i67 +Z2 s06 +Z2 s0R +Z2 s1- +Z2 s1t +Z2 s1z +Z2 s27 +Z2 s5+ +Z2 s52 +Z2 s59 +Z2 s5C +Z2 s5b +Z2 s85 +Z2 s9f O31 +Z2 s9j +Z2 sa? +Z2 saI +Z2 se7 +Z2 sfh +Z2 sft +Z2 sgx +Z2 sgz +Z2 shq l +Z2 shr +Z2 shv +Z2 si9 +Z2 sip O19 +Z2 slS +Z2 slx +Z2 smn +Z2 ss+ +Z2 ss5 +Z2 svw O54 +Z2 t +Z2 t i5N +Z2 u +Z2 O02 +Z2 O02 s8K +Z2 O03 +Z2 O06 +Z2 O08 +Z2 O12 +Z2 O12 Z1 +Z2 O12 u +Z2 O12 O23 +Z2 O13 +Z2 O14 ^u +Z2 O21 +Z2 O23 +Z2 O25 +Z2 O26 +Z2 O27 +Z2 O28 +Z2 O2A +Z2 O31 +Z2 O32 +Z2 O32 se# +Z2 O35 +Z2 O3A +Z2 O43 $7 +Z2 O49 +Z2 O49 Z4 +Z2 O4B +Z2 O53 [ +Z2 O56 +Z2 O64 +Z2 O72 +Z2 O82 +Z2 O83 +Z2 O84 +Z2 O93 -A +Z2 O94 +Z2 O94 D7 +Z2 O95 +Z2 O96 +Z2 OB5 +Z2 z1 +Z2 z1 T0 +Z2 z1 O25 +Z2 z1 O73 +Z2 z2 +Z2 { +4 +Z2 { o13 +Z2 { u Z3 -Z3$- -Z3$0 -Z3$1 -Z3$1t -Z3$3 -Z3$5 -Z3$7 -Z3$9 -Z3$?O56 -Z3$J[ -Z3$SO75 -Z3$br -Z3$gO62 -Z3$l -Z3$mO37 -Z3$nT2 -Z3$o*16 -Z3$q -Z3$s+4 -Z3$v -Z3$z -Z3$} -Z3'2$5 -Z3*06 -Z3*0B -Z3*13 -Z3*16 -Z3*25 -Z3*2A -Z3*30 -Z3*34 -Z3*35 -Z3*37 -Z3*38 -Z3*41o3v -Z3*49 -Z3*50 -Z3*54 -Z3*57 -Z3*59O71 -Z3*63*72 -Z3*65L6 -Z3*68 -Z3*6B -Z3*70 -Z3*82c -Z3*96D5 -Z3*A0 -Z3+0 -Z3+1 -Z3+2 -Z3+3l -Z3+4 -Z3+5 -Z3+5O6A -Z3+6 -Z3+7 -Z3+9 -Z3+A -Z3-0 -Z3-0O59 -Z3-1 -Z3-1r -Z3-4 -Z3-4o1A -Z3-5 -Z3-6 -Z3-6-9 -Z3-6O76 -Z3-7 -Z3-8 -Z3-9 -Z3-9OB5 -Z3-A -Z3-B -Z3@z+2 -Z3C -Z3CO02 -Z3D1 -Z3D2 -Z3D3 -Z3D6 -Z3D7 -Z3L1 -Z3L3 -Z3L5z1 -Z3L6 -Z3R0 -Z3R0s5p -Z3R1 -Z3R2l -Z3R5 -Z3RA -Z3T0 -Z3T1 -Z3T2 -Z3T2D1 -Z3T3*69 -Z3T3O02 -Z3T6O28 -Z3T7 -Z3TA'9 -Z3TB -Z3Z3*36 -Z3Z3O56 -Z3Z4[ -Z3Z5 -Z3Z5t -Z3[ -Z3[-9 -Z3[D3 -Z3[Z5 -Z3[^u -Z3[{ -Z3]i7a -Z3^$} -Z3^0 -Z3^3 -Z3^3t -Z3^8 -Z3^> -Z3^J -Z3^J'7 -Z3^a -Z3^c -Z3^e -Z3^pO62 -Z3^r -Z3^x*02 -Z3c -Z3c*40 -Z3cO85 -Z3cz1 -Z3d -Z3i0U -Z3i1+ -Z3i1o -Z3i2B -Z3i2S -Z3i3Q[ -Z3i3p -Z3i43 -Z3i4k*41 -Z3i4k*7B -Z3i6L -Z3i6q -Z3i7x -Z3k -Z3k*42 -Z3k} -Z3l -Z3o0d -Z3o0i -Z3o0j -Z3o0m -Z3o14 -Z3o1U -Z3o2e -Z3o2ll -Z3o2n -Z3o2o -Z3o30 -Z3o3ui45 -Z3o4a -Z3o4l -Z3o4t -Z3o4uD5 -Z3o5. -Z3o5E -Z3o5i -Z3o5o -Z3o5s -Z3o6* -Z3o6,O46 -Z3o6C -Z3o6K -Z3o6k -Z3o6s+7 -Z3o6w -Z3o7o -Z3o92*83 -Z3o9h -Z3o9r -Z3p2 -Z3p3 -Z3r -Z3rO32 -Z3s0u -Z3s1] -Z3s39 -Z3s57[ -Z3s6T -Z3s6l -Z3s7B -Z3s9k -Z3sab -Z3scw] -Z3sdz -Z3sd|O13 -Z3segsvt -Z3sjf+4 -Z3slz -Z3sn+ -Z3soaO59 -Z3soe -Z3spb -Z3ssz -Z3stf -Z3su- -Z3sy7 -Z3tO61 -Z3u -Z3u$\ -Z3uo4a -Z3uO01 -Z3O03$) -Z3O03^; -Z3O04 -Z3O05 -Z3O06s1n -Z3O12O56 -Z3O13-2 -Z3O13^7 -Z3O16z3 -Z3O1B -Z3O23 -Z3O23l -Z3O2A$d -Z3O2B-4 -Z3O34 -Z3O34^5 -Z3O36 -Z3O4B -Z3O51 -Z3O53 -Z3O53r -Z3O54 -Z3O57sAS -Z3O63o6f -Z3O65$X -Z3O74 -Z3O75T0 -Z3O79c -Z3O83 -Z3O92 -Z3OA1 -Z3OB2 -Z3OB4 -Z3OB7$1 -Z3z3 -Z3{ -Z3} +Z3 $- +Z3 $0 +Z3 $1 +Z3 $1 t +Z3 $3 +Z3 $5 +Z3 $7 +Z3 $9 +Z3 $? O56 +Z3 $J [ +Z3 $S O75 +Z3 $b r +Z3 $g O62 +Z3 $l +Z3 $m O37 +Z3 $n T2 +Z3 $o *16 +Z3 $q +Z3 $s +4 +Z3 $v +Z3 $z +Z3 $} +Z3 '2 $5 +Z3 *06 +Z3 *0B +Z3 *13 +Z3 *16 +Z3 *25 +Z3 *2A +Z3 *30 +Z3 *34 +Z3 *35 +Z3 *37 +Z3 *38 +Z3 *41 o3v +Z3 *49 +Z3 *50 +Z3 *54 +Z3 *57 +Z3 *59 O71 +Z3 *63 *72 +Z3 *65 L6 +Z3 *68 +Z3 *6B +Z3 *70 +Z3 *82 c +Z3 *96 D5 +Z3 *A0 +Z3 +0 +Z3 +1 +Z3 +2 +Z3 +3 l +Z3 +4 +Z3 +5 +Z3 +5 O6A +Z3 +6 +Z3 +7 +Z3 +9 +Z3 +A +Z3 -0 +Z3 -0 O59 +Z3 -1 +Z3 -1 r +Z3 -4 +Z3 -4 o1A +Z3 -5 +Z3 -6 +Z3 -6 -9 +Z3 -6 O76 +Z3 -7 +Z3 -8 +Z3 -9 +Z3 -9 OB5 +Z3 -A +Z3 -B +Z3 @z +2 +Z3 C O02 +Z3 D1 +Z3 D2 +Z3 D3 +Z3 D6 +Z3 D7 +Z3 L1 +Z3 L3 +Z3 L5 z1 +Z3 L6 +Z3 R0 +Z3 R0 s5p +Z3 R1 +Z3 R2 l +Z3 R5 +Z3 RA +Z3 T0 +Z3 T1 +Z3 T2 +Z3 T2 D1 +Z3 T3 *69 +Z3 T3 O02 +Z3 T6 O28 +Z3 T7 +Z3 '9 +Z3 TB +Z3 Z3 *36 +Z3 Z3 O56 +Z3 Z4 [ +Z3 Z5 +Z3 Z5 t +Z3 [ +Z3 [ -9 +Z3 [ D3 +Z3 [ Z5 +Z3 [ ^u +Z3 [ { +Z3 ] i7a +Z3 ^$ } +Z3 ^0 +Z3 ^3 +Z3 ^3 t +Z3 ^8 +Z3 ^> +Z3 ^J +Z3 ^J '7 +Z3 ^a +Z3 ^c +Z3 ^e +Z3 ^p O62 +Z3 ^r +Z3 ^x *02 +Z3 c +Z3 c *40 +Z3 c O85 +Z3 c z1 +Z3 d +Z3 i0U +Z3 i1+ +Z3 i1o +Z3 i2B +Z3 i2S +Z3 i3Q [ +Z3 i3p +Z3 i43 +Z3 i4k *41 +Z3 i4k *7B +Z3 i6L +Z3 i6q +Z3 i7x +Z3 k +Z3 k *42 +Z3 k } +Z3 l +Z3 o0d +Z3 o0i +Z3 o0j +Z3 o0m +Z3 o14 +Z3 o1U +Z3 o2e +Z3 o2l l +Z3 o2n +Z3 o2o +Z3 o30 +Z3 o3u i45 +Z3 o4a +Z3 o4l +Z3 o4t +Z3 o4u D5 +Z3 o5. +Z3 o5E +Z3 o5i +Z3 o5o +Z3 o5s +Z3 o6* +Z3 o6, O46 +Z3 o6C +Z3 o6K +Z3 o6k +Z3 o6s +7 +Z3 o6w +Z3 o7o +Z3 o92 *83 +Z3 o9h +Z3 o9r +Z3 p2 +Z3 p3 +Z3 r +Z3 r O32 +Z3 s0u +Z3 s1] +Z3 s39 +Z3 s57 [ +Z3 s6T +Z3 s6l +Z3 s7B +Z3 s9k +Z3 sab +Z3 scw ] +Z3 sdz +Z3 sd| O13 +Z3 seg svt +Z3 sjf +4 +Z3 slz +Z3 sn+ +Z3 soa O59 +Z3 soe +Z3 spb +Z3 ssz +Z3 stf +Z3 su- +Z3 sy7 +Z3 t O61 +Z3 u +Z3 u $\ +Z3 u o4a +Z3 u O01 +Z3 O03 $) +Z3 O03 ^; +Z3 O04 +Z3 O05 +Z3 O06 s1n +Z3 O12 O56 +Z3 O13 -2 +Z3 O13 ^7 +Z3 O16 z3 +Z3 O1B +Z3 O23 +Z3 O23 l +Z3 O2A $d +Z3 O2B -4 +Z3 O34 +Z3 O34 ^5 +Z3 O36 +Z3 O4B +Z3 O51 +Z3 O53 +Z3 O53 r +Z3 O54 +Z3 O57 sAS +Z3 O63 o6f +Z3 O65 $X +Z3 O74 +Z3 O75 T0 +Z3 O79 c +Z3 O83 +Z3 O92 +Z3 OA1 +Z3 OB2 +Z3 OB4 +Z3 OB7 $1 +Z3 z3 +Z3 { +Z3 } Z4 -Z4$1 -Z4$4 -Z4$7 -Z4$9 -Z4$ -[$? -[$@ -[$A -[$B -[$D -[$E -[$L -[$N -[$V+2 -[$X -[$^ -[$` -[$a -[$a*53 -[$b -[$d -[$dz3 -[$f -[$fz4 -[$g -[$i -[$k -[$n -[$nK -[$o -[$o^? -[$r -[$ru -[$s -[$v -[$y -[$} -['5smj -['6 -['6sJc -['8T7 -['8^g -['A -[*02 -[*03 -[*05 -[*09 -[*12 -[*16 -[*23 -[*25 -[*31 -[*40k -[*51*40 -[*54+2 -[*67 -[*70 -[*83 -[+0z2 -[+1 -[+2 -[+4 -[+9 -[-0 -[-1 -[-2 -[-2o6k -[-3 -[-4u -[-5} -[-8 -[-9T0 -[-A -[@0 -[@4 -[@9 -[@B -[@e -[@h -[@i -[C -[Ci5y -[D0z4 -[D1 -[D3R0 -[D4 -[D4$U -[D4d -[K*15 -[L1 -[L6 -[R0 -[R1 -[R1i0R -[R2Z1 -[R2d -[R3 -[R3Z1 -[R3c -[R3shf -[R7 -[T1 -[T8 -[T8+7 -[T8^N -[T8si[ -[Z1 -[Z1o9q -[Z2 -[Z2R8 -[Z2Z5 -[Z2^1 -[Z2i02 -[Z2o4' -[Z3 -[Z3*52 -[Z3o56 -[Z4 -[Z4Z5 -[Z4i0k -[Z4z1 -[Z5 -[Z5o68 -[Z5z1 -[[ -[[ $1 -[[[ -[[[ $1 -[[[[ -[[[[ $1 -[[[[[ -[[[[[c -[[[[c -[[[c -[[c -[[o71 -[[O43 -[^% -[^& -[^- -[^0Z2 -[^= -[^C*31 -[^I-1 -[^L -[^Ll -[^LO27 -[^O -[^P -[^V'6 -[^X*12 -[^a -[^g -[^g'7 -[^h+2 -[^j -[^p -[^vD1 -[^} -[c -[c$J -[c*31 -[d -[f -[fi4G -[i0Ei0E -[i0PO62 -[i0l -[i0x -[i1# -[i11 -[i15 -[i1G -[i1P -[i1Z -[i1[ -[i1d -[i1e -[i1w -[i1y -[i1z -[i21 -[i2Z -[i2a -[i2j -[i2k -[i2q -[i2x -[i3& -[i3- -[i31 -[i33 -[i39 -[i3GR7 -[i4* -[i4, -[i41D6 -[i45 -[i4= -[i4HO29 -[i4b -[i4i -[i4l -[i4n -[i4r -[i4vZ1 -[i5 -[i5* -[i5- -[i58 -[i5i -[i5s -[i5y -[i6= -[i6A -[i6_ -[i6fl -[i6i -[i6o -[i7k -[i7p -[i7x -[i8e -[i8g -[i95 -[kR5 -[lT7 -[li1e -[lswn -[o0" -[o0/ -[o04 -[o0> -[o0F -[o0N -[o0S -[o0W -[o0d -[o0l -[o0n -[o0q -[o0z -[o1 -[o1& -[o10 -[o17 -[o1g -[o1ni3A -[o1o -[o1t -[o1y -[o2 -[o23i32 -[o2; -[o2A -[o2G -[o2WC -[o2Y -[o2d -[o2q -[o2t -[o2uZ1 -[o2v -[o2z -[o2}r -[o3 -[o3+ -[o33 -[o3I -[o3J -[o3U -[o3_ -[o3a -[o3c -[o3d -[o3j -[o3l -[o3psgs -[o3r -[o3s -[o3z -[o4 -[o4% -[o4+ -[o41 -[o4WC -[o4j -[o4s -[o4t -[o4tO23 -[o4u -[o4w -[o5) -[o56 -[o5f -[o5g -[o5i -[o5li0r -[o5n -[o5u -[o6 -[o6/ -[o68 -[o6g -[o7H -[o7i -[o7n -[o9> -[oA4} -[p1^} -[p1sc2 -[p1O63 -[p2 -[p2O24 -[p3 -[p4 -[p5 -[q -[qo4m -[qO27 -[qO2A -[qz4 -[r -[r*20 -[rz3 -[r} -[s-g -[s07 -[s0p -[s7+ -[s8T -[s9Uo0^ -[sLe -[sWi -[sa@ -[sat -[scb -[sez -[sez$u -[sh1 -[shG -[sj6 -[slt -[snwr -[sqE -[srz -[ss? -[st -[sts -[sv9 -[swL -[sxc -[sz6 -[sz8 -[sz9 -[szp -[t*42 -[tz2 -[t} -[u -[ui2A -[uo5g -[O02z2 -[O12 -[O13$m -[O15 -[O15s6K -[O17 -[O21 -[O21d -[O23sa+ -[O24 -[O24$v -[O25 -[O26 -[O31 -[O32 -[O34 -[O34s4d -[O37O41 -[O41u -[O42 -[O43Z2 -[O45 -[O45$L -[O45z2 -[O51 -[O51o1_ -[O52$z -[O53 -[O64 -[O6A -[O71O05 -[O73 -[O74c -[O93O34 -[z1 -[z1-4 -[z1o2D -[z2 -[z2^1 -[z2^k -[z2i49 -[z2l -[z3 -[z3*48 -[z3*79 -[z3R0 -[z3Z2 -[z4 -[z4+5 -[z4} -[z5 -[z5*19 -[z5seb -[z5O67 -[{ -[{*35 -[{D1 -[{Z4 -[{u -[}^K -[}o3u +[ $ +[ $# ^Q +[ $% +[ $- +[ $2 +[ $2 O0B +[ $3 +[ $4 +[ $4 K +[ $7 o4j +[ $7 O45 +[ $8 +[ $< +[ $> +[ $@ +[ $B +[ $D +[ $E +[ $L +[ $N +[ $V +2 +[ $^ +[ $` +[ $a +[ $a *53 +[ $d +[ $d z3 +[ $f +[ $f z4 +[ $g +[ $i +[ $n +[ $n K +[ $o +[ $o ^? +[ $r +[ $r u +[ $s +[ $v +[ $y +[ $} +[ '5 smj +[ '6 +[ '6 sJc +[ '8 T7 +[ '8 ^g +[ 'A +[ *02 +[ *03 +[ *05 +[ *09 +[ *12 +[ *16 +[ *23 +[ *25 +[ *31 +[ *40 k +[ *51 *40 +[ *54 +2 +[ *67 +[ *70 +[ *83 +[ +0 z2 +[ +1 +[ +2 +[ +4 +[ +9 +[ -0 +[ -1 +[ -2 +[ -2 o6k +[ -3 +[ -4 u +[ -5 } +[ -8 +[ -9 T0 +[ -A +[ @0 +[ @4 +[ @B +[ @e +[ @i +[ C +[ C i5y +[ D0 z4 +[ D1 +[ D3 R0 +[ D4 +[ D4 $U +[ D4 d +[ K *15 +[ L1 +[ L6 +[ R0 +[ R1 +[ R1 i0R +[ R2 Z1 +[ R2 d +[ R3 +[ R3 Z1 +[ R3 c +[ R3 shf +[ R7 +[ T1 +[ T8 +[ T8 +7 +[ T8 ^N +[ T8 si[ +[ Z1 o9q +[ Z2 +[ Z2 R8 +[ Z2 Z5 +[ Z2 ^1 +[ Z2 i02 +[ Z2 o4' +[ Z3 +[ Z3 *52 +[ Z3 o56 +[ Z4 +[ Z4 Z5 +[ Z4 i0k +[ Z4 z1 +[ Z5 +[ Z5 o68 +[ Z5 z1 +[ [ +[ [ $1 +[ [ [ +[ [ [ $1 +[ [ [ [ +[ [ [ [ $1 +[ [ [ [ [ +[ [ [ [ [ c +[ [ [ [ c +[ [ [ c +[ [ c +[ [ o71 +[ [ O43 +o0% +o0& +o0- +[ ^0 Z2 +o0= +[ ^C *31 +[ ^I -1 +o0L +[ ^L l +[ ^L O27 +o0O +o0P +[ ^V '6 +[ ^X *12 +o0a +o0g +[ ^g '7 +[ ^h +2 +[ ^j +o0p +[ ^v D1 +[ ^} +[ c +[ c $J +[ c *31 +[ d +[ f +[ f i4G +[ i0E i0E +[ i0P O62 +[ i0l +[ i0x +[ i1# +[ i11 +[ i15 +[ i1G +[ i1P +[ i1Z +[ i1[ +[ i1d +[ i1e +[ i1w +[ i1y +[ i1z +[ i21 +[ i2Z +[ i2a +[ i2j +[ i2k +[ i2q +[ i2x +[ i3& +[ i3- +[ i31 +[ i33 +[ i39 +[ i3G R7 +[ i4* +[ i4, +[ i41 D6 +[ i45 +[ i4= +[ i4H O29 +[ i4b +[ i4i +[ i4l +[ i4n +[ i4r +[ i4v Z1 +[ i5 +[ i5* +[ i5- +[ i58 +[ i5i +[ i5s +[ i5y +[ i6= +[ i6A +[ i6_ +[ i6f l +[ i6i +[ i6o +[ i7k +[ i7p +[ i7x +[ i8e +[ i8g +[ i95 +[ k R5 +[ l T7 +[ l i1e +[ l swn +[ o0" +[ o0/ +[ o04 +[ o0> +[ o0F +[ o0N +[ o0S +[ o0W +[ o0d +[ o0l +[ o0n +[ o0q +[ o0z +[ o1 +[ o1& +[ o10 +[ o17 +[ o1g +[ o1n i3A +[ o1o +[ o1t +[ o1y +[ o2 +[ o23 i32 +[ o2; +[ o2A +[ o2G +[ o2W C +[ o2Y +[ o2d +[ o2q +[ o2t +[ o2u Z1 +[ o2v +[ o2z +[ o2} r +[ o3 +[ o3+ +[ o33 +[ o3I +[ o3J +[ o3U +[ o3_ +[ o3a +[ o3c +[ o3d +[ o3j +[ o3l +[ o3p sgs +[ o3r +[ o3s +[ o3z +[ o4 +[ o4% +[ o4+ +[ o41 +[ o4W C +[ o4j +[ o4s +[ o4t +[ o4t O23 +[ o4u +[ o4w +[ o5) +[ o56 +[ o5f +[ o5g +[ o5i +[ o5l i0r +[ o5n +[ o5u +[ o6 +[ o6/ +[ o68 +[ o6g +[ o7H +[ o7i +[ o7n +[ o9> +[ oA4 } +[ p1 ^} +[ p1 sc2 +[ p1 O63 +[ p2 +[ p2 O24 +[ p3 +[ p4 +[ p5 +[ q +[ q o4m +[ q O27 +[ q O2A +[ q z4 +[ r +[ r *20 +[ r z3 +[ r } +[ s-g +[ s07 +[ s0p +[ s7+ +[ s8T +[ s9U o0^ +[ sLe +[ sWi +[ sa@ +[ sat +[ scb +[ sez +[ sez $u +[ sh1 +[ shG +[ sj6 +[ slt +[ snw r +[ sqE +[ srz +[ ss? +[ st +[ sts +[ sv9 +[ swL +[ sxc +[ sz6 +[ sz8 +[ sz9 +[ szp +[ t *42 +[ t z2 +[ t } +[ u +[ u i2A +[ u o5g +[ O02 z2 +[ O12 +[ O13 $m +[ O15 +[ O15 s6K +[ O17 +[ O21 +[ O21 d +[ O23 sa+ +[ O24 +[ O24 $v +[ O25 +[ O26 +[ O31 +[ O32 +[ O34 +[ O34 s4d +[ O37 O41 +[ O41 u +[ O42 +[ O43 Z2 +[ O45 +[ O45 $L +[ O45 z2 +[ O51 +[ O51 o1_ +[ O52 $z +[ O53 +[ O64 +[ O6A +[ O71 O05 +[ O73 +[ O74 c +[ O93 O34 +[ z1 +[ z1 -4 +[ z1 o2D +[ z2 +[ z2 ^1 +[ z2 ^k +[ z2 i49 +[ z2 l +[ z3 +[ z3 *48 +[ z3 *79 +[ z3 R0 +[ z3 Z2 +[ z4 +[ z4 +5 +[ z4 } +[ z5 +[ z5 *19 +[ z5 seb +[ z5 O67 +[ { +[ { *35 +[ { D1 +[ { Z4 +[ { u +[ } ^K +[ } o3u ] -]$!Z3 -]$+ -]$: -]$C*17 -]$a{ -]$of -]$q^Q -]*10i0c -]*13 -]*13] -]*13z5 -]*16 -]*35 -]*36O43 -]*60 -]*64o5w -]*8BO63 -]+2*26 -]-1 -]-4 -]-4} -]D0u -]D1f -]D3R0 -]K -]KD5 -]Kp1 -]KO01 -]Kz2 -]T4 -]Z1^f -]Z2o5- -]Z3 -]Z3i6j -]Z4k -]] -]]] -]]]] -]]]]] -]]]]]c -]]]]c -]]]c -]]c -]^#u -]^( -]^5f -]^7 -]^F -]^ashm -]^nsmk -]^r -]^s -]c -]cD6 -]cT6 -]di4^ -]du -]f -]fO51 -]i00^< -]i26 -]i28*42 -]i2a -]i3'Z2 -]i31 -]i3= -]i3s -]i4_ -]iAh -]o0kz2 -]o1r -]o32Z3 -]o3W -]o3_ -]o3z -]o55d -]o56 -]o5g -]o5l -]o5r -]o5x -]o5yZ1 -]o6g -]p1 -]p2 -]p2O49 -]p2z2 -]q^z -]qd -]r -]rZ5 -]s2oK -]sau -]shW -]shf -]si7k -]sm9 -]snl -]stf -]stw -]uZ1 -]uZ5 -]uo42 -]ur -]uz5 -]O01} -]O02t -]O64+6 -]O71i0Z -]OB8Z3 -]z2 -]z3 -]z3{ -]z4 -]z4$f -]z5 -]z5+2 -]{*56 -]{r -]} +] $! Z3 +] $+ +] $: +] $C *17 +] $a { +] $o f +] $q ^Q +] *10 i0c +] *13 +] *13 ] +] *13 z5 +] *16 +] *35 +] *36 O43 +] *60 +] *64 o5w +] *8B O63 +] +2 *26 +] -1 +] -4 +] -4 } +] D0 u +] D1 f +] D3 R0 +] K +] K D5 +] K p1 +] K O01 +] K z2 +] T4 +] Z1 ^f +] Z2 o5- +] Z3 +] Z3 i6j +] Z4 k +] ] +] ] ] +] ] ] ] +] ] ] ] ] +] ] ] ] ] c +] ] ] ] c +] ] ] c +] ] c +] ^# u +] ^( +] ^5 f +] ^7 +] ^F +] ^a shm +] ^n smk +] ^r +] ^s +] c +] c D6 +] c T6 +] d i4^ +] d u +] f +] f O51 +] i00 ^< +] i26 +] i28 *42 +] i2a +] i3' Z2 +] i31 +] i3= +] i3s +] i4_ +] iAh +] o0k z2 +] o1r +] o32 Z3 +] o3W +] o3_ +] o3z +] o55 d +] o56 +] o5g +] o5l +] o5r +] o5x +] o5y Z1 +] o6g +] p1 +] p2 +] p2 O49 +] p2 z2 +] q ^z +] q d +] r +] r Z5 +] s2o K +] sau +] shW +] shf +] si7 k +] sm9 +] snl +] stf +] stw +] u Z1 +] u Z5 +] u o42 +] u r +] u z5 +] O01 } +] O02 t +] O64 +6 +] O71 i0Z +] OB8 Z3 +] z2 +] z3 +] z3 { +] z4 +] z4 $f +] z5 +] z5 +2 +] { *56 +] { r +] } ^ -^ $ -^ $Ho2* -^ *20 -^ +3^1 -^ ^ -^ ^-i1$ -^ ^OR1 -^ ^i -^ ^x -^ i1B -^ i2 -^ o4< -^ o5xT1 -^ r -^ s31 -^ O24 -^ z3 -^ z4 -^ z5 -^ } +^ $ +^ $H o2* +^ *20 +^ +3 ^1 +^ ^ +^ ^- i1$ +^ ^O R1 +^ ^i +^ ^x +^ i1B +^ i2 +^ o4< +^ o5x T1 +^ r +^ s31 +^ O24 +^ z3 +^ z4 +^ z5 +^ } ^! -^!$! -^!$$ -^!$3T6 -^!$As!Q -^!$z -^!*40 -^!+4 -^!@6o36 -^!C -^!Z3{ +^! $! +^! $$ +^! $3 T6 +^! $A s!Q +^! $z +^! *40 +^! +4 +^! @6 o36 +^! C +^! Z3 { z3 -^!^1 -^!^\ -^!^ji7i -^!d -^!i4/ -^!i78 -^!ss\ -^!O18 -^!O71 -^!z1 -^!z2 -^!z3*38 -^!z5'A +^! ^1 +^! ^\ +^! ^j i7i +^! d +^! i4/ +^! i78 +^! ss\ +^! O18 +^! O71 +^! z1 +^! z2 +^! z3 *38 +^! z5 'A ^" -^"$" -^"$ki4Y -^"'5 -^"Cs1o -^"D4 -^"R3 -^"^\ -^"^j -^"^o] -^"i3p -^"sie$0 -^"O0A$= -^"z3 +^" $" +^" $k i4Y +^" '5 +^" C s1o +^" D4 +^" R3 +^" ^\ +^" ^j +^" ^o ] +^" i3p +^" sie $0 +^" O0A $= +^" z3 ^# -^#$# -^#$1 -^#$@ -^#$p -^#*24 -^#*24$1 -^#*30 -^#*57o6" -^#*B7$0 -^#+7 -^#D6 -^#R3^& -^#T2 -^#^)o2f -^#^+ -^#^@ -^#^@^! -^#i1k -^#i2#$j -^#l -^#r -^#scm -^#sgw -^#O52 -^#O75 -^#z1 -^#} +^# $# +^# $1 +^# $@ +^# $p +^# *24 +^# *24 $1 +^# *30 +^# *57 o6" +^# *B7 $0 +^# +7 +^# D6 +^# R3 ^& +^# T2 +^# ^) o2f +^# ^+ +^# ^@ +^# ^@ ^! +^# i1k +^# i2# $j +^# l +^# r +^# scm +^# sgw +^# O52 +^# O75 +^# z1 +^# } ^$ -^$$$ -^$$1 -^$$9 -^$$? -^$*02 -^$+1i3l -^$-5$y -^$^#^@^! -^$^$ -^$^w-5 -^$d -^$i3l -^$o1p -^$o2D -^$qo4i -^$ss$ -^$tZ1 -^$tz3 -^$z4 -^$z5 +^$ $$ +^$ $1 +^$ $9 +^$ $? +^$ *02 +^$ +1 i3l +^$ -5 $y +^$ ^# ^@ ^! +^$ ^$ +^$ ^w -5 +^$ d +^$ i3l +^$ o1p +^$ o2D +^$ q o4i +^$ ss$ +^$ t Z1 +^$ t z3 +^$ z4 +^$ z5 ^% -^%$/ -^%$g$g -^%*01K -^%*12 -^%+6O52 -^%-1 -^%R4 -^%] -^%^$ -^%^$^#^@^! -^%^O -^%i4M -^%sj8 -^%ti6g -^%z1 -^%z2 -^%z5 +^% $/ +^% $g $g +^% *01 K +^% *12 +^% +6 O52 +^% -1 +^% R4 +^% ] +^% ^$ +^% ^$ ^# ^@ ^! +^% ^O +^% i4M +^% sj8 +^% t i6g +^% z1 +^% z2 +^% z5 ^& -^&$2 -^&$; -^&'6 -^&^#*72 -^&c -^&d -^&i12*58 -^&i68^4 -^&i8j -^&o9| -^&u -^&z2 -^&} +^& $2 +^& $; +^& '6 +^& ^# *72 +^& c +^& d +^& i12 *58 +^& i68 ^4 +^& i8j +^& o9| +^& u +^& z2 +^& } ^' -^'@5 -^'R6 -^'Z4 -^'] -^'^<-7 -^'i1H -^'p2 -^'O51 -^'z1o6k -^'z3 +^' @5 +^' R6 +^' Z4 +^' ] +^' ^< -7 +^' i1H +^' p2 +^' O51 +^' z1 o6k +^' z3 ^( -^($#O0B -^($) -^(*25 -^(-0*48 -^(D1 -^(i3) -^(o7) -^(q -^(q[ -^(r -^(O06z1 -^(} +^( $# O0B +^( $) +^( *25 +^( -0 *48 +^( D1 +^( i3) +^( o7) +^( q +^( q [ +^( r +^( O06 z1 +^( } ^) -^)$m -^)*25 -^)L6 -^)T4 -^)Z2 -^)i6ho5_ -^)O23 -^)z1 +^) $m +^) *25 +^) L6 +^) T4 +^) Z2 +^) i6h o5_ +^) O23 +^) z1 ^* -^*$* -^*$- -^**31 -^**61$v -^*+1 -^*C -^*D1l -^*K -^*R1 -^*] -^*^* -^*^^ -^*d -^*o4z -^*r -^*ss# -^*O17 -^*O51 -^*z5 +^* $* +^* $- +^* *31 +^* *61 $v +^* +1 +^* C +^* D1 l +^* K +^* R1 +^* ] +^* ^* +^* ^^ +^* d +^* o4z +^* r +^* ss# +^* O17 +^* O51 +^* z5 ^+ -^+$+ -^+$N -^+$q -^+'3 -^+*13 -^+-4 -^+Z1 -^+Z4D9 -^+^1 -^+^a -^+^f -^+^j -^+d -^+i0m -^+i1/ -^+lq -^+sdmo5( -^+u -^+O13 -^+O23 -^+z1 -^+z2 -^+z5 +^+ $+ +^+ $N +^+ $q +^+ '3 +^+ *13 +^+ -4 +^+ Z1 +^+ Z4 D9 +^+ ^1 +^+ ^a +^+ ^f +^+ ^j +^+ d +^+ i0m +^+ i1/ +^+ l q +^+ sdm o5( +^+ u +^+ O13 +^+ O23 +^+ z1 +^+ z2 +^+ z5 ^, -^,$, -^,$z'8 -^,*28} -^,^- -^,^0o5a -^,c -^,r -^,z3 +^, $, +^, $z '8 +^, *28 } +^, ^- +^, ^0 o5a +^, c +^, r +^, z3 ^- -^-$, -^-$@ -^-*63^e -^-+5$5 -^--5 -^-C -^-D3 -^-^+ -^-^4 -^-^6 -^-^A -^-^T -^-^_ -^-^b -^-^g -^-^j -^-^p -^-d -^-i1Z -^-l -^-o0wi58 -^-o7v$w -^-s-m -^-z3 -^-z4 -^-} +^- $, +^- $@ +^- *63 ^e +^- +5 $5 +^- -5 +^- C +^- D3 +^- ^+ +^- ^4 +^- ^6 +^- ^A +^- ^T +^- ^_ +^- ^b +^- ^g +^- ^j +^- ^p +^- d +^- i1Z +^- l +^- o0w i58 +^- o7v $w +^- s-m +^- z3 +^- z4 +^- } ^. -^.$? -^.*03$p -^.-1 -^.^, -^.^1 -^.^a -^.^f -^.^t -^.d -^.i0m -^.l -^.O16z2 -^.O26 -^.z1 -^.z2 -^.z4 +^. $? +^. *03 $p +^. -1 +^. ^, +^. ^1 +^. ^a +^. ^f +^. ^t +^. d +^. i0m +^. l +^. O16 z2 +^. O26 +^. z1 +^. z2 +^. z4 ^/ -^/$/ -^/+2Z1 -^/^7 -^/c -^/d} -^/i1s^P -^/i2c -^/o1$ -^/r -^/z1 -^/z2 -^/z4 -^/z4c +^/ $/ +^/ +2 Z1 +^/ ^7 +^/ c +^/ d } +^/ i1s ^P +^/ i2c +^/ o1$ +^/ r +^/ z1 +^/ z2 +^/ z4 +^/ z4 c ^0 -^0$0 -^0$: -^0$c -^0*05 -^0*20 -^0*32*31 -^0*34 -^0*70 -^0+4 -^0-4 -^0-5 -^0@l -^0L4 -^0R5 -^0T1 -^0T4O24 -^0Z1sh> -^0Z1} -^0^0 -^0^0^0^2 -^0^1 -^0^1^0^2 -^0^2 -^0^3 -^0^4 -^0^5 -^0^6 -^0^6^9^1 -^0^7 -^0^7^9^1 -^0^8 -^0^8^9^1 -^0^9 -^0^9^9^1 -^0^J -^0^L -^0^a -^0^b -^0^c -^0^d -^0^e -^0^f -^0^k -^0^s -^0c -^0d -^0lZ2 -^0o6- -^0r -^0u'9 -^0O12 -^0O63 -^0z2 -^0z3 -^0z5 -^0} -^0}z2 +^0 $0 +^0 $: +^0 $c +^0 *05 +^0 *20 +^0 *32 *31 +^0 *34 +^0 *70 +^0 +4 +^0 -4 +^0 -5 +^0 @l +^0 L4 +^0 R5 +^0 T1 +^0 T4 O24 +^0 Z1 sh> +^0 Z1 } +^0 ^0 +^0 ^0 ^0 ^2 +^0 ^1 +^0 ^1 ^0 ^2 +^0 ^2 +^0 ^3 +^0 ^4 +^0 ^5 +^0 ^6 +^0 ^6 ^9 ^1 +^0 ^7 +^0 ^7 ^9 ^1 +^0 ^8 +^0 ^8 ^9 ^1 +^0 ^9 +^0 ^9 ^9 ^1 +^0 ^J +^0 ^L +^0 ^a +^0 ^b +^0 ^c +^0 ^d +^0 ^e +^0 ^f +^0 ^k +^0 ^s +^0 c +^0 d +^0 l Z2 +^0 o6- +^0 r +^0 u '9 +^0 O12 +^0 O63 +^0 z2 +^0 z3 +^0 z5 +^0 } +^0 } z2 ^1 -^1$" -^1$* -^1$+ -^1$0 -^1$1 -^1$2 -^1$2$3 -^1$@ -^1'8 -^1'9 -^1*01$0 -^1*06 -^1*15 -^1*28 -^1*32 -^1*36 -^1*50 -^1*64 -^1+8^J -^1-1 -^1-1O65 -^1-3u -^1-9 -^1D4 -^1R8 -^1T5 -^1T7 -^1Z1 -^1Z3 -^1Z4 -^1^! -^1^0 -^1^0^0^2 -^1^1 -^1^2 -^1^3 -^1^4 -^1^5 -^1^6 -^1^6^9^1 -^1^7 -^1^7^9^1 -^1^7i4v -^1^8 -^1^8^9^1 -^1^9 -^1^9^9^1 -^1^a -^1^b -^1^c -^1^d -^1^e -^1^e^h^t -^1^f -^1c -^1d -^1i0r -^1o1f -^1o1i -^1o20 -^1o3w -^1o4C -^1o4n -^1o5l -^1o63 -^1oA%O76 -^1r*02 -^1s8x -^1O52 -^1O56 -^1O73 -^1z2 -^1z2O68 -^1z3 -^1z3-0 -^1z3} -^1z4 -^1z5 -^1{+5 +^1 $" +^1 $* +^1 $+ +^1 $0 +^1 $1 +^1 $2 +^1 $2 $3 +^1 $@ +^1 '8 +^1 '9 +^1 *01 $0 +^1 *06 +^1 *15 +^1 *28 +^1 *32 +^1 *36 +^1 *50 +^1 *64 +^1 +8 ^J +^1 -1 +^1 -1 O65 +^1 -3 u +^1 -9 +^1 D4 +^1 R8 +^1 T5 +^1 T7 +^1 Z1 +^1 Z3 +^1 Z4 +^1 ^! +^1 ^0 +^1 ^0 ^0 ^2 +^1 ^1 +^1 ^2 +^1 ^3 +^1 ^4 +^1 ^5 +^1 ^6 +^1 ^6 ^9 ^1 +^1 ^7 +^1 ^7 ^9 ^1 +^1 ^7 i4v +^1 ^8 +^1 ^8 ^9 ^1 +^1 ^9 +^1 ^9 ^9 ^1 +^1 ^a +^1 ^b +^1 ^c +^1 ^d +^1 ^e +^1 ^e ^h ^t +^1 ^f +^1 c +^1 d +^1 i0r +^1 o1f +^1 o1i +^1 o20 +^1 o3w +^1 o4C +^1 o4n +^1 o5l +^1 o63 +^1 oA% O76 +^1 r *02 +^1 s8x +^1 O52 +^1 O56 +^1 O73 +^1 z2 +^1 z2 O68 +^1 z3 +^1 z3 -0 +^1 z3 } +^1 z4 +^1 z5 +^1 { +5 ^2 -^2$$ -^2$* -^2$2 -^2$Io4q -^2*02z2 -^2*0A -^2*31 -^2*35 -^2*47 -^2*71 -^2+8D2 -^2C -^2D4 -^2D5 -^2Z2 -^2^0 -^2^0^0^2 -^2^1 -^2^1$3 -^2^1$3$4 -^2^1$3$4$5 -^2^2 -^2^3 -^2^4 -^2^5 -^2^6 -^2^6^9^1 -^2^7 -^2^7^9^1 -^2^8 -^2^8^9^1 -^2^9 -^2^9^9^1 -^2^A -^2^L -^2^a -^2^b -^2^c -^2^d -^2^e -^2^f -^2c -^2cD7 -^2d -^2i2K -^2i42 -^2i5d -^2i6a -^2i74t -^2o1M -^2o1Z -^2o42 -^2o4l -^2o7d@7 -^2o8} -^2O26f -^2O53 -^2O59l -^2O85 -^2z2 -^2z5 +^2 $$ +^2 $* +^2 $2 +^2 $I o4q +^2 *02 z2 +^2 *0A +^2 *31 +^2 *35 +^2 *47 +^2 *71 +^2 +8 D2 +^2 C +^2 D4 +^2 D5 +^2 Z2 +^2 ^0 +^2 ^0 ^0 ^2 +^2 ^1 +^2 ^1 $3 +^2 ^1 $3 $4 +^2 ^1 $3 $4 $5 +^2 ^2 +^2 ^3 +^2 ^4 +^2 ^5 +^2 ^6 +^2 ^6 ^9 ^1 +^2 ^7 +^2 ^7 ^9 ^1 +^2 ^8 +^2 ^8 ^9 ^1 +^2 ^9 +^2 ^9 ^9 ^1 +^2 ^A +^2 ^L +^2 ^a +^2 ^b +^2 ^c +^2 ^d +^2 ^e +^2 ^f +^2 c +^2 c D7 +^2 d +^2 i2K +^2 i42 +^2 i5d +^2 i6a +^2 i74 t +^2 o1M +^2 o1Z +^2 o42 +^2 o4l +^2 o7d @7 +^2 o8} +^2 O26 f +^2 O53 +^2 O59 l +^2 O85 +^2 z2 +^2 z5 ^3 -^3$3 -^3$N -^3$j -^3*02 -^3*54 -^3*94'7 -^3-5 -^3-6 -^3@m -^3D5^, -^3R1 -^3Z1 -^3^0 -^3^0^0^2 -^3^1 -^3^2 -^3^2^1 -^3^2^1$3$2$1 -^3^2^1$4$5 -^3^2^1$4$5$6 -^3^3 -^3^4 -^3^5 -^3^6 -^3^6^9^1 -^3^7 -^3^7^9^1 -^3^8 -^3^8^9^1 -^3^9 -^3^9^9^1 -^3^< -^3^R -^3^]^e -^3^a -^3^b -^3^c -^3^d -^3^e -^3^f -^3^wsna -^3c -^3d -^3f^< -^3i0(} -^3i5t -^3i68 -^3o1G^i -^3o1e -^3o2x -^3r*06 -^3st^ -^3tO74 -^3O12 -^3O14 -^3O23 -^3O36 -^3O37o16 -^3O57 -^3OA5 -^3z2 -^3z4 -^3z5 -^3z5Z1 -^3{T3 -^3}$6 +^3 $3 +^3 $N +^3 $j +^3 *02 +^3 *54 +^3 *94 '7 +^3 -5 +^3 -6 +^3 @m +^3 D5 ^, +^3 R1 +^3 Z1 +^3 ^0 +^3 ^0 ^0 ^2 +^3 ^1 +^3 ^2 +^3 ^2 ^1 +^3 ^2 ^1 $3 $2 $1 +^3 ^2 ^1 $4 $5 +^3 ^2 ^1 $4 $5 $6 +^3 ^3 +^3 ^4 +^3 ^5 +^3 ^6 +^3 ^6 ^9 ^1 +^3 ^7 +^3 ^7 ^9 ^1 +^3 ^8 +^3 ^8 ^9 ^1 +^3 ^9 +^3 ^9 ^9 ^1 +^3 ^< +^3 ^R +^3 ^] ^e +^3 ^a +^3 ^b +^3 ^c +^3 ^d +^3 ^e +^3 ^f +^3 ^w sna +^3 c +^3 d +^3 f ^< +^3 i0( } +^3 i5t +^3 i68 +^3 o1G ^i +^3 o1e +^3 o2x +^3 r *06 +^3 st^ +^3 t O74 +^3 O12 +^3 O14 +^3 O23 +^3 O36 +^3 O37 o16 +^3 O57 +^3 OA5 +^3 z2 +^3 z4 +^3 z5 +^3 z5 Z1 +^3 { T3 +^3 } $6 ^4 -^4$! -^4$4 -^4$b -^4$s -^4*14 -^4+8c -^4-8 -^4C -^4K^k -^4T1 -^4^/ -^4^0 -^4^0^0^2 -^4^1 -^4^2 -^4^3 -^4^3^2^1 -^4^4 -^4^5 -^4^6 -^4^6^9^1 -^4^7 -^4^7^9^1 -^4^8 -^4^8^9^1 -^4^9 -^4^9^9^1 -^4^I -^4^a -^4^b -^4^c -^4^d -^4^e -^4^f -^4d -^4i1e -^4i6/ -^4i8;o2& -^4o3x -^4o5? -^4o62 -^4rc -^4sb1 -^4sd -^4t^i -^4uD6 -^4O23 -^4O2A -^4O31 -^4O35 -^4O52u -^4O62 -^4O78 -^4z2 -^4z3 -^4} +^4 $! +^4 $4 +^4 $b +^4 $s +^4 *14 +^4 +8 c +^4 -8 +^4 C +^4 K ^k +^4 T1 +^4 ^/ +^4 ^0 +^4 ^0 ^0 ^2 +^4 ^1 +^4 ^2 +^4 ^3 +^4 ^3 ^2 ^1 +^4 ^4 +^4 ^5 +^4 ^6 +^4 ^6 ^9 ^1 +^4 ^7 +^4 ^7 ^9 ^1 +^4 ^8 +^4 ^8 ^9 ^1 +^4 ^9 +^4 ^9 ^9 ^1 +^4 ^I +^4 ^a +^4 ^b +^4 ^c +^4 ^d +^4 ^e +^4 ^f +^4 d +^4 i1e +^4 i6/ +^4 i8; o2& +^4 o3x +^4 o5? +^4 o62 +^4 r c +^4 sb1 +^4 sd +^4 t ^i +^4 u D6 +^4 O23 +^4 O2A +^4 O31 +^4 O35 +^4 O52 u +^4 O62 +^4 O78 +^4 z2 +^4 z3 +^4 } ^5 -^5$1 -^5$4 -^5$5 -^5*31 -^5*40 -^5*41 -^5+1 -^5@3L3 -^5D7 -^5L0$q -^5R2 -^5R3 -^5R6 -^5Z1 -^5^0 -^5^0^0^2 -^5^1 -^5^2 -^5^3 -^5^4 -^5^4^3^2^1 -^5^5 -^5^6 -^5^6^9^1 -^5^7 -^5^7^9^1 -^5^8 -^5^8^9^1 -^5^9 -^5^9^9^1 -^5^9O47 -^5^U -^5^a -^5^b -^5^c -^5^d -^5^e -^5^f -^5d -^5f'9 -^5i0$ -^5i51o3d -^5l -^5o2BZ2 -^5o5F -^5r -^5s!f -^5s4r -^5t -^5O27o3K -^5z1*26 -^5z2 -^5z3 -^5z4^> +^5 $1 +^5 $4 +^5 $5 +^5 *31 +^5 *40 +^5 *41 +^5 +1 +^5 @3 L3 +^5 D7 +^5 L0 $q +^5 R2 +^5 R3 +^5 R6 +^5 Z1 +^5 ^0 +^5 ^0 ^0 ^2 +^5 ^1 +^5 ^2 +^5 ^3 +^5 ^4 +^5 ^4 ^3 ^2 ^1 +^5 ^5 +^5 ^6 +^5 ^6 ^9 ^1 +^5 ^7 +^5 ^7 ^9 ^1 +^5 ^8 +^5 ^8 ^9 ^1 +^5 ^9 +^5 ^9 ^9 ^1 +^5 ^9 O47 +^5 ^U +^5 ^a +^5 ^b +^5 ^c +^5 ^d +^5 ^e +^5 ^f +^5 d +^5 f '9 +^5 i0$ +^5 i51 o3d +^5 l +^5 o2B Z2 +^5 o5F +^5 r +^5 s!f +^5 s4r +^5 t +^5 O27 o3K +^5 z1 *26 +^5 z2 +^5 z3 +^5 z4 ^> ^6 -^6$2 -^6$6 -^6$k -^6$yi1Y -^6'8 -^6*07 -^6*12 -^6*41c -^6*52 -^6-1 -^6D2 -^6K -^6L1 -^6L3*38 -^6T1 -^6T2 -^6Z1 -^6Z2} -^6Z3 -^6^0 -^6^0^0^2 -^6^1 -^6^2 -^6^3 -^6^4 -^6^5 -^6^5^4^3^2^1 -^6^6 -^6^6^9^1 -^6^7 -^6^7^9^1 -^6^8 -^6^8^9^1 -^6^9 -^6^9^9^1 -^6^a -^6^b -^6^c -^6^d -^6^e -^6^f -^6^o -^6d -^6i1b -^6i3 -^6i42 -^6l -^6o07@5 -^6o3a -^6t -^6t^7 -^6O12 -^6O15 -^6O42^g -^6O56 -^6z2 -^6z5 -^6} +^6 $2 +^6 $6 +^6 $k +^6 $y i1Y +^6 '8 +^6 *07 +^6 *12 +^6 *41 c +^6 *52 +^6 -1 +^6 D2 +^6 K +^6 L1 +^6 L3 *38 +^6 T1 +^6 T2 +^6 Z1 +^6 Z2 } +^6 Z3 +^6 ^0 +^6 ^0 ^0 ^2 +^6 ^1 +^6 ^2 +^6 ^3 +^6 ^4 +^6 ^5 +^6 ^5 ^4 ^3 ^2 ^1 +^6 ^6 +^6 ^6 ^9 ^1 +^6 ^7 +^6 ^7 ^9 ^1 +^6 ^8 +^6 ^8 ^9 ^1 +^6 ^9 +^6 ^9 ^9 ^1 +^6 ^a +^6 ^b +^6 ^c +^6 ^d +^6 ^e +^6 ^f +^6 ^o +^6 d +^6 i1b +^6 i3 +^6 i42 +^6 l +^6 o07 @5 +^6 o3a +^6 t +^6 t ^7 +^6 O12 +^6 O15 +^6 O42 ^g +^6 O56 +^6 z2 +^6 z5 +^6 } ^7 -^7$+ -^7$7 -^7$fO53 -^7$h -^7'9 -^7*09 -^7*27 -^7*35 -^7*43 -^7+6 -^7-2 -^7-2$7 -^7-3 -^7@0 -^7L3Z1 -^7R3s80 -^7Z3 -^7Z3t -^7^0 -^7^0^0^2 -^7^1 -^7^2 -^7^3 -^7^4 -^7^5 -^7^6 -^7^6^9^1 -^7^7 -^7^7^9^1 -^7^8 -^7^8^9^1 -^7^9 -^7^9^9^1 -^7^a -^7^b -^7^c -^7^d -^7^e -^7^f -^7c -^7d -^7o2n -^7o3# -^7q -^7r -^7s2sl -^7s7] -^7sc% -^7tz3 -^7O27 -^7O32 -^7O62 -^7z1o6, -^7z1t -^7z2 -^7z4 -^7z5 -^7} +^7 $+ +^7 $7 +^7 $f O53 +^7 $h +^7 '9 +^7 *09 +^7 *27 +^7 *35 +^7 *43 +^7 +6 +^7 -2 +^7 -2 $7 +^7 -3 +^7 @0 +^7 L3 Z1 +^7 R3 s80 +^7 Z3 +^7 Z3 t +^7 ^0 +^7 ^0 ^0 ^2 +^7 ^1 +^7 ^2 +^7 ^3 +^7 ^4 +^7 ^5 +^7 ^6 +^7 ^6 ^9 ^1 +^7 ^7 +^7 ^7 ^9 ^1 +^7 ^8 +^7 ^8 ^9 ^1 +^7 ^9 +^7 ^9 ^9 ^1 +^7 ^a +^7 ^b +^7 ^c +^7 ^d +^7 ^e +^7 ^f +^7 c +^7 d +^7 o2n +^7 o3# +^7 q +^7 r +^7 s2s l +^7 s7] +^7 sc% +^7 t z3 +^7 O27 +^7 O32 +^7 O62 +^7 z1 o6, +^7 z1 t +^7 z2 +^7 z4 +^7 z5 +^7 } ^8 -^8$(*86 -^8$6 -^8$8 -^8$9 -^8$CT6 -^8$I -^8$j -^8$w -^8'7 -^8*41 -^8+1 -^8+7 -^8+8o68 -^8-9 -^8D1c -^8R1 -^8T1 -^8^0 -^8^0^0^2 -^8^1 -^8^2 -^8^3 -^8^4 -^8^5 -^8^6 -^8^6^9^1 -^8^7 -^8^7^9^1 -^8^8 -^8^8^9^1 -^8^9 -^8^9^9^1 -^8^a -^8^b -^8^c -^8^d -^8^e -^8^f -^8^i -^8d -^8i3F -^8i4d -^8k^8 -^8l -^8r -^8sod -^8t -^8O36 -^8O4AZ1 -^8O53 -^8O62 -^8O93 -^8z1@3 -^8z2 -^8z3o7x -^8z4 -^8z5 -^8} +^8 $( *86 +^8 $6 +^8 $8 +^8 $9 +^8 $C T6 +^8 $I +^8 $j +^8 $w +^8 '7 +^8 *41 +^8 +1 +^8 +7 +^8 +8 o68 +^8 -9 +^8 D1 c +^8 R1 +^8 T1 +^8 ^0 +^8 ^0 ^0 ^2 +^8 ^1 +^8 ^2 +^8 ^3 +^8 ^4 +^8 ^5 +^8 ^6 +^8 ^6 ^9 ^1 +^8 ^7 +^8 ^7 ^9 ^1 +^8 ^8 +^8 ^8 ^9 ^1 +^8 ^9 +^8 ^9 ^9 ^1 +^8 ^a +^8 ^b +^8 ^c +^8 ^d +^8 ^e +^8 ^f +^8 ^i +^8 d +^8 i3F +^8 i4d +^8 k ^8 +^8 l +^8 r +^8 sod +^8 t +^8 O36 +^8 O4A Z1 +^8 O53 +^8 O62 +^8 O93 +^8 z1 @3 +^8 z2 +^8 z3 o7x +^8 z4 +^8 z5 +^8 } ^9 -^9$+ -^9$0 -^9$9 -^9$G -^9$x -^9*24 -^9*53 -^9+7 -^9-2 -^9L1 -^9R5R6 -^9R6i0^ -^9T5 -^9Z1 -^9^# -^9^0 -^9^0^0^2 -^9^1 -^9^2 -^9^3 -^9^4 -^9^5 -^9^6 -^9^6^9^1 -^9^7 -^9^7^9^1 -^9^8 -^9^8^9^1 -^9^9 -^9^9^9^1 -^9^a -^9^b -^9^c -^9^d -^9^e -^9^f -^9c -^9d -^9dz2 -^9i1- -^9i1b -^9i7HO35 -^9o3a -^9o5n -^9o6s -^9o70 -^9o87 -^9q+6 -^9t -^9O31 -^9z2 -^9z2D5 -^9z4 +^9 $+ +^9 $0 +^9 $9 +^9 $G +^9 $x +^9 *24 +^9 *53 +^9 +7 +^9 -2 +^9 L1 +^9 R5 R6 +^9 R6 i0^ +^9 T5 +^9 Z1 +^9 ^# +^9 ^0 +^9 ^0 ^0 ^2 +^9 ^1 +^9 ^2 +^9 ^3 +^9 ^4 +^9 ^5 +^9 ^6 +^9 ^6 ^9 ^1 +^9 ^7 +^9 ^7 ^9 ^1 +^9 ^8 +^9 ^8 ^9 ^1 +^9 ^9 +^9 ^9 ^9 ^1 +^9 ^a +^9 ^b +^9 ^c +^9 ^d +^9 ^e +^9 ^f +^9 c +^9 d +^9 d z2 +^9 i1- +^9 i1b +^9 i7H O35 +^9 o3a +^9 o5n +^9 o6s +^9 o70 +^9 o87 +^9 q +6 +^9 t +^9 O31 +^9 z2 +^9 z2 D5 +^9 z4 ^: -^:$! -^:$h -^:-4t -^:C -^:Ki7T -^:^K -^:^T*27 -^:lr -^:o48 -^:rL2 -^:t -^:z1 -^:z4i4O +^: $! +^: $h +^: -4 t +^: C +^: K i7T +^: ^K +^: ^T *27 +^: l r +^: o48 +^: r L2 +^: t +^: z1 +^: z4 i4O ^; -^;$2Z1 -^;$; -^;*63 -^;+6Z2 -^;D6 -^;R9 -^;^R^0 -^;^s -^;^| -^;c -^;i1> -^;p2O67 -^;soM -^;u -^;OB8O07 -^;z5 +^; $2 Z1 +^; $; +^; *63 +^; +6 Z2 +^; D6 +^; R9 +^; ^R ^0 +^; ^s +^; ^| +^; c +^; i1> +^; p2 O67 +^; soM +^; u +^; OB8 O07 +^; z5 ^< -^<$2 -^<$> -^<*74T3 -^<+5+6 -^ +^< *74 T3 +^< +5 +6 +^< C +5 +^< Z1 +^< i2l z2 +^< t ^D +^< u +^< O16 +^< z1 ^= -^=$0 -^=$= -^=$p -^=*24 -^=T6 -^=Z1 -^=^e -^=i40 -^=l -^=o2 -^=O19c -^=z1 -^=z2 +^= $0 +^= $= +^= $p +^= *24 +^= T6 +^= Z1 +^= ^e +^= i40 +^= l +^= o2 +^= O19 c +^= z1 +^= z2 ^> -^>$* -^>$1o7X -^>$A -^>*03-3 -^>*15 -^>D3$j -^>D4*13 -^>Z3+2 -^>Z5O64 -^>^L -^>i6u -^>o71 -^>O82 +^> $* +^> $1 o7X +^> $A +^> *03 -3 +^> *15 +^> D3 $j +^> D4 *13 +^> Z3 +2 +^> Z5 O64 +^> ^L +^> i6u +^> o71 +^> O82 ^? -^?$t*53 -^?*52 -^?^k -^?i0? -^?i6kO26 -^?l -^?o64 -^?O21 -^?z1-6 -^?z2 -^?z3 +^? $t *53 +^? *52 +^? ^k +^? i0? +^? i6k O26 +^? l +^? o64 +^? O21 +^? z1 -6 +^? z2 +^? z3 ^@ -^@$4 -^@$@ -^@$E$s -^@$e -^@$y -^@'4 -^@'7 -^@+1 -^@-1 -^@Z3O46 -^@^! -^@^!$!$@ -^@^p -^@cZ1 -^@u -^@O15 -^@O71 -^@z1 -^@z1O15 -^@z2 +^@ $4 +^@ $@ +^@ $E $s +^@ $e +^@ $y +^@ '4 +^@ '7 +^@ +1 +^@ -1 +^@ Z3 O46 +^@ ^! +^@ ^! $! $@ +^@ ^p +^@ c Z1 +^@ u +^@ O15 +^@ O71 +^@ z1 +^@ z1 O15 +^@ z2 ^A -^A$6 -^A'5 -^A*56 -^A+1 -^A+6 -^AD3 -^AD4 -^AK$M -^AT5 -^AZ1 -^A^? -^A^L -^A^[ -^A^`^v -^A^{o6/ -^Af -^Ai0W -^Al -^Ao01$5 -^Ao1h -^Ao8^ -^AoAa -^At -^AO21 -^AO32 -^AO38 -^AO63 -^Az1 -^Az2 -^A}^+ +^A $6 +^A '5 +^A *56 +^A +1 +^A +6 +^A D3 +^A D4 +^A K $M +^A T5 +^A Z1 +^A ^? +^A ^L +^A ^[ +^A ^` ^v +^A ^{ o6/ +^A f +^A i0W +^A l +^A o01 $5 +^A o1h +^A o8^ +^A oAa +^A t +^A O21 +^A O32 +^A O38 +^A O63 +^A z1 +^A z2 +^A } ^+ ^B -^B$. -^B$` -^B$j -^B+5 -^B^:z1 -^B^D -^B^V -^B^[T5 -^B^n+1 -^Bd -^Bi0o -^Bo3r -^Bs52 -^Bu -^BO04z3 -^BO32 -^BO35 -^BO3B -^BO42l -^BO67O04 -^Bz1 -^Bz2 +^B $. +^B $` +^B $j +^B +5 +^B ^: z1 +^B ^D +^B ^V +^B ^[ T5 +^B ^n +1 +^B d +^B i0o +^B o3r +^B s52 +^B u +^B O04 z3 +^B O32 +^B O35 +^B O3B +^B O42 l +^B O67 O04 +^B z1 +^B z2 ^C -^C'5 -^C*17-2 -^C*A6 -^C+1 -^C+2 -^CC -^CC*53 -^CZ2 -^C] -^C^! -^Ci58 -^Ci63 -^Ci6r -^Co1a -^Co2u -^Co7\ -^Cp1 -^CscK -^Ct -^Cu -^CO32 +^C '5 +^C *17 -2 +^C *A6 +^C +1 +^C +2 +^C C +^C C *53 +^C Z2 +^C ] +^C ^! +^C i58 +^C i63 +^C i6r +^C o1a +^C o2u +^C o7\ +^C p1 +^C scK +^C t +^C u +^C O32 ^D -^D$7 -^D$m -^D'5 -^D'6 -^D*37L6 -^D*86 -^D-5 -^D@m -^DR3+4 -^DZ1D4 -^D^Fo1y -^Dd -^Di0O -^Di1j -^Do3n -^DO43 -^DO45 -^Dz1 -^Dz2 -^D}R3 +^D $7 +^D $m +^D '5 +^D '6 +^D *37 L6 +^D *86 +^D -5 +^D @m +^D R3 +4 +^D Z1 D4 +^D ^F o1y +^D d +^D i0O +^D i1j +^D o3n +^D O43 +^D O45 +^D z1 +^D z2 +^D } R3 ^E -^E*23 -^E*27 -^E*43 -^E-1 -^E-5 -^ED3 -^EZ1sl# -^E^1 -^E^D -^Ei0_i6o -^Ei1l -^Ei5pO72 -^Ei6k -^Ek -^Eo1fO45 -^Eo38 -^Eo4e -^ErO06 -^Eu -^EO06o01 -^EO51 -^Ez2 -^E} +^E *23 +^E *27 +^E *43 +^E -1 +^E -5 +^E D3 +^E Z1 sl# +^E ^1 +^E ^D +^E i0_ i6o +^E i1l +^E i5p O72 +^E i6k +^E k +^E o1f O45 +^E o38 +^E o4e +^E r O06 +^E u +^E O06 o01 +^E O51 +^E z2 +^E } ^F -^F'4z3 -^F*13 -^F*46 -^F-5l -^FD3 -^FT1$x -^FcO26 -^Fi0B -^Fl -^Fo1l -^Fu -^FO25 -^FO28 -^Fz2 -^F} +^F '4 z3 +^F *13 +^F *46 +^F -5 l +^F D3 +^F T1 $x +^F c O26 +^F i0B +^F l +^F o1l +^F u +^F O25 +^F O28 +^F z2 +^F } ^G -^G$R -^G+7i7' -^G-4 -^G-7 -^GD3 -^GZ2 -^G^M -^Gi5? -^Gl -^Go5i -^Gp1O58 -^Gu -^GO57 -^GO71 -^Gz1 -^Gz1+1 -^Gz2 +^G $R +^G +7 i7' +^G -4 +^G -7 +^G D3 +^G Z2 +^G ^M +^G i5? +^G l +^G o5i +^G p1 O58 +^G u +^G O57 +^G O71 +^G z1 +^G z1 +1 +^G z2 ^H -^H$! -^H'7 -^H*54 -^H*63 -^H*79L1 -^HT4O56 -^H^C -^H^Dser -^H^R -^Hi5` -^Ho3z -^Ho6O -^Hq*63 -^Hu -^HO14 -^HO29 -^HO35c -^HO72l -^Hz1 -^H} +^H $! +^H '7 +^H *54 +^H *63 +^H *79 L1 +^H T4 O56 +^H ^C +^H ^D ser +^H ^R +^H i5` +^H o3z +^H o6O +^H q *63 +^H u +^H O14 +^H O29 +^H O35 c +^H O72 l +^H z1 +^H } ^I -^I'6 -^I*56 -^I-4 -^ID4 -^IZ3o5b -^I^+ -^Ii0S -^Ii5_ -^Il -^Io4m -^Io7gz1 -^Ip1O32 -^It -^Iu -^IO18 -^IO1B -^IO27 -^Iz2 +^I '6 +^I *56 +^I -4 +^I D4 +^I Z3 o5b +^I ^+ +^I i0S +^I i5_ +^I l +^I o4m +^I o7g z1 +^I p1 O32 +^I t +^I u +^I O18 +^I O1B +^I O27 +^I z2 ^J -^J$'+3 -^J$0 -^J$w -^J'6 -^J+6 -^J-1 -^JZ1 -^JZ5 -^J^J -^Ji2) -^Jl -^Jo7N -^JuD3 -^Jz2 +^J $' +3 +^J $0 +^J $w +^J '6 +^J +6 +^J -1 +^J Z1 +^J Z5 +^J ^J +^J i2) +^J l +^J o7N +^J u D3 +^J z2 ^K -^K$k -^K'A -^K-2 -^KD4 -^KL4 -^KT2 -^KZ2 -^KZ2$m -^K^$ -^K^J -^K^T -^Ki03C -^Ki1e -^Ki71 -^Kl -^Kl$Y -^KO13 -^KO24 -^KO34 -^KO42 -^Kz1 -^K}C +^K $k +^K 'A +^K -2 +^K D4 +^K L4 +^K T2 +^K Z2 +^K Z2 $m +^K ^$ +^K ^J +^K ^T +^K i03 C +^K i1e +^K i71 +^K l +^K l $Y +^K O13 +^K O24 +^K O34 +^K O42 +^K z1 +^K } C ^L -^L$4 -^L$8 -^L$T -^L$i -^L*60 -^L+3 -^L-1 -^L@f -^LR7i3( -^L^B -^Lu -^LO19 -^Lz1 -^L} +^L $4 +^L $8 +^L $T +^L $i +^L *60 +^L +3 +^L -1 +^L @f +^L R7 i3( +^L ^B +^L u +^L O19 +^L z1 +^L } ^M -^M$! -^M$D -^M*09 -^M*14$j -^M*46 -^M*71 -^M+1 -^M+4 -^M-1 -^M-5 -^MD4 -^MD6 -^MZ2 -^M^A -^M^G -^M^H -^M^W -^Md -^Mi6i -^Msg -^Mt -^MO13z2 -^MO18 -^MO36 -^MO42 -^MO43 -^MO69 -^Mz1 +^M $! +^M $D +^M *09 +^M *14 $j +^M *46 +^M *71 +^M +1 +^M +4 +^M -1 +^M -5 +^M D4 +^M D6 +^M Z2 +^M ^A +^M ^G +^M ^H +^M ^W +^M d +^M i6i +^M sg +^M t +^M O13 z2 +^M O18 +^M O36 +^M O42 +^M O43 +^M O69 +^M z1 ^N -^N$H -^N$L -^N$h -^N*06O52 -^N+4 -^N^Z -^Ni7[ -^Nl -^No1m -^Np2'5 -^Ns8P+5 -^NO02$x -^NO63 -^Nz1 -^N} +^N $H +^N $L +^N $h +^N *06 O52 +^N +4 +^N ^Z +^N i7[ +^N l +^N o1m +^N p2 '5 +^N s8P +5 +^N O02 $x +^N O63 +^N z1 +^N } ^O -^O$4 -^O$i -^O*17 -^O+5 -^O+6 -^OL3*04 -^OT2 -^O^M -^Oi0}z3 -^Oi5! -^Ol -^Op1 -^Ou -^OO52 -^OO84 -^Oz2 -^Oz4 +^O $4 +^O $i +^O *17 +^O +5 +^O +6 +^O L3 *04 +^O T2 +^O ^M +^O i0} z3 +^O i5! +^O l +^O p1 +^O u +^O O52 +^O O84 +^O z2 +^O z4 ^P -^P$3 -^P$9 -^P$f -^P*42 -^PD7-4 -^PR1 -^PZ2o5| -^P^4 -^P^= -^P^L -^P^M -^Pc -^Pls.y -^Po27sP. -^Po5d -^Po84 -^PO31 -^Pz1 +^P $3 +^P $9 +^P $f +^P *42 +^P D7 -4 +^P R1 +^P Z2 o5| +^P ^4 +^P ^= +^P ^L +^P ^M +^P c +^P l s.y +^P o27 sP. +^P o5d +^P o84 +^P O31 +^P z1 ^Q -^Q-2 -^Q^X -^Q^f{ -^Qi10 -^Qi5& -^Qi5I -^Qi6k -^Ql -^Qr -^Qt -^Qu*34 -^QO16d -^QO43 +^Q -2 +^Q ^X +^Q ^f { +^Q i10 +^Q i5& +^Q i5I +^Q i6k +^Q l +^Q r +^Q t +^Q u *34 +^Q O16 d +^Q O43 ^R -^R$' -^R$R -^R'2p2 -^R*18c -^R*67 -^R@3sRt -^R@z -^RD3 -^RD4 -^RD7 -^RT3 -^RZ1 -^R^D -^Rd -^Rl -^Rq -^RO25 -^RO37 -^Rz1 -^Rz2 +^R $' +^R $R +^R '2 p2 +^R *18 c +^R *67 +^R @3 sRt +^R @z +^R D3 +^R D4 +^R D7 +^R T3 +^R Z1 +^R ^D +^R d +^R l +^R q +^R O25 +^R O37 +^R z1 +^R z2 ^S -^S$S -^S*34O3A -^S*56L7 -^S+1 -^S+3 -^SC -^SD2 -^SR4 -^SZ1*26 -^SZ2 -^S] -^S^F -^S^J -^S^N -^Si4Sk -^SiA*O06 -^Sp1 -^SqTA -^Sr -^St -^St+8 -^Su -^SO12 -^SO14 -^SO64Z1 -^Sz1 -^Sz2 -^Sz3 +^S $S +^S *34 O3A +^S *56 L7 +^S +1 +^S +3 +^S C +^S D2 +^S R4 +^S Z1 *26 +^S Z2 +^S ] +^S ^F +^S ^J +^S ^N +^S i4S k +^S iA* O06 +^S p1 +^S q TA +^S r +^S t +^S t +8 +^S u +^S O12 +^S O14 +^S O64 Z1 +^S z1 +^S z2 +^S z3 ^T -^T$' -^T$) -^T$1 -^T$p -^T'8O41 -^TT1 -^TZ1 -^TZ4-6 -^TZ5 -^T^C -^T^J -^T^Q -^Ti0P -^To0sD5 -^To4n -^To7tiAC -^TO1B -^Tz1 +^T $' +^T $) +^T $1 +^T $p +^T '8 O41 +^T T1 +^T Z1 +^T Z4 -6 +^T Z5 +^T ^C +^T ^J +^T ^Q +^T i0P +^T o0s D5 +^T o4n +^T o7t iAC +^T O1B +^T z1 ^U -^U'3 -^U*35+5 -^Ui63 -^UlO41 -^UqO65 -^Ut -^Ut^v +^U '3 +^U *35 +5 +^U i63 +^U l O41 +^U q O65 +^U t +^U t ^v ^V -^V$R -^V$v -^V$z -^V'5 -^V'8 -^V*15o5T -^V*75^r -^V+3 -^VD4 -^VR1 -^V^= -^V^B -^Vi0i -^Vi1c -^VO06O45 -^VO12 -^VO15 -^VO31 -^VO74O05 -^Vz3 +^V $R +^V $v +^V $z +^V '5 +^V '8 +^V *15 o5T +^V *75 ^r +^V +3 +^V D4 +^V R1 +^V ^= +^V ^B +^V i0i +^V i1c +^V O06 O45 +^V O12 +^V O15 +^V O31 +^V O74 O05 +^V z3 ^W -^W$Lo01 -^W'4 -^W*14 -^W*40 -^W*52 -^W*64 -^W-3i77 -^WL3C -^WT1 -^WZ2 -^W^_ -^Wi5j -^Wi8BO05 -^Wo19K -^Wp1 -^WO15 -^Wz1 -^Wz2 -^Wz5 -^W} +^W $L o01 +^W '4 +^W *14 +^W *40 +^W *52 +^W *64 +^W -3 i77 +^W L3 C +^W T1 +^W Z2 +^W ^_ +^W i5j +^W i8B O05 +^W o19 K +^W p1 +^W O15 +^W z1 +^W z2 +^W z5 +^W } ^X -^X'7 -^X*28 -^X+5 -^X-4 -^XK$2 -^X] -^X^B*4A -^Xi4K -^Xi6r -^Xo1i -^Xo4j^i -^Xu -^XO13+4 -^XO31 -^Xz1 +^X '7 +^X *28 +^X +5 +^X -4 +^X K $2 +^X ] +^X ^B *4A +^X i4K +^X i6r +^X o1i +^X o4j ^i +^X u +^X O13 +4 +^X O31 +^X z1 ^Y -^Y$s+A -^Y*32 -^Y*64 -^YD2 -^YL0 -^Y^_+4 -^Y^yZ1 -^Yi5f -^Yo2b -^Yo5d -^YslK^y -^YO23 -^Yz2 -^Yz4 -^Yz5 +^Y $s +A +^Y *32 +^Y *64 +^Y D2 +^Y L0 +^Y ^_ +4 +^Y ^y Z1 +^Y i5f +^Y o2b +^Y o5d +^Y slK ^y +^Y O23 +^Y z2 +^Y z4 +^Y z5 ^Z -^Z$" -^Z$tz4 -^Z*68 -^Z+3 -^ZL0 -^ZZ4O75 -^Z^B -^Z^M -^Zi4R -^Zi4X -^Zl -^Zp1O14 -^Zsef -^ZO31 -^Zz2 -^Zz3-7 -^[$] -^[*30 -^[C -^[L2{ -^[i5X-1 -^[l -^[o1oo5# -^[o7VZ1 -^[s3[ -^[s[do6a -^[z1L4 +^Z $" +^Z $t z4 +^Z *68 +^Z +3 +^Z L0 +^Z Z4 O75 +^Z ^B +^Z ^M +^Z i4R +^Z i4X +^Z l +^Z p1 O14 +^Z sef +^Z O31 +^Z z2 +^Z z3 -7 +^[ $] +^[ *30 +^[ C +^[ L2 { +^[ i5X -1 +^[ l +^[ o1o o5# +^[ o7V Z1 +^[ s3[ +^[ s[d o6a +^[ z1 L4 ^\ -^\D6 -^\R1 -^\R2o2j -^\Z3 -^\^' -^\o69O04 -^\sr5 -^\O32p1 -^\z1T1 -^\z3 -^\} +^\ D6 +^\ R1 +^\ o2j +^\ Z3 +^\ ^' +^\ o69 O04 +^\ sr5 +^\ O32 p1 +^\ z1 +^\ z3 +^\ } ^] -^]$: -^]$Ll -^]$[ -^]*27t -^]-2 -^]K -^]L0 -^]t -^]O18 -^]O42 -^]z2 +^] $: +^] $L l +^] $[ +^] *27 t +^] -2 +^] K +^] L0 +^] t +^] O18 +^] O42 +^] z2 ^^ -^^$i -^^'5 -^^*85*35 -^^+1i6M -^^D2 -^^^Oz1 -^^i64*57 -^^sx! -^^z1 -^^z3 -^_$3 -^_$6 -^_$Q -^_$_ -^_*32 -^_-1 -^_-6 -^_T1 -^_T4 -^_T6 -^_^\ -^_^_ -^_^a -^_^z -^_d -^_i04 -^_l -^_r -^_O12 -^_O13 -^_z2 -^_z3 +^^ $i +^^ '5 +^^ *85 *35 +^^ +1 i6M +^^ D2 +^^ ^O z1 +^^ i64 *57 +^^ sx! +^^ z1 +^^ z3 +^_ $3 +^_ $6 +^_ $Q +^_ $_ +^_ *32 +^_ -1 +^_ -6 +^_ T1 +^_ T4 +^_ T6 +^_ ^\ +^_ ^_ +^_ ^a +^_ ^z +^_ d +^_ i04 +^_ l +^_ r +^_ O12 +^_ O13 +^_ z2 +^_ z3 ^` -^`$g'6 -^`+0o18 -^`-2 -^`L0 -^`^k -^`i2! -^`o4% -^`o5di2" -^`o6!Z1 -^`q -^`t -^`z1 -^`z2 -^`} +^` $g '6 +^` +0 o18 +^` -2 +^` L0 +^` ^k +^` i2! +^` o4% +^` o5d i2" +^` o6! Z1 +^` q +^` t +^` z1 +^` z2 +^` } ^a -^a$6l -^a$v -^a'B -^a*15 -^a*20 -^a*24 -^a*97 -^aD9 -^aK -^aZ1 -^aZ3l -^aZ4Z3 -^a^0 -^a^1 -^a^2 -^a^3 -^a^4 -^a^5 -^a^6 -^a^7 -^a^8 -^a^9 -^a^R -^a^V -^a^a -^a^b -^a^c -^a^d -^a^e -^a^f -^a^h -^a^k -^a^n -^a^p -^ad -^ai1; -^ai3. -^ai3l -^ai49 -^ao2i -^ao3z -^aO12 -^aO21 -^aO31 -^aO41 -^aO47 -^aO49 -^aO51o0t -^aO61 -^az1} -^az2 -^az3 -^az5 -^a} +^a $6 l +^a $v +^a 'B +^a *15 +^a *20 +^a *24 +^a *97 +^a D9 +^a K +^a Z1 +^a Z3 l +^a Z4 Z3 +^a ^0 +^a ^1 +^a ^2 +^a ^3 +^a ^4 +^a ^5 +^a ^6 +^a ^7 +^a ^8 +^a ^9 +^a ^R +^a ^V +^a ^a +^a ^b +^a ^c +^a ^d +^a ^e +^a ^f +^a ^h +^a ^k +^a ^n +^a ^p +^a d +^a i1; +^a i3. +^a i3l +^a i49 +^a o2i +^a o3z +^a O12 +^a O21 +^a O31 +^a O41 +^a O47 +^a O49 +^a O51 o0t +^a O61 +^a z1 } +^a z2 +^a z3 +^a z5 +^a } ^b -^b$* -^b$j*35 -^b'A -^b*24 -^b*30 -^b*64 -^b+1 -^b-2 -^b-3 -^b-5s9l -^b-7 -^bC+6 -^bD4 -^bR8 -^bT1 -^bZ2 -^b^0 -^b^1 -^b^2 -^b^3 -^b^4 -^b^5 -^b^7 -^b^8 -^b^a -^b^b -^b^c -^b^d -^b^e -^b^f -^b^m -^bd -^bi2/o2u -^bo2n -^bo7! -^bo8* -^bs93 -^bsrz -^bO25 -^bO35 -^bO52 -^bO56 -^bz2*56 -^bz3 -^bz3c -^bz4*06 +^b $* +^b $j *35 +^b 'A +^b *24 +^b *30 +^b *64 +^b +1 +^b -2 +^b -3 +^b -5 s9l +^b -7 +^b C +6 +^b D4 +^b R8 +^b T1 +^b Z2 +^b ^0 +^b ^1 +^b ^2 +^b ^3 +^b ^4 +^b ^5 +^b ^7 +^b ^8 +^b ^a +^b ^b +^b ^c +^b ^d +^b ^e +^b ^f +^b ^m +^b d +^b i2/ o2u +^b o2n +^b o7! +^b o8* +^b s93 +^b srz +^b O25 +^b O35 +^b O52 +^b O56 +^b z2 *56 +^b z3 +^b z3 c +^b z4 *06 ^c -^c$2 -^c$m -^c$z -^c'9 -^c*01+0 -^c*12 -^c*16 -^c*20 -^c*30 -^c*40{ -^c+1 -^c-1 -^c-7r -^cD3 -^cD5 -^cL4 -^cR4 -^cZ3^R -^c^0 -^c^1 -^c^2 -^c^3 -^c^4 -^c^5 -^c^6 -^c^7 -^c^8 -^c^9 -^c^F -^c^a -^c^b -^c^c -^c^d -^c^e -^c^f -^c^g -^c^p -^cc -^ci1j -^ci3t -^ci58z1 -^ci5u -^co5cT1 -^co6< -^cp1 -^cp2 -^ctO32 -^cO13 -^cO4B -^cO56 -^cO75 -^cO82 -^cz5 -^c} +^c $2 +^c $m +^c $z +^c '9 +^c *01 +0 +^c *12 +^c *16 +^c *20 +^c *30 +^c *40 { +^c +1 +^c -1 +^c -7 r +^c D3 +^c D5 +^c L4 +^c R4 +^c Z3 ^R +^c ^0 +^c ^1 +^c ^2 +^c ^3 +^c ^4 +^c ^5 +^c ^6 +^c ^7 +^c ^8 +^c ^9 +^c ^F +^c ^a +^c ^b +^c ^c +^c ^d +^c ^e +^c ^f +^c ^g +^c ^p +^c c +^c i1j +^c i3t +^c i58 z1 +^c i5u +^c o5c T1 +^c o6< +^c p1 +^c p2 +^c t O32 +^c O13 +^c O4B +^c O56 +^c O75 +^c O82 +^c z5 +^c } ^d -^d$ -^d$4 -^d$D -^d$h -^d*0A -^d*40 -^d*56 -^d-3 -^d-5 -^dC -^dD4 -^dK -^dKi6k -^dL1 -^dT1 -^dZ4 -^d^0 -^d^1 -^d^2 -^d^3 -^d^4 -^d^5 -^d^6 -^d^7 -^d^8 -^d^9 -^d^a -^d^b -^d^c -^d^d -^d^e -^d^f -^d^h -^di0l -^di1l -^di1s -^di31 -^di48 -^di4=O34 -^di8d -^dl^0 -^do2. -^do3sK -^do4h -^do4r -^do64 -^dp1 -^drk -^ds4b -^dsf5 -^dt$C -^dO13 -^dO31 -^dO32 -^dO32Z2 -^dO42 -^dO51 -^dO63-6 -^dz2 -^dz3 -^dz5 +^d $ +^d $4 +^d $D +^d $h +^d *0A +^d *40 +^d *56 +^d -3 +^d -5 +^d C +^d D4 +^d K +^d K i6k +^d L1 +^d T1 +^d Z4 +^d ^0 +^d ^1 +^d ^2 +^d ^3 +^d ^4 +^d ^5 +^d ^6 +^d ^7 +^d ^8 +^d ^9 +^d ^a +^d ^b +^d ^c +^d ^d +^d ^e +^d ^f +^d ^h +^d i0l +^d i1l +^d i1s +^d i31 +^d i48 +^d i4= O34 +^d i8d +^d l ^0 +^d o2. +^d o3s K +^d o4h +^d o4r +^d o64 +^d p1 +^d r k +^d s4b +^d sf5 +^d t $C +^d O13 +^d O31 +^d O32 +^d O32 Z2 +^d O42 +^d O51 +^d O63 -6 +^d z2 +^d z3 +^d z5 ^e -^e$7 -^e$V -^e'8 -^e*16 -^e*25 -^e+3 -^e+6 -^e-9 -^eL2 -^eR7 -^eZ2 -^eZ4+A -^e^0 -^e^1 -^e^2 -^e^3 -^e^5 -^e^6 -^e^7 -^e^8 -^e^9 -^e^a -^e^b -^e^c -^e^d -^e^e -^e^f -^e^h^t -^e^h^t^e^v^o^l^i -^e^p -^e^v^o^l^i -^e^w -^ec -^ed -^ei0V -^ei0l -^ei6\*36 -^eo5y -^er -^eud -^eO12 -^eO21 -^eO31 -^eO45 -^eO46 -^eO51 -^eO57 -^eO71 -^ez2 +^e $7 +^e $V +^e '8 +^e *16 +^e *25 +^e +3 +^e +6 +^e -9 +^e L2 +^e R7 +^e Z2 +^e Z4 +A +^e ^0 +^e ^1 +^e ^2 +^e ^3 +^e ^5 +^e ^6 +^e ^7 +^e ^8 +^e ^9 +^e ^a +^e ^b +^e ^c +^e ^d +^e ^e +^e ^f +^e ^h ^t +^e ^h ^t ^e ^v ^o ^l ^i +^e ^p +^e ^v ^o ^l ^i +^e ^w +^e c +^e d +^e i0V +^e i0l +^e i6\ *36 +^e o5y +^e r +^e u d +^e O12 +^e O21 +^e O31 +^e O45 +^e O46 +^e O51 +^e O57 +^e O71 +^e z2 ^f -^f$^ -^f$b -^f$r -^f$v -^f'7 -^f'7$s -^f'A -^f*08 -^f*18 -^f*21 -^f+1 -^f-1^V -^f-5 -^fD7 -^fZ1 -^fZ3 -^f^0 -^f^1 -^f^2 -^f^3 -^f^4 -^f^5 -^f^6 -^f^7 -^f^8 -^f^9 -^f^C -^f^N+7 -^f^V -^f^a -^f^b -^f^c -^f^d -^f^e -^f^f -^fd -^fi2jr -^fs62 -^fO49 -^fO51 -^fO58o2u -^fO61 -^fO75 -^fz2 -^fz3 -^fz4k -^fz5 -^f{*14 +^f $^ +^f $b +^f $r +^f $v +^f '7 +^f '7 $s +^f 'A +^f *08 +^f *18 +^f *21 +^f +1 +^f -1 ^V +^f -5 +^f D7 +^f Z1 +^f Z3 +^f ^0 +^f ^1 +^f ^2 +^f ^3 +^f ^4 +^f ^5 +^f ^6 +^f ^7 +^f ^8 +^f ^9 +^f ^C +^f ^N +7 +^f ^V +^f ^a +^f ^b +^f ^c +^f ^d +^f ^e +^f ^f +^f d +^f i2j r +^f s62 +^f O49 +^f O51 +^f O58 o2u +^f O61 +^f O75 +^f z2 +^f z3 +^f z4 +^f z5 +^f { *14 ^g -^g$& -^g$7 -^g$; -^g$s -^g$t -^g'4 -^g'6 -^g*05 -^g*65 -^g-6 -^g-8 -^g@a -^gD4 -^gD8 -^gL1 -^gL2 -^gT1 -^gT3s0v -^gT6i1w -^gZ3 -^g^h -^g^s -^g^w -^gi4g -^gi60^^ -^go52 -^go67 -^go78 -^gp1 -^gsSo -^gsmj -^gt -^guZ1 -^gO23 -^gO29p1 -^gO31 -^gO32 -^gO36 -^gO49 -^gO52 -^gO59 -^gO5A -^gO65 -^gz3 -^gz4 -^g{Z3 +^g $& +^g $7 +^g $; +^g $s +^g $t +^g '4 +^g '6 +^g *05 +^g *65 +^g -6 +^g -8 +^g @a +^g D4 +^g D8 +^g L1 +^g L2 +^g T1 +^g T3 s0v +^g T6 i1w +^g Z3 +^g ^h +^g ^s +^g ^w +^g i4g +^g i60 ^^ +^g o52 +^g o67 +^g o78 +^g p1 +^g sSo +^g smj +^g t +^g u Z1 +^g O23 +^g O29 p1 +^g O31 +^g O32 +^g O36 +^g O49 +^g O52 +^g O59 +^g O5A +^g O65 +^g z3 +^g z4 +^g { Z3 ^h -^h$ -^h$m -^h$pz1 -^h'6 -^h'9 -^h'A -^h*32 -^h+5 -^hD3 -^hD7 -^hZ1 -^hZ2$y -^h^$ -^h^P -^h^P} -^h^a -^h^m -^h^o -^h^r -^hc -^ho1c -^ho23 -^ho2h -^ho2t -^ho2y -^ho4 -^ho5. -^hr -^hsn4*31 -^ht -^hO16 -^hO34 -^hO51 -^hO62 -^hO91 -^hz2 -^hz4 -^h} +^h $ +^h $m +^h $p z1 +^h '6 +^h '9 +^h 'A +^h *32 +^h +5 +^h D3 +^h D7 +^h Z1 +^h Z2 $y +^h ^$ +^h ^P +^h ^P } +^h ^a +^h ^m +^h ^o +^h ^r +^h c +^h o1c +^h o23 +^h o2h +^h o2t +^h o2y +^h o4 +^h o5. +^h r +^h sn4 *31 +^h t +^h O16 +^h O34 +^h O51 +^h O62 +^h O91 +^h z2 +^h z4 +^h } ^i -^i*03 -^i*37*57 -^i*52*02 -^i*70c -^i-0^l -^i-3 -^i-5 -^i@8 -^iD6K -^iR2 -^iT3z4 -^iT4 -^iZ1 -^iZ2 -^i^M -^i^O -^i^f -^i^g -^i^m -^i^n -^i^s -^i^x -^i^{o6c -^id -^ii0N -^ii3( -^ii8u -^io0LZ3 -^io2:*31 -^io2g -^io4_ -^io57 -^is1l -^isv5 -^isxh -^iO12 -^iO15 -^iO21 -^iO23 -^iO25 -^iO36 -^iO54 -^iz1 -^iz2 -^iz3 -^iz5 -^i} +^i *03 +^i *37 *57 +^i *52 *02 +^i *70 c +^i -0 ^l +^i -3 +^i -5 +^i @8 +^i D6 K +^i R2 +^i T3 z4 +^i T4 +^i Z1 +^i Z2 +^i ^M +^i ^O +^i ^f +^i ^g +^i ^m +^i ^n +^i ^s +^i ^x +^i ^{ o6c +^i d +^i i0N +^i i3( +^i i8u +^i o0L Z3 +^i o2: *31 +^i o2g +^i o4_ +^i o57 +^i s1l +^i sv5 +^i sxh +^i O12 +^i O15 +^i O21 +^i O23 +^i O25 +^i O36 +^i O54 +^i z1 +^i z2 +^i z3 +^i z5 +^i } ^j -^j$s -^j$y -^j*24 -^j*41 -^j*54 -^j*59O46 -^j+1 -^j+2 -^jR5o3l -^jZ1i2e -^jZ3 -^j^` -^j^b+2 -^j^r -^jc -^ji0h -^ji2=R1 -^jo4c -^jo51 -^jo8JO39 -^jp1 -^jrO05 -^juz1 -^jO14 -^jO21 -^jO21T5 -^jO24i09 -^jO25'5 -^jO32 -^jO34 -^jO51 -^jO62 -^jO74+7 -^jz1 -^jz2O38 +^j $s +^j $y +^j *24 +^j *41 +^j *54 +^j *59 O46 +^j +1 +^j +2 +^j R5 o3l +^j Z1 i2e +^j Z3 +^j ^` +^j ^b +2 +^j ^r +^j c +^j i0h +^j i2= R1 +^j o4c +^j o51 +^j o8J O39 +^j p1 +^j r O05 +^j u z1 +^j O14 +^j O21 +^j O21 T5 +^j O24 i09 +^j O25 '5 +^j O32 +^j O34 +^j O51 +^j O62 +^j O74 +7 +^j z1 +^j z2 O38 ^k -^k$$ -^k$a -^k$b -^k$t -^k'4 -^k'7 -^k*06$i -^k*13 -^k*14 -^k*78 -^k+3 -^k+6 -^k@t -^kD6 -^kL4 -^kR3 -^kZ2-3 -^k^" -^k^2 -^k^w -^kd -^ki11 -^ki1i -^ki2c -^ko1u -^ko6u -^ks1a -^ksfF -^kt -^ku -^kO13 -^kO15 -^kO32 -^kO42 -^kO46 -^kO53 -^kz1 -^kz3 -^kz4 -^k} +^k $$ +^k $a +^k $b +^k $t +^k '4 +^k '7 +^k *06 $i +^k *13 +^k *14 +^k *78 +^k +3 +^k +6 +^k @t +^k D6 +^k L4 +^k R3 +^k Z2 -3 +^k ^" +^k ^2 +^k ^w +^k d +^k i11 +^k i1i +^k i2c +^k o1u +^k o6u +^k s1a +^k sfF +^k t +^k u +^k O13 +^k O15 +^k O32 +^k O42 +^k O46 +^k O53 +^k z1 +^k z3 +^k z4 +^k } ^l -^l$1 -^l'9 -^l*03 -^l*04 -^l*20 -^l*51 -^l*56 -^l+1 -^l+7+6 -^l-3 -^l-8 -^l@d -^lD2 -^lR8 -^l] -^l^J -^l^a -^l^k -^l^l^a^4 -^l^o -^l^r -^l^s -^lc -^lcZ3 -^li3l -^li5v -^li7h -^li9n -^lo3 -^lo3o -^lo4h -^lO32 -^lO36 -^lO41 -^lO53 -^lz1 -^lz3 +^l $1 +^l '9 +^l *03 +^l *04 +^l *20 +^l *51 +^l *56 +^l +1 +^l +7 +6 +^l -3 +^l -8 +^l @d +^l D2 +^l R8 +^l ] +^l ^J +^l ^a +^l ^k +^l ^l ^a ^4 +^l ^o +^l ^r +^l ^s +^l c +^l c Z3 +^l i3l +^l i5v +^l i7h +^l i9n +^l o3 +^l o3o +^l o4h +^l O32 +^l O36 +^l O41 +^l O53 +^l z1 +^l z3 ^m -^m$X -^m$z -^m*04 -^m*06 -^m*08 -^m*34 -^m*53 -^m*63 -^m-2 -^m-4 -^m-7 -^mD4 -^mD5z1 -^mL5 -^mT5$p -^m^S -^m^a^i -^m^k -^m^m -^m^v -^mcO62 -^md -^mi1a -^mi3- -^mi6O -^mo2i -^mo3i -^mo3n -^mo4l -^mo58 -^mo85 -^msrw -^mst% -^mt -^mO12 -^mO13 -^mO15 -^mO24 -^mO32 -^mO58 -^mz2 -^mz3 -^mz4 -^mz5 +^m $X +^m $z +^m *04 +^m *06 +^m *08 +^m *34 +^m *53 +^m *63 +^m -2 +^m -4 +^m -7 +^m D4 +^m D5 z1 +^m L5 +^m T5 $p +^m ^S +^m ^a ^i +^m ^k +^m ^m +^m ^v +^m c O62 +^m d +^m i1a +^m i3- +^m i6O +^m o2i +^m o3i +^m o3n +^m o4l +^m o58 +^m o85 +^m srw +^m st% +^m t +^m O12 +^m O13 +^m O15 +^m O24 +^m O32 +^m O58 +^m z2 +^m z3 +^m z4 +^m z5 ^n -^n$1 -^n$D*76 -^n'4 -^n*03 -^n*42Z2 -^n+0$5 -^n+3 -^n-1 -^nD2R1 -^nD4 -^nK -^nL1 -^nR2 -^n^n -^n^t -^nd -^nf -^ni0b -^ni1d -^ni2^ -^ni4U{ -^nkr -^no1I -^no5,o6P -^nslo -^nstk -^nt -^nto78 -^nO25 -^nO31 -^nO32 -^nO34$G -^nz2 -^nz2^x -^nz3o9v -^nz5 -^n{Z1 +^n $1 +^n $D *76 +^n '4 +^n *03 +^n *42 Z2 +^n +0 $5 +^n +3 +^n -1 +^n D2 R1 +^n D4 +^n K +^n L1 +^n R2 +^n ^n +^n ^t +^n d +^n f +^n i0b +^n i1d +^n i2^ +^n i4U { +^n k r +^n o1I +^n o5, o6P +^n slo +^n stk +^n t +^n t o78 +^n O25 +^n O31 +^n O32 +^n O34 $G +^n z2 +^n z2 ^x +^n z3 o9v +^n z5 +^n { Z1 ^o -^o$9o6n -^o$mz2 -^o$p -^o$v -^o'8 -^o*25f -^o*28O2A -^o*30 -^o*58 -^o+1 -^o+6 -^o-3 -^o-6 -^oC^t -^oD3 -^oKo5; -^oL0 -^oL7 -^oR2 -^oZ2*10 -^oZ2{ -^o^D -^o^K -^o^^ -^o^c -^o^p -^o^s -^od -^oi1' -^oi1Dr -^oi2Y -^oi3k -^oi44u -^ok'6 -^oo98 -^os1dD4 -^osat -^oslt -^oO12 -^oO28 -^oz1 -^oz1o0G -^oz2 -^oz2o5l -^oz3*64 -^o} +^o $9 o6n +^o $m z2 +^o $p +^o $v +^o '8 +^o *25 f +^o *28 O2A +^o *30 +^o *58 +^o +1 +^o +6 +^o -3 +^o -6 +^o C ^t +^o D3 +^o K o5; +^o L0 +^o L7 +^o R2 +^o Z2 *10 +^o Z2 { +^o ^D +^o ^K +^o ^^ +^o ^c +^o ^p +^o ^s +^o d +^o i1' +^o i1D r +^o i2Y +^o i3k +^o i44 u +^o k '6 +^o o98 +^o s1d D4 +^o sat +^o slt +^o O12 +^o O28 +^o z1 +^o z1 o0G +^o z2 +^o z2 o5l +^o z3 *64 +^o } ^p -^p$p -^p'5 -^p'A -^p*04o0F -^p*12 -^p*20 -^p*40 -^p+9 -^p-2 -^p-7 -^p@dT2 -^p@m -^pK -^pL3 -^pR6 -^pZ2 -^p^f -^p^m -^pcz1 -^pi0$r -^pi0R -^pi2YO36 -^po0iO52 -^po1k -^pp2sfi -^psx- -^pt -^pt^| -^pu -^pO15 -^pO34 -^pO52 -^pO68 -^pz1 -^pz2 -^pz3 -^p} +^p $p +^p '5 +^p 'A +^p *04 o0F +^p *12 +^p *20 +^p *40 +^p +9 +^p -2 +^p -7 +^p @d T2 +^p @m +^p K +^p L3 +^p R6 +^p Z2 +^p ^f +^p ^m +^p c z1 +^p i0$ r +^p i0R +^p i2Y O36 +^p o0i O52 +^p o1k +^p p2 sfi +^p sx- +^p t +^p t ^| +^p u +^p O15 +^p O34 +^p O52 +^p O68 +^p z1 +^p z2 +^p z3 +^p } ^q -^q$2 -^q$N -^q$a -^q'5 -^q*01o0j -^q*14 -^q*57 -^q+1 -^q-3 -^qK -^qR4R4 -^qT5 -^q^g -^q^n -^qc -^qo5C -^qp1 -^qr -^qtO39 -^qO48 -^qz1 -^qz1$4 -^qz2 -^qz2+5 -^qz2T1 -^qz5 -^q} +^q $2 +^q $N +^q $a +^q '5 +^q *01 o0j +^q *14 +^q *57 +^q +1 +^q -3 +^q K +^q R4 R4 +^q T5 +^q ^g +^q ^n +^q c +^q o5C +^q p1 +^q r +^q t O39 +^q O48 +^q z1 +^q z1 $4 +^q z2 +^q z2 +5 +^q z2 T1 +^q z5 +^q } ^r -^r$Y -^r'5 -^r'8 -^r'B -^r*03 -^r*45 -^r*67 -^r+5 -^r-2 -^r@i -^r@k -^rD5 -^rK -^rZ1 -^r^`i1J -^r^x -^ri0D -^ri18 -^ri1t -^ri4f -^ri4y -^ro0uO62 -^ro81 -^rrZ3 -^rsli -^rstm -^ru -^rO16 -^rO16o2x -^rO72O38 -^rO92 -^rz2 +^r $Y +^r '5 +^r '8 +^r 'B +^r *03 +^r *45 +^r *67 +^r +5 +^r -2 +^r @i +^r @k +^r D5 +^r K +^r Z1 +^r ^` i1J +^r ^x +^r i0D +^r i18 +^r i1t +^r i4f +^r i4y +^r o0u O62 +^r o81 +^r r Z3 +^r sli +^r stm +^r u +^r O16 +^r O16 o2x +^r O72 O38 +^r O92 +^r z2 ^s -^s$# -^s$9 -^s$b -^s$d -^s'6 -^s'A -^s*15 -^s*23 -^s*41 -^s*42 -^s*62 -^s*65 -^s+2 -^s+3skc -^s+7 -^s+7i3\ -^s-1 -^s-3 -^s@g -^s@t -^sCr -^sD4 -^sD4i38 -^sD6 -^sR3 -^sT5 -^sT6 -^sZ2O26 -^sZ3 -^s^)-7 -^s^F -^s^L -^s^V -^s^Y -^s^a -^s^c -^s^gu -^si0h -^si1j -^si2a -^si87O49 -^si9y -^sl -^so2y -^sp1 -^sr -^ssl3 -^sslzz3 -^sspe -^ssr/ -^sO13 -^sO14 -^sO26 -^sO43Z1 -^sO52 -^sO63 -^sO82 -^sz1 -^s} +^s $# +^s $9 +^s $b +^s $d +^s '6 +^s 'A +^s *15 +^s *23 +^s *41 +^s *42 +^s *62 +^s *65 +^s +2 +^s +3 skc +^s +7 +^s +7 i3\ +^s -1 +^s -3 +^s @g +^s @t +^s C r +^s D4 +^s D4 i38 +^s D6 +^s R3 +^s T5 +^s T6 +^s Z2 O26 +^s Z3 +^s ^) -7 +^s ^F +^s ^L +^s ^V +^s ^Y +^s ^a +^s ^c +^s ^g u +^s i0h +^s i1j +^s i2a +^s i87 O49 +^s i9y +^s l +^s o2y +^s p1 +^s r +^s sl3 +^s slz z3 +^s spe +^s sr/ +^s O13 +^s O14 +^s O26 +^s O43 Z1 +^s O52 +^s O63 +^s O82 +^s z1 +^s } ^t -^t$. -^t$i -^t'5 -^t'7 -^t'8 -^t*04 -^t*15 -^t*23 -^t*34 -^t*65 -^t+1 -^t+3 -^t-1 -^t-2 -^t-6O45 -^t-7+8 -^t@t -^tC -^tZ1 -^tZ3'6 -^t^/ -^t^s -^t^s^1 -^t^u -^td -^tfO08 -^ti0a -^ti5t -^tl -^to14 -^to3R -^to3^ -^tsd -^tsmt*21 -^tt -^tuz2 -^tO12 -^tO13 -^tO24 -^tO37 -^tO43 -^tO45 -^tz1 -^tz5 +^t $. +^t $i +^t '5 +^t '7 +^t '8 +^t *04 +^t *15 +^t *23 +^t *34 +^t *65 +^t +1 +^t +3 +^t -1 +^t -2 +^t -6 O45 +^t -7 +8 +^t @t +^t C +^t Z1 +^t Z3 '6 +^t ^/ +^t ^s +^t ^s ^1 +^t ^u +^t d +^t f O08 +^t i0a +^t i5t +^t l +^t o14 +^t o3R +^t o3^ +^t sd +^t smt *21 +^t t +^t u z2 +^t O12 +^t O13 +^t O24 +^t O37 +^t O43 +^t O45 +^t z1 +^t z5 ^u -^u$+ -^u$2 -^u$4 -^u'A -^u*04 -^u*31 -^u*71 -^uD5 -^u^0 -^u^D -^u^N -^u^S -^u^n -^u^t -^u^y -^ui4P -^ul -^ur -^uO15 -^uO53 -^uz1 -^uz5 +^u $+ +^u $2 +^u $4 +^u 'A +^u *04 +^u *31 +^u *71 +^u D5 +^u ^0 +^u ^D +^u ^N +^u ^S +^u ^n +^u ^t +^u ^y +^u i4P +^u l +^u r +^u O15 +^u O53 +^u z1 +^u z5 ^v -^v$5 -^v'6 -^v'9i8t -^v*27 -^v*31 -^v*54 -^v+2 -^v+7 -^v-1@5 -^v-3 -^v-6 -^v@3 -^vD3 -^vR1 -^v^S -^v^T -^v^u -^v^} -^vd -^vi0d -^vl -^vo2C -^vo48 -^vo9(O56 +^v $5 +^v '6 +^v '9 i8t +^v *27 +^v *31 +^v *54 +^v +2 +^v +7 +^v -1 @5 +^v -3 +^v -6 +^v @3 +^v D3 +^v R1 +^v ^S +^v ^T +^v ^u +^v ^} +^v d +^v i0d +^v l +^v o2C +^v o48 +^v o9( O56 slr -^vO13 -^vO14 -^vO16 -^vO49 -^vO58 -^vO62 -^vz1 -^vz1D2 -^vz2 -^vz4 -^v} +^v O13 +^v O14 +^v O16 +^v O49 +^v O58 +^v O62 +^v z1 +^v z1 D2 +^v z2 +^v z4 +^v } ^w -^w$m -^w$w -^w*37 -^w*64^` -^w+4z2 -^w@msc6 -^wD3 -^wR1 -^wR6 -^w^M -^w^_ -^w^t -^w^w -^wd -^wf -^wi1r -^wi7Z -^wo2_ -^wo3I -^wsil -^wsnXO51 -^wto3B -^wO15@x -^wO34 -^wz2 -^wz2*25 +^w $m +^w $w +^w *37 +^w *64 ^` +^w +4 z2 +^w @m sc6 +^w D3 +^w R1 +^w R6 +^w ^M +^w ^_ +^w ^t +^w ^w +^w d +^w f +^w i1r +^w i7Z +^w o2_ +^w o3I +^w sil +^w snX O51 +^w t o3B +^w O15 @x +^w O34 +^w z2 +^w z2 *25 ^x -^x$x -^x$y -^x$} -^x'7 -^x'8 -^x*09 -^x*17^k -^x*20 -^x+5 -^x+6s59 -^x-1 -^xD2 -^xD7 -^xR1 -^xZ1 -^x]o1o -^x]} -^x^Xo5v -^x^r -^x^{ -^xi0t -^xi2&z2 -^xi5N -^xk*35 -^xl -^xo0\i3? -^xo4m -^xp1 -^xsq3 -^xu$q -^xO13 -^xO31 -^xO4B -^xO54 -^xO58 -^xO73 -^xz1 -^xz2 -^xz3 -^xz5 -^x}u +^x $x +^x $y +^x $} +^x '7 +^x '8 +^x *09 +^x *17 ^k +^x *20 +^x +5 +^x +6 s59 +^x -1 +^x D2 +^x D7 +^x R1 +^x Z1 +^x ] o1o +^x ] } +^x ^X o5v +^x ^r +^x ^{ +^x i0t +^x i2& z2 +^x i5N +^x k *35 +^x l +^x o0\ i3? +^x o4m +^x p1 +^x sq3 +^x u $q +^x O13 +^x O31 +^x O4B +^x O54 +^x O58 +^x O73 +^x z1 +^x z2 +^x z3 +^x z5 +^x } u ^y -^y$j -^y$y -^y'3 -^y*07i4= -^y*57 -^y+7l -^y-2 -^yL0 -^yZ1 -^yZ1TA -^y^! -^y^T -^y^m -^y^m^4 -^y^m^e^v^o^l^i -^y^o -^y^s -^yi1@ -^yi1n -^yi3_ -^yi5wO13 -^yi6U -^yi8O -^yo1k -^yp1 -^ys5e -^yO32 -^yO41 -^yO49 -^yz1 -^yz2 -^yz5 -^y} +^y $j +^y $y +^y '3 +^y *07 i4= +^y *57 +^y +7 l +^y -2 +^y L0 +^y Z1 +^y Z1 TA +^y ^! +^y ^T +^y ^m +^y ^m ^4 +^y ^m ^e ^v ^o ^l ^i +^y ^o +^y ^s +^y i1@ +^y i1n +^y i3_ +^y i5w O13 +^y i6U +^y i8O +^y o1k +^y p1 +^y s5e +^y O32 +^y O41 +^y O49 +^y z1 +^y z2 +^y z5 +^y } ^z -^z$z -^z'9 -^z*13 -^z*53 -^z+6T5 -^z+7 -^z-1 -^z-6 -^z@e -^z@hT8 -^z@t -^zZ1O31 -^z^4 -^z^s -^zi4_ -^zi6T -^zi8z -^zo6R -^zr -^zO13 -^zO23 -^zO24 -^zO42 -^zO59 -^zz2 -^zz2*23 -^z} +^z $z +^z '9 +^z *13 +^z *53 +^z +6 T5 +^z +7 +^z -1 +^z -6 +^z @e +^z @h T8 +^z @t +^z Z1 O31 +^z ^4 +^z ^s +^z i4_ +^z i6T +^z i8z +^z o6R +^z r +^z O13 +^z O23 +^z O24 +^z O42 +^z O59 +^z z2 +^z z2 *23 +^z } ^{ -^{$} -^{c +^{ $} +^{ c ^| -^|$+^Q -^|$ki4p -^|$r -^|T6 -^|T7 -^|z1*50 +^| $+ ^Q +^| $k i4p +^| $r +^| T6 +^| T7 +^| z1 *50 ^} -^}$bi0< -^}L2^- -^}^BL2 -^}^O -^}i8, -^}t -^}z4 +^} $b i0< +^} L2 ^- +^} ^B L2 +^} ^O +^} i8, +^} t +^} z4 c c $0 $1 c $1 $2 @@ -15714,5098 +15690,5096 @@ c T4 c T5 c T6 c T7 -c$ -c$! -c$!$1 -c$!$@ -c$!$@$# -c$!d -c$!d] -c$!o4a -c$" -c$# -c$#d -c$$ -c$$d -c$&d -c$&d] -c$) -c$* -c$*$*^*^* -c$*d -c$*d] -c$+ -c$+d -c$+d] -c$- -c$-d -c$-d] -c$. -c$0$0 -c$0$0$0 -c$0$0$1 -c$0$0$7 -c$0$2 -c$0$3 -c$0$4 -c$0$5 -c$0$6 -c$0$7 -c$0$8 -c$0$9 -c$0$9$8 -c$0$9$8$7 -c$0$9$8$7$6 -c$0$9$8$7$6$5 -c$0d -c$0d] -c$1$! -c$1$0 -c$1$1 -c$1$1$1 -c$1$2$3$4 -c$1$2$3$4$5 -c$1$2$3$4$5$6 -c$1$2$3$a$b$c -c$1$2$a$b -c$1$3 -c$1$4 -c$1$5 -c$1$6 -c$1$7 -c$1$8 -c$1$9 -c$1$9$6$0 -c$1$9$6$1 -c$1$9$6$2 -c$1$9$6$3 -c$1$9$6$4 -c$1$9$6$5 -c$1$9$6$6 -c$1$9$6$7 -c$1$9$6$8 -c$1$9$6$9 -c$1$9$7$0 -c$1$9$7$1 -c$1$9$7$2 -c$1$9$7$3 -c$1$9$7$4 -c$1$9$7$5 -c$1$9$7$6 -c$1$9$7$7 -c$1$9$7$8 -c$1$9$7$9 -c$1$9$8$0 -c$1$9$8$1 -c$1$9$8$2 -c$1$9$8$3 -c$1$9$8$4 -c$1$9$8$5 -c$1$9$8$6 -c$1$9$8$7 -c$1$9$8$8 -c$1$9$8$9 -c$1$9$9$0 -c$1$9$9$1 -c$1$9$9$2 -c$1$9$9$3 -c$1$9$9$4 -c$1$9$9$5 -c$1$9$9$6 -c$1$9$9$7 -c$1$9$9$8 -c$1$9$9$9 -c$1$s$t -c$1d -c$1d] -c$2 -c$2$0 -c$2$0$0$0 -c$2$0$0$1 -c$2$0$0$2 -c$2$0$0$3 -c$2$0$0$4 -c$2$0$0$5 -c$2$0$0$6 -c$2$0$0$7 -c$2$0$0$8 -c$2$0$0$9 -c$2$0$1$0 -c$2$0$1$1 -c$2$0$1$2 -c$2$0$1$3 -c$2$0$1$4 -c$2$0$1$5 -c$2$0$1$6 -c$2$0$1$7 -c$2$0$1$8 -c$2$0$1$9 -c$2$0$2$0 -c$2$0$2$1 -c$2$0$2$2 -c$2$0$2$3 -c$2$0$2$4 -c$2$0$2$5 -c$2$0$2$6 -c$2$0$2$7 -c$2$0$2$8 -c$2$0$2$9 -c$2$1 -c$2$2 -c$2$2$2 -c$2$3 -c$2$3$4 -c$2$4 -c$2$5 -c$2$6 -c$2$7 -c$2$8 -c$2$9 -c$2$k -c$2$m$e -c$2$u -c$2d -c$2d] -c$2z3 -c$3$0 -c$3$1 -c$3$2 -c$3$2$1 -c$3$3 -c$3$3$3 -c$3$4 -c$3$4$5 -c$3$5 -c$3$6 -c$3$7 -c$3$8 -c$3$9 -c$3d -c$3d] -c$4 -c$4$0 -c$4$1 -c$4$2 -c$4$3 -c$4$3$2$1 -c$4$4 -c$4$4$4 -c$4$5 -c$4$5$6 -c$4$6 -c$4$7 -c$4$8 -c$4$9 -c$4$M$e -c$4$U -c$4$a$l$l -c$4$e$v$e$r -c$4$f$r$e$e -c$4$l$i$f$e -c$4$m$e -c$4$u -c$4$u$s -c$4d -c$4d] -c$5 -c$5$0 -c$5$1 -c$5$2 -c$5$3 -c$5$4 -c$5$4$3$2$1 -c$5$5 -c$5$5$5 -c$5$6 -c$5$6$7 -c$5$7 -c$5$8 -c$5$9 -c$5d -c$6$0 -c$6$1 -c$6$2 -c$6$3 -c$6$4 -c$6$5 -c$6$5$4$3$2$1 -c$6$6 -c$6$6$6 -c$6$7 -c$6$7$8 -c$6$8 -c$6$9 -c$6d -c$6d] -c$7 -c$7$0 -c$7$1 -c$7$2 -c$7$3 -c$7$4 -c$7$5 -c$7$6 -c$7$7 -c$7$7$7 -c$7$8 -c$7$8$9 -c$7$9 -c$7T3 -c$7d -c$7d] -c$8$0 -c$8$1 -c$8$2 -c$8$3 -c$8$4 -c$8$5 -c$8$6 -c$8$7 -c$8$8 -c$8$8$8 -c$8$9 -c$8d -c$8d] -c$9 -c$9$0 -c$9$1 -c$9$2 -c$9$3 -c$9$4 -c$9$5 -c$9$6 -c$9$7 -c$9$8 -c$9$9 -c$9$9$9 -c$9d -c$9d] -c$:$) -c$; -c$? -c$A -c$D -c$G -c$H -c$I -c$L -c$M -c$N -c$R -c$U -c$X -c$Z -c$[ -c$^ -c$_ -c$_d -c$_d] -c$a$b -c$a$b$c -c$e -c$k -c$l -c$m$e -c$v -c$x -c$x$x$x -c${ -c'3z5 -c'5 -c'7Z1 -c'9T3 -c'B -c*21 -c*24T0 -c*25O13 -c*40t -c*46 -c*52+0 -c*58 -c*65o65 -c*68 -c*70 -c*83 -c*8A -c*A8O86 -c+0 -c+2 -c+3 -c+4 -c+5 -c+7 -c+7L3 -c+A -c-0$= -c-1 -c-2 -c-3 -c-3'6 -c-4 -c-4T4 -c-6 -c-7 -c-8 -c-9 -c-B -c@2O14 -c@3 -c@A -c@b -c@f -c@fO23 -c@lO02 -c@m -c@q-5 -cD0D8 -cD1 -cD4 -cD5 -cD5@k -cD6 -cD7 -cD7*05 -cDA -cDB -cK*14 -cKi1[ -cKp1 -cL0 -cL0^p -cL0l -cL0sl( -cL5 -cL7 -cL7O05 -cR2 -cR3 -cR5z3 -cR6 -cR6C -cR7 -cT1 -cT1$1 -cT1T2 -cT1T2T3 -cT1T2T4T5 -cT1T2T4T5T6 -cT1d -cT1f -cT1i1& -cT1i1+ -cT1i1- -cT1i1.i2Ei3. -cT1i1.i2Fi3. -cT1i1.i2Oi3. -cT1i1_ -cT2 -cT2$1 -cT2T4 -cT2T4T6 -cT2T4T6T8 -cT2T4T6T8TA -cT2T4T6T8TATC -cT2d -cT2f -cT2i2& -cT2i2+ -cT2i2- -cT2i2. -cT2i2_ -cT3$1 -cT3d -cT3f -cT3i3& -cT3i3+ -cT3i3- -cT3i3. -cT3i3_ -cT4$1 -cT4d -cT4i4& -cT4i4+ -cT4i4- -cT4i4. -cT4i4_ -cT5$1 -cT5+4 -cT5i5& -cT5i5+ -cT5i5- -cT5i5. -cT5i5_ -cT6$1 -cT6+B -cT6i6+ -cT6i6- -cT6i6_ -cT7$1 -cT7i7- -cT7i7_ -cT8 -cT8$1 -cT8@s -cT8i8+ -cT8i8- -cT8i8_ -cT9 -cT9$1 -cT9i9+ -cT9i9- -cT9i9. -cT9i9_ -cTA -cTA$1 -cTAiA- -cTB -cTB$1 -cTBiB_ -cZ1$6 -cZ1O61 -cZ2i32 -cZ3 -cZ3O53 -cZ3O83 -c[ -c[K -c[Z1 -c[z3 -c^ -c^! -c^!$! -c^!^1 -c^!d -c^"$" -c^# -c^#$# -c^$ -c^$$$ -c^$^$ -c^& -c^( -c^($) -c^* -c^*$# -c^*$* -c^*^* -c^*d -c^+ -c^+$+ -c^+d -c^- -c^-$- -c^. -c^0 -c^0$0 -c^0^0 -c^0^0^0^2 -c^0^1 -c^0^1^0^2 -c^0^2 -c^0^3 -c^0^4 -c^0^5 -c^0^6 -c^0^6^9^1 -c^0^7 -c^0^7^9^1 -c^0^8 -c^0^8^9^1 -c^0^9 -c^0^9^9^1 -c^1 -c^1$1 -c^1$2 -c^1^! -c^1^0 -c^1^0^0^2 -c^1^1 -c^1^2 -c^1^3 -c^1^4 -c^1^5 -c^1^6 -c^1^6^9^1 -c^1^7 -c^1^7^9^1 -c^1^8 -c^1^8^9^1 -c^1^9 -c^1^9^9^1 -c^1^e^h^T -c^1^e^h^t -c^1d -c^2 -c^2$2 -c^2^0 -c^2^0^0^2 -c^2^1 -c^2^2 -c^2^3 -c^2^4 -c^2^5 -c^2^6 -c^2^6^9^1 -c^2^7 -c^2^7^9^1 -c^2^8 -c^2^8^9^1 -c^2^9 -c^2^9^9^1 -c^2d -c^3 -c^3$3 -c^3^0 -c^3^0^0^2 -c^3^1 -c^3^2 -c^3^2^1 -c^3^3 -c^3^4 -c^3^5 -c^3^6 -c^3^6^9^1 -c^3^7 -c^3^7^9^1 -c^3^8 -c^3^8^9^1 -c^3^9 -c^3^9^9^1 -c^3d -c^4 -c^4$4 -c^4^0 -c^4^0^0^2 -c^4^1 -c^4^2 -c^4^3 -c^4^3^2^1 -c^4^4 -c^4^5 -c^4^6 -c^4^6^9^1 -c^4^7 -c^4^7^9^1 -c^4^8 -c^4^8^9^1 -c^4^9 -c^4^9^9^1 -c^5 -c^5$5 -c^5^0 -c^5^0^0^2 -c^5^1 -c^5^2 -c^5^3 -c^5^4 -c^5^4^3^2^1 -c^5^5 -c^5^6 -c^5^6^9^1 -c^5^7 -c^5^7^9^1 -c^5^8 -c^5^8^9^1 -c^5^9 -c^5^9^9^1 -c^5d -c^6 -c^6$6 -c^6^0 -c^6^0^0^2 -c^6^1 -c^6^2 -c^6^3 -c^6^4 -c^6^5 -c^6^5^4^3^2^1 -c^6^6 -c^6^6^9^1 -c^6^7 -c^6^7^9^1 -c^6^8 -c^6^8^9^1 -c^6^9 -c^6^9^9^1 -c^6d -c^7 -c^7$7 -c^7^0 -c^7^0^0^2 -c^7^1 -c^7^2 -c^7^3 -c^7^4 -c^7^5 -c^7^6 -c^7^6^9^1 -c^7^7 -c^7^7^9^1 -c^7^8 -c^7^8^9^1 -c^7^9 -c^7^9^9^1 -c^8 -c^8$8 -c^8^0 -c^8^0^0^2 -c^8^1 -c^8^2 -c^8^3 -c^8^4 -c^8^5 -c^8^6 -c^8^6^9^1 -c^8^7 -c^8^7^9^1 -c^8^8 -c^8^8^9^1 -c^8^9 -c^8^9^9^1 -c^8d -c^9 -c^9$9 -c^9^0 -c^9^0^0^2 -c^9^1 -c^9^2 -c^9^3 -c^9^4 -c^9^5 -c^9^6 -c^9^6^9^1 -c^9^7 -c^9^7^9^1 -c^9^8 -c^9^8^9^1 -c^9^9 -c^9^9^9^1 -c^9d -c^;*4A -c^< -c^<$> -c^=$= -c^? -c^@ -c^@$@ -c^A -c^B -c^C -c^D -c^F -c^G -c^H -c^I -c^IT0 -c^J -c^K -c^L -c^M -c^Q -c^S -c^V -c^[ -c^[$] -c^_ -c^_$_ -c^`D4 -c^a -c^af -c^c^R -c^e^h^T -c^e^h^t -c^e^v^o^l^I -c^e^v^o^l^i -c^f -c^k^2 -c^l -c^l^l^a^4 -c^m^a^I -c^m^a^i -c^r} -c^t^s^1 -c^tz3 -c^u -c^y^M -c^y^m -c^y^m^4 -c^z -c^{$} -cd -ci0: -ci0` -ci0r -ci1! -ci1# -ci1$ -ci1% -ci1& -ci1' -ci1* -ci1+ -ci1- -ci1. -ci10 -ci10T2 -ci10i31 -ci10i31i52 -ci10i31i52i73 -ci11 -ci11T2 -ci11i31 -ci11i31i51 -ci11i31i51i71 -ci11i31i51i71i91 -ci11i31i51i71i91iB1 -ci11i32 -ci11i32i53 -ci11i32i53i74 -ci11i32i53i74i95 -ci11i32i53i74i95iB6 -ci11i32i53i74i95iB6iD7 -ci12 -ci12T2 -ci13 -ci13T2 -ci14 -ci14T2 -ci15 -ci15T2 -ci16 -ci16T2 -ci17 -ci17T2 -ci18 -ci18T2 -ci19 -ci19T2 -ci1F -ci1R -ci1W -ci1_ -ci1a -ci1c -ci1e -ci1h -ci1i -ci1o -ci1u -ci2! -ci2# -ci2$ -ci2& -ci2' -ci2* -ci2+ -ci2- -ci2. -ci2/ -ci20 -ci20T3 -ci21 -ci21T3 -ci22 -ci22T3 -ci23 -ci23T3 -ci24 -ci24T3 -ci25 -ci26 -ci26T3 -ci27 -ci27T3 -ci28 -ci28T3 -ci29 -ci2_ -ci2a -ci2e -ci2o -ci2u -ci3 -ci3! -ci3"^' -ci3# -ci3$ -ci3& -ci3' -ci3* -ci3+ -ci3- -ci3. -ci3/ -ci30 -ci30T4 -ci31 -ci31T4 -ci32 -ci32T4 -ci33 -ci33T4 -ci34 -ci34T4 -ci35 -ci35T4 -ci36 -ci36T4 -ci37 -ci37T4 -ci38 -ci38T4 -ci39 -ci3: -ci3@ -ci3C -ci3H -ci3L -ci3_ -ci3a -ci3e -ci3i -ci3o -ci3u -ci4 -ci4! -ci4# -ci4$ -ci4& -ci4' -ci4* -ci4+ -ci4- -ci4. -ci40 -ci40T5 -ci41 -ci41T5 -ci42 -ci42T5 -ci43 -ci43T5 -ci44 -ci44T5 -ci45 -ci45T5 -ci46 -ci46T5 -ci47 -ci47T5 -ci48 -ci48T5 -ci49 -ci49T5 -ci4@ -ci4_ -ci4a -ci4b -ci4e -ci4j -ci4m -ci4o -ci4u -ci5 -ci5! -ci5# -ci5$ -ci5& -ci5' -ci5* -ci5+ -ci5, -ci5- -ci5. -ci5/ -ci50 -ci50T6 -ci51 -ci51T6 -ci52 -ci52T6 -ci53 -ci53T6 -ci54 -ci54T6 -ci55 -ci55T6 -ci56 -ci56T6 -ci57 -ci57T6 -ci58 -ci58T6 -ci59 -ci59T6 -ci5K -ci5M -ci5_ -ci5a -ci5e -ci5g -ci5o -ci5p -ci5r -ci5s -ci5u -ci6! -ci6# -ci6$ -ci6& -ci6' -ci6* -ci6+ -ci6- -ci6. -ci60 -ci61 -ci61T7 -ci62 -ci62T7 -ci63 -ci63T7 -ci64 -ci64T7 -ci65 -ci65T7 -ci66 -ci66T7 -ci67 -ci67T7 -ci68 -ci69 -ci6@ -ci6C -ci6R -ci6W -ci6_ -ci6a -ci6b -ci6e -ci6h -ci6o -ci6u -ci7! -ci7# -ci7$ -ci7& -ci7' -ci7* -ci7+ -ci7- -ci7. -ci70 -ci71 -ci72 -ci73 -ci74 -ci75 -ci76 -ci77 -ci78 -ci79 -ci7@ -ci7_ -ci7a -ci7e -ci7o -ci7u -ci8 -ci8! -ci8# -ci8$ -ci8& -ci8* -ci8+ -ci8- -ci80 -ci81 -ci82 -ci83 -ci84 -ci85 -ci86 -ci87 -ci88 -ci89 -ci8_ -ci8a -ci8e -ci8i -ci8o -ci8r -ci8u -ciA2 -ck -ck*16 -clL4 -co06 -co0? -co0k -co0p -co0r -co0t -co0v -co0y -co1! -co1# -co1$ -co1* -co1+ -co1- -co1. -co10 -co11 -co12 -co13 -co14 -co15 -co16 -co17 -co18 -co19 -co1@ -co1A -co1T -co1V -co1_ -co1a -co1e -co1l -co1m -co1v -co1y -co2! -co2# -co2$ -co2& -co2* -co2+ -co2- -co20 -co21 -co22 -co23 -co24 -co25 -co26 -co27 -co28 -co29 -co2@ -co2L -co2_ -co2n -co2y -co3! -co3# -co3$ -co3% -co3& -co3* -co3+ -co3, -co3- -co30 -co31 -co32 -co33 -co34 -co35 -co36 -co37 -co38 -co39 -co3@ -co3R -co3S -co3_ -co3c -co3m -co4! -co4# -co4$ -co4& -co4* -co4+ -co4- -co4. -co40 -co41 -co42 -co43 -co44 -co45 -co46 -co47 -co48 -co49 -co4@ -co4N -co4O -co4S -co4V -co4W -co4_ -co4l -co4w -co5! -co5!O74 -co5# -co5$ -co5& -co5* -co5+ -co5- -co5. -co50 -co51 -co52 -co53 -co54 -co55 -co56 -co57 -co58 -co59 -co5@ -co5F -co5J -co5W -co5X -co5_ -co5a -co6! -co6# -co6$ -co6& -co6* -co6+ -co6+i1s -co6- -co6. -co60 -co61 -co62 -co63 -co64 -co65 -co66 -co67 -co68 -co69 -co6@ -co6M -co6T -co6W -co6_ -co6e -co6o -co6q -co7! -co7# -co7$ -co7& -co7* -co7+ -co7- -co7. -co70 -co71 -co72 -co73 -co74 -co75 -co76 -co77 -co78 -co79 -co7? -co7@ -co7M -co7S -co7V -co7_ -co7e -co7o -co7r -co8! -co8# -co8$ -co8& -co8* -co8+ -co8+R7 -co8- -co8/ -co80 -co81 -co82 -co83 -co84 -co85 -co86 -co87 -co88 -co89 -co8H -co8S -co8_ -co8o -co9! -co9# -co9$ -co9* -co9+ -co9- -co90 -co91 -co92 -co93 -co94 -co95 -co96 -co97 -co98 -co99 -co9V -co9_ -coA.O25 -coA4 -coA6 -coAm -cp3 -cp3'8 -cp4 -cp5 -cq -cr -cs$2 -cs0# -cs0I -cs0oZ5 -cs1, -cs10 -cs2* -cs2I -cs2m -cs4K -cs8! -cs87O43 -csGI -csa4 -csa4$! -csa4d -csa@ -csa@$! -csa@T4 -csa@T5 -csa@T6 -csa@d -csa@se3 -csa@se3si1 -csa@se3ss$ -csa@si! -csa@si1 -csa@si1ss$ -csa@sl1 -csa@so0 -csa@so0se3 -csa@so0si! -csa@so0si1 -csa@so0ss$ -csa@ss$ -csaw -csb1 -csb5$! -csb8 -csb8$! -csb8d -csd1 -cse3 -cse3$! -cse3T1 -cse3T2 -cse3T3 -cse3T4 -cse3T5 -cse3T6 -cse3T7 -cse3d -cse3si! -cse3si!ss$ -cse3si1ss$ -cse3sl1 -cse3ss$ -cseu -csex -csg9 -csg9$! -csgV -csi! -csi!$! -csi!T1 -csi!T2 -csi!T3 -csi!T4 -csi!T5 -csi!T6 -csi!sl1 -csi!ss$ -csi1 -csi1$! -csi1T1 -csi1T2 -csi1T3 -csi1T4 -csi1T5 -csi1T6 -csi1T7 -csi1d -csi1se3 -csi1ss$ -csiU -csiZ -csiu -csl1 -csl1$! -csl1T1 -csl1T2 -csl1T4 -csl1T5 -csl1T6 -csl1T7 -csl1d -cslt -cslz -csnj -cso&c -cso* -cso0 -cso0$! -cso0T1 -cso0T2 -cso0T3 -cso0T4 -cso0T5 -cso0T6 -cso0T7 -cso0d -cso0sa4 -cso0se3 -cso0se3si! -cso0se3si1 -cso0se3ss$ -cso0si! -cso0si!ss$ -cso0si1 -cso0si1ss$ -cso0sl1 -cso0ss$ -cspv -css$ -css$$! -css$T1 -css$T2 -css$T3 -css$T4 -css$T5 -css$T6 -css$T7 -css$d -css$sl1 -css-L7 -css3 -css3$! -css4 -css5 -css5$! -css5d -css5se3 -cssO -cst7 -cst7$! -cstC -csu4 -csu4$! -csu[ -csvz -csx,R5 -csy1 -csy2 -cuZ4 -cO02 -cO02L1 -cO03 -cO08 -cO12O28 -cO17$O -cO23 -cO24 -cO25 -cO26 -cO28 -cO32 -cO35 -cO35q -cO36 -cO38 -cO41$" -cO43 -cO43$7 -cO52 -cO53 -cO54'7 -cO57 -cO64 -cO65 -cO84 -cO85 -cO92 -cOA1O04 -cOA2 -cOB2 -cz1 -cz1$0 -cz2 -cz2$2 -cz2$t -cz2o9o -cz2ssR -cz3 -cz3K -cz3^K -cz3O81 -cz4 -cz5O18 -cz5O1B -c{ -c} -d$ -d$! -d$# -d$$ -d$& -d$* -d$+ -d$- -d$. -d$0 -d$1 -d$2 -d$3 -d$4 -d$5 -d$6 -d$7 -d$7snb -d$8 -d$9 -d$=} -d$?o1( -d$@ -d$N*13 -d$P -d$Z -d$] -d$_ -d$aO7A -d$c -d$d*58 -d$g -d$h -d$ki31 -d$m -d$n -d$p -d$q -d$t -d$xD0 -d'6L5 -d'8*20 -d'8i2, -d'9 -d'A -d'B -d*03 -d*04'8 -d*05 -d*06 -d*09 -d*14 -d*15O93 -d*16 -d*19*08 -d*20 -d*26 -d*28O13 -d*32 -d*32Z1 -d*3A -d*45 -d*47O58 -d*52 -d*52R4 -d*53 -d*56 -d*57 -d*64 -d*68 -d*68t -d*70 -d*71 -d*74 -d*7BO73 -d*81O63 -d*83O75 -d*87 -d*92D2 -d*98 -d*A9*53 -d+0 -d+1 -d+1*70 -d+2 -d+3 -d+6 -d+6t -d+7 -d+8 -d+B -d+BO67 -d-0O92 -d-2 -d-3^ -d-3O92 -d-4 -d-5 -d-6 -d-6K -d-7 -d-A -d@3 -d@a -d@k -d@zt -dCO39 -dD1c -dD2] -dD2o4s -dD3 -dD4^; -dD4o4w -dD5[ -dD6 -dD6t -dD7 -dK -dK{ -dL2 -dL2o8g -dL3l -dR0 -dR3i7Q -dR5 -dT0O85 -dT1 -dT2 -dT4D9 -dT5 -dT5^P -dZ1 -dZ1D3 -dZ1^! -dZ2-8 -dZ3 -d[ -d[+1 -d[^? -d[} -d]so" -d^$ -d^% -d^) -d^0 -d^1 -d^4 -d^5 -d^6 -d^7q -d^A-4 -d^C -d^CO14 -d^T -d^ak -d^b -d^c -d^f -d^s -dc -dcsh1 -dcO58 -dfO9A -di0# -di0m -di0q -di0z -di2m -di3 -di3,O07 -di3o -di3s -di4* -di4, -di44[ -di4b -di4y -di4z -di5 -di5, -di5hD7 -di5m -di5n -di5o -di5p -di5r -di6b -di6s -di6x -di7 -di7a -di7u -di8_ -dk -dkc -dko5- -dkO5A -dl -dlOB1 -do0! -do06O21 -do0:T1 -do0E -do0H -do0L -do0T -do0c -do0f -do0n -do0p -do0t -do0z -do1C -do1I -do2G -do2O -do2U -do2i -do2iu -do2o[ -do2x -do2| -do3( -do3_ -do3bo3b -do3h -do4@ -do4m -do4y -do5b -do5j -do5n -do5u -do5v -do5w -do6b -do6c -do6t[ -do6u -do6y -do79z4 -do7bc -do7l -do8i -do8k -do8o -do93 -do9i -do9vO94 -doBa -doBm -doBx -dr -drO0B -ds04 -ds0f -ds1h -ds2q -ds34O29 -ds5- -ds65C -ds9y -dsam -dsbh -dsby -dseg -dsg0 -dsgd -dsgr -dsh6 -dsir -dsjlO14 -dskz -dslY -dsmp -dspi -dsr3 -dsrw -dstp -dsvt -dsx/ -dt$Q -du -du*42 -dO02 -dO03 -dO04 -dO05 -dO06 -dO07 -dO09 -dO09$e -dO12 -dO12$q -dO13 -dO13t -dO15O63 -dO16 -dO17 -dO18$A -dO21 -dO23 -dO24 -dO25 -dO26 -dO26^R -dO27 -dO28 -dO28^Y -dO29 -dO29$z -dO29C -dO29o6| -dO32 -dO32Z1 -dO32o6y -dO34 -dO34$m -dO34p1 -dO34O03 -dO36 -dO37 -dO37k -dO37O92 -dO38 -dO38o0B -dO38O64 -dO41 -dO42 -dO42[ -dO43 -dO45 -dO45$d -dO46 -dO46z1 -dO48 -dO48^. -dO49$L -dO51O12 -dO52 -dO53 -dO54 -dO56 -dO62 -dO62K -dO63 -dO63c -dO69 -dO6As2@ -dO72 -dO73 -dO74 -dO75 -dO76 -dO79 -dO7Bs0k -dO81 -dO82 -dO83 -dO83O51 -dO84 -dO85 -dO85O34 -dO8A -dO94 -dO95 -dO96 -dO97 -dOA1 -dOA4 -dOA5 -dOA5O52 -dOA6 -dOA6*93 -dOA7 -dOB4 -dOB8 -dz1r -dz2 -dz3 -dz3Z1 -dz3s*p -dz3O75 -dz4 -dz4$! -dz4i11 -d{ -d}D2 +c $ +c $! +c $! $1 +c $! $@ +c $! $@ $# +c $! d +c $! d ] +c $! o4a +c $" +c $# +c $# d +c $$ +c $$ d +c $& d +c $& d ] +c $) +c $* +c $* $* ^* ^* +c $* d +c $* d ] +c $+ +c $+ d +c $+ d ] +c $- +c $- d +c $- d ] +c $. +c $0 $0 +c $0 $0 $0 +c $0 $0 $1 +c $0 $0 $7 +c $0 $2 +c $0 $3 +c $0 $4 +c $0 $5 +c $0 $6 +c $0 $7 +c $0 $8 +c $0 $9 +c $0 $9 $8 +c $0 $9 $8 $7 +c $0 $9 $8 $7 $6 +c $0 $9 $8 $7 $6 $5 +c $0 d +c $0 d ] +c $1 $! +c $1 $0 +c $1 $1 +c $1 $1 $1 +c $1 $2 $3 $4 +c $1 $2 $3 $4 $5 +c $1 $2 $3 $4 $5 $6 +c $1 $2 $3 $a $b $c +c $1 $2 $a $b +c $1 $3 +c $1 $4 +c $1 $5 +c $1 $6 +c $1 $7 +c $1 $8 +c $1 $9 +c $1 $9 $6 $0 +c $1 $9 $6 $1 +c $1 $9 $6 $2 +c $1 $9 $6 $3 +c $1 $9 $6 $4 +c $1 $9 $6 $5 +c $1 $9 $6 $6 +c $1 $9 $6 $7 +c $1 $9 $6 $8 +c $1 $9 $6 $9 +c $1 $9 $7 $0 +c $1 $9 $7 $1 +c $1 $9 $7 $2 +c $1 $9 $7 $3 +c $1 $9 $7 $4 +c $1 $9 $7 $5 +c $1 $9 $7 $6 +c $1 $9 $7 $7 +c $1 $9 $7 $8 +c $1 $9 $7 $9 +c $1 $9 $8 $0 +c $1 $9 $8 $1 +c $1 $9 $8 $2 +c $1 $9 $8 $3 +c $1 $9 $8 $4 +c $1 $9 $8 $5 +c $1 $9 $8 $6 +c $1 $9 $8 $7 +c $1 $9 $8 $8 +c $1 $9 $8 $9 +c $1 $9 $9 $0 +c $1 $9 $9 $1 +c $1 $9 $9 $2 +c $1 $9 $9 $3 +c $1 $9 $9 $4 +c $1 $9 $9 $5 +c $1 $9 $9 $6 +c $1 $9 $9 $7 +c $1 $9 $9 $8 +c $1 $9 $9 $9 +c $1 $s $t +c $1 d +c $1 d ] +c $2 +c $2 $0 +c $2 $0 $0 $0 +c $2 $0 $0 $1 +c $2 $0 $0 $2 +c $2 $0 $0 $3 +c $2 $0 $0 $4 +c $2 $0 $0 $5 +c $2 $0 $0 $6 +c $2 $0 $0 $7 +c $2 $0 $0 $8 +c $2 $0 $0 $9 +c $2 $0 $1 $0 +c $2 $0 $1 $1 +c $2 $0 $1 $2 +c $2 $0 $1 $3 +c $2 $0 $1 $4 +c $2 $0 $1 $5 +c $2 $0 $1 $6 +c $2 $0 $1 $7 +c $2 $0 $1 $8 +c $2 $0 $1 $9 +c $2 $0 $2 $0 +c $2 $0 $2 $1 +c $2 $0 $2 $2 +c $2 $0 $2 $3 +c $2 $0 $2 $4 +c $2 $0 $2 $5 +c $2 $0 $2 $6 +c $2 $0 $2 $7 +c $2 $0 $2 $8 +c $2 $0 $2 $9 +c $2 $1 +c $2 $2 +c $2 $2 $2 +c $2 $3 +c $2 $3 $4 +c $2 $4 +c $2 $5 +c $2 $6 +c $2 $7 +c $2 $8 +c $2 $9 +c $2 $k +c $2 $m $e +c $2 $u +c $2 d +c $2 d ] +c $2 z3 +c $3 $0 +c $3 $1 +c $3 $2 +c $3 $2 $1 +c $3 $3 +c $3 $3 $3 +c $3 $4 +c $3 $4 $5 +c $3 $5 +c $3 $6 +c $3 $7 +c $3 $8 +c $3 $9 +c $3 d +c $3 d ] +c $4 +c $4 $0 +c $4 $1 +c $4 $2 +c $4 $3 +c $4 $3 $2 $1 +c $4 $4 +c $4 $4 $4 +c $4 $5 +c $4 $5 $6 +c $4 $6 +c $4 $7 +c $4 $8 +c $4 $9 +c $4 $M $e +c $4 $U +c $4 $a $l $l +c $4 $e $v $e $r +c $4 $f $r $e $e +c $4 $l $i $f $e +c $4 $m $e +c $4 $u +c $4 $u $s +c $4 d +c $4 d ] +c $5 +c $5 $0 +c $5 $1 +c $5 $2 +c $5 $3 +c $5 $4 +c $5 $4 $3 $2 $1 +c $5 $5 +c $5 $5 $5 +c $5 $6 +c $5 $6 $7 +c $5 $7 +c $5 $8 +c $5 $9 +c $5 d +c $6 $0 +c $6 $1 +c $6 $2 +c $6 $3 +c $6 $4 +c $6 $5 +c $6 $5 $4 $3 $2 $1 +c $6 $6 +c $6 $6 $6 +c $6 $7 +c $6 $7 $8 +c $6 $8 +c $6 $9 +c $6 d +c $6 d ] +c $7 +c $7 $0 +c $7 $1 +c $7 $2 +c $7 $3 +c $7 $4 +c $7 $5 +c $7 $6 +c $7 $7 +c $7 $7 $7 +c $7 $8 +c $7 $8 $9 +c $7 $9 +c $7 T3 +c $7 d +c $7 d ] +c $8 $0 +c $8 $1 +c $8 $2 +c $8 $3 +c $8 $4 +c $8 $5 +c $8 $6 +c $8 $7 +c $8 $8 +c $8 $8 $8 +c $8 $9 +c $8 d +c $8 d ] +c $9 +c $9 $0 +c $9 $1 +c $9 $2 +c $9 $3 +c $9 $4 +c $9 $5 +c $9 $6 +c $9 $7 +c $9 $8 +c $9 $9 +c $9 $9 $9 +c $9 d +c $9 d ] +c $: $) +c $; +c $? +c $A +c $D +c $G +c $H +c $I +c $L +c $M +c $N +c $R +c $U +c $X +c $Z +c $[ +c $^ +c $_ +c $_ d +c $_ d ] +c $a $b +c $a $b $c +c $e +c $k +c $l +c $m $e +c $v +c $x +c $x $x $x +c ${ +c '3 z5 +c '5 +c '7 Z1 +c '9 T3 +c 'B +c *21 +c *24 T0 +c *25 O13 +c *40 t +c *46 +c *52 +0 +c *58 +c *65 o65 +c *68 +c *70 +c *83 +c *8A +c *A8 O86 +c +0 +c +2 +c +3 +c +4 +c +5 +c +7 +c +7 L3 +c +A +c -0 $= +c -1 +c -2 +c -3 +c -3 '6 +c -4 +c -4 T4 +c -6 +c -7 +c -8 +c -9 +c -B +c @2 O14 +c @3 +c @A +c @b +c @f +c @f O23 +c @l O02 +c @m +c @q -5 +c D0 D8 +c D1 +c D4 +c D5 +c D5 @k +c D6 +c D7 +c D7 *05 +c DA +c DB +c K *14 +c K i1[ +c K p1 +c L0 +c L0 ^p +c L0 l +c L0 sl( +c L5 +c L7 +c L7 O05 +c R2 +c R3 +c R5 z3 +c R6 +c R6 C +c R7 +c T1 +c T1 $1 +c T1 T2 +c T1 T2 T3 +c T1 T2 T4 T5 +c T1 T2 T4 T5 T6 +c T1 d +c T1 f +c T1 i1& +c T1 i1+ +c T1 i1- +c T1 i1. i2E i3. +c T1 i1. i2F i3. +c T1 i1. i2O i3. +c T1 i1_ +c T2 +c T2 $1 +c T2 T4 +c T2 T4 T6 +c T2 T4 T6 T8 +c T2 T4 T6 T8 TA +c T2 T4 T6 T8 TA TC +c T2 d +c T2 f +c T2 i2& +c T2 i2+ +c T2 i2- +c T2 i2. +c T2 i2_ +c T3 $1 +c T3 d +c T3 f +c T3 i3& +c T3 i3+ +c T3 i3- +c T3 i3. +c T3 i3_ +c T4 $1 +c T4 d +c T4 i4& +c T4 i4+ +c T4 i4- +c T4 i4. +c T4 i4_ +c T5 $1 +c T5 +4 +c T5 i5& +c T5 i5+ +c T5 i5- +c T5 i5. +c T5 i5_ +c T6 $1 +c T6 +B +c T6 i6+ +c T6 i6- +c T6 i6_ +c T7 $1 +c T7 i7- +c T7 i7_ +c T8 +c T8 $1 +c T8 @s +c T8 i8+ +c T8 i8- +c T8 i8_ +c T9 +c T9 $1 +c T9 i9+ +c T9 i9- +c T9 i9. +c T9 i9_ +c TA +c TA $1 +c TA iA- +c TB +c TB $1 +c TB iB_ +c Z1 $6 +c Z1 O61 +c Z2 i32 +c Z3 O53 +c Z3 O83 +c [ +c [ K +c [ Z1 +c [ z3 +c ^ +c ^! +c ^! $! +c ^! ^1 +c ^! d +c ^" $" +c ^# +c ^# $# +c ^$ +c ^$ $$ +c ^$ ^$ +c ^& +c ^( +c ^( $) +c ^* +c ^* $# +c ^* $* +c ^* ^* +c ^* d +c ^+ +c ^+ $+ +c ^+ d +c ^- +c ^- $- +c ^. +c ^0 +c ^0 $0 +c ^0 ^0 +c ^0 ^0 ^0 ^2 +c ^0 ^1 +c ^0 ^1 ^0 ^2 +c ^0 ^2 +c ^0 ^3 +c ^0 ^4 +c ^0 ^5 +c ^0 ^6 +c ^0 ^6 ^9 ^1 +c ^0 ^7 +c ^0 ^7 ^9 ^1 +c ^0 ^8 +c ^0 ^8 ^9 ^1 +c ^0 ^9 +c ^0 ^9 ^9 ^1 +c ^1 +c ^1 $1 +c ^1 $2 +c ^1 ^! +c ^1 ^0 +c ^1 ^0 ^0 ^2 +c ^1 ^1 +c ^1 ^2 +c ^1 ^3 +c ^1 ^4 +c ^1 ^5 +c ^1 ^6 +c ^1 ^6 ^9 ^1 +c ^1 ^7 +c ^1 ^7 ^9 ^1 +c ^1 ^8 +c ^1 ^8 ^9 ^1 +c ^1 ^9 +c ^1 ^9 ^9 ^1 +c ^1 ^e ^h ^T +c ^1 ^e ^h ^t +c ^1 d +c ^2 +c ^2 $2 +c ^2 ^0 +c ^2 ^0 ^0 ^2 +c ^2 ^1 +c ^2 ^2 +c ^2 ^3 +c ^2 ^4 +c ^2 ^5 +c ^2 ^6 +c ^2 ^6 ^9 ^1 +c ^2 ^7 +c ^2 ^7 ^9 ^1 +c ^2 ^8 +c ^2 ^8 ^9 ^1 +c ^2 ^9 +c ^2 ^9 ^9 ^1 +c ^2 d +c ^3 +c ^3 $3 +c ^3 ^0 +c ^3 ^0 ^0 ^2 +c ^3 ^1 +c ^3 ^2 +c ^3 ^2 ^1 +c ^3 ^3 +c ^3 ^4 +c ^3 ^5 +c ^3 ^6 +c ^3 ^6 ^9 ^1 +c ^3 ^7 +c ^3 ^7 ^9 ^1 +c ^3 ^8 +c ^3 ^8 ^9 ^1 +c ^3 ^9 +c ^3 ^9 ^9 ^1 +c ^3 d +c ^4 +c ^4 $4 +c ^4 ^0 +c ^4 ^0 ^0 ^2 +c ^4 ^1 +c ^4 ^2 +c ^4 ^3 +c ^4 ^3 ^2 ^1 +c ^4 ^4 +c ^4 ^5 +c ^4 ^6 +c ^4 ^6 ^9 ^1 +c ^4 ^7 +c ^4 ^7 ^9 ^1 +c ^4 ^8 +c ^4 ^8 ^9 ^1 +c ^4 ^9 +c ^4 ^9 ^9 ^1 +c ^5 +c ^5 $5 +c ^5 ^0 +c ^5 ^0 ^0 ^2 +c ^5 ^1 +c ^5 ^2 +c ^5 ^3 +c ^5 ^4 +c ^5 ^4 ^3 ^2 ^1 +c ^5 ^5 +c ^5 ^6 +c ^5 ^6 ^9 ^1 +c ^5 ^7 +c ^5 ^7 ^9 ^1 +c ^5 ^8 +c ^5 ^8 ^9 ^1 +c ^5 ^9 +c ^5 ^9 ^9 ^1 +c ^5 d +c ^6 +c ^6 $6 +c ^6 ^0 +c ^6 ^0 ^0 ^2 +c ^6 ^1 +c ^6 ^2 +c ^6 ^3 +c ^6 ^4 +c ^6 ^5 +c ^6 ^5 ^4 ^3 ^2 ^1 +c ^6 ^6 +c ^6 ^6 ^9 ^1 +c ^6 ^7 +c ^6 ^7 ^9 ^1 +c ^6 ^8 +c ^6 ^8 ^9 ^1 +c ^6 ^9 +c ^6 ^9 ^9 ^1 +c ^6 d +c ^7 +c ^7 $7 +c ^7 ^0 +c ^7 ^0 ^0 ^2 +c ^7 ^1 +c ^7 ^2 +c ^7 ^3 +c ^7 ^4 +c ^7 ^5 +c ^7 ^6 +c ^7 ^6 ^9 ^1 +c ^7 ^7 +c ^7 ^7 ^9 ^1 +c ^7 ^8 +c ^7 ^8 ^9 ^1 +c ^7 ^9 +c ^7 ^9 ^9 ^1 +c ^8 +c ^8 $8 +c ^8 ^0 +c ^8 ^0 ^0 ^2 +c ^8 ^1 +c ^8 ^2 +c ^8 ^3 +c ^8 ^4 +c ^8 ^5 +c ^8 ^6 +c ^8 ^6 ^9 ^1 +c ^8 ^7 +c ^8 ^7 ^9 ^1 +c ^8 ^8 +c ^8 ^8 ^9 ^1 +c ^8 ^9 +c ^8 ^9 ^9 ^1 +c ^8 d +c ^9 +c ^9 $9 +c ^9 ^0 +c ^9 ^0 ^0 ^2 +c ^9 ^1 +c ^9 ^2 +c ^9 ^3 +c ^9 ^4 +c ^9 ^5 +c ^9 ^6 +c ^9 ^6 ^9 ^1 +c ^9 ^7 +c ^9 ^7 ^9 ^1 +c ^9 ^8 +c ^9 ^8 ^9 ^1 +c ^9 ^9 +c ^9 ^9 ^9 ^1 +c ^9 d +c ^; *4A +c ^< +c ^< $> +c ^= $= +c ^? +c ^@ +c ^@ $@ +c ^A +c ^B +c ^C +c ^D +c ^F +c ^G +c ^H +c ^I +c ^I T0 +c ^J +c ^K +c ^L +c ^M +c ^Q +c ^S +c ^V +c ^[ +c ^[ $] +c ^_ +c ^_ $_ +c ^` D4 +c ^a +c ^a f +c ^c ^R +c ^e ^h ^T +c ^e ^h ^t +c ^e ^v ^o ^l ^I +c ^e ^v ^o ^l ^i +c ^f +c ^k ^2 +c ^l +c ^l ^l ^a ^4 +c ^m ^a ^I +c ^m ^a ^i +c ^r } +c ^t ^s ^1 +c ^t z3 +c ^u +c ^y ^M +c ^y ^m +c ^y ^m ^4 +c ^z +c ^{ $} +c d +c i0: +c i0` +c i0r +c i1! +c i1# +c i1$ +c i1% +c i1& +c i1' +c i1* +c i1+ +c i1- +c i1. +c i10 +c i10 T2 +c i10 i31 +c i10 i31 i52 +c i10 i31 i52 i73 +c i11 +c i11 T2 +c i11 i31 +c i11 i31 i51 +c i11 i31 i51 i71 +c i11 i31 i51 i71 i91 +c i11 i31 i51 i71 i91 iB1 +c i11 i32 +c i11 i32 i53 +c i11 i32 i53 i74 +c i11 i32 i53 i74 i95 +c i11 i32 i53 i74 i95 iB6 +c i11 i32 i53 i74 i95 iB6 iD7 +c i12 +c i12 T2 +c i13 +c i13 T2 +c i14 +c i14 T2 +c i15 +c i15 T2 +c i16 +c i16 T2 +c i17 +c i17 T2 +c i18 +c i18 T2 +c i19 +c i19 T2 +c i1F +c i1R +c i1W +c i1_ +c i1a +c i1c +c i1e +c i1h +c i1i +c i1o +c i1u +c i2! +c i2# +c i2$ +c i2& +c i2' +c i2* +c i2+ +c i2- +c i2. +c i2/ +c i20 +c i20 T3 +c i21 +c i21 T3 +c i22 +c i22 T3 +c i23 +c i23 T3 +c i24 +c i24 T3 +c i25 +c i26 +c i26 T3 +c i27 +c i27 T3 +c i28 +c i28 T3 +c i29 +c i2_ +c i2a +c i2e +c i2o +c i2u +c i3 +c i3! +c i3" ^' +c i3# +c i3$ +c i3& +c i3' +c i3* +c i3+ +c i3- +c i3. +c i3/ +c i30 +c i30 T4 +c i31 +c i31 T4 +c i32 +c i32 T4 +c i33 +c i33 T4 +c i34 +c i34 T4 +c i35 +c i35 T4 +c i36 +c i36 T4 +c i37 +c i37 T4 +c i38 +c i38 T4 +c i39 +c i3: +c i3@ +c i3C +c i3H +c i3L +c i3_ +c i3a +c i3e +c i3i +c i3o +c i3u +c i4 +c i4! +c i4# +c i4$ +c i4& +c i4' +c i4* +c i4+ +c i4- +c i4. +c i40 +c i40 T5 +c i41 +c i41 T5 +c i42 +c i42 T5 +c i43 +c i43 T5 +c i44 +c i44 T5 +c i45 +c i45 T5 +c i46 +c i46 T5 +c i47 +c i47 T5 +c i48 +c i48 T5 +c i49 +c i49 T5 +c i4@ +c i4_ +c i4a +c i4b +c i4e +c i4j +c i4m +c i4o +c i4u +c i5 +c i5! +c i5# +c i5$ +c i5& +c i5' +c i5* +c i5+ +c i5, +c i5- +c i5. +c i5/ +c i50 +c i50 T6 +c i51 +c i51 T6 +c i52 +c i52 T6 +c i53 +c i53 T6 +c i54 +c i54 T6 +c i55 +c i55 T6 +c i56 +c i56 T6 +c i57 +c i57 T6 +c i58 +c i58 T6 +c i59 +c i59 T6 +c i5K +c i5M +c i5_ +c i5a +c i5e +c i5g +c i5o +c i5p +c i5r +c i5s +c i5u +c i6! +c i6# +c i6$ +c i6& +c i6' +c i6* +c i6+ +c i6- +c i6. +c i60 +c i61 +c i61 T7 +c i62 +c i62 T7 +c i63 +c i63 T7 +c i64 +c i64 T7 +c i65 +c i65 T7 +c i66 +c i66 T7 +c i67 +c i67 T7 +c i68 +c i69 +c i6@ +c i6C +c i6R +c i6W +c i6_ +c i6a +c i6b +c i6e +c i6h +c i6o +c i6u +c i7! +c i7# +c i7$ +c i7& +c i7' +c i7* +c i7+ +c i7- +c i7. +c i70 +c i71 +c i72 +c i73 +c i74 +c i75 +c i76 +c i77 +c i78 +c i79 +c i7@ +c i7_ +c i7a +c i7e +c i7o +c i7u +c i8 +c i8! +c i8# +c i8$ +c i8& +c i8* +c i8+ +c i8- +c i80 +c i81 +c i82 +c i83 +c i84 +c i85 +c i86 +c i87 +c i88 +c i89 +c i8_ +c i8a +c i8e +c i8i +c i8o +c i8r +c i8u +c iA2 +c k +c k *16 +l L4 +c o06 +c o0? +c o0k +c o0p +c o0r +c o0t +c o0v +c o0y +c o1! +c o1# +c o1$ +c o1* +c o1+ +c o1- +c o1. +c o10 +c o11 +c o12 +c o13 +c o14 +c o15 +c o16 +c o17 +c o18 +c o19 +c o1@ +c o1A +c o1T +c o1V +c o1_ +c o1a +c o1e +c o1l +c o1m +c o1v +c o1y +c o2! +c o2# +c o2$ +c o2& +c o2* +c o2+ +c o2- +c o20 +c o21 +c o22 +c o23 +c o24 +c o25 +c o26 +c o27 +c o28 +c o29 +c o2@ +c o2L +c o2_ +c o2n +c o2y +c o3! +c o3# +c o3$ +c o3% +c o3& +c o3* +c o3+ +c o3, +c o3- +c o30 +c o31 +c o32 +c o33 +c o34 +c o35 +c o36 +c o37 +c o38 +c o39 +c o3@ +c o3R +c o3S +c o3_ +c o3c +c o3m +c o4! +c o4# +c o4$ +c o4& +c o4* +c o4+ +c o4- +c o4. +c o40 +c o41 +c o42 +c o43 +c o44 +c o45 +c o46 +c o47 +c o48 +c o49 +c o4@ +c o4N +c o4O +c o4S +c o4V +c o4W +c o4_ +c o4l +c o4w +c o5! +c o5! O74 +c o5# +c o5$ +c o5& +c o5* +c o5+ +c o5- +c o5. +c o50 +c o51 +c o52 +c o53 +c o54 +c o55 +c o56 +c o57 +c o58 +c o59 +c o5@ +c o5F +c o5J +c o5W +c o5X +c o5_ +c o5a +c o6! +c o6# +c o6$ +c o6& +c o6* +c o6+ +c o6+ i1s +c o6- +c o6. +c o60 +c o61 +c o62 +c o63 +c o64 +c o65 +c o66 +c o67 +c o68 +c o69 +c o6@ +c o6M +c o6T +c o6W +c o6_ +c o6e +c o6o +c o6q +c o7! +c o7# +c o7$ +c o7& +c o7* +c o7+ +c o7- +c o7. +c o70 +c o71 +c o72 +c o73 +c o74 +c o75 +c o76 +c o77 +c o78 +c o79 +c o7? +c o7@ +c o7M +c o7S +c o7V +c o7_ +c o7e +c o7o +c o7r +c o8! +c o8# +c o8$ +c o8& +c o8* +c o8+ +c o8+ R7 +c o8- +c o8/ +c o80 +c o81 +c o82 +c o83 +c o84 +c o85 +c o86 +c o87 +c o88 +c o89 +c o8H +c o8S +c o8_ +c o8o +c o9! +c o9# +c o9$ +c o9* +c o9+ +c o9- +c o90 +c o91 +c o92 +c o93 +c o94 +c o95 +c o96 +c o97 +c o98 +c o99 +c o9V +c o9_ +c oA. O25 +c oA4 +c oA6 +c oAm +c p3 +c p3 '8 +c p4 +c p5 +c q +c r +c s$2 +c s0# +c s0I +c s0o Z5 +c s1, +c s10 +c s2* +c s2I +c s2m +c s4K +c s8! +c s87 O43 +c sGI +c sa4 +c sa4 $! +c sa4 d +c sa@ +c sa@ $! +c sa@ T4 +c sa@ T5 +c sa@ T6 +c sa@ d +c sa@ se3 +c sa@ se3 si1 +c sa@ se3 ss$ +c sa@ si! +c sa@ si1 +c sa@ si1 ss$ +c sa@ sl1 +c sa@ so0 +c sa@ so0 se3 +c sa@ so0 si! +c sa@ so0 si1 +c sa@ so0 ss$ +c sa@ ss$ +c saw +c sb1 +c sb5 $! +c sb8 +c sb8 $! +c sb8 d +c sd1 +c se3 +c se3 $! +c se3 T1 +c se3 T2 +c se3 T3 +c se3 T4 +c se3 T5 +c se3 T6 +c se3 T7 +c se3 d +c se3 si! +c se3 si! ss$ +c se3 si1 ss$ +c se3 sl1 +c se3 ss$ +c seu +c sex +c sg9 +c sg9 $! +c sgV +c si! +c si! $! +c si! T1 +c si! T2 +c si! T3 +c si! T4 +c si! T5 +c si! T6 +c si! sl1 +c si! ss$ +c si1 +c si1 $! +c si1 T1 +c si1 T2 +c si1 T3 +c si1 T4 +c si1 T5 +c si1 T6 +c si1 T7 +c si1 d +c si1 se3 +c si1 ss$ +c siU +c siZ +c siu +c sl1 +c sl1 $! +c sl1 T1 +c sl1 T2 +c sl1 T4 +c sl1 T5 +c sl1 T6 +c sl1 T7 +c sl1 d +c slt +c slz +c snj +c so& +c so* +c so0 +c so0 $! +c so0 T1 +c so0 T2 +c so0 T3 +c so0 T4 +c so0 T5 +c so0 T6 +c so0 T7 +c so0 d +c so0 sa4 +c so0 se3 +c so0 se3 si! +c so0 se3 si1 +c so0 se3 ss$ +c so0 si! +c so0 si! ss$ +c so0 si1 +c so0 si1 ss$ +c so0 sl1 +c so0 ss$ +c spv +c ss$ +c ss$ $! +c ss$ T1 +c ss$ T2 +c ss$ T3 +c ss$ T4 +c ss$ T5 +c ss$ T6 +c ss$ T7 +c ss$ d +c ss$ sl1 +c ss- L7 +c ss3 +c ss3 $! +c ss4 +c ss5 +c ss5 $! +c ss5 d +c ss5 se3 +c ssO +c st7 +c st7 $! +c stC +c su4 +c su4 $! +c su[ +c svz +c sx, R5 +c sy1 +c sy2 +u Z4 +c O02 +c O02 L1 +c O03 +c O08 +c O12 O28 +c O17 $O +c O23 +c O24 +c O25 +c O26 +c O28 +c O32 +c O35 +c O35 q +c O36 +c O38 +c O41 $" +c O43 +c O43 $7 +c O52 +c O53 +c O54 '7 +c O57 +c O64 +c O65 +c O84 +c O85 +c O92 +c OA1 O04 +c OA2 +c OB2 +c z1 +c z1 $0 +c z2 +c z2 $2 +c z2 $t +c z2 o9o +c z2 ssR +c z3 +c z3 K +c z3 ^K +c z3 O81 +c z4 +c z5 O18 +c z5 O1B +c { +c } +d $ +d $! +d $# +d $$ +d $& +d $* +d $+ +d $- +d $. +d $0 +d $1 +d $2 +d $3 +d $4 +d $5 +d $6 +d $7 +d $7 snb +d $8 +d $9 +d $= } +d $? o1( +d $@ +d $N *13 +d $P +d $Z +d $] +d $_ +d $a O7A +d $c +d $d *58 +d $g +d $h +d $k i31 +d $m +d $n +d $p +d $q +d $t +d $x D0 +d '6 L5 +d '8 *20 +d '8 i2, +d '9 +d 'A +d 'B +d *03 +d *04 '8 +d *05 +d *06 +d *09 +d *14 +d *15 O93 +d *16 +d *19 *08 +d *20 +d *26 +d *28 O13 +d *32 +d *32 Z1 +d *3A +d *45 +d *47 O58 +d *52 +d *52 R4 +d *53 +d *56 +d *57 +d *64 +d *68 +d *68 t +d *70 +d *71 +d *74 +d *7B O73 +d *81 O63 +d *83 O75 +d *87 +d *92 D2 +d *98 +d *A9 *53 +d +0 +d +1 +d +1 *70 +d +2 +d +3 +d +6 +d +6 t +d +7 +d +8 +d +B +d +B O67 +d -0 O92 +d -2 +d -3 ^ +d -3 O92 +d -4 +d -5 +d -6 +d -6 K +d -7 +d -A +d @3 +d @a +d @k +d @z t +d C O39 +d D1 c +d D2 ] +d D2 o4s +d D3 +d D4 ^; +d D4 o4w +d D5 [ +d D6 +d D6 t +d D7 +d K +d K { +d L2 +d L2 o8g +d L3 l +d R0 +d R3 i7Q +d R5 +d T0 O85 +d T1 +d T2 +d T4 D9 +d T5 +d T5 ^P +d Z1 +d Z1 D3 +d Z1 ^! +d Z2 -8 +d Z3 +d [ +d [ +1 +d [ ^? +d [ } +d ] so" +d ^$ +d ^% +d ^) +d ^0 +d ^1 +d ^4 +d ^5 +d ^6 +d ^7 q +d ^A -4 +d ^C +d ^C O14 +d ^T +d ^a k +d ^b +d ^c +d ^f +d ^s +d c +d c sh1 +d c O58 +d f O9A +d i0# +d i0m +d i0q +d i0z +d i2m +d i3 +d i3, O07 +d i3o +d i3s +d i4* +d i4, +d i44 [ +d i4b +d i4y +d i4z +d i5 +d i5, +d i5h D7 +d i5m +d i5n +d i5o +d i5p +d i5r +d i6b +d i6s +d i6x +d i7 +d i7a +d i7u +d i8_ +d k +d k c +d k o5- +d k O5A +d l +d l OB1 +d o0! +d o06 O21 +d o0: T1 +d o0E +d o0H +d o0L +d o0T +d o0c +d o0f +d o0n +d o0p +d o0t +d o0z +d o1C +d o1I +d o2G +d o2O +d o2U +d o2i +d o2i u +d o2o [ +d o2x +d o2| +d o3( +d o3_ +d o3b +d o3h +d o4@ +d o4m +d o4y +d o5b +d o5j +d o5n +d o5u +d o5v +d o5w +d o6b +d o6c +d o6t [ +d o6u +d o6y +d o79 z4 +d o7b c +d o7l +d o8i +d o8k +d o8o +d o93 +d o9i +d o9v O94 +d oBa +d oBm +d oBx +d r +d r O0B +d s04 +d s0f +d s1h +d s2q +d s34 O29 +d s5- +d s65 C +d s9y +d sam +d sbh +d sby +d seg +d sg0 +d sgd +d sgr +d sh6 +d sir +d sjl O14 +d skz +d slY +d smp +d spi +d sr3 +d srw +d stp +d svt +d sx/ +d t $Q +d u +d u *42 +d O02 +d O03 +d O04 +d O05 +d O06 +d O07 +d O09 +d O09 $e +d O12 +d O12 $q +d O13 +d O13 t +d O15 O63 +d O16 +d O17 +d O18 $A +d O21 +d O23 +d O24 +d O25 +d O26 +d O26 ^R +d O27 +d O28 +d O28 ^Y +d O29 +d O29 $z +d O29 C +d O29 o6| +d O32 +d O32 Z1 +d O32 o6y +d O34 +d O34 $m +d O34 p1 +d O34 O03 +d O36 +d O37 +d O37 k +d O37 O92 +d O38 +d O38 o0B +d O38 O64 +d O41 +d O42 +d O42 [ +d O43 +d O45 +d O45 $d +d O46 +d O46 z1 +d O48 +d O48 ^. +d O49 $L +d O51 O12 +d O52 +d O53 +d O54 +d O56 +d O62 +d O62 K +d O63 +d O63 c +d O69 +d O6A s2@ +d O72 +d O73 +d O74 +d O75 +d O76 +d O79 +d O7B s0k +d O81 +d O82 +d O83 +d O83 O51 +d O84 +d O85 +d O85 O34 +d O8A +d O94 +d O95 +d O96 +d O97 +d OA1 +d OA4 +d OA5 +d OA5 O52 +d OA6 +d OA6 *93 +d OA7 +d OB4 +d OB8 +d z1 r +d z2 +d z3 +d z3 Z1 +d z3 s*p +d z3 O75 +d z4 +d z4 $! +d z4 i11 +d { +d } D2 f -f$1 -f$8 -f$9 -f$F -f$P -f$V -f$a -f$d -f$e -f$ei1Z -f$f -f$go8n -f$gO76 -f$h+0 -f$l -f$m -f$n -f$no3X -f$r*01 -f$t -f$v -f$z -f'7 -f'7z4 -f'8 -f'8i5m -f'9 -f'9@l -f'9O61 -f'A -f'B -f*06O13 -f*15 -f*16 -f*20 -f*21 -f*24 -f*25] -f*31 -f*31$o -f*32$Y -f*36 -f*37 -f*51z1 -f*60 -f*67 -f*67f -f*69O6B -f*71 -f*75O54 -f*78 -f*79 -f*86 -f*94 -f*98O27 -f*9B -f*A5'8 -f+0O16 -f+0O29 -f+2 -f+4 -f+6 -f+7 -f+9 -f-4 -f-5 -f-7O7B -f@a -fC -fCL3 -fD1O58 -fD2 -fD3 -fD4 -fDB -fK -fKO69 -fL2 -fL3K -fL6K -fR4 -fR6iAA -fR8O29 -fT0O0A -fT4 -fT4D0 -fT6O75 -fT9O08 -fZ1 -fZ2 -fZ4*A3 -fZ5 -f[ -f[O59 -f[O75 -f] -f]*51 -f]O19 -f]O72 -f^5 -f^6O3A -f^8 -f^9 -f^T -f^c -f^h -f^m -f^n -f^o*06 -f^s -f^tO17 -f^x+4 -fc -fcD0 -fd -fi00 -fi01 -fi0v -fi3/ -fi3; -fi40 -fi41 -fi44 -fi5E -fi5n -fi60*35 -fi65 -fi6o -fi90 -fl -fo0l -fo1Q -fo1^ -fo21 -fo2e*53 -fo3P -fo4I -fo5) -fo5hk -fo68 -fr+5 -frD8 -fri4q -fs!g'7 -fs4k -fsnc -fss0 -fswv -fsy< -ft -fu[ -fO02 -fO03 -fO04 -fO05 -fO06 -fO08c -fO0Ad -fO13 -fO13$6 -fO14 -fO15 -fO16 -fO17*0A -fO18 -fO18*50 -fO18{ -fO19 -fO19$S -fO1A -fO23 -fO24 -fO25f -fO26 -fO27 -fO28 -fO2A -fO2B -fO31*31 -fO34 -fO34T0 -fO36 -fO36*25 -fO37 -fO38 -fO38T1 -fO39 -fO3A -fO3Ak -fO3B-2 -fO3Bi0b -fO42 -fO42*40 -fO42z3 -fO43 -fO45 -fO47 -fO47Z2 -fO48 -fO48D8 -fO48sh/ -fO49 -fO4AL5 -fO4B -fO51 -fO52 -fO53 -fO56 -fO57 -fO58 -fO59 -fO59o57 -fO5A -fO5AT0 -fO5Asts -fO5B -fO61 -fO61o3s -fO63 -fO64 -fO64L7 -fO65 -fO65t -fO67 -fO68 -fO69 -fO6A -fO6B -fO73 -fO74 -fO75 -fO75i7l -fO76 -fO78 -fO7A -fO7A+6 -fO7B -fO82 -fO83 -fO85 -fO86 -fO8Ao8a -fO8B -fO91 -fO93 -fO96 -fOA5 -fOA8 -fOB4 -fz1 -fz1'A -fz2 -fz2R1 -fz2O2A -f{ -f{*65 -f{[ -f} -f}O53 -i0 ^m -i0 l -i0 z2 -i0!o3t+0 -i0!O81 -i0$o3s -i0$O46 -i0$z3Z2 -i0'^U -i0($g^B -i0)i5Fo9z -i0)z2 -i0*$0 -i0+$Vo6k -i0+-0OA3 -i0+-3 -i0+O72O24 -i0,*62 -i0-D6 -i0.z3 -i0.} -i0/z5 -i00'4 -i00o6m -i00z2i2^ -i01$9 -i01'B -i01TA -i01Z2 -i01i8o -i01r -i01szt -i01z4z2 -i02$t -i02^l -i02z4 -i03K -i04'6 -i04^! -i04o5^ -i05D3 -i05^! -i05lO65 -i05O31T2 -i06i5t -i07D5 -i08O71 -i09+2 -i09cR4 -i09O15 -i09z3 -i09} -i0:o2" -i0;i2xl -i0;i5A -i0<$uo6( -i0Z4 -i0?$! -i0@*19l -i0@i3q -i0AO13 -i0D^q*14 -i0Dr -i0Dz3 -i0E$J -i0G*19 -i0G] -i0Gt -i0Gz1$5 -i0I+2 -i0IO53 -i0J$M -i0J$d -i0Ji3f -i0Ll -i0LO18d -i0LO23 -i0M$b -i0Mo0?su` -i0MO71 -i0N*56i3N -i0N^=^i -i0OD3 -i0O^L -i0O^esk> -i0PD2 -i0P^E -i0Po1w -i0Q$"o4^ -i0Q$7 -i0QO26 -i0QO61^2 -i0R^W -i0SD4 -i0T^Y -i0TO52 -i0U$5l -i0Uo4h -i0V$B -i0Vo6# -i0Z$; -i0Z^* -i0Zz1 -i0\$w -i0\p4 -i0]'4 -i0]o73^[ -i0^z2 -i0_s87 -i0`^Lo2I -i0`o8f -i0`r -i0a$r -i0a^K -i0ai7'*48 -i0ao6c -i0at -i0b*17 -i0bD5 -i0bZ1 -i0bsrs -i0b} -i0c*23 -i0c-6 -i0c-7 -i0co5m -i0cshk -i0cz3O31 -i0d$x -i0d+2i4' -i0dR6 -i0dZ3 -i0dZ3O18 -i0d^Y*52 -i0do1h -i0dz4 -i0e*21 -i0e*93O1B -i0e^h -i0esn_ -i0ez3 -i0f'8 -i0f-1 -i0fo15 -i0fq -i0fs9v -i0fz3O56 -i0g$r -i0g*12 -i0g*16 -i0g*70 -i0gz1 -i0h*15 -i0h*67 -i0h@5 -i0hZ2 -i0h^d -i0h^e -i0hsli -i0hO48 -i0j*56l -i0jo0G*57 -i0jz2 -i0k$e -i0k$o -i0k+4 -i0kD4 -i0k^g -i0lR6$M -i0lsv8 -i0m*02 -i0m*62 -i0m*70 -i0mi1V -i0n$so4+ -i0n'A -i0n*49c -i0n^k -i0n^zt -i0ni5Yo7E -i0nOB6O08 -i0o+7OA1 -i0o^N -i0p*80 -i0p+8 -i0qo3g -i0r$T*07 -i0rD6 -i0rl^z -i0rz4 -i0s$a -i0s@a -i0sZ2T8 -i0s^X -i0ss2y^p -i0t*50 -i0t+2 -i0tO04o2h -i0tz2 -i0u^c -i0v'9 -i0v*07 -i0vo4w -i0vr -i0w*30 -i0wl -i0wO23Z5 -i0wO81 -i0x*0AO09 -i0x^C*12 -i0xs9u -i0xz3i1? -i0y$0 -i0y$c -i0y@w -i0yr -i0zsiVl -i0zO04-8 -i0zz1 -i0{K -i0{u -i0|*52 -i0}'8 +f $1 +f $8 +f $9 +f $F +f $P +f $V +f $a +f $d +f $e +f $e i1Z +f $f +f $g o8n +f $g O76 +f $h +0 +f $l +f $m +f $n +f $n o3X +f $r *01 +f $t +f $v +f $z +f '7 +f '7 z4 +f '8 +f '8 i5m +f '9 +f '9 @l +f '9 O61 +f 'A +f 'B +f *06 O13 +f *15 +f *16 +f *20 +f *21 +f *24 +f *25 ] +f *31 +f *31 $o +f *32 $Y +f *36 +f *37 +f *51 z1 +f *60 +f *67 +f *67 f +f *69 O6B +f *71 +f *75 O54 +f *78 +f *79 +f *86 +f *94 +f *98 O27 +f *9B +f *A5 '8 +f +0 O16 +f +0 O29 +f +2 +f +4 +f +6 +f +7 +f +9 +f -4 +f -5 +f -7 O7B +f @a +f C +f C L3 +f D1 O58 +f D2 +f D3 +f D4 +f DB +f K +f K O69 +f L2 +f L3 K +f L6 K +f R4 +f R6 iAA +f R8 O29 +f T0 O0A +f T4 +f T4 D0 +f T6 O75 +f T9 O08 +f Z1 +f Z2 +f Z4 *A3 +f Z5 +f [ +f [ O59 +f [ O75 +f ] +f ] *51 +f ] O19 +f ] O72 +f ^5 +f ^6 O3A +f ^8 +f ^9 +f ^T +f ^c +f ^h +f ^m +f ^n +f ^o *06 +f ^s +f ^t O17 +f ^x +4 +f c +f c D0 +f d +f i00 +f i01 +f i0v +f i3/ +f i3; +f i40 +f i41 +f i44 +f i5E +f i5n +f i60 *35 +f i65 +f i6o +f i90 +f l +f o0l +f o1Q +f o1^ +f o21 +f o2e *53 +f o3P +f o4I +f o5) +f o5h k +f o68 +f +5 +f D8 +f i4q +f s!g '7 +f s4k +f snc +f ss0 +f swv +f sy< +f t +f u [ +f O02 +f O03 +f O04 +f O05 +f O06 +f O08 c +f O0A d +f O13 +f O13 $6 +f O14 +f O15 +f O16 +f O17 *0A +f O18 +f O18 *50 +f O18 { +f O19 +f O19 $S +f O1A +f O23 +f O24 +f O25 f +f O26 +f O27 +f O28 +f O2A +f O2B +f O31 *31 +f O34 +f O34 T0 +f O36 +f O36 *25 +f O37 +f O38 +f O38 T1 +f O39 +f O3A +f O3A k +f O3B -2 +f O3B i0b +f O42 +f O42 *40 +f O42 z3 +f O43 +f O45 +f O47 +f O47 Z2 +f O48 +f O48 D8 +f O48 sh/ +f O49 +f O4A L5 +f O4B +f O51 +f O52 +f O53 +f O56 +f O57 +f O58 +f O59 +f O59 o57 +f O5A +f O5A T0 +f O5A sts +f O5B +f O61 +f O61 o3s +f O63 +f O64 +f O64 L7 +f O65 +f O65 t +f O67 +f O68 +f O69 +f O6A +f O6B +f O73 +f O74 +f O75 +f O75 i7l +f O76 +f O78 +f O7A +f O7A +6 +f O7B +f O82 +f O83 +f O85 +f O86 +f O8A o8a +f O8B +f O91 +f O93 +f O96 +f OA5 +f OA8 +f OB4 +f z1 +f z1 'A +f z2 +f z2 R1 +f z2 O2A +f { +f { *65 +f { [ +f } +f } O53 +i0 ^m +i0 l +i0 z2 +i0! o3t +0 +i0! O81 +i0$ o3s +i0$ O46 +i0$ z3 Z2 +i0' ^U +i0( $g ^B +i0) i5F o9z +i0) z2 +i0* $0 +i0+ $V o6k +i0+ -0 OA3 +i0+ -3 +i0+ O72 O24 +i0, *62 +i0- D6 +i0. z3 +i0. } +i0/ z5 +i00 '4 +i00 o6m +i00 z2 i2^ +i01 $9 +i01 'B +i01 TA +i01 Z2 +i01 i8o +i01 r +i01 szt +i01 z4 z2 +i02 $t +i02 ^l +i02 z4 +i03 K +i04 '6 +i04 ^! +i04 o5^ +i05 D3 +i05 ^! +i05 l O65 +i05 O31 T2 +i06 i5t +i07 D5 +i08 O71 +i09 +2 +i09 c R4 +i09 O15 +i09 z3 +i09 } +i0: o2" +i0; i2x l +i0; i5A +i0< $u o6( +i0< Z2 +i0= $1 +i0= R3 d +i0= ^/ +i0= } +i0> Z4 +i0? $! +i0@ *19 l +i0@ i3q +i0A O13 +i0D ^q *14 +i0D r +i0D z3 +i0E $J +i0G *19 +i0G ] +i0G t +i0G z1 $5 +i0I +2 +i0I O53 +i0J $M +i0J $d +i0J i3f +i0L l +i0L O18 d +i0L O23 +i0M $b +i0M o0? su` +i0M O71 +i0N *56 i3N +i0N ^= ^i +i0O D3 +i0O ^L +i0O ^e sk> +i0P D2 +i0P ^E +i0P o1w +i0Q $" o4^ +i0Q $7 +i0Q O26 +i0Q O61 ^2 +i0R ^W +i0S D4 +i0T ^Y +i0T O52 +i0U $5 l +i0U o4h +i0V $B +i0V o6# +i0Z $; +i0Z ^* +i0Z z1 +i0\ $w +i0\ p4 +i0] '4 +i0] o73 ^[ +i0^ z2 +i0_ s87 +i0` ^L o2I +i0` o8f +i0` r +i0a $r +i0a ^K +i0a i7' *48 +i0a o6c +i0a t +i0b *17 +i0b D5 +i0b Z1 +i0b srs +i0b } +i0c *23 +i0c -6 +i0c -7 +i0c o5m +i0c shk +i0c z3 O31 +i0d $x +i0d +2 i4' +i0d R6 +i0d Z3 +i0d Z3 O18 +i0d ^Y *52 +i0d o1h +i0d z4 +i0e *21 +i0e *93 O1B +i0e ^h +i0e sn_ +i0e z3 +i0f '8 +i0f -1 +i0f o15 +i0f q +i0f s9v +i0f z3 O56 +i0g $r +i0g *12 +i0g *16 +i0g *70 +i0g z1 +i0h *15 +i0h *67 +i0h @5 +i0h Z2 +i0h ^d +i0h ^e +i0h sli +i0h O48 +i0j *56 l +i0j o0G *57 +i0j z2 +i0k $e +i0k $o +i0k +4 +i0k D4 +i0k ^g +i0l R6 $M +i0l sv8 +i0m *02 +i0m *62 +i0m *70 +i0m i1V +i0n $s o4+ +i0n 'A +i0n *49 c +i0n ^k +i0n ^z t +i0n i5Y o7E +i0n OB6 O08 +i0o +7 OA1 +i0o ^N +i0p *80 +i0p +8 +i0q o3g +i0r $T *07 +i0r D6 +i0r l ^z +i0r z4 +i0s $a +i0s @a +i0s Z2 T8 +i0s ^X +i0s s2y ^p +i0t *50 +i0t +2 +i0t O04 o2h +i0t z2 +i0u ^c +i0v '9 +i0v *07 +i0v o4w +i0v r +i0w *30 +i0w l +i0w O23 Z5 +i0w O81 +i0x *0A O09 +i0x ^C *12 +i0x s9u +i0x z3 i1? +i0y $0 +i0y $c +i0y @w +i0y r +i0z siV l +i0z O04 -8 +i0z z1 +i0{ K +i0{ u +i0| *52 +i0} '8 i1 -i1 C -i1 l +i1 C +i1 l i1! -i1!*17 -i1!Z1*42 +i1! *17 +i1! Z1 *42 i1# -i1#$h +i1# $h i1$ i1% -i1%i2U$g +i1% i2U $g i1& -i1&*46 -i1&r -i1&sso^= +i1& *46 +i1& r +i1& sso ^= i1' i1( i1* -i1*L9'6 -i1*O1Az5 +i1* '6 +i1* O1A z5 i1+ i1, i1- -i1-] -i1-d -i1-i3- -i1-i3-i5- -i1-i3-i5-i7- -i1-i3-i5-i7-i9- -i1-u -i1-O13p2 +i1- ] +i1- d +i1- i3- +i1- i3- i5- +i1- i3- i5- i7- +i1- i3- i5- i7- i9- +i1- u +i1- O13 p2 i1. -i1.i3. -i1.i3.$. -i1.i3.i5. -i1.i3.i5.$. -i1.i3.i5.i7. -i1.i3.i5.i7.$. -i1.i3.i5.i7.i9. -i1.i3.i5.i7.i9.$. -i1.sdO +i1. i3. +i1. i3. $. +i1. i3. i5. +i1. i3. i5. $. +i1. i3. i5. i7. +i1. i3. i5. i7. $. +i1. i3. i5. i7. i9. +i1. i3. i5. i7. i9. $. +i1. sdO i1/ i10 -i10d -i10i31 -i10i31i52 -i10i39 -i10r -i10z1 +i10 d +i10 i31 +i10 i31 i52 +i10 i39 +i10 r +i10 z1 i11 -i11*14r -i11+5 -i11-1^l -i11-3 -i11T2 -i11^i -i11i22 -i11i22i33 -i11i31 -i11i31i51 -i11i31i51i71 -i11i31i51i71i91 -i11i31i51i71i91iB1 -i11i32 -i11i32i53 -i11i32i53i74 -i11i32i53i74i95 -i11i32i53i74i95iB6 -i11i32i53i74i95iB6iD7 -i11s8T +i11 *14 r +i11 +5 +i11 -1 ^l +i11 -3 +i11 T2 +i11 ^i +i11 i22 +i11 i22 i33 +i11 i31 +i11 i31 i51 +i11 i31 i51 i71 +i11 i31 i51 i71 i91 +i11 i31 i51 i71 i91 iB1 +i11 i32 +i11 i32 i53 +i11 i32 i53 i74 +i11 i32 i53 i74 i95 +i11 i32 i53 i74 i95 iB6 +i11 i32 i53 i74 i95 iB6 iD7 +i11 s8T i12 -i12i0f -i12o62 -i12z3 +i12 i0f +i12 o62 +i12 z3 i13 -i13*46 -i13T2 -i13^Z -i13i24^2^1 -i13o1S +i13 *46 +i13 T2 +i13 ^Z +i13 i24 ^2 ^1 +i13 o1S i14 -i14T2 -i14^a -i14i23 -i14t +i14 T2 +i14 ^a +i14 i23 +i14 t i15 -i15$d -i15R2 -i15T2 -i15r -i15z1 +i15 $d +i15 R2 +i15 T2 +i15 r +i15 z1 i16 -i16R0'9 -i16T2 -i16o21 -i16o2z -i16z2} +i16 R0 '9 +i16 T2 +i16 o21 +i16 o2z +i16 z2 } i17 -i17$+ -i17$2 -i17C +i17 $+ +i17 $2 +i17 C i18 -i18T2 -i18Z2O35 -i18r +i18 T2 +i18 Z2 O35 +i18 r i19 -i19+3 -i19T2 -i19Z1 -i19suv -i19} +i19 +3 +i19 T2 +i19 Z1 +i19 suv +i19 } i1: -i1:*27 -i1:Z3o8A -i1:sjV +i1: *27 +i1: Z3 o8A +i1: sjV i1; -i1;R5k +i1; R5 k i1< -i1<*72$c -i1^r -i1>i3wo91 +i1> ^r +i1> i3w o91 i1? -i1?Z3 -i1?o7l -i1?z2 +i1? Z3 +i1? o7l +i1? z2 i1@ -i1@o5C +i1@ o5C i1B -i1B*18 +i1B *18 i1C -i1C{D2 +i1C { D2 i1D -i1DR0 -i1D{ -i1E^J -i1Eo8E -i1Er -i1Ez1 +i1D R0 +i1D { +i1E ^J +i1E o8E +i1E r +i1E z1 i1F i1G i1H -i1Hl -i1Ho9L +i1H l +i1H o9L i1I i1J -i1J$e*04 -i1J*78 +i1J $e *04 +i1J *78 i1K -i1Ko1/Z4 +i1K o1/ Z4 i1L -i1L*91'6 -i1LC -i1L^a -i1Lu[ +i1L *91 '6 +i1L C +i1L ^a +i1L u [ i1M -i1M+8R3 +i1M +8 R3 i1N -i1N[ -i1N^w -i1Ni30$6 -i1Nr +i1N ^w +i1N i30 $6 +i1N r i1O -i1O@d -i1Ot -i1OO28 -i1Oz2 +i1O @d +i1O t +i1O O28 +i1O z2 i1P -i1PZ1 -i1PuR3 -i1P{ +i1P Z1 +i1P u R3 +i1P { i1Q -i1Q-5k -i1Rl -i1SO62 +i1Q -5 k +i1R l +i1S O62 i1T -i1T^4 -i1Ti0v*24 +i1T ^4 +i1T i0v *24 i1U i1V i1W -i1W*27-1 +i1W *27 -1 i1X -i1XC -i1X{ +i1X C +i1X { i1Y -i1YL4 +i1Y L4 i1Z -i1Zi5%o7l -i1Zt +i1Z i5% o7l +i1Z t i1[ -i1\^lR6 +i1\ ^l R6 i1^ -i1^^zi5m -i1^i5]$e +i1^ ^z i5m +i1^ i5] $e i1_ -i1_} +i1_ } i1` -i1`$` -i1`^\*6A +i1` $` +i1` ^\ *6A i1a -i1a'5u -i1a*16 -i1a*37 -i1a*40 -i1ai7o -i1ao0H +i1a '5 u +i1a *16 +i1a *37 +i1a *40 +i1a i7o +i1a o0H i1b -i1b$s -i1b-2 -i1b-5 -i1b@G -i1b[^A -i1bi85O63 +i1b $s +i1b -2 +i1b -5 +i1b @G +i1b [ ^A +i1b i85 O63 i1c -i1c-6 -i1cq -i1c{ +i1c -6 +i1c q +i1c { i1d -i1d$y -i1d*65 -i1dZ1 -i1do3lz3 +i1d $y +i1d *65 +i1d Z1 +i1d o3l z3 i1e -i1eo3 +i1e o3 i1f -i1f-5 -i1fd -i1f} +i1f -5 +i1f d +i1f } i1g -i1g-0 -i1gi5, -i1gO42 -i1gz2 +i1g -0 +i1g i5, +i1g O42 +i1g z2 i1h -i1h^d -i1hp1 +i1h ^d +i1h p1 i1i -i1i*13 -i1i-6 -i1iR2 -i1i^`R6 -i1isry -i1iz3 +i1i *13 +i1i -6 +i1i R2 +i1i ^` R6 +i1i sry +i1i z3 i1j -i1j*23 -i1j+8 -i1jZ4 -i1j^a +i1j *23 +i1j +8 +i1j Z4 +i1j ^a i1k -i1k@b -i1kT6 -i1kZ1 +i1k @b +i1k T6 +i1k Z1 i1l -i1lO26O31 -i1l{ +i1l O26 O31 +i1l { i1m -i1m'5 -i1m*45 -i1mO12 -i1mO57 -i1mz4^P +i1m '5 +i1m *45 +i1m O12 +i1m O57 +i1m z4 ^P i1n -i1n$7 -i1no2k +i1n $7 +i1n o2k i1o -i1o*61i5N -i1o-4 -i1ossN -i1oO52 -i1oz5+7 +i1o *61 i5N +i1o -4 +i1o ssN +i1o O52 +i1o z5 +7 i1p -i1p*46 -i1p+6 +i1p *46 +i1p +6 i1q -i1q] -i1q{ +i1q ] +i1q { i1r -i1r$ -i1r-5 -i1ro70@c +i1r $ +i1r -5 +i1r o70 @c i1s -i1s*13 -i1so2lT6 +i1s *13 +i1s o2l T6 i1t -i1t$b -i1t-0 -i1to4e -i1tz2R5 +i1t $b +i1t -0 +i1t o4e +i1t z2 R5 i1u -i1u$ -i1uT4 -i1uZ3 -i1ul -i1uo3i -i1uOA1 +i1u $ +i1u T4 +i1u Z3 +i1u l +i1u o3i +i1u OA1 i1v -i1v*60 -i1v-4 -i1v^c +i2= *65 +i2= D3 O31 +i2= T4 ^@ +i2= ^k +i2> c i2? -i2?^^i6s -i2?{ +i2? ^^ i6s +i2? { i2@ -i2@'8 -i2@i2ac +i2@ '8 +i2@ i2a c i2A -i2AKi20 -i2A[{ -i2A^z +i2A K i20 +i2A [ { +i2A ^z i2B -i2Bu +i2B u i2C -i2CD0 -i2CZ3o5r -i2C^B -i2C{ +i2C D0 +i2C Z3 o5r +i2C ^B +i2C { i2D -i2D$4t -i2D*25c -i2D-4 +i2D $4 t +i2D *25 c +i2D -4 i2E -i2E*73 -i2El -i2F*37i3| -i2G$8O12 -i2GR6-5 +i2E *73 +i2E l +i2F *37 i3| +i2G $8 O12 +i2G R6 -5 i2H -i2Hu +i2H u i2I -i2J*35o8* +i2J *35 o8* i2L -i2L'5 -i2LC -i2LR7 -i2LZ2 +i2L '5 +i2L C +i2L R7 +i2L Z2 i2M -i2M$= +i2M $= i2N -i2N$jl +i2N $j l i2O -i2OZ2 -i2Ol -i2Or +i2O Z2 +i2O l +i2O r i2P -i2P*2A +i2P *2A i2R -i2Rc -i2Ri4YO36 +i2R c +i2R i4Y O36 i2S -i2S+1O51 -i2SZ2 -i2S[ +i2S +1 O51 +i2S Z2 +i2S [ i2T -i2T[ -i2Tl +i2T [ +i2T l i2U i2V -i2Vo5bl +i2V o5b l i2W -i2Xi0t$9 +i2X i0t $9 i2Y i2Z -i2Z^wk -i2Zo7l -i2Zu -i2[i2S -i2[l +i2Z ^w k +i2Z o7l +i2Z u +i2[ i2S +i2[ l i2\ -i2\^6k +i2\ ^6 k i2^ -i2^*51*86 +i2^ *51 *86 i2_ -i2_l +i2_ l i2` i2a -i2a*32 -i2a-4 -i2a-9 -i2aL6 -i2al -i2az3 +i2a *32 +i2a -4 +i2a -9 +i2a L6 +i2a l +i2a z3 i2b -i2bDA -i2bi2T -i2bO61 +i2b DA +i2b i2T +i2b O61 i2c -i2c*30 -i2cR4 -i2cO06ssD -i2cz1 +i2c *30 +i2c R4 +i2c O06 ssD +i2c z1 i2d -i2d'6 -i2d-1 -i2dR3 -i2dT4^2 -i2dz1 +i2d '6 +i2d -1 +i2d R3 +i2d T4 ^2 +i2d z1 i2e -i2e'7 -i2e-6 -i2e@y -i2eC -i2eT4 -i2eo7o -i2ez2 +i2e '7 +i2e -6 +i2e @y +i2e C +i2e T4 +i2e o7o +i2e z2 i2f -i2f$# -i2f$4 -i2fD5 -i2fo2i+4 -i2fsua +i2f $# +i2f $4 +i2f D5 +i2f o2i +4 +i2f sua i2g -i2g'B -i2gL1 -i2gr -i2gse +i2g 'B +i2g L1 +i2g r +i2g se i2h -i2h$3 -i2h*42 -i2h^# -i2hl -i2hz5 -i2h} +i2h $3 +i2h *42 +i2h ^# +i2h l +i2h z5 +i2h } i2i -i2i*68 -i2iL1 -i2iZ5*13 -i2io5v^z -i2isJp -i2iz4 -i2i{i5n +i2i *68 +i2i L1 +i2i Z5 *13 +i2i o5v ^z +i2i sJp +i2i z4 +i2i { i5n i2j -i2j$* -i2j*17z2 -i2j*23t -i2jK -i2jz2+0 +i2j $* +i2j *17 z2 +i2j *23 t +i2j K +i2j z2 +0 i2k -i2k'A -i2k+4 -i2k[ -i2ki0t -i2ki5n -i2kz4 -i2k} +i2k 'A +i2k +4 +i2k [ +i2k i0t +i2k i5n +i2k z4 +i2k } i2l -i2l'5 -i2l^)*38 -i2lu -i2lO61 +i2l '5 +i2l ^) *38 +i2l u +i2l O61 i2m -i2m'9 -i2mZ3 -i2md -i2mo3([ -i2mo76 -i2mO46o52 +i2m '9 +i2m Z3 +i2m d +i2m o3( [ +i2m o76 +i2m O46 o52 i2n -i2n[ -i2nk -i2nscf +i2n [ +i2n k +i2n scf i2o -i2oZ1 -i2oZ2 -i2oO01 -i2oO37 -i2oO45 -i2oz1 -i2oz3 -i2oz3D9 +i2o Z1 +i2o Z2 +i2o O01 +i2o O37 +i2o O45 +i2o z1 +i2o z3 +i2o z3 D9 i2p -i2p*53 -i2pD5 -i2p[ -i2pq +i2p *53 +i2p D5 +i2p [ +i2p q i2q -i2qR7i00 +i2q R7 i00 i2r -i2r$WZ1 -i2r*81O5B -i2rZ1 -i2rr -i2rt -i2rO01 -i2rz1 +i2r $W Z1 +i2r *81 O5B +i2r Z1 +i2r r +i2r t +i2r O01 +i2r z1 i2s -i2sZ1 -i2s] -i2ssr0 -i2sO02 -i2sO32 -i2sO54 +i2s Z1 +i2s ] +i2s sr0 +i2s O02 +i2s O32 +i2s O54 i2t -i2t'9 -i2t*05 -i2tiAXO59 -i2tscp -i2tz3*93 +i2t '9 +i2t *05 +i2t iAX O59 +i2t scp +i2t z3 *93 i2u -i2u$u -i2ul -i2usjc +i2u $u +i2u l +i2u sjc i2v -i2v*13 -i2v^\ -i2v^z} -i2vd -i2vu -i2vO01 -i2v} +i2v *13 +i2v ^\ +i2v ^z } +i2v d +i2v u +i2v O01 +i2v } i2w -i2w*03 -i2w+0^, -i2w@o -i2wT0 +i2w *03 +i2w +0 ^, +i2w @o +i2w T0 i2x -i2x^{ -i2xz4 +i2x ^{ +i2x z4 i2y -i2y*62 -i2yi3x -i2yl +i2y *62 +i2y i3x +i2y l i2z -i2zC -i2zL1 -i2zZ1 -i2zc -i2zO14o3U +i2z C +i2z L1 +i2z Z1 +i2z c +i2z O14 o3U i2| -i2|o2)+5 -i2}+3 -i2}+5z2 +i2| o2) +5 +i2} +3 +i2} +5 z2 i3 -i3 D0 -i3 T2 +i3 D0 +i3 T2 i3! -i3"R4 -i3"^u -i3"skr +i3" R4 +i3" ^u +i3" skr i3# -i3#k +i3# k i3$ -i3$o74 +i3$ o74 i3% -i3%'A -i3%C -i3%r -i3%O51 +i3% 'A +i3% C +i3% r +i3% O51 i3& -i3&[ +i3& [ i3' -i3'Z2 -i3'i6+ -i3't +i3' Z2 +i3' i6+ +i3' t i3( i3) -i3)*43 +i3) *43 i3* i3+ -i3+*42 -i3+r +i3+ *42 +i3+ r i3, -i3,{ +i3, { i3- -i3-[ -i3-r} -i3-snq -i3-u +i3- [ +i3- r } +i3- snq +i3- u i3. -i3.z2 +i3. z2 i3/ -i3/'8 -i3/*10r -i3/+4 -i3/o5H +i3/ '8 +i3/ *10 r +i3/ +4 +i3/ o5H i30 -i30z1 -i30z1*58 -i30z3l +i30 z1 +i30 z1 *58 +i30 z3 l i31 -i31T4 -i31^a -i31d -i31i42 -i31i42i53 -i31o0s -i31O91 +i31 T4 +i31 ^a +i31 d +i31 i42 +i31 i42 i53 +i31 o0s +i31 O91 i32 -i32*81 -i32T4 -i32Z1 -i32^' -i32O43 +i32 *81 +i32 T4 +i32 Z1 +i32 ^' +i32 O43 i33 -i33T4 -i33^7 -i33^H'4 -i33i40 -i33i44^2^1 -i33p1 -i33O67 +i33 T4 +i33 ^7 +^H '4 +i33 i40 +i33 i44 ^2 ^1 +i33 p1 +i33 O67 i34 -i34@t -i34T4 -i34[ +i34 @t +i34 T4 +i34 [ i35 -i35q +i35 q i36 -i36+2 +i36 +2 i37 -i37$v -i37T4 -i37O03 -i37z2O03 +i37 $v +i37 T4 +i37 O03 +i37 z2 O03 i38 -i38-4 -i38L0 -i38T4 +i38 -4 +i38 L0 +i38 T4 i39 -i39T4 -i39i59 -i39u^) -i39}^b +i39 T4 +i39 i59 +i39 u ^) +i39 } ^b i3: i3; -i3;$l -i3;'7 -i3;'8 +i3; $l +i3; '7 +i3; '8 i3< i3= -i3=CO42 -i3=O02 +i3= C O42 +i3= O02 i3> -i3>*20 -i3>ci2Z +i3> *20 +i3> c i2Z i3? -i3?+4Z1 -i3?o6+ -i3?t +i3? +4 Z1 +i3? o6+ +i3? t i3@ -i3@'8 -i3@*50 -i3@-0 -i3@t +i3@ '8 +i3@ *50 +i3@ -0 +i3@ t i3A -i3A$N -i3A'4 -i3A^W -i3BT6 -i3Bc -i3Bl +i3A $N +i3A '4 +i3A ^W +i3B T6 +i3B c +i3B l i3C -i3Cl -i3CuD2 -i3CO02T1 +i3C l +i3C u D2 +i3C O02 T1 i3D -i3DR5^3 -i3Dc -i3Dl] +i3D R5 ^3 +i3D c +i3D l ] i3E -i3Ei3' -i3Eu +i3E i3' +i3E u i3F -i3FZ2'5 +i3F Z2 '5 i3G -i3G-4 -i3G^] -i3G^hl +i3G -4 +i3G ^] +i3G ^h l i3H -i3Hi22 -i3Hl +i3H i22 +i3H l i3I -i3J*56{ -i3J-4^$ -i3KT0 -i3Klst1 -i3L$a*68 -i3LiA.O27 -i3Ll -i3Lr +i3J *56 { +i3J -4 ^$ +i3K T0 +i3K l st1 +i3L $a *68 +i3L iA. O27 +i3L l +i3L r i3M -i3Mo6,-0 -i3Mz3[ +i3M o6, -0 +i3M z3 [ i3N -i3O{ +i3O { i3P i3Q i3R -i3RR6i6m -i3Ri2? -i3Rt +i3R R6 i6m +i3R i2? +i3R t i3S -i3Si4& -i3Srl -i3TO43 +i3S i4& +i3S r l +i3T O43 i3U -i3UK +i3U K i3V i3W -i3W+0slV -i3W[ -i3Wl +i3W +0 slV +i3W [ +i3W l i3X i3Y -i3Y*30 -i3YD0 -i3Yi4_L0 -i3Yl -i3YO34 +i3Y *30 +i3Y D0 +i3Y i4_ L0 +i3Y l +i3Y O34 i3Z -i3Z^| +i3Z ^| i3[ -i3[*12 -i3[[ -i3[O12s73 +i3[ *12 +i3[ [ +i3[ O12 s73 i3\ -i3\'5 +i3\ '5 i3] -i3]*24oA: +i3] *24 oA: i3^ -i3^@s*04 -i3^O41 +i3^ @s *04 +i3^ O41 i3_ -i3_*46 -i3_+1 -i3_+5 -i3_@1 +i3_ *46 +i3_ +1 +i3_ +5 +i3_ @1 i3` i3a -i3a*35 -i3a-0R3 -i3aO02 +i3a *35 +i3a -0 R3 +i3a O02 i3b -i3bZ2 -i3bk -i3bu +i3b Z2 +i3b k +i3b u i3c -i3c$FO47 -i3c'6 -i3cT0 -i3cZ1 -i3ci1i -i3ci7U +i3c $F O47 +i3c '6 +i3c T0 +i3c Z1 +i3c i1i +i3c i7U i3d -i3d*63 -i3dL1 -i3do1r -i3dO43 +i3d *63 +i3d L1 +i3d o1r +i3d O43 i3e -i3e$3 -i3e$Z -i3e*53o2f -i3e*60 -i3eD5 -i3ei2s -i3eO43 +i3e $3 +i3e $Z +i3e *53 o2f +i3e *60 +i3e D5 +i3e i2s +i3e O43 i3f -i3f*50 -i3f-4 -i3f^!skT +i3f *50 +i3f -4 +i3f ^! skT i3g -i3g$x -i3g+7 -i3g-1 -i3gL6$t -i3gT6 -i3go98 -i3gO43 -i3g{ +i3g $x +i3g +7 +i3g -1 +i3g L6 $t +i3g T6 +i3g o98 +i3g O43 +i3g { i3h -i3h*03 -i3hZ1 -i3hZ3 -i3h[ -i3h^k -i3ht -i3hO12 -i3h} +i3h *03 +i3h Z1 +i3h Z3 +i3h [ +i3h ^k +i3h t +i3h O12 +i3h } i3i -i3i$x -i3i*12$y -i3iZ1 -i3i[ -i3ii0Y -i3ip1 -i3ir -i3iu -i3iz1 +i3i $x +i3i *12 $y +i3i Z1 +i3i [ +i3i i0Y +i3i p1 +i3i r +i3i u +i3i z1 i3j -i3jZ1 -i3jk -i3jl -i3jr[ +i3j Z1 +i3j k +i3j l +i3j r [ i3k -i3kz2$g +i3k z2 $g i3l -i3lL7 -i3lZ2 -i3l[ -i3l]$3 -i3l^z -i3lc -i3lO03 -i3lz1 +i3l L7 +i3l Z2 +i3l [ +i3l ] $3 +i3l ^z +i3l c +i3l O03 +i3l z1 i3m -i3m'9 -i3m*14 -i3m+2 -i3mD2o50 -i3mZ1 -i3ml -i3mt -i3mz5 +i3m '9 +i3m *14 +i3m +2 +i3m D2 o50 +i3m Z1 +i3m l +i3m t +i3m z5 i3n -i3nZ1 -i3n^T*51 -i3nc -i3nl -i3no4dD5 +i3n Z1 +i3n ^T *51 +i3n c +i3n l +i3n o4d D5 i3o -i3o$4 -i3o*20 -i3ou +i3o $4 +i3o *20 +i3o u i3p -i3p*03 -i3p^S -i3p^a -i3pz1 -i3p} +i3p *03 +i3p ^S +i3p ^a +i3p z1 +i3p } i3q -i3q-5 -i3q^#o1b -i3qi4d -i3qk -i3q{ +i3q -5 +i3q ^# o1b +i3q i4d +i3q k +i3q { i3r -i3r*59 -i3ri01 -i3ro6h -i3rsct -i3ru -i3rO41 +i3r *59 +i3r i01 +i3r o6h +i3r sct +i3r u +i3r O41 i3s -i3s*87 -i3s-1 -i3sZ2 -i3sk -i3sO35sDb -i3sO43 +i3s *87 +i3s -1 +i3s Z2 +i3s k +i3s O35 sDb +i3s O43 i3t -i3t*60 -i3t@c -i3tC -i3t[ -i3t^r -i3to0z+5 -i3to7n -i3tu +i3t *60 +i3t @c +i3t C +i3t [ +i3t ^r +i3t o0z +5 +i3t o7n +i3t u i3u -i3up1 -i3uq -i3ussV -i3uO63 +i3u p1 +i3u q +i3u ssV +i3u O63 i3v -i3vZ1 -i3vo2N +i3v Z1 +i3v o2N i3w -i3w*54 -i3wT1 -i3w^A -i3wc -i3wp1 +i3w *54 +i3w T1 +i3w ^A +i3w c +i3w p1 i3x -i3x@m -i3xZ4*02 -i3xd -i3xO46 +i3x @m +i3x Z4 *02 +i3x d +i3x O46 i3y -i3y*42 -i3yK -i3yO13o2D -i3yO51Z2 +i3y *42 +i3y K +i3y O13 o2D +i3y O51 Z2 i3z -i3z*56 -i3z*62 -i3zK -i3z^Z -i3zi5& -i3zr +i3z *56 +i3z *62 +i3z K +i3z ^Z +i3z i5& +i3z r i3{ -i3{*02 +i3{ *02 i3| -i3}i4j -i3}o7C +i3} i4j +i3} o7C i4 -i4 '6 -i4 *23 -i4 *37 -i4 +6 -i4 +7 -i4 -0 -i4 -6 -i4 D6 -i4 K} -i4 Z1 -i4 Z2 -i4 [ -i4 i7 -i4 r -i4 O12 -i4 { +i4 '6 +i4 *23 +i4 *37 +i4 +6 +i4 +7 +i4 -0 +i4 -6 +i4 D6 +i4 K } +i4 Z1 +i4 Z2 +i4 [ +i4 i7 +i4 r +i4 O12 +i4 { i4! -i4!{ -i4"*8AO45 +i4! { +i4" *8A O45 i4# -i4#$i*67 -i4#l +i4# $i *67 +i4# l i4$ -i4$+8 +i4$ +8 i4% -i4%+6 -i4%u +i4% +6 +i4% u i4& -i4&+7 -i4&Z2 -i4&^j -i4&l -i4&o7b -i4&s1J$o -i4&O03 +i4& +7 +i4& Z2 +i4& ^j +i4& l +i4& o7b +i4& s1J $o +i4& O03 i4' i4( -i4(^% +i4( ^% i4* i4+ -i4+'7 -i4+] +i4+ '7 +i4+ ] i4, -i4,[ -i4,s,k +i4, [ +i4, s,k i4- -i4-*30-8 -i4-^K -i4-o0e*13 -i4-O02 -i4-{^{ +i4- *30 -8 +i4- ^K +i4- o0e *13 +i4- O02 +i4- { ^{ i4. -i4.i5, -i4.t +i4. i5, +i4. t i4/ -i4/'A -i4/*37 -i4/[ -i4/t -i4/O12 +i4/ 'A +i4/ *37 +i4/ [ +i4/ t +i4/ O12 i40 -i40D6 -i40T5 -i40^k -i40z1 +i40 D6 +i40 T5 +i40 ^k +i40 z1 i41 -i41$2 -i41*04 -i41-7 -i41T5 -i41^-o7f -i41i2$ -i41i52 -i41i52i63 -i41r +i41 $2 +i41 *04 +i41 -7 +i41 T5 +i41 ^- o7f +i41 i2$ +i41 i52 +i41 i52 i63 +i41 r i42 -i42-7 -i42C -i42T5 -i42[ -i42^z -i42sky +i42 -7 +i42 C +i42 T5 +i42 [ +i42 ^z +i42 sky i43 -i43T5 -i43i54^2^1 -i43O57 -i43O73 -i43z1 +i43 T5 +i43 i54 ^2 ^1 +i43 O57 +i43 O73 +i43 z1 i44 -i44$h -i44*16 -i44L6*54 -i44T5 -i44sj\ -i44O15q +i44 $h +i44 *16 +i44 L6 *54 +i44 T5 +i44 sj\ +i44 O15 q i45 -i45T5 -i45o1x^3 -i45o58 -i45z2T2 +i45 T5 +i45 o1x ^3 +i45 o58 +i45 z2 T2 i46 -i46T5 -i46Z2 -i46i42 -i46i9c -i46s57t +i46 T5 +i46 Z2 +i46 i42 +i46 i9c +i46 s57 t i47 -i47*47 -i47*61z2 -i47D7 -i47T5 -i47o1g -i47t +i47 *47 +i47 *61 z2 +i47 D7 +i47 T5 +i47 o1g +i47 t i48 -i48L2 -i48^Lo6x -i48l -i48O68 -i48}$6 +i48 L2 +i48 ^L o6x +i48 l +i48 O68 +i48 } $6 i49 -i49T5 -i49d +i49 T5 +i49 d i4: -i4:c -i4:l +i4: c +i4: l i4; i4< i4= -i4=$5 -i4=*86 -i4=Z1 -i4=O15o0s +i4= $5 +i4= *86 +i4= Z1 +i4= O15 o0s i4> i4? -i4?*32O01 -i4?^% -i4?O2A +i4? *32 O01 +i4? ^% +i4? O2A i4@ -i4@-8 -i4@@7 -i4@[ -i4@o3n -i4@sL" +i4@ -8 +i4@ @7 +i4@ [ +i4@ o3n +i4@ sL" i4A -i4A$vt -i4At +i4A $v t +i4A t i4B -i4BD0 -i4Bt +i4B D0 +i4B t i4C -i4C*87'6 -i4Cz1 +i4C '6 +i4C z1 i4D i4E -i4E$1D6 -i4El +i4E $1 D6 +i4E l i4F i4G i4H -i4HcD3 +i4H c D3 i4I -i4J$a -i4JO02 +i4J $a +i4J O02 i4K -i4K$4 -i4K*63 +i4K $4 +i4K *63 i4L i4M -i4M$0 -i4M+0 -i4M^> +i4M $0 +i4M +0 +i4M ^> i4N -i4N*35 -i4No1A'9 -i4Nu -i4OD7 +i4N *35 +i4N o1A '9 +i4N u +i4O D7 i4P -i4P$3 -i4P*35L0 -i4Pc -i4Pl@v +i4P $3 +i4P *35 L0 +i4P c +i4P l @v i4Q i4R i4S -i4SO53 +i4S O53 i4T -i4U*29 +i4U *29 i4V i4W i4X -i4X^R+8 +i4X ^R +8 i4Y -i4Yu -i4Y{ +i4Y u +i4Y { i4[ -i4[-7 -i4[u} -i4[O04 -i4[O35 +i4[ -7 +i4[ u } +i4[ O04 +i4[ O35 i4\ -i4]*14 -i4]Z2 +i4] *14 +i4] Z2 i4^ -i4^i91O27 +i4^ i91 O27 i4_ -i4_'8 -i4_+5 -i4_Z1 -i4_O53 -i4_O54 -i4_O84 +i4_ '8 +i4_ +5 +i4_ Z1 +i4_ O53 +i4_ O54 +i4_ O84 i4` -i4`'AO32 -i4`[ +i4` 'A O32 +i4` [ i4a -i4a*36 -i4aD2 -i4a[ -i4au -i4aO52 +i4a *36 +i4a D2 +i4a [ +i4a u +i4a O52 i4b -i4b*45$x -i4bO04d -i4bO51 -i4bz1 +i4b *45 $x +i4b O04 d +i4b O51 +i4b z1 i4c -i4cc -i4cd -i4ck -i4cl +i4c c +i4c d +i4c k +i4c l i4d -i4d*04 -i4d^%o95 -i4dk -i4dz1 +i4d *04 +i4d ^% o95 +i4d k +i4d z1 i4e -i4e$a -i4e$r -i4e+3o5m -i4eZ3 -i4e^Dc -i4ei2W -i4ei52 -i4et -i4eO13 +i4e $a +i4e $r +i4e +3 o5m +i4e Z3 +i4e ^D c +i4e i2W +i4e i52 +i4e t +i4e O13 i4f -i4f$az3 -i4f$h -i4f'5 -i4f[ -i4fp1 +i4f $a z3 +i4f $h +i4f '5 +i4f [ +i4f p1 i4g -i4g$# -i4gl] -i4gr -i4g} +i4g $# +i4g l ] +i4g r +i4g } i4h -i4h*31 -i4h*45 -i4h+7 -i4h-0 -i4hD0 -i4ho2r -i4hsfK -i4h} +i4h *31 +i4h *45 +i4h +7 +i4h -0 +i4h D0 +i4h o2r +i4h sfK +i4h } i4i -i4i*64 -i4i+5 -i4i-8 -i4i-A -i4i[Z2 -i4i^>z3 -i4id +i4i *64 +i4i +5 +i4i -8 +i4i -A +i4i [ Z2 +i4i ^> z3 +i4i d i4j -i4j$!*80 -i4j*21 -i4j*57^[ -i4jK -i4jtT4 +i4j $! *80 +i4j *21 +i4j *57 ^[ +i4j K +i4j t T4 i4k -i4k$9 -i4k'6 -i4k'A -i4k*38Z1 -i4kD2 -i4kD5*36 -i4kZ1 -i4k[ -i4k^ -i4kO31z3 +i4k $9 +i4k '6 +i4k 'A +i4k *38 Z1 +i4k D2 +i4k D5 *36 +i4k Z1 +i4k [ +i4k ^ +i4k O31 z3 i4l -i4l'8 +i4l '8 i4m -i4m*90O29 -i4m-1 -i4m-3 -i4mi4V +i4m *90 O29 +i4m -1 +i4m -3 +i4m i4V i4n -i4n*58r -i4n*65 -i4nT0 -i4nZ3 -i4n^k -i4ni3go6n -i4nO91 +i4n *58 r +i4n *65 +i4n T0 +i4n Z3 +i4n ^k +i4n i3g o6n +i4n O91 i4o -i4o+8 -i4o-3 -i4o[ -i4ou -i4o} +i4o +8 +i4o -3 +i4o [ +i4o u +i4o } i4p -i4p$s -i4p*57 -i4p-1 -i4p{ +i4p $s +i4p *57 +i4p -1 +i4p { i4q -i4q*47 -i4qo5u -i4qr +i4q *47 +i4q o5u +i4q r i4r -i4rD6 -i4rR1 -i4r[ -i4ri0> -i4ro5f -i4ru -i4rO91 +i4r D6 +i4r R1 +i4r [ +i4r i0> +i4r o5f +i4r u +i4r O91 i4s -i4s-0 -i4s@b -i4s@h -i4sR6Z2 -i4s^: +i4s -0 +i4s @b +i4s @h +i4s R6 Z2 +i4s ^: i4t -i4t$g -i4t*04 -i4t+2 -i4t+6 -i4tD0 -i4td -i4t{*63 +i4t $g +i4t *04 +i4t +2 +i4t +6 +i4t D0 +i4t d +i4t { *63 i4u -i4u+0o0r -i4u+2 -i4uZ2 +i4u o0r +i4u +2 +i4u Z2 i4v -i4viAo -i4vs59o44 -i4vsk3 +i4v iAo +i4v s59 o44 +i4v sk3 i4w -i4w'9 -i4w-9 -i4w] -i4w]$y -i4wc^r -i4wl +i4w '9 +i4w -9 +i4w ] +i4w ] $y +i4w c ^r +i4w l i4x -i4x^+ -i4x} +i4x ^+ +i4x } i4y -i4y+3 -i4y^& -i4yc -i4yi3g+1 -i4yi6k+7 -i4yr -i4yO52 -i4yO64 +i4y +3 +i4y ^& +i4y c +i4y i3g +1 +i4y i6k +7 +i4y r +i4y O52 +i4y O64 i4z -i4z*64 +i4z *64 i4{ i4| -i4|-8 -i4}^%O35 -i4}i6u +i4| -8 +i4} ^% O35 +i4} i6u i5 -i5 $6 -i5 'A -i5 +6 -i5 -6 -i5 ^d -i5 i69 -i5 s5>O04 -i5 t -i5 {K +i5 $6 +i5 'A +i5 +6 +i5 -6 +i5 ^d +i5 i69 +i5 s5> O04 +i5 t +i5 { K i5! -i5!O32 +i5! O32 i5" -i5"*53 -i5"Z2*16 -i5"i5] +i5" *53 +i5" Z2 *16 +i5" i5] i5# -i5#$` -i5#l -i5#O13 +i5# $` +i5# l +i5# O13 i5$ -i5$@0 -i5$k -i5$lz3 -i5$r +i5$ @0 +i5$ k +i5$ l z3 +i5$ r i5% -i5%o61 +i5% o61 i5& i5' i5( i5) i5* -i5*$* -i5**04 -i5**73*76 +i5* $* +i5* *04 +i5* *73 *76 i5+ -i5+*34 -i5+l +i5+ *34 +i5+ l i5, -i5,o0/ +i5, o0/ i5- -i5-$3 -i5-'A -i5-*13L6 -i5--6 -i5-D0 -i5-D2 -i5-i2: +i5- $3 +i5- 'A +i5- *13 L6 +i5- -6 +i5- D0 +i5- D2 +i5- i2: i5. -i5.O03 +i5. O03 i5/ -i5/T6 +i5/ T6 i50 -i50$9 -i50$s -i50i4c -i50l +i50 $9 +i50 $s +i50 i4c +i50 l i51 -i51$8 -i51T6 -i51i62 -i51i62i73 -i51k -i51o4b +i51 $8 +i51 T6 +i51 i62 +i51 i62 i73 +i51 k +i51 o4b i52 -i52$A -i52$d -i52*16} -i52*30i3* -i52-2 -i52R2 -i52T6 -i52[ -i52k -i52O76 +i52 $A +i52 $d +i52 *16 } +i52 *30 i3* +i52 -2 +i52 R2 +i52 T6 +i52 [ +i52 k +i52 O76 i53 -i53*68 -i53*81 -i53T6 -i53i3f -i53i64^2^1 +i53 *68 +i53 *81 +i53 T6 +i53 i3f +i53 i64 ^2 ^1 i54 -i54'A -i54*31 -i54-6 -i54-8 -i54D1 -i54D8@s -i54T6 -i54l +i54 'A +i54 *31 +i54 -6 +i54 -8 +i54 D1 +i54 D8 @s +i54 T6 +i54 l i55 -i55*47 -i55+9 -i55@4 -i55T6 -i55r -i55u +i55 *47 +i55 +9 +i55 @4 +i55 T6 +i55 r +i55 u i56 -i56+6 -i56^_ -i56i55 -i56l +i56 +6 +i56 ^_ +i56 i55 +i56 l i57 -i57*60^\ -i57D8 -i57T6 -i57Z2 -i57k -i57o2C$7 +i57 *60 ^\ +i57 D8 +i57 T6 +i57 Z2 +i57 k +i57 o2C $7 i58 -i58T6 -i58[ -i58o1* -i58u -i58O23 -i58O71 +i58 T6 +i58 [ +i58 o1* +i58 u +i58 O23 +i58 O71 i59 -i59'8 -i59*02 -i59*54 -i59T6 -i59Z2 -i59l -i59O02 -i59O07^" +i59 '8 +i59 *02 +i59 *54 +i59 T6 +i59 Z2 +i59 l +i59 O02 +i59 O07 ^" i5: i5; -i5;^go87 +i5; ^g o87 i5< -i5^k -i5>O81O24 +i5> ^k +i5> O81 O24 i5? -i5?i2% +i5? i2% i5@ -i5@*02^I +i5@ *02 ^I i5A -i5A*16 -i5AtD1 -i5AO04 -i5AO32 +i5A *16 +i5A t D1 +i5A O04 +i5A O32 i5D -i5Dl +i5D l i5E -i5Eo1r +i5E o1r i5F i5G i5H i5I -i5Iu +i5I u i5J -i5Jc +i5J c i5K -i5KZ2 -i5Kt -i5KO64 +i5K Z2 +i5K t +i5K O64 i5L -i5Ll +i5L l i5M -i5M*02i6r -i5MT4 -i5Mri2i +i5M *02 i6r +i5M T4 +i5M r i2i i5N -i5N*30 -i5Nl +i5N *30 +i5N l i5O -i5O'8 +i5O '8 i5P -i5Pt +i5P t i5Q i5R -i5Ru -i5S*67 -i5Sl +i5R u +i5S *67 +i5S l i5T -i5T*85 -i5TD1 +i5T *85 +i5T D1 i5U -i5UO14[ -i5VR7 -i5Vi22 +i5U O14 [ +i5V R7 +i5V i22 i5W i5X i5Y -i5Y@aO24 +i5Y @a O24 i5Z -i5Z[ +i5Z [ i5[ -i5\o4I +i5\ o4I i5] i5^ -i5^-2 -i5^[ -i5^l +i5^ -2 +i5^ [ +i5^ l i5_ -i5_*97 -i5_[ -i5_] -i5_^u -i5_u -i5_O64 -i5_OB3'9 +i5_ *97 +i5_ [ +i5_ ] +i5_ ^u +i5_ u +i5_ O64 +i5_ '9 i5` -i5`{ +i5` { i5a -i5a'6 -i5a*04 -i5a*56 -i5ai24O76 -i5ai27 -i5ai6n -i5az1*36 +i5a '6 +i5a *04 +i5a *56 +i5a i24 O76 +i5a i27 +i5a i6n +i5a z1 *36 i5b i5c -i5c'7 -i5c*24 -i5cd -i5cs62 -i5c{ +i5c '7 +i5c *24 +i5c d +i5c s62 +i5c { i5d -i5d*05 -i5d[ -i5d^\ +i5d *05 +i5d [ +i5d ^\ i5e -i5e+0 -i5e-4i4c -i5eZ1 -i5ei8i -i5el -i5er -i5eO23 +i5e +0 +i5e -4 i4c +i5e Z1 +i5e i8i +i5e l +i5e r +i5e O23 i5f -i5f*03 -i5f-4 -i5fD1 -i5fr -i5fO13 +i5f *03 +i5f -4 +i5f D1 +i5f r +i5f O13 i5g -i5g@1 -i5gD6 -i5gT1 -i5gi8kO65 -i5go4a -i5gO01 -i5gz1i2{ -i5g{ +i5g @1 +i5g D6 +i5g T1 +i5g i8k O65 +i5g o4a +i5g O01 +i5g z1 i2{ +i5g { i5h -i5h*76 -i5h-8 -i5hT0 -i5hZ2O6A -i5h[ -i5hz2 +i5h *76 +i5h -8 +i5h T0 +i5h Z2 O6A +i5h [ +i5h z2 i5i -i5i$q -i5i+7 -i5i@s -i5iT0 -i5ii18^8 -i5io2Mi1S -i5i{ +i5i $q +i5i +7 +i5i @s +i5i T0 +i5i i18 ^8 +i5i o2M i1S +i5i { i5j -i5ju -i5jO13 -i5jO45 +i5j u +i5j O13 +i5j O45 i5k -i5k$2 -i5k@2 -i5ko6e +i5k $2 +i5k @2 +i5k o6e i5l -i5l-6 -i5li6A +i5l -6 +i5l i6A i5m -i5m*53 -i5m-0 -i5mZ1 -i5mO62 -i5mz1 +i5m *53 +i5m -0 +i5m Z1 +i5m O62 +i5m z1 i5n -i5n*76 -i5n+3 -i5nZ1 -i5n] -i5n^) -i5nO37z2 +i5n *76 +i5n +3 +i5n Z1 +i5n ] +i5n ^) +i5n O37 z2 i5o -i5oL4 -i5oZ2 -i5oi5E*74 -i5oO23 +i5o L4 +i5o Z2 +i5o i5E *74 +i5o O23 i5p -i5p^x -i5pk -i5pO05 -i5pO12 +i5p ^x +i5p k +i5p O05 +i5p O12 i5q -i5q'4-3 -i5q{ +'4 -3 +i5q { i5r -i5rD2 -i5ri3= -i5ri5? -i5rs9SO51 -i5rO23l +i5r D2 +i5r i3= +i5r i5? +i5r s9S O51 +i5r O23 l i5s -i5s*10 -i5s-4 -i5s^T -i5sO03 +i5s *10 +i5s -4 +i5s ^T +i5s O03 i5t -i5t[Z1 -i5tc +i5t [ Z1 +i5t c i5u -i5u$0 -i5u*57 -i5u*68 +i5u $0 +i5u *57 +i5u *68 i5v -i5vi1^ +i5v i1^ i5w -i5w*57 -i5w[ -i5wO72 +i5w *57 +i5w [ +i5w O72 i5x -i5x+2 -i5x@1 -i5xD3 -i5xl -i5xO32 +i5x +2 +i5x @1 +i5x D3 +i5x l +i5x O32 i5y -i5yi0r -i5yr +i5y i0r +i5y r i5z -i5zl -i5zO14 -i5zz1 -i5{+7 +i5z l +i5z O14 +i5z z1 +i5{ +7 i6 -i6 +8 -i6 T0 -i6 c +i6 +8 +i6 T0 +i6 c i6! -i6!CK +i6! C K i6" -i6"$j-8 +i6" $j -8 i6# i6$ i6% -i6%c -i6%O71 +i6% c +i6% O71 i6& i6' i6( i6* -i6*OB1 -i6*} +i6* OB1 +i6* } i6+ -i6+*56o62 -i6+O18O31 +i6+ *56 o62 +i6+ O18 O31 i6, -i6,O02 +i6, O02 i6- -i6-*78 -i6-Z1 -i6-i1" -i6-o3- +i6- *78 +i6- Z1 +i6- i1" +i6- o3- i6. -i6.O12 +i6. O12 i6/ i60 -i60*34 -i60*36 -i60*62 -i60Z1 -i60i2" -i60O05 -i60O13 -i60z1 +i60 *34 +i60 *36 +i60 *62 +i60 Z1 +i60 i2" +i60 O05 +i60 O13 +i60 z1 i61 -i61L3 -i61R1 -i61R4 -i61i3o -i61l +i61 L3 +i61 R1 +i61 R4 +i61 i3o +i61 l i62 -i62*27i2] -i62Z2 -i62[ -i62s2% +i62 *27 i2] +i62 Z2 +i62 [ +i62 s2% i63 -i63T1-4 -i63Z1 -i63t +i63 T1 -4 +i63 Z1 +i63 t i64 -i64R5 -i64] -i64} +i64 R5 +i64 ] +i64 } i65 -i65$6 -i65'9 -i65*06 -i65*52 -i65-8 -i65R5 -i65Z3 -i65o87 +i65 $6 +i65 '9 +i65 *06 +i65 *52 +i65 -8 +i65 R5 +i65 Z3 +i65 o87 i66 -i66'7 -i66+2l -i66o2RsH3 -i66O75 +i66 '7 +i66 +2 l +i66 o2R sH3 +i66 O75 i67 -i67*13 -i67*53 -i67Z1 -i67[ -i67O42 -i67O45 +i67 *13 +i67 *53 +i67 Z1 +i67 [ +i67 O42 +i67 O45 i68 -i68*68 -i68D8 -i68D8*54 -i68Z2 +i68 *68 +i68 D8 +i68 D8 *54 +i68 Z2 i69 -i69$r -i69$x -i69+7 -i69R5 -i69O32 -i69{ +i69 $r +i69 $x +i69 +7 +i69 R5 +i69 O32 +i69 { i6: -i6:*57 +i6: *57 i6; i6< i6= -i6=c +i6= c i6> -i6>o8. +i6> o8. i6? -i6?T7 +i6? T7 i6@ -i6@O02 +i6@ O02 i6A -i6AT0 -i6Au -i6Bi8PO72 +i6A T0 +i6A u +i6B i8P O72 i6D -i6D-5 -i6D^W -i6Dci0U -i6Do9. +i6D -5 +i6D ^W +i6D c i0U +i6D o9. i6E -i6E*64$k -i6ET4i1$ -i6FO02 +i6E *64 $k +i6E T4 i1$ +i6F O02 i6G i6H i6I -i6IO29$w +i6I O29 $w i6J i6K -i6KO13 +i6K O13 i6L -i6LuD1 +i6L u D1 i6M i6N -i6N$zO26 -i6Ni2b -i6Nri7r +i6N $z O26 +i6N i2b +i6N r i7r i6O i6P i6Q i6R i6S -i6S$$t -i6SO62T1 +i6S $$ t +i6S O62 T1 i6T i6U -i6U$isU -i6U*71 -i6UO16O35 -i6Vl +i6U $i sU +i6U *71 +i6U O16 O35 +i6V l i6X -i6Xt -i6Yt -i6ZL7 -i6Zo7= -i6Zu +i6X t +i6Y t +i6Z L7 +i6Z o7= +i6Z u i6[ -i6[*52o4s -i6[-2'5 -i6[O24 +i6[ *52 o4s +-2 '5 +i6[ O24 i6\ i6^ -i6^o7X +i6^ o7X i6_ -i6_+7 -i6_-7 -i6_D2 +i6_ +7 +i6_ -7 +i6_ D2 i6` -i6`*01 +i6` *01 i6a -i6a*85 -i6a+5 -i6al -i6aO02 -i6aO05 -i6az1 -i6az2^i +i6a *85 +i6a +5 +i6a l +i6a O02 +i6a O05 +i6a z1 +i6a z2 ^i i6b -i6b$oi3m -i6bO71 +i6b $o i3m +i6b O71 i6c -i6c*35 -i6cc +i6c *35 +i6c c i6d -i6d*60 -i6d-5 -i6dlO81 -i6do2c -i6d{ +i6d *60 +i6d -5 +i6d l O81 +i6d o2c +i6d { i6e -i6e[ -i6e] -i6el -i6eO94 +i6e [ +i6e ] +i6e l +i6e O94 i6f -i6f*64 -i6f*76 -i6fl +i6f *64 +i6f *76 +i6f l i6g -i6gD4 -i6g^K -i6gu -i6g} +i6g D4 +i6g ^K +i6g u +i6g } i6h -i6h'A -i6h+4 -i6hZ1 -i6hr -i6hO82 -i6hz2 +i6h 'A +i6h +4 +i6h Z1 +i6h r +i6h O82 +i6h z2 i6i -i6i$6 -i6i-3[ -i6il -i6is5c -i6isvt +i6i $6 +i6i -3 [ +i6i l +i6i s5c +i6i svt i6j -i6jo81 +i6j o81 i6k -i6k+7 -i6kD3 -i6kD4 -i6kT0 -i6k^* -i6klz1 +i6k +7 +i6k D3 +i6k D4 +i6k T0 +i6k ^* +i6k l z1 i6l -i6l*83 -i6li0Z -i6lo5] +i6l *83 +i6l i0Z +i6l o5] i6m -i6mZ1 -i6mO06 -i6mO76 +i6m Z1 +i6m O06 +i6m O76 i6n -i6nc -i6nl -i6no7j +i6n c +i6n l +i6n o7j i6o -i6oo1p -i6oO32 -i6oO91 +i6o o1p +i6o O32 +i6o O91 i6p -i6p-7 -i6p] -i6po74 -i6ps1! +i6p -7 +i6p ] +i6p o74 +i6p s1! i6q -i6qri6I -i6qO39T3 +i6q r i6I +i6q O39 T3 i6r -i6r$r -i6r-5 -i6rZ1 -i6rk +i6r $r +i6r -5 +i6r Z1 +i6r k i6s -i6s'8c -i6s'A -i6si4? -i6sO21 +i6s '8 c +i6s 'A +i6s i4? +i6s O21 i6t -i6tO36^d +i6t O36 ^d i6u -i6u*64 -i6u+5 -i6uD4 -i6ut -i6u}} +i6u *64 +i6u +5 +i6u D4 +i6u t +i6u } } i6v i6w -i6w$y -i6w[ +i6w $y +i6w [ i6x i6y -i6y-2 -i6y-8 -i6yC +i6y -2 +i6y -8 +i6y C i6z -i6zD4 -i6zc -i6zco5> -i6zi0s -i6zo5s -i6zO73 +i6z D4 +i6z c +i6z c o5> +i6z i0s +i6z o5s +i6z O73 i6| -i6}$rO49 -i6}O53i2K +i6} $r O49 +i6} O53 i2K i7 -i7 [ +i7 [ i7! i7" i7# i7$ i7% -i7%D3 +i7% D3 i7& i7' -i7'@1O09 +i7' @1 O09 i7* i7+ -i7,O25 +i7, O25 i7- -i7-u -i7-O43 +i7- u +i7- O43 i7. -i7.[ +i7. [ i7/ -i7/srX +i7/ srX i70 -i70T8 -i70t +i70 T8 +i70 t i71 -i71+8 -i71[ -i71O25 +i71 +8 +i71 [ +i71 O25 i72 -i72+6 -i72O45z3 +i72 +6 +i72 O45 z3 i73 -i73*79 -i73[[ -i73i49 -i73u[ +i73 *79 +i73 [ [ +i73 i49 +i73 u [ i74 -i74o3[ +i74 o3[ i75 -i75$4 -i75Z1 -i75l+1 -i75O43 -i75O91 +i75 $4 +i75 Z1 +i75 l +1 +i75 O43 +i75 O91 i76 -i76+9 -i76D5 -i76R8 +i76 +9 +i76 D5 +i76 R8 i77 -i77$3 +i77 $3 i78 i79 -i79O93 +i79 O93 i7; i7< -i7O56 +i7> O56 i7@ i7A -i7AO02 -i7AO15 -i7AO23 +i7A O02 +i7A O15 +i7A O23 i7C i7D -i7F'8T3 +i7F '8 T3 i7G -i7HO17^M +i7H O17 ^M i7K -i7Lc +i7L c i7M -i7M*37 -i7Ml -i7NZ1+1 -i7Nc +i7M *37 +i7M l +i7N Z1 +1 +i7N c i7P -i7Pc -i7QO14 +i7P c +i7Q O14 i7R i7S -i7SZ1 -i7Uu -i7V-6 +i7S Z1 +i7U u +i7V -6 i7X -i7Xt +i7X t i7Z i7[ i7\ i7_ -i7_D2 +i7_ D2 i7a -i7aL6 -i7aZ2 -i7aO01 -i7aO21 -i7a{ +i7a L6 +i7a Z2 +i7a O01 +i7a O21 +i7a { i7b i7c -i7c+1o46 -i7cc +i7c +1 o46 +i7c c i7d -i7d'6@2 -i7dO91 +'6 @2 +i7d O91 i7e -i7e-8 -i7eR9 -i7es17 +i7e -8 +i7e R9 +i7e s17 i7f -i7f[ -i7fc +i7f [ +i7f c i7g -i7gc -i7gi90 +i7g c +i7g i90 i7h -i7h$2 -i7h-9 -i7hi7{ -i7hl -i7hO25 +i7h $2 +i7h -9 +i7h i7{ +i7h l +i7h O25 i7i -i7i+3 -i7idO28 -i7iO34 +i7i +3 +i7i d O28 +i7i O34 i7j -i7jR9 -i7jl -i7jsjeu +i7j R9 +i7j l +i7j sje u i7k -i7k+8 -i7ki7u +i7k +8 +i7k i7u i7l -i7l'8 -i7lD2 -i7l^7 +i7l '8 +i7l D2 +i7l ^7 i7m -i7m+8 -i7mL8 -i7mO25 +i7m +8 +i7m L8 +i7m O25 i7n -i7n[ +i7n [ i7o -i7o*35 -i7oo0d +i7o *35 +i7o o0d i7p -i7p*70 -i7p[ -i7pO52 +i7p *70 +i7p [ +i7p O52 i7q -i7qt +i7q t i7r i7s -i7sR8 -i7sT0 -i7s^j -i7sl -i7sz1 +i7s R8 +i7s T0 +i7s ^j +i7s l +i7s z1 i7t -i7t$3 +i7t $3 i7u -i7u-8 -i7uO84 +i7u -8 +i7u O84 i7v -i7vo9n +i7v o9n i7w -i7wl -i7wO01 -i7wO34 -i7wO49 +i7w l +i7w O01 +i7w O34 +i7w O49 i7x -i7x+4*67 +i7x +4 *67 i7y -i7yi3d -i7yi5_^{ +i7y i3d +i7y i5_ ^{ i7z -i7z} -i7|^m +i7z } +i7| ^m i8 -i8 -9 -i8 Z1 -i8 O16 +i8 -9 +i8 Z1 +i8 O16 i8! i8# -i8#u +i8# u i8$ i8% -i8%$@O38 +i8% $@ O38 i8& -i8&D4*87 -i8&Z4O78 +i8& D4 *87 +i8& Z4 O78 i8' -i8)-9 +i8) -9 i8* -i8*s61 +i8* s61 i8+ -i8+i7I +i8+ i7I i8, i8- -i8-T0 -i8-p1'9 +i8- T0 +i8- p1 '9 i8. i8/ i80 -i80$4 -i80[ -i80[z1 -i80k -i80o6. -i80r +i80 $4 +i80 [ +i80 [ z1 +i80 k +i80 o6. +i80 r i81 -i81C'A +i81 C 'A i82 i83 -i83-7 +i83 -7 i84 -i84+7 -i84+A -i84^1O83 +i84 +7 +i84 +A +i84 ^1 O83 i85 -i85O23 -i85O53 +i85 O23 +i85 O53 i86 -i86o9,[ +i86 o9, [ i87 -i87O61 +i87 O61 i88 i89 -i89-9 -i89[ +i89 -9 +i89 [ i8; -i8;*37 +i8; *37 i8< i8= -i8=O53 +i8= O53 i8> -i8>z1 +i8> z1 i8? i8@ -i8@O16 -i8Cl +i8@ O16 +i8C l i8D -i8Dc -i8DiA-*86 +i8D c +i8D iA- *86 i8E i8F -i8Il -i8JD6 -i8MZ4O67 -i8MO53 +i8I l +i8J D6 +i8M Z4 O67 +i8M O53 i8P -i8QO57$t -i8Rl +i8Q O57 $t +i8R l i8U -i8UD4 +i8U D4 i8V -i8WD1O27 +i8W D1 O27 i8X -i8Zc +i8Z c i8[ i8_ -i8_Z1 -i8_l +i8_ Z1 +i8_ l i8a -i8a*18 -i8aD6 -i8aso3O71 -i8aO53 +i8a *18 +i8a D6 +i8a so3 O71 +i8a O53 i8c -i8c+1 +i8c +1 i8d i8e -i8e*45R8 +i8e *45 R8 i8f -i8fO05O21 +i8f O05 O21 i8g -i8gO05 +i8g O05 i8h -i8hD5 +i8h D5 i8i -i8iD6 +i8i D6 i8j i8k -i8k$1 -i8kD6 +i8k $1 +i8k D6 i8l -i8lO07 +i8l O07 i8m -i8mD0 +i8m D0 i8n -i8nO08O43 +i8n O08 O43 i8o -i8ol +i8o l i8p -i8po0/s9W +i8p o0/ s9W i8r i8s -i8s'9 -i8s+7 -i8so1o +i8s '9 +i8s +7 +i8s o1o i8t -i8t$0 -i8tc +i8t $0 +i8t c i8u -i8ul -i8vc -i8v{ +i8u l +i8v c +i8v { i8w i8x -i8x'9 -i8x*14O04 -i8xD9*32 +i8x '9 +i8x *14 O04 +i8x D9 *32 i8y -i8yc +i8y c i8z -i8z'9 -i8zr -i8zO05 -i8zO52 +i8z '9 +i8z r +i8z O05 +i8z O52 i9 i9# -i9'Z2O65 +i9' Z2 O65 i9, i9- i90 -i90c +i90 c i91 -i91T7R8 -i91l +i91 T7 R8 +i91 l i92 i93 -i93TB -i93O34 +i93 TB +i93 O34 i94 -i94[C -i94O42 +i94 [ C +i94 O42 i95 -i95i4|O0A -i95O71 -i96i7sO37 +i95 i4| O0A +i95 O71 +i96 i7s O37 i97 -i97$5 +i97 $5 i98 -i98s18 -i98O61 +i98 s18 +i98 O61 i99 -i99Z1[ -i99O01 -i99O43 +i99 Z1 [ +i99 O01 +i99 O43 i9; -i9=i0-O1A +i9= i0- O1A i9A -i9B$dO92 -i9Bll -i9Ec -i9FR9'A -i9Rl -i9Sl -i9Tl +i9B $d O92 +i9B l +i9E c +i9F R9 'A +i9R l +i9S l +i9T l i9_ i9a -i9aO61 -i9aOA4 +i9a O61 +i9a OA4 i9c -i9c*04 -i9cl +i9c *04 +i9c l i9d -i9dT0 +i9d T0 i9e -i9eO54 +i9e O54 i9f i9g i9h -i9hD6 +i9h D6 i9i -i9i'A +i9i 'A i9j -i9jOA3 +i9j OA3 i9k i9l -i9lD7 +i9l D7 i9m i9n i9o i9p -i9po6a'B +i9p o6a 'B i9q i9r -i9r-A -i9riAu +i9r -A +i9r iAu i9s -i9s'B -i9sO02 +i9s 'B +i9s O02 i9t i9u -i9u*13i9+ -i9wO35 +i9u *13 i9+ +i9w O35 i9x -i9x-A +i9x -A i9y iA -iA!O56 -iA&O47c -iA,O67 +iA! O56 +iA& O47 c +iA, O67 iA- -iA--B +iA- -B iA. -iA.O67O91 -iA/OA3 -iA/z2O37 +iA. O67 O91 +iA/ OA3 +iA/ z2 O37 iA0 iA1 iA2 iA3 iA4 -iA4+B +iA4 +B iA5 iA7 -iA7o95 +iA7 o95 iA8 iA9 iA: -iAE$rO57 -iAG$8OA3 -iA\*B1 +iAE $r O57 +iAG $8 OA3 +iA\ *B1 iA_ -iA_o4AO46 -iAcO78 +iA_ o4A O46 +iAc O78 iAe -iAel -iAeO72 +iAe l +iAe O72 iAg iAh iAi iAj -iAkO82 -iAnO64 +iAk O82 +iAn O64 iAo iAr iAs -iAsO28 +iAs O28 iAt -iAt$v'B +iAt $v 'B iAu iAx -iAxZ3O18 +iAx Z3 O18 iAy iAz -iAzO82 -iA}O86T8 -iB1O37 -iB2@9 -iB4O38 +iAz O82 +iA} O86 T8 +iB1 O37 +iB2 @9 +iB4 O38 iB5 iB9 iB_ iBa -iBaO74 +iBa O74 iBd iBe iBi -iBiR2O25 -iBiO16 -iBiO65 -iBrO46 +iBi R2 O25 +iBi O16 +iBi O65 +iBr O46 iBs -iBuO05 -iBxO65 -iBysi`O17 +iBu O05 +iBx O65 +iBy si` O17 k -k$! -k$) -k$1 -k$1i5t -k$8 -k$: -k$C -k$G -k$P -k$_ -k$b -k$c -k$d -k$e -k$h -k$hi4X -k$i -k$k -k$o -k$oZ1 -k$p -k$q -k$t -k$u -k$v -k$|Z2 -k'6 -k'6l -k'7 -k'9 -k*04l -k*04z3 -k*07 -k*13 -k*16 -k*17 -k*20 -k*34-1 -k*46 -k*51 -k*54 -k*54$9 -k*54R3 -k*57z2 -k*63 -k*B0 -k*B7 -k+0 -k+1f -k+2 -k+3 -k+4 -k+5 -k+5i2e -k-0 -k-5*13 -k-7[ -kD0o5r -kD2 -kD4 -kK*15 -kK^M -kK^P -kL2 -kR0i4y -kR1^= -kR1O41 -kR2 -kR3 -kR4 -kT5 -kZ1 -kZ1^4 -kZ1t -kZ2 -kZ2+2 -kZ3 -kZ3+A -k[r -k[sy6 -k[z3 -k^"$V -k^1$u -k^2 -k^5 -k^8 -k^A -k^G -k^H -k^J -k^K -k^T -k^X -k^Z -k^h -k^j -k^k -k^m -k^n -k^rt -k^s -k^t -k^u -k^w -k^z -kc -kd -kf -kfT4 -ki0C -ki0b -ki0r -ki1- -ki12 -ki13[ -ki16 -ki17 -ki1UZ2 -ki1Y -ki1e -ki1h -ki1m -ki1o -ki1s -ki2v -ki2z -ki3@*74 -ki3Q*62 -ki3f -ki3h -ki4' -ki40 -ki4v -ki4z -ki5\ -ki5^ -ki5i -ko0! -ko0: -ko0E -ko0c -ko0el -ko0k -ko0p] -ko0u -ko0z -ko1- -ko10 -ko16 -ko1a -ko1f -ko21 -ko29 -ko2O -ko2d -ko2g -ko2l -ko3- -ko31 -ko3_ -ko3h -ko3lf -ko4 -ko4k -ko4o^E -ko5g -ko65 -ko6f -ko6g -ko7m -ko85 -ko91 -ko92 -koA7 -kp1*13 -kp2O62 -kq -kqi15 -kr -kr$| -krR1 -krZ2 -ks2c -ks3H -ks52 -ks5b -ks8k -ksaj -ksbd -ksd3 -ksej -ksfpO71 -ksgd -ksir-2 -ksjt -ksmO -ksnb -ksrJ -kssL -kssy -ksuz -ksy$ -kt-3 -kuo9y -kO07 -kO07^1 -kO08sd; -kO13 -kO18 -kO23 -kO51 -kO62 -kz1 -kz1T0 -kz1l -kz1O51 -kz2 -kz2^7 -kz3 -kz3C -kz4 -kz4*97 -kz5D9 -kz5i9s -kz5O06 -k{ -k{$v -k{*48 -k{C -k{O51 -k}q -k}r -k}s9" +k $! +k $) +k $1 +k $1 i5t +k $8 +k $: +k $C +k $G +k $P +k $_ +k $b +k $c +k $d +k $e +k $h +k $h i4X +k $i +k $k +k $o +k $o Z1 +k $p +k $q +k $t +k $u +k $v +k $| Z2 +k '6 +k '6 l +k '7 +k '9 +k *04 l +k *04 z3 +k *07 +k *13 +k *16 +k *17 +k *20 +k *34 -1 +k *46 +k *51 +k *54 +k *54 $9 +k *54 R3 +k *57 z2 +k *63 +k *B0 +k *B7 +k +0 +k +1 f +k +2 +k +3 +k +4 +k +5 +k +5 i2e +k -0 +k -5 *13 +k -7 [ +k D0 o5r +k D2 +k D4 +k K *15 +k K ^M +k K ^P +k L2 +k R0 i4y +k R1 ^= +k R1 O41 +k R2 +k R3 +k R4 +k T5 +k Z1 +k Z1 ^4 +k Z1 t +k Z2 +k Z2 +2 +k Z3 +k Z3 +A +k [ r +k [ sy6 +k [ z3 +k ^" $V +k ^1 $u +k ^2 +k ^5 +k ^8 +k ^A +k ^G +k ^H +k ^J +k ^K +k ^T +k ^X +k ^Z +k ^h +k ^j +k ^k +k ^m +k ^n +k ^r t +k ^s +k ^t +k ^u +k ^w +k ^z +k c +k d +k f +k f T4 +k i0C +k i0b +k i0r +k i1- +k i12 +k i13 [ +k i16 +k i17 +k i1U Z2 +k i1Y +k i1e +k i1h +k i1m +k i1o +k i1s +k i2v +k i2z +k i3@ *74 +k i3Q *62 +k i3f +k i3h +k i4' +k i40 +k i4v +k i4z +k i5\ +k i5^ +k i5i +k o0! +k o0: +k o0E +k o0c +k o0e l +k o0k +k o0p ] +k o0u +k o0z +k o1- +k o10 +k o16 +k o1a +k o1f +k o21 +k o29 +k o2O +k o2d +k o2g +k o2l +k o3- +k o31 +k o3_ +k o3h +k o3l f +k o4 +k o4k +k o4o ^E +k o5g +k o65 +k o6f +k o6g +k o7m +k o85 +k o91 +k o92 +k oA7 +k p1 *13 +k p2 O62 +k q +k q i15 +k r +k r $| +k r R1 +k r Z2 +k s2c +k s3H +k s52 +k s5b +k s8k +k saj +k sbd +k sd3 +k sej +k sfp O71 +k sgd +k sir -2 +k sjt +k smO +k snb +k srJ +k ssL +k ssy +k suz +k sy$ +k t -3 +k u o9y +k O07 +k O07 ^1 +k O08 sd; +k O13 +k O18 +k O23 +k O51 +k O62 +k z1 +k z1 T0 +k z1 l +k z1 O51 +k z2 +k z2 ^7 +k z3 +k z3 C +k z4 +k z4 *97 +k z5 D9 +k z5 i9s +k z5 O06 +k { +k { $v +k { *48 +k { C +k { O51 +k } q +k } r +k } s9" l -l $1$2$3 -l $2$0$0$7 -l $2$0$0$8 -l $2$0$0$9 +l $1 $2 $3 +l $2 $0 $0 $7 +l $2 $0 $0 $8 +l $2 $0 $0 $9 l i3 l i3& l i3+ @@ -20825,4909 +20799,4895 @@ l i6- l i7 l i7+ l i7- -l$ -l$! -l$% -l$- -l$1f -l$3 -l$4 -l$6 -l$7 -l$8 -l$DZ1 -l$So7m -l$SO0A -l$[ -l$^$s -l$g*32 -l$ii6R -l$j -l$kO92 -l$l -l$o -l$q -l$u -l'8 -l*03 -l*13i53 -l*20 -l*23L4 -l*23spe -l*30*64 -l*35 -l*37 -l*41 -l*5B -l*63K -l*68o6y -l*74 -l*75 -l*79 -l*86 -l*87 -l*92 -l*98 -l*B9 -l+0 -l+0i5t -l+1 -l+1[ -l+2 -l+2^L -l+3 -l+3$K -l+3'7 -l+3-6 -l+4 -l+4*30 -l+5 -l+6 -l+6$j -l+9 -l+AO45 -l+B -l-1 -l-2 -l-2^` -l-2s?9 -l-3@m -l-4 -l-5 -l-5*24 -l-7 -l-8 -l-A -l-B -l@9 -l@c -l@h -l@mD7 -l@n -l@v -l@x -lD1$_ -lD3L5 -lD4 -lD5i7x -lD6 -lD8 -lL1 -lL1T3 -lL2 -lL2i2m -lL5 -lL7 -lLB -lR0 -lR1 -lR3 -lR6 -lR6Z2 -lR8 -lT1 -lT2 -lT3 -lT4 -lT5 -lT5i1p -lT6 -lT7 -lT8 -lT9+B -lZ1 -lZ1$y -lZ1o4| -lZ1O5B -lZ2i6z -lZ2st3 -lZ2O83 -lZ5 -lZ5O57 -l[d -l[i5q -l]d -l]z3 -l^! -l^'z3 -l^4 -l^5o41 -l^D -l^Ei66 -l^M -l^QD5 -l^R -l^Ui0` -l^W -l^_O58 -l^aZ2 -l^b -l^c -l^e^N -l^h -l^hz2 -l^m -l^oz1 -l^v^8 -l^y -l^zO91 -l^}K -ld$o -ldstC -lfsns -lfO1B -lfO46 -li0$ -li05z5 -li09o6P -li0S -li0d -li13 -li15 -li1: -li1Q -li1_ -li1b -li1n -li2% -li2p -li3/ -li37z2 -li3a -li3k -li3r -li42 -li4; -li4_ -li4d'9 -li4h -li4n -li51 -li58 -li5t -li5u -li5zD7 -li6%+9 -li6' -li6/ -li60 -li67 -li6: -li6dO26 -li6j -li6p -li6t -li70 -li7S[ -li7e -li7k -li7v -li8 -li8a -li8t -li94 -liAb -lk -lo01O82 -lo0C -lo0E$a -lo0L -lo0c -lo0d -lo0e -lo0i -lo0v^q -lo0z -lo19 -lo1@ -lo1V -lo1a -lo1b -lo1e -lo1i -lo21 -lo2a -lo2j -lo2o -lo2t -lo3_ -lo3c -lo3e -lo3l -lo3pu -lo3w+1 -lo42 -lo4a -lo4b -lo4g -lo4v -lo4z -lo5, -lo5- -lo5; -lo5< -lo5K$) -lo5f -lo5i -lo5n -lo5u^4 -lo6 -lo6- -lo63 -lo66 -lo68 -lo69 -lo6` -lo6g -lo6i -lo6k -lo7- -lo74 -lo7K -lo7R -lo7` -lo7e -lo7f -lo85 -lo89 -lo8d -lo8e -lo9e -lo9i -loA9 -loAf -loAk -loB1 -loBF -lp2z2 -lp3 -lq -lqZ3 -lqsaT -lr -lr^+ -lrz4 -ls#j -ls$8 -ls0j$9 -ls12 -ls1a -ls4+ -ls5d -ls6- -ls6p -ls70 -ls8p -lsdk -lseSo3e -lsgc -lsgj -lshj -lslh -lsmK -lsmb[ -lso1 -lsp1 -lsr[ -lss& -lss[$] -lssd -lssf -lssi -lsuy -lsys -lsz2 -lui5C -luO03 -luOB2 -lO05 -lO06 -lO07 -lO12 -lO13 -lO14 -lO15 -lO21i31 -lO23 -lO23$N -lO23z2 -lO24 -lO24$8 -lO26 -lO27 -lO35-5 -lO35R1 -lO38 -lO3A^k -lO42 -lO43 -lO47 -lO48 -lO52 -lO53 -lO56 -lO56i5M -lO57 -lO58 -lO61o0H -lO61o8e -lO63 -lO69 -lO72 -lO75 -lO76 -lO78 -lO83D9 -lO8B -lO92 -lO95 -lOA3 -lz1 -lz2 -lz2$5 -lz2*14 -lz3o6F -lz4 -lz5 -lz5@7 -l{ -l{*02 -l{*15 -l} -l}-1 -l}Z2 -l}^K +l $ +l $! +l $% +l $- +l $1 f +l $3 +l $4 +l $6 +l $7 +l $8 +l $D Z1 +l $S o7m +l $S O0A +l $[ +l $^ $s +l $g *32 +l $i i6R +l $j +l $k O92 +l $l +l $o +l $q +l $u +l '8 +l *03 +l *13 i53 +l *20 +l *23 L4 +l *23 spe +l *30 *64 +l *35 +l *37 +l *41 +l *5B +l *63 K +l *68 o6y +l *74 +l *75 +l *79 +l *86 +l *87 +l *92 +l *98 +l *B9 +l +0 +l +0 i5t +l +1 +l +1 [ +l +2 +l +2 ^L +l +3 +l +3 $K +l +3 '7 +l +3 -6 +l +4 +l +4 *30 +l +5 +l +6 +l +6 $j +l +9 +l +A O45 +l +B +l -1 +l -2 +l -2 ^` +l -2 s?9 +l -3 @m +l -4 +l -5 +l -5 *24 +l -7 +l -8 +l -A +l -B +l @9 +l @c +l @h +l @m D7 +l @n +l @v +l @x +l D1 $_ +l D3 L5 +l D4 +l D5 i7x +l D6 +l D8 +l L1 +l L1 T3 +l L2 +l L2 i2m +l L5 +l L7 +l LB +l R0 +l R1 +l R3 +l R6 +l R6 Z2 +l R8 +l T1 +l T2 +l T3 +l T4 +l T5 +l T5 i1p +l T6 +l T7 +l T8 +l T9 +B +l Z1 +l Z1 $y +l Z1 o4| +l Z1 O5B +l Z2 i6z +l Z2 st3 +l Z2 O83 +l Z5 +l Z5 O57 +l [ d +l [ i5q +l ] d +l ] z3 +l ^! +l ^' z3 +l ^4 +l ^5 o41 +l ^D +l ^E i66 +l ^M +l ^Q D5 +l ^R +l ^U i0` +l ^W +l ^_ O58 +l ^a Z2 +l ^b +l ^c +l ^e ^N +l ^h +l ^h z2 +l ^m +l ^o z1 +l ^v ^8 +l ^y +l ^z O91 +l ^} K +l d $o +l d stC +l f sns +l f O1B +l f O46 +l i0$ +l i05 z5 +l i09 o6P +l i0S +l i0d +l i13 +l i15 +l i1: +l i1Q +l i1_ +l i1b +l i1n +l i2% +l i2p +l i3/ +l i37 z2 +l i3a +l i3k +l i3r +l i42 +l i4; +l i4_ +l i4d '9 +l i4h +l i4n +l i51 +l i58 +l i5t +l i5u +l i5z D7 +l i6% +9 +l i6' +l i6/ +l i60 +l i67 +l i6: +l i6d O26 +l i6j +l i6p +l i6t +l i70 +l i7S [ +l i7e +l i7k +l i7v +l i8 +l i8a +l i8t +l i94 +l iAb +l k +l o01 O82 +l o0C +l o0E $a +l o0L +l o0c +l o0d +l o0e +l o0i +l o0v ^q +l o0z +l o19 +l o1@ +l o1V +l o1a +l o1b +l o1e +l o1i +l o21 +l o2a +l o2j +l o2o +l o2t +l o3_ +l o3c +l o3e +l o3l +o3p u +l o3w +1 +l o42 +l o4a +l o4b +l o4g +l o4v +l o4z +l o5, +l o5- +l o5; +l o5< +l o5K $) +l o5f +l o5i +l o5n +l o5u ^4 +l o6 +l o6- +l o63 +l o66 +l o68 +l o69 +l o6` +l o6g +l o6i +l o6k +l o7- +l o74 +l o7K +l o7R +l o7` +l o7e +l o7f +l o85 +l o89 +l o8d +l o8e +l o9e +l o9i +l oA9 +l oAf +l oAk +l oB1 +l oBF +l p2 z2 +l p3 +l q +l q Z3 +l q saT +l r +l r ^+ +l r z4 +l s#j +l s$8 +l s0j $9 +l s12 +l s1a +l s4+ +l s5d +l s6- +l s6p +l s70 +l s8p +l sdk +l seS o3e +l sgc +l sgj +l shj +l slh +l smK +l smb [ +l so1 +l sp1 +l sr[ +l ss& +l ss[ $] +l ssd +l ssf +l ssi +l suy +l sys +l sz2 +u i5C +u O03 +u OB2 +l O05 +l O06 +l O07 +l O12 +l O13 +l O14 +l O15 +l O21 i31 +l O23 +l O23 $N +l O23 z2 +l O24 +l O24 $8 +l O26 +l O27 +l O35 -5 +l O35 R1 +l O38 +l O3A ^k +l O42 +l O43 +l O47 +l O48 +l O52 +l O53 +l O56 +l O56 i5M +l O57 +l O58 +l O61 o0H +l O61 o8e +l O63 +l O69 +l O72 +l O75 +l O76 +l O78 +l O83 D9 +l O8B +l O92 +l O95 +l OA3 +l z1 +l z2 +l z2 $5 +l z2 *14 +l z3 o6F +l z4 +l z5 +l z5 @7 +l { +l { *02 +l { *15 +l } +l } -1 +l } Z2 +l } ^K o0 -o0 Z5 +o0 Z5 o0! -o0!*A9@R -o0!o2^o25 -o0!O34 -o0!z1 +o0! *A9 @R +o0! o25 +o0! O34 +o0! z1 o0# o0$ -o0$*54 -o0$+2 -o0% -o0%$eq -o0& -o0&'6 -o0&-5 -o0'r -o0('7 -o0(-7 -o0({ -o0)+1z2 +o0$ *54 +o0$ +2 +o0% $e q +o0& '6 +o0& -5 +o0' r +o0( '7 +o0( -7 +o0( { +o0) +1 z2 o0* -o0*D2 -o0*z5 +o0* D2 +o0* z5 o0+ o0, -o0,cO02 -o0,p1 -o0- -o0-'9^L -o0-D1 -o0-R1 -o0-} +o0, c O02 +o0, p1 +o0- '9 ^L +o0- D1 +o0- R1 +o0- } o0. -o0.O31 -o0.z1 -o0/ -o0/C -o0/T1 -o0/z1 +o0. O31 +o0. z1 +o0/ C +o0/ T1 +o0/ z1 o00 -o00+3 -o00-5o1M -o00L1 -o00^1 -o00p1 -o00z1 +o00 +3 +o00 -5 o1M +o00 L1 +o00 ^1 +o00 p1 +o00 z1 o01 -o01i07 -o01l -o01p1 -o01p3 -o01s0h -o01uZ3 -o01z1 -o01z3 -o01z4+1 +o01 i07 +o01 l +o01 p1 +o01 p3 +o01 s0h +o01 u Z3 +o01 z1 +o01 z3 +o01 z4 +1 o02 -o02*20 -o02D5 -o02D6 -o02Z1 -o02saC -o02z1 +o02 *20 +o02 D5 +o02 D6 +o02 Z1 +o02 saC +o02 z1 o03 -o03+1 -o03-1 -o03^1 -o03^< -o03^Q -o03i3a -o03r -o03O2Az3 +o03 +1 +o03 -1 +o03 ^1 +o03 ^< +o03 ^Q +o03 i3a +o03 r +o03 O2A z3 o04 -o04'8 -o04L1 -o04O13 +o04 '8 +o04 L1 +o04 O13 o05 -o05'8 -o05l -o05t -o05z1 -o05z5 +o05 '8 +o05 l +o05 t +o05 z1 +o05 z5 o06 -o06+1 -o06@r -o06Z2 -o06Z4 -o06O85 +o06 +1 +o06 @r +o06 Z2 +o06 Z4 +o06 O85 o07 -o07*51 -o07-5Z2 -o07D2*56 -o07R2 -o07o2z -o07{u +o07 *51 +o07 -5 Z2 +o07 D2 *56 +o07 R2 +o07 o2z +o07 { u o08 -o08$xr -o08Z1 -o08]d -o08rD5 -o08O74 -o08z2 -o08z3O64 +o08 $x r +o08 Z1 +o08 ] d +o08 r D5 +o08 O74 +o08 z2 +o08 z3 O64 o09 -o09$x -o09*13 -o09*54 -o09-1 -o09L4 -o09Z4l -o09k +o09 $x +o09 *13 +o09 *54 +o09 -1 +o09 L4 +o09 Z4 l +o09 k o0: o0; o0< -o0 -o0>-1 -o0?$K -o0?^! -o0?^A -o0?}i3u +o0> -1 +o0? $K +o0? ^! +o0? ^A +o0? } i3u o0@ -o0@O24 +o0@ O24 o0A -o0AL1*17 -o0AZ2 -o0A^Q +o0A L1 *17 +o0A Z2 +o0A ^Q o0B -o0Bz3 +o0B z3 o0C -o0Cp1O01 -o0Ctz2 -o0Cz1 +o0C p1 O01 +o0C t z2 +o0C z1 o0D -o0D'6 -o0D'9 -o0Di6r -o0Du^I +o0D '6 +o0D '9 +o0D i6r +o0D u ^I o0E -o0EC +o0E C o0F -o0F$s -o0Fk -o0Fl -o0G -o0G@q -o0Gi0Q +o0F $s +o0F k +o0F l +o0G @q +o0G i0Q o0H -o0HD8*18 -o0Hi3m -o0Hl -o0HstA +o0H D8 *18 +o0H i3m +o0H l +o0H stA o0I -o0Ik -o0I{C +o0I k +o0I { C o0J -o0JT5 -o0Jt -o0Jz2D2 +o0J T5 +o0J t +o0J z2 D2 o0K -o0K*02 -o0KT5 -o0Ku -o0KO23^z -o0L -o0Lp1 +o0K *02 +o0K T5 +o0K u +o0K O23 ^z +o0L p1 o0M -o0M$n -o0M'9 -o0M*13 -o0M*43 -o0MD3 -o0ML1 -o0MZ5 -o0Md -o0Mo2N -o0Mz1 -o0N*25 -o0N*72 -o0ND8O14 -o0No4oZ2 -o0O -o0O$4z5 -o0OT2 -o0Oi3B -o0Ou -o0P -o0P$r -o0P*23 -o0PZ4 -o0Pd +o0M $n +o0M '9 +o0M *13 +o0M *43 +o0M D3 +o0M L1 +o0M Z5 +o0M d +o0M o2N +o0M z1 +o0N *25 +o0N *72 +o0N D8 O14 +o0N o4o Z2 +o0O $4 z5 +o0O T2 +o0O i3B +o0O u +o0P $r +o0P *23 +o0P Z4 +o0P d o0Q -o0Q$w +o0Q $w o0R -o0R$A -o0R$i -o0R*31 -o0R+4 -o0RO31 -o0Rz3D1 +o0R $A +o0R $i +o0R *31 +o0R +4 +o0R O31 +o0R z3 D1 o0S -o0S*45*34 -o0S^* -o0Sp1 +o0S *45 *34 +o0S ^* +o0S p1 o0T -o0T+4 -o0TL1 +o0T +4 +o0T L1 o0U -o0Uu -o0V -o0V+2 -o0VD3 -o0VO32 +o0U u +o0V +2 +o0V D3 +o0V O32 o0W -o0W$f-6 -o0W*31 -o0WC -o0WD2 -o0WT5Z2 -o0Wp1 -o0Wskt -o0WtO43 +o0W $f -6 +o0W *31 +o0W C +o0W D2 +o0W T5 Z2 +o0W p1 +o0W skt +o0W t O43 o0X -o0Xu -o0Xz2 +o0X u +o0X z2 o0Y -o0Y$b -o0Y$r -o0Y*56 -o0YZ4 -o0YO43 +o0Y $b +o0Y $r +o0Y *56 +o0Y Z4 +o0Y O43 o0Z -o0Z$Z -o0Z*31K -o0ZZ1 -o0Zc -o0Zz2 +o0Z $Z +o0Z *31 K +o0Z Z1 +o0Z c +o0Z z2 o0[ -o0[O23 +o0[ O23 o0\ o0] o0^ -o0^i0cZ1 -o0^p1 -o0^z1 +o0^ i0c Z1 +o0^ p1 +o0^ z1 o0_ o0` -o0a -o0aT2 -o0a[i2b -o0a^f -o0a^q -o0ai6; -o0aO46 -o0aO63 +o0a T2 +[ i2b +o0a ^f +o0a ^q +o0a i6; +o0a O46 +o0a O63 o0b -o0b*02 -o0b*23*43 -o0bC -o0b^t -o0bc -o0bk -o0bl -o0bo6BO04 -o0bp1 +o0b *02 +o0b *23 *43 +o0b C +o0b ^t +o0b c +o0b k +o0b l +o0b o6B O04 +o0b p1 o0c -o0c$0 -o0c*42 -o0c*62 -o0c*86 -o0ck -o0cscq +o0c $0 +o0c *42 +o0c *62 +o0c *86 +o0c k +o0c scq o0d -o0d$z -o0d+A -o0d-5 -o0d@s -o0dD5 -o0dR9 -o0d] -o0di4[ -o0dr -o0dO37q -o0dz3 -o0d} +o0d $z +o0d +A +o0d -5 +o0d @s +o0d D5 +o0d R9 +o0d ] +o0d i4[ +o0d r +o0d O37 q +o0d z3 +o0d } o0e -o0e'A -o0e-2 -o0eT6 -o0e^Kl -o0ei1s -o0ekZ1 -o0eo3l -o0esa"*61 -o0eO3A -o0eO72 +o0e 'A +o0e -2 +o0e T6 +o0e ^K l +o0e i1s +o0e k Z1 +o0e o3l +o0e sa" *61 +o0e O3A +o0e O72 o0f -o0f$1 -o0fC^a -o0fD1 -o0fK -o0fT3 -o0f^7 -o0fo39l -o0fO12 -o0fO32 -o0g -o0g*34 -o0g+6 -o0gZ2 -o0g] -o0gd -o0gf -o0gp2 -o0gq -o0gqr -o0gt -o0gz2 +o0f $1 +o0f C ^a +o0f D1 +o0f K +o0f T3 +o0f ^7 +o0f o39 l +o0f O12 +o0f O32 +o0g *34 +o0g +6 +o0g Z2 +o0g ] +o0g d +o0g f +o0g p2 +o0g q +o0g q r +o0g t +o0g z2 o0h -o0h*12 -o0hu -o0hO91 +o0h *12 +o0h u +o0h O91 o0i -o0i+1 -o0ip1 -o0it -o0iu -o0j^9 -o0j^D -o0j^v -o0jc -o0jk -o0jstg[ -o0jO31 -o0jz3 -o0jz4 +o0i +1 +o0i p1 +o0i t +o0i u +o0j ^9 +o0j ^D +o0j ^v +o0j c +o0j k +stg [ +o0j O31 +o0j z3 +o0j z4 o0k -o0k*27 -o0k*30 -o0k*46 -o0k^g -o0kc -o0ko1. -o0kp1 -o0ks7c -o0ksm+ -o0kO23 -o0kO41 -o0kO61 -o0kz1 +o0k *27 +o0k *30 +o0k *46 +o0k ^g +o0k c +o0k o1. +o0k p1 +o0k s7c +o0k sm+ +o0k O23 +o0k O41 +o0k O61 +o0k z1 o0l -o0l^2 -o0ld -o0ldL6 -o0lkz4 -o0lO35 -o0lO47 -o0lz4 +o0l ^2 +o0l d +o0l d L6 +o0l k z4 +o0l O35 +o0l O47 +o0l z4 o0m -o0mT4 -o0md -o0ml -o0mo5w -o0mz1 -o0m{ +o0m T4 +o0m d +o0m l +o0m o5w +o0m z1 +o0m { o0n -o0n*61 -o0n*62 -o0n^n -o0no4K -o0no62 -o0nO02$A -o0nz5 -o0n} +o0n *61 +o0n *62 +o0n ^n +o0n o4K +o0n o62 +o0n O02 $A +o0n z5 +o0n } o0o -o0o*13 -o0oZ2 -o0op1 -o0oqO26 -o0p -o0p'6 -o0p*40 -o0p+3 -o0p-1 -o0p@1 -o0pZ1 -o0pi42 -o0po3e -o0pt +o0o *13 +o0o Z2 +o0o p1 +o0o q O26 +o0p '6 +o0p *40 +o0p +3 +o0p -1 +o0p @1 +o0p Z1 +o0p i42 +o0p o3e +o0p t o0q -o0q$5 -o0ql +o0q $5 +o0q l o0r -o0r+4 -o0rR4 -o0rT5 -o0r^E -o0r^b -o0ri0p -o0ro2k -o0rswz -o0rO21 -o0rO24 +o0r +4 +o0r R4 +o0r T5 +o0r ^E +o0r ^b +o0r i0p +o0r o2k +o0r swz +o0r O21 +o0r O24 o0s -o0s+6 -o0sZ5 -o0sd -o0si39 -o0sk -o0sl -o0so3X -o0sO31 -o0sO46^i +o0s +6 +o0s Z5 +o0s d +o0s i39 +o0s k +o0s l +o0s o3X +o0s O31 +o0s O46 ^i o0t -o0t$9 -o0t$? -o0t$e -o0t'7 -o0t*54 -o0t*91 -o0t@0 -o0tD5 -o0tf -o0to3w -o0tq -o0tsPk -o0tu -o0tz1 -o0u -o0u^t -o0ui3- -o0uk +o0t $9 +o0t $? +o0t $e +o0t '7 +o0t *54 +o0t *91 +o0t @0 +o0t D5 +o0t f +o0t o3w +o0t q +o0t sPk +o0t u +o0t z1 +o0u ^t +o0u i3- +o0u k o0v -o0v'5 -o0v*23 -o0v^b -o0vi75O17 -o0vo1- -o0vr -o0vO41 +o0v '5 +o0v *23 +o0v ^b +o0v i75 O17 +o0v o1- +o0v r +o0v O41 o0w -o0w$3 -o0w$r -o0w'7Z1 -o0w*05 -o0w*14 -o0w*25 -o0w*45^Z -o0wD8 -o0wq -o0wO23 -o0wz1 -o0wz5D0 +o0w $3 +o0w $r +o0w '7 Z1 +o0w *05 +o0w *14 +o0w *25 +o0w *45 ^Z +o0w D8 +o0w q +o0w O23 +o0w z1 +o0w z5 D0 o0x -o0xL1 -o0xZ5 -o0x] +o0x L1 +o0x Z5 +o0x ] o0y -o0y$CD0 -o0yr +$C D0 +o0y r o0z -o0z$q -o0z-9 -o0z-9O53 -o0z@u -o0z^I -o0zt -o0zO13 -o0zO32 -o0z} -o0{$rZ4 -o0{O17 +o0z $q +o0z -9 +o0z -9 O53 +o0z @u +o0z ^I +o0z t +o0z O13 +o0z O32 +o0z } +o0{ $r Z4 +o0{ O17 o0| -o0|-2C +o0| -2 C o1 -o1 O02$o -o1 z4 +o1 O02 $o +o1 z4 o1! -o1!T0 +o1! T0 o1" -o1"*53 +o1" *53 o1# -o1#+6 -o1#z2 -o1#{ +o1# +6 +o1# z2 +o1# { o1$ -o1$s0J-1 -o1%u +o1$ s0J -1 +o1% u o1& -o1&*13 +o1& *13 o1' o1( -o1(d*37 -o1(rR1 +o1( d *37 +o1( r R1 o1) -o1)d -o1)s2) +o1) d +o1) s2) o1* o1+ -o1+'A -o1+D4 -o1+Z1 -o1+t +o1+ 'A +o1+ D4 +o1+ Z1 +o1+ t o1, -o1,$1+7 -o1,z2 +o1, $1 +7 +o1, z2 o1- -o1-'6 -o1-'8 -o1-o0B +o1- '6 +o1- '8 +o1- o0B o1. -o1.+0 -o1.^h -o1.p1 -o1.O27 +o1. +0 +o1. ^h +o1. p1 +o1. O27 o1/ -o1/T0@1 -o1/z2 -o1/}Z5 +o1/ T0 @1 +o1/ z2 +o1/ } Z5 o10 -o10D2 -o10Z5[ -o10ls3" -o10p1 -o10uz5 +o10 D2 +o10 Z5 [ +o10 l s3" +o10 p1 +o10 u z5 o11 -o11$/ -o11D1^O -o11R2 -o11i2 -o11k -o11o9bO81 -o11tz4 -o11z1 -o11z3 +o11 $/ +D1 ^O +o11 R2 +o11 i2 +o11 k +o11 o9b O81 +o11 t z4 +o11 z1 +o11 z3 o12 -o12$! -o12C -o12L0 -o12k^4 -o12l +o12 $! +o12 C +o12 L0 +o12 k ^4 +o12 l o13 -o13$_ -o13-2 -o13Z1 -o13[ -o13o2S -o13o8hO73 -o13p1 -o13t +o13 $_ +o13 -2 +o13 Z1 +o13 [ +o13 o2S +o13 o8h O73 +o13 p1 +o13 t o14 -o14$C -o14-9 -o14Z1 -o14Z4 -o14^3 -o14^6 -o14l -o14p1 +o14 $C +o14 -9 +o14 Z1 +o14 Z4 +o14 ^3 +o14 ^6 +o14 l +o14 p1 o15 -o15'9 -o15Z2*85 -o15[ -o15[+5 -o15o6u -o15O24 +o15 '9 +o15 Z2 *85 +o15 [ +o15 [ +5 +o15 o6u +o15 O24 o16 -o16*31 -o16L8@b -o16z1$3 -o16z2 -o16z3 +o16 *31 +o16 L8 @b +o16 z1 $3 +o16 z2 +o16 z3 o17 -o17R2 -o17T0 -o17[ -o17l +o17 R2 +o17 T0 +o17 [ +o17 l o18 -o18L9 -o18^M -o18^gi4* -o18p1 -o18sjh -o18u +o18 L9 +o18 ^M +o18 ^g i4* +o18 p1 +o18 sjh +o18 u o19 -o19*51 -o19D4 -o19Z4 -o19[ -o19^iO1B -o19f -o19k -o1:*37 +o19 *51 +o19 D4 +o19 Z4 +o19 [ +o19 ^i O1B +o19 f +o19 k +o1: *37 o1; -o1;*58 -o1;l -o1;O32 -o1<*36 +o1; *58 +o1; l +o1; O32 +o1< *36 o1= -o1=*71 -o1=[ -o1={ -o1>i5J*52 +o1= *71 +o1= [ +o1= { +o1> i5J *52 o1? -o1?O35 +o1? O35 o1@ -o1@-8 -o1@D0 -o1@^s -o1@O43 -o1Au +o1@ -8 +o1@ D0 +o1@ ^s +o1@ O43 +o1A u o1B -o1B*10 +o1B *10 o1C -o1Cu -o1Cz1 -o1Cz3D2 +o1C u +o1C z1 +o1C z3 D2 o1D -o1D*21 -o1DR4 -o1Dc -o1Dz1*56 +o1D *21 +o1D R4 +o1D c +o1D z1 *56 o1E -o1ED0Z1 +o1E D0 Z1 o1F -o1F$1 -o1F^1 -o1Fc +o1F $1 +o1F ^1 +o1F c o1G -o1GZ1O71 +o1G Z1 O71 o1H -o1H$6 -o1Hl -o1Hu +o1H $6 +o1H l +o1H u o1I -o1I+2 -o1IT2 -o1IT4 -o1I[ -o1I] -o1Ip1 -o1Iu +o1I +2 +o1I T2 +o1I T4 +o1I [ +o1I ] +o1I p1 +o1I u o1J -o1JcZ2 -o1Jt +o1J c Z2 +o1J t o1K -o1K[ -o1Kk -o1KO35 -o1KO47 +o1K [ +o1K k +o1K O35 +o1K O47 o1L -o1L[ +o1L [ o1M -o1M^x -o1M{ +o1M ^x +o1M { o1N o1O -o1Oc -o1Odl +o1O c +o1O d l o1P -o1PrT6 -o1Pz5 -o1P{+4 -o1Q$\ +o1P r T6 +o1P z5 +o1P { +4 +o1Q $\ o1R o1S -o1Sco0t +o1S c o0t o1T -o1T^v -o1Tr -o1TtC -o1Tz2-5 +o1T ^v +o1T r +o1T C +o1T z2 -5 o1U -o1U@U -o1U[ -o1Ul -o1Ulstq -o1UsUQu -o1UO53t +o1U @U +o1U [ +o1U l +o1U l stq +o1U sUQ u +o1U O53 t o1V -o1V^\+7 -o1Vk +o1V ^\ +7 +o1V k o1W -o1Wl^1 +o1W l ^1 o1X o1Y -o1Y$p -o1Y*13sma -o1YO31 +o1Y $p +o1Y *13 sma +o1Y O31 o1Z -o1Z*01 +o1Z *01 o1[ -o1[Z2o5j +o1[ Z2 o5j o1\ -o1\o7% +o1\ o7% o1] -o1]O12o34 +o1] O12 o34 o1^ -o1^$( -o1^{$2 +o1^ $( +o1^ { $2 o1_ -o1_$z -o1_sdy -o1_z2 +o1_ $z +o1_ sdy +o1_ z2 o1` o1a -o1a$$ -o1a$- -o1a-9 -o1aD2 -o1a^g -o1ai2s -o1ai4- -o1asbk -o1aO63 +o1a $$ +o1a $- +o1a -9 +o1a D2 +o1a ^g +o1a i2s +o1a i4- +o1a sbk +o1a O63 o1b -o1b^w -o1bo0r -o1bs30 +o1b ^w +o1b o0r +o1b s30 o1c -o1cD6 -o1cL5 -o1ci0et +o1c D6 +o1c L5 +o1c i0e t o1d -o1d$6 -o1d$b -o1dZ4 -o1do2e -o1do3? -o1dz4 +o1d $6 +o1d $b +o1d Z4 +o1d o2e +o1d o3? +o1d z4 o1e -o1e$7 -o1e*31 -o1e*51^n -o1e+0 -o1eD7 -o1eL5 -o1eZ1 -o1eZ5 -o1eo2d -o1esdh -o1est3 -o1ez5 +o1e $7 +o1e *31 +o1e *51 ^n +o1e +0 +o1e D7 +o1e L5 +o1e Z1 +o1e Z5 +o1e o2d +o1e sdh +o1e st3 +o1e z5 o1f -o1f$br -o1f$w -o1f*20 -o1f+0 -o1fk -o1fp2 -o1fz2 +o1f $b r +o1f $w +o1f *20 +o1f +0 +o1f k +o1f p2 +o1f z2 o1g -o1gD0^B -o1gT0 -o1gi0e -o1gp1 -o1gu -o1gO3A +o1g D0 ^B +o1g T0 +o1g i0e +o1g p1 +o1g u +o1g O3A o1h -o1h+0 -o1hR0 -o1h[ -o1ho7s +o1h +0 +o1h R0 +o1h [ +o1h o7s o1i -o1i'A -o1i^v -o1ii04 +o1i 'A +o1i ^v +o1i i04 o1j -o1j$1 -o1j*41 -o1j-2 -o1jZ1 +o1j $1 +o1j *41 +o1j -2 +o1j Z1 o1k -o1k$! -o1kL4 -o1kZ2o63 -o1k[p1 -o1k^i -o1k^s -o1kc -o1ki1u -o1kl -o1kz4 +o1k $! +o1k L4 +o1k Z2 o63 +o1k [ p1 +o1k ^i +o1k ^s +o1k c +o1k i1u +o1k l +o1k z4 o1l -o1l*13 -o1l*53 -o1l-2 -o1ld +o1l *13 +o1l *53 +o1l -2 +o1l d o1m -o1m*21 -o1m*24[ -o1m*65 -o1m-3 -o1mD0 -o1mL2 -o1md -o1mo0e -o1mu -o1mO28 +o1m *21 +o1m *24 [ +o1m *65 +o1m -3 +o1m D0 +o1m L2 +o1m d +o1m o0e +o1m u +o1m O28 o1n -o1n*10 -o1n*17 -o1nl -o1nu -o1n{t +o1n *10 +o1n *17 +o1n l +o1n u +o1n { t o1o -o1o*13 -o1o+7 -o1o@9 -o1oD4 -o1oL0 -o1oR0 -o1oZ1O53 -o1od -o1osWt -o1ossEu -o1oO25 +o1o *13 +o1o +7 +o1o @9 +o1o D4 +o1o L0 +o1o R0 +o1o Z1 O53 +o1o d +o1o sWt +o1o ssE u +o1o O25 o1p -o1p-2 -o1pZ2 -o1p^c -o1pz1 -o1pz3Z3 -o1p} +o1p -2 +o1p Z2 +o1p ^c +o1p z1 +o1p z3 Z3 +o1p } o1q -o1qt -o1qu +o1q t +o1q u o1r -o1r[ -o1ro7t -o1rt -o1rO45 +o1r [ +o1r o7t +o1r t +o1r O45 o1s -o1s$h -o1s+0 -o1sZ1 -o1sc -o1sd -o1si0g -o1si3n -o1su -o1sz1 +o1s $h +o1s +0 +o1s Z1 +o1s c +o1s d +o1s i0g +o1s i3n +o1s u +o1s z1 o1t -o1tp1 +o1t p1 o1u -o1u$- -o1u$yo1u -o1up1 -o1up2OAB -o1usBm -o1u}-0 +o1u $- +$y o1u +o1u p1 +o1u p2 OAB +o1u sBm +o1u } -0 o1v -o1v*51 -o1vC +o1v *51 +o1v C o1w -o1w$4 -o1w$C -o1w+3 -o1w-8 -o1w@9 -o1wD5 -o1wi17 -o1wq -o1wz1 +o1w $4 +o1w $C +o1w +3 +o1w -8 +o1w @9 +o1w D5 +o1w i17 +o1w q +o1w z1 o1x -o1xZ4 -o1x^l -o1xu +o1x Z4 +o1x ^l +o1x u o1y -o1y*27 -o1y*43z1 -o1yT5 -o1yo4f -o1yp1 -o1ysPD -o1ysc1 -o1yO12Z4 +o1y *27 +o1y *43 z1 +o1y T5 +o1y o4f +o1y p1 +o1y sPD +o1y sc1 +o1y O12 Z4 o1z -o1z'8 -o1zZ2 -o1z^j -o1zq -o1{z3 -o1|i1g +o1z '8 +o1z Z2 +o1z ^j +o1z q +o1{ z3 +o1| i1g o1} o2 -o2 *20i3D -o2 T0 -o2 ^4 -o2 ^t -o2 i1i -o2 u -o2 uo2a +o2 *20 i3D +o2 T0 +o2 ^4 +o2 ^t +o2 i1i +o2 u +u o2a o2! -o2!*12 -o2!i3V -o2!k +o2! *12 +o2! i3V +o2! k o2" -o2"^S +o2" ^S o2# o2$ -o2$Z1O42 -o2$Z2 +o2$ Z1 O42 +o2$ Z2 o2% -o2%*73 +o2% *73 o2& o2' -o2'^*T3 -o2'} +o2' ^* +o2' } o2) o2* -o2*T3O01 -o2*d -o2*t -o2*z1 +o2* T3 O01 +o2* d +o2* t +o2* z1 o2+ -o2+O32 +o2+ O32 o2, -o2,$1 +o2, $1 o2- -o2-*01 -o2-+4 -o2-R4 -o2-[o0J -o2-^k -o2-o1w +o2- *01 +o2- +4 +o2- R4 +o2- [ o0J +o2- ^k +o2- o1w o2. -o2.D1 +o2. D1 o2/ -o2/Z2 -o2/suz +o2/ Z2 +o2/ suz o20 -o20Z1 -o20^V -o20fO58 -o20i0K -o20z3 +o20 Z1 +o20 ^V +o20 f O58 +o20 i0K +o20 z3 o21 -o21'9 -o21D2snq -o21L6 -o21q -o21u -o21z3 +o21 '9 +D2 snq +o21 L6 +o21 q +o21 u +o21 z3 o22 -o22*32 -o22[ -o22] -o22t -o22z1 +o22 *32 +o22 [ +o22 ] +o22 t +o22 z1 o23 -o23R1 +o23 R1 o24 -o24u +o24 u o25 -o25R6 -o25p1 -o25r -o25z1 +o25 R6 +o25 p1 +o25 r +o25 z1 o26 -o26'9 -o26Z3 -o26d -o26O61 -o26z2 +o26 '9 +o26 Z3 +o26 d +o26 O61 +o26 z2 o27 -o27+8 -o27C +o27 +8 +o27 C o28 -o28*12 -o28l -o28p1i3H -o28O36 -o28z1 +o28 *12 +o28 l +o28 p1 i3H +o28 O36 +o28 z1 o29 -o29R4 -o29T4 -o29o65T2 -o29z2 -o2:*27{ +o29 R4 +o29 T4 +o29 o65 +o29 z2 +o2: *27 { o2; -o2;*31 -o2;o0SO16 +o2; *31 +o2; o0S O16 o2< -o2$G[ +o2= D3 o3_ +o2> $G [ o2? -o2?+3 +o2? +3 o2@ -o2@T0 -o2@oAR[ +o2@ T0 +o2@ oAR [ o2A -o2A[ -o2A^1 -o2Au -o2Bl*53 -o2Bsxrl +o2A [ +o2A ^1 +o2A u +o2B l *53 +o2B sxr l o2C -o2C-3 -o2Co6\ -o2Ct +o2C -3 +o2C o6\ +o2C t o2D -o2Dl -o2D} +o2D l +o2D } o2E o2F -o2F+1 +o2F +1 o2G -o2Gl -o2Go0P +o2G l +o2G o0P o2H -o2HT3 -o2HZ1u -o2H^H -o2H^q$7 -o2Hs0A +o2H T3 +o2H Z1 u +o2H ^H +o2H ^q $7 +o2H s0A o2I o2J -o2Ju +o2J u o2K -o2K*5Bk -o2K^Z -o2Kz2 -o2L@du -o2Lo75 +o2K *5B k +o2K ^Z +o2K z2 +o2L @d u +o2L o75 o2M -o2Mc +o2M c o2N -o2Nl +o2N l o2O o2P -o2Pl -o2PO61 +o2P l +o2P O61 o2Q -o2Q-2Z3 -o2Qu -o2Q} +o2Q -2 Z3 +o2Q u +o2Q } o2R -o2RT0 -o2RlO02 -o2ST1 -o2Si6GR4 -o2TZ2 -o2To33 +o2R T0 +o2R l O02 +o2S T1 +o2S i6G R4 +o2T Z2 +o2T o33 o2U -o2UO53u +o2U O53 u o2V -o2V$p*53 -o2V-3 -o2V[ -o2Vo3)$/ -o2Vt +o2V $p *53 +o2V -3 +o2V [ +o2V o3) $/ +o2V t o2W -o2Wc -o2Wu -o2Wz2 -o2XR0 +o2W c +o2W u +o2W z2 +o2X R0 o2Y -o2Y'7 -o2Yck -o2Yt -o2Z'7 -o2ZD3 -o2Z[ -o2Z^g +o2Y '7 +o2Y c k +o2Y t +o2Z '7 +o2Z D3 +o2Z [ +o2Z ^g o2[ -o2[L2 +o2[ L2 o2] o2^ o2_ -o2_*06 +o2_ *06 o2` o2a -o2a'6 -o2a*32 -o2aK -o2aswr -o2a{ +o2a '6 +o2a *32 +o2a K +o2a swr +o2a { o2b -o2b$u -o2b*26 -o2b*32 -o2b-0 -o2b[ -o2bO53 -o2b} +o2b $u +o2b *26 +o2b *32 +o2b -0 +o2b [ +o2b O53 +o2b } o2c -o2cD0 -o2cR4 -o2co7% -o2cO31 -o2cO41 -o2cz2 -o2cz2{ -o2c} +o2c D0 +o2c R4 +o2c o7% +o2c O31 +o2c O41 +o2c z2 +o2c z2 { +o2c } o2d -o2d*54 -o2d+8 -o2d-0 -o2d-8 -o2dC -o2dZ1 -o2d[ -o2dc -o2d{ +o2d *54 +o2d +8 +o2d -0 +o2d -8 +o2d C +o2d Z1 +o2d [ +o2d c +o2d { o2e -o2ek -o2eo1]o1& +o2e k +o2e o1& o2f -o2fi45 -o2fr -o2f} +o2f i45 +o2f r +o2f } o2g -o2g$# -o2gD3 -o2gD6 -o2g^a -o2gd -o2gi4k -o2go58 -o2gO34o1& -o2gO51 -o2g{ +o2g $# +o2g D3 +o2g D6 +o2g ^a +o2g d +o2g i4k +o2g o58 +o2g O34 o1& +o2g O51 +o2g { o2h -o2h$d*15 -o2h*26 -o2hT5 -o2hr -o2hszS +o2h $d *15 +o2h *26 +o2h T5 +o2h r +o2h szS o2i -o2i$j -o2i*40 -o2iL3 -o2iT0 -o2iZ2 -o2iZ4} -o2i] -o2isaA*31 +o2i $j +o2i *40 +o2i L3 +o2i T0 +o2i Z2 +o2i Z4 } +o2i ] +o2i saA *31 o2j -o2j*60 -o2j-5 -o2jZ1 -o2j^8 +o2j *60 +o2j -5 +o2j Z1 +o2j ^8 o2k -o2k$dZ4 -o2k$p*21 -o2k*01 -o2k[ -o2kc -o2ko2i[ -o2ksus -o2kO06Z1 +o2k $d Z4 +o2k $p *21 +o2k *01 +o2k [ +o2k c +o2i [ +o2k sus +o2k O06 Z1 o2l -o2l$k -o2l'6 -o2l*42 -o2l-8 -o2lT0 -o2lZ1 -o2ls4f -o2lsxZO02 -o2lO31 +o2l $k +o2l '6 +o2l *42 +o2l -8 +o2l T0 +o2l Z1 +o2l s4f +o2l sxZ O02 +o2l O31 o2m -o2m$2 -o2mD3 -o2m^d +o2m $2 +o2m D3 +o2m ^d o2n -o2n-4 -o2nC -o2nZ1 -o2n[ -o2ndO58 -o2nr -o2nO32 -o2nz3 -o2n} +o2n -4 +o2n C +o2n Z1 +o2n [ +o2n d O58 +o2n r +o2n O32 +o2n z3 +o2n } o2o -o2o+2R5 -o2o^@ -o2o^D -o2oc -o2oi2j -o2oo0p +o2o +2 R5 +o2o ^@ +o2o ^D +o2o c +o2o i2j +o2o o0p o2p -o2p*37 -o2p*51 -o2p+3 -o2pC -o2pD4D0 -o2pO35 +o2p *37 +o2p *51 +o2p +3 +o2p C +o2p D4 D0 +o2p O35 o2q -o2q$4 -o2q]i3i -o2qo5r -o2q{[ +o2q $4 +o2q ] i3i +o2q o5r +o2q { [ o2r -o2r$. -o2r+3O53 -o2rZ3 -o2r^v -o2rc -o2rf -o2rk -o2rq -o2rsc@ -o2rz3 -o2r}[ +o2r $. +o2r +3 O53 +o2r Z3 +o2r ^v +o2r c +o2r f +o2r k +o2r q +o2r sc@ +o2r z3 +o2r } [ o2s -o2s] -o2sc -o2sp1 -o2su -o2sO81 +o2s ] +o2s c +o2s p1 +o2s u +o2s O81 o2t -o2t$e -o2t+3 -o2t+4 -o2tZ2 -o2tZ3 -o2t^P*67 -o2tk -o2to7b +o2t $e +o2t +3 +o2t +4 +o2t Z2 +o2t Z3 +o2t ^P *67 +o2t k +o2t o7b o2u -o2u$# -o2uc -o2ud -o2ui3y -o2uro1d +o2u $# +o2u c +o2u d +o2u i3y +o2u r o1d o2v -o2v$Bi0m -o2vd -o2vz2 +o2v $B i0m +o2v d +o2v z2 o2w -o2w+4 -o2wZ1 -o2w^6 -o2w^8 -o2w^n -o2wi0_} -o2wi0j -o2wi1L -o2wk -o2wO48 +o2w +4 +o2w Z1 +o2w ^6 +o2w ^8 +o2w ^n +o2w i0_ } +o2w i0j +o2w i1L +o2w k +o2w O48 o2x -o2x*01 -o2x^xO54 -o2xr +o2x *01 +o2x ^x O54 +o2x r o2y -o2yT0 -o2yk -o2yo3k +o2y T0 +o2y k +o2y o3k o2z -o2z$ -o2z*21 -o2zC -o2zT4 -o2zO53 +o2z $ +o2z *21 +o2z C +o2z T4 +o2z O53 o2{ -o2{L0 +o2{ L0 o2| -o2|$gO2A -o2|^j -o2|o8HO15 -o2|s1z -o2}o0l +o2| $g O2A +o2| ^j +o2| o8H O15 +o2| s1z +o2} o0l o3 -o3 *53 -o3 c -o3 O21 -o3 } +o3 *53 +o3 c +o3 O21 +o3 } o3! -o3!$* -o3!-2 -o3!-4 -o3!Z1o53 -o3!i6C +o3! $* +o3! -2 +o3! -4 +o3! Z1 o53 +o3! i6C o3" -o3"s"K -o3"ss/ +o3" s"K +o3" ss/ o3# -o3#+5 -o3#o0T +o3# +5 +o3# o0T o3$ -o3$D2 -o3$Z2 -o3${ +o3$ D2 +o3$ Z2 +o3$ { o3% -o3%D1 +o3% D1 o3& -o3&-2l -o3&^1T2 +o3& -2 l +o3& ^1 T2 o3' o3( -o3(CO32 +o3( C O32 o3) o3* -o3*{ +o3* { o3+ -o3+D6 -o3+o0w*35 +o3+ D6 +o3+ o0w *35 o3, -o3,$#'5 -o3,R0 +o3, $# '5 +o3, R0 o3- -o3-*20 -o3-Z3 -o3-[ -o3-O5B -o3-z4O07 +o3- *20 +o3- Z3 +o3- [ +o3- O5B +o3- z4 O07 o3. -o3.*01 +o3. *01 o3/ -o3/O16u -o3/O45 +o3/ O16 u +o3/ O45 o30 -o30*63 -o30@a -o30R1 -o30r*30 -o30t +o30 *63 +o30 @a +o30 R1 +o30 r *30 +o30 t o31 -o31R7 -o31T3O61 +o31 R7 +o31 O61 o32 -o32*32u -o32[ -o32i3k -o32l^c -o32p1 -o32t -o32z3 +o32 *32 u +o32 [ +o32 i3k +o32 l ^c +o32 p1 +o32 t +o32 z3 o33 -o33-2 -o33d -o33o7@ -o33s9f +o33 -2 +o33 d +o33 o7@ +o33 s9f o34 -o34^M -o34l -o34s2n -o34t -o34{ +o34 ^M +o34 l +o34 s2n +o34 t +o34 { o35 -o35'5sw3 -o35Z2 +o35 '5 sw3 +o35 Z2 o36 -o36^j -o36sa0 +o36 ^j +o36 sa0 o37 -o37*20 -o37@2 -o37@y -o37R0 -o37i1n -o37o11 +o37 *20 +o37 @2 +o37 @y +o37 R0 +o37 i1n +o37 o11 o38 -o38$6R3 -o38$M -o38Z2u -o38qT5 -o38O72 -o38z5o2= +o38 $6 R3 +o38 $M +o38 Z2 u +o38 q T5 +o38 O72 +o38 z5 o2= o39 -o39*02 -o39*71 -o39Co3! -o39d +o39 *02 +o39 *71 +C o3! +o39 d o3: -o3:*15^8 -o3:^s +o3: *15 ^8 +o3: ^s o3; -o3;'6 -o3;*20 -o3;k -o3 -o4>z3*57 +o4> z3 *57 o4? -o4?@9 -o4?o7A +o4? @9 +o4? o7A o4@ -o4@$! +o4@ $! o4A -o4Ac -o4Ao1z +o4A c +o4A o1z o4B o4C -o4Ct +o4C t o4D -o4DDA -o4Dc -o4DO21 +o4D DA +o4D c +o4D O21 o4E -o4Et +o4E t o4F -o4Fz3 +o4F z3 o4G o4H o4I -o4Ic -o4Iu +o4I c +o4I u o4J o4K -o4K'6 -o4KL5 -o4K[ -o4Kl -o4Ku +o4K '6 +o4K L5 +o4K [ +o4K l +o4K u o4L o4M -o4M$7 -o4Mu{ +o4M $7 +o4M u { o4N -o4Nt +o4N t o4O -o4OZ5 -o4O^I +o4O Z5 +o4O ^I o4P -o4P^0'B -o4Pl +o4P ^0 'B +o4P l o4Q o4R -o4R} +o4R } o4S -o4Sl +o4S l o4T -o4T+1 -o4UZ2 -o4Uc +o4T +1 +o4U Z2 +o4U c o4V -o4Wi3Q +o4W i3Q o4X -o4Xt +o4X t o4Y -o4Y$E -o4YR2 -o4Yc +o4Y $E +o4Y R2 +o4Y c o4Z -o4Z*13i27 -o4Zo30^! +o4Z *13 i27 +o4Z o30 ^! o4[ -o4[i0s} -o4[o4mr -o4\o2[T2 -o4\o3= -o4\u +o4[ i0s } +o4m r +o4\ o2[ +o4\ o3= +o4\ u o4^ -o4^l +o4^ l o4_ -o4_o7s -o4_sp> +o4_ o7s +o4_ sp> o4` o4a -o4aZ2 -o4aZ2L6 -o4at -o4aO21 +o4a Z2 +o4a Z2 L6 +o4a t +o4a O21 o4b -o4b*42 -o4b@mz1 -o4bZ2 -o4b[^N -o4bz1 -o4bz2 -o4b} +o4b *42 +o4b @m z1 +o4b Z2 +o4b [ ^N +o4b z1 +o4b z2 +o4b } o4c -o4c*67 -o4c+3 -o4c^{^Q -o4cc -o4cl -o4co0@ -o4cp1 -o4cs0s+2 -o4cu -o4cO02 +o4c *67 +o4c +3 +o4c ^{ ^Q +o4c c +o4c l +o4c o0@ +o4c p1 +o4c s0s +2 +o4c u +o4c O02 o4d -o4d$k -o4d*07 -o4d*53 -o4dZ2 -o4do3j -o4dO71 +o4d $k +o4d *07 +o4d *53 +o4d Z2 +o4d o3j +o4d O71 o4e -o4eD5 -o4e^j -o4ed -o4esTw +o4e D5 +o4e ^j +o4e d +o4e sTw o4f -o4f$q^r -o4f$s -o4f*04 -o4fD6 -o4fo4J*20 -o4frZ1 +o4f $q ^r +o4f $s +o4f *04 +o4f D6 +o4J *20 +o4f r Z1 o4g -o4g$u -o4g-3 -o4g] -o4gu +o4g $u +o4g -3 +o4g ] +o4g u o4h -o4h*51 -o4h*71O37 -o4hK] -o4hi8uO31 +o4h *51 +o4h *71 O37 +o4h K ] +o4h i8u O31 o4i -o4iT1 -o4iZ1+4 -o4i^8z1 -o4io6! -o4iO31 +o4i T1 +o4i Z1 +4 +o4i ^8 z1 +o4i o6! +o4i O31 o4j -o4jR1 -o4ji2H$a -o4jo6Yc -o4jo80 -o4jp1 -o4jO31 +o4j R1 +o4j i2H $a +o4j o6Y c +o4j o80 +o4j p1 +o4j O31 o4k -o4k*35 -o4k+5 -o4k+6 -o4k[ -o4ki62 +o4k *35 +o4k +5 +o4k +6 +o4k [ +o4k i62 o4l -o4lD3 -o4lo1k -o4lo3r -o4lu -o4lO53 +o4l D3 +o4l o1k +o4l o3r +o4l u +o4l O53 o4m -o4m'6O32 -o4m*07 -o4m+0 -o4mqO56 -o4mO67 +o4m '6 O32 +o4m *07 +o4m +0 +o4m q O56 +o4m O67 o4n o4o -o4o*03ssl -o4o*24 -o4o+6 -o4oc -o4op1 -o4or +o4o *03 ssl +o4o *24 +o4o +6 +o4o c +o4o p1 +o4o r o4p -o4pD1 -o4pk -o4p} +o4p D1 +o4p k +o4p } o4q -o4qD5 -o4q[ +o4q D5 +o4q [ o4r -o4r*10 -o4r*35t -o4r^o -o4rp1 +o4r *10 +o4r *35 t +o4r ^o +o4r p1 o4s -o4s$AO25 -o4s*41 -o4s-0 -o4sR0 -o4st +o4s $A O25 +o4s *41 +o4s -0 +o4s R0 +o4s t o4t -o4t*45 -o4t*73 -o4tC -o4tD5 -o4tR3 -o4tZ1 -o4tZ2 -o4tZ3 -o4t^M -o4t^Zu -o4t^b -o4tO21 +o4t *45 +o4t *73 +o4t C +o4t D5 +o4t R3 +o4t Z1 +o4t Z2 +o4t Z3 +o4t ^M +o4t ^Z u +o4t ^b +o4t O21 o4u -o4u*21 -o4u^ki2G -o4ut -o4uO02 +o4u *21 +o4u ^k i2G +o4u t +o4u O02 o4v -o4v'6 -o4v*15 -o4vi0x -o4vO59 +o4v '6 +o4v *15 +o4v i0x +o4v O59 o4w -o4wZ1 -o4w^l -o4wi2m +o4w Z1 +o4w ^l +o4w i2m o4x -o4x*46 -o4x+2 -o4x-9 -o4xZ1 -o4xZ4 -o4xc -o4xp1 -o4xO21 +o4x *46 +o4x +2 +o4x -9 +o4x Z1 +o4x Z4 +o4x c +o4x p1 +o4x O21 o4y -o4y+0l -o4y^( -o4yo2k -o4yu -o4yz2 +o4y +0 l +o4y ^( +o4y o2k +o4y u +o4y z2 o4z -o4zL8t -o4zO56 -o4z{l +o4z L8 t +o4z O56 +o4z { l o4{ o4| o4} o5 -o5 '6 -o5 +6 -o5 -0 -o5 D3 -o5 Z1 -o5 sdhO13 -o5 O02 +o5 '6 +o5 +6 +o5 -0 +o5 D3 +o5 Z1 +o5 sdh O13 +o5 O02 o5! -o5!'6D1 -o5!*30 -o5!Z2 -o5!i4e -o5!o2l -o5!sgd -o5"$" +o5! '6 D1 +o5! *30 +o5! Z2 +o5! i4e +o5! o2l +o5! sgd +o5" $" o5# -o5#O62 +o5# O62 o5$ -o5$Z3 +o5$ Z3 o5% o5& -o5&^B*01 +o5& ^B *01 o5' -o5'+0 +o5' +0 o5( -o5(i5n +o5( i5n o5) o5* -o5*Z2 -o5*Z3 -o5*^o +o5* Z2 +o5* Z3 +o5* ^o o5+ -o5+*67 -o5+o1&k +o5+ *67 +o5+ o1& k o5, -o5,@8 -o5,L2 -o5,Z2 -o5,p1 -o5,O61 +o5, @8 +o5, L2 +o5, Z2 +o5, p1 +o5, O61 o5- -o5-'8 -o5-*40 -o5-O03 -o5-O83 +o5- '8 +o5- *40 +o5- O03 +o5- O83 o5. -o5.@w -o5.Z2 -o5.Z4 -o5.O41 +o5. @w +o5. Z2 +o5. Z4 +o5. O41 o5/ -o5/satz3 +o5/ sat z3 o50 -o50$y -o50*12 -o50-7 -o50Z1 -o50Z3 -o50^b -o50^f -o50d -o50l -o50o5!t +o50 $y +o50 *12 +o50 -7 +o50 Z1 +o50 Z3 +o50 ^b +o50 ^f +o50 d +o50 l +o5! t o51 -o51$k -o51l -o51O13 -o51z5 +o51 $k +o51 l +o51 O13 +o51 z5 o52 -o52$x -o52Z1 -o52Z3 -o52Z4 -o52l -o52o1E +o52 $x +o52 Z1 +o52 Z3 +o52 Z4 +o52 l +o52 o1E o53 -o53$e -o53D8 -o53^s -o53u -o53}^g +o53 $e +o53 D8 +o53 ^s +o53 u +o53 } ^g o54 -o54*02 -o54Z3 -o54p1 -o54u -o54O41 +o54 *02 +o54 Z3 +o54 p1 +o54 u +o54 O41 o55 -o55*78 -o55+6 -o55+7 -o55R0 -o55Z1 -o55Z5 -o55l -o55t -o55tZ1 +o55 *78 +o55 +6 +o55 +7 +o55 R0 +o55 Z1 +o55 Z5 +o55 l +o55 t +o55 t Z1 o56 -o56$6 -o56@w -o56L4 -o56o8s +o56 $6 +o56 @w +o56 L4 +o56 o8s o57 -o57$v -o57*13 -o57R4@4 -o57^l^d -o57u +o57 $v +o57 *13 +o57 R4 @4 +o57 ^l ^d +o57 u o58 -o58'7 -o58*65 -o58Z4 -o58[ -o58p1 -o58z2 +o58 '7 +o58 *65 +o58 Z4 +o58 [ +o58 p1 +o58 z2 o59 -o59Z2 -o59d +o59 Z2 +o59 d o5; -o5;*57*52 +o5; *57 *52 o5< -o5<*14s o5? -o5?'6 -o5?i6? -o5?kC +o5? '6 +o5? i6? +o5? k C o5@ -o5@*24 +o5@ *24 o5A -o5Al +o5A l o5B -o5Bl +o5B l o5C -o5CT6 -o5Cl +o5C T6 +o5C l o5D -o5D*8A -o5DO81 +o5D *8A +o5D O81 o5E -o5E@0D2 -o5ED7 -o5ET3 -o5EO02 +o5E @0 D2 +o5E D7 +o5E T3 +o5E O02 o5F -o5FZ1 +o5F Z1 o5G -o5GD6 +o5G D6 o5H -o5Hc^4 -o5Hdl -o5HO31 +o5H c ^4 +o5H d l +o5H O31 o5I -o5I$z -o5I-4 -o5IZ1 +o5I $z +o5I -4 +o5I Z1 o5J o5K -o5Ki3# -o5Kl -o5Ku -o5Luz1 +o5K i3# +o5K l +o5K u +o5L u z1 o5M -o5MD1 +o5M D1 o5N -o5N+2t -o5NO02 -o5NO52$: +o5N +2 t +o5N O02 +o5N O52 $: o5O -o5O+0 -o5Oc +o5O +0 +o5O c o5P -o5PZ2 -o5Pi2ii5} -o5Q*15 -o5Q*43 -o5QO24T1 +o5P Z2 +o5P i2i i5} +o5Q *15 +o5Q *43 +o5Q O24 T1 o5R -o5R@1 -o5RZ1 -o5S'6 +o5R @1 +o5R Z1 +o5S '6 o5T -o5Tc -o5To8gO35 -o5TO02+1 +o5T c +o5T o8g O35 +o5T O02 +1 o5U -o5Ui3E^, -o5Uo1B +o5U i3E ^, +o5U o1B o5V -o5V^n -o5Vo8{ +o5V ^n +o5V o8{ o5W -o5W[ -o5Wt +o5W [ +o5W t o5X o5Z -o5Zc -o5Z{o6" +o5Z c +o5Z { o6" o5[ -o5\o3IZ3 +o5\ o3I Z3 o5^ o5_ -o5_*15 -o5_*24 -o5_^Q -o5_o66 -o5_u +o5_ *15 +o5_ *24 +o5_ ^Q +o5_ o66 +o5_ u o5` o5a -o5a*68 -o5a+9 -o5aD6 -o5aZ1 -o5a[ -o5a^` -o5ad -o5aO32 +o5a *68 +o5a +9 +o5a D6 +o5a Z1 +o5a [ +o5a ^` +o5a d +o5a O32 o5b -o5bi62 +o5b i62 o5c -o5c-0 -o5cC -o5cO7BO07 -o5cz2 +o5c -0 +o5c C +o5c O7B O07 +o5c z2 o5d -o5d'9 -o5d*87 -o5dd -o5di16 -o5dssF{ -o5dz2 +o5d '9 +o5d *87 +o5d d +o5d i16 +o5d ssF { +o5d z2 o5e -o5e$2 -o5e*37 -o5e@z -o5eK -o5eZ1 -o5ei2U -o5eO61 -o5eO67 +o5e $2 +o5e *37 +o5e @z +o5e K +o5e Z1 +o5e i2U +o5e O61 +o5e O67 o5f -o5f$z -o5f-4 -o5fZ3 -o5fO74 +o5f $z +o5f -4 +o5f Z3 +o5f O74 o5g -o5g+7 -o5gZ1 -o5gO02 -o5gz1 +o5g +7 +o5g Z1 +o5g O02 +o5g z1 o5h -o5h*43 -o5hZ2 -o5hc -o5hi4% -o5hi5C -o5h{ +o5h *43 +o5h Z2 +o5h c +o5h i4% +o5h i5C +o5h { o5i -o5i$h -o5i'B -o5iD4 -o5iR3 -o5ii6r -o5io6n +o5i $h +o5i 'B +o5i D4 +o5i R3 +o5i i6r +o5i o6n o5j -o5j*50 -o5j+0 -o5jZ1+8 +o5j *50 +o5j +0 +o5j Z1 +8 o5k -o5k*42 -o5kD7 -o5kp1 -o5kO04 -o5kz4 +o5k *42 +o5k D7 +o5k p1 +o5k O04 +o5k z4 o5l -o5l+3 -o5l+4 -o5l+6 -o5lD1 -o5lZ1 -o5lc -o5li6s +o5l +3 +o5l +4 +o5l +6 +o5l D1 +o5l Z1 +o5l c +o5l i6s o5m -o5m-6 -o5mD4C -o5mT6 -o5m^Dl -o5mi5_ -o5mk +o5m -6 +o5m D4 C +o5m T6 +o5m ^D l +o5m i5_ +o5m k o5n -o5n-3 -o5n@oo5u -o5nT1z1 -o5nd -o5nl-5 -o5n{ +o5n -3 +o5n @o o5u +o5n T1 z1 +o5n d +o5n l -5 +o5n { o5o -o5o$0c -o5o*36z3 -o5o*52 -o5ot -o5oz2 +o5o $0 c +o5o *36 z3 +o5o *52 +o5o t +o5o z2 o5p -o5pC$g -o5pZ1} -o5pc -o5po1T7 +o6= c +o6> T7 o6? -o6?*45 +o6? *45 o6@ -o6@$1 -o6@'8 +o6@ $1 +o6@ '8 o6A -o6AT0 -o6A[ -o6Ac +o6A T0 +o6A [ +o6A c o6B -o6BD3 -o6BO32 +o6B D3 +o6B O32 o6C -o6C$sl -o6Ct +o6C $s l +o6C t o6D o6E -o6Eo4. +o6E o4. o6F -o6F+7 -o6FO05 -o6G$B -o6Gi4=l -o6Gsy2O23 -o6HZ1k +o6F +7 +o6F O05 +o6G $B +o6G i4= l +o6G sy2 O23 +o6H Z1 k o6I -o6I^: +o6I ^: o6J -o6J] -o6Jrl -o6KT6O32 +o6J ] +o6J r l +o6K T6 O32 o6L -o6L*75t -o6LC +o6L *75 t +o6L C o6M -o6M$2 -o6M-7 -o6Mc$h -o6Mu +o6M $2 +o6M -7 +o6M c $h +o6M u o6N -o6Nl +o6N l o6O -o6O-5 -o6OT3 +o6O -5 +o6O T3 o6P -o6P$U -o6PD8 +o6P $U +o6P D8 o6Q -o6Q$7 -o6Q-7 +o6Q $7 +o6Q -7 o6R -o6R+1 -o6RK -o6S+3 -o6SZ2 +o6R +1 +o6R K +o6S +3 +o6S Z2 o6T -o6TT7 -o6Tc -o6TdO29 -o6Ti6Y -o6Tu -o6U+7 -o6UO1A^Y +o6T T7 +o6T c +o6T d O29 +o6T i6Y +o6T u +o6U +7 +o6U O1A ^Y o6V -o6V$I -o6VO74 +o6V $I +o6V O74 o6W o6X -o6X$aO27 +o6X $a O27 o6Y -o6[O42 +o6[ O42 o6^ -o6^$6^U -o6^Z1 -o6^sao +o6^ $6 ^U +o6^ Z1 +o6^ sao o6_ -o6_$0 +o6_ $0 o6` o6a -o6a*36 -o6ao4y -o6aO42 +o6a *36 +o6a o4y +o6a O42 o6b -o6b$m -o6bZ3 -o6bp1 +o6b $m +o6b Z3 +o6b p1 o6c -o6c'A -o6c[ -o6c[+5 -o6cl -o6co7fo4y +o6c 'A +o6c [ +o6c [ +5 +o6c l +o6c o7f o4y o6d -o6d+4] -o6di5S -o6dz2 +o6d +4 ] +o6d i5S +o6d z2 o6e -o6e*02 -o6e*86 -o6e+5 -o6e-1 -o6eZ4 -o6e[ -o6e^%i7; -o6eo2n -o6eu +o6e *02 +o6e *86 +o6e +5 +o6e -1 +o6e Z4 +o6e [ +o6e ^% i7; +o6e o2n +o6e u o6f -o6f$+Z2 -o6f*42 -o6f-4 -o6f-4+3 -o6fo8c -o6fO13 -o6fO24 -o6fz1 -o6f{[ +o6f $+ Z2 +o6f *42 +o6f -4 +o6f -4 +3 +o6f o8c +o6f O13 +o6f O24 +o6f z1 +o6f { [ o6g -o6gl$b -o6go5ou +o6g l $b +o6g o5o u o6h -o6h'8 -o6h*34 +o6h '8 +o6h *34 o6i -o6i+8 -o6ic -o6id -o6iO12 -o6i{ +o6i +8 +o6i c +o6i d +o6i O12 +o6i { o6j -o6j$8 -o6j$XC -o6j'5$o -o6jD8 -o6jc+2 -o6jO02 +o6j $8 +o6j $X C +'5 $o +o6j D8 +o6j c +2 +o6j O02 o6k -o6k$s -o6k[ -o6kr -o6ksk^ -o6kO12 +o6k $s +o6k [ +o6k r +o6k sk^ +o6k O12 o6l -o6l*14 -o6l+3 -o6l-8 -o6li4zO53 -o6ll -o6lO84 -o6lz1 +o6l *14 +o6l +3 +o6l -8 +o6l i4z O53 +o6l l +o6l O84 +o6l z1 o6m -o6m$. -o6m*43 -o6mZ1'8 -o6mc -o6m} +o6m $. +o6m *43 +o6m Z1 '8 +o6m c +o6m } o6n -o6n$4 -o6n$y -o6n+3 -o6nD7 -o6no7- +o6n $4 +o6n $y +o6n +3 +o6n D7 +o6n o7- o6o -o6o$d -o6o*61 -o6oC -o6oZ1 -o6od -o6oO13o3v +o6o $d +o6o *61 +o6o C +o6o Z1 +o6o d +O13 o3v o6p -o6p$s -o6p*56 -o6p+9 -o6pc -o6pi3/ -o6po5l -o6pr +o6p $s +o6p *56 +o6p +9 +o6p c +o6p i3/ +o6p o5l +o6p r o6q -o6q{ +o6q { o6r -o6r'9 -o6r@k -o6r[ +o6r '9 +o6r @k +o6r [ o6s -o6s^A -o6sc -o6sd -o6si6#T6 -o6ssdy -o6sO01 -o6sO71 +o6s ^A +o6s c +o6s d +o6s i6# +o6s sdy +o6s O01 +o6s O71 o6t -o6t*45 -o6t-5 -o6tD4 -o6tl -o6tO02 -o6tO03 -o6t} +o6t *45 +o6t -5 +o6t D4 +o6t l +o6t O02 +o6t O03 +o6t } o6u -o6u+1 -o6u-5 +o6u +1 +o6u -5 o6v -o6v*46o6G -o6vo5n +o6v *46 o6G +o6v o5n o6w -o6w+7 -o6wT2Z3 -o6w] -o6wO71 +o6w +7 +o6w T2 Z3 +o6w ] +o6w O71 o6x -o6xZ1 -o6xt -o6xO51 +o6x Z1 +o6x t +o6x O51 o6y -o6y$k -o6y@s -o6yl -o6ys04 -o6ysnj -o6yO02 +o6y $k +o6y @s +o6y l +o6y s04 +o6y snj +o6y O02 o6z -o6zT1 -o6zZ3 -o6zl[ -o6{O56@i -o6|s|d +o6z T1 +o6z Z3 +o6z l [ +o6{ O56 @i +o6| s|d o7 -o7 LAO17 -o7 O02 +o7 LA O17 +o7 O02 o7! -o7!-5 -o7!Z1 +o7! -5 +o7! Z1 o7" -o7"T3 +o7" T3 o7# -o7#*76 -o7#Z2 -o7#u -o7#} +o7# *76 +o7# Z2 +o7# u +o7# } o7$ -o7$'8 -o7$Z2 -o7$o4QO24 -o7$s$b +o7$ '8 +o7$ Z2 +o7$ o4Q O24 +o7$ s$b o7% -o7%O51 +o7% O51 o7& o7' -o7'T9 +o7' T9 o7( o7) o7* o7+ -o7+$,O4A -o7+D9 -o7+OB2O64 +o7+ $, O4A +o7+ D9 +o7+ OB2 O64 o7, -o7,*64-5 -o7,c +o7, *64 -5 +o7, c o7- o7. -o7.-2 -o7.D0 -o7.z2 +o7. -2 +o7. D0 +o7. z2 o7/ -o7/[Z3 -o7/t -o7/{ +o7/ [ Z3 +o7/ t +o7/ { o70 -o70$9 -o70$k -o70Z1 -o70^a -o70^i +o70 $9 +o70 $k +o70 Z1 +o70 ^a +o70 ^i o71 -o71$7 -o71+6 -o71-6 -o71-9 -o71Z1u -o71Z2 -o71i0{ -o71i7vZ1 -o71o1t -o71r +o71 $7 +o71 +6 +o71 -6 +o71 -9 +o71 Z1 u +o71 Z2 +o71 i0{ +o71 i7v Z1 +o71 o1t +o71 r o72 -o72$e -o72*43 -o72D3i1c -o72Z2 -o72sln +o72 $e +o72 *43 +o72 D3 i1c +o72 Z2 +o72 sln o73 -o73$+ -o73*36 -o73[ -o73o89 +o73 $+ +o73 *36 +o73 [ +o73 o89 o74 -o74o85 -o74o8i -o74s3_ +o74 o85 +o74 o8i +o74 s3_ o75 -o75*68 -o75-9 -o75@1'B -o75t -o75O25 +o75 *68 +o75 -9 +o75 @1 'B +o75 t +o75 O25 o76 -o76D4 -o76K -o76Z1 -o76] -o76^1 -o76s6z -o76sgd +o76 D4 +o76 K +o76 Z1 +o76 ] +o76 ^1 +o76 s6z +o76 sgd o77 -o77*10 -o77*A7 -o77-1l -o77Z1 -o77^7 -o77l -o77z1 +o77 *10 +o77 *A7 +o77 -1 l +o77 Z1 +o77 ^7 +o77 l +o77 z1 o78 -o78$h +o78 $h o79 -o79*56 -o79Z1 -o79l -o79s.n -o79t -o79O51Z4 +o79 *56 +o79 Z1 +o79 l +o79 s.n +o79 t +o79 O51 Z4 o7; -o7;i6x +o7; i6x o7< -o7<*67 -o7c +o7> c o7? o7@ o7A -o7A@+ +o7A @+ o7B -o7Bo2r +o7B o2r o7C -o7CCo6j -o7CL3 +o7C C o6j +o7C L3 o7D -o7DO49i1v +o7D O49 i1v o7E o7F o7G -o7GT6 +o7G T6 o7H -o7HD2 +o7H D2 o7I -o7J-0 +o7J -0 o7K -o7K$bO53 -o7Kt -o7KO13 +$b O53 +o7K t +o7K O13 o7L -o7L^` -o7LO08i5f -o7L} +o7L ^` +o7L O08 i5f +o7L } o7M -o7MD8 -o7MO03 -o7M{ +o7M D8 +o7M O03 +o7M { o7O -o7OuO03 +o7O u O03 o7P o7Q -o7QZ1 -o7Qc -o7QO36$P +o7Q Z1 +o7Q c +o7Q O36 $P o7S o7T -o7Tr +o7T r o7U -o7Uc +o7U c o7W -o7W'9 +o7W '9 o7X o7Y -o7Yl -o7Yt +o7Y l +o7Y t o7Z -o7Z^L +o7Z ^L o7\ o7] -o7]i4. +o7] i4. o7^ -o7^o6D +o7^ o6D o7_ -o7_T0 -o7_O12 +o7_ T0 +o7_ O12 o7` o7a -o7a*74 -o7a+8 -o7ao3DO13 -o7asr3O42 +o7a *74 +o7a +8 +o7a o3D O13 +o7a sr3 O42 o7b -o7b$jO26 -o7b*46 -o7b+4 -o7bZ1 -o7bz2 +$j O26 +o7b *46 +o7b +4 +o7b Z1 +o7b z2 o7c -o7c*75 -o7cK -o7cZ1 -o7cZ4Z2 -o7co4a -o7cO34 +o7c *75 +o7c K +o7c Z1 +o7c Z4 Z2 +o7c o4a +o7c O34 o7d -o7d$1 -o7d$l -o7dL4 -o7dp1l +o7d $1 +o7d $l +o7d L4 +o7d p1 l o7e -o7e*75 -o7eO43 +o7e *75 +o7e O43 o7f -o7f*23D8 -o7fsn, -o7ft +o7f *23 D8 +o7f sn, +o7f t o7g -o7g$o -o7g*98 -o7g] -o7gu +o7g $o +o7g *98 +o7g ] +o7g u o7h -o7h*56 -o7ho8i +o7h *56 +o7h o8i o7i -o7i*25+3 -o7i+4 -o7ic$l -o7ii3XO15 -o7il +o7i *25 +3 +o7i +4 +o7i c $l +o7i i3X O15 +o7i l o7j -o7j{ +o7j { o7k -o7k*63 -o7kr -o7ksbr +o7k *63 +o7k r +o7k sbr o7l -o7l-3-7 -o7lD8 -o7l^+$o +o7l -3 -7 +o7l D8 +o7l ^+ $o o7m -o7m$1 -o7m+8 -o7m-8 -o7mO81 +o7m $1 +o7m +8 +o7m -8 +o7m O81 o7n -o7n$1 -o7nZ2-4 -o7nt +o7n $1 +o7n Z2 -4 +o7n t o7o -o7o$2D2 -o7o$to4f -o7o'A -o7o-3 -o7oi9=O86 -o7oo0dD8 -o7or -o7oO34 +o7o $2 D2 +o7o $t o4f +o7o 'A +o7o -3 +o7o i9= O86 +o7o o0d D8 +o7o r +o7o O34 o7p o7q -o7q*67 -o7q*80T6 +o7q *67 +o7q *80 T6 o7r -o7rt -o7rO16 -o7rO41 -o7rO82 -o7rz3 +o7r t +o7r O16 +o7r O41 +o7r O82 +o7r z3 o7s -o7s*57 -o7s+2 -o7sc -o7si6t -o7sshe -o7sO51 +o7s *57 +o7s +2 +o7s c +o7s i6t +o7s she +o7s O51 o7t -o7tL8 -o7tO32 +o7t L8 +o7t O32 o7u -o7u$p -o7u*67 -o7uo0M -o7uO04^p +o7u $p +o7u *67 +o7u o0M +o7u O04 ^p o7v -o7v[ -o7vi7t +o7v [ +o7v i7t o7w -o7w-5 -o7wZ3 -o7wt +o7w -5 +o7w Z3 +o7w t o7x -o7x*46 +o7x *46 o7y -o7y*12 -o7y^j -o7yO0Bs 7 +o7y *12 +o7y ^j +o7y O0B s 7 o7z -o7zD4*56 -o7zl -o7zo8o +o7z D4 *56 +o7z l +o7z o8o o7} -o7}$4 +o7} $4 o8 -o8 '9 -o8 D7 -o8 O02 -o8 O06 +o8 '9 +o8 D7 +o8 O02 +o8 O06 o8! -o8![ +o8! [ o8" o8# -o8#+9 -o8#D7 -o8#D9 +o8# +9 +o8# D7 +o8# D9 o8$ -o8$O74c +o8$ O74 c o8% -o8%O31 +o8% O31 o8& -o8&$& -o8&R8 -o8&z1O07 +o8& $& +o8& R8 +o8& z1 O07 o8( -o8(c -o8(O0B$r +o8( c +o8( O0B $r o8) -o8)T4 +o8) T4 o8* -o8*K +o8* K o8+ -o8+Z1 +o8+ Z1 o8- -o8-Z1 +o8- Z1 o8. -o8.$1 +o8. $1 o8/ o80 -o80+7 -o80T0 -o80[ -o80i0* -o80o7r +o80 +7 +o80 T0 +o80 [ +o80 i0* +o80 o7r o81 -o81'9 -o81*63 -o81i1e -o81scw -o81sub +o81 '9 +o81 *63 +o81 i1e +o81 scw +o81 sub o82 -o82$9 -o82*79 -o82O21 -o82} +o82 $9 +o82 *79 +o82 O21 +o82 } o83 -o83*65 -o83-4 -o83o3e -o83tO64 -o83z1 +o83 *65 +o83 -4 +o83 o3e +o83 t O64 +o83 z1 o84 -o84+6 -o84Z1 -o84o4c -o84t -o84O12 +o84 +6 +o84 Z1 +o84 o4c +o84 t +o84 O12 o85 -o85*75 -o85*87 -o85*97 -o85+3 -o85o7y -o85O62 +o85 *75 +o85 *87 +o85 *97 +o85 +3 +o85 o7y +o85 O62 o86 -o86T9 -o86Z2 +o86 T9 +o86 Z2 o87 -o87+0 -o87+6 -o87Z3 -o87O52 -o87OA2 +o87 +0 +o87 +6 +o87 Z3 +o87 O52 +o87 OA2 o88 -o88$3 -o88+9 -o88Z2 -o88o9! +o88 $3 +o88 +9 +o88 Z2 +o88 o9! o89 -o89+9 -o89Z1 -o89Z2 -o89sw:sa5 +o89 +9 +o89 Z1 +o89 Z2 +o89 sw: sa5 o8: o8; o8< -o8<*78 -o8 o9? -o9?O13 +o9? O13 o9@ -o9@uO06 -o9A[ -o9Ao0tO35 +o9@ u O06 +o9A [ +o9A o0t O35 o9C o9E -o9Fi9nl +o9F i9n l o9H -o9H^qO36 -o9Hl +o9H ^q O36 +o9H l o9I -o9JZ1 -o9Yc -o9Yl +o9J Z1 +o9Y c +o9Y l o9] o9_ -o9_O34 +o9_ O34 o9` o9a -o9ac -o9aO43 +o9a c +o9a O43 o9b o9c -o9cD7 +o9c D7 o9d -o9d$6 -o9dZ2 -o9dl -o9dO63 +o9d $6 +o9d Z2 +o9d l +o9d O63 o9e -o9eO63 -o9eO72 +o9e O63 +o9e O72 o9f o9g o9h o9i -o9i$l -o9iD0 -o9ii4i -o9io7QO53 +o9i $l +o9i D0 +o9i i4i +o9i o7Q O53 o9j -o9j+8 -o9jO14 +o9j +8 +o9j O14 o9k -o9kZ2 -o9ki0s -o9ko8d +o9k Z2 +o9k i0s +o9k o8d o9l -o9lO52 -o9lO53 +o9l O52 +o9l O53 o9m -o9mO09 +o9m O09 o9n -o9no7v +o9n o7v o9o -o9ot -o9oOA3 +o9o t +o9o OA3 o9p o9q o9r -o9r$i -o9rO71 +o9r $i +o9r O71 o9s -o9s$e -o9s+3 -o9sD3 +o9s $e +o9s +3 +o9s D3 o9t -o9tu -o9tO62 +o9t u +o9t O62 o9u -o9uO36O41 +o9u O36 O41 o9v o9w -o9wl -o9wO42 +o9w l +o9w O42 o9x -o9xD6 +o9x D6 o9y -o9y*98 -o9y-5 +o9y *98 +o9y -5 o9z -o9zT0 -o9|O15 +o9z T0 +o9| O15 oA! -oA!O12 +oA! O12 oA$ oA* oA+ -oA.[ +oA. [ oA/ oA0 oA1 -oA1+9 -oA1D5 -oA1D8 -oA1l +oA1 +9 +oA1 D5 +oA1 D8 +oA1 l oA2 -oA2$! -oA2*87 -oA2OB2 +oA2 $! +oA2 *87 +oA2 OB2 oA3 -oA3'B -oA3Z1 +oA3 'B +oA3 Z1 oA4 -oA4O28 +oA4 O28 oA5 oA6 oA7 -oA7u'B +oA7 u 'B oA8 -oA8O19 -oA8} +oA8 O19 +oA8 } oA9 -oA9D8 +oA9 D8 oA; oA@ -oA@Z3L1 -oAB*74O5B +oA@ Z3 L1 +oAB *74 O5B oAD -oAEO06 -oAOc +oAE O06 +oAO c oAP oAR -oARl -oAXO84O24 -oAZsZ. -oA[O16 +oAR l +oAX O84 O24 +oAZ sZ. +oA[ O16 oA^ -oA_O05 +oA_ O05 oAa -oAaO02 +oAa O02 oAc -oAcO07 +oAc O07 oAd oAe oAg -oAgO13 +oAg O13 oAh oAi oAj -oAl'B +oAl 'B oAm oAn oAo -oAo+2O15 -oAoO72 -oAp'B +oAo +2 O15 +oAo O72 +oAp 'B oAr -oArO14 +oAr O14 oAs -oAsD5 -oAsl -oAsO28 -oAsO42 +oAs D5 +oAs l +oAs O28 +oAs O42 oAt oAu oAv -oAwO14 -oAwO37 +oAw O14 +oAw O37 oAx oAy -oAyO51D5 +oAy O51 D5 oAz -oAzc -oB O0A -oB!c +oAz c +oB O0A +oB! c oB* oB+ -oB/R5'8 +R5 '8 oB0 -oB0O47 +oB0 O47 oB1 oB2 -oB2D9 -oB2i6h'9 +oB2 D9 +i6h '9 oB3 oB4 oB5 -oB5*AB -oB5DA +oB5 *AB +oB5 DA oB6 -oB6D5 +oB6 D5 oB7 -oB7l +oB7 l oB8 -oB8Z1 +oB8 Z1 oB9 -oB9Z1 -oB9O05 -oBCO65 -oBKoBC -oBNcO48 -oBO+1O84 -oBSl +oB9 Z1 +oB9 O05 +oBC O65 +oBK oBC +oBN c O48 +oBO +1 O84 +oBS l oBX -oB_O26 -oB_OB2s91 +oB_ O26 +oB_ OB2 s91 oBa oBc -oBcO56O14 +oBc O56 O14 oBd -oBdO46 +oBd O46 oBe oBf -oBfO26 -oBgO29 +oBf O26 +oBg O29 oBi oBk -oBk^Zo3H +oBk ^Z o3H oBn -oBn[O84 -oBnO06 +oBn [ O84 +oBn O06 oBo -oBoO36 +oBo O36 oBr oBs oBu oBv oBy -oByO26 -oByO38 +oBy O26 +oBy O38 oBz -p1$"l -p1$< -p1$= -p1$D -p1$I -p1$Jz5 -p1$Lo6z -p1$M -p1$a -p1$b -p1$e -p1$fO17 -p1$i -p1$j -p1$j*03 -p1$k -p1$l -p1$r -p1$s -p1$v -p1$vO73 -p1$yD2 -p1'4^! -p1'6 -p1'6Z2 -p1'6o47 -p1'7 -p1'7*32 -p1'7+1 -p1'7sk{ -p1'8 -p1'9[ -p1'Az1 -p1*12 -p1*15L3 -p1*18 -p1*2A*0B -p1*37 -p1*39O7A -p1*43 -p1*50O25 -p1*51 -p1*56i7# -p1*56u -p1*63 -p1*65i0E -p1*67 -p1*69 -p1*72 -p1*76O83 -p1*7A -p1*80 -p1*83 -p1*89O2B -p1*8B -p1*8BO92 -p1*91 -p1*95R7 -p1*96O47 -p1*96O98 -p1*B6O87 -p1+1^t -p1+4 -p1+5 -p1+6O13 -p1+9 -p1-1 -p1-3 -p1@2 -p1@9'9 -p1@ic -p1C[ -p1D1 -p1D3'9 -p1D3-6 -p1D4o06 -p1D6i4, -p1D9 -p1K[ -p1KO25 -p1L1 -p1L4 -p1R1 -p1R9 -p1T0 -p1T2OB1 -p1T6 -p1T7 -p1TB@2 -p1Z1*30 -p1Z1O05 -p1Z2Z4 -p1Z4z5 -p1[O65 -p1] -p1]k -p1^ -p1^! -p1^#z2 -p1^&^/ -p1^.c -p1^3O4A -p1^8 -p1^< -p1^IT1 -p1^P -p1^Q -p1^V -p1^] -p1^]O2A -p1^a -p1^c] -p1^d -p1^eO45 -p1^j -p1^l -p1^p -p1^| -p1cD8 -p1cO08 -p1i02 -p1i1tO41 -p1i23 -p1i2U -p1i2n -p1i4 -p1i4% -p1i4/ -p1i49 -p1i4O06 -qi0UO2A -qi0l -qi0y -qi2&'6 -qi24 -qi2[ -qo07 -qo0_ -qo0b -qo0s -qo1FO26 -qo1k -qo2O -qo2y -qo4y -qo58 -qo5YO2B -qo6e -qo7**27 -qo77 -qo7n[ -qo8S -qo9.O7A -qoBa -qq -qr -qr'6 -qr'8 -qsX* -qsbB -qsbd -qsf4 -qss! -qt -qtO52 -quO61 -qO03 -qO03^u -qO03o32 -qO04 -qO05 -qO08 -qO09 -qO09*46 -qO0B -qO12 -qO13 -qO16k -qO16O52 -qO17 -qO17-1 -qO18 -qO19 -qO1A -qO1B-2 -qO1Bz3 -qO23 -qO25 -qO26 -qO27 -qO28 -qO29 -qO29o6p -qO2A -qO34 -qO35 -qO35*70 -qO36 -qO37 -qO37$y -qO38 -qO39 -qO3A -qO3B -qO3Bz4 -qO41s21 -qO42C -qO45L3 -qO46 -qO47 -qO47O12 -qO48 -qO49^s -qO4A -qO4B -qO51+5 -qO54 -qO54C -qO56 -qO59 -qO5A -qO5B -qO63 -qO64*07 -qO65 -qO65O31 -qO68 -qO6B -qO74 -qO78 -qO83 -qO83] -qO83O2A -qO84 -qO85 -qO86 -qO8B -qO92O73 -qO94 -qO95 -qO96 -qOA1*0B -qOA1O81 -qOA3 -qOA5 -qOA9 -qz1 -qz1O32 -qz2 -qz3 -qz3OB1 -q{D3 -q{O18 -q{O19 -q} -q}'6 -q}*80 +q $1 +q $3 +q $4 +q $6 +q $9 O73 +q $A +q $c +q $d +q $e +q $h +q $k +q $m +q $u +q '7 +q '8 +q '9 +q '9 *68 +q '9 -4 +q 'B +q *04 +q *05 +q *12 +q *13 +q *14 O94 +q *16 +q *16 $B +q *17 +q *20 ^o +q *26 +q *27 O82 +q *2A O53 +q *30 $2 +q *31 DA +q *35 +q *40 z3 +q *46 +q *56 { +q *69 +q *74 O12 +q *74 O7B +q *75 +q '5 +q *92 O05 +q +1 +q +1 O26 +q +3 +q +3 [ +q +4 l +q +5 +q +5 { +q +6 +q +7 +q +B +q -1 +q -3 +q -4 +q -7 +q -9 +q -A +q @0 O86 +q @a O69 +q @i +q C +q C { +q D2 O65 +q D3 +q D4 +q D5 *06 +q D8 +q D8 O61 +q D9 O43 +q L6 +q L8 +q Z1 +q Z3 +q Z5 +q [ +q [ ] +q ] +q ] $6 +q ] r +q ^* +q ^* { +q ^0 +q ^6 +q ^S +q ^a +q ^e O26 +q ^j O49 +q ^p +q ^q +q ^u ^c +q c +q d '8 +q i01 +q i0> O06 +q i0U O2A +q i0l +q i0y +q i2& '6 +q i24 +q i2[ +q o07 +q o0_ +q o0b +q o0s +q o1F O26 +q o1k +q o2O +q o2y +q o4y +q o58 +q o5Y O2B +q o6e +q o7* *27 +q o77 +q o7n [ +q o8S +q o9. O7A +q oBa +q q +q r +q r '6 +q r '8 +q sX* +q sbB +q sbd +q sf4 +q ss! +q t +q t O52 +q u O61 +q O03 +q O03 ^u +q O03 o32 +q O04 +q O05 +q O08 +q O09 +q O09 *46 +q O0B +q O12 +q O13 +q O16 k +q O16 O52 +q O17 +q O17 -1 +q O18 +q O19 +q O1A +q O1B -2 +q O1B z3 +q O23 +q O25 +q O26 +q O27 +q O28 +q O29 +q O29 o6p +q O2A +q O34 +q O35 +q O35 *70 +q O36 +q O37 +q O37 $y +q O38 +q O39 +q O3A +q O3B +q O3B z4 +q O41 s21 +q O42 C +q O45 L3 +q O46 +q O47 +q O47 O12 +q O48 +q O49 ^s +q O4A +q O4B +q O51 +5 +q O54 +q O54 C +q O56 +q O59 +q O5A +q O5B +q O63 +q O64 *07 +q O65 +q O65 O31 +q O68 +q O6B +q O74 +q O78 +q O83 +q O83 ] +q O83 O2A +q O84 +q O85 +q O86 +q O8B +q O92 O73 +q O94 +q O95 +q O96 +q OA1 *0B +q OA1 O81 +q OA3 +q OA5 +q OA9 +q z1 +q z1 O32 +q z2 +q z3 +q z3 OB1 +q { D3 +q { O18 +q { O19 +q } +q } '6 +q } *80 r -r$! -r$$ -r$& -r$*i4V -r$+f -r$2 -r$; -r$= -r$? -r$L -r$] -r$b -r$c -r$g -r$i -r$m -r$o -r$osoU -r$p -r$qZ1 -r$r -r$w -r'2 -r'5 -r'6 -r'A -r*02 -r*02K -r*02z3 -r*05 -r*07*64 -r*09 -r*10 -r*12*60 -r*14 -r*14D5 -r*15 -r*23$j -r*30 -r*34 -r*34[ -r*35[ -r*36 -r*40z2 -r*45 -r*45] -r*45^p -r*52 -r*53 -r*56 -r*57 -r*61$R -r*65O32 -r*68 -r+0 -r+4R0 -r+5 -r+6 -r+8 -r-0c -r-1*61 -r-2 -r-2^k -r-A -r@g -r@h -rC -rC$J -rC'6 -rD2 -rD3 -rD4 -rD5R8 -rD9 -rKd -rKi5e -rKz2 -rL2 -rL2*15 -rL5 -rL5L5 -rL6^q -rL7 -rL9 -rR0 -rR2 -rR3 -rR4C -rR4} -rR6 -rR8so% -rT0 -rT1 -rT7 -rZ1L4 -rZ1k -rZ1o0O -rZ2 -rZ2*05 -rZ2D3 -rZ2^- -rZ2O73 -rZ3 -rZ3Z4 -rZ3i4W -rZ3t -rZ4 -rZ4-4 -rZ5 -rZ5O09 -r[*30 -r[*54 -r]K -r]o0v -r^! -r^$ -r^%o0c -r^%u -r^5 -r^7T0 -r^; -r^@ -r^A^/ -r^B -r^H -r^I -r^M -r^S -r^U -r^\ -r^a -r^k -r^l -r^m -r^q -r^w -r^z -rc -rcK -rco6Q -rd*74 -rf -rfO3A -ri0% -ri0=z3 -ri0O^R -ri1@ -ri1S -ri1T+4 -ri1f -ri1k -ri1r -ri23 -ri2P -ri2r[ -ri2sZ4 -ri2u -ri3.T4 -ri35 -ri39z2 -ri3S -ri3i -ri3q -ri3t -ri4fz1 -ri4h -ri4v -ri5: -ri5E -ri5_ -ri5f^? -ri5m$q -ri6K -ri7l -ri7u -rk^! -rkz2 -ro0" -ro0*O13 -ro06 -ro07 -ro0C -ro0b -ro0e -ro0g -ro1F -ro1ip1 -ro2& -ro2f -ro3- -ro3W -ro3Y -ro3fZ4 -ro3p -ro3s -ro41 -ro43 -ro4t -ro51 -ro52 -ro6U -ro6zz2 -ro7[ -roA\ -rp1$J -rp2 -rp3T7 -rqz1 -rs0+ -rs0- -rs0l -rs1 -rs9! -rsJ7 -rsa3 -rsb9 -rsbq -rsil -rspQZ1 -rsra -rstE -rstk -rstp -rswg -rt -rt*40 -rO04 -rO05 -rO06 -rO07 -rO09 -rO15 -rO32 -rO37 -rO41t -rO42 -rO51 -rO51$2 -rO51K -rO54 -rO62 -rO64 -rz1D6 -rz1i4f -rz3-1 -rz3R6 -rz3T1 -r{ -r{*04 -r{D3 -r} -r}f -s $O28i2a +r $! +r $$ +r $& +r $* i4V +r $+ f +r $2 +r $; +r $= +r $? +r $L +r $] +r $b +r $c +r $g +r $i +r $m +r $o +r $o soU +r $p +r $q Z1 +r $r +r $w +r '2 +r '5 +r '6 +r 'A +r *02 +r *02 K +r *02 z3 +r *05 +r *07 *64 +r *09 +r *10 +r *12 *60 +r *14 +r *14 D5 +r *15 +r *23 $j +r *30 +r *34 +r *34 [ +r *35 [ +r *36 +r *40 z2 +r *45 +r *45 ] +r *45 ^p +r *52 +r *53 +r *56 +r *57 +r *61 $R +r *65 O32 +r *68 +r +0 +r +4 R0 +r +5 +r +6 +r +8 +r -0 c +r -1 *61 +r -2 +r -2 ^k +r -A +r @g +r @h +r C +r C $J +r C '6 +r D2 +r D3 +r D4 +r D5 R8 +r D9 +r K d +r K i5e +r K z2 +r L2 +r L2 *15 +r L5 +r L5 L5 +r L6 ^q +r L7 +r L9 +r R0 +r R2 +r R3 +r R4 C +r R4 } +r R6 +r R8 so% +r T0 +r T1 +r T7 +r Z1 L4 +r Z1 k +r Z1 o0O +r Z2 +r Z2 *05 +r Z2 D3 +r Z2 ^- +r Z2 O73 +r Z3 +r Z3 Z4 +r Z3 i4W +r Z3 t +r Z4 +r Z4 -4 +r Z5 +r Z5 O09 +r [ *30 +r [ *54 +r ] K +r ] o0v +r ^! +r ^$ +r ^% o0c +r ^% u +r ^5 +r ^7 +r ^; +r ^@ +r ^A ^/ +r ^B +r ^H +r ^I +r ^M +r ^S +r ^U +r ^\ +r ^a +r ^k +r ^l +r ^m +r ^q +r ^w +r ^z +r c +r c K +r c o6Q +r d *74 +r f +r f O3A +r i0% +r i0= z3 +r i0O ^R +r i1@ +r i1S +r i1T +4 +r i1f +r i1k +r i1r +r i23 +r i2P +r i2r [ +r i2s Z4 +r i2u +r i3. T4 +r i35 +r i39 z2 +r i3S +r i3i +r i3q +r i3t +r i4f z1 +r i4h +r i4v +r i5: +r i5E +r i5_ +r i5f ^? +r i5m $q +r i6K +r i7l +r i7u +r k ^! +r k z2 +r o0" +r o0* O13 +r o06 +r o07 +r o0C +r o0b +r o0e +r o0g +r o1F +r o1i p1 +r o2& +r o2f +r o3- +r o3W +r o3Y +r o3f Z4 +r o3p +r o3s +r o41 +r o43 +r o4t +r o51 +r o52 +r o6U +r o6z z2 +r o7[ +r oA\ +r p1 $J +r p2 +r p3 T7 +r q z1 +r s0+ +r s0- +r s0l +r s1 +r s9! +r sJ7 +r sa3 +r sb9 +r sbq +r sil +r spQ Z1 +r sra +r stE +r stk +r stp +r swg +r t +r t *40 +r O04 +r O05 +r O06 +r O07 +r O09 +r O15 +r O32 +r O37 +r O41 t +r O42 +r O51 +r O51 $2 +r O51 K +r O54 +r O62 +r O64 +r z1 D6 +r z1 i4f +r z3 -1 +r z3 R6 +r z3 T1 +r { +r { *04 +r { D3 +r } +r } f +s $ O28 i2a s - s . s 5 -s 5$8 +s 5 $8 s _ s d s g @@ -25736,7 +25696,7 @@ s y s!+ s!- s!. -s!0Z5 +s!0 Z5 s!2 s!5 s!7 @@ -25744,24 +25704,24 @@ s!8 s!I s!J s!L -s!Lz1 +s!L z1 s!X s!^ -s!co60 +s!c o60 s!k s"! s#! -s#$z2O25 +s#$ z2 O25 s#' s#* s#- -s#-Z5 +s#- Z5 s#. s#/ s#1 s#X s#^ -s#_T1 +s#_ T1 s#b s#t s#u @@ -25781,7 +25741,7 @@ s$d s$z s%# s%* -s%0u +s%0 u s%1 s%9 s%P @@ -25793,7 +25753,7 @@ s'z s(& s(* s(E -s(}o6! +s(} o6! s*# s*$ s*% @@ -25824,13 +25784,13 @@ s+G s+L s+b s+d -s,1+0 +s,1 +0 s,9 -s,rO34 +s,r O34 s,s s,z s- -s- DA +s- DA s-! s-$ s-% @@ -25838,18 +25798,18 @@ s-& s-* s-/ s-0 -s-7'8 +s-7 '8 s-9 s-@ s-A s-J -s-Qq'7 +s-Q q '7 s-T s-^ s-_ -s-_$1 -s-ou -s-s[ +s-_ $1 +s-o u +s-s [ s-z s.$ s.* @@ -25861,8 +25821,8 @@ s.8 s.9 s.; s.C -s.a$i -s.cD6 +s.a $i +s.c D6 s.e s.f s.g @@ -25871,46 +25831,46 @@ s.m s.o s.p s.x -s.x'7 -s.zlO51 +s.x '7 +s.z l O51 s/ s/? s/B s/i s/y s0 -s0 q -s0 z2 +s0 q +s0 z2 s0! -s0"'7i0B -s0%O31 +s0" '7 i0B +s0% O31 s0& s0) -s0*+6 +s0* +6 s0+ -s0+c -s0,D0 -s0,D7 +s0+ c +s0, D0 +s0, D7 s0- -s0-+6 +s0- +6 s0. s0/ -s01o17 +s01 o17 s02 s03 -s03*87 -s03p1 +s03 *87 +s03 p1 s04 s05 -s05+8 +s05 +8 s06 -s06O29+1 +s06 O29 +1 s07 -s07*13 -s08$3 -s08+7 +s07 *13 +s08 $3 +s08 +7 s09 -s09O81 +s09 O81 s0< s0@ s0A @@ -25919,127 +25879,127 @@ s0C s0D s0E s0F -s0FO37 -s0Gu +s0F O37 +s0G u s0J s0K s0M -s0PC -s0R@i-3 +s0P C +s0R @i -3 s0S -s0SZ2l -s0T[T1 -s0UD3t +s0S Z2 l +s0T [ T1 +s0U D3 t s0X -s0X'7D3 +s0X '7 D3 s0Y s0Z s0\ s0^ -s0^Z1 +s0^ Z1 s0_ -s0_[ +s0_ [ s0` s0a -s0aT9 +s0a T9 s0b s0c s0d s0e s0f s0g -s0g[ -s0h-0 +s0g [ +s0h -0 s0i s0j -s0j*04 +s0j *04 s0k -s0k-4 +s0k -4 s0m -s0m[C -s0mp1 -s0mz2 +s0m [ C +s0m p1 +s0m z2 s0n s0o -s0oc +s0o c s0q -s0q-4 -s0qd +s0q -4 +s0q d s0r -s0rL1 +s0r L1 s0s s0v s0w s0x -s0xc +s0x c s0y -s0y$a +s0y $a s0z -s0zO06 +s0z O06 s0| s1 -s1 [ +s1 [ s1! -s1!Z2 -s1!Z2$0 +s1! Z2 +s1! Z2 $0 s1# -s1#'8 -s1#^d +s1# '8 +s1# ^d s1$ s1% s1& -s1*D4 +s1* D4 s1+ s1- s1. s1/ s10 s12 -s12@e -s12oA0 +s12 @e +s12 oA0 s13 -s13D3 -s13Z1 +s13 D3 +s13 Z1 s14 s15 -s15-2 -s15shk +s15 -2 +s15 shk s16 -s16l +s16 l s17 -s17@b +s17 @b s18 -s18*85 -s18L6 -s18Z1 -s18u -s18O08$? -s18O26 +s18 *85 +s18 L6 +s18 Z1 +s18 u +s18 O08 $? +s18 O26 s19 -s19Z1 +s19 Z1 s1; s1= -s1=i04 -s1>z2 +s1= i04 +s1> z2 s1? -s1?T7o0C +s1? T7 o0C s1@ s1A s1B -s1Bt +s1B t s1D s1E s1F s1I s1K -s1Kc +s1K c s1L -s1NuZ2 +s1N u Z2 s1P -s1Rq +s1R q s1S s1U -s1U'5@b +s1U '5 @b s1V s1W s1X @@ -26047,355 +26007,355 @@ s1^ s1_ s1` s1a -s1asgF +s1a sgF s1c -s1cR0 +s1c R0 s1d s1e -s1eoAd -s1f'B +s1e oAd +s1f 'B s1g -s1gD0 +s1g D0 s1h s1i s1k -s1kd +s1k d s1l s1m s1n s1o s1p -s1pu +s1p u s1q -s1ql +s1q l s1r -s1r^1{ -s1rz4 +s1r ^1 { +s1r z4 s1s s1t s1u -s1u*37 +s1u *37 s1v -s1v*21 +s1v *21 s1w -s1w-4 -s1w-9 -s1wr +s1w -4 +s1w -9 +s1w r s1x s1y -s1y{ +s1y { s1z s2 -s2 'B +s2 'B s2! -s2!Z4@c -s2!^a +s2! Z4 @c +s2! ^a s2# s2$ s2* -s2**5AO43 -s2*Z2 -s2*r +s2* *5A O43 +s2* Z2 +s2* r s2+ s2, s2- s2. s20 -s20$! +s20 $! s21 -s21*82'6 -s21p1O36 +s21 *82 '6 +s21 p1 O36 s23 -s23Z2 -s23d +s23 Z2 +s23 d s24 -s25Z1 -s25o2_ -s25o3m +s25 Z1 +s25 o2_ +s25 o3m s26 -s26l +s26 l s27 -s27C +s27 C s28 -s28T0 -s28Z1 +s28 T0 +s28 Z1 s29 -s29$e +s29 $e s2< s2? s2@ -s2@+0 +s2@ +0 s2A s2B -s2Bu -s2DdO1A +s2B u +s2D d O1A s2F -s2GcO51 +s2G c O51 s2H s2K s2L s2M -s2Ql +s2Q l s2T -s2U^Z +s2U ^Z s2W s2X s2Z s2^ s2_ s2a -s2ao1f +s2a o1f s2b s2c -s2c[ +s2c [ s2d s2e -s2eq +s2e q s2f s2g s2h s2i -s2i^4'6 -s2j^Y^5 -s2k$h -s2k'5 +s2i ^4 '6 +s2j ^Y ^5 +s2k $h +s2k '5 s2l -s2lc +s2l c s2p s2s s2t -s2uO32^1 +s2u O32 ^1 s2v -s2v[ +s2v [ s2w s2y -s2y$RO46 -s2yD7D6 +s2y $R O46 +s2y D7 D6 s2z -s2zO61 +s2z O61 s3 s3! s3# s3$ s3% -s3'^2Z1 +s3' ^2 Z1 s3+ -s3++3 +s3+ +3 s3, -s3.Z4 -s3.u +s3. Z4 +s3. u s30 -s30*65 +s30 *65 s31 -s31Z2 -s31o77 +s31 Z2 +s31 o77 s32 -s32^i +s32 ^i s34 -s34$8 -s34c +s34 $8 +s34 c s35 s36 -s36u +s36 u s37 -s37L1 +s37 L1 s38 -s38+8 -s38c -s38O52 +s38 +8 +s38 c +s38 O52 s39 -s3?Z1 +s3? Z1 s3@ s3A -s3At +s3A t s3E s3F -s3GcO92 -s3Hz1 -s3K-5 -s3L[ +s3G c O92 +s3H z1 +s3K -5 +s3L [ s3S -s3Tf +s3T f s3V -s3W+5D5 +s3W D5 s3X s3Y s3[ s3^ s3_ -s3`l +s3` l s3a s3b s3c -s3d} +s3d } s3e -s3e$7 -s3e+5 +s3e $7 +s3e +5 s3f -s3fO03o48 -s3gO32 +s3f O03 o48 +s3g O32 s3h -s3iD7 +s3i D7 s3j s3k s3l -s3l*65 +s3l *65 s3m s3o s3q -s3qp1 +s3q p1 s3r -s3s[ -s3s^c +s3s [ +s3s ^c s3t -s3tr +s3t r s3u -s3ui1g +s3u i1g s3x s3y s3z -s3zi3ti0K +s3z i3t i0K s3} -s3}R5 +s3} R5 s4 -s4 Z1 -s4 i0z*15 +s4 Z1 +s4 i0z *15 s4$ s4% s4& -s4&i1o'7 -s4*u -s4+Z3 -s4+c +s4& i1o '7 +s4* u +s4+ Z3 +s4+ c s4, s4- s4. -s4/Z2 +s4/ Z2 s40 s41 s42 -s42Z1 +s42 Z1 s43 -s43s./ +s43 s./ s45 -s45s69 +s45 s69 s46 s47 -s47q +s47 q s48 s49 -s49*07 -s49o0l -s4:o5sc +s49 *07 +s49 o0l +s4: o5s c s4A s4C s4F s4G -s4HO02^w +s4H O02 ^w s4I -s4MO27^V +s4M O27 ^V s4O s4R s4X s4\ -s4^i5mO07 +s4^ i5m O07 s4_ -s4_O71 +s4_ O71 s4a s4b s4e s4f -s4gZ1 +s4g Z1 s4i s4j -s4j-3 +s4j -3 s4k -s4kOA1 -s4n^M -s4no6g +s4k OA1 +s4n ^M +s4n o6g s4o -s4o@9 -s4oZ2 +s4o @9 +s4o Z2 s4p -s4qo4e +s4q o4e s4r -s4rD0 +s4r D0 s4s -s4s*30 +s4s *30 s4v -s4wu +s4w u s4x -s4x$p -s4x^E -s4yD5 -s4ys.M +s4x $p +s4x ^E +s4y D5 +s4y s.M s4z s5 -s5 Z5 +s5 Z5 s5! s5# -s5%'5+3 -s5%O41 +s5% '5 +3 +s5% O41 s5* -s5+Z1 +s5+ Z1 s5, -s5.O23 +s5. O23 s5/ s50 s51 s52 -s52'B -s52-6 -s52o71 +s52 'B +s52 -6 +s52 o71 s53 -s53T0 +s53 T0 s54 -s54-1 +s54 -1 s56 s57 s58 -s58+8 +s58 +8 s59 -s59q -s5=O42 +s59 q +s5= O42 s5G s5J s5S -s5Z*15 -s5\i0h*56 +s5Z *15 +s5\ i0h *56 s5_ -s5ai7k +s5a i7k s5b -s5bL0 +s5b L0 s5c s5d -s5do06 +s5d o06 s5e -s5el +s5e l s5f s5g -s5gT7 -s5hq +s5g T7 +s5h q s5i s5k s5m s5n -s5ni4t +s5n i4t s5o -s5o+5 -s5qZ3 -s5r$c -s5rZ1 +s5o +5 +s5q Z3 +s5r $c +s5r Z1 s5s s5t s5w -s5wo45 -s5x[ -s5yO34q +s5w o45 +s5x [ +s5y O34 q s6! -s6![ -s6$[ -s6%l +s6! [ +s6$ [ +s6% l s6* s6+ s6- @@ -26405,112 +26365,112 @@ s60 s61 s62 s63 -s63-7 +s63 -7 s64 -s64$2 -s64T5 +s64 $2 +s64 T5 s65 s67 s68 -s68scv +s68 scv s69 -s69s71 +s69 s71 s6: -s6=d +s6= d s6@ -s6BT1o0w -s6Bc +s6B T1 o0w +s6B c s6C s6J -s6K*25 +s6K *25 s6N -s6OD4 -s6SC -s6Wc +s6O D4 +s6S C +s6W c s6X -s6]*06 -s6_^|i4* +s6] *06 +s6_ ^| i4* s6a -s6aslA +s6a slA s6b -s6bR0 -s6cc +s6b R0 +s6c c s6d s6e -s6e^b +s6e ^b s6f s6g -s6jZ3r +s6j Z3 r s6k -s6lZ1z1 +s6l Z1 z1 s6m -s6mZ2 +s6m Z2 s6n s6o -s6o$7 +s6o $7 s6p -s6po3h +s6p o3h s6q s6r s6t -s6ud -s6v*37O05 +s6u d +s6v *37 O05 s6w s6y s7 -s7 O04 +s7 O04 s7! s7" s7$ -s7%u -s7&O14z3 -s7)Z4*06 +s7% u +s7& O14 z3 +s7) Z4 *06 s7+ s7- -s7--1 +s7- -1 s7. s7/ s70 -s70Z2 +s70 Z2 s71 -s71L1 +s71 L1 s72 -s72o0a +s72 o0a s73 s74 -s74+8 -s74Z2 -s74[ +s74 +8 +s74 Z2 +s74 [ s75 -s75$t +s75 $t s76 -s76-6 -s76L6c -s76c +s76 -6 +s76 L6 c +s76 c s78 -s78O32 +s78 O32 s79 -s79$m -s79i0W -s7;*26o3N +s79 $m +s79 i0W +s7; *26 o3N s7= s7C s7D -s7D$z +s7D $z s7I s7L s7M s7N s7P -s7Qq -s7V@cD0 -s7W*31 +s7Q q +s7V @c D0 +s7W *31 s7Y -s7^lD2 -s7^o3o +s7^ l D2 +s7^ o3o s7a s7b -s7bO27 +s7b O27 s7c s7d s7e @@ -26518,13 +26478,13 @@ s7f s7g s7i s7j -s7j$k +s7j $k s7l -s7nO36i0k -s7nO56 +s7n O36 i0k +s7n O56 s7q s7r -s7rO13 +s7r O13 s7s s7v s7x @@ -26532,160 +26492,160 @@ s7| s8! s8# s8$ -s8$tO46 +s8$ t O46 s8* s8, s8- s8. -s8.*07-0 +s8. *07 -0 s8/ s80 -s80$n -s80+5 -s80l -s81O32d +s80 $n +s80 +5 +s80 l +s81 O32 d s82 -s83o1f +s83 o1f s84 -s84-2R1 +s84 -2 R1 s85 s86 -s86^z -s87C +s86 ^z +s87 C s89 -s89D0 -s8:[ +s89 D0 +s8: [ s8A s8B -s8B[s6q -s8Bc -s8D-3 +s8B [ s6q +s8B c +s8D -3 s8F s8H s8J s8K -s8M*02 +s8M *02 s8O -s8Pc +s8P c s8Q s8R -s8U'5 -s8Wl +s8U '5 +s8W l s8X s8^ s8a -s8aR3Z3 -s8aT5 -s8bp1O39 +s8a R3 Z3 +s8a T5 +s8b p1 O39 s8c -s8c*01 -s8cZ1 -s8csyi +s8c *01 +s8c Z1 +s8c syi s8d s8e -s8ez3 +s8e z3 s8g s8h s8i -s8iZ1 +s8i Z1 s8j s8k s8l -s8lZ2 -s8l^y -s8ll +s8l Z2 +s8l ^y +s8l l s8m -s8mp2'7 +s8m p2 '7 s8n -s8ni4r -s8nl +s8n i4r +s8n l s8o -s8qZ1 +s8q Z1 s8t -s8t[ -s8to23 +s8t [ +s8t o23 s8u -s8uO16$W -s8uO61 -s8vO41 +s8u O16 $W +s8u O61 +s8v O41 s8x s8y s8z -s8z+7 +s8z +7 s9 -s9 D4 -s9 O01 +s9 D4 +s9 O01 s9! s9" -s9"t +s9" t s9# s9$ -s9%} +s9% } s9* -s9*z2T0 -s9,Cp2 +s9* z2 T0 +s9, C p2 s9- s9. -s9.D7 +s9. D7 s90 -s90$m -s90$y -s90[ -s90i0d +s90 $m +s90 $y +s90 [ +s90 i0d s91 -s92*57 -s92-5 +s92 *57 +s92 -5 s93 s94 -s94i45 -s94i75l +s94 i45 +s94 i75 l s95 -s95^8z3 +s95 ^8 z3 s97 -s97*67 -s97R3 -s97T4 -s97z1 +s97 *67 +s97 R3 +s97 T4 +s97 z1 s98 s9; s9@ s9B s9D -s9Es8S +s9E s8S s9G -s9Hi3M^, +s9H i3M ^, s9J -s9LO14^m -s9PO45 +s9L O14 ^m +s9P O45 s9T -s9Z*93*43 +s9Z *93 *43 s9\ s9^ s9_ -s9_Z2 -s9_r +s9_ Z2 +s9_ r s9a -s9az2 +s9a z2 s9b -s9b+5 -s9bo4vL0 -s9bO56 +s9b +5 +s9b o4v L0 +s9b O56 s9c s9d -s9d*13 +s9d *13 s9e s9f s9i s9k -s9lZ2 +s9l Z2 s9n s9o s9p s9q s9r s9u -s9u-7 -s9uO05 +s9u -7 +s9u O05 s9w s9x s9y @@ -26698,10 +26658,10 @@ s=; s?! s@" s@* -s@u +s_> u s_U -s_aO13 +s_a O13 s_i sa -sa!r +sa! r sa' -sa)$@O01 +sa) $@ O01 sa* sa+ sa- -sa-l +sa- l sa. -sa.O41 +sa. O41 sa/ sa0 -sa0D4 -sa0l +sa0 D4 +sa0 l sa1 sa2 -sa2k +sa2 k sa3 -sa3Z4 -sa3O15 +sa3 Z4 +sa3 O15 sa4 -sa4C -sa4d -sa4q -sa4u +sa4 C +sa4 d +sa4 q +sa4 u sa5 -sa5z2 +sa5 z2 sa6 sa7 -sa7D6 -sa7Z2 -sa7o0b +sa7 D6 +sa7 Z2 +sa7 o0b sa8 sa9 -sa9Z2 +sa9 Z2 sa; -sa;$a +sa; $a sa= -sa=$5 +sa= $5 sa? sa@ -sa@+1 -sa@T1 -sa@T3 -sa@c -sa@d -sa@se3 -sa@se3si! -sa@se3si1 -sa@si! -sa@si1 -sa@so0 -sa@so0se3 -sa@so0si! -sa@so0si1 -sa@so0u -sa@ss$ -sa@u +sa@ +1 +sa@ T1 +sa@ T3 +sa@ c +sa@ d +sa@ se3 +sa@ se3 si! +sa@ se3 si1 +sa@ si! +sa@ si1 +sa@ so0 +sa@ so0 se3 +sa@ so0 si! +sa@ so0 si1 +sa@ so0 u +sa@ ss$ +sa@ u saA -saA+2 -saAZ2 -saCz2u +saA +2 +saA Z2 +saC z2 u saD -saER2 -saE{ +saE R2 +saE { saF -saFc +saF c saH -saLo1Q +saL o1Q saO saP -saQc +saQ c saR -saSO23 +saS O23 saU saW saY -saZ-6 +saZ -6 sa[ sa^ -sa^z2O65 +sa^ z2 O65 sac sad -sad$5^q -sadO52 +sad $5 ^q +sad O52 sae -sae$1 -sae*74 -saeD6 -saei2m +sae $1 +sae *74 +sae D6 +sae i2m saf sag sah sai sak -sakD6 -samD4O51 +sak D6 +sam D4 O51 san -sani40 +san i40 sao -saoZ4 +sao Z4 sap -sap$y -sap} +sap $y +sap } saq -saqZ2 -saqz1 +saq Z2 +saq z1 sar -sar-6 -sari1n +sar -6 +sar i1n sas sat -satt +sat t sau -sauk -sauO43 +sau k +sau O43 sav -savR4 +sav R4 saw -sawZ1O46 +saw Z1 O46 sax -saxo3z -saxr +sax o3z +sax r say -say^Az2 -sayz4 +say ^A z2 +say z4 saz -saz@p -sazO35O23 +saz @p +saz O35 O23 sa| -sb c +sb c sb! sb# sb$ sb& -sb&z4 -sb)^L +sb& z4 +sb) ^L sb- sb/ sb0 -sb0*23^t -sb0+0+4 -sb0i0D +sb0 *23 ^t +sb0 +0 +4 +sb0 i0D sb1 -sb1z1 +sb1 z1 sb2 sb3 sb4 sb5 -sb5d -sb5o79 -sb5u +sb5 d +sb5 o79 +sb5 u sb6 sb7 -sb7R1 -sb7l +sb7 R1 +sb7 l sb8 -sb8d -sb8u +sb8 d +sb8 u sb9 -sb9R5 +sb9 R5 sb: -sbs8= +sf7 Z1 +sf9 Z1 z1 +sf> s8= sfB sfF -sfFT4 +sfF T4 sfJ -sfK*26 -sfKO05 -sfNl +sfK *26 +sfK O05 +sfN l sfO sfT -sfUR0 -sfW$! +sfU R0 +sfW $! sfX -sfZo0L +sfZ o0L sf[ sf_ sfa -sfa'A +sfa 'A sfb sfc -sfc^k +sfc ^k sfd -sfg*15z2 -sfg@g -sfgO54 +sfg *15 z2 +sfg @g +sfg O54 sfh sfj -sfjz5 +sfj z5 sfk -sfk]] -sfkOB8 +sfk ] ] +sfk OB8 sfm sfn -sfn[ +sfn [ sfo sfp sfq -sfqi0z^3 +sfq i0z ^3 sfr -sfrD4 +sfr D4 sfs -sfs$! -sfsZ2 +sfs $! +sfs Z2 sfB u sft -sfv*86 +sfv *86 sfw -sfy$o +sfy $o sfz -sf{c -sg t +sf{ c +sg t sg# -sg#$* +sg# $* sg$ sg- sg1 -sg2] +sg2 ] sg3 sg4 -sg4*26 +sg4 *26 sg5 sg6 -sg6^0 +sg6 ^0 sg8 sg9 -sg9$f -sg9d -sg9u +sg9 $f +sg9 d +sg9 u sgC sgD sgE sgF -sgH[ +sgH [ sgJ sgN -sgOu +sgO u sgR -sgSc +sgS c sgT -sgTu +sgT u sgU -sgU^r +sgU ^r sgY -sg_+4*64 +sg_ +4 *64 sga -sgaZ4 +sga Z4 sgb sgc -sgf^r -sghl -sghO24 +sgf ^r +sgh l +sgh O24 sgi sgj -sgjL5 -sgk'B -sgki6u +sgj L5 +sgk 'B +sgk i6u sgl -sgl$9 -sgll -sgml +sgl $9 +sgl l +sgm l sgn -sgn-2 -sgnT0^j +sgn -2 +sgn T0 ^j sgo -sgo'7u +sgo '7 u sgp sgq -sgqt +sgq t sgr sgs sgt sgv -sgvo0m +sgv o0m sgw -sgw$7 -sgwD3 -sgwp1 +sgw $7 +sgw D3 +sgw p1 sgx -sgxo5d*13 +sgx o5d *13 sgy sgz -sgzi0m -sh*k -sh,O14 -sh-o0g -sh0} +sgz i0m +sh* k +sh, O14 +sh- o0g +sh0 } sh2 -sh2Z2 -sh2lc -sh2O52 -sh4^2 -sh4iA0O25 +sh2 Z2 +sh2 c +sh2 O52 +sh4 ^2 +sh4 iA0 O25 sh6 sh7 -sh7K -sh8o2% +sh7 K +sh8 o2% sh9 -sh9z3 -shBO4A +sh9 z3 +shB O4A shF shL shM shO -shRZ1 +shR Z1 shS shT -shT+2L1 +shT +2 L1 shU -shVo6m -shW^@o09 -shXD4 -shYc +shV o6m +shW ^@ o09 +shX D4 +shY c shZ sh^ -sh_$g +sh_ $g sha -shao4l +sha o4l shb -shbK +shb K shc -shc$j +shc $j shd she -she^a +she ^a shf shg -shi-3 +shi -3 shj shk -shk*02^i -shkD7D3 +shk *02 ^i +shk D7 D3 shl shm -shm$m -shmt +shm $m +shm t shn -shn$ui3o -shpO01 +shn $u i3o +shp O01 shq shr -shrD6 -shrz5 +shr D6 +shr z5 shs -shs$5 +shs $5 sht shu -shvZ1 -shvO46 +shv Z1 +shv O46 shx -shxc +shx c shy -shyu +shy u shz -shz-2O31 -shz{ +shz -2 O31 +shz { si -si l +si l si! -si!T1 -si!T2 -si!T3 -si!T4 -si!T5 -si!T6 -si!T8 -si!d -si!sl1 -si!ss$ -si!ss$u -si!u +si! T1 +si! T2 +si! T3 +si! T4 +si! T5 +si! T6 +si! T8 +si! d +si! sl1 +si! ss$ +si! ss$ u +si! u si" si$ si* si+ si- -si-o1ul +si- o1u l si. si1 -si1D6 -si1T1 -si1T2 -si1T3 -si1T4 -si1T5 -si1T6 -si1T7 -si1T8 -si1d -si1se3 -si1se3u -si1ss$ -si1ss$u -si1u +si1 D6 +si1 T1 +si1 T2 +si1 T3 +si1 T4 +si1 T5 +si1 T6 +si1 T7 +si1 T8 +si1 d +si1 se3 +si1 se3 u +si1 ss$ +si1 ss$ u +si1 u si2 -si2Z1 -si2O45 +si2 Z1 +si2 O45 si3 -si3*31 +si3 *31 si4 -si4$3 +si4 $3 si5 si6 si7 si9 -si9z1 -si;*82 -si=z1 -si@O36 -siCKc -siCl -siEu +si9 z1 +si; *82 +si= z1 +si@ O36 +siC K c +siC l +siE u siG -siGz2 -siId +siG z2 +siI d siM -siNl +siN l sik -siNsNk +siN sNk siO -siP*61 -siRZ1 +siP *61 +siR Z1 siW si[ si] -si^} +si^ } sia -siaZ2 -sib*45 -sibZ1 -sic$7 +sia Z2 +sib *45 +sib Z1 +sic $7 sid sie -sieo06 -sieo6h -sifo5WO02 -sifO26 +sie o06 +sie o6h +sif o5W O02 +sif O26 sih sij -sik*41 +sik *41 sil sim sin sio -sioK -sioO23 +sio K +sio O23 sip -sipp2O4B -siqk +sip p2 O4B +siq k sir sit siu siv siw -siwO31 -six$3 +siw O31 +six $3 siy -siyO12 +siy O12 siz -sizO01 -sj D0 +siz O01 +sj D0 sj# sj$ sj% -sj%'4 -sj-{ +sj% '4 +sj- { sj. sj1 -sj2z2 +sj2 z2 sj6 -sj7{+1 +sj7 { +1 sj8 sj9 sj? @@ -27685,7 +27645,7 @@ sj@ sjB sjC sjF -sjFl +sjF l sjH sjK sjL @@ -27696,155 +27656,155 @@ sjW sjY sjb sjd -sjdZ1 +sjd Z1 sjf -sjfd -sjfO37 +sjf d +sjf O37 sjg -sjgd +sjg d sjh -sjh$r +sjh $r sjl -sjl*05O53 +sjl *05 O53 sjm sjn -sjnZ2 +sjn Z2 sjo -sjo+3 +sjo +3 sjp sjq -sjqu -sjqO28 +sjq u +sjq O28 sjr sjs -sjs+2o4s +sjs +2 o4s sjt -sjtT1T8 -sjt[ +sjt T1 T8 +sjt [ sjx sjy -sjzD4[ -sk&u +sjz D4 [ +sk& u sk- sk0 sk2 -sk4O02 -sk7Z4 +sk4 O02 +sk7 Z4 sk8 sk9 -sk9z3^; +sk9 z3 ^; sk@ skA skB skC -skD$! -skDdO76 +skD $! +skD d O76 skG skL -skL-6 +skL -6 skM -skOZ2D3 +skO Z2 D3 skP skR skT skW -skW-7 -skZk*05 +skW -7 +skZ k *05 sk[ sk] sk^ -sk^'A +sk^ 'A sk_ ska skb -skbK -skb[O23 +skb K +skb [ O23 skc -skc[ +skc [ skd ske skf -skfD9O15 +skf D9 O15 skg -skg'8 -skg^sO1A -skgo4 +skg '8 +skg ^s O1A +skg o4 skh -skho3e -skhsYc +skh o3e +skh sYc ski -skii4z -skio2i +ski i4z +ski o2i skl skm -skm-5 -skmZ1 -skn@z -skn^p -skno1o +skm -5 +skm Z1 +skn @z +skn ^p +skn o1o sko skp -skpz3 +skp z3 skq skr sks -sks^-$6 -sksz1 -sksz4 +sks ^- $6 +sks z1 +sks z4 skt sku -skwr +skw r skx sky -skyD1 -skyc -skyi0n -skyO31 +sky D1 +sky c +sky i0n +sky O31 skz -skz'6 +skz '6 sl sl! -sl"*94 -sl"t +sl" *94 +sl" t sl$ sl* sl- -sl-O31 -sl/Z2 +sl- O31 +sl/ Z2 sl1 -sl1T1 -sl1T2 -sl1T3 -sl1T4 -sl1T5 -sl1T6 -sl1T7 -sl1d -sl1u +sl1 T1 +sl1 T2 +sl1 T3 +sl1 T4 +sl1 T5 +sl1 T6 +sl1 T7 +sl1 d +sl1 u sl2 -sl2z2L3 +sl2 z2 L3 sl4 -sl4Z5 +sl4 Z5 sl5 sl6 sl7 -sl7D4 +sl7 D4 sl8 -sl8O26 +sl8 O26 sl9 sl; -sl;D1 +sl; D1 sl< -sl?o5b -sl@l +sl? o5b +sl@ l slB -slDz2O32 +slD z2 O32 slF -slGi2u +slG i2u slH slL slM -slMT2 +slM T2 slO slP slQ @@ -27852,160 +27812,160 @@ slR slS slT slU -slUO15+2 -slVi4R +slU O15 +2 +slV i4R slW -slXi1qk -slZl +slX i1q k +slZ l sl] -sl^*62*16 +sl^ *62 *16 sl_ -sl`O41O83 +sl` O41 O83 sla -slao1O +sla o1O slb -slbZ2 -slbu -slbz2O18 +slb Z2 +slb u +slb z2 O18 slc -slcD0 +slc D0 sld -sld[ +sld [ sle slf -slf*12[ -slfu +slf *12 [ +slf u slg -slh+5 -slho10 +slh +5 +slh o10 sli slj -slj$u -slj{ +slj $u +slj { slk -slkZ4 +slk Z4 slm -slm$a -slm$w +slm $a +slm $w sln -slnZ4sp! -slnO43 +sln Z4 sp! +sln O43 slo -slo+5 -sloi2l -slou +slo +5 +slo i2l +slo u slp slq -slr$0^& -slrr +slr $0 ^& +slr r sls -sls^a +sls ^a slt -slt*50 -sltT6 +slt *50 +slt T6 slu -slu$7 +slu $7 slv slw slx -slx^i +slx ^i sly -slyo8( -slyO41 -slyO43 -slz'6 +sly o8( +sly O41 +sly O43 +slz '6 sl{ sl| -sl|o10[ +sl| o10 [ sm$ -sm$dO64 -sm$p2O34 -sm&o7H +sm$ d O64 +sm$ p2 O34 +sm& o7H sm+ sm- sm. sm/ sm1 -sm1$g -sm1C -sm1L6 -sm1^a'4 -sm1^e +sm1 $g +sm1 C +sm1 L6 +sm1 ^a '4 +sm1 ^e sm2 -sm2O62 +sm2 O62 sm3 -sm3*24 +sm3 *24 sm4 -sm4D2 +sm4 D2 sm5 sm6 -sm7Z1 -sm7z4 +sm7 Z1 +sm7 z4 sm8 -sm8O21 +sm8 O21 sm; -sm@t +sm@ t smB -smC$# +smC $# smD smG -smH-0u -smHi0s -smKuZ2 +smH -0 u +smH i0s +smK u Z2 smL -smM*32{ -smO'5 +smM *32 { +smO '5 smP -smPu +smP u smQ -smRO31 -smSp2'4 +smR O31 +smS p2 '4 smW -smXo5"+6 +smX o5" +6 smZ -sm[Cc -sm]^MO16 +sm[ c +sm] ^M O16 sm` smb smc smd -smdZ1 -smdO51 +smd Z1 +smd O51 sme -smeD1 +sme D1 smf -smf^6 +smf ^6 smg -smg'5 -smg[ +smg '5 +smg [ smj -smj-3 +smj -3 smk sml -smlk -smlu +sml k +sml u smn -smnt +smn t smo -smo'8c +smo '8 c smp -smp] +smp ] smq smr sms -smsD5 +sms D5 smt -smti6iO02 -smtz1{ +smt i6i O02 +smt z1 { smu -smu+4 -smu-2 -smui4b -smuo1 +smu +4 +smu -2 +smu i4b +smu o1 smv -smvi5n +smv i5n smw -smw+5} +smw +5 } smy smz sn# @@ -28017,190 +27977,190 @@ sn- sn0 sn1 sn2 -sn2Z3 -sn3rL2 +sn2 Z3 +sn3 r L2 sn4 -sn4-5 -sn4R6 -sn5O16 +sn4 -5 +sn4 R6 +sn5 O16 sn6 -sn6c +sn6 c sn7 -sn7d -sn7u +sn7 d +sn7 u sn8 sn9 sn; -snAZ3o4y +snA Z3 o4y snB -snDD2 -snGD0O67 -snGc +snD D2 +snG D0 O67 +snG c snH -snK*02p1 -snLc +snK *02 p1 +snL c snN snR -snRo5C +snR o5C snT -snT^H +snT ^H snX -snXO08 -sn\Z1 -sn^i2Cl +snX O08 +sn\ Z1 +sn^ i2C l sn_ -sn_l +sn_ l sna snb -snb-0 -snbo0L +snb -0 +snb o0L snc -sncq -sncO1A+2 +snc q +snc O1A +2 snd -sndZ2 -sndO02 +snd Z2 +snd O02 sne snf sng -sngR0'6 -sngi3t +sng R0 '6 +sng i3t snh -snh$! -snh*64 -snh*84O54 -snhp1 -snii2+ +snh $! +snh *64 +snh *84 O54 +snh p1 +sni i2+ snj -snjo3v +snj o3v snk snl -snl'9 +snl '9 snm -snmp1O23 -snmO53 -sno@i +snm p1 O23 +snm O53 +sno @i snp snq -snqr +snq r snr sns -snsz2 +sns z2 snt -sntc +snt c snu -snusey +snu sey snv snw -snwL6 -snwo4< +snw L6 +snw o4< snx sny -snyp1 +sny p1 snz -snz'7 +snz '7 sn| -sn|fO3A +sn| f O3A so! so" so# so$ -so'O24 +so' O24 so* so, so. so0 -so0T1 -so0T2 -so0T3 -so0T4 -so0T5 -so0T6 -so0T7 -so0T8 -so0d -so0sa4 -so0se3 -so0se3si! -so0se3si1 -so0se3ss$ -so0se3u -so0si! -so0si!ss$ -so0si!u -so0si1 -so0si1ss$ -so0si1u -so0sl1 -so0sl1u -so0ss$ -so0ss$u -so0u +so0 T1 +so0 T2 +so0 T3 +so0 T4 +so0 T5 +so0 T6 +so0 T7 +so0 T8 +so0 d +so0 sa4 +so0 se3 +so0 se3 si! +so0 se3 si1 +so0 se3 ss$ +so0 se3 u +so0 si! +so0 si! ss$ +so0 si! u +so0 si1 +so0 si1 ss$ +so0 si1 u +so0 sl1 +so0 sl1 u +so0 ss$ +so0 ss$ u +so0 u so1 -so1$b+4 -so1z2 +so1 $b +4 +so1 z2 so3 -so3i4j -so3lk +so3 i4j +so3 l k so4 so5 so6 -so6Z5O09 +so6 Z5 O09 so8 so; so= so> so@ -so@O05 -soCc -soCcZ2 -soIc +so@ O05 +soC c +soC c Z2 +soI c soK soN -soNi6k +soN i6k soO -soQ$? -soQl +soQ $? +soQ l soS soT soY so] so^ soa -soa[ +soa [ sob -soc*13 +soc *13 sod -sodL2 -sod] +sod L2 +sod ] soe sof -sof-5$: +sof -5 $: sog soh soi -soi^t +soi ^t sol -somO26 +som O26 sop soq sor -sor{ +sor { sos sot sou -souR6 +sou R6 sov sow soy -soyD7@u -soyp1 -soyt -sozsjA -sp)[ +soy D7 @u +soy p1 +soy t +soz sjA +sp) [ sp+ sp. -sp/-0 +sp/ -0 sp1 sp2 sp5 @@ -28208,23 +28168,23 @@ sp6 sp9 sp= spD -spGlC -spNZ3*39 -spNO05 -spSc +spG C +spN Z3 *39 +spN O05 +spS c spT -spT*32l -spVc -spV{i3[ -spWc +spT *32 l +spV c +spV { i3[ +spW c spY -spYtl -spZl +spY l +spZ l sp[ spb -spb*50 +spb *50 spc -spck +spc k spd spf spg @@ -28233,407 +28193,407 @@ spj spk spl spm -spmK +spm K spr -sprd +spr d sps spt spu spv -spw$s -spxq +spw $s +spx q spy -spyp1 +spy p1 spz -sp}o24@a +sp} o24 @a sq -sq$z3O03 +sq$ z3 O03 sq9 sqb -sqcK -sqdo1l -sqgD3 -sqid +sqc K +sqd o1l +sqg D3 +sqi d sqk sql sqm sqw sqx -sr *65 -sr O32 +sr *65 +sr O32 sr! sr$ -sr%L2 -sr&u -sr&O1Ap2 +sr% L2 +sr& u +sr& O1A p2 sr' -sr)$/ +sr) $/ sr+ sr0 -sr0O17 +sr0 O17 sr1 -sr1$_O14 +sr1 $_ O14 sr2 -sr2R5 -sr2c -sr3$m +sr2 R5 +sr2 c +sr3 $m sr4 sr5 -sr5D1 +sr5 D1 sr6 sr7 sr8 -sr:} -sr>O54 +sr: } +sr> O54 sr? -srGl -srHO21 +srG l +srH O21 srI srJ -srLqR5 -srN[ +srL q R5 +srN [ srR srS -srTO03 -srWC -srWdl -srXo3k -srXO32 +srT O03 +srW C +srW d l +srX o3k +srX O32 srY -srYu +srY u srZ sr\ sra -sraD1 -sra{] +sra D1 +sra { ] srb -srbZ2 -src+5 -src-1 -srcO23 +srb Z2 +src +5 +src -1 +src O23 srd -sreD5 +sre D5 srf -srfc -srf}i3X +srf c +srf } i3X srg -srgr -srgsny -srgz2 +srg r +srg sny +srg z2 srh -srid -srjO32 -srjO64 +sri d +srj O32 +srj O64 srk -srkO23 +srk O23 srl -srlZ2 +srl Z2 srm srn -srn*20 -sro+4 -srp^f +srn *20 +sro +4 +srp ^f srq srs -srs$m -srssaj +srs $m +srs saj srt -srt} +srt } sru -sru} -srv^c +sru } +srv ^c srw -srw^[$m -srwt -srwz3 +srw ^[ $m +srw t +srw z3 srx -srxT3O32 +srx T3 O32 sry -sry^l +sry ^l srz -srz'4 +srz '4 sr} -sr}ur +sr} u r ss# ss$ -ss$T1 -ss$T2 -ss$T3 -ss$T4 -ss$T5 -ss$T6 -ss$T7 -ss$T8 -ss$d -ss$sl1 -ss$u +ss$ T1 +ss$ T2 +ss$ T3 +ss$ T4 +ss$ T5 +ss$ T6 +ss$ T7 +ss$ T8 +ss$ d +ss$ sl1 +ss$ u ss% ss' ss* -ss*z4Z4 -ss+O52 -ss+} +ss* z4 Z4 +ss+ O52 +ss+ } ss, ss- ss. ss0 -ss0Z2 +ss0 Z2 ss1 -ss1r +ss1 r ss2 -ss2T4 -ss2t +ss2 T4 +ss2 t ss3 -ss3Z2 -ss3d -ss3u +ss3 Z2 +ss3 d +ss3 u ss4 -ss4-6 +ss4 -6 ss5 -ss5D3 -ss5d -ss5se3 -ss5u +ss5 D3 +ss5 d +ss5 se3 +ss5 u ss6 -ss6T3 +ss6 T3 ss7 ss8 ss9 ss: -ss=u +ss= u ss> ssB -ssBu +ssB u ssC -ssEu -ssFT3 +ssE u +ssF T3 ssH -ssHsoBl +ssH soB l ssK -ssOo0| +ssO o0| ssS ssT -ssTO45 +ssT O45 ssW ssZ -ss\l +ss\ l ss^ ss_ ss` ssa -ssal +ssa l ssb -ssbk +ssb k ssc -ssdi3i -ssdO32 +ssd i3i +ssd O32 ssf -ssfZ2 -ssfO04 -ssg*75 +ssf Z2 +ssf O04 +ssg *75 ssh -sshk +ssh k ssi ssj -ssjK -ssji5r +ssj K +ssj i5r ssk -ssk-5 -sskp1 +ssk -5 +ssk p1 ssl ssm -ssm$a -ssm$m +ssm $a +ssm $m ssn -ssn*45 -ssn^1 -ssndl +ssn *45 +ssn ^1 +ssn d l sso -ssoo8#*65 -ssop1 +sso o8# *65 +sso p1 ssp -ssp+7 +ssp +7 ssr sst -sstt +sst t ssu -ssuZ3O54 -ssuz2 +ssu Z3 O54 +ssu z2 ssv -ssvo5x +ssv o5x ssw -sswi12*18 -ssxZ1 -ssxc +ssw i12 *18 +ssx Z1 +ssx c ssy -ssy] -ssyO32 +ssy ] +ssy O32 ssz -ssz+3 -sszo0s +ssz +3 +ssz o0s st -st +0 -st!^bO23 +st +0 +st! ^b O23 st# -st*R6 +st* R6 st+ st, st/ st1 -st1-0 -st1{t -st2o0j -st3z5'8 +st1 -0 +st1 { t +st2 o0j +st3 z5 '8 st4 -st4O13 -st5Z2 -st5q -st5u +st4 O13 +st5 Z2 +st5 q +st5 u st6 st7 -st7d -st7u +st7 d +st7 u st8 -st;i4$^n -st -t$A -t$D -t$E -t$F -t$Id -t$O -t$P -t$Pk -t$R -t$R[ -t$T -t$T*76 -t$V -t$^ -t$_$h -t$` -t$a -t$b -t$d+7 -t$i -t$r -t$s -t'4 -t'7Z1 -t'7sg7 -t'9 -t*04k -t*05 -t*12p1 -t*14 -t*15 -t*20 -t*21 -t*31 -t*34 -t*37 -t*46 -t*78 -t*9A -t+0 -t+2 -t+3 -t+3u -t+4Z1 -t+4^a -t+4u -t+5^D -t+6 -t+8 -t+8o0M -t+9 -t-0 -t-3 -t-6-1 -t-7 -t-7*65 -t-7O03 -t-8 -t-A -t@# -t@1 -t@3 -t@7 -t@8O32 -t@E -t@K -t@L+7 -t@Lo1! -t@O -t@Oc -t@P -t@V -t@l -t@y -tD1-3 -tD1[ -tD4sLA -tD5$` -tD8 -tD8O24 -tDAO72 -tL4 -tL5 -tL5u -tR0 -tR1 -tR1*05 -tR3 -tR4 -tR7 -tT1o1h -tT3 -tT4 -tT5 -tT6O58 -tT9 -tZ1o26 -tZ1O45 -tZ3 -tZ3+8 -tZ3[ -tZ4 -tZ5O12 -t[ -t]{ -t^! -t^1 -t^1$2 -t^2O43 -t^6O3A -t^7 -t^FD5 -t^L -t^R+5 -t^Ss14 -t^V -t^W -t^Z -t^\ -t^b -t^d -t^e -t^f -t^j -t^o -t^p -t^t} -t^vL1 -t^{^' -tc^Z -td -tdOA4 -tfO3B -tfO4A -tf} -ti0B -ti0Q -ti1-Z1 -ti11 -ti1M -ti1Q -ti1S -ti1au -ti1v^B -ti22 -ti2F -ti2G -ti2P -ti2c -ti2y -ti3 -ti3.o55 -ti3G -ti3K -ti3L -ti3e -ti3p -ti3z -ti4* -ti4A[ -ti4C$7 -ti4G -ti4O$5 -ti4a^Q -ti4y -ti5N -ti5e -ti5y -ti62 -ti6O -ti7B -ti7P -ti7S -ti7l -ti9N -tl+A -to06 -to07O74 -to0F -to0H -to0S -to0V -to0Y -to0f -to0m -to0n -to0o -to1B -to1Cc -to1I -to1Ou -to1U -to1Z -to1y -to2 -to28o4M -to2FO32 -to2K -to2S -to2T -to2` -to2a -to2z -to3" -to30'6 -to3Cd -to3G -to3L$e -to3Lz1 -to3Rr -to3f -to3f$1 -to3kO21 -to4# -to42 -to4E -to4T -to4` -to4oT6 -to4y -to5 -to54 -to5J -to5TO81 -to5dD0 -to5k -to5s -to5u -to6 -to61 -to66 -to6F -to6z -to7! -to71O25 -to77 -to7K -to7S -to7X -to7_*41 -to7d -to7x -to82 -to86 -to8I -to8J -to8L -to8O -to8T -to9P -toA1O34 -tp1*41 -tp1^u -tp1z2 -tp2 -tp2O82 -tq+5 -tqZ2 -trD2 -ts0D -ts0Y -ts0e -ts0w -ts1n -ts2) -ts3e -ts4U -ts4f -ts52 -ts6b -ts6zl -ts7Kt -ts9! -tsBZ -tsF9 -tsJk -tsLH -tsLN -tsMD -tsN8 -tsNs -tsS9 -tsTc -tsTku -tsUR -tsUe -tsV6$Z -tsVFc -tsVG -tsXB -tsZK -tsgX -tskC -tui7Z -tO02O17 -tO03 -tO04 -tO04f -tO05 -tO06 -tO12 -tO12i3J -tO14O27 -tO15z1 -tO16p1 -tO17+0 -tO23 -tO24 -tO26 -tO31z1 -tO32 -tO32Z3 -tO32[ -tO34 -tO36 -tO38 -tO41i5a -tO42 -tO45 -tO46 -tO48 -tO52 -tO54 -tO57 -tO61 -tO62 -tO62@2 -tO63^9 -tO72 -tO74 -tO82 -tO93 -tOA2 -tz1^% -tz1O07 -tz2 -tz2L2 -tz2O0B -tz2O63 -tz2z3 -tz3 -t{*54 -t} -t}k +t $! +t $! sR< +t $" +t $( +t $* +t $, +t $- s8] +t $4 i10 +t $6 +t $8 z3 +t $; +t $= +t $> +t $A +t $D +t $E +t $F +t $I d +t $O +t $P +t $P k +t $R +t $R [ +t $T +t $T *76 +t $V +t $^ +t $_ $h +t $` +t $a +t $b +t $d +7 +t $i +t $r +t $s +t '4 +t '7 Z1 +t '7 sg7 +t '9 +t *04 k +t *05 +t *12 p1 +t *14 +t *15 +t *20 +t *21 +t *31 +t *34 +t *37 +t *46 +t *78 +t *9A +t +0 +t +2 +t +3 +t +3 u +t +4 Z1 +t +4 ^a +t +4 u +t +5 ^D +t +6 +t +8 +t +8 o0M +t +9 +t -0 +t -3 +t -6 -1 +t -7 +t -7 *65 +t -7 O03 +t -8 +t -A +t @# +t @1 +t @3 +t @7 +t @8 O32 +t @E +t @K +t @L +7 +t @L o1! +t @O +t @O c +t @P +t @V +t @l +t @y +t D1 -3 +t D1 [ +t D4 sLA +t D5 $` +t D8 +t D8 O24 +t DA O72 +t L4 +t L5 +t L5 u +t R0 +t R1 +t R1 *05 +t R3 +t R4 +t R7 +t o1h +t T3 +t T4 +t T5 +t T6 O58 +t T9 +t Z1 o26 +t Z1 O45 +t Z3 +t Z3 +8 +t Z3 [ +t Z4 +t Z5 O12 +t [ +t ] { +t ^! +t ^1 +t ^1 $2 +t ^2 O43 +t ^6 O3A +t ^7 +t ^F D5 +t ^L +t ^R +5 +t ^S s14 +t ^V +t ^W +t ^Z +t ^\ +t ^b +t ^d +t ^e +t ^f +t ^j +t ^o +t ^p +t ^t } +t ^v L1 +t ^{ ^' +c ^Z +t d +t d OA4 +t f O3B +t f O4A +t f } +t i0B +t i0Q +t i1- Z1 +t i11 +t i1M +t i1Q +t i1S +i1a u +t i1v ^B +t i22 +t i2F +t i2G +t i2P +t i2c +t i2y +t i3 +t i3. o55 +t i3G +t i3K +t i3L +t i3e +t i3p +t i3z +t i4* +t i4A [ +t i4C $7 +t i4G +t i4O $5 +t i4a ^Q +t i4y +t i5N +t i5e +t i5y +t i62 +t i6O +t i7B +t i7P +t i7S +t i7l +t i9N +l +A +t o06 +t o07 O74 +t o0F +t o0H +t o0S +t o0V +t o0Y +t o0f +t o0m +t o0n +t o0o +t o1B +o1C c +t o1I +o1O u +t o1U +t o1Z +t o1y +t o2 +t o28 o4M +t o2F O32 +t o2K +t o2S +t o2T +t o2` +t o2a +t o2z +t o3" +t o30 '6 +t o3C d +t o3G +t o3L $e +t o3L z1 +t o3R r +t o3f +t o3f $1 +t o3k O21 +t o4# +t o42 +t o4E +t o4T +t o4` +t o4o T6 +t o4y +t o5 +t o54 +t o5J +t o5T O81 +t o5d D0 +t o5k +t o5s +t o5u +t o6 +t o61 +t o66 +t o6F +t o6z +t o7! +t o71 O25 +t o77 +t o7K +t o7S +t o7X +t o7_ *41 +t o7d +t o7x +t o82 +t o86 +t o8I +t o8J +t o8L +t o8O +t o8T +t o9P +t oA1 O34 +t p1 *41 +t p1 ^u +t p1 z2 +t p2 +t p2 O82 +t q +5 +t q Z2 +t r D2 +t s0D +t s0Y +t s0e +t s0w +t s1n +t s2) +t s3e +t s4U +t s4f +t s52 +t s6b +s6z l +t s7K t +t s9! +t sBZ +t sF9 +t sJk +t sLH +t sLN +t sMD +t sN8 +t sNs +t sS9 +t sTc +t sTk u +t sUR +t sUe +t sV6 $Z +t sVF c +t sVG +t sXB +t sZK +t sgX +t skC +u i7Z +t O02 O17 +t O03 +t O04 +t O04 f +t O05 +t O06 +t O12 +t O12 i3J +t O14 O27 +t O15 z1 +t O16 p1 +t O17 +0 +t O23 +t O24 +t O26 +t O31 z1 +t O32 +t O32 Z3 +t O32 [ +t O34 +t O36 +t O38 +t O41 i5a +t O42 +t O45 +t O46 +t O48 +t O52 +t O54 +t O57 +t O61 +t O62 +t O62 @2 +t O63 ^9 +t O72 +t O74 +t O82 +t O93 +t OA2 +t z1 ^% +t z1 O07 +t z2 +t z2 L2 +t z2 O0B +t z2 O63 +t z2 z3 +t z3 +t { *54 +t } +t } k u -u$!d] -u$# -u$$ -u$&d] -u$* -u$+ -u$+d] -u$- -u$-d] -u$. -u$0 -u$0$0 -u$0$0$0 -u$0$0$1 -u$0$0$7 -u$0$1 -u$0$2 -u$0$3 -u$0$4 -u$0$5 -u$0$6 -u$0$7 -u$0$8 -u$0$9 -u$0d] -u$1$0 -u$1$1 -u$1$1$1 -u$1$2 -u$1$2$3 -u$1$2$3$4 -u$1$2$3$4$5 -u$1$2$3$4$5$6 -u$1$2$3$a$b$c -u$1$2$a$b -u$1$3 -u$1$4 -u$1$5 -u$1$6 -u$1$7 -u$1$8 -u$1$9 -u$1$9$6$0 -u$1$9$6$1 -u$1$9$6$2 -u$1$9$6$3 -u$1$9$6$4 -u$1$9$6$5 -u$1$9$6$6 -u$1$9$6$7 -u$1$9$6$8 -u$1$9$6$9 -u$1$9$7$0 -u$1$9$7$1 -u$1$9$7$2 -u$1$9$7$3 -u$1$9$7$4 -u$1$9$7$5 -u$1$9$7$6 -u$1$9$7$7 -u$1$9$7$8 -u$1$9$7$9 -u$1$9$8$0 -u$1$9$8$1 -u$1$9$8$2 -u$1$9$8$3 -u$1$9$8$4 -u$1$9$8$5 -u$1$9$8$6 -u$1$9$8$7 -u$1$9$8$8 -u$1$9$8$9 -u$1$9$9$0 -u$1$9$9$1 -u$1$9$9$2 -u$1$9$9$3 -u$1$9$9$4 -u$1$9$9$5 -u$1$9$9$6 -u$1$9$9$7 -u$1$9$9$8 -u$1$9$9$9 -u$1d] -u$2 -u$2$0 -u$2$0$0$0 -u$2$0$0$1 -u$2$0$0$2 -u$2$0$0$3 -u$2$0$0$4 -u$2$0$0$5 -u$2$0$0$6 -u$2$0$0$7 -u$2$0$0$8 -u$2$0$0$9 -u$2$0$1$0 -u$2$0$1$1 -u$2$0$1$2 -u$2$0$1$3 -u$2$0$1$4 -u$2$0$1$5 -u$2$0$1$6 -u$2$0$1$7 -u$2$0$1$8 -u$2$0$1$9 -u$2$0$2$0 -u$2$0$2$1 -u$2$0$2$2 -u$2$0$2$3 -u$2$0$2$4 -u$2$0$2$5 -u$2$0$2$6 -u$2$0$2$7 -u$2$0$2$8 -u$2$0$2$9 -u$2$1 -u$2$2 -u$2$2$2 -u$2$3 -u$2$3$4 -u$2$4 -u$2$5 -u$2$6 -u$2$7 -u$2$8 -u$2$9 -u$2^f -u$2d] -u$3$0 -u$3$1 -u$3$2 -u$3$2$1 -u$3$3 -u$3$3$3 -u$3$4 -u$3$4$5 -u$3$5 -u$3$6 -u$3$7 -u$3$8 -u$3$9 -u$3d] -u$4 -u$4$0 -u$4$1 -u$4$2 -u$4$3 -u$4$3$2$1 -u$4$4 -u$4$4$4 -u$4$5 -u$4$5$6 -u$4$6 -u$4$7 -u$4$8 -u$4$9 -u$4d] -u$5 -u$5$0 -u$5$1 -u$5$2 -u$5$3 -u$5$4 -u$5$4$3$2$1 -u$5$5 -u$5$5$5 -u$5$6 -u$5$6$7 -u$5$7 -u$5$8 -u$5$9 -u$5d] -u$6 -u$6$0 -u$6$1 -u$6$2 -u$6$3 -u$6$4 -u$6$5 -u$6$5$4$3$2$1 -u$6$6 -u$6$6$6 -u$6$7 -u$6$7$8 -u$6$8 -u$6$9 -u$6^\ -u$6d] -u$7 -u$7$0 -u$7$1 -u$7$2 -u$7$3 -u$7$4 -u$7$5 -u$7$6 -u$7$7 -u$7$7$7 -u$7$8 -u$7$8$9 -u$7$9 -u$7d] -u$8$0 -u$8$1 -u$8$2 -u$8$3 -u$8$4 -u$8$5 -u$8$6 -u$8$7 -u$8$8 -u$8$8$8 -u$8$9 -u$8d] -u$9 -u$9$0 -u$9$1 -u$9$2 -u$9$3 -u$9$4 -u$9$5 -u$9$6 -u$9$7 -u$9$8 -u$9$9 -u$9$9$9 -u$9Z4 -u$9d] -u$: -u$? -u$@ -u$C -u$FO23 -u$Fz4 -u$H -u$I$O -u$S^1 -u$UO52 -u$X -u$_ -u$_d] -u$a -u$bD1 -u$i -u$j^F -u$m -u$o -u$y -u$zK -u'4 -u'6 -u'A -u'B -u*04] -u*05-5 -u*21 -u*30i5) -u*32 -u*32+2 -u*51o69 -u*52 -u*56 -u*67 -u*68 -u*75D5 -u+0 -u+1 -u+2 -u+4 -u+5 -u+6 -u+6^I -u+7 -u+7R7 -u+A -u-0 -u-2 -u-3^! -u-4 -u-4$g -u-5 -u-5'6 -u-6 -u-8 -u@0 -u@1sAM -u@7 -u@A -uD0+2 -uD0D7 -uD0o47 -uD3 -uD4o3t -uD4O43 -uD6 -uD8 -uL0 -uL1+4 -uL2 -uL2T4 -uL2r -uL2z1 -uL3 -uL4 -uL4i0Y -uR0 -uR5 -uT1 -uT1D3 -uT2 -uT5[ -uT6 -uT7 -uT8 -uZ1O75 -uZ4*27 -uZ4^z -uZ5 -uZ5$0 -uZ5O57 -u[L5 -u[T2 -u[T3 -u[^N -u]$V -u]-3 -u]^* -u^# -u^$ -u^( -u^. -u^0 -u^0^0^0^2 -u^0^1^0^2 -u^0^6^9^1 -u^0^7^9^1 -u^0^8^9^1 -u^0^9^9^1 -u^1 -u^1^0^0^2 -u^1^6^9^1 -u^1^7^9^1 -u^1^8^9^1 -u^1^9^9^1 -u^2^0^0^2 -u^2^6^9^1 -u^2^7^9^1 -u^2^8^9^1 -u^2^9^9^1 -u^3 -u^3^0^0^2 -u^3^2^1 -u^3^6^9^1 -u^3^7^9^1 -u^3^8^9^1 -u^3^9^9^1 -u^4^0^0^2 -u^4^3^2^1 -u^4^6^9^1 -u^4^7^9^1 -u^4^8^9^1 -u^4^9^9^1 -u^5 -u^5^0^0^2 -u^5^4^3^2^1 -u^5^6^9^1 -u^5^7^9^1 -u^5^8^9^1 -u^5^9^9^1 -u^6 -u^6^0^0^2 -u^6^5^4^3^2^1 -u^6^6^9^1 -u^6^7^9^1 -u^6^8^9^1 -u^6^9^9^1 -u^7 -u^7^0^0^2 -u^7^6^9^1 -u^7^7^9^1 -u^7^8^9^1 -u^7^9^9^1 -u^8 -u^8^0^0^2 -u^8^6^9^1 -u^8^7^9^1 -u^8^8^9^1 -u^8^9^9^1 -u^9 -u^9^0^0^2 -u^9^6^9^1 -u^9^7^9^1 -u^9^8^9^1 -u^9^9^9^1 -u^> -u^? -u^Bi1R -u^D -u^EO41 -u^K*15 -u^M -u^Q -u^U -u^V-1 -u^Y -u^_ -u^b -u^e -u^ii60 -u^uc -u^x-1 -u^| -uc@g -uco3Q -ud'B -udO12 -uf-5 -ui0$o5V -ui0NO16 -ui1! -ui1& -ui1' -ui1* -ui1+ -ui1. -ui1.i3.$. -ui1.i3.i5.$. -ui10 -ui10i31i52i73 -ui11 -ui11i31 -ui11i31i51 -ui11i31i51i71 -ui11i31i51i71i91 -ui11i31i51i71i91iB1 -ui11i32 -ui11i32i53 -ui11i32i53i74 -ui11i32i53i74i95 -ui11i32i53i74i95iB6 -ui12 -ui13 -ui15 -ui16 -ui17 -ui18 -ui19 -ui1_ -ui2! -ui2$ -ui2& -ui2' -ui2* -ui2+ -ui2- -ui20 -ui21 -ui22 -ui23 -ui24 -ui25 -ui26 -ui27 -ui28 -ui29 -ui2D -ui2I -ui2W -ui2_ -ui3! -ui3# -ui3$ -ui3& -ui3' -ui3* -ui3+ -ui3. -ui30 -ui31 -ui32 -ui33 -ui34 -ui35 -ui36 -ui37 -ui38 -ui39 -ui3O{ -ui3_ -ui4! -ui4# -ui4$ -ui4& -ui4' -ui4+ -ui4- -ui4. -ui40 -ui41 -ui42 -ui43 -ui44 -ui45 -ui46 -ui47 -ui48 -ui49 -ui4@ -ui4C -ui4D -ui4F -ui4J -ui4L -ui4TL7 -ui4_ -ui4u} -ui5 -ui5! -ui5# -ui5$ -ui5& -ui5' -ui5* -ui5+ -ui5- -ui5. -ui50 -ui51 -ui52 -ui53 -ui54 -ui56 -ui57 -ui59 -ui5E -ui5H -ui5L -ui5Q -ui5Y -ui5Z -ui6 -ui6! -ui6# -ui6$ -ui6& -ui6' -ui6* -ui6+ -ui6- -ui6. -ui60 -ui61 -ui62 -ui63 -ui64 -ui65 -ui66 -ui67 -ui68 -ui69 -ui6P -ui6_ -ui6r -ui7(O17 -ui7N -ui88l -ui8C -ui8N -uiB3 -ukO21 -uls0? -uls0i -uo0< -uo0A -uo0B -uo0VK -uo0W -uo14 -uo1F -uo1d -uo1k -uo25t -uo2G*23 -uo2U -uo2W[ -uo2i -uo3$ -uo33 -uo3V -uo4J -uo4Q -uo4Z -uo4Z'8 -uo4c -uo4pc -uo4z -uo4{ -uo5$ -uo5= -uo5L -uo5U -uo65 -uo6A -uo6H -uo6Ro0U -uo7% -uo78 -uo7I -uo7U -uo83 -uo90 -uoA8 -up1$R -up1-5 -up2O69 -up2O76 -uqO5A -us0_@B -us0b -us1c -us1d^d -us2n -us4T -us5R -us6& -us6c -us7t -us94 -us9D -us9_ -usCK -usCY -usEs -usG! -usLH -usMK -usP= -usPC -usRN -usS!Z2 -usTG -usTzr -usVX -usX> -usYM -ut$K -ut-3 -uO03O46 -uO04p3 -uO0A -uO13 -uO14p1 -uO14z4 -uO15 -uO18^L -uO1A -uO1B -uO21+1 -uO21K -uO24 -uO26z2 -uO28 -uO35 -uO35Z1 -uO41 -uO42 -uO42z4 -uO46 -uO47 -uO53 -uO54 -uO58 -uO59O02 -uO64 -uO67 -uO74 -uO75 -uO83 -uOA1 -uOA3 -uz1 -uz1$4 -uz1*31 -uz1*61 -uz1D4 -uz2 -uz2+3 -uz3 -uz3o6B -uz3q -uz4 -uz4+4 -uz5i5C -u{Z1 -u{r -u}d -u}o2E -u}o4V -O01$N*23 -O01$j -O01$m -O01$p -O01'9 -O01+2o42 -O01@1 -O01@H -O01@k -O01Co2G -O01Kd -O01T4o2N -O01^2$y -O01^M -O01c$n -O01csRu -O01i4s -O01i4u -O01i8i -O01l$9 -O01lo6# -O01o0 -O01o1: -O01o1a -O01o2& -O01o2HC -O01o2[ -O01o3e -O01o42} -O01o4S -O01o4i -O01o4x -O01o5L -O01qt -O01qO0B -O01sl. -O01sry -O01sta -O01swf -O01tf -O01O0A -O01O54 -O01O93 -O01z4^J -O01z5Z1 -O01{^h -O02$" -O02$% -O02$* -O02$+ -O02$1 -O02$1Z2 -O02$6 -O02$B -O02$P -O02$f -O02$g -O02$k -O02$n -O02$q -O02$s -O02'4 -O02'5 -O02'A -O02*20 -O02*23 -O02*31 -O02+1 -O02+2 -O02+2$7 -O02+3 -O02+3*02 -O02+6 -O02+8 -O02+A -O02-4 -O02-7 -O02@0 -O02C -O02D3 -O02D5 -O02D6 -O02K{ -O02L5 -O02R5 -O02T5 -O02Z1 -O02Z1R2 -O02Z2 -O02Z4 -O02Z4suM -O02^% -O02^2 -O02^M -O02^U -O02^X -O02^b -O02^g -O02^j -O02^u -O02^v -O02^x -O02^y -O02d -O02f -O02f+0 -O02i0, -O02i0f -O02i2^ -O02i2l -O02i4f -O02i5e -O02i6| -O02i9i -O02k -O02o1. -O02o1n -O02o1p -O02o1z -O02o2 -O02o2- -O02o2v -O02o3y -O02o4# -O02o4- -O02o4h$9 -O02p2 -O02qz3 -O02r -O02rk -O02s51z3 -O02sAO -O02sFH -O02str -O02syl -O02t*50 -O02u -O02O13 -O02O35 -O02O46 -O02O53 -O02O63 -O02O82 -O02O91 -O02z1 -O02z1f -O02z2 -O02z3 -O02z3l -O02z5 -O02z5z2 -O02{ -O03$! -O03$# -O03$2 -O03$5 -O03$6 -O03$R -O03$^ -O03$e -O03$h -O03$i -O03$j -O03$n -O03$r -O03'6 -O03'A -O03*12*50 -O03*30 -O03*31 -O03*34 -O03+0 -O03+0sy! -O03+2 -O03+6 -O03-0 -O03@n -O03CsK9 -O03D1 -O03D4 -O03L6 -O03R0 -O03R1 -O03R2 -O03R3 -O03T6 -O03Z1$i -O03Z2*74 -O03Z3 -O03Z3z2 -O03Z4 -O03Z5 -O03^1 -O03^@ -O03^F -O03^L -O03^g -O03^u -O03^w -O03d -O03f -O03f] -O03i0-^U -O03i0T -O03i1B -O03i2B -O03i2t -O03i4L -O03i5G -O03k -O03l -O03o1q -O03o1y -O03o3O -O03o66 -O03o69 -O03o7@ -O03p2 -O03p3 -O03p4 -O03p5'9 -O03q -O03qz3 -O03s2 -O03sld -O03ts8a -O03O19 -O03O34 -O03O34^d -O03O35 -O03O43 -O03O48 -O03z1 -O03z1sc? -O03z1} -O03z5 -O03{K -O04$$ -O04$3 -O04$F -O04$r -O04$s -O04$v -O04$y -O04$| -O04'3 -O04'5 -O04'8 -O04*02 -O04*78 -O04+1 -O04-1$M -O04-1+2 -O04@f -O04@l -O04@p -O04C -O04D8 -O04L0 -O04L7 -O04R5 -O04T3 -O04Z1 -O04Z2 -O04Z3 -O04Z4 -O04Z5 -O04^ -O04^P -O04^a -O04^l -O04^m -O04^o -O04^q -O04^y -O04csRi -O04d -O04di0n -O04i0d -O04i1a -O04i22 -O04i3d'4 -O04i3p -O04i44 -O04i6 -O04i6_ -O04l -O04o0'Z5 -O04o10+9 -O04o2 -O04o3% -O04o51 -O04p2 -O04p3 -O04p4i3B -O04sN[R1 -O04sf:'7 -O04u -O04O49 -O04O61 -O04O62 -O04O74 -O04z2 -O04{ -O05$ -O05$+ -O05$/ -O05$0 -O05$4 -O05$@@3 -O05$S -O05'9 -O05'A -O05*41 -O05-2 -O05-4 -O05D3 -O05R3Z2 -O05T4 -O05Z1 -O05Z1$u -O05Z2C -O05Z4 -O05Z4C -O05Z5 -O05^# -O05^+ -O05^-q -O05^? -O05^_ -O05^h -O05^j -O05^mO64 -O05^r -O05^t@o -O05^w -O05k -O05l^3 -O05o1 -O05o1P -O05o3t -O05o4a -O05p1 -O05p1[ -O05p2 -O05p3 -O05q -O05r -O05sum -O05tZ4 -O05O41 -O05O53 -O05z2 -O05z3 -O05z5 +u $! d ] +u $# +u $$ +u $& d ] +u $* +u $+ +u $+ d ] +u $- +u $- d ] +u $. +u $0 +u $0 $0 +u $0 $0 $0 +u $0 $0 $1 +u $0 $0 $7 +u $0 $1 +u $0 $2 +u $0 $3 +u $0 $4 +u $0 $5 +u $0 $6 +u $0 $7 +u $0 $8 +u $0 $9 +u $0 d ] +u $1 $0 +u $1 $1 +u $1 $1 $1 +u $1 $2 +u $1 $2 $3 +u $1 $2 $3 $4 +u $1 $2 $3 $4 $5 +u $1 $2 $3 $4 $5 $6 +u $1 $2 $3 $a $b $c +u $1 $2 $a $b +u $1 $3 +u $1 $4 +u $1 $5 +u $1 $6 +u $1 $7 +u $1 $8 +u $1 $9 +u $1 $9 $6 $0 +u $1 $9 $6 $1 +u $1 $9 $6 $2 +u $1 $9 $6 $3 +u $1 $9 $6 $4 +u $1 $9 $6 $5 +u $1 $9 $6 $6 +u $1 $9 $6 $7 +u $1 $9 $6 $8 +u $1 $9 $6 $9 +u $1 $9 $7 $0 +u $1 $9 $7 $1 +u $1 $9 $7 $2 +u $1 $9 $7 $3 +u $1 $9 $7 $4 +u $1 $9 $7 $5 +u $1 $9 $7 $6 +u $1 $9 $7 $7 +u $1 $9 $7 $8 +u $1 $9 $7 $9 +u $1 $9 $8 $0 +u $1 $9 $8 $1 +u $1 $9 $8 $2 +u $1 $9 $8 $3 +u $1 $9 $8 $4 +u $1 $9 $8 $5 +u $1 $9 $8 $6 +u $1 $9 $8 $7 +u $1 $9 $8 $8 +u $1 $9 $8 $9 +u $1 $9 $9 $0 +u $1 $9 $9 $1 +u $1 $9 $9 $2 +u $1 $9 $9 $3 +u $1 $9 $9 $4 +u $1 $9 $9 $5 +u $1 $9 $9 $6 +u $1 $9 $9 $7 +u $1 $9 $9 $8 +u $1 $9 $9 $9 +u $1 d ] +u $2 +u $2 $0 +u $2 $0 $0 $0 +u $2 $0 $0 $1 +u $2 $0 $0 $2 +u $2 $0 $0 $3 +u $2 $0 $0 $4 +u $2 $0 $0 $5 +u $2 $0 $0 $6 +u $2 $0 $0 $7 +u $2 $0 $0 $8 +u $2 $0 $0 $9 +u $2 $0 $1 $0 +u $2 $0 $1 $1 +u $2 $0 $1 $2 +u $2 $0 $1 $3 +u $2 $0 $1 $4 +u $2 $0 $1 $5 +u $2 $0 $1 $6 +u $2 $0 $1 $7 +u $2 $0 $1 $8 +u $2 $0 $1 $9 +u $2 $0 $2 $0 +u $2 $0 $2 $1 +u $2 $0 $2 $2 +u $2 $0 $2 $3 +u $2 $0 $2 $4 +u $2 $0 $2 $5 +u $2 $0 $2 $6 +u $2 $0 $2 $7 +u $2 $0 $2 $8 +u $2 $0 $2 $9 +u $2 $1 +u $2 $2 +u $2 $2 $2 +u $2 $3 +u $2 $3 $4 +u $2 $4 +u $2 $5 +u $2 $6 +u $2 $7 +u $2 $8 +u $2 $9 +u $2 ^f +u $2 d ] +u $3 $0 +u $3 $1 +u $3 $2 +u $3 $2 $1 +u $3 $3 +u $3 $3 $3 +u $3 $4 +u $3 $4 $5 +u $3 $5 +u $3 $6 +u $3 $7 +u $3 $8 +u $3 $9 +u $3 d ] +u $4 +u $4 $0 +u $4 $1 +u $4 $2 +u $4 $3 +u $4 $3 $2 $1 +u $4 $4 +u $4 $4 $4 +u $4 $5 +u $4 $5 $6 +u $4 $6 +u $4 $7 +u $4 $8 +u $4 $9 +u $4 d ] +u $5 +u $5 $0 +u $5 $1 +u $5 $2 +u $5 $3 +u $5 $4 +u $5 $4 $3 $2 $1 +u $5 $5 +u $5 $5 $5 +u $5 $6 +u $5 $6 $7 +u $5 $7 +u $5 $8 +u $5 $9 +u $5 d ] +u $6 +u $6 $0 +u $6 $1 +u $6 $2 +u $6 $3 +u $6 $4 +u $6 $5 +u $6 $5 $4 $3 $2 $1 +u $6 $6 +u $6 $6 $6 +u $6 $7 +u $6 $7 $8 +u $6 $8 +u $6 $9 +u $6 ^\ +u $6 d ] +u $7 +u $7 $0 +u $7 $1 +u $7 $2 +u $7 $3 +u $7 $4 +u $7 $5 +u $7 $6 +u $7 $7 +u $7 $7 $7 +u $7 $8 +u $7 $8 $9 +u $7 $9 +u $7 d ] +u $8 $0 +u $8 $1 +u $8 $2 +u $8 $3 +u $8 $4 +u $8 $5 +u $8 $6 +u $8 $7 +u $8 $8 +u $8 $8 $8 +u $8 $9 +u $8 d ] +u $9 +u $9 $0 +u $9 $1 +u $9 $2 +u $9 $3 +u $9 $4 +u $9 $5 +u $9 $6 +u $9 $7 +u $9 $8 +u $9 $9 +u $9 $9 $9 +u $9 Z4 +u $9 d ] +u $: +u $? +u $@ +u $C +u $F O23 +u $F z4 +u $H +u $I $O +u $S ^1 +u $U O52 +u $X +u $_ +u $_ d ] +u $a +u $b D1 +u $i +u $j ^F +u $m +u $o +u $y +u $z K +u '4 +u '6 +u 'A +u 'B +u *04 ] +u *05 -5 +u *21 +u *30 i5) +u *32 +u *32 +2 +u *51 o69 +u *52 +u *56 +u *67 +u *68 +u *75 D5 +u +0 +u +1 +u +2 +u +4 +u +5 +u +6 +u +6 ^I +u +7 +u +7 R7 +u +A +u -0 +u -2 +u -3 ^! +u -4 +u -4 $g +u -5 +u -5 '6 +u -6 +u -8 +u @0 +u @1 sAM +u @7 +u @A +u D0 +2 +u D0 D7 +u D0 o47 +u D3 +u D4 o3t +u D4 O43 +u D6 +u D8 +u L0 +u L1 +4 +u L2 +u L2 T4 +u L2 r +u L2 z1 +u L3 +u L4 +u L4 i0Y +u R0 +u R5 +u T1 +u T1 D3 +u T2 +u T5 [ +u T6 +u T7 +u T8 +u Z1 O75 +u Z4 *27 +u Z4 ^z +u Z5 +u Z5 $0 +u Z5 O57 +u [ L5 +u [ T2 +u [ T3 +u [ ^N +u ] $V +u ] -3 +u ] ^* +u ^# +u ^$ +u ^( +u ^. +u ^0 +u ^0 ^0 ^0 ^2 +u ^0 ^1 ^0 ^2 +u ^0 ^6 ^9 ^1 +u ^0 ^7 ^9 ^1 +u ^0 ^8 ^9 ^1 +u ^0 ^9 ^9 ^1 +u ^1 +u ^1 ^0 ^0 ^2 +u ^1 ^6 ^9 ^1 +u ^1 ^7 ^9 ^1 +u ^1 ^8 ^9 ^1 +u ^1 ^9 ^9 ^1 +u ^2 ^0 ^0 ^2 +u ^2 ^6 ^9 ^1 +u ^2 ^7 ^9 ^1 +u ^2 ^8 ^9 ^1 +u ^2 ^9 ^9 ^1 +u ^3 +u ^3 ^0 ^0 ^2 +u ^3 ^2 ^1 +u ^3 ^6 ^9 ^1 +u ^3 ^7 ^9 ^1 +u ^3 ^8 ^9 ^1 +u ^3 ^9 ^9 ^1 +u ^4 ^0 ^0 ^2 +u ^4 ^3 ^2 ^1 +u ^4 ^6 ^9 ^1 +u ^4 ^7 ^9 ^1 +u ^4 ^8 ^9 ^1 +u ^4 ^9 ^9 ^1 +u ^5 +u ^5 ^0 ^0 ^2 +u ^5 ^4 ^3 ^2 ^1 +u ^5 ^6 ^9 ^1 +u ^5 ^7 ^9 ^1 +u ^5 ^8 ^9 ^1 +u ^5 ^9 ^9 ^1 +u ^6 +u ^6 ^0 ^0 ^2 +u ^6 ^5 ^4 ^3 ^2 ^1 +u ^6 ^6 ^9 ^1 +u ^6 ^7 ^9 ^1 +u ^6 ^8 ^9 ^1 +u ^6 ^9 ^9 ^1 +u ^7 +u ^7 ^0 ^0 ^2 +u ^7 ^6 ^9 ^1 +u ^7 ^7 ^9 ^1 +u ^7 ^8 ^9 ^1 +u ^7 ^9 ^9 ^1 +u ^8 +u ^8 ^0 ^0 ^2 +u ^8 ^6 ^9 ^1 +u ^8 ^7 ^9 ^1 +u ^8 ^8 ^9 ^1 +u ^8 ^9 ^9 ^1 +u ^9 +u ^9 ^0 ^0 ^2 +u ^9 ^6 ^9 ^1 +u ^9 ^7 ^9 ^1 +u ^9 ^8 ^9 ^1 +u ^9 ^9 ^9 ^1 +u ^> +u ^? +u ^B i1R +u ^D +u ^E O41 +u ^K *15 +u ^M +u ^Q +u ^U +u ^V -1 +u ^Y +u ^_ +u ^b +u ^e +u ^i i60 +^u c +u ^x -1 +u ^| +c @g +c o3Q +u d 'B +u d O12 +u f -5 +u i0$ o5V +u i0N O16 +u i1! +u i1& +u i1' +u i1* +u i1+ +u i1. +u i1. i3. $. +u i1. i3. i5. $. +u i10 +u i10 i31 i52 i73 +u i11 +u i11 i31 +u i11 i31 i51 +u i11 i31 i51 i71 +u i11 i31 i51 i71 i91 +u i11 i31 i51 i71 i91 iB1 +u i11 i32 +u i11 i32 i53 +u i11 i32 i53 i74 +u i11 i32 i53 i74 i95 +u i11 i32 i53 i74 i95 iB6 +u i12 +u i13 +u i15 +u i16 +u i17 +u i18 +u i19 +u i1_ +u i2! +u i2$ +u i2& +u i2' +u i2* +u i2+ +u i2- +u i20 +u i21 +u i22 +u i23 +u i24 +u i25 +u i26 +u i27 +u i28 +u i29 +u i2D +u i2I +u i2W +u i2_ +u i3! +u i3# +u i3$ +u i3& +u i3' +u i3* +u i3+ +u i3. +u i30 +u i31 +u i32 +u i33 +u i34 +u i35 +u i36 +u i37 +u i38 +u i39 +u i3O { +u i3_ +u i4! +u i4# +u i4$ +u i4& +u i4' +u i4+ +u i4- +u i4. +u i40 +u i41 +u i42 +u i43 +u i44 +u i45 +u i46 +u i47 +u i48 +u i49 +u i4@ +u i4C +u i4D +u i4F +u i4J +u i4L +u i4T L7 +u i4_ +u i4u } +u i5 +u i5! +u i5# +u i5$ +u i5& +u i5' +u i5* +u i5+ +u i5- +u i5. +u i50 +u i51 +u i52 +u i53 +u i54 +u i56 +u i57 +u i59 +u i5E +u i5H +u i5L +u i5Q +u i5Y +u i5Z +u i6 +u i6! +u i6# +u i6$ +u i6& +u i6' +u i6* +u i6+ +u i6- +u i6. +u i60 +u i61 +u i62 +u i63 +u i64 +u i65 +u i66 +u i67 +u i68 +u i69 +u i6P +u i6_ +u i6r +u i7( O17 +u i7N +i88 l +u i8C +u i8N +u iB3 +u k O21 +l s0? +l s0i +u o0< +u o0A +u o0B +u o0V K +u o0W +u o14 +u o1F +u o1d +u o1k +u o25 t +u o2G *23 +u o2U +u o2W [ +u o2i +u o3$ +u o33 +u o3V +u o4J +u o4Q +u o4Z +u o4Z '8 +u o4c +o4p c +u o4z +u o4{ +u o5$ +u o5= +u o5L +u o5U +u o65 +u o6A +u o6H +u o6R o0U +u o7% +u o78 +u o7I +u o7U +u o83 +u o90 +u oA8 +u p1 $R +u p1 -5 +u p2 O69 +u p2 O76 +u q O5A +u s0_ @B +u s0b +u s1c +u s1d ^d +u s2n +u s4T +u s5R +u s6& +u s6c +u s7t +u s94 +u s9D +u s9_ +u sCK +u sCY +u sEs +u sG! +u sLH +u sMK +u sP= +u sPC +u sRN +u sS! Z2 +u sTG +u sTz r +u sVX +u sX> +u sYM +u t $K +u t -3 +u O03 O46 +u O04 p3 +u O0A +u O13 +u O14 p1 +u O14 z4 +u O15 +u O18 ^L +u O1A +u O1B +u O21 +1 +u O21 K +u O24 +u O26 z2 +u O28 +u O35 +u O35 Z1 +u O41 +u O42 +u O42 z4 +u O46 +u O47 +u O53 +u O54 +u O58 +u O59 O02 +u O64 +u O67 +u O74 +u O75 +u O83 +u OA1 +u OA3 +u z1 +u z1 $4 +u z1 *31 +u z1 *61 +u z1 D4 +u z2 +u z2 +3 +u z3 +u z3 o6B +u z3 q +u z4 +u z4 +4 +u z5 i5C +u { Z1 +u { r +u } d +u } o2E +u } o4V +O01 $N *23 +O01 $j +O01 $m +O01 $p +O01 '9 +O01 +2 o42 +O01 @1 +O01 @H +O01 @k +O01 C o2G +O01 K d +O01 T4 o2N +O01 ^2 $y +O01 ^M +O01 c $n +O01 c sRu +O01 i4s +O01 i4u +O01 i8i +O01 l $9 +O01 l o6# +O01 o0 +O01 o1: +O01 o1a +O01 o2& +O01 o2H C +O01 o2[ +O01 o3e +O01 o42 } +O01 o4S +O01 o4i +O01 o4x +O01 o5L +O01 q t +O01 q O0B +O01 sl. +O01 sry +O01 sta +O01 swf +O01 t f +O01 O0A +O01 O54 +O01 O93 +O01 z4 ^J +O01 z5 Z1 +O01 { ^h +O02 $" +O02 $% +O02 $* +O02 $+ +O02 $1 +O02 $1 Z2 +O02 $6 +O02 $B +O02 $P +O02 $f +O02 $g +O02 $k +O02 $n +O02 $q +O02 $s +O02 '4 +O02 '5 +O02 'A +O02 *20 +O02 *23 +O02 *31 +O02 +1 +O02 +2 +O02 +2 $7 +O02 +3 +O02 +3 *02 +O02 +6 +O02 +8 +O02 +A +O02 -4 +O02 -7 +O02 @0 +O02 C +O02 D3 +O02 D5 +O02 D6 +O02 K { +O02 L5 +O02 R5 +O02 T5 +O02 Z1 +O02 Z1 R2 +O02 Z2 +O02 Z4 +O02 Z4 suM +O02 ^% +O02 ^2 +O02 ^M +O02 ^U +O02 ^X +O02 ^b +O02 ^g +O02 ^j +O02 ^u +O02 ^v +O02 ^x +O02 ^y +O02 d +O02 f +O02 f +0 +O02 i0, +O02 i0f +O02 i2^ +O02 i2l +O02 i4f +O02 i5e +O02 i6| +O02 i9i +O02 k +O02 o1. +O02 o1n +O02 o1p +O02 o1z +O02 o2 +O02 o2- +O02 o2v +O02 o3y +O02 o4# +O02 o4- +O02 o4h $9 +O02 p2 +O02 q z3 +O02 r +O02 r k +O02 s51 z3 +O02 sAO +O02 sFH +O02 str +O02 syl +O02 t *50 +O02 u +O02 O13 +O02 O35 +O02 O46 +O02 O53 +O02 O63 +O02 O82 +O02 O91 +O02 z1 +O02 z1 f +O02 z2 +O02 z3 +O02 z3 l +O02 z5 +O02 z5 z2 +O02 { +O03 $! +O03 $# +O03 $2 +O03 $5 +O03 $6 +O03 $R +O03 $^ +O03 $e +O03 $h +O03 $i +O03 $j +O03 $n +O03 $r +O03 '6 +O03 'A +O03 *12 *50 +O03 *30 +O03 *31 +O03 *34 +O03 +0 +O03 +0 sy! +O03 +2 +O03 +6 +O03 -0 +O03 @n +O03 C sK9 +O03 D1 +O03 D4 +O03 L6 +O03 R0 +O03 R1 +O03 R2 +O03 R3 +O03 T6 +O03 Z1 $i +O03 Z2 *74 +O03 Z3 +O03 Z3 z2 +O03 Z4 +O03 Z5 +O03 ^1 +O03 ^@ +O03 ^F +O03 ^L +O03 ^g +O03 ^u +O03 ^w +O03 d +O03 f +O03 f ] +O03 i0- ^U +O03 i0T +O03 i1B +O03 i2B +O03 i2t +O03 i4L +O03 i5G +O03 k +O03 l +O03 o1q +O03 o1y +O03 o3O +O03 o66 +O03 o69 +O03 o7@ +O03 p2 +O03 p3 +O03 p4 +O03 p5 '9 +O03 q +O03 q z3 +O03 s2 +O03 sld +O03 t s8a +O03 O19 +O03 O34 +O03 O34 ^d +O03 O35 +O03 O43 +O03 O48 +O03 z1 +O03 z1 sc? +O03 z1 } +O03 z5 +O03 { K +O04 $$ +O04 $3 +O04 $F +O04 $r +O04 $s +O04 $v +O04 $y +O04 $| +O04 '3 +O04 '5 +O04 '8 +O04 *02 +O04 *78 +O04 +1 +O04 -1 $M +O04 -1 +2 +O04 @f +O04 @l +O04 @p +O04 C +O04 D8 +O04 L0 +O04 L7 +O04 R5 +O04 T3 +O04 Z1 +O04 Z2 +O04 Z3 +O04 Z4 +O04 Z5 +O04 ^ +O04 ^P +O04 ^a +O04 ^l +O04 ^m +O04 ^o +O04 ^q +O04 ^y +O04 c sRi +O04 d +O04 d i0n +O04 i0d +O04 i1a +O04 i22 +O04 i3d '4 +O04 i3p +O04 i44 +O04 i6 +O04 i6_ +O04 l +O04 o0' Z5 +O04 o10 +9 +O04 o2 +O04 o3% +O04 o51 +O04 p2 +O04 p3 +O04 p4 i3B +O04 sN[ R1 +O04 sf: '7 +O04 u +O04 O49 +O04 O61 +O04 O62 +O04 O74 +O04 z2 +O04 { +O05 $ +O05 $+ +O05 $/ +O05 $0 +O05 $4 +O05 $@ @3 +O05 $S +O05 '9 +O05 'A +O05 *41 +O05 -2 +O05 -4 +O05 D3 +O05 R3 Z2 +O05 T4 +O05 Z1 +O05 Z1 $u +O05 Z2 C +O05 Z4 +O05 Z4 C +O05 Z5 +O05 ^# +O05 ^+ +O05 ^- q +O05 ^? +O05 ^_ +O05 ^h +O05 ^j +O05 ^m O64 +O05 ^r +O05 ^t @o +O05 ^w +O05 k +O05 l ^3 +O05 o1 +O05 o1P +O05 o3t +O05 o4a +O05 p1 +O05 p1 [ +O05 p2 +O05 p3 +O05 q +O05 r +O05 sum +O05 t Z4 +O05 O41 +O05 O53 +O05 z2 +O05 z3 +O05 z5 O06 -O06$1 -O06$H -O06$Z -O06$]p1 -O06$y -O06'9 -O06'A -O06'B -O06*20 -O06-1 -O06-3 -O06-8 -O06@9 -O06R1 -O06R4 -O06Z1 -O06Z1-0 -O06Z4l -O06^2 -O06d -O06dp3 -O06dt -O06dz2 -O06f -O06i2. -O06i2h -O06i49 -O06i62 -O06i7i -O06o2- -O06o2S -O06o3N -O06o3R -O06o99 -O06p2 -O06p2[ -O06q -O06sk@ -O06szy -O06u -O06O13 -O06O32 -O06z1^e -O06z3 -O06z3$0 -O06{ +O06 $1 +O06 $H +O06 $Z +O06 $] p1 +O06 $y +O06 '9 +O06 'A +O06 'B +O06 *20 +O06 -1 +O06 -3 +O06 -8 +O06 @9 +O06 R1 +O06 R4 +O06 Z1 +O06 Z1 -0 +O06 Z4 l +O06 ^2 +O06 d +O06 d p3 +O06 d t +O06 d z2 +O06 f +O06 i2. +O06 i2h +O06 i49 +O06 i62 +O06 i7i +O06 o2- +O06 o2S +O06 o3N +O06 o3R +O06 o99 +O06 p2 +O06 p2 [ +O06 q +O06 sk@ +O06 szy +O06 u +O06 O13 +O06 O32 +O06 z1 ^e +O06 z3 +O06 z3 $0 +O06 { O07 -O07$- -O07$1 -O07$n -O07'7 -O07+2 -O07+5 -O07-0 -O07-1 -O07-6 -O07D1 -O07D5 -O07R4 -O07T0 -O07Z1 -O07Z2 -O07Z3 -O07Z4 -O07^k -O07^s -O07^t -O07d -O07dO42 -O07i1n -O07i2H -O07k -O07o0Z -O07o2 -O07o4z -O07shv -O07slk -O07t -O07to1 -O07u$I -O07u^F -O07O21 -O07O39 -O07O74 -O07z2 -O07z4 -O07z5 +O07 $- +O07 $1 +O07 $n +O07 '7 +O07 +2 +O07 +5 +O07 -0 +O07 -1 +O07 -6 +O07 D1 +O07 D5 +O07 R4 +O07 T0 +O07 Z1 +O07 Z2 +O07 Z3 +O07 Z4 +O07 ^k +O07 ^s +O07 ^t +O07 d +O07 d O42 +O07 i1n +O07 i2H +O07 k +O07 o0Z +O07 o2 +O07 o4z +O07 shv +O07 slk +O07 t +O07 t o1 +O07 u $I +O07 u ^F +O07 O21 +O07 O39 +O07 O74 +O07 z2 +O07 z4 +O07 z5 O08 -O08$6 -O08$bZ1 -O08$n -O08'8 -O08*63 -O08-5 -O08C -O08L0 -O08T2 -O08T4 -O08^Dq -O08^Q -O08^bt -O08c -O08i1a -O08i2c -O08o0, -O08p1 -O08p2 -O08p5o2V -O08s4b -O08t -O08O61 +O08 $6 +O08 $b Z1 +O08 $n +O08 '8 +O08 *63 +O08 -5 +O08 C +O08 L0 +O08 T2 +O08 T4 +O08 ^D q +O08 ^Q +O08 ^b t +O08 c +O08 i1a +O08 i2c +O08 o0, +O08 p1 +O08 p2 +O08 p5 o2V +O08 s4b +O08 t +O08 O61 O09 -O09L0 -O09Z1 -O09Z3 -O09Z3+5 -O09Z5 -O09^2 -O09^=d -O09^B -O09c -O09d -O09l -O09o1 -O09o2 -O09o48 -O09o6, -O09O21 -O09O34o0w -O09O54 -O09z5 +O09 L0 +O09 Z1 +O09 Z3 +O09 Z3 +5 +O09 Z5 +O09 ^2 +O09 ^= d +O09 ^B +O09 c +O09 d +O09 l +O09 o1 +O09 o2 +O09 o48 +O09 o6, +O09 O21 +O09 O34 o0w +O09 O54 +O09 z5 O0A -O0AR0 -O0AZ1 -O0Ad -O0Ai2x -O0AO35 -O0AOB9O38 +O0A R0 +O0A Z1 +O0A d +O0A i2x +O0A O35 +O0A OB9 O38 O0B -O0B$' -O0B$h -O0BT7 -O0BZ5 -O0Bc -O0Bc^. -O0Bi8- -O0Bo2C -O0BO46 -O0Bz5 +O0B $' +O0B $h +O0B T7 +O0B Z5 +O0B c +O0B c ^. +O0B i8- +O0B o2C +O0B O46 +O0B z5 O12 -O12$ -O12$* -O12$. -O12$6 -O12$m -O12$r -O12$s -O12$w -O12'5D0 -O12*21 -O12*30O31 -O12*34 -O12*41 -O12*52*41 -O12+1Z1 -O12+2 -O12-1 -O12-4 -O12@c -O12D7 -O12Kl -O12L1 -O12L3 -O12R0 -O12R3 -O12T3 -O12Z1 -O12Z3*41 -O12Z3T6 -O12Z4 -O12Z5 -O12Z5z5 -O12^1o7v -O12^3 -O12^4 -O12^E -O12^[ -O12^e -O12^o -O12^p -O12^y -O12c -O12d -O12i0I -O12i1j -O12i2k -O12i3g -O12i5 -O12i5T -O12o0p -O12o1@ -O12o2 -O12o2r -O12o3l -O12o4 -O12p2 -O12q -O12q+8 -O12r -O12s2z -O12s81 -O12s9n -O12sf4 -O12sgo -O12shI'5 -O12shs -O12sna -O12t} -O12u -O12u'8 -O12O23 -O12O32 -O12O91 -O12z1 -O12z2T3 -O12z4 -O12z5 +O12 $ +O12 $* +O12 $. +O12 $6 +O12 $m +O12 $r +O12 $s +O12 $w +O12 '5 D0 +O12 *21 +O12 *30 O31 +O12 *34 +O12 *41 +O12 *52 *41 +O12 +1 Z1 +O12 +2 +O12 -1 +O12 -4 +O12 @c +O12 D7 +O12 K l +O12 L1 +O12 L3 +O12 R0 +O12 R3 +O12 T3 +O12 Z1 +O12 Z3 *41 +O12 Z3 T6 +O12 Z4 +O12 Z5 +O12 Z5 z5 +O12 ^1 o7v +O12 ^3 +O12 ^4 +O12 ^E +O12 ^[ +O12 ^e +O12 ^o +O12 ^p +O12 ^y +O12 c +O12 d +O12 i0I +O12 i1j +O12 i2k +O12 i3g +O12 i5 +O12 i5T +O12 o0p +O12 o1@ +O12 o2 +O12 o2r +O12 o3l +O12 o4 +O12 p2 +O12 q +O12 q +8 +O12 r +O12 s2z +O12 s81 +O12 s9n +O12 sf4 +O12 sgo +O12 shI '5 +O12 shs +O12 sna +O12 t } +O12 u +O12 u '8 +O12 O23 +O12 O32 +O12 O91 +O12 z1 +O12 z2 T3 +O12 z4 +O12 z5 O13 -O13$. -O13$0d -O13$1 -O13$4 -O13$P -O13$X@m -O13$Yc -O13$gz1 -O13$h^9 -O13$oO13 -O13$y -O13*03 -O13*03d -O13*04 -O13*21p1 -O13*34 -O13+1r -O13-0K -O13-2 -O13@m -O13C -O13D6 -O13D7 -O13L0 -O13R2 -O13R5 -O13T1 -O13T5svz -O13Z1 -O13Z3 -O13Z5 -O13^9*21 -O13^C -O13^S -O13^c -O13^e -O13^s -O13^v -O13^x -O13c'7 -O13d -O13f -O13i0Gi0K -O13i0M -O13i0X -O13i0tL0 -O13i1j -O13i1r -O13i4X -O13o1? -O13o1u -O13o2y -O13o37 -O13o4Kl -O13o5e -O13o9+[ -O13p2 -O13s2f -O13s9Q -O13s9i -O13sgP -O13shF -O13sk5z1 -O13spw -O13O32 -O13z2 -O13z2s8g -O13z3R4 -O13z3z4 -O13z5 +O13 $. +O13 $0 d +O13 $1 +O13 $4 +O13 $P +O13 $X @m +O13 $Y c +O13 $g z1 +O13 $h ^9 +O13 $o O13 +O13 $y +O13 *03 +O13 *03 d +O13 *04 +O13 *21 p1 +O13 *34 +O13 +1 r +O13 -0 K +O13 -2 +O13 @m +O13 C +O13 D6 +O13 D7 +O13 L0 +O13 R2 +O13 R5 +O13 T1 +O13 T5 svz +O13 Z1 +O13 Z3 +O13 Z5 +O13 ^9 *21 +O13 ^C +O13 ^S +O13 ^c +O13 ^e +O13 ^s +O13 ^v +O13 ^x +O13 c '7 +O13 d +O13 f +O13 i0G i0K +O13 i0M +O13 i0X +O13 i0t L0 +O13 i1j +O13 i1r +O13 i4X +O13 o1? +O13 o1u +O13 o2y +O13 o37 +O13 o4K l +O13 o5e +O13 o9+ [ +O13 p2 +O13 s2f +O13 s9Q +O13 s9i +O13 sgP +O13 shF +O13 sk5 z1 +O13 spw +O13 O32 +O13 z2 +O13 z2 s8g +O13 z3 R4 +O13 z3 z4 +O13 z5 O14 -O14$* -O14$1 -O14$3 -O14$L -O14$M -O14$g -O14$i -O14$k -O14$p -O14'4 -O14'8 -O14*50 -O14+0 -O14-1 -O14@t -O14D2$_ -O14D3 -O14L0 -O14R0 -O14R3 -O14Z1 -O14Z3 -O14Z3t -O14Z4 -O14Z5 -O14^2 -O14^2C -O14^3 -O14^M$n -O14^P -O14^g -O14^gr -O14^qq -O14^s -O14^y -O14cz5 -O14d -O14do1m -O14f*10 -O14i0T -O14i1G -O14i1t -O14i2; -O14i4+ -O14o0G -O14p1c -O14p1O83 -O14s28C -O14s6no40 -O14sa? -O14sam -O14u -O14O05Z2 -O14O24 -O14O32 -O14O34 -O14z3 -O14z4 -O14z4Z2 -O14{ +O14 $* +O14 $1 +O14 $3 +O14 $L +O14 $M +O14 $g +O14 $i +O14 $k +O14 $p +O14 '4 +O14 '8 +O14 *50 +O14 +0 +O14 -1 +O14 @t +O14 D2 $_ +O14 D3 +O14 L0 +O14 R0 +O14 R3 +O14 Z1 +O14 Z3 +O14 Z3 t +O14 Z4 +O14 Z5 +O14 ^2 +O14 ^2 C +O14 ^3 +O14 ^M $n +O14 ^P +O14 ^g +O14 ^g r +O14 ^q q +O14 ^s +O14 ^y +O14 c z5 +O14 d +O14 d o1m +O14 f *10 +O14 i0T +O14 i1G +O14 i1t +O14 i2; +O14 i4+ +O14 o0G +O14 p1 c +O14 p1 O83 +O14 s28 C +O14 s6n o40 +O14 sa? +O14 sam +O14 u +O14 O05 Z2 +O14 O24 +O14 O32 +O14 O34 +O14 z3 +O14 z4 +O14 z4 Z2 +O14 { O15 -O15$- -O15$5 -O15$8u -O15$ML3 -O15$P -O15$X -O15$a -O15$k -O15$t -O15'6 -O15'8 -O15*15 -O15+0 -O15+1 -O15+2 -O15+3 -O15-4 -O15D5L2 -O15T1 -O15Z2@2 -O15Z3 -O15Z4 -O15Z5l -O15^G -O15c -O15d -O15d^i -O15f -O15i0A -O15i1r -O15i41 -O15i51 -O15lo5x -O15o0j -O15o1> -O15o3p -O15o57 -O15o5j -O15sza -O15szh -O15O41 -O15z3 -O15z3t -O15z4^V -O15z5 -O15{ +O15 $- +O15 $5 +O15 $8 u +O15 $M L3 +O15 $P +O15 $X +O15 $a +O15 $k +O15 $t +O15 '6 +O15 '8 +O15 *15 +O15 +0 +O15 +1 +O15 +2 +O15 +3 +O15 -4 +O15 D5 L2 +O15 T1 +O15 Z2 @2 +O15 Z3 +O15 Z4 +O15 Z5 l +O15 ^G +O15 c +O15 d +O15 d ^i +O15 f +O15 i0A +O15 i1r +O15 i41 +O15 i51 +O15 l o5x +O15 o0j +O15 o1> +O15 o3p +O15 o57 +O15 o5j +O15 sza +O15 szh +O15 O41 +O15 z3 +O15 z3 t +O15 z4 ^V +O15 z5 +O15 { O16 -O16$: -O16$F -O16$R$v -O16$V -O16$_ -O16'9 -O16+2q -O16+3 -O16+7 -O16-1 -O16D4 -O16L1 -O16Z3 -O16Z4 -O16Z5 -O16^5 -O16^D -O16^JZ1 -O16^Sz2 -O16^a -O16i2n -O16i4bo2n -O16l -O16o0H -O16o1 -O16o3 -O16p1 -O16p2 -O16q -O16r -O16sHx -O16sb9D4 -O16t$2 -O16O23O03 -O16z4q -O16z5 +O16 $: +O16 $F +O16 $R $v +O16 $V +O16 $_ +O16 '9 +O16 +2 q +O16 +3 +O16 +7 +O16 -1 +O16 D4 +O16 L1 +O16 Z3 +O16 Z4 +O16 Z5 +O16 ^5 +O16 ^D +O16 ^J Z1 +O16 ^S z2 +O16 ^a +O16 i2n +O16 i4b o2n +O16 l +O16 o0H +O16 o1 +O16 o3 +O16 p1 +O16 p2 +O16 q +O16 r +O16 sHx +O16 sb9 D4 +O16 t $2 +O16 O23 O03 +O16 z4 q +O16 z5 O17 -O17$1 -O17$N -O17$S -O17$o -O17$v -O17*20 -O17+1 -O17-1 -O17-4 -O17C -O17L4 -O17T2i0O -O17Z5 -O17^P -O17^c -O17^m -O17^r -O17d -O17l -O17q -O17qd -O17stP -O17u -O17O51 -O17z5 -O17{ +O17 $1 +O17 $N +O17 $S +O17 $o +O17 $v +O17 *20 +O17 +1 +O17 -1 +O17 -4 +O17 C +O17 L4 +O17 T2 i0O +O17 Z5 +O17 ^P +O17 ^c +O17 ^m +O17 ^r +O17 d +O17 l +O17 q +O17 q d +O17 stP +O17 u +O17 O51 +O17 z5 +O17 { O18 -O18$q -O18*42 -O18+0 -O18+3 -O18+7 -O18L0 -O18R0 -O18Z2 -O18Z3 -O18Z3q -O18[^G -O18d -O18i5w -O18lZ5 -O18o3cl -O18o3i+4 -O18o6{-6 -O18p1'3 -O18p2 -O18t -O18O51 -O18O53 -O18O64 -O18z1O71 -O18z4 -O18z4O43 -O19$@ -O19+3 -O19@l$z -O19D4 -O19Z5 -O19^dz1 -O19i0jo21 -O19p2 -O19q -O19qd -O19r -O19uD5 -O1A$s -O1AZ1 -O1A[$J -O1A^pz2 -O1Ai15 -O1Ai1rp2 +O18 $q +O18 *42 +O18 +0 +O18 +3 +O18 +7 +O18 L0 +O18 R0 +O18 Z2 +O18 Z3 +O18 Z3 q +O18 [ ^G +O18 d +O18 i5w +O18 l Z5 +O18 o3c l +O18 o3i +4 +O18 o6{ -6 +O18 p1 '3 +O18 p2 +O18 t +O18 O51 +O18 O53 +O18 O64 +O18 z1 O71 +O18 z4 +O18 z4 O43 +O19 $@ +O19 +3 +O19 @l $z +O19 D4 +O19 Z5 +O19 ^d z1 +O19 i0j o21 +O19 p2 +O19 q +O19 q d +O19 r +O19 u D5 +O1A $s +O1A Z1 +O1A [ $J +O1A ^p z2 +O1A i15 +O1A i1r p2 O1B -O1B+3 -O1B+5 -O1BR2 -O1B[d -O1B^1R1 -O1Bd$v -O1Bi1P -O1Bo1* -O21$6 -O21$X[ -O21$g -O21$k -O21$k+2 -O21'9 -O21*25 -O21*30 -O21*68 -O21+1 -O21+2 -O21-0 -O21@Y -O21@o -O21@s -O21@y -O21D7 -O21R1o1x -O21R5D4 -O21R7 -O21^3 -O21^7 -O21^L -O21^cz3 -O21^l -O21^q-3 -O21^r -O21^t -O21di3n -O21f -O21i0k -O21i1*O34 -O21i11 -O21i42 -O21i5^ -O21i6e -O21i81 -O21kR0 -O21o0C -O21o0y -O21o1^ -O21o1b -O21o1n -O21o2? -O21o2i -O21o34 -O21o3j -O21o7Il -O21p1O54 -O21p2 -O21q -O21s&X -O21s., -O21s5 -O21scZ -O21scs -O21sm0 -O21sobi1* -O21stkp1 -O21stl -O21syu -O21O24s6+ -O21O46 -O21O52 -O21z3i1* -O21z5 -O21{l +O1B +3 +O1B +5 +O1B R2 +O1B [ d +O1B ^1 R1 +O1B d $v +O1B i1P +O1B o1* +O21 $6 +O21 $X [ +O21 $g +O21 $k +O21 $k +2 +O21 '9 +O21 *25 +O21 *30 +O21 *68 +O21 +1 +O21 +2 +O21 -0 +O21 @Y +O21 @o +O21 @s +O21 @y +O21 D7 +O21 o1x +O21 R5 D4 +O21 R7 +O21 ^3 +O21 ^7 +O21 ^L +O21 ^c z3 +O21 ^l +O21 ^q -3 +O21 ^r +O21 ^t +O21 d i3n +O21 f +O21 i0k +O21 i1* O34 +O21 i11 +O21 i42 +O21 i5^ +O21 i6e +O21 i81 +O21 k R0 +O21 o0C +O21 o0y +O21 o1^ +O21 o1b +O21 o1n +O21 o2? +O21 o2i +O21 o34 +O21 o3j +O21 o7I l +O21 p1 O54 +O21 p2 +O21 q +O21 s&X +O21 s., +O21 s5 +O21 scZ +O21 scs +O21 sm0 +O21 sob i1* +O21 stk p1 +O21 stl +O21 syu +O21 O24 s6+ +O21 O46 +O21 O52 +O21 z3 i1* +O21 z5 +O21 { l O23 -O23$# -O23$*[ -O23$. -O23$? -O23$I -O23$f'6 -O23$g -O23$j -O23$l -O23$r -O23$t -O23'7 -O23*23{ -O23+0 -O23+9 -O23-2$d -O23-2o28 -O23-8 -O23@h -O23C -O23D3 -O23K -O23L4 -O23L5 -O23R3 -O23Z1 -O23Z1s1R -O23Z2 -O23Z3 -O23Z4 -O23Z5 -O23^( -O23^6 -O23^D -O23^V -O23^m -O23^s -O23f -O23i1K -O23i1b -O23i2i -O23i3x -O23i4i -O23i57 -O23l$! -O23o13 -O23o19 -O23o2n -O23o36 -O23o3@O12 -O23p1 -O23p1+0 -O23p1O03 -O23p2O82 -O23q*82 -O23r -O23sLo -O23sdgZ1 -O23siL -O23z1 -O23z1^b -O23z2 -O23z2Z1 -O23z3 -O23z5o2$ +O23 $# +O23 $* [ +O23 $. +O23 $? +O23 $I +O23 $f '6 +O23 $g +O23 $j +O23 $l +O23 $r +O23 $t +O23 '7 +O23 *23 { +O23 +0 +O23 +9 +O23 -2 $d +O23 o28 +O23 -8 +O23 @h +O23 C +O23 D3 +O23 K +O23 L4 +O23 L5 +O23 R3 +O23 Z1 +O23 Z1 s1R +O23 Z2 +O23 Z3 +O23 Z4 +O23 Z5 +O23 ^( +O23 ^6 +O23 ^D +O23 ^V +O23 ^m +O23 ^s +O23 f +O23 i1K +O23 i1b +O23 i2i +O23 i3x +O23 i4i +O23 i57 +O23 l $! +O23 o13 +O23 o19 +O23 o2n +O23 o36 +O23 o3@ O12 +O23 p1 +O23 p1 +0 +O23 p1 O03 +O23 p2 O82 +O23 q *82 +O23 r +O23 sLo +O23 sdg Z1 +O23 siL +O23 z1 +O23 z1 ^b +O23 z2 +O23 z2 Z1 +O23 z3 +O23 z5 o2$ O24 -O24$. -O24$6 -O24$7 -O24$_ -O24$g -O24$h -O24$i -O24$r -O24'6 -O24'8 -O24*20p1 -O24*36 -O24+2 -O24+5 -O24-3 -O24@1i4b -O24@hZ3 -O24K$p -O24L2 -O24L6 -O24Z2 -O24Z3 -O24Z3*15 -O24Z5 -O24[ -O24[O25 -O24^# -O24^W -O24^g -O24^m -O24^o -O24^oD3 -O24^r -O24^z -O24d -O24f -O24i2, -O24i32 -O24kd -O24o0SZ1 -O24o21 -O24o2r -O24o2y -O24o4 -O24sa. -O24sat -O24skX -O24sod -O24sr4 -O24t*13 -O24tR1 -O24uz5 -O24O05 -O24O15Z5 -O24z3 -O24z4 -O24z5 +O24 $. +O24 $6 +O24 $7 +O24 $_ +O24 $g +O24 $h +O24 $i +O24 $r +O24 '6 +O24 '8 +O24 *20 p1 +O24 *36 +O24 +2 +O24 +5 +O24 -3 +O24 @1 i4b +O24 @h Z3 +O24 K $p +O24 L2 +O24 L6 +O24 Z2 +O24 Z3 +O24 Z3 *15 +O24 Z5 +O24 [ +O24 [ O25 +O24 ^# +O24 ^W +O24 ^g +O24 ^m +O24 ^o +O24 ^o D3 +O24 ^r +O24 ^z +O24 d +O24 f +O24 i2, +O24 i32 +O24 k d +O24 o0S Z1 +O24 o21 +O24 o2r +O24 o2y +O24 o4 +O24 sa. +O24 sat +O24 skX +O24 sod +O24 sr4 +O24 t *13 +O24 t R1 +O24 u z5 +O24 O05 +O24 O15 Z5 +O24 z3 +O24 z4 +O24 z5 O25 -O25$ -O25$& -O25$0 -O25$d -O25$r -O25'6 -O25*13 -O25+2 -O25-1f -O25-5 -O25D4 -O25D9 -O25L1 -O25R6 -O25RA'7 -O25T6 -O25T6'5 -O25Z1 -O25Z2 -O25Z2c -O25Z3 -O25Z4 -O25Z5*70 -O25^, -O25^U -O25^c -O25^i -O25^n -O25i3g^f -O25i3z -O25l -O25l[ -O25o1q -O25o49i4i -O25o4B -O25p1 -O25rz5 -O25s5c -O25uo3y -O25O51+2 -O25z1 -O25z4L6 -O25z5 +O25 $ +O25 $& +O25 $0 +O25 $d +O25 $r +O25 '6 +O25 *13 +O25 +2 +O25 -1 f +O25 -5 +O25 D4 +O25 D9 +O25 L1 +O25 R6 +O25 '7 +O25 T6 +O25 '5 +O25 Z1 +O25 Z2 +O25 Z2 c +O25 Z3 +O25 Z4 +O25 Z5 *70 +O25 ^, +O25 ^U +O25 ^c +O25 ^i +O25 ^n +O25 i3g ^f +O25 i3z +O25 l +O25 l [ +O25 o1q +O25 o49 i4i +O25 o4B +O25 p1 +O25 r z5 +O25 s5c +O25 u o3y +O25 O51 +2 +O25 z1 +O25 z4 L6 +O25 z5 O26 -O26$@ -O26$F -O26$X -O26$a -O26$r -O26'6 -O26+1 -O26-5 -O26@az1 -O26R0 -O26Z1 -O26Z3 -O26^'o0Z -O26^a -O26^bskr -O26^c -O26^t -O26d -O26i1v -O26i3? -O26o4y -O26p1[ -O26p2O94 -O26qz4 -O26skf -O26sp6 -O26ssa -O26z2 -O26z5 -O26} +O26 $@ +O26 $F +O26 $X +O26 $a +O26 $r +O26 '6 +O26 +1 +O26 -5 +O26 @a z1 +O26 R0 +O26 Z1 +O26 Z3 +O26 ^' o0Z +O26 ^a +O26 ^b skr +O26 ^c +O26 ^t +O26 d +O26 i1v +O26 i3? +O26 o4y +O26 p1 [ +O26 p2 O94 +O26 q z4 +O26 skf +O26 sp6 +O26 ssa +O26 z2 +O26 z5 +O26 } O27 -O27$3 -O27$i -O27'8 -O27-1^f -O27@3 -O27L4 -O27Z2 -O27Z5 -O27^8 -O27^M -O27^h -O27d -O27i2az4 -O27i4p -O27o03 -O27o0m -O27o1MZ2 -O27o1j -O27o1y -O27o57@r -O27p1z1 -O27q -O27s1q -O27z1 -O28$_D2 -O28'9 -O28+4 -O28-0 -O28^6z4 -O28^e -O28^z -O28d -O28l -O28o0d -O28o27d -O28q -O28O0B -O29$J -O29$y -O29-1 -O29-2 -O29T4 -O29^n -O29^{-0 -O29d -O29i0s -O29i5t -O29lo5- -O29o1j -O29O41 -O2A$. -O2A'7 -O2A^T -O2Al -O2Ao1e -O2AO37 -O2Az1i17 -O2B$9 -O2B^i -O2Bi0fL4 -O2BO15O08 -O31$6 -O31$8 -O31$T -O31$_ -O31$m -O31$o -O31$y -O31'4 -O31'6 -O31'7@7 -O31*15ssr -O31*24 -O31*26 -O31*28 -O31*54] -O31*61 -O31*80 -O31+4L7 -O31+4d -O31-0 -O31-2 -O31@3 -O31R6l -O31T2 -O31Z2 -O31Z3+1 -O31Z4 -O31[o6T -O31]p1 -O31^B -O31^^l -O31^t -O31^u -O31f -O31i0! -O31i2WT5 -O31i3g -O31i4X -O31i4w -O31i67 -O31i73'5 -O31i89O76 -O31o0D -O31o0Y -O31o0t -O31o1C -O31o2U -O31o3a -O31o4z -O31o8r -O31oA5O36 -O31p1[ -O31p2O25 -O31r -O31s-h -O31sar[ -O31si' -O31sl9 -O31smf -O31syT -O31O21*45 -O31O42 -O31O43 -O31O46 -O31z1-0 -O31z1o6e -O31z3O61 -O31z4*62 -O31} +O27 $3 +O27 $i +O27 '8 +O27 -1 ^f +O27 @3 +O27 L4 +O27 Z2 +O27 Z5 +O27 ^8 +O27 ^M +O27 ^h +O27 d +O27 i2a z4 +O27 i4p +O27 o03 +O27 o0m +O27 o1M Z2 +O27 o1j +O27 o1y +O27 o57 @r +O27 p1 z1 +O27 q +O27 s1q +O27 z1 +O28 $_ D2 +O28 '9 +O28 +4 +O28 -0 +O28 ^6 z4 +O28 ^e +O28 ^z +O28 d +O28 l +O28 o0d +O28 o27 d +O28 q +O28 O0B +O29 $J +O29 $y +O29 -1 +O29 -2 +O29 T4 +O29 ^n +O29 ^{ -0 +O29 d +O29 i0s +O29 i5t +O29 l o5- +O29 o1j +O29 O41 +O2A $. +O2A '7 +O2A ^T +O2A l +O2A o1e +O2A O37 +O2A z1 i17 +O2B $9 +O2B ^i +O2B i0f L4 +O2B O15 O08 +O31 $6 +O31 $8 +O31 $T +O31 $_ +O31 $m +O31 $o +O31 $y +O31 '4 +O31 '6 +O31 '7 @7 +O31 *15 ssr +O31 *24 +O31 *26 +O31 *28 +O31 *54 ] +O31 *61 +O31 *80 +O31 +4 L7 +O31 +4 d +O31 -0 +O31 -2 +O31 @3 +O31 R6 l +O31 T2 +O31 Z2 +O31 Z3 +1 +O31 Z4 +O31 [ o6T +O31 ] p1 +O31 ^B +O31 ^^ l +O31 ^t +O31 ^u +O31 f +O31 i0! +O31 i2W T5 +O31 i3g +O31 i4X +O31 i4w +O31 i67 +O31 '5 +O31 i89 O76 +O31 o0D +O31 o0Y +O31 o0t +O31 o1C +O31 o2U +O31 o3a +O31 o4z +O31 o8r +O31 oA5 O36 +O31 p1 [ +O31 p2 O25 +O31 r +O31 s-h +O31 sar [ +O31 si' +O31 sl9 +O31 smf +O31 syT +O31 O21 *45 +O31 O42 +O31 O43 +O31 O46 +O31 z1 -0 +O31 z1 o6e +O31 z3 O61 +O31 z4 *62 +} D4 O32 -O32$ -O32$7 -O32$8 -O32$L -O32$Y} -O32$b -O32'8 -O32*43 -O32+1 -O32+2 -O32+5 -O32+7 -O32-3 -O32-5 -O32@. -O32@k -O32@t -O32@zC -O32D1 -O32L2d -O32L4 -O32R4 -O32R5 -O32T3 -O32Z2i3H -O32Z2O35 -O32Z3 -O32Z4 -O32Z5 -O32[ -O32^$ -O32^6 -O32^I -O32^S -O32^X -O32^e -O32^o -O32c$b -O32d -O32d'6 -O32d-2 -O32i1e -O32i3$ -O32i3: -O32k -O32kp1 -O32l -O32o0k -O32o2 -O32o20 -O32o2x -O32o3+q -O32o3@ -O32o4w -O32o55d -O32o5w -O32p1o5K -O32s7u$A -O32sG6 -O32sg* -O32sqc -O32srl -O32srs -O32u -O32O42 -O32O65sts -O32O72 -O32z1-3 -O32z2 -O32z3 -O32z4^c -O32z5 -O32} +O32 $ +O32 $7 +O32 $8 +O32 $L +O32 $Y } +O32 $b +O32 '8 +O32 *43 +O32 +1 +O32 +2 +O32 +5 +O32 +7 +O32 -3 +O32 -5 +O32 @. +O32 @k +O32 @t +O32 @z C +O32 D1 +O32 L2 d +O32 L4 +O32 R4 +O32 R5 +O32 T3 +O32 Z2 i3H +O32 Z2 O35 +O32 Z3 +O32 Z4 +O32 Z5 +O32 [ +O32 ^$ +O32 ^6 +O32 ^I +O32 ^S +O32 ^X +O32 ^e +O32 ^o +O32 c $b +O32 d +O32 d '6 +O32 d -2 +O32 i1e +O32 i3$ +O32 i3: +O32 k +O32 k p1 +O32 l +O32 o0k +O32 o2 +O32 o20 +O32 o2x +O32 o3+ q +O32 o3@ +O32 o4w +O32 o55 d +O32 o5w +O32 p1 o5K +O32 s7u $A +O32 sG6 +O32 sg* +O32 sqc +O32 srl +O32 srs +O32 u +O32 O42 +O32 O65 sts +O32 O72 +O32 z1 -3 +O32 z2 +O32 z3 +O32 z4 ^c +O32 z5 +O32 } O34 -O34$$ -O34$& -O34$3p2 -O34$Z -O34$n -O34'5 -O34*13 -O34+1 -O34+6D2 -O34+8l -O34-4 -O34-5 -O34-7 -O34@y -O34C -O34Cu -O34D6 -O34L0 -O34R4 -O34Z1 -O34Z2 -O34Z3{ -O34Z5 -O34[t -O34^4 -O34^J -O34^e -O34^p -O34^usb* -O34^x -O34c -O34d -O34fu -O34l -O34lo0k -O34o2e -O34o38q -O34o3yu -O34o65 -O34o6n -O34scf'5 -O34seB -O34sifp1 -O34somssm -O34ssp -O34svj -O34O52 -O34O63 -O34O94 -O34z1 -O34z2 -O34z3 -O34z4 +O34 $$ +O34 $& +O34 $3 p2 +O34 $Z +O34 $n +O34 '5 +O34 *13 +O34 +1 +O34 +6 D2 +O34 +8 l +O34 -4 +O34 -5 +O34 -7 +O34 @y +O34 C +O34 u +O34 D6 +O34 L0 +O34 R4 +O34 Z1 +O34 Z2 +O34 Z3 { +O34 Z5 +O34 [ t +O34 ^4 +O34 ^J +O34 ^e +O34 ^p +O34 ^u sb* +O34 ^x +O34 c +O34 d +O34 f u +O34 l +O34 l o0k +O34 o2e +O34 o38 q +O34 o3y u +O34 o65 +O34 o6n +O34 scf '5 +O34 seB +O34 sif p1 +O34 som ssm +O34 ssp +O34 svj +O34 O52 +O34 O63 +O34 O94 +O34 z1 +O34 z2 +O34 z3 +O34 z4 O35 -O35$! -O35$'[ -O35$* -O35$5 -O35$5R2 -O35$A -O35$C -O35$n -O35+0 -O35+0T2 -O35-1 -O35-6 -O35Z1 -O35Z2R0 -O35Z3 -O35Z4-5 -O35Z5 -O35Z5O58 -O35^B -O35^nT4 -O35d -O35i1 -O35i33 -O35k -O35l -O35o0cq -O35o0jz2 -O35qT6 -O35sr7 -O35tT7 -O35O92O63 -O35z1 -O35z2 -O35z3 -O35z4 +O35 $! +O35 $' [ +O35 $* +O35 $5 +O35 $5 R2 +O35 $A +O35 $C +O35 $n +O35 +0 +O35 +0 T2 +O35 -1 +O35 -6 +O35 Z1 +O35 Z2 R0 +O35 Z3 +O35 Z4 -5 +O35 Z5 +O35 Z5 O58 +O35 ^B +O35 ^n T4 +O35 d +O35 i1 +O35 i33 +O35 k +O35 l +O35 o0c q +O35 o0j z2 +O35 q T6 +O35 sr7 +O35 t T7 +O35 O92 O63 +O35 z1 +O35 z2 +O35 z3 +O35 z4 O36 -O36$ -O36$# -O36$. -O36$0 -O36$2 -O36$p -O36+3 -O36Cz2 -O36D1 -O36D3C -O36L3 -O36T3 -O36Z1$f -O36Z2 -O36Z2c -O36^2 -O36^U -O36^b -O36^z -O36d -O36i0@ -O36i5u -O36sbt -O36t^A -O36u -O36z1 -O36z3 +O36 $ +O36 $# +O36 $. +O36 $0 +O36 $2 +O36 $p +O36 +3 +O36 C z2 +O36 D1 +O36 D3 C +O36 L3 +O36 T3 +O36 Z1 $f +O36 Z2 +O36 Z2 c +O36 ^2 +O36 ^U +O36 ^b +O36 ^z +O36 d +O36 i0@ +O36 i5u +O36 sbt +O36 t ^A +O36 u +O36 z1 +O36 z3 O37 -O37$C -O37$n -O37L5 -O37T6 -O37^C -O37d -O37i0GZ2 -O37i2A -O37i4g -O37l -O37o0V -O37o0x -O37o20 -O37O41 -O37z2l -O37z3 -O37z4'A -O38$7 -O38$l -O38'8 -O38+0 -O38-0 -O38R0 -O38Z2 -O38^O -O38^s -O38i3o -O38o1r -O38o3f -O38sce -O38O51 +O37 $C +O37 $n +O37 L5 +O37 T6 +O37 ^C +O37 d +O37 i0G Z2 +O37 i2A +O37 i4g +O37 l +O37 o0V +O37 o0x +O37 o20 +O37 O41 +O37 z2 l +O37 z3 +O37 z4 'A +O38 $7 +O38 $l +O38 '8 +O38 +0 +O38 -0 +O38 R0 +O38 Z2 +O38 ^O +O38 ^s +O38 i3o +O38 o1r +O38 o3f +O38 sce +O38 O51 O39 -O39$b -O39D0^0 -O39^1 -O39d -O39l -O39o3r -O39q -O39z1 +O39 $b +O39 D0 ^0 +O39 ^1 +O39 d +O39 l +O39 o3r +O39 q +O39 z1 O3A -O3A^9 -O3Az2R2 +O3A ^9 +O3A z2 R2 O3B -O3Bo0e -O3Bo3 -O41$+ -O41$3 -O41$4 -O41$5q -O41$9 -O41$@ -O41$G -O41$XO91 -O41$w[ -O41'B -O41*23Z3 -O41*40 -O41*40O15 -O41*53 -O41*56C -O41*78 -O41+1*30 -O41-0 -O41@8 -O41@m -O41@t -O41D1 -O41D5 -O41L2@2 -O41R0^m -O41RA -O41T3 -O41Z3 -O41Z4 -O41[$h -O41^6 -O41^i -O41^v -O41d-2 -O41i2o -O41i4!u -O41o0h -O41o3S -O41o7i -O41p2 -O41r*36 -O41sh5 -O41sjL -O41sku -O41snl -O41O54Z2 -O41O61 -O41O82 -O41O86 +O3B o0e +O3B o3 +O41 $+ +O41 $3 +O41 $4 +O41 $5 q +O41 $9 +O41 $@ +O41 $G +O41 $X O91 +O41 $w [ +O41 'B +O41 *23 Z3 +O41 *40 +O41 *40 O15 +O41 *53 +O41 *56 C +O41 *78 +O41 +1 *30 +O41 -0 +O41 @8 +O41 @m +O41 @t +O41 D1 +O41 D5 +O41 L2 @2 +O41 R0 ^m +O41 RA +O41 T3 +O41 Z3 +O41 Z4 +O41 [ $h +O41 ^6 +O41 ^i +O41 ^v +O41 d -2 +O41 i2o +O41 i4! u +O41 o0h +O41 o3S +O41 o7i +O41 p2 +O41 r *36 +O41 sh5 +O41 sjL +O41 sku +O41 snl +O41 O54 Z2 +O41 O61 +O41 O82 +O41 O86 O42 -O42$! -O42$% -O42$& -O42$2Z2 -O42$J -O42$k -O42$o -O42'6 -O42'B -O42*34 -O42*37Z1 -O42*53 -O42+3 -O42+9 -O42-0 -O42-4 -O42-6 -O42-7 -O42-8 -O42@4 -O42D1 -O42D1*21 -O42K$a -O42KZ1 -O42L5 -O42L6 -O42R5 -O42R6O13 -O42R7 -O42T5 -O42Z3 -O42Z4 -O42^& -O42^2 -O42^4 -O42^D -O42^I -O42^d -O42^h -O42c -O42c^h -O42d -O42d+B -O42i1ao48 -O42i2h -O42i3Ut -O42i4= -O42i4e -O42i4zL3 -O42o0j -O42o21 -O42o3D -O42o5` -O42o5d -O42p2 -O42p2O79 -O42r -O42s91z3 -O42sKE -O42sa -O42sdp -O42sjbD8 -O42slL -O42srz -O42t*52 -O42z1 -O42z1i0A -O42z2 -O42z4+7 -O42{T6 -O42} +O42 $! +O42 $% +O42 $& +O42 $2 Z2 +O42 $J +O42 $k +O42 $o +O42 '6 +O42 'B +O42 *34 +O42 *37 Z1 +O42 *53 +O42 +3 +O42 +9 +O42 -0 +O42 -4 +O42 -6 +O42 -7 +O42 -8 +O42 @4 +O42 D1 +O42 D1 *21 +O42 K $a +O42 K Z1 +O42 L5 +O42 L6 +O42 R5 +O42 R6 O13 +O42 R7 +O42 T5 +O42 Z3 +O42 Z4 +O42 ^& +O42 ^2 +O42 ^4 +O42 ^D +O42 ^I +O42 ^d +O42 ^h +O42 c +O42 c ^h +O42 d +O42 d +B +O42 i1a o48 +O42 i2h +O42 i3U t +O42 i4= +O42 i4e +O42 i4z L3 +O42 o0j +O42 o21 +O42 o3D +O42 o5` +O42 o5d +O42 p2 +O42 p2 O79 +O42 r +O42 s91 z3 +O42 sKE +O42 sa +O42 sdp +O42 sjb D8 +O42 slL +O42 srz +O42 t *52 +O42 z1 +O42 z1 i0A +O42 z2 +O42 z4 +7 +O42 { T6 +O42 } O43 -O43$! -O43$4D8 -O43$5 -O43$a -O43$dc -O43$e -O43$k -O43$xO31 -O43'8 -O43*04 -O43*05 -O43*42 -O43*43 -O43+2 -O43+3 -O43+4 -O43+7 -O43-9O73 -O43@7z1 -O43C -O43D7 -O43L0 -O43L4 -O43R0 -O43Z2 -O43Z3 -O43[ -O43^0 -O43^8R3 -O43^C -O43^D -O43^d -O43^i -O43d -O43f -O43i0% -O43i05 -O43i0m -O43i0w -O43i2I^# -O43i2uK -O43i4I -O43i50 -O43i76 -O43o2n -O43o4B -O43p1+0 -O43s2i -O43s6n -O43sKi -O43sbh -O43t -O43tZ1 -O43u -O43up1 -O43O41$$ -O43O41@l -O43z1 -O43z1O51 -O43z2 -O43{$a +O43 $! +O43 $4 D8 +O43 $5 +O43 $a +O43 $d c +O43 $e +O43 $k +O43 $x O31 +O43 '8 +O43 *04 +O43 *05 +O43 *42 +O43 *43 +O43 +2 +O43 +3 +O43 +4 +O43 +7 +O43 -9 O73 +O43 @7 z1 +O43 C +O43 D7 +O43 L0 +O43 L4 +O43 R0 +O43 Z2 +O43 Z3 +O43 [ +O43 ^0 +O43 ^8 R3 +O43 ^C +O43 ^D +O43 ^d +O43 ^i +O43 d +O43 f +O43 i0% +O43 i05 +O43 i0m +O43 i0w +O43 i2I ^# +O43 i2u K +O43 i4I +O43 i50 +O43 i76 +O43 o2n +O43 o4B +O43 p1 +0 +O43 s2i +O43 s6n +O43 sKi +O43 sbh +O43 t +O43 t Z1 +O43 u +O43 u p1 +O43 O41 $$ +O43 O41 @l +O43 z1 +O43 z1 O51 +O43 z2 +O43 { $a O45 -O45$pl -O45-0Z3 -O45-3 -O45-5 -O45@oi5i -O45C -O45C^. -O45D1 -O45L4 -O45R0 -O45R1 -O45T2^l -O45Z1 -O45Z2 -O45Z5[ -O45[ -O45^7 -O45^L -O45^j -O45^m -O45c -O45i1x -O45i5$ -O45l -O45o2+ -O45o4z -O45o78 -O45oAX'9 -O45p1 -O45s2i -O45spb -O45O53 -O45z1 -O45z5 -O45{ +O45 $p l +O45 -0 Z3 +O45 -3 +O45 -5 +O45 @o i5i +O45 C +O45 C ^. +O45 D1 +O45 L4 +O45 R0 +O45 R1 +O45 T2 ^l +O45 Z1 +O45 Z2 +O45 Z5 [ +O45 [ +O45 ^7 +O45 ^L +O45 ^j +O45 ^m +O45 c +O45 i1x +O45 i5$ +O45 l +O45 o2+ +O45 o4z +O45 o78 +O45 '9 +O45 p1 +O45 s2i +O45 spb +O45 O53 +O45 z1 +O45 z5 +O45 { O46 -O46$1 -O46$nZ1 -O46'7 -O46'8l -O46+2 -O46-1 -O46-2 -O46L4 -O46T0 -O46T2 -O46Z2 -O46^U -O46d -O46i0L -O46i4Yc -O46o02 -O46o3s -O46o6f -O46O61 -O46z1 -O46z2 +O46 $1 +O46 $n Z1 +O46 '7 +O46 '8 l +O46 +2 +O46 -1 +O46 -2 +O46 L4 +O46 T0 +O46 T2 +O46 Z2 +O46 ^U +O46 d +O46 i0L +O46 i4Y c +O46 o02 +O46 o3s +O46 o6f +O46 O61 +O46 z1 +O46 z2 O47 -O47$; -O47-4 -O47D1 -O47R1 -O47[ -O47^FR0 -O47^sO52 -O47c -O47o0_ -O47o3* -O47q -O47sge +O47 $; +O47 -4 +O47 D1 +O47 R1 +O47 [ +O47 ^F R0 +O47 ^s O52 +O47 c +O47 o0_ +O47 o3* +O47 q +O47 sge O48 -O48$3 -O48$8 -O48$z -O48^! -O48^2O16 -O48p1 -O48sat -O48sek -O48snw +O48 $3 +O48 $8 +O48 $z +O48 ^! +O48 ^2 O16 +O48 p1 +O48 sat +O48 sek +O48 snw O49 -O49'6 -O49D3^2 -O49Z1 -O49Z2 -O49^1 -O49^9 -O49i4u -O49o7s -O4A$f -O4A$p -O4A-0o1j -O4Ao4m -O4A} -O4Bc -O4Bt -O51$! -O51$6 -O51$; -O51$@ -O51$S -O51$x -O51$y -O51$z -O51'9 -O51'9so -O51*04 -O51*68 -O51+1 -O51+2Z3 -O51-1 -O51-2 -O51-4^2 -O51-5d -O51-7 -O51D4O59 -O51Kse6 -O51L3 -O51L3L1 -O51R1r -O51R5O5B -O51R8 -O51T1 -O51T3 -O51Z1t -O51Z2 -O51^' -O51^1 -O51^2 -O51^S -O51^i^o -O51^n -O51i0w*67 -O51i2T -O51i2h -O51i2o -O51i3m -O51i3q -O51i44 -O51i4A -O51i6r -O51o1h -O51o3L -O51o3s -O51o4N -O51r -O51s9u -O51sh2o6. -O51sj4 -O51sjm -O51ssa -O51O03 -O51O25i3k -O51O62 -O51z1 -O51z2O71 -O51z4 -O51{ +O49 '6 +O49 D3 ^2 +O49 Z1 +O49 Z2 +O49 ^1 +O49 ^9 +O49 i4u +O49 o7s +O4A $f +O4A $p +O4A -0 o1j +O4A o4m +O4A } +O4B c +O4B t +O51 $! +O51 $6 +O51 $; +O51 $@ +O51 $S +O51 $x +O51 $y +O51 $z +O51 '9 +O51 '9 so +O51 *04 +O51 *68 +O51 +1 +O51 +2 Z3 +O51 -1 +O51 -2 +O51 -4 ^2 +O51 -5 d +O51 -7 +O51 D4 O59 +O51 K se6 +O51 L3 +O51 L3 L1 +O51 R1 r +O51 R5 O5B +O51 R8 +O51 T1 +O51 T3 +O51 Z1 t +O51 Z2 +O51 ^' +O51 ^1 +O51 ^2 +O51 ^S +O51 ^i ^o +O51 ^n +O51 i0w *67 +O51 i2T +O51 i2h +O51 i2o +O51 i3m +O51 i3q +O51 i44 +O51 i4A +O51 i6r +O51 o1h +O51 o3L +O51 o3s +O51 o4N +O51 r +O51 s9u +O51 sh2 o6. +O51 sj4 +O51 sjm +O51 ssa +O51 O03 +O51 O25 i3k +O51 O62 +O51 z1 +O51 z2 O71 +O51 z4 +O51 { O52 -O52$$ -O52$6 -O52$7+4 -O52$9 -O52$@T0 -O52$Cu -O52$G -O52$a -O52$n -O52$p -O52$v -O52'A -O52*02 -O52*05 -O52*31 -O52*32 -O52*41 -O52*67 -O52+2 -O52+3+3 -O52+5 -O52+6i7e -O52-6 -O52@y -O52D7 -O52L4 -O52R2 -O52R3o66 -O52R4 -O52T5Z4 -O52T5O13 -O52Z1 -O52Z1$q -O52Z3 -O52[Z3 -O52^$ -O52^0 -O52^9 -O52^J -O52^O -O52^_ -O52^k -O52d -O52i01 -O52i0Q -O52i2u -O52i4r -O52i59 -O52o0C -O52o1P -O52o1dz1 -O52o23 -O52o41 -O52o4g -O52o4j -O52r -O52s0% -O52sMj -O52u -O52O02 -O52z1 -O52z1slI -O52z3 -O52} +O52 $$ +O52 $6 +O52 $7 +4 +O52 $9 +O52 $@ T0 +O52 $C u +O52 $G +O52 $a +O52 $n +O52 $p +O52 $v +O52 'A +O52 *02 +O52 *05 +O52 *31 +O52 *32 +O52 *41 +O52 *67 +O52 +2 +O52 +3 +3 +O52 +5 +O52 +6 i7e +O52 -6 +O52 @y +O52 D7 +O52 L4 +O52 R2 +O52 R3 o66 +O52 R4 +O52 T5 Z4 +O52 T5 O13 +O52 Z1 +O52 Z1 $q +O52 Z3 +O52 [ Z3 +O52 ^$ +O52 ^0 +O52 ^9 +O52 ^J +O52 ^O +O52 ^_ +O52 ^k +O52 d +O52 i01 +O52 i0Q +O52 i2u +O52 i4r +O52 i59 +O52 o0C +O52 o1P +O52 o1d z1 +O52 o23 +O52 o41 +O52 o4g +O52 o4j +O52 r +O52 s0% +O52 sMj +O52 u +O52 O02 +O52 z1 +O52 z1 slI +O52 z3 +O52 } O53 -O53$' -O53$H -O53$R -O53$X -O53$do4R -O53'7o0. -O53*10 -O53*96 -O53*97 -O53+9 -O53-2p1 -O53-4 -O53-9 -O53@e -O53D7 -O53L1 -O53L2@5 -O53R6s2r -O53R7 -O53T0 -O53T1 -O53T4 -O53Z1 -O53Z1sde -O53Z2 -O53Z3 -O53Z5 -O53^2 -O53^P -O53^S -O53^no3n -O53i14 -O53i1a -O53i4l -O53o2e -O53o3 -O53o6a -O53s0. -O53s1B -O53sln -O53t -O53O62 -O53z2 -O53z3 +O53 $' +O53 $H +O53 $R +O53 $X +O53 $d o4R +O53 '7 o0. +O53 *10 +O53 *96 +O53 *97 +O53 +9 +O53 -2 p1 +O53 -4 +O53 -9 +O53 @e +O53 D7 +O53 L1 +O53 L2 @5 +O53 R6 s2r +O53 R7 +O53 T0 +O53 T1 +O53 T4 +O53 Z1 +O53 Z1 sde +O53 Z2 +O53 Z3 +O53 Z5 +O53 ^2 +O53 ^P +O53 ^S +O53 ^n o3n +O53 i14 +O53 i1a +O53 i4l +O53 o2e +O53 o3 +O53 o6a +O53 s0. +O53 s1B +O53 sln +O53 t +O53 O62 +O53 z2 +O53 z3 O54 -O54$, -O54$t -O54$y -O54+A -O54-1R0 -O54-4 -O54-4+2 -O54-5 -O54@5 -O54C -O54D3 -O54R1 -O54R5 -O54R6 -O54R7 -O54T5 -O54Z1z2 -O54Z3 -O54]O21 -O54cO28 -O54i0t -O54i5t -O54i6i -O54i8i -O54l -O54o1F -O54o2P -O54o3D -O54o4/ -O54o54 -O54o6B -O54o6e -O54set -O54shCO02 -O54smBO32 -O54O04 -O54O48 -O54z1 -O54z2 +O54 $, +O54 $t +O54 $y +O54 +A +O54 -1 R0 +O54 -4 +O54 -4 +2 +O54 -5 +O54 @5 +O54 C +O54 D3 +O54 R1 +O54 R5 +O54 R6 +O54 R7 +O54 T5 +O54 Z1 z2 +O54 Z3 +O54 ] O21 +O54 c O28 +O54 i0t +O54 i5t +O54 i6i +O54 i8i +O54 l +O54 o1F +O54 o2P +O54 o3D +O54 o4/ +O54 o54 +O54 o6B +O54 o6e +O54 set +O54 shC O02 +O54 smB O32 +O54 O04 +O54 O48 +O54 z1 +O54 z2 O56 -O56$/ -O56$1 -O56$@ -O56$k -O56$w -O56'8o4s -O56+5 -O56+6 -O56-2@6 -O56-3o2& -O56-6 -O56CO04 -O56L5 -O56R1D3 -O56Z1 -O56Z2 -O56Z3[ -O56^6 -O56^OO23 -O56^r$b -O56i3x -O56o3, -O56O01 -O56O02d -O56O14^i -O56z1 +O56 $/ +O56 $1 +O56 $@ +O56 $k +O56 $w +O56 '8 o4s +O56 +5 +O56 +6 +O56 -2 @6 +O56 -3 o2& +O56 -6 +O56 C O04 +O56 L5 +O56 R1 D3 +O56 Z1 +O56 Z2 +O56 Z3 [ +O56 ^6 +O56 ^O O23 +O56 ^r $b +O56 i3x +O56 o3, +O56 O01 +O56 O02 d +O56 O14 ^i +O56 z1 O57 -O57$. -O57$0 -O57@0 -O57@a -O57R5 -O57Z2 -O57csti -O57i0a -O57i3- -O57p1 +O57 $. +O57 $0 +O57 @0 +O57 @a +O57 R5 +O57 Z2 +O57 c sti +O57 i0a +O57 i3- +O57 p1 O58 -O58'6i5w -O58+2 -O58+5 -O58z1 -O59$z -O59*16 -O59c+0 -O59i5l -O59to3e -O59O71 +O58 '6 i5w +O58 +2 +O58 +5 +O58 z1 +O59 $z +O59 *16 +O59 c +0 +O59 i5l +O59 t o3e +O59 O71 O5A -O5Bo6m -O61$* -O61$+ -O61$1 -O61$5 -O61$= -O61$p -O61$z -O61*41 -O61*53 -O61*64 -O61*78 -O61-2 -O61@i -O61@m -O61C$r -O61L0 -O61R5 -O61T4 -O61^. -O61^/ -O61^? -O61^Q^i -O61^i -O61^q -O61^z -O61i2$O13 -O61i25 -O61i3f -O61i3l -O61i3p'7 -O61i78 -O61i8k -O61i8u -O61o09 -O61o6 -O61o68 -O61o6g -O61o7w -O61o86 -O61r -O61s8m -O61sjxD4 -O61O14 -O61O21 -O61O23 -O61O53@h -O61z3 -O61{z4 -O61}-1 -O61}-9 +O5B o6m +O61 $* +O61 $+ +O61 $1 +O61 $5 +O61 $= +O61 $p +O61 $z +O61 *41 +O61 *53 +O61 *64 +O61 *78 +O61 -2 +O61 @i +O61 @m +O61 C $r +O61 L0 +O61 R5 +O61 T4 +O61 ^. +O61 ^/ +O61 ^? +O61 ^Q ^i +O61 ^i +O61 ^q +O61 ^z +O61 i2$ O13 +O61 i25 +O61 i3f +O61 i3l +i3p '7 +O61 i78 +O61 i8k +O61 i8u +O61 o09 +O61 o6 +O61 o68 +O61 o6g +O61 o7w +O61 o86 +O61 r +O61 s8m +O61 sjx D4 +O61 O14 +O61 O21 +O61 O23 +O61 O53 @h +O61 z3 +O61 { z4 +O61 } -1 +O61 } -9 O62 -O62$n -O62$w -O62'8 -O62*65 -O62+0 -O62+2 -O62-6 -O62-8 -O62@eR1 -O62@u -O62D3 -O62D6s0l -O62D8i61 -O62T3 -O62T6 -O62Z2 -O62Z5*3A -O62[ -O62^3 -O62^H -O62^M -O62^_ -O62^a -O62^l -O62^ul -O62c -O62d -O62i0S -O62i0b^Z -O62i0s -O62i35 -O62i3d-1 -O62i5; -O62i6a -O62i6m -O62i6u -O62i7r -O62l -O62l^M -O62o2y -O62o3t -O62o4* -O62o4j -O62o63 -O62o8s -O62r -O62s1i -O62sbd -O62se< -O62O02 -O62O23 -O62z5O27 +O62 $n +O62 $w +O62 '8 +O62 *65 +O62 +0 +O62 +2 +O62 -6 +O62 -8 +O62 @e R1 +O62 @u +O62 D3 +O62 D6 s0l +O62 D8 i61 +O62 T3 +O62 T6 +O62 Z2 +O62 Z5 *3A +O62 [ +O62 ^3 +O62 ^H +O62 ^M +O62 ^_ +O62 ^a +O62 ^l +O62 ^u l +O62 c +O62 d +O62 i0S +O62 i0b ^Z +O62 i0s +O62 i35 +O62 i3d -1 +O62 i5; +O62 i6a +O62 i6m +O62 i6u +O62 i7r +O62 l +O62 l ^M +O62 o2y +O62 o3t +O62 o4* +O62 o4j +O62 o63 +O62 o8s +O62 r +O62 s1i +O62 sbd +O62 se< +O62 O02 +O62 O23 +O62 z5 O27 O63 -O63$K -O63$R -O63$ao00 -O63$c -O63$mT2 -O63'B -O63*34 -O63*62 -O63-1O25 -O63@h -O63@n -O63R1 -O63R6 -O63R7 -O63Z1 -O63Z3 -O63Z5 -O63[O43 -O63^2 -O63c -O63d -O63i0F -O63i3so46 -O63i4s -O63i73 -O63i82T8 -O63l$r -O63o0x -O63o3z -O63p1O04 -O63r -O63scH -O63sk$ -O63sxS -O63u -O63z3$B +O63 $K +O63 $R +O63 $a o00 +O63 $c +O63 $m T2 +O63 'B +O63 *34 +O63 *62 +O63 -1 O25 +O63 @h +O63 @n +O63 R1 +O63 R6 +O63 R7 +O63 Z1 +O63 Z3 +O63 Z5 +O63 [ O43 +O63 ^2 +O63 c +O63 d +O63 i0F +O63 i3s o46 +O63 i4s +O63 i73 +O63 i82 +O63 l $r +O63 o0x +O63 o3z +O63 p1 O04 +O63 r +O63 scH +O63 sk$ +O63 sxS +O63 u +O63 z3 $B O64 -O64$! -O64$$ -O64$0 -O64$9 -O64$g -O64$u -O64+1 -O64+9 -O64-6 -O64-8o5m -O64T0 -O64[o5c -O64^7 -O64^g -O64i5o -O64i6< -O64i6t -O64i6w -O64l -O64o5q -O64skL -O64t -O64O23 -O64O32 -O64O91O43 +O64 $! +O64 $$ +O64 $0 +O64 $9 +O64 $g +O64 $u +O64 +1 +O64 +9 +O64 -6 +O64 -8 o5m +O64 T0 +O64 [ o5c +O64 ^7 +O64 ^g +O64 i5o +O64 i6< +O64 i6t +O64 i6w +O64 l +O64 o5q +O64 skL +O64 t +O64 O23 +O64 O32 +O64 O91 O43 O65 -O65$+ -O65$/ -O65$c -O65$k -O65*76 -O65+6 -O65@n -O65R0 -O65[ -O65l -O65o0K -O65o0v -O65o1t -O65o6p -O65o91 -O65slb -O65O0B -O65O21 -O65O73 +O65 $+ +O65 $/ +O65 $c +O65 $k +O65 *76 +O65 +6 +O65 @n +O65 R0 +O65 [ +O65 l +O65 o0K +O65 o0v +O65 o1t +O65 o6p +O65 o91 +O65 slb +O65 O0B +O65 O21 +O65 O73 O67 -O67$. -O67+7 -O67-4 -O67D2@w -O67T0 -O67i3l -O67o6ml -O68Z1 +O67 $. +O67 +7 +O67 -4 +O67 D2 @w +O67 T0 +O67 i3l +O67 o6m l +O68 Z1 O69 -O69$x -O69-5 -O69z1 +O69 $x +O69 -5 +O69 z1 O6A -O6A$1 -O6B[ -O71$" -O71$2D3 -O71$9 -O71$E -O71$a -O71$k -O71'8$g -O71'B -O71*53 -O71*56 -O71*58D5 -O71+5 -O71-0c -O71@9 -O71@s -O71L7 -O71R6 -O71T7 -O71Z4 -O71[O41 -O71c} -O71k*64 -O71o5 -O71o6h -O71o6j -O71o81 -O71o8e -O71o8k -O71r -O71s2! -O71s2x -O71sh-O43 -O71O04$f -O71O21 -O71z2O31 +O6A $1 +O6B [ +O71 $" +O71 $2 D3 +O71 $9 +O71 $E +O71 $a +O71 $k +O71 '8 $g +O71 'B +O71 *53 +O71 *56 +O71 *58 D5 +O71 +5 +O71 -0 c +O71 @9 +O71 @s +O71 L7 +O71 R6 +O71 T7 +O71 Z4 +O71 [ O41 +O71 c } +O71 k *64 +O71 o5 +O71 o6h +O71 o6j +O71 o81 +O71 o8e +O71 o8k +O71 r +O71 s2! +O71 s2x +O71 sh- O43 +O71 O04 $f +O71 O21 +O71 z2 O31 O72 -O72$0 -O72$3 -O72$4O63 -O72$a -O72'B -O72*13 -O72+1 -O72+2T6 -O72+8 -O72-5 -O72D1 -O72R7 -O72T2 -O72T7o74 -O72Z2 -O72Z3 -O72Z5 -O72[ -O72[l -O72^2 -O72^O -O72^h -O72^l -O72^m -O72c -O72i0f -O72i62 -O72i83 -O72o0v -O72o6u -O72o7Z -O72sa1 -O72O31 -O72O42 -O72z1 +O72 $0 +O72 $3 +O72 $4 O63 +O72 $a +O72 'B +O72 *13 +O72 +1 +O72 +2 T6 +O72 +8 +O72 -5 +O72 D1 +O72 R7 +O72 T2 +O72 o74 +O72 Z2 +O72 Z3 +O72 Z5 +O72 [ +O72 [ l +O72 ^2 +O72 ^O +O72 ^h +O72 ^l +O72 ^m +O72 c +O72 i0f +O72 i62 +O72 i83 +O72 o0v +O72 o6u +O72 o7Z +O72 sa1 +O72 O31 +O72 O42 +O72 z1 O73 -O73$4 -O73$6T6 -O73$8 -O73$C -O73$z -O73'9u -O73D8 -O73L1 -O73R4 -O73R6 -O73R8 -O73T6 -O73^S -O73^a -O73^i -O73^k -O73i6e -O73l -O73o14 -O73o64 -O73o8! -O73o8? -O73o9o -O73s23 -O73t -O73O51 -O73O84 +O73 $4 +O73 $6 T6 +O73 $8 +O73 $C +O73 $z +O73 '9 u +O73 D8 +O73 L1 +O73 R4 +O73 R6 +O73 R8 +O73 T6 +O73 ^S +O73 ^a +O73 ^i +O73 ^k +O73 i6e +O73 l +O73 o14 +O73 o64 +O73 o8! +O73 o8? +O73 o9o +O73 s23 +O73 t +O73 O51 +O73 O84 O74 -O74$# -O74$i -O74$y -O74'9 -O74+1 -O74+9 -O74@3 -O74D2 -O74T1 -O74i5sD1 -O74l -O74l'8 -O74o0g -O74o0rT7 -O74o4o -O74O04 +O74 $# +O74 $i +O74 $y +O74 '9 +O74 +1 +O74 +9 +O74 @3 +O74 D2 +O74 T1 +O74 i5s D1 +O74 l +O74 l '8 +O74 o0g +O74 o0r T7 +O74 o4o +O74 O04 O75 -O75$1 -O75$u -O75+9 -O75D3sck -O75L0 -O75R7 -O75T0 -O75Z1 -O75i70 -O75o4z -O75o8h -O75O03 -O75O13 -O75O51 +O75 $1 +O75 $u +O75 +9 +O75 D3 sck +O75 L0 +O75 R7 +O75 T0 +O75 Z1 +O75 i70 +O75 o4z +O75 o8h +O75 O03 +O75 O13 +O75 O51 O76 -O76+3 -O76+7 -O76[ -O76i7# -O76o6 -O76O81 -O78$5 -O78i3t -O7A+0 -O7Bc-7 -O7BO1AO15 -O7BO43O2B -O81$1 -O81$9 -O81$m -O81$z -O81'9 -O81*34 -O81*91 -O81-1 -O81-6 -O81-8 -O81-9 -O81-A -O81@b+3 -O81D1 -O81R8 -O81T3 -O81T4 -O81T5 -O81T8 -O81[@f -O81i8ac -O81o0uO53 -O81o2e -O81o5+ -O81o8s -O81o93 -O81p1O6A -O81r -O81s21 -O81seo -O81sry -O81O12 -O81O25l -O81O42 -O81O61 -O81O94 +O76 +3 +O76 +7 +O76 [ +O76 i7# +O76 o6 +O76 O81 +O78 $5 +O78 i3t +O7A +0 +O7B c -7 +O7B O1A O15 +O7B O43 O2B +O81 $1 +O81 $9 +O81 $m +O81 $z +O81 *34 +O81 *91 +O81 -1 +O81 -6 +O81 -8 +O81 -9 +O81 -A +O81 @b +3 +O81 D1 +O81 R8 +O81 T3 +O81 T4 +O81 T5 +O81 T8 +O81 [ @f +O81 i8a c +O81 o0u O53 +O81 o2e +O81 o5+ +O81 o8s +O81 o93 +O81 p1 O6A +O81 r +O81 s21 +O81 seo +O81 sry +O81 O12 +O81 O25 l +O81 O42 +O81 O61 +O81 O94 O82 -O82$6 -O82$c -O82$t -O82'A -O82*86 -O82*94'9 -O82*96 -O82*98 -O82+1 -O82-0 -O82-1 -O82-9 -O82D3 -O82D5 -O82L1 -O82R4O32 -O82R7 -O82T7 -O82Z2 -O82^1 -O82c -O82i6a -O82l -O82s45 -O82O06 -O82O17i1T -O82O34 -O82O92 +O82 $6 +O82 $c +O82 $t +O82 'A +O82 *86 +O82 *94 '9 +O82 *96 +O82 *98 +O82 +1 +O82 -0 +O82 -1 +O82 -9 +O82 D3 +O82 D5 +O82 L1 +O82 R4 O32 +O82 R7 +O82 T7 +O82 Z2 +O82 ^1 +O82 c +O82 i6a +O82 l +O82 s45 +O82 O06 +O82 O17 i1T +O82 O34 +O82 O92 O83 -O83$! -O83$# -O83$3 -O83$7 -O83'A -O83*57 -O83L8 -O83Z1 -O83Z2 -O83Z3 -O83^+ -O83c -O83l -O83o6h -O83o7mO04 -O83sa1 -O83O02T5 -O83O04^z -O83O12 -O83O42 -O83O43 -O83O51 +O83 $! +O83 $# +O83 $3 +O83 $7 +O83 'A +O83 *57 +O83 L8 +O83 Z1 +O83 Z2 +O83 Z3 +O83 ^+ +O83 c +O83 l +O83 o6h +O83 o7m O04 +O83 sa1 +O83 O02 T5 +O83 O04 ^z +O83 O12 +O83 O42 +O83 O43 +O83 O51 O84 -O84$9 -O84*78 -O84+7 -O84-7 -O84-8 -O84L8 -O84Z1 -O84Z1O24 -O84^x -O84i8c -O84l -O84oB0 -O84O34 +O84 $9 +O84 *78 +O84 +7 +O84 -7 +O84 -8 +O84 L8 +O84 Z1 +O84 Z1 O24 +O84 ^x +O84 i8c +O84 l +O84 oB0 +O84 O34 O85 -O85*67 -O85D0 -O85L8 -O85l -O85O43 +O85 *67 +O85 D0 +O85 L8 +O85 l +O85 O43 O86 -O86$1 -O86$l -O86-7 -O86-8 -O86T0 -O86O23 -O86O52 +O86 $1 +O86 $l +O86 -7 +O86 -8 +O86 T0 +O86 O23 +O86 O52 O87 -O87'8o6u -O87+2 -O87O21 -O89+9'9 -O89l -O89O62+7 -O91$9 -O91$< -O91'B -O91+6 -O91+B -O91@dO02 -O91@t -O91R8 -O91R9 -O91i1QO04 -O91i85 -O91o0j -O91o69 -O91o6p -O91o8_ -O91s92 -O91O06 -O91O24 -O91O51'A +'8 o6u +O87 +2 +O87 O21 +O89 '9 +O89 l +O89 O62 +7 +O91 $9 +O91 $< +O91 'B +O91 +6 +O91 +B +O91 @d O02 +O91 @t +O91 R8 +O91 R9 +O91 i1Q O04 +O91 i85 +O91 o0j +O91 o69 +O91 o6p +O91 o8_ +O91 s92 +O91 O06 +O91 O24 +O91 O51 'A O92 -O92$6 -O92$y -O92*87O08 -O92*98 -O92+7'A -O92+A -O92-8 -O92-9 -O92@3[ -O92Z1 -O92cO71 -O92i20 -O92u -O92O21 -O92O25 -O92O35 +O92 $6 +O92 $y +O92 *87 O08 +O92 *98 +O92 +7 'A +O92 +A +O92 -8 +O92 -9 +O92 @3 [ +O92 Z1 +O92 c O71 +O92 i20 +O92 u +O92 O21 +O92 O25 +O92 O35 O93 -O93$2 -O93*18O07 -O93-7 -O93C -O93D6 -O93L9 -O93c -O93i9e -O93l -O93O07 -O93O41 -O93O62 +O93 $2 +O93 *18 O07 +O93 -7 +O93 C +O93 D6 +O93 L9 +O93 c +O93 i9e +O93 l +O93 O07 +O93 O41 +O93 O62 O94 -O94T9o9g -O94O13 -O94O26 -O94O27R1 +O94 o9g +O94 O13 +O94 O26 +O94 O27 R1 O95 -O95$5 -O95o66 -O95O42 +O95 $5 +O95 o66 +O95 O42 O96 -O96'B -O96-6 -O96i16O15 +O96 'B +O96 -6 +O96 i16 O15 O97 -O9Al -O9AO15 -O9AO56O18 -O9AO62 -OA1$yO4A -OA1'B -OA1+7 -OA1+A -OA1+A$6 -OA1-9 -OA1@gO23 -OA1D8 -OA1LA -OA1Z1'B -OA1i0ZO06 -OA1i2k -OA1o1a -OA1oA6 -OA1oB0 -OA1O15 -OA1O21 +O9A l +O9A O15 +O9A O56 O18 +O9A O62 +OA1 $y O4A +OA1 'B +OA1 +7 +OA1 +A +OA1 +A $6 +OA1 -9 +OA1 @g O23 +OA1 D8 +OA1 LA +OA1 Z1 'B +OA1 i0Z O06 +OA1 i2k +OA1 o1a +OA1 oA6 +OA1 oB0 +OA1 O15 +OA1 O21 OA2 -OA2*97 -OA2+A -OA2T8O26 -OA2[ -OA2u +OA2 *97 +OA2 +A +OA2 T8 O26 +OA2 [ +OA2 u OA3 -OA3-A -OA3D6 -OA3c +OA3 -A +OA3 D6 +OA3 c OA4 -OA4$! -OA4$S -OA4D9u -OA4cO03 -OA4O35 -OA5O15 +OA4 $! +OA4 $S +OA4 D9 u +OA4 c O03 +OA4 O35 +OA5 O15 OA6 -OA7O07 -OA9O57 -OABOB4O69 -OB1$1 -OB1$2 -OB1$3 -OB1-B -OB1D1'8 -OB1oB3 +OA7 O07 +OA9 O57 +OAB OB4 O69 +OB1 $1 +OB1 $2 +OB1 $3 +OB1 -B +D1 '8 +OB1 oB3 OB2 -OB2$0 -OB2$4 -OB2$7 -OB2+B -OB2iB9 -OB2l -OB2O16 -OB2O36 +OB2 $0 +OB2 $4 +OB2 $7 +OB2 +B +OB2 iB9 +OB2 l +OB2 O16 +OB2 O36 OB3 -OB3$6 -OB3+9 -OB3-B -OB3Z1 -OB3[ -OB3l -OB3O04 -OB3O17 +OB3 $6 +OB3 +9 +OB3 -B +OB3 Z1 +OB3 [ +OB3 l +OB3 O04 +OB3 O17 OB4 -OB4$r -OB4O19 +OB4 $r +OB4 O19 OB5 -OB6O04 -OB6O46 +OB6 O04 +OB6 O46 OB7 z1 -z1$' -z1$-^A -z1$2 -z1$3 -z1$3^l -z1$7+3 -z1$7@j -z1$; -z1$?k -z1$bu -z1$f -z1$h -z1$i -z1$jR4 -z1$k -z1$l -z1$lC -z1$n -z1$o -z1$x -z1$y-1 -z1'5+1 -z1'5z5 -z1'6$0 -z1'7^M -z1'8 -z1'9T4 -z1'A -z1*02 -z1*03 -z1*10-B -z1*13 -z1*16 -z1*23 -z1*24 -z1*28 -z1*31-5 -z1*3Bc -z1*45O14 -z1*50 -z1*51} -z1*60 -z1*80i1{ -z1*84 -z1*94O12 -z1+1 -z1+4 -z1+6R6 -z1-1 -z1-1sf0 -z1-3 -z1-3d -z1-5Z1 -z1-9O32 -z1@1 -z1@2 -z1@7 -z1@a@1 -z1@b -z1@e -z1@f -z1@g -z1@gT0 -z1@k -z1@m -z1@p -z1@s+7 -z1@t -z1@tz3 -z1@z -z1C -z1Co1f -z1CsHM -z1D4shQ -z1DB -z1L0$1 -z1L1 -z1L2^7 -z1L3 -z1R3 -z1R7k -z1RAO54 -z1T0 -z1T5 -z1Z1*38 -z1Z1^S -z1Z1i16 -z1Z2^4 -z1Z3 -z1Z3'5 -z1Z3^q -z1Z3q -z1Z4 -z1Z5 -z1]r -z1^# -z1^)c -z1^/ -z1^0 -z1^2 -z1^4 -z1^5 -z1^7 -z1^8 -z1^9 -z1^9TB -z1^: -z1^= -z1^A -z1^D -z1^G -z1^I -z1^J -z1^L -z1^N -z1^R -z1^X -z1^^ -z1^a -z1^d -z1^e -z1^f -z1^h -z1^i -z1^j -z1^n -z1^p -z1^s -z1^w -z1^x -z1^| -z1c -z1d -z1f -z1i0F -z1i0F$1 -z1i0k -z1i0l} -z1i0u -z1i0}$7 -z1i1 -z1i1.D5 -z1i14 -z1i15 -z1i17 -z1i1; -z1i1_ -z1i1a -z1i1e -z1i1f -z1i1i -z1i1j -z1i1n -z1i1p -z1i1s -z1i1t -z1i2( -z1i28 -z1i29 -z1i2F -z1i2K-5 -z1i2R -z1i2W -z1i2_T0 -z1i2l -z1i3K -z1i3_*17 -z1i3k -z1i41 -z1i4_ -z1i4h -z1i4ssg3 -z1i5/ -z1i5Z*47 -z1i5e -z1i5f -z1i5yi6R -z1i6q -z1i7G -z1i8a -z1i8lO23 -z1i8t -z1i9H -z1iA1 -z1k^H -z1lO57 -z1o05+8 -z1o0nT4 -z1o0yz3 -z1o2% -z1o24 -z1o2N -z1o2O -z1o2X+6 -z1o2_ -z1o2gl -z1o2y -z1o3- -z1o3No4) -z1o3_ -z1o3f -z1o3m -z1o3x -z1o3z -z1o4, -z1o49 -z1o4c -z1o4k -z1o52 -z1o56Z3 -z1o5E -z1o5Ji3? -z1o5Y -z1o5k -z1o6)O03 -z1o61 -z1o6l -z1o6w -z1o6| -z1o71 -z1o7L -z1o7n -z1o7p -z1o8n -z1o91 -z1oAs -z1p1'5 -z1p1-5 -z1p1z1 -z1r$i -z1r*60 -z1r^r -z1rt -z1s0DO07 -z1s3e -z1s5pc -z1s8zO72 -z1s;| -z1sd5^v -z1sd= -z1sf* -z1shi -z1sig -z1sm/*52 -z1sm8i5n -z1sn9o0p -z1sot -z1stj -z1t -z1tD5 -z1O02o1B -z1O03p1 -z1O06^r -z1O07z2 -z1O0Ai1[ -z1O16Z2 -z1O19'7 -z1O24 -z1O27 -z1O32 -z1O34 -z1O36 -z1O36+4 -z1O38 -z1O42 -z1O43T2 -z1O47 -z1O51 -z1O52Z1 -z1O54 -z1O62l -z1O63 -z1O63l -z1O71 -z1O72 -z1O75 -z1O81 -z1O83 -z1O93 -z1OA7O23 -z1z1*25 -z1z1*68 -z1z1o0l -z1z2^M -z1z2o7m -z1z2o8n -z1{ -z1} -z1}$m -z1}R5 -z1}Z1 -z1}k -z1}u -z1}z1 -z2$-O31 -z2$. -z2$4 -z2$5*58 -z2$6l -z2$@ -z2$A -z2$AO2A -z2$Co80 -z2$D -z2$H -z2$Qo5f -z2$WO36 -z2$^Z2 -z2$c -z2$c^a -z2$fc -z2$h -z2$io1L -z2$k -z2$l -z2$o -z2$o*49 -z2$oT0 -z2$r -z2$s -z2$u -z2$z -z2$| -z2'5 -z2'8d -z2'9 -z2'A -z2*03 -z2*04 -z2*07 -z2*13O02 -z2*14 -z2*15 -z2*23 -z2*24 -z2*25o7r -z2*31 -z2*31} -z2*36*79 -z2*36o19 -z2*39*40 -z2*50 -z2*61 -z2*65 -z2*71 -z2*72 -z2*73 -z2*91 -z2*96 -z2+0 -z2+0r -z2+1 -z2+2 -z2+4$@ -z2+6 -z2+7t -z2+9 -z2+B -z2-0 -z2-1 -z2-1{ -z2-2 -z2-2*69 -z2-3o0T -z2-8 -z2@2 -z2@3 -z2@a -z2@b -z2@bt -z2@j -z2@m -z2@q -z2C -z2C*54 -z2CZ1 -z2D4^+ -z2D5Z5 -z2D7O81 -z2D8 -z2K -z2L0*53 -z2L0i2< -z2L1 -z2L3 -z2L7 -z2R0 -z2R0'7 -z2R1 -z2R2 -z2R4-6 -z2R6 -z2R9 -z2T0*45 -z2T2O38 -z2T4 -z2T4L1 -z2Z1 -z2Z3O38 -z2Z5O14 -z2[i6N -z2] -z2]u -z2^ -z2^" -z2^"C -z2^#$j -z2^*$% -z2^,k -z2^2 -z2^2i3r -z2^4 -z2^7 -z2^< -z2^A*80 -z2^AD4 -z2^W -z2^X$! -z2^[ -z2^` -z2^a -z2^b -z2^c -z2^e -z2^i -z2^ii5y -z2^k*53 -z2^m -z2^p -z2^t -z2^vz2 -z2^{^N -z2c -z2cZ1 -z2c^[ -z2co7d -z2dO82 -z2i0! -z2i0Fi4b -z2i0J -z2i1 ^h -z2i1+] -z2i14 -z2i19] -z2i1C+5 -z2i1Vc -z2i1a -z2i1k -z2i1m*13 -z2i1n -z2i1o -z2i1u -z2i2g -z2i38c -z2i3f*16 -z2i3h -z2i3l*06 -z2i3o -z2i3p -z2i3ro4k -z2i58 -z2i5LO36 -z2i5g -z2i6gk -z2i6u -z2i73 -z2i7a -z2i7o -z2i7s -z2i7t -z2i99*36 -z2i9e -z2lr -z2lO52 -z2o0!i0f -z2o0"*06 -z2o03 -z2o06 -z2o0Z -z2o0g*15 -z2o0m -z2o1- -z2o1. -z2o1/ -z2o10 -z2o1H -z2o1k -z2o1l -z2o1u -z2o1y -z2o2- -z2o21 -z2o2P -z2o2a*07 -z2o2b -z2o2gO35 -z2o3>$2 -z2o3\i1k -z2o3mD5 -z2o3o -z2o4H -z2o4Z -z2o4qz1 -z2o59 -z2o5w -z2o6= -z2o6> -z2o6Qi7N -z2o6a -z2o6nk -z2o7.l -z2o74 -z2o7N -z2o7gz1 -z2o7l -z2o83 -z2o88 -z2o93 -z2oB9 -z2p1 -z2p2O74 -z2q -z2r-7 -z2rc -z2s.@c -z2s0Ol -z2s2b -z2s4f -z2s4x -z2s7m -z2s97 -z2s9k -z2sbq -z2scl -z2sd8 -z2si3O34 -z2siai2g -z2slMo99 -z2srtO04 -z2su% -z2sx -z2tK -z2u+9 -z2u^0 -z2u^K -z2uo1< -z2usG0 -z2O24 -z2O27 -z2O29Z1 -z2O2A -z2O32 -z2O35*03 -z2O35T0 -z2O42 -z2O45i0E -z2O47 -z2O53 -z2O61 -z2O65l -z2z1i2: -z2z1i37 -z2z3o5l -z2z4 -z2{Z5 -z2} -z2}*29 -z3$+ -z3$3 -z3$5O51 -z3$7 -z3$Ak -z3$c -z3$e -z3$ei4; -z3$el -z3$f -z3$h -z3$k -z3$n -z3$rD9 -z3$s -z3$y -z3'8 -z3'8Z4 -z3'9 -z3'9r -z3'A -z3'B*39 -z3*04 -z3*06 -z3*07 -z3*14 -z3*15 -z3*16*70 -z3*17 -z3*19 -z3*24 -z3*26 -z3*27 -z3*28 -z3*35 -z3*43 -z3*46 -z3*57O71 -z3*58 -z3*58o8* -z3*61 -z3*72T5 -z3*73 -z3*75 -z3*83 -z3*87 -z3*94R3 -z3*95+8 -z3*97 -z3+0 -z3+1 -z3+1O49 -z3+2 -z3+4z5 -z3+5 -z3+6 -z3+6u -z3+8 -z3-1 -z3-1-2 -z3-2 -z3-3 -z3-5-3 -z3-9 -z3@a -z3@h -z3@j -z3@k -z3@mss1 -z3C -z3D1*75 -z3D3O2B -z3D4*59 -z3D5r -z3D7 -z3K -z3K$g -z3K} -z3L4O38 -z3R0*37 -z3R1 -z3R4 -z3R4-0 -z3R6 -z3T1 -z3T2 -z3T4sru -z3Z1*80 -z3Z1-0 -z3Z3'8 -z3Z3+9 -z3Z4 -z3[o7i -z3[{ -z3] -z3^! -z3^# -z3^' -z3^. -z3^; -z3^B -z3^D-5 -z3^G -z3^Qi0S -z3^R$` -z3^V -z3^Y -z3^Y*30 -z3^c -z3^m -z3^q -z3^q-8 -z3^ssns -z3^w^= -z3^wl -z3^x -z3c -z3c*42 -z3cK -z3cs7V -z3dO54 -z3i01^# -z3i0U -z3i0d -z3i15 -z3i1XO01 -z3i26 -z3i28 -z3i3gO48 -z3i3r -z3i3z -z3i41 -z3i4C -z3i4l -z3i4yO36 -z3i5^ -z3i5zT4 -z3i5{ -z3i6++8 -z3i6r -z3k'7 -z3ksgc -z3l -z3o08 -z3o0f -z3o0mZ1 -z3o0n -z3o0qo4! -z3o12 -z3o1O*84 -z3o1c -z3o2- -z3o21 -z3o23 -z3o2LO64 -z3o2b -z3o39z2 -z3o3A -z3o3j[ -z3o3r+5 -z3o3z -z3o48L6 -z3o4J -z3o4Z -z3o4d -z3o4dD5 -z3o5Xc -z3o5b -z3o5d^' -z3o5g -z3o5l*38 -z3o6-D0 -z3o6}*2B -z3o7g -z3o8 -z3o88 -z3o8P -z3o8h -z3rsk* -z3s3lO35 -z3s8jo84 -z3sM4O24 -z3sMr -z3scl -z3scr -z3siI*26 -z3sis -z3sjW -z3srx -z3ssz*23 -z3sys -z3szd -z3tO54 -z3O01O72 -z3O02^E -z3O14Z4 -z3O25u -z3O27 -z3O29 -z3O29$B -z3O2A -z3O36i11 -z3O39 -z3O41 -z3O41O46 -z3O42 -z3O43 -z3O52 -z3O52z4 -z3O56 -z3O61{ -z3O63 -z3O63*42 -z3O72 -z3O75 -z3O84 -z3OA1*5A -z3z2*65 -z3z3*81 -z3z3C -z3z3^N -z3z4 -z3z5 -z3z5-A -z3z5O93 -z3{ -z3{-4 -z3{^' -z3} -z3}^( -z3}i4* +z1 $' +z1 $- ^A +z1 $2 +z1 $3 +z1 $3 ^l +z1 $7 +3 +z1 $7 @j +z1 $; +z1 $? +z1 $b u +z1 $f +z1 $h +z1 $i +z1 $j R4 +z1 $k +z1 $l +z1 $l C +z1 $n +z1 $o +z1 $x +z1 $y -1 +z1 '5 +1 +z1 '5 z5 +z1 '6 $0 +z1 '7 ^M +z1 '8 +z1 '9 T4 +z1 'A +z1 *02 +z1 *03 +z1 -B +z1 *13 +z1 *16 +z1 *23 +z1 *24 +z1 *28 +z1 *31 -5 +z1 *3B c +z1 *45 O14 +z1 *50 +z1 *51 } +z1 *60 +z1 *80 i1{ +z1 *84 +z1 *94 O12 +z1 +1 +z1 +4 +z1 +6 R6 +z1 -1 +z1 -1 sf0 +z1 -3 +z1 -3 d +z1 -5 Z1 +z1 -9 O32 +z1 @1 +z1 @2 +z1 @a @1 +z1 @b +z1 @e +z1 @g +z1 @g T0 +z1 @k +z1 @m +z1 @p +z1 @s +7 +z1 @t +z1 @t z3 +z1 C +z1 C o1f +z1 C sHM +z1 D4 shQ +z1 DB +z1 L0 $1 +z1 L1 +z1 L2 ^7 +z1 L3 +z1 R3 +z1 R7 +z1 RA O54 +z1 T0 +z1 T5 +z1 Z1 *38 +z1 Z1 ^S +z1 Z1 i16 +z1 Z2 ^4 +z1 Z3 +z1 Z3 '5 +z1 Z3 ^q +z1 Z3 q +z1 Z4 +z1 Z5 +z1 ] r +z1 ^# +z1 ^) c +z1 ^/ +z1 ^0 +z1 ^2 +z1 ^4 +z1 ^5 +z1 ^7 +z1 ^8 +z1 ^9 +z1 ^9 TB +z1 ^: +z1 ^= +z1 ^A +z1 ^D +z1 ^G +z1 ^I +z1 ^J +z1 ^L +z1 ^N +z1 ^R +z1 ^X +z1 ^^ +z1 ^a +z1 ^d +z1 ^e +z1 ^f +z1 ^h +z1 ^i +z1 ^j +z1 ^n +z1 ^p +z1 ^s +z1 ^w +z1 ^x +z1 ^| +z1 c +z1 d +z1 f +z1 i0F +z1 i0F $1 +z1 i0k +z1 i0l } +z1 i0u +z1 i0} $7 +z1 i1 +z1 i1. D5 +z1 i14 +z1 i15 +z1 i17 +z1 i1; +z1 i1_ +z1 i1a +z1 i1e +z1 i1f +z1 i1i +z1 i1j +z1 i1n +z1 i1p +z1 i1s +z1 i1t +z1 i2( +z1 i28 +z1 i29 +z1 i2F +z1 i2K -5 +z1 i2R +z1 i2W +z1 i2_ T0 +z1 i2l +z1 i3K +z1 i3_ *17 +z1 i3k +z1 i41 +z1 i4_ +z1 i4h +z1 i4s sg3 +z1 i5/ +z1 i5Z *47 +z1 i5e +z1 i5f +z1 i5y i6R +z1 i6q +z1 i7G +z1 i8a +z1 i8l O23 +z1 i8t +z1 i9H +z1 iA1 +z1 ^H +z1 l O57 +z1 o05 +8 +z1 o0n T4 +z1 o0y z3 +z1 o2% +z1 o24 +z1 o2N +z1 o2O +z1 o2X +6 +z1 o2_ +z1 o2g l +z1 o2y +z1 o3- +z1 o3N o4) +z1 o3_ +z1 o3f +z1 o3m +z1 o3x +z1 o3z +z1 o4, +z1 o49 +z1 o4c +z1 o4k +z1 o52 +z1 o56 Z3 +z1 o5E +z1 o5J i3? +z1 o5Y +z1 o5k +z1 o6) O03 +z1 o61 +z1 o6l +z1 o6w +z1 o6| +z1 o71 +z1 o7L +z1 o7n +z1 o7p +z1 o8n +z1 o91 +z1 oAs +z1 p1 '5 +z1 p1 -5 +z1 p1 z1 +z1 r $i +z1 r *60 +z1 r ^r +z1 r t +z1 s0D O07 +z1 s3e +z1 s5p c +z1 s8z O72 +z1 s;| +z1 sd5 ^v +z1 sd= +z1 sf* +z1 shi +z1 sig +z1 sm/ *52 +z1 sm8 i5n +z1 sn9 o0p +z1 sot +z1 stj +z1 t +z1 t D5 +z1 O02 o1B +z1 O03 p1 +z1 O06 ^r +z1 O07 z2 +z1 O0A i1[ +z1 O16 Z2 +z1 O19 '7 +z1 O24 +z1 O27 +z1 O32 +z1 O34 +z1 O36 +z1 O36 +4 +z1 O38 +z1 O42 +z1 O43 T2 +z1 O47 +z1 O51 +z1 O52 Z1 +z1 O54 +z1 O62 l +z1 O63 +z1 O63 l +z1 O71 +z1 O72 +z1 O75 +z1 O81 +z1 O83 +z1 O93 +z1 OA7 O23 +z1 z1 *25 +z1 z1 *68 +z1 z1 o0l +z1 z2 ^M +z1 z2 o7m +z1 z2 o8n +z1 { +z1 } +z1 } $m +z1 } R5 +z1 } Z1 +z1 } k +z1 } u +z1 } z1 +z2 $- O31 +z2 $. +z2 $4 +z2 $5 *58 +z2 $6 l +z2 $@ +z2 $A +z2 $A O2A +z2 $C o80 +z2 $D +z2 $H +z2 $Q o5f +z2 $W O36 +z2 $^ Z2 +z2 $c +z2 $c ^a +z2 $f c +z2 $h +z2 $i o1L +z2 $k +z2 $l +z2 $o +z2 $o *49 +z2 $o T0 +z2 $r +z2 $s +z2 $u +z2 $z +z2 $| +z2 '5 +z2 '8 d +z2 '9 +z2 'A +z2 *03 +z2 *04 +z2 *07 +z2 *13 O02 +z2 *14 +z2 *15 +z2 *23 +z2 *24 +z2 *25 o7r +z2 *31 +z2 *31 } +z2 *36 *79 +z2 *36 o19 +z2 *39 *40 +z2 *50 +z2 *61 +z2 *65 +z2 *71 +z2 *72 +z2 *73 +z2 *91 +z2 *96 +z2 +0 +z2 +0 r +z2 +1 +z2 +2 +z2 +4 $@ +z2 +6 +z2 +7 t +z2 +9 +z2 +B +z2 -0 +z2 -1 +z2 -1 { +z2 -2 +z2 -2 *69 +z2 -3 o0T +z2 -8 +z2 @2 +z2 @a +z2 @b +z2 @b t +z2 @j +z2 @m +z2 @q +z2 C +z2 C *54 +z2 C Z1 +z2 D4 ^+ +z2 D5 Z5 +z2 D7 O81 +z2 D8 +z2 K +z2 L0 *53 +z2 L0 i2< +z2 L1 +z2 L3 +z2 L7 +z2 R0 +z2 R0 '7 +z2 R1 +z2 R2 +z2 R4 -6 +z2 R6 +z2 R9 +z2 T0 *45 +z2 T2 O38 +z2 T4 +z2 T4 L1 +z2 Z1 +z2 Z3 O38 +z2 Z5 O14 +z2 [ i6N +z2 ] +z2 ] u +z2 ^ +z2 ^" +z2 ^" C +z2 ^# $j +z2 ^* $% +z2 ^, k +z2 ^2 +z2 ^2 i3r +z2 ^4 +z2 ^7 +z2 ^< +z2 ^A *80 +z2 ^A D4 +z2 ^W +z2 ^X $! +z2 ^[ +z2 ^` +z2 ^a +z2 ^b +z2 ^c +z2 ^e +z2 ^i +z2 ^i i5y +z2 ^k *53 +z2 ^m +z2 ^p +z2 ^t +z2 ^v z2 +z2 ^{ ^N +z2 c +z2 c Z1 +z2 c ^[ +z2 c o7d +z2 d O82 +z2 i0! +z2 i0F i4b +z2 i0J +z2 i1 ^h +z2 i1+ ] +z2 i14 +z2 i19 ] +z2 i1C +5 +z2 i1V c +z2 i1a +z2 i1k +z2 i1m *13 +z2 i1n +z2 i1o +z2 i1u +z2 i2g +z2 i38 c +z2 i3f *16 +z2 i3h +z2 i3l *06 +z2 i3o +z2 i3p +z2 i3r o4k +z2 i58 +z2 i5L O36 +z2 i5g +z2 i6g +z2 i6u +z2 i73 +z2 i7a +z2 i7o +z2 i7s +z2 i7t +z2 i99 *36 +z2 i9e +z2 l r +z2 l O52 +z2 o0! i0f +z2 o0" *06 +z2 o03 +z2 o06 +z2 o0Z +z2 o0g *15 +z2 o0m +z2 o1- +z2 o1. +z2 o1/ +z2 o10 +z2 o1H +z2 o1k +z2 o1l +z2 o1u +z2 o1y +z2 o2- +z2 o21 +z2 o2P +z2 o2a *07 +z2 o2b +z2 o2g O35 +z2 o3> $2 +z2 o3\ i1k +z2 o3m D5 +z2 o3o +z2 o4H +z2 o4Z +z2 o4q z1 +z2 o59 +z2 o5w +z2 o6= +z2 o6> +z2 o6Q i7N +z2 o6a +z2 o6n +z2 o7. l +z2 o74 +z2 o7N +z2 o7g z1 +z2 o7l +z2 o83 +z2 o88 +z2 o93 +z2 oB9 +z2 p1 +z2 p2 O74 +z2 q +z2 r -7 +z2 r c +z2 s.@ c +z2 s0O l +z2 s2b +z2 s4f +z2 s4x +z2 s7m +z2 s97 +z2 s9k +z2 sbq +z2 scl +z2 sd8 +z2 si3 O34 +z2 sia i2g +z2 slM o99 +z2 srt O04 +z2 su% +z2 sx +z2 t K +z2 u +9 +z2 u ^0 +z2 u ^K +z2 u o1< +z2 u sG0 +z2 O24 +z2 O27 +z2 O29 Z1 +z2 O2A +z2 O32 +z2 O35 *03 +z2 O35 T0 +z2 O42 +z2 O45 i0E +z2 O47 +z2 O53 +z2 O61 +z2 O65 l +z2 z1 i2: +z2 z1 i37 +z2 z3 o5l +z2 z4 +z2 { Z5 +z2 } +z2 } *29 +z3 $+ +z3 $3 +z3 $5 O51 +z3 $7 +z3 $A +z3 $c +z3 $e +z3 $e i4; +z3 $e l +z3 $f +z3 $h +z3 $k +z3 $n +z3 $r D9 +z3 $s +z3 $y +z3 '8 +z3 '8 Z4 +z3 '9 +z3 '9 r +z3 'A +z3 'B *39 +z3 *04 +z3 *06 +z3 *07 +z3 *14 +z3 *15 +z3 *16 *70 +z3 *17 +z3 *19 +z3 *24 +z3 *26 +z3 *27 +z3 *28 +z3 *35 +z3 *43 +z3 *46 +z3 *57 O71 +z3 *58 +z3 *58 o8* +z3 *61 +z3 *72 T5 +z3 *73 +z3 *75 +z3 *83 +z3 *87 +z3 *94 R3 +z3 *95 +8 +z3 *97 +z3 +0 +z3 +1 +z3 +1 O49 +z3 +2 +z3 +4 z5 +z3 +5 +z3 +6 +z3 +6 u +z3 +8 +z3 -1 +z3 -1 -2 +z3 -2 +z3 -3 +z3 -5 -3 +z3 -9 +z3 @a +z3 @h +z3 @j +z3 @k +z3 @m ss1 +z3 C +z3 D1 *75 +z3 D3 O2B +z3 D4 *59 +z3 D5 r +z3 D7 +z3 K +z3 K $g +z3 K } +z3 L4 O38 +z3 R0 *37 +z3 R1 +z3 R4 +z3 R4 -0 +z3 R6 +z3 T1 +z3 T2 +z3 T4 sru +z3 Z1 *80 +z3 Z1 -0 +z3 Z3 '8 +z3 Z3 +9 +z3 Z4 +z3 [ o7i +z3 [ { +z3 ] +z3 ^! +z3 ^# +z3 ^' +z3 ^. +z3 ^; +z3 ^B +z3 ^D -5 +z3 ^G +z3 ^Q i0S +z3 ^R $` +z3 ^V +z3 ^Y +z3 ^Y *30 +z3 ^c +z3 ^m +z3 ^q +z3 ^q -8 +z3 ^s sns +z3 ^w ^= +z3 ^w l +z3 ^x +z3 c +z3 c *42 +z3 c K +z3 c s7V +z3 d O54 +z3 i01 ^# +z3 i0U +z3 i0d +z3 i15 +z3 i1X O01 +z3 i26 +z3 i28 +z3 i3g O48 +z3 i3r +z3 i3z +z3 i41 +z3 i4C +z3 i4l +z3 i4y O36 +z3 i5^ +z3 i5z T4 +z3 i5{ +z3 i6+ +8 +z3 i6r +z3 '7 +z3 sgc +z3 l +z3 o08 +z3 o0f +z3 o0m Z1 +z3 o0n +z3 o0q o4! +z3 o12 +z3 o1O *84 +z3 o1c +z3 o2- +z3 o21 +z3 o23 +z3 o2L O64 +z3 o2b +z3 o39 z2 +z3 o3A +z3 o3j [ +z3 o3r +5 +z3 o3z +z3 o48 L6 +z3 o4J +z3 o4Z +z3 o4d +z3 o4d D5 +z3 o5X c +z3 o5b +z3 o5d ^' +z3 o5g +z3 o5l *38 +z3 o6- D0 +z3 o6} *2B +z3 o7g +z3 o8 +z3 o88 +z3 o8P +z3 o8h +z3 r sk* +z3 s3l O35 +z3 s8j o84 +z3 sM4 O24 +z3 sMr +z3 scl +z3 scr +z3 siI *26 +z3 sis +z3 sjW +z3 srx +z3 ssz +z3 sys +z3 szd +z3 t O54 +z3 O01 O72 +z3 O02 ^E +z3 O14 Z4 +z3 O25 u +z3 O27 +z3 O29 +z3 O29 $B +z3 O2A +z3 O36 i11 +z3 O39 +z3 O41 +z3 O41 O46 +z3 O42 +z3 O43 +z3 O52 +z3 O52 z4 +z3 O56 +z3 O61 { +z3 O63 +z3 O63 *42 +z3 O72 +z3 O75 +z3 O84 +z3 OA1 *5A +z3 z2 *65 +z3 z3 *81 +z3 z3 C +z3 z3 ^N +z3 z4 +z3 z5 +z3 z5 -A +z3 z5 O93 +z3 { +z3 { -4 +z3 { ^' +z3 } +z3 } ^( +z3 } i4* z4 -z4$! -z4$0 -z4$1 -z4$=C -z4$M -z4$b -z4$e*71 -z4$f -z4$m -z4$x} -z4'9o2^ -z4*07 -z4*0A -z4*17 -z4*25 -z4*28'5 -z4*28O62 -z4*35'A -z4*36 -z4*36+4 -z4*49 -z4*50O54 -z4*51 -z4*54 -z4*58 -z4*59O16 -z4*60 -z4*61$3 -z4*73*59 -z4*76 -z4*78*76 -z4*81 -z4*83O61 -z4*95*35 -z4*98 -z4+0 -z4+0+6 -z4+1 -z4+2 -z4+5 -z4+6T2 -z4+9^+ -z4+A -z4-0 -z4-0] -z4-1 -z4-2 -z4-3 -z4-4 -z4-5 -z4-8O12 -z4C -z4D8 -z4K*35 -z4L0 -z4L1 -z4L2O38 -z4L5 -z4R2 -z4R3 -z4R6+3 -z4R8*21 -z4T1 -z4T2sm5 -z4T4 -z4T5 -z4T7+4 -z4Z1 -z4Z1O81 -z4Z1} -z4Z2$A -z4Z3 -z4Z5 -z4[$b -z4[L2 -z4[o4l -z4] -z4]{ -z4^. -z4^4D2 -z4^9 -z4^: -z4^B-8 -z4^N -z4^`*5A -z4^c -z4^i -z4^j -z4^n -z4^|o0O -z4c -z4f'9 -z4i0b -z4i11 -z4i1h -z4i2Dsrw -z4i37 -z4i4# -z4i4- -z4i47 -z4i4b -z4i4f -z4i5_ -z4i5m -z4i5y[ -z4i6d -z4i7& -z4i8@O27 -z4i9r -z4iBd -z4li4+ -z4o2y -z4o3[ -z4o3d -z4o3h -z4o3l$1 -z4o3y -z4o3{ -z4o4> -z4o6= -z4o7u -z4o84c -z4o8U -z4o8z -z4oAr -z4p1O3A -z4p3 -z4r*18 -z4rO34 -z4s0ao3f -z4sbq -z4srPT5 -z4sso -z4suy -z4sw+ -z4swv -z4t -z4t$L -z4tO34 -z4O01@e -z4O06$u -z4O06o3v -z4O16i4e -z4O16o4% -z4O18+2 -z4O1AZ2 -z4O24i7O -z4O28u -z4O29 -z4O34} -z4O35 -z4O35f -z4O35o0N -z4O37 -z4O42o6x -z4O43 -z4O43C -z4O46 -z4O54R0 -z4O56 -z4O5A -z4O63z5 -z4O71+9 -z4O82 -z4O92c -z4z5 -z4z5O75 -z4{ -z4{+0 -z4{^y -z4} -z4}O28 -z5$9 -z5$; -z5$y -z5'6T4 -z5'8$o -z5*17 -z5*27+3 -z5*36 -z5*48 -z5*4Ai0# -z5*60 -z5*64 -z5*67 -z5*72[ -z5*74 -z5*A2O92 -z5+1 -z5+2 -z5+4 -z5+4shk -z5+5T5 -z5+6 -z5+7 -z5+7z3 -z5+8o8f -z5-0 -z5-1+2 -z5-2 -z5-9 -z5@3 -z5@a -z5D7-4 -z5K -z5L1 -z5R0 -z5R1 -z5R5 -z5T1 -z5T5 -z5T7-3 -z5Z1O27 -z5Z2O27 -z5Z4 -z5Z4^g -z5[o4o -z5] -z5^/ -z5^3O75 -z5^6 -z5^D -z5^m -z5^nz1 -z5^w -z5^z -z5^zO76 -z5d'9 -z5i01z4 -z5i3|i6X -z5i4c -z5i57 -z5i5l -z5i69O57 -z5i6U -z5i71O34 -z5i7R -z5i7u*9B -z5i9?O57 -z5i9Zl -z5ki6d -z5o0er -z5o10o3k -z5o1X -z5o1li28 -z5o3O-8 -z5o4{O39 -z5o6d*15 -z5o6t -z5o7e -z5o7pD8 -z5oA1i4l -z5oA3z1 -z5qO3A -z5rO34 -z5s36 -z5s36O36 -z5s5q -z5s5t -z5s9AO1B -z5shsO38 -z5sw& -z5t*76 -z5u -z5u+3 -z5O07@p -z5O0B+5 -z5O0B^r -z5O17k -z5O1AZ1 -z5O23i72 -z5O24O76 -z5O25 -z5O28 -z5O29 -z5O35 -z5O35Z2 -z5O38+1 -z5O38l -z5O39 -z5O3A -z5O43 -z5O45r -z5O48 -z5O49Z1 -z5O53K -z5O53^; -z5O56 -z5O5Az2 -z5O61 -z5O62i40 -z5O64 -z5O65D6 -z5O68 -z5O71*27 -z5O71o33 -z5O72 -z5O73 -z5O79 -z5O79$r -z5O81] -z5O84 -z5z3o7b -z5}O47 +z4 $! +z4 $0 +z4 $1 +z4 $= C +z4 $M +z4 $b +z4 $e *71 +z4 $f +z4 $m +z4 $x } +z4 '9 o2^ +z4 *07 +z4 *0A +z4 *17 +z4 *25 +z4 *28 '5 +z4 *28 O62 +z4 *35 'A +z4 *36 +z4 *36 +4 +z4 *49 +z4 *50 O54 +z4 *51 +z4 *54 +z4 *58 +z4 *59 O16 +z4 *60 +z4 *61 $3 +z4 *73 *59 +z4 *76 +z4 *78 *76 +z4 *81 +z4 *83 O61 +z4 *95 *35 +z4 *98 +z4 +0 +z4 +0 +6 +z4 +1 +z4 +2 +z4 +5 +z4 +6 T2 +z4 +9 ^+ +z4 +A +z4 -0 +z4 -0 ] +z4 -1 +z4 -2 +z4 -3 +z4 -4 +z4 -5 +z4 -8 O12 +z4 C +z4 D8 +z4 K *35 +z4 L0 +z4 L1 +z4 L2 O38 +z4 L5 +z4 R2 +z4 R3 +z4 R6 +3 +z4 R8 +z4 T1 +z4 T2 sm5 +z4 T4 +z4 T5 +z4 T7 +4 +z4 Z1 +z4 Z1 O81 +z4 Z1 } +z4 Z2 $A +z4 Z3 +z4 Z5 +z4 [ $b +z4 [ L2 +z4 [ o4l +z4 ] +z4 ] { +z4 ^. +z4 ^4 D2 +z4 ^9 +z4 ^: +z4 ^B -8 +z4 ^N +z4 ^` *5A +z4 ^c +z4 ^i +z4 ^j +z4 ^n +z4 ^| o0O +z4 c +z4 f '9 +z4 i0b +z4 i11 +z4 i1h +z4 i2D srw +z4 i37 +z4 i4# +z4 i4- +z4 i47 +z4 i4b +z4 i4f +z4 i5_ +z4 i5m +z4 i5y [ +z4 i6d +z4 i7& +z4 i8@ O27 +z4 i9r +z4 iBd +z4 l i4+ +z4 o2y +z4 o3[ +z4 o3d +z4 o3h +z4 o3l $1 +z4 o3y +z4 o3{ +z4 o4> +z4 o6= +z4 o7u +z4 o84 c +z4 o8U +z4 o8z +z4 oAr +z4 p1 O3A +z4 p3 +z4 r *18 +z4 r O34 +z4 s0a o3f +z4 sbq +z4 srP T5 +z4 sso +z4 suy +z4 sw+ +z4 swv +z4 t +z4 t $L +z4 t O34 +z4 O01 @e +z4 O06 $u +z4 O06 o3v +z4 O16 i4e +z4 O16 o4% +z4 O18 +2 +z4 O1A Z2 +z4 O24 i7O +z4 O28 u +z4 O29 +z4 O34 } +z4 O35 +z4 O35 f +z4 O35 o0N +z4 O37 +z4 O42 o6x +z4 O43 +z4 O43 C +z4 O46 +z4 O54 R0 +z4 O56 +z4 O5A +z4 O63 z5 +z4 O71 +9 +z4 O82 +z4 O92 c +z4 z5 +z4 z5 O75 +z4 { +z4 { +0 +z4 { ^y +z4 } +z4 } O28 +z5 $9 +z5 $; +z5 $y +z5 '6 T4 +z5 '8 $o +z5 *17 +z5 *27 +3 +z5 *36 +z5 *48 +z5 *4A i0# +z5 *60 +z5 *64 +z5 *67 +z5 *72 [ +z5 *74 +z5 *A2 O92 +z5 +1 +z5 +2 +z5 +4 +z5 +4 shk +z5 +5 T5 +z5 +6 +z5 +7 +z5 +7 z3 +z5 o8f +z5 -0 +z5 -1 +2 +z5 -2 +z5 -9 +z5 @3 +z5 @a +z5 D7 -4 +z5 K +z5 L1 +z5 R0 +z5 R1 +z5 R5 +z5 T1 +z5 T5 +z5 T7 -3 +z5 Z1 O27 +z5 Z2 O27 +z5 Z4 +z5 Z4 ^g +z5 [ o4o +z5 ] +z5 ^/ +z5 ^3 O75 +z5 ^6 +z5 ^D +z5 ^m +z5 ^n z1 +z5 ^w +z5 ^z +z5 ^z O76 +z5 d '9 +z5 i01 z4 +z5 i3| i6X +z5 i4c +z5 i57 +z5 i5l +z5 i69 O57 +z5 i6U +z5 i71 O34 +z5 i7R +z5 i7u *9B +z5 i9? O57 +z5 i9Z l +z5 i6d +z5 o0e r +z5 o10 o3k +z5 o1X +z5 o1l i28 +z5 o3O -8 +z5 o4{ O39 +z5 o6d +z5 o6t +z5 o7e +z5 o7p D8 +z5 oA1 i4l +z5 oA3 z1 +z5 q O3A +z5 r O34 +z5 s36 +z5 s36 O36 +z5 s5q +z5 s5t +z5 s9A O1B +z5 shs O38 +z5 sw& +z5 t *76 +z5 u +z5 u +3 +z5 O07 @p +z5 O0B +5 +z5 O0B ^r +z5 O17 k +z5 O1A Z1 +z5 O23 i72 +z5 O24 O76 +z5 O25 +z5 O28 +z5 O29 +z5 O35 +z5 O35 Z2 +z5 O38 +1 +z5 O38 l +z5 O39 +z5 O3A +z5 O43 +z5 O45 r +z5 O48 +z5 O49 Z1 +z5 O53 K +z5 O53 ^; +z5 O56 +z5 O5A z2 +z5 O61 +z5 O62 i40 +z5 O64 +z5 O65 D6 +z5 O68 +z5 O71 *27 +z5 O71 o33 +z5 O72 +z5 O73 +z5 O79 +z5 O79 $r +z5 O81 ] +z5 O84 +z5 z3 o7b +z5 } O47 { -{$) -{$+ -{$- -{$0 -{$1 -{$2 -{$4 -{$6 -{$7 -{$8$P -{$9 -{$C -{$Pl -{$_ -{$` -{$a -{$e^` -{$g -{$i -{$j -{$k -{$l -{$n -{$oz3 -{$s -{$w -{$x -{'9 -{*03 -{*05 -{*12 -{*13 -{*16 -{*17 -{*20u -{*24 -{*25 -{*27 -{*30z1 -{*31*51 -{*32 -{*34 -{*37 -{*41 -{*42o3> -{*51C -{*65 -{*A7 -{+1 -{+1Z2 -{+4 -{+7 -{+7*75 -{+9 -{-0 -{-0t -{-3 -{-4c -{-7 -{-8 -{C -{C[ -{Ci1R -{D1t -{D3 -{K*35 -{L1 -{L6l -{L8 -{R0 -{R0z1 -{R2 -{R3 -{R3[ -{R5 -{R7 -{R8 -{R9 -{T0 -{T2 -{T6i3X -{Z1 -{Z1'4 -{Z1*26 -{Z1o0: -{Z1s1^ -{Z1z2 -{Z2 -{Z2$0 -{Z2R5 -{Z2u -{Z3 -{Z3k -{Z4 -{Z4r -{Z5 -{[sfd -{]i2v -{^! -{^% -{^* -{^. -{^0 -{^1 -{^3 -{^7 -{^8 -{^9 -{^:D1 -{^;L0 -{^= -{^> -{^Au -{^B -{^C -{^E -{^L -{^M -{^R -{^T -{^X^Q -{^a -{^b -{^d -{^j -{^k -{^m -{^p -{^t -{^w -{^y$f -{c -{cO21 -{f -{i0$ -{i1' -{i14 -{i15 -{i16 -{i17 -{i18 -{i1a -{i1d -{i1} -{i2+Z2 -{i2V -{i2` -{i2c -{i3-o20 -{i3N -{i3Y -{i3g -{i3w^p -{i4$ -{i4J -{i5i -{i5j -{i5r -{i65 -{i6C -{i6L -{i6W -{i6xi4+ -{iA0 -{k -{kz4 -{o0D -{o0I -{o0T -{o0j -{o0m -{o0q -{o1i*13 -{o2/[ -{o2: -{o2I -{o3/ -{o46 -{o4_ -{o4b -{o4q -{o5c -{o5f+1 -{o5z -{o6**60 -{o61 -{o6t -{o7= -{o7k -{o8E -{o8O -{o8x -{oA2 -{p3 -{q -{q*65 -{qZ2 -{qu -{s0a -{s19 -{s3$ -{sbu -{scs -{sei$i -{sg{ -{sn9 -{snkZ2 -{sog -{ssv -{sue -{svu -{t -{u -{O02 -{O03 -{O05Z4 -{O12 -{O21l -{O21o5n -{O21z5 -{O23 -{O24 -{O25q -{O51o8o -{O61 -{O71 -{O92 -{z1 -{z1Z1 -{z1o5K -{z2 -{z2$A -{z2*03 -{z2*63 -{z2i2> -{z2o5e -{z3 -{z3{ -{z4*81 -{z5 -{{ -{{c -{{i32 -{{{ -{{{c -{{{{ -{{{{c -{{{{{ -{{{{{c +{ $) +{ $+ +{ $- +{ $0 +{ $1 +{ $2 +{ $4 +{ $6 +{ $7 +{ $8 $P +{ $9 +{ $C +{ $P l +{ $_ +{ $` +{ $a +{ $e ^` +{ $g +{ $i +{ $j +{ $k +{ $l +{ $n +{ $o z3 +{ $s +{ $w +{ $x +{ '9 +{ *03 +{ *05 +{ *12 +{ *13 +{ *16 +{ *17 +{ *20 u +{ *24 +{ *25 +{ *27 +{ *30 z1 +{ *31 *51 +{ *32 +{ *34 +{ *37 +{ *41 +{ *42 o3> +{ *51 C +{ *65 +{ *A7 +{ +1 +{ +1 Z2 +{ +4 +{ +7 +{ +7 *75 +{ +9 +{ -0 +{ -0 t +{ -3 +{ -4 c +{ -7 +{ -8 +{ C +{ C [ +{ C i1R +{ D1 t +{ D3 +{ K *35 +{ L1 +{ L6 l +{ L8 +{ R0 +{ R0 z1 +{ R2 +{ R3 +{ R3 [ +{ R5 +{ R7 +{ R8 +{ R9 +{ T0 +{ T2 +{ T6 i3X +{ Z1 +{ Z1 '4 +{ Z1 *26 +{ Z1 o0: +{ Z1 s1^ +{ Z1 z2 +{ Z2 +{ Z2 $0 +{ Z2 R5 +{ Z2 u +{ Z3 +{ Z3 k +{ Z4 +{ Z4 r +{ Z5 +{ [ sfd +{ ] i2v +{ ^! +{ ^% +{ ^* +{ ^. +{ ^0 +{ ^1 +{ ^3 +{ ^7 +{ ^8 +{ ^9 +{ ^: D1 +{ ^; L0 +{ ^= +{ ^> +{ ^A u +{ ^B +{ ^C +{ ^E +{ ^L +{ ^M +{ ^R +{ ^T +{ ^X ^Q +{ ^a +{ ^b +{ ^d +{ ^j +{ ^k +{ ^m +{ ^p +{ ^t +{ ^w +{ ^y $f +{ c +{ c O21 +{ f +{ i0$ +{ i1' +{ i14 +{ i15 +{ i16 +{ i17 +{ i18 +{ i1a +{ i1d +{ i1} +{ i2+ Z2 +{ i2V +{ i2` +{ i2c +{ i3- o20 +{ i3N +{ i3Y +{ i3g +{ i3w ^p +{ i4$ +{ i4J +{ i5i +{ i5j +{ i5r +{ i65 +{ i6C +{ i6L +{ i6W +{ i6x i4+ +{ iA0 +{ k +{ k z4 +{ o0D +{ o0I +{ o0T +{ o0j +{ o0m +{ o0q +{ o1i *13 +{ o2/ [ +{ o2: +{ o2I +{ o3/ +{ o46 +{ o4_ +{ o4b +{ o4q +{ o5c +{ o5f +1 +{ o5z +{ o6* *60 +{ o61 +{ o6t +{ o7= +{ o7k +{ o8E +{ o8O +{ o8x +{ oA2 +{ p3 +{ q +{ q *65 +{ q Z2 +{ q u +{ s0a +{ s19 +{ s3$ +{ sbu +{ scs +{ sei $i +{ sg{ +{ sn9 +{ snk Z2 +{ sog +{ ssv +{ sue +{ svu +{ t +{ u +{ O02 +{ O03 +{ O05 Z4 +{ O12 +{ O21 l +{ O21 o5n +{ O21 z5 +{ O23 +{ O24 +{ O25 q +{ O51 o8o +{ O61 +{ O71 +{ O92 +{ z1 +{ z1 Z1 +{ z1 o5K +{ z2 +{ z2 $A +{ z2 *03 +{ z2 *63 +{ z2 i2> +{ z2 o5e +{ z3 +{ z3 { +{ z4 *81 +{ z5 +{ { +{ { c +{ { i32 +{ { { +{ { { c +{ { { { +{ { { { c +{ { { { { +{ { { { { c } -}$ -}$% -}$' -}$* -}$- -}$3 -}$4o0x -}$5 -}$6 -}$6*53 -}$6^& -}$7 -}$? -}$Ai13 -}$G -}$O -}$P -}$Qo5$ -}$XO52 -}$d -}$j -}$j-4 -}$n -}$o -}$q -}$r -}$v -}$z -}${ -}'6 -}'7 -}'9 -}'A -}*01Z3 -}*03$7 -}*14 -}*15O12 -}*23d -}*24 -}*24*74 -}*25^z -}*30 -}*30D0 -}*35'5 -}*35*50 -}*40 -}*42Z1 -}*43 -}*48 -}*54 -}*61 -}*62 -}*63 -}*75D3 -}*91 -}*A0 -}*B7L6 -}+3Z2 -}+4 -}+4} -}+9 -}-0 -}-1*53 -}-2k -}-4 -}-7o4a -}-9} -}D1 -}D1Z4 -}D4 -}D4o3y -}D8 -}L0 -}R0 -}R2 -}R4 -}T2 -}T3 -}T4 -}Z1 -}Z2 -}Z2$n -}Z2L0 -}Z2o0I -}Z2o7[ -}Z3 -}Z4 -}Z4$W -}Z4O21 -}Z5 -}Z5'7 -}[*72 -}[T6 -}]$g -}^" -}^$ -}^& -}^* -}^1 -}^2 -}^4 -}^6 -}^7 -}^8 -}^: -}^; -}^C -}^G -}^M -}^P -}^Q -}^Y^q -}^] -}^_-0 -}^a -}^b -}^c -}^d -}^e -}^f -}^g -}^h -}^hz5 -}^i -}^j -}^k -}^k{ -}^l -}^p -}^p*05 -}^q -}^s -}^t^K -}^v -}^w -}c -}c-2 -}c^3 -}dl -}dO04 -}f -}i0A -}i0S -}i0z -}i1D -}i1^ -}i1f -}i1wi74 -}i1{ -}i2/R2 -}i2b -}i30D5 -}i3G -}i3NsgO -}i3n -}i4-O34 -}i50 -}i56 -}i6" -}i6p -}i7XO54 -}k -}ku -}lz4 -}o0 -}o02 -}o0b -}o0k -}o0v -}o0x -}o18Z2 -}o1a -}o1c -}o1h -}o1o -}o2 -}o2/ -}o23^v -}o24^H -}o24i49 -}o2_ -}o3*Z1 -}o3Rr -}o3f-0 -}o3l -}o3p^k -}o3y -}o4b -}o4d -}o4r -}o4u -}o53 -}o59 -}o5ci7% -}o5x -}o6- -}o6@*67 -}o6Gc -}o6g -}o6p -}o7_^E -}o7u -}o8X -}p1 -}p1o5p -}p1O43 -}q -}q'8 -}q-7 -}q^T -}r*50 -}rD0 -}s0- -}s1d -}s38 -}s5$ -}sAu -}sAy -}sRm -}san -}sc]{ -}scrK -}slc -}soi -}sro -}svr -}t^S -}u+3 -}uL7 -}uz2 -}O02 -}O02p1 -}O03 -}O04 -}O05 -}O08 -}O13 -}O14 -}O21 -}O32 -}O37 -}O43 -}O52 -}O72 -}O91 -}z1 -}z1i1Y -}z1o5o -}z1sv# -}z2 -}z3 -}z4 -}z4$7 -}z4z3 -}z4z5 -}z5 -}} -}}*80 -}}c -}}d -}}} -}}}c -}}}} -}}}}c -}}}}} -}}}}}c +} $ +} $% +} $' +} $* +} $- +} $3 +} $4 o0x +} $5 +} $6 +} $6 *53 +} $6 ^& +} $7 +} $? +} $A i13 +} $G +} $O +} $P +} $Q o5$ +} $X O52 +} $d +} $j +} $j -4 +} $n +} $o +} $q +} $r +} $v +} $z +} ${ +} '6 +} '7 +} '9 +} 'A +} *01 Z3 +} *03 $7 +} *14 +} *15 O12 +} *23 d +} *24 +} *24 *74 +} *25 ^z +} *30 +} *30 D0 +} *35 '5 +} *35 *50 +} *40 +} *42 Z1 +} *43 +} *48 +} *54 +} *61 +} *62 +} *63 +} *75 D3 +} *91 +} *A0 +} *B7 L6 +} +3 Z2 +} +4 +} +4 } +} +9 +} -0 +} -1 *53 +} -2 k +} -4 +} -7 o4a +} -9 } +} D1 Z4 +} D4 o3y +} D8 +} L0 +} R0 +} R2 +} R4 +} T2 +} T3 +} T4 +} Z1 +} Z2 +} Z2 $n +} Z2 L0 +} Z2 o0I +} Z2 o7[ +} Z3 +} Z4 +} Z4 $W +} Z4 O21 +} Z5 +} Z5 '7 +} [ *72 +} [ T6 +} ] $g +} ^" +} ^$ +} ^& +} ^* +} ^1 +} ^2 +} ^4 +} ^6 +} ^7 +} ^8 +} ^: +} ^; +} ^C +} ^G +} ^M +} ^P +} ^Q +} ^Y ^q +} ^] +} ^_ -0 +} ^a +} ^b +} ^c +} ^d +} ^e +} ^f +} ^g +} ^h +} ^h z5 +} ^i +} ^j +} ^k +} ^k { +} ^l +} ^p +} ^p *05 +} ^q +} ^s +} ^t ^K +} ^v +} ^w +} c +} c -2 +} c ^3 +} d l +} d O04 +} f +} i0A +} i0S +} i0z +} i1D +} i1^ +} i1f +} i1w i74 +} i1{ +} i2/ R2 +} i2b +} i30 D5 +} i3G +} i3N sgO +} i3n +} i4- O34 +} i50 +} i56 +} i6" +} i6p +} i7X O54 +} k +} k u +} l z4 +} o0 +} o02 +} o0b +} o0k +} o0v +} o0x +} o18 Z2 +} o1a +} o1c +} o1h +} o1o +} o2 +} o2/ +} o23 ^v +} o24 ^H +} o24 i49 +} o2_ +} o3* Z1 +} o3R r +} o3f -0 +} o3l +} o3p ^k +} o3y +} o4b +} o4d +} o4r +} o4u +} o53 +} o59 +} o5c i7% +} o5x +} o6- +} o6@ *67 +} o6G c +} o6g +} o6p +} o7_ ^E +} o7u +} o8X +} p1 +} p1 o5p +} p1 O43 +} q +} q '8 +} q -7 +} q ^T +} r *50 +} r D0 +} s0- +} s1d +} s38 +} s5$ +} sAu +} sAy +} sRm +} san +} sc] { +} scr K +} slc +} soi +} sro +} svr +} t ^S +} u +3 +} u L7 +} u z2 +} O02 +} O02 p1 +} O03 +} O04 +} O05 +} O08 +} O13 +} O14 +} O21 +} O32 +} O37 +} O43 +} O52 +} O72 +} O91 +} z1 +} z1 i1Y +} z1 o5o +} z1 sv# +} z2 +} z3 +} z4 +} z4 $7 +} z4 z3 +} z4 z5 +} z5 +} } +} } *80 +} } c +} } d +} } } +} } } c +} } } } +} } } } c +} } } } } +} } } } } c diff --git a/rules/dive.rule b/rules/dive.rule index 219089a51..382802c1c 100644 --- a/rules/dive.rule +++ b/rules/dive.rule @@ -72,7 +72,7 @@ $1 $1 $e +3 f -rcrT0 +r c r T0 $0 $0 +7 -4 @@ -169,7 +169,7 @@ l $2 $0 $0 $0 c T6 } y1 O04 -sKmc +sKm c c $8 $8 ] ] ] d } } @@ -177,7 +177,7 @@ c $8 $8 $m z1 c $9 $9 -} $e [ +] $e 'B $2 $0 $0 $7 c $7 @@ -210,7 +210,7 @@ c $7 $7 *63 O24 T3 -} o05 +] ^5 *03 .4 o12 O67 t @@ -246,7 +246,7 @@ R5 c $3 $3 u $3 -8 -ts}{ +t s}{ i81 i99 iA9 iB5 i27 c $0 $0 $0 @@ -269,7 +269,7 @@ c O83 O02 '3 c $1 $0 -R8u +R8 u +1 +3 O53 $1 $0 @@ -293,7 +293,7 @@ c $6 $9 *57 ,1 c T7 -cs;g +c s;g O43 } Z1 c $2 $0 $0 $0 @@ -309,8 +309,8 @@ $r $o i71 i89 i99 iA5 +7 +7 -*6Acsjc -]s#[ +*6A c sjc +] s#[ i3- y2 $a @@ -319,7 +319,7 @@ $2 $0 $0 $9 o21 o64 +5 O72 -oBJu +oBJ u c $1 $4 { O73 c $2 $1 @@ -350,8 +350,8 @@ c T5 D4 O94 s], O2B r O92 -} .0 -i9#t +] z1 +i9# t $2 $0 $1 $1 o20 u $S @@ -376,24 +376,22 @@ i6- c $9 $8 c $9 $5 l i7. -+Bt ++B t $2 $0 $1 $2 O06 l $2 $0 $0 $5 O83 $! { { { { { c $0 $9 -[ [ [ [ [ u L8 O69 +0 +0 +0 +0 $l -] $e *87 c $9 i77 i78 i62 -t*96 +t *96 sa@ z2 $9 $4 @@ -431,7 +429,7 @@ T1 T4 T5 'E $9 $6 r sLm OBA -t$9 +t $9 { [ +5 +5 +5 +5 c T3 @@ -457,9 +455,9 @@ T2 T5 T3 u $1 T2 T6 T4 +7 +7 +7 +7 -s'^$3 +s'^ $3 ,6 -}sAE +} sAE -C T3 T5 T4 c $s $e $s @@ -480,18 +478,18 @@ c $9 $2 T2 T3 c $1 $9 $9 $7 $1 $2 $3 $4 -$3l +$3 l T1 T5 -*7BE +*7B E '7 $4 i7- T2 T6 T3 l $2 $0 $0 $9 -EoBf'B +c 'B c $0 $8 c $1 $9 $9 $8 $1 $5 -*3A$8 +*3A $8 T3 T6 T5 +2 +2 +2 +2 $8 $7 @@ -508,7 +506,7 @@ OA5 O96 E OB4 $6 $y l i4- -s]Ks_S[ +s]K s_S [ p5 ] +1 ^p ^m @@ -516,7 +514,7 @@ T2 T4 c $2 $4 o02 T3 T5 -cspd +c spd O63 $8 $9 T3 T4 @@ -528,20 +526,20 @@ $1 $7 c $8 $7 'F O12 ] -tsps +t sps T4 T5 -ksM& +k sM& T1 T6 c $0 $7 T8 sz] O02 -{sHto8O +{ sHt o8O $1 $6 $8 $6 c $9 $0 c $1 $7 l $2 $0 $1 $0 -rL9l +r L9 l o87 { Y1 ^3 ^2 ^1 @@ -550,7 +548,7 @@ c $9 $1 $2 $0 $0 $2 -6 -6 -6 -6 *76 -]*A8 +] *A8 ,9 o71 T9 @@ -575,86 +573,85 @@ l i5- O34 T5 T6 i7e -$1'A -,8p1 +$1 'A +,8 p1 } k u r $6 $6 -*A3} +*A3 } $g T4 T6 '7 $9 i6t OB8 o8' $! c $7 $8 -iARD3 +iAR D3 l i6. -rsS? +r sS? $d -*95t +*95 t -0 -0 -0 -0 $7 $1 $9 $0 r c r c $0 $2 *98 -*79t*37 -t*76 +*79 t *37 +t *76 -1 -1 -1 -1 $7 $2 $6 $5 c $8 $6 -o7.k +o7. k d 'C -*A6D3 +*A6 D3 -5 -5 -5 -5 d 'B ,4 O83 -sfgu +sfg u $z ] ] ] ] ] c se3 sa4 O02 iBX y4 -[ z1 $@ z1 K O42 D7 ^k c $0 $6 -*81iBi$6 +*81 iBi $6 '7 $6 *56 ^2 ^1 ^0 -R0r +R0 r OB7 { c $2 $6 -D3s5T +D3 s5T .3 *68 '7 $8 o70 $h -c*86*B6 +c *86 *B6 O54 c $1 $9 $9 $4 o73 o76 -i9X*2BK +i9X *2B K o43 Z3 -2 -2 -2 -2 k O13 -7 -7 -7 -7 -.8sU[u +.8 sU[ u -3 -3 -3 -3 -R6{ +R6 { c $6 $6 $6 -iBq[ -{s#+TB +iBq [ +{ s#+ TB +E ^l l i6- @@ -664,7 +661,7 @@ T0 T3 T1 +8 +8 +8 +8 $E -D -r.9 +r .9 $9 $1 c $2 $7 c o14 @@ -674,7 +671,7 @@ $2 $0 TA R3 o1o -s)u$0 +s)u $0 O7B l O01 OB2 r T0 r @@ -691,23 +688,23 @@ $9 $9 $9 c $8 $5 O37 O87 E T0 T3 T2 -+0+0 ++0 +0 $1 $1 $1 T0 T1 T4 { { { { -$eiBi -$7*39 +$e iBi +$7 *39 { E 'G T0 T5 T1 i5e $4 $5 $1 $9 $9 $2 -+6+6 ++6 +6 } *04 -4 -4 -4 -4 c $3 $4 -]r +] r i51 $0 $8 c $5 $6 @@ -719,7 +716,7 @@ $5 $5 i5a c $1 $9 $9 $3 T1 T5 T7 -siut +siu t $3 $2 $1 O84 c $2 $8 @@ -728,12 +725,12 @@ O35 T0 T4 T3 '5 D3 c $3 $1 -*09EsWQ +*09 E sWQ c $8 $4 c $7 $6 T0 T5 T3 } o0v -+Bc ++B c T0 T6 T2 $1 $! $4 $u @@ -744,7 +741,7 @@ T0 T1 T2 c $8 $3 i5. c $1 $9 $9 $2 -$8i9{ +$8 i9{ ^2 T1 T4 T7 ss5 @@ -754,8 +751,8 @@ c $0 $3 ,5 O91 D9 ,B T0 T5 T4 -sAI{ -oAU*64*21 +sAI { +oAU *64 *21 T2 T4 T7 ^b } u @@ -777,11 +774,11 @@ iAP Y1 O39 c $6 $7 $1 $9 c $3 $0 -D6l -+0o7g +D6 l ++0 o7g T2 T7 T3 '4 d -*3A$3 +*3A $3 i6. $1 $9 $9 $1 $5 $6 @@ -790,11 +787,11 @@ T2 T7 T6 .5 T2 T5 T7 i3e -'8+0 +'8 +0 o14 c $3 $2 c $1 O8B -L8^a +L8 ^a d '6 c so0 T4 T7 T6 @@ -803,7 +800,7 @@ T3 T7 T6 *17 } O12 -0 T3 T7 T4 -rR5 +r R5 $2 $5 .7 c $5 $9 @@ -818,13 +815,13 @@ i7a T1 T7 O23 sD> +F -+5+5 -*59$? ++5 +5 +*59 $? O45 $0 $6 $1 $9 $8 $8 -o9a$7s.B -.B^i +o9a $7 s.B +.B ^i O25 OA2 O91 $n @@ -833,18 +830,18 @@ o3t o7k O61 r O75 c ^3 ^2 ^1 -+6+7 ++6 +7 c $8 $2 i8p i1a -[c +[ c O93 E *8A O43 -cs'e +c s'e -8 -8 -8 -8 +0 E f t -Y1s^o,7 +Y1 s^o ,7 } O12 } -0 f *A5 '8 O14 c $0 $4 @@ -856,19 +853,19 @@ T6 T7 $4 $4 Y5 T5 T7 -}*79} +} *79 } T3 T7 ,8 r y1 $0 $3 u *92 O86 O73 *2A -1 -to9*$8 -oA(kR0 +t o9* $8 +oA( k R0 $7 $4 { -0 y3 O52 -*12,B +*12 ,B c o71 s81 i8- @@ -882,7 +879,7 @@ O51 o63 E O7A $8 $8 $8 ^x -rR8 +r R8 'H OBA k c $2 $9 @@ -893,18 +890,18 @@ c $8 $1 $0 $5 *23 O56 sTi $= -s&^-2 -$isP} +s&^ -2 +$i sP} Z1 O78 c $1 $9 $9 $0 c $6 $4 ^9 i2+ O19 -s*No7?$6 +s*N o7? $6 { O03 $2 $7 T4 T7 l i5. -T0RB +T0 RB $9 $1 $1 -E si! se3 @@ -918,33 +915,33 @@ O28 O17 R3 O74 ^s } O01 O24 --1*96 +-1 *96 ^M O04 s(B -]-1] +] -1 ] $2 $6 --0-0 -s)2Z1} +-0 -0 +s)2 Z1 } *53 -0 O69 c o31 sSX O45 O86 -Z1}*A8 +Z1 } *A8 c $4 $2 $0 -s)M+0 -r] +s)M +0 +r ] i3a i7. *76 +6 $4 $4 $4 i52 sl1 -'6sWJ --7-7 +'6 sWJ +-7 -7 c $5 $4 *76 +7 -sm`D7 +sm` D7 RA O85 i0e .8 -sDWr +sDW r +0 -3 c $1 $9 $8 $5 o59 @@ -952,12 +949,12 @@ $8 $4 $7 $3 O9A D5 O65 -T6s4` +T6 s4` ^5 z1 -cs.\oB. -s?Js!PK +c s.\ oB. +s?J s!P K o0t -+8+8 ++8 +8 $0 $4 } z2 O37 @@ -967,7 +964,7 @@ sa@ se3 T0 T2 o0g $3 $0 -L8] +L8 ] $3 $1 c '8 $1 c $6 $2 @@ -989,23 +986,23 @@ $8 $3 c $7 $4 } c Z1 l -*B3o0i +*B3 o0i $1 $1 $1 $1 O98 u O45 D3 sKs -*84'B+1 +*84 'B +1 $7 $6 c $1 $9 $8 $9 -s32+5 -*68o4ioAJ +s32 +5 +*68 o4i oAJ OB2 ^5 r Y1 -5 $3 $2 T0 T1 -R0*25 +R0 *25 O94 R2 -*87R2 -D6o7V*AB +*87 R2 +D6 o7V *AB c $6 $8 $8 $2 c $2 $0 $0 $2 @@ -1018,7 +1015,7 @@ O3B *B7 R2 *37 -5 t c $5 $0 -*6Bt +*6B t E $8 O28 d $5 $0 @@ -1033,48 +1030,47 @@ c $7 $2 $b i50 [ i39 -rk -,9+5{ +r k +,9 +5 { l *50 O56 ^S -o9m^t +o9m ^t o7n -+5+7 ++5 +7 -F } D2 } } } '4 } -i8csie -soisy% +i8c sie +soi sy% O78 O5B ^l -+2+2 ++2 +2 $2 $2 $2 *30 O2B $8 $1 sdk O03 --0+7*94 +-0 +7 *94 T0 $2 O81 i9T -3 D9 ss5 se3 -[ [ [ -KT0 -R0se& -R0se5s5& +K T0 +R0 se& +R0 se5 s5& i54 } $e T0 T7 T1 c $2 $0 $1 $2 -sy&c +sy& c OA6 } +9 +9 +9 +9 -[o8/ +[ o8/ ^A $7 $8 $9 -+9R3saS ++9 R3 saS $9 $9 $5 o1x O9B o6> *20 -c-8 +c -8 c $6 $5 } ^p ^x ^e @@ -1086,17 +1082,17 @@ o0z O02 R6 R0 $4 $6 $* -[^l +o0l i60 -s[0{ +s[0 { $6 $4 o2j s5@ O61 T0 T3 T7 c se3 so0 -+5+6 ++5 +6 T0 T2 T7 -R5+B +R5 +B $5 $9 O64 O24 i72 i71 @@ -1104,9 +1100,9 @@ c $3 $6 'I i1d c $1 $9 $8 $8 -i7zR2 -+6-7 -DBi6e +i7z R2 ++6 -7 +DB i6e K O06 O85 $F @@ -1114,56 +1110,56 @@ s'J O8B R0 $2 $9 O0A T6 ss7 $3 $5 -KD2 -D4D7l +K D2 +D4 D7 l $5 $2 } +8 T0 O34 sRa -D9^r +D9 ^r $k -iB^*08} -*41*36 +iB^ *08 } +*41 *36 $7 $5 c OA3 -o82s"yr +o82 s"y r -8 -8 c $6 $0 sa4 si1 --1*1ARA -*28i6s -^boA{ +-1 *1A RA +*28 i6s +^b oA{ $w c $4 $7 -RA$l +RA $l c $7 $1 O07 O94 $4 $2 -D7D5c +D7 D5 c *81 T0 T7 T5 --6$y +-6 $y T0 T4 T7 d E O59 $9 c $3 $8 $c -[^h +o0h } } i1o o2o T0 T7 T6 $x -sv`k +sv` k R4 OA1 *B0 -[ ^S +o0S O14 p2 '6 O14 d '6 $5 $8 } '8 ] l i4. c $7 $3 -L9*31 +L9 *31 i78 i79 D4 s*] OA9 c O48 sK< @@ -1171,61 +1167,60 @@ c O48 sK< c $5 $1 $6 $1 $6 $0 --6-6 +-6 -6 +A +A -[ [ ^! O58 T0 $7 $0 } K -[ ^D +o0D sa@ so0 -+4+4 ++4 +4 c $6 $3 -$1$9$9$8 +$1 $9 $9 $8 $5 $7 s -c] +$k sO> +c ] q c $4 $0 -+1+1 ++1 +1 si! p2 -[ ^s -s$vli6n +o0s +s$v l i6n ^* $* OB4 ^y o2u y1 O57 s?v $4 $7 -*4Az1 +*4A z1 } *80 *47 ^e ^d @@ -1233,33 +1228,32 @@ $4 $7 o0e O57 -2 O48 *09 -*12*5B -+0+1 +*12 *5B ++0 +1 s-h O5A c -*18R5*27 -,4*A2s$d +*18 R5 *27 +,4 *A2 s$d $5 $1 --4*39 +-4 *39 i4t $6 $3 $3 $6 i4i -sFI*20 +sFI *20 y2 -6 OB9 D2 -R6oAZL7 +R6 oAZ L7 i72 O89 i39 i4a -*54sUO +*54 sUO o2i -[ ^t ] ] ] ] -o7MR2D3 +o7M R2 D3 c $4 $6 +6 O56 $4 $0 -+5-7 ++5 -7 c $7 $0 ^7 i3c @@ -1268,165 +1262,165 @@ d 'D $3 $8 ^6 '6 $1 --1sBk -K*04 +-1 sBk +K *04 $4 s6# O28 *54 l [ +2 o52 $_ -uD6 +u D6 $1 OBA DB o1y O59 +9 i3s --BT0 -*64+0 -t*91 -oA5^t -s@yE*37 +-B T0 +*64 +0 +t *91 +oA5 ^t +s@y E *37 $1 $5 $9 $4 $1 O59 u -[k -*36-0+4 +[ k +*36 -0 +4 o62 T0 T3 c $4 $1 -'8*45 +'8 *45 TB s;m O61 c $5 $2 $5 $3 -i62iA< +i62 iA< O58 o2c sRw D6 O93 -i4tiAf +i4t iAf o2e c $2 $0 $0 $1 { k $4 $3 -^kiAs -s9A-3 +^k iAs +s9A -3 { O6A *AB c $6 $1 { *AB O84 i99 s`8 -9 -9 -9 -9 -s>e'6 -cd +s>e '6 +c d l O65 +2 -^yR9 +^y R9 c $5 $8 i4s u $9 $5 -*78o1r +*78 o1r { O52 ^9 $1 $9 $8 $6 i71 i70 O46 c ^2 ^1 -'8sr> -s^pc --8+2 +'8 sr> +s^p c +-8 +2 ^x ^x $x $x O3A *04 ^e ^b --6-7 -Es,Rd +-6 -7 +E s,R d ^r ^e ^p ^u ^s T0 T5 sa@ si1 -s/Pro8< +s/P r o8< z5 -[ ^k +o0k $e $r -s}x+4 -D3svys94 +s}x +4 +D3 svy s94 i1b O42 *49 $3 $7 O56 r i92 i61 -s},s'-^h +s}, s'- ^h $i $n -*03-9slU -.6y1*96 -$)K'7 +*03 -9 slU +.6 y1 *96 +$) K '7 o0o o79 t O7A c $4 $3 -syCT7ssg +syC T7 ssg i67 i18 $0 $0 $7 -+Bd -*13*19iBw ++B d +*13 *19 iBw O86 } ^A O41 *59 O36 -+0+2 -$msGu -s`V -^ps2{ +-5 -5 +*43 s>V +^p s2{ p2 } O46 i2i d ] o51 i3d -R9c +R9 c $4 O6B +6 -5 -R6s2**A5 +R6 s2* *A5 { -5 -^fi9E -[ ^c +^f i9E +o0c } i6i --6+7 +-6 +7 c $2 $0 $0 $8 O64 sEW *63 } ,1 @@ -1436,14 +1430,14 @@ i70 i71 i9s c o19 'J -L8K*24 -sCfR1 -sa@sc0$. +s>0 $. c $1 $! '6 $1 $2 $3 -+5-6 ++5 -6 O09 -to9U +t o9U ^x $x -*32s4Tc -Kto8o +*32 s4T c +K t o8o '6 ] O31 p1 '6 O31 ] p1 *94 c T5 $1 -coA)*98 +c oA) *98 ^a ^d [ ^c O48 -rs!j +r s!j c '7 $1 c $1 $9 $8 $1 OA5 $0 -0 -0 -0 -sT--3 +sT- -3 [ '6 -iAp*04 +iAp *04 { R9 i57 u i8? @@ -1498,60 +1492,59 @@ o6. s2' O43 o19 O6A D4 -[ ^g *13 +3 { Y2 -o4diA0 -o6+*50 -D2RB,6 +o4d iA0 +o6+ *50 +D2 RB ,6 $N c $5 $3 +8 +9 d 'F O7B $? -E*2BsR, +E *2B sR, ^M -*62d -sUB+7 +*62 d +sUB +7 $4 $2 $0 -*B1*15*63 -Esyv -$!$! -sKk*13*48 +*B1 *15 *63 +E syv +$! $! +sKk *13 *48 $- i51 i69 i79 i85 oA7 O43 O09 i6a ] [ O95 ^o -sO9*2AT7 +sO9 *2A T7 p1 O08 -s|,i4ei9[ +s|, i4e i9[ OB7 O53 *7A i4b --4-4 -R7szV -i94s5d -LA$2 +-4 -4 +R7 szV +i94 s5d +LA $2 $R u C $1 ^w i71 i71 o0B i56 -*B9s1mD6 -*40svh +*B9 s1m D6 +*40 svh ^r K -,2sC+t -T7$c +,2 sC+ t +T7 $c } i0W O8B -sfK^p +sfK ^p .3 Y1 o58 -K+6o7y +K +6 o7y O02 ^c -+6+8 ++6 +8 st| y5 O08 O62 s{k o74 @@ -1563,19 +1556,18 @@ $o $n OA3 +7 +7 +7 r T0 -[ [ [ [ -s>s} +s>s } } -2 *61 o53 -u[] +u [ ] } ^G -A -A c '9 $1 z5 ^= O0A -+7s!k -*06} -$8sza ++7 s!k +*06 } +$8 sza oA3 ^0 ^1 Z4 @@ -1586,35 +1578,35 @@ O73 o3f O89 ^D i1m } ,2 --3iA' -sPdT6$i +-3 iA' +sPd T6 $i i3. st3 RA } D9 i77 i79 -],9 +] ,9 l i3. *70 i34 { { [ skd --3-3 +-3 -3 u $6 $6 $6 -*B7K -R5sF_ -[ ^f -Escos3A +*B7 K +R5 sF_ +o0f +E sco s3A i58 sdt O45 sQs i91 OAB *6B u -iAxd -.7^x +iAx d +.7 ^x $0 Z2 +8 -9 -]cspL -sIE+Af +] c spL +sIE +A f } *64 +2 t o7c @@ -1623,111 +1615,110 @@ O12 Y1 $o *30 O81 c $9 $9 $9 O56 -R7$c +R7 $c o55 O29 c O81 sk i9* O86 -4 -s&KTA -EK -+0-2 -*7A} +s&K TA +E K ++0 -2 +*7A } c $1 $9 $8 $7 } o6u +5 +5 +5 -[ ^v +o0v .A O37 T7 c $3 $9 -sAC'6 -KRA +sAC '6 +K RA o56 *30 [ O59 K OB5 -.BR5 +.B R5 ^J -[ ^T -.9r -L6*04} +o0T +.9 r +L6 *04 } *A5 '8 O14 $+ s68 O12 i73 i72 o1l -6 -6 -6 -+0+7 -+3sts ++0 +7 ++3 sts sgo +2 --0-2 +-0 -2 O31 RB s ' ^R r C r $m $a i7d } O74 --7+8 +-7 +8 $S $t $o -o1i*61 -*20*97-3 +o1i *61 +*20 *97 -3 +2 +2 +2 -+4+6 -[ ^n ++4 +6 O75 O27 $e -fl -+6s*4 +f l ++6 s*4 $a $l $l -R7c.7 +R7 c .7 $? O94 i3u -6 E -*03*23 -ET1 -EsS}$9 +*03 *23 +E T1 +E sS} $9 f c -'7su1 -Z1sK8 --5+7 -+0+3 -sfa$2 +'7 su1 +Z1 sK8 +-5 +7 ++0 +3 +sfa $2 +1 O6B s/? O01 sai i7? t o54 -Ks6u +K s6u O43 '9 -]E +] E i2- -[ ^w +o0w O67 $c $a $r $t -+0-1 ++0 -1 +9 -8 -[ ^a -*24sS9 +o0a +*24 sS9 o00 -u[ +u [ O9B -B iA3 $u $s -*23s$0 -{*69 +s^> $0 +{ *69 $p $r $o $i $t O6B y2 @@ -1874,61 +1865,60 @@ i44 O02 o3@ $3 $6 $0 O98 o1r s*C -o7as+,s\G +o7a s+, s\G $3 O37 i71 i72 -sa0.6 +sa0 .6 O54 *72 $3 i0t O94 -iB+u -o8asC($x -i6y*BA +iB+ u +o8a sC( $x +i6y *BA O14 O45 -Z1sZm +Z1 sZm i7c +9 -A --7s!. -oB5-8*2A +-7 s!. +oB5 -8 *2A t OA5 -]f +] f O6B *7A *21 -1 -1 -1 -*14sw\ -up1s|X -p5t +*14 sw\ +u p1 s|X +p5 t { i5k o30 *81 -Y2sD6 +Y2 sD6 o6b O7B Y1 -*AB^h +*AB ^h O54 $6 o9O -s)ai2d +s)a i2d o4c O82 s;/ OB4 Y2 ^4 ^3 ^2 ^1 -srh*27 +srh *27 o3r $m $e -5 -5 -5 ^a ^A -E+8 +E +8 $b O53 O57 -[ ^m O79 ^w sM, -*A3c +*A3 c c ^2 ^2 O67 } sz' $j O0B OB7 O02 -*53*63 +*53 *63 } *15 t O47 -*A1*47$f +*A1 *47 $f OA2 *68 $7 -[ ^F -s@zZ1 +o0F +s@z Z1 $a $d Y3 D4 ^@ @@ -1937,11 +1927,11 @@ Y3 D4 $8 OA5 ^1 ^1 sa@ se3 si1 -*56^jT6 -+8*8Bs*r +*56 ^j T6 ++8 *8B s*r { o41 k sPg O96 -[*B8 +[ *B8 -7 -8 $' O71 o6? o5a @@ -1949,18 +1939,18 @@ Z4 O56 O75 c $1 $9 $7 $7 [ t o7s -[ ^H +o0H R3 p4 -}scP +} scP $e $l $l -t*86 +t *86 } $j i5c $D -$5sD> +$5 sD> O18 *4B *21 -us7E*47 -LB*50s/} +u s7E *47 +LB *50 s/} $b $o $y ^a ^c Z4 O42 @@ -1972,147 +1962,147 @@ i76 i79 o2c +4 s z O81 ^0 ^5 -sXtsQi$v +sXt sQi $v } u O32 i5d o9H O72 s]q } *62 i2z E O82 -*24'9 +*24 '9 o5. -*01oA( --6s2w +*01 oA( +-6 s2w c $1 $9 $8 $4 -+7sB=K -]s[) ++7 sB= K +] s[) $l $e $e l $9 $5 l $2 $0 $1 $4 -$.$. +$. $. O47 *31 -lr +l r k ^z i3b +9 D8 ^d ^e ^r -{RA^m +{ RA ^m ^7 ^9 ^9 ^1 -$As/#T7 -L9*54 -*89R4TB +$A s/# T7 +L9 *54 +*89 R4 TB +A +B +1 +2 -*4By2 -s +D0 oB} sm> c $2 $0 $0 $3 si1 so0 -sP8E -oB`o2k*B5 +sP8 E +oB` o2k *B5 c '7 $2 *93 -*58$i +*58 $i i32 -sec{ +sec { i7b -csHlK +c sHl K o8s -[D7 -lRAo81 +[ D7 +l RA o81 OA4 O38 -*B9K -s>'sis +*B9 K +s>' sis +A -9 -4 -4 -4 -i9Ki0S +i9K i0S sb8 -3 -3 -3 } *36 @@ -2153,11 +2143,11 @@ c ^0 ^1 i64 *83 O1B O43 -i85,B +i85 ,B O02 { { { { { { d O28 d $) -]*86smy +] *86 smy $7 O8B -8 -8 -8 ^I @@ -2169,7 +2159,7 @@ $, { { { d O28 Y4 ] $i -i1dsG2 +i1d sG2 $a $1 $l $a $w oBi @@ -2177,221 +2167,219 @@ iA5 R7 O02 ^1 ^2 $a $t -KLB*43 +K LB *43 $5 O39 sLN -o4bsT&-5 +o4b sT& -5 O5A o9G u i6a O76 -T7.9 +T7 .9 $2 { c $1 $9 $8 $2 -$5*B0oAA -szR$6 +$5 *B0 oAA +szR $6 O84 $6 -*46L8 +*46 L8 $1 $0 $1 -*45] +*45 ] ^6 ^9 ^9 ^1 -[ ^o -i8H,9r +i8H ,9 r $9 $7 $3 -R8i7!i69 +R8 i7! i69 R1 c $1 $9 $8 $3 -,4sJN +,4 sJN $n $o -KsdC*94 +K sdC *94 l $4 $4 -+0+6 -Y1D6 -]s]+*86 ++0 +6 +Y1 D6 +] s]+ *86 $3 $6 $5 -i67sB- +i67 sB- O8B *76 i4_ ^0 ^2 -s)y$3 +s)y $3 +D +D o4_ c $1 $9 $8 $0 u '6 $5 -*5BT3 +*5B T3 s() C O95 svE OB2 D0 -,8Y1 +,8 Y1 o23 -7 -oA"t +oA" t $2 $0 $1 $4 -iB>*83k +iB> *83 k $e $1 o6! D3 O9B i9y -ED9 +E D9 $1 DA -+0+4 ++0 +4 OB3 -s\JY1 +s\J Y1 ^3 ^1 o6c -*64*A1 -$5sFKoAt +*64 *A1 +$5 sFK oAt O48 i72 i73 o06 -o9oK -*39$b*28 +o9o K +*39 $b *28 u '6 $6 ^v ^g ^n ^i ^k +9 +9 +9 -*87$1 +*87 $1 O6A o7( Z1 -$*$* +$* $* O7A u -[ ^E +o0E O42 -0 i9@ -s%MD8 +s%M D8 [ $1 $2 $3 -TBT0 +TB T0 O71 .6 ^P O25 R7 s]= $1 $0 $0 O35 sp$ Y1 -+6s[oiBr ++6 s[o iBr -5 O14 i7A O41 d -o60*1A +o60 *1A $o $r ^5 ^9 ^9 ^1 -oAsrTA -sp6*96 +oAs r TA +sp6 *96 i2g o6j *A9 *42 O94 -o2bsr/ +o2b sr/ 'L sGE OA2 .4 -]$9 +] $9 O03 s32 i70 i79 -saor +sao r $d $a -+3+7 ++3 +7 C $1 $2 } O73 -*1B{ +*1B { c o75 -ssDi1u +ssD i1u $1 $9 $7 $7 -$6sQg -D2] -$6DB +$6 sQg +D2 ] +$6 DB O8A O42 r $1 *05 OA1 su8 l $2 $0 $1 $3 -o73svt -sdx*53s4] --7oBG +o73 svt +sdx *53 s4] +-7 oBG LA O21 O76 o0C -s#M*19$! -*78ur +s#M *19 $! +*78 u r $0 O5A O57 Y2 } O83 -s{<+9 -o6AsjYr -+0-7 +s{< +9 +o6A sjY r ++0 -7 iBM s_x O63 O63 *81 -8 c OA4 -*07*34 +*07 *34 O5A +7 *48 -D7+AT0 +D7 +A T0 O97 i2k *01 iA4 O52 r $+ R6 R6 $t $s -sfx-B$2 +sfx -B $2 s04 '7 $1 $2 $3 -sXc-7 +sXc -7 *7B O04 -+4-7 ++4 -7 $9 O1B ^C -,6.6 +,6 .6 i75 i72 -o6t^us2X -+4-5 +o6t ^u s2X ++4 -5 O92 $8 -o7i*32 -*39o0dsRZ +o7i *32 +*39 o0d sRZ u O09 sAL +3 O08 c $1 $9 $7 $1 -*06{ -ko3o[ -+9swS +*06 { +k o3o [ ++9 swS $d $o ss5 se3 sa@ o6- -*51o5u -o0c +*51 o5u L6 i2j $! $! $! ] O69 *03 i73 i73 u '6 $3 -o6zLB +o6z LB O68 u '6 $7 $s $o -]K -+7*76 +] K ++7 *76 i79 i70 -o3ys 6 +o3y s 6 u $1 $9 $9 $3 { ,4 *21 O28 O24 *B2 ,B $& -*26*50 +*26 *50 $c $a -uK +u K ] $k i4e o1y -s0Jr +s0J r o7i sbQ OA5 -6 +6 l O71 -*12Z1 +*12 Z1 z3 i3f o7t -o7s-B*78 +o7s -B *78 i74 i72 -[ ^W +o0W c '7 $3 -*76s%5s|O +*76 s%5 s|O ^5 ^1 o4e -]o8jo2d -]*75 -Ksf]*A2 +] o8j o2d +] *75 +K sf] *A2 $9 $8 $9 oB7 -*3AoAU*76 +*3A oAU *76 o0L -*20] +*20 ] C $1 $1 -D6f'6 +f '6 $l $o -*75r +*75 r u T5 o4- i70 i73 @@ -2400,55 +2388,54 @@ o88 f O7B sm2 { Z5 ^6 ^1 ^0 -,5sz, -r{ +,5 sz, +r { o6? -9 -A ^6 ^1 Z1 s9_ O4A -*68Y5 -Y1*6A +*68 Y5 +Y1 *6A suy $m $a $n K O92 ^4 ^9 ^9 ^1 -sep*12 -*23^m +sep *12 +*23 ^m o4j ^9 ^1 ^q { O47 *79 +B -A --Brsn& -tshi*9A -D7-7 +-B r sn& +t shi *9A +D7 -7 o4M { d c O8B ] $o TA O81 sN- -*32*13 +*32 *13 *93 K O28 i12 -d O28 '4 Y4 d O28 '4 d -Y2*1A -sV>i1i*13 +Y2 *1A +sV> i1i *13 sbj o9. o22 --7^a +-7 ^a O14 d -t*12 -[ ^i +t *12 +o0i O79 -$&,7 +$& ,7 c $2 $0 $0 $5 --8s0% -D6*5B -$w*4B -$2sr% -s=vc +-8 s0% +D6 *5B +$w *4B +$2 sr% +s=v c ^2 ^1 ^0 $m $i i75 i74 @@ -2457,42 +2444,41 @@ o0P z3 O0A $i $d $1 OB5 -,6*B4o9n -*3AT5 +,6 *B4 o9n +*3A T5 +7 *84 *30 -ts_v +t s_v O62 r o1U -kc +k c O0A D7 -sf(*05 -o0l +sf( *05 *43 O63 E --7*94 +-7 *94 $u $m sBq *8A O62 } z4 ^9 ^9 ^9 ^1 -D6s5^ +D6 s5^ o7. u '6 $2 -sy6oB` +sy6 oB` { +5 +2 ^0 ^0 ^0 ^2 -sP=+6 +sP= +6 O96 i6o { z5 -sBx$1 +sBx $1 O95 O13 -]Z1 +] Z1 O53 $1 i9- T8 OB5 i71 i73 } Y2 -K] -,2*9B +K ] +,2 *9B -C -C u -1 O17 $Q @@ -2502,102 +2488,100 @@ $1 $9 $8 $5 $/ o70 -5 i2v -t*92 -sT6$s +t *92 +sT6 $s ^5 ^2 -$5s[.sc9 +$5 s[. sc9 $f $u $n i72 i70 o4. { ^r *30 -Z1sg8 +Z1 sg8 ^0 ^3 -.A+7 +.A +7 i5h ,8 OB1 o7h O71 O2A L0 i94 -s.<+9 +s.< +9 O71 +B $b $a K *A3 O79 -Ki9G +K i9G i75 i79 o5@ o4z ^W -iA|$x -o0w -s\IC +iA| $x +s\I C i79 i78 ^a ^b $f O19 sZ# D4 +1 o41 +8 O37 -sGuK +sGu K ] $e $d ^u O96 sbd O32 O08 o2- -sZxt +sZx t *2A O93 +2 i76 i76 ^d ^b s%M OB5 O71 -o5].5 +o5] .5 p3 o68 --0+1 +-0 +1 i2w i79 i76 $a ^A o82 -o2js@l +o2j s@l ^2 ^5 o1e $O i70 i75 -+2+6 ++2 +6 o5- +F +F -*A5i2h -svy*70*A4 +*A5 i2h +svy *70 *A4 ^w p5 oAm u '6 $9 $L o7v -sac+B,B +sac ,B +8 u -i8e{i8/ +i8e { i8/ $2 $4 $7 O05 O83 -'9.6 +'9 .6 $p $a $s $s -9 -9 -9 -}iBt -*A3*57 +} iBt +*A3 *57 i78 i71 -i6H$p +i6H $p o72 O6B O03 p2 D0 O74 -5 -Es3% +E s3% i6_ -$4*87 -i5ysg1 +$4 *87 +i5y sg1 *02 *B5 O18 o99 -o1zR8 +o1z R8 i4z ^M O48 -$9+B*B4 +$9 +B *B4 u '7 $3 c '7 $9 -+4-6 ++4 -6 O39 oAX ^i -o0T C O03 o67 c $2 $0 $0 $4 @@ -2605,97 +2589,97 @@ c o1@ i1g *17 o0o O36 i6w --2-3 +-2 -3 ^9 ^0 ^0 ^2 $a $l $e -sGB+7s[n -*7By1 +sGB +7 s[n +*7B y1 c o54 --0-3 +-0 -3 } } } } c -i73] +i73 ] ^4 ^1 O32 *69 E -o6i^g +o6i ^g o2p i71 i79 -s$bC +s$b C r *67 O93 ^3 O09 u '6 $8 O9B o2m -o7S*12 -KoAZ -{s`' +o7S *12 +K oAZ +{ s`' i47 [ -iB*u +iB* u $C O52 d c $1 $9 $6 $9 i10 ^1 ^0 -D4+6 +D4 +6 O87 $t $i -.4L8 -ui9n.A +.4 L8 +u i9n .A } Y3 O04 o1u } T2 ,3 OB7 l -+7+9 -s/_sj9 ++7 +9 +s/_ sj9 t +0 ss? $b $e ^8 ^1 .A i33 -s{csJ^o5i +s{c sJ^ o5i u -A O87 s-. O91 s`2 i77 i71 ,5 o8O O64 -1 -2 -Cr -*87] -o6Wl +C r +*87 ] +o6W l *2B O82 i11 $2 $0 $1 $3 o7z -+0-6 ++0 -6 $b $o $x $h $o *62 O53 '6 O54 i5t $m $e $n -,3*1B +,3 *1B O34 y2 -,8*75 +,8 *75 f '8 O14 -sEK,7 +sEK ,7 $h $e -TA*23 +TA *23 O97 -*76DA +*76 DA ^1 ^9 -*19i8. +*19 i8. OA5 --0+3 --4-6 +-0 +3 +-4 -6 } O04 Y3 ^- ^8 ^0 ^0 ^2 o25 -fsm>iBV +f sm> iBV OB2 sWB } DB o8m o39 u '7 $7 --0+7 +-0 +7 c 'A $1 +3 +4 r $0 @@ -2706,24 +2690,24 @@ s;+ O83 OB4 i75 i75 u '7 $9 -sC7stj -sgvY1szF -*A2sTWz1 -p5E +sC7 stj +sgv Y1 szF +*A2 sTW z1 +p5 E +7 sZH O3B o5! o7? -s{?'9y1 -y3[ +s{? '9 y1 +y3 [ i78 i70 O41 s.h -iA;,B-6 -*34^m +iA; ,B -6 +*34 ^m u '6 $1 i5s $% L9 O41 O81 -sO-s}TD5 +sO- s}T D5 +A O75 c $5 $5 $5 $5 soi @@ -2733,8 +2717,8 @@ O57 ] ^7 ^1 ^' *05 O03 '3 d -o71*7A -^lsx$+6 +o71 *7A +^l sx$ +6 $b $a $r O09 { u o2l @@ -2742,28 +2726,28 @@ sdf O24 *1B O75 ^1 ^0 ^0 ^2 O12 *31 -i0es=q*B3 -+2+7 +i0e s=q *B3 ++2 +7 O32 ] -Et +E t i5> O46 O59 ^9 ^6 -T1*0AR8 +T1 *0A R8 s\+ O81 -+2+5 ++2 +5 c ^9 ^9 +B +C u '7 O96 sT| ^7 -*B7y5 +*B7 y5 o1! -tT8 -+0+5 +t T8 ++0 +5 i7k O71 O26 o1- -$8s`| +$8 s`| d '5 *13 r ^4 ^2 @@ -2776,51 +2760,51 @@ O04 u l ^y ^m shy O85 ^D --7csrM -sma*B2 +-7 c srM +sma *B2 $; --6+BE -iBP$3 +-6 +B E +iBP $3 $h $i $i $s $m o3- -iB-]i0m +iB- ] i0m -3 t -KR3 +K R3 o89 O96 O94 +6 l O84 i19 ^C O18 u $4 $4 -Y1*18 +Y1 *18 Z1 O01 +A o4+ $e $m c $1 $9 $7 $8 i7s i30 -*0B-7sL$ -*4Bu +*0B -7 sL$ +*4B u $s $h --4+6 -.7$5 +-4 +6 +.7 $5 $a $y $1 $A i3' O04 T7 r $7 'M c ^0 ^0 -o72s+L +o72 s+L ^2 ^3 -du +d u p3 +2 $1 $4 $4 ] .1 --0K +-0 K i8! -*16-0l -*A5o1bs<) +*16 -0 l +*A5 o1b s<) i78 i77 $9 $9 $1 -D -D @@ -2833,47 +2817,47 @@ c '8 $3 ^e ^c i77 i77 ^1 ^5 -*A7,9T2 +*A7 ,9 T2 ^5 ^0 c Y2 i5f -*86^1 -+0-4 +*86 ^1 ++0 -4 ^2 ^9 ^9 ^1 ^8 ^2 -*05E --9*06 -*6A*06 +*05 E +-9 *06 +*6A *06 O39 u '7 $0 $p $a -,7sC} -'9D3 +,7 sC} +'9 D3 i3t o1i --3u +-3 u c $1 $0 $1 o3b -o95,7 -]oB's*s -*5B]st% +o95 ,7 +] oB' s*s +*5B ] st% o3i -*18s-)t --6+8 +*18 s-) t +-6 +8 $K -*3A{*01 +*3A { *01 +E +E $3 $d ^3 ^9 ^9 ^1 o8. T1 O75 s7A -Y1s*H[ +Y1 s*H [ i74 i73 -T3sFq +T3 sFq ^6 ^9 -*53o9T -sY7*36,0 --4+7 +*53 o9T +sY7 *36 +-4 +7 $9 $9 $6 $p O02 i70 i78 @@ -2882,67 +2866,66 @@ O58 ^8 ^9 O35 ^T u $3 $3 -ls^O +l s^O ^9 ^2 -+2+4 ++2 +4 oB) sB0 O25 --4+5 -s9E^Ac +-4 +5 +s9E ^A c i77 i70 O72 ] T9 i7_ c ^4 ^1 u '7 $4 -*29T3*8A +*29 T3 *8A o6? u ^6 ^0 l i7+ i73 i70 -*56s<-sSe +*56 s<- sSe C $2 $2 o3_ O72 *7B i14 $c $a $t -*B5u -K,7k +*B5 u +K ,7 k i7f $" l O0B c $1 $9 $7 $6 -*41+5 -O28 '4 d +*41 +5 O28 '4 Y4 $c $a $r $c $e { [ -9 -$9*BAsv* +$9 *BA sv* ^a ^f -*94T2*7B +*94 T2 *7B O93 *21 ^2 ^0 ^0 ^2 --0-7 -[[[c +-0 -7 +[ [ [ c i79 i72 o8! i6g s13 ^F -sTk +s2> k i70 i76 O14 d p2 '6 -^Do8b --B,7 -*B3T1 --2+3 -o0C -T4sE`*47 +^D o8b +-B ,7 +*B3 T1 +-2 +3 +T4 sE` *47 E ^3 $a $g $e s)a D6 OB7 ^1 ^9 ^9 ^1 -Y1,4 -s9Ci61*37 +Y1 ,4 +s9C i61 *37 $P -C-B +C -B i77 i72 -$@$@ +$@ $@ OA7 $e $e $t $a $r o78 O1A O91 ^7 ^8 ^0 -i8#o13 -sR<+4 +i8# o13 +sR< +4 ^f ^a *56 D7 -*06+A +*06 +A { *80 ^* -s@%-8 -Z2sN& +s@% -8 +Z2 sN& o5e -+5+8 ++5 +8 O9B o68 $B ^9 { OB6 -T1s0W +T1 s0W u $5 $5 o8d -o7usL? -s) sjm srI u '7 $8 -s^`c.6 +s^` c .6 *B0 O93 *64 O82 ] $7 c $4 $4 $4 -,6*90 +,6 *90 O84 i4o oAp -]$rs'C -o0k +] $r s'C $e $x -[R9 +[ R9 i78 i72 -o0osa} +o0o sa} c '7 $7 $3 $0 $0 $0 -+2E ++2 E o97 +8 +A i71 i74 *15 { O52 -sh;+9 +sh; +9 ss5 se3 so0 $1 OAB $9 $6 $6 c '8 $5 -i8_K --6K +i8_ K +-6 K $0 $0 $3 -*40s'I +*40 s'I i70 i77 ^8 ^8 ^a O43 u O37 -'9cs-D +'9 c s-D $d $a $y i74 i79 O61 OB1 E -*8B,4i9? +*8B ,4 i9? c '8 $9 O43 O57 sbh sdR s+s O31 -o4es#fs1N -^w*13 +o4e s#f s1N +^w *13 O31 O69 o60 O92 *64 O74 s?L i76 i72 -Y2t +Y2 t c '8 $2 o2y -+B*63 -R8s>q ++B *63 +R8 s>q r $6 -^4s-q +^4 s-q u '8 $6 O3B L8 *13 -*35*78c +*35 *78 c c $0 $0 $1 $3 o62 $8 DB -sPt[*8B -*16*B2iAi +sPt [ *8B +*16 *B2 iAi o1@ r $9 ^c ^a -Cs47 -^0*90s/= -s#U$5 +C s47 +^0 *90 s/= +s#U $5 $. $c $o $m o5o -*69u +*69 u *09 *06 O5B -i2n*96 +i2n *96 $3 DA -Z1s93 -sl}u +Z1 s93 +sl} u u '6 $0 -$$$$ +$$ $$ ^a ^a ^0 ^1 ^0 ^2 ^c ^d -$1$9$8$4 +$1 $9 $8 $4 O2B o2f -s#kz1 +s#k z1 O24 iA* O37 ] +C -B c $1 $9 $7 $5 r $2 -,5s0. +,5 s0. r $8 O43 oAD y4 --5^g*36 +-5 ^g *36 O6A Z1 *67 sTW *15 O14 $m *26 @@ -3158,20 +3139,20 @@ i79 i75 *96 +7 -9 ^7 ^0 ^0 ^2 -+0+8 ++0 +8 o5x ^5 ^3 -*56s7E -+1+7 -o8jz1 -coBOZ1 +*56 s7E ++1 +7 +o8j z1 +c oBO Z1 c '7 $6 --9T8 -^!+B -iBp-8 -Y1+7 +-9 T8 +^! +B +iBp -8 +Y1 +7 ^Z -R0t +R0 t } *73 O64 -3 } O86 y3 @@ -3183,7 +3164,7 @@ c d $1 c '8 $4 i76 i75 c ^5 ^1 -*B8sq(d +*B8 sq( d c $1 $9 $7 $4 C $2 ^3 ^0 @@ -3197,52 +3178,52 @@ u '8 $0 i72 i79 O12 ^5 $a $c -*72i7a^k +*72 i7a ^k o6@ -T8s=# +T8 s=# D0 O3A *A4 i63 oB` O69 T2 ^7 ^7 i35 i34 u $1 $1 -i8;z1 +i8; z1 t sB8 O74 sjU --7*82 -.8Z2 +-7 *82 +.8 Z2 O8B Z2 o29 ^_ $5 DA -sW4[ +sW4 [ DB y3 OB5 i0M i1a O83 l i1f O31 O0A -sy[[ -sPH*56 +sy[ [ +sPH *56 ^0 ^1 ^0 ^4 ^4 ^c ^e -dtsyG +d t syG c '7 $8 i75 i70 -i81*90*5A +i81 *90 *5A k OB5 $b $o $b -Z3*B5] +Z3 *B5 ] OA4 T5 -sk[*01s=B -kRB +sk[ *01 s=B +k RB +7 *03 $m $s ^9 ^8 ^0 -*8A] -*A5*56s06 +*8A ] +*A5 *56 s06 O82 i79 i72 i74 -LB*57 +LB *57 $1 $3 $3 O94 +B O74 o5l @@ -3254,26 +3235,26 @@ O51 OB2 *B0 $E O86 +9 +B i71 i78 -T1'9 +T1 '9 sp1 O59 T2 -*A3y3 +*A3 y3 $2 $3 $3 l $5 $5 ^9 ^8 -*05sXR -s1#T5 +*05 sXR +s1# T5 OA5 s}t O51 --Ai88 +-A i88 o0Z -$n$y +$n $y i8r ^e ^e $9 OB1 -D5scv +D5 scv $0 $1 $2 $s $u $n i71 i76 -{*4BE +{ *4B E ^5 ^9 $d $o $c o3[ O25 iA[ @@ -3283,9 +3264,9 @@ i76 i70 *7B O52 O43 iAP ,3 $r $e $d --8iA( +-8 iA( o8q O15 -.AiAn +.A iAn u '8 $5 O62 saD u c i4- @@ -3294,23 +3275,23 @@ E Y2 O76 i73 i79 $h $u $b $o $f $t -*B7*B0,7 -^C*B4s]H -]$A -]Y2 +*B7 *B0 ,7 +^C *B4 s]H +] $A +] Y2 *53 sAg O74 i1. -sgeo4n +sge o4n $9 $9 $4 $a $t $e ^8 ^7 u '8 $7 ^3 ^8 ^0 ^2 ^8 --Bl +-B l i5u -s.!sEtT3 -LBE +s.! sEt T3 +LB E s12 $s $o $n } '4 } } } @@ -3324,163 +3305,162 @@ i3h '7 $! $! $! ^7 ^0 [ OB5 T9 -}s.wo7H +} s.w o7H } +9 t ^7 ^3 -+3-5 ++3 -5 } t +9 -sh4o5rs!\ -k$! -s(-'9*62 -D6o9BRA +sh4 o5r s!\ +k $! +s(- '9 *62 +D6 o9B RA O89 l $6 $6 .6 smS O28 -9 s". O1B ^o ^c -iB&CiB/ +iB& C iB/ } ss9 *52 O79 o5+ $o $w -*0A+5 -K.6 -$5*76 +*0A +5 +K .6 +$5 *76 t p5 ] d t O7A i42 --3o0wiB` +-3 o0w iB` $f $a $n i95 o4i *30 o48 *17 *90 ^! O97 -+2-4 -*80T5D9 ++2 -4 +*80 T5 D9 $0 $0 $4 o8@ c '9 $3 -K-9oA0 +K -9 oA0 ^9 ^9 i72 i75 -ui6us}Z +u i6u s}Z $e $7 -*86sth^P +*86 sth ^P $i $n $n -]R9 -D2s[k +] R9 +D2 s[k i5_ s21 -]i60 +] i60 ^0 ^0 ^2 -s(#Z2 +s(# Z2 [ *71 -+BY1 ++B Y1 l $6 $5 ^4 ^6 O62 { *36 -'A[ +'A [ D2 *34 O56 l $3 $3 C $9 $9 u '8 $8 s.7 -*B5[ +*B5 [ syt u '8 $9 $h $i $p } Y5 O75 c $1 $9 $7 $3 -Y1sMk +Y1 sMk +8 -A $s $e $x O5B O43 ^5 ^8 ^0 u $1 $2 $3 -^zsPo +^z sPo O38 O73 -sDQR4 -sHi-2 -D0*B7*03 +sDQ R4 +sHi -2 +D0 *B7 *03 L2 ^0 ^9 O34 i1v iAm -L9C*79 +L9 C *79 l $8 $7 $X u $9 $9 +7 *17 -+A*6BZ2 -,1{ -^CsBo ++A *6B Z2 +,1 { +^C sBo sqQ O62 ^2 ^4 -OB7 p2 '5 +p2 '5 c ^8 ^1 iA2 *B9 Z2 O4A $p $r $o $o $f -]s;K -sv1*81 +] s;K +sv1 *81 ^H -,3$7sU; +,3 $7 sU; ^2 ^9 $a $h r $4 -*48]$3 +*48 ] $3 i74 i75 -o0M -*80z1 +*80 z1 { O98 *3A y3 o3n O45 -KZ1l +K Z1 l $! c o3d ^1 ^4 -o87DB +o87 DB i1@ --7sdg -T1*B0 -Y2E --4-7 +-7 sdg +T1 *B0 +Y2 E +-4 -7 *05 D5 --7E -sHGr +-7 E +sHG r ^6 ^8 ^0 [ ,3 -+3+5 -+3-7 -sQ/y2 -*B9} ++3 +5 ++3 -7 +sQ/ y2 +*B9 } t $1 -*A9swc.6 +*A9 swc .6 z3 O23 O76 s z u $6 $6 si4 O8B Y1 o0R { Z4 -'5*03o6f -$1$9$8$3 +'5 *03 +$1 $9 $8 $3 ^5 ^8 -+8iB/ -^bsx. ++8 iB/ +^b sx. r $3 -sj{*92T4 -D0'AE -slisU.*86 +sj{ *92 T4 +D0 'A E +sli sU. *86 $9 $9 $3 Z1 O21 .7 *03 -s?.^2 -*67sf.s12 +s?. ^2 +*67 sf. s12 o1. u '8 $2 $S l -7 OA6 $e $8 o7R -i3ui81 +i3u i81 o2n *58 ^0 ^8 @@ -3488,7 +3468,7 @@ o2n ^9 ^5 -5 p5 r TA -s. -.6i9p -syqZ1o9y -.7-7 -o7Y,3 -s\-D7 -s4VsJb} +*54 oB> +.6 i9p +syq Z1 o9y +.7 -7 +o7Y ,3 +s\- D7 +s4V sJb } $t $o $n ^Y -Z1*28*39 +Z1 *28 *39 ^" o2r u '9 $9 ^3 ^8 O9A K *6A -*09s?"y3 +*09 s?" y3 O31 sbU E o9a i3l *34 K -y2] +y2 ] o1I O25 s8. D2 O31 E -Z1o97 +Z1 o97 c $1 ^1 l ^x $x ^x $x c '9 $9 ^7 ^1 ^0 $J -]*16 +] *16 $8 $1 $8 -+2-6 ++2 -6 *8A ,A O72 s#d O78 f -^PoB- -^ST8 -[^O --7s2eY2 +^P oB- +^S T8 +o0O +-7 s2e Y2 E OB2 *53 ^b ^f $8 $9 $9 $d $1 -s_b[ +s_b [ E O49 ^X -}sS@ -D8+8*B9 -,8l +} sS@ +D8 +8 *B9 +,8 l c r *52 u O86 -s#tLB*65 +s#t LB *65 u '9 $8 -+9*9Asjy ++9 *9A sjy *B0 OA3 $. ^4 ^3 +A +C @@ -3941,69 +3916,69 @@ O73 t -B } y4 $y $e i76 i73 -s|*$8 +s|* $8 i15 O06 s#Y -o34sN! +o34 sN! O24 $i i74 i77 i75 i76 $! O49 i7V $_ $1 iB- -lsaH +l saH $p $a $t O96 o22 O96 Y2 c ^7 ^7 -}s)7 +} s)7 'N o8z -Y1*36 +Y1 *36 Y2 O9A r $4 $4 -i71s!1 +i71 s!1 o5d *6A $A O93 k O81 O48 -i6<^1*B3 +i6< ^1 *B3 l $9 $2 O73 *96 -sVLEo5v -]ss6 +sVL E o5v +] ss6 ^r ^o ^f +A -8 i32 i31 i72 i76 -s/A '5 O5B +s/A '5 o0Y O71 sx, -+1z1 -Y1} ++1 z1 +Y1 } l $9 $3 -fcsBz -s(y} +f c sBz +s(y } o9! o7u o68 o7Z O65 -s>C+6K +s>C +6 K $m $a $p -iA>T3 +iA> T3 -3 o94 $w $e -E]Y1 +E ] Y1 $5 $9 $5 ^C O81 $k $e $y -r*56 -*31l +r *56 +*31 l O34 sGT [ -+6i8a -ss_o63 ++6 i8a +ss_ o63 $e $6 *61 +6 O25 -s01] +s01 ] $l $s O81 O3A } O69 OB3 @@ -4016,7 +3991,7 @@ $i $c $e oA2 y3 E T7 s&2 O19 -D7T6 +D7 T6 ^l ^A c '8 $7 $k $i $n @@ -4027,9 +4002,9 @@ o11 s0v $e $3 $3 $5 $0 --2-5 +-2 -5 s45 t -D1$p +D1 $p ^e ^a O49 o2w @@ -4039,12 +4014,12 @@ i73 i74 i75 i78 $9 $6 $3 i38 -o6Isij +o6I sij ^1 ^1 ^0 ^2 +8 ,9 u c '9 $6 i77 i76 -*4A*63 +*4A *63 O53 $0 $4 $1 $9 } o1N @@ -4055,8 +4030,8 @@ i71 i89 i99 iA4 $b $a $y i69 '6 $6 -*94Z3] -i5is;_u +*94 Z3 ] +i5i s;_ u o2s ^f ^c *08 @@ -4065,12 +4040,11 @@ O93 ^A i8\ $3 $9 $9 O59 Y1 c $4 $5 $6 -o0D -^1*6B +^1 *6B E O31 ,6 O03 *1A O03 iAJ -$5o9V +$5 o9V ^e ^f ^0 ^0 $b $u $y @@ -4081,7 +4055,7 @@ i8a c O28 sbu O13 i35 -*A6^!iBA +*A6 ^! iBA O38 O02 l $7 $8 i72 i78 @@ -4102,7 +4076,7 @@ o2t $k $s i61 i79 i88 i99 sao -sS1Y1 +sS1 Y1 o0y i61 i79 i89 i94 o7+ @@ -4111,10 +4085,10 @@ $2 $3 $1 $y O84 $p $e $t i81 i99 iA8 iB9 -i6x*28 +i6x *28 .6 E -$3s*Ho5j -s<@Z2s[_ +$3 s*H o5j +s<@ Z2 s[_ -B -C O81 s18 i2c @@ -4129,9 +4103,9 @@ o60 t $y $o $c $a $m T8 O71 -o8r.4*A5 +o8r .4 *A5 o8- -*95^niBm +*95 ^n iBm *76 O21 O84 OA9 o0T l $a @@ -4139,39 +4113,39 @@ sL[ O62 $e $5 i81 i99 iA9 iB4 $h $i $t --A^8s^U -+3-6 -svU,8 +-A ^8 s^U ++3 -6 +svU ,8 $5 $2 $5 i8n O91 $f $e -*6BsNn+8 +*6B sNn +8 o9@ -s,\D1 +s,\ D1 $4 $0 $4 -8 -A i2l -s1-swf +s1- swf ^1 ^7 i81 i99 iA9 iB0 +D -C c T2 T1 s\% s!3 O62 -Y1+6oAl -*90'7$7 +Y1 +6 oAl +*90 '7 $7 $t $a $n o2$ $6 $1 $8 -sosL9 -sT9*62^f +sos L9 +sT9 *62 ^f $8 $1 $5 -$^$^ -*B3*12 +$^ $^ +*B3 *12 ^c ^b c $2 $3 $2 $3 $r $u $l $e $s ^q O96 -A -i7m*4A +i7m *4A $d $c -3 -5 i79 i73 @@ -4182,59 +4156,59 @@ i2f l $9 $4 i71 i89 i98 iA9 O5B -o5eEsm/ +o5e E sm/ i4r -*5B*84] -so!*0B -,A^G -sMLt +*5B *84 ] +so! *0B +,A ^G +sML t '9 $2 O0B *01 $6 $1 $0 $a $i $d O78 -7 ^4 i78 i75 -T0sr; +T0 sr; ^0 ^8 ^0 $V i2r $5 $7 $7 ^5 ^4 -*A3i0r +*A3 i0r i2u *34 p3 $6 $1 $5 -uT6 +u T6 K RB O87 c ^4 ^2 c $5 $0 $0 -*4B^a +*4B ^a i8s [ O91 *18 -0 OA2 -s7e*A0K +s7e *A0 K D7 O49 O3A [ E o05 c $3 $0 $0 ^s y1 -L5+9i3s -$5K*A7 +L5 +9 i3s +$5 K *A7 syf $o $x -t*52*9A +t *52 *9A ^e ^v ^o ^l ^i c '8 -[s.Nc +[ s.N c [ C $f $i $t $3 $0 $0 $m $i $x -*54o6w +*54 o6w *16 O39 R0 O73 +5 -^ksp7 -^lt +^k sp7 +^l t ^b ^c d r O23 s61 @@ -4259,16 +4233,16 @@ i76 i74 sFA O05 s$C i76 i77 O8A -r[o3d -R4k*16 -+8Y1*A5 +r [ o3d +R4 k *16 ++8 Y1 *A5 $c $c ^m ^i i81 i99 iA9 iB2 L8 O9A D3 $4 ^7 -*93,6 -+A*54 +*93 ,6 ++A *54 ^3 ^3 i71 i89 i99 iA6 i6@ @@ -4277,81 +4251,80 @@ i61 i79 i89 i92 OB1 ,7 sQ} O62 O68 E $i $r $i $s $h --3+7 +-3 +7 z4 *30 sl$ O35 O75 [ sWE -*67c +*67 c o8r o1O --0*47 +-0 *47 s T E O8A -RBE -D0 ^6 +RB E $5 $1 $7 i36 K O43 O56 L6 O64 { { { { c -sp>*68o26 -Y3R9 +sp> *68 o26 +Y3 R9 ^5 ^6 -oB +*42 s2G sb> p5 $5 $0 $9 *15 O8B @@ -4361,18 +4334,17 @@ i81 i99 iA9 iB3 $7 $1 $6 i77 i74 Y5 s(u O36 -+1+4 ++1 +4 i61 i79 i89 i90 $5 $7 $8 -+8sUc -o0h -.0L8 -+6-9 ++8 sUc +.0 L8 ++6 -9 $^ $3 $0 $4 u 'A $5 ^1 ^9 ^0 -y1s)X +y1 s)X u $4 $6 i61 i79 i89 i93 } c } } } @@ -4388,19 +4360,19 @@ $9 $1 $0 $} $5 $0 $7 O81 *5B *4A -^qTA -s38*B1^M +^q TA +s38 *B1 ^M i31 i31 u $8 $8 $b $o $o -sq/-0 +sq/ -0 $p $u $b -+0-8 ++0 -8 K R1 i71 i89 i99 iA0 c o7@ $3 $0 $6 -^EsG5s2A +^E sG5 s2A o4o $b $y o2G @@ -4413,7 +4385,7 @@ $7 $5 $0 O1B $4 $2 $6 [ [ [ [ c -sUI[,2 +sUI [ ,2 O92 O59 i1H l o7x @@ -4423,22 +4395,22 @@ OA7 *A4 s25 O4A $3 $0 $9 OA6 --0+5 +-0 +5 ^8 ^3 -*6A^0szQ +*6A ^0 szQ O05 *B1 O95 ^6 ^6 -*15usG/ +*15 u sG/ $e $n $d soa -iATEs$d +iAT E s$d s93 o34 $7 $1 $5 u '8 $1 $2 $8 $6 --0-5 -D2TA +-0 -5 +D2 TA O32 sOj .7 OB1 ^1 ^0 ^0 @@ -4448,23 +4420,23 @@ c 'A $3 i76 i78 O45 +5 i61 i79 i89 i96 -*7B.7 +*7B .7 O65 ^9 $o $u $r o92 -srY*90Y1 +srY *90 Y1 $5 $4 $0 ^0 ^2 ^2 -'5$c +'5 $c $1 $1 $4 -^JiB8o8E +^J iB8 o8E $1 $4 $0 -sQ+^0*6B +sQ+ ^0 *6B i8D O82 --2-7 -iA"Z1 +-2 -7 +iA" Z1 $o $i $l -up4 +u p4 $4 $4 $5 o08 t i7n @@ -4474,18 +4446,17 @@ c $2 $0 $0 c ^5 ^2 $9 $3 $0 O81 .5 -o0F -Z2spM -,8sxn +Z2 spM +,8 sxn $g $a $y i77 i75 u $9 $8 OA5 ,8 } -o4j*37-1 +o4j *37 -1 l Y3 OA1 -fsYA +f sYA sTe $@ OB1 -z1l*16 +z1 l *16 ^3 ^9 o6n O81 s(} @@ -4495,11 +4466,10 @@ $e $a c $1 $@ $4 $3 $7 u $7 $8 -o0r $6 $4 $2 -*3A,8 +*3A ,8 $8 $0 $0 -sa>^! +sa> ^! O62 *2A O38 k O02 O7A O07 @@ -4527,7 +4497,7 @@ s71 o4@ +4 -3 o1U l -*69R7o90 +*69 R7 o90 O06 O78 O09 ^U $2 $9 $3 @@ -4535,31 +4505,31 @@ i73 i78 r i8A O1B $< o90 -'BD1 +'B D1 u $9 $4 $g $s s64 u O9A *7B i71 i89 i99 iA3 -s/n*14*26 +s/n *14 *26 o2@ ss5 si1 so0 se3 saU O6B D7 -szis6/*79 +szi s6/ *79 $f $l $y -snCZ1 +snC Z1 ^2 ^6 ^2 ^1 ^1 y3 O09 -i5vR1 -D3*09] +i5v R1 +D3 *09 ] o45 $t $e $n o6a -*82$)o5m +*82 $) o5m $a $2 c $1 $9 $6 $8 -Es!( +E s!( O64 O7A $2 $5 $3 $r $a $n @@ -4570,62 +4540,62 @@ T0 O7B ,5 s4$ O72 $! } $$ $i $o $n -i5ps+1 +i5p s+1 $m $y -$6s8Wl -oB(o90 -oAz[^R +$6 s8W l +oB( o90 +oAz [ ^R O42 sGz *7A t OB9 u '9 $1 -s3pi0isvm -smyD2 -o42i60 -s=oR7s+% +s3p i0i svm +smy D2 +o42 i60 +s=o R7 s+% o7_ $5 $6 $0 u $0 $0 -'AszO -o8Fu +'A szO +o8F u c T4 T2 $p $e $n $6 $5 $7 sJ$ T4 O2B -l] +l ] *24 O24 $8 $2 $5 i68 -+2-5 ++2 -5 u $8 $7 $6 $6 $7 -l$u*A3 +l $u *A3 O21 i4v ,7 $e O98 -*17D6 --0sH( -sKJ.5 +*17 D6 +-0 sH( +sKJ .5 $a $u $d $i $o $3 $4 $1 $a $b -sk!l -*6A-9 -*82,6 +sk! l +*6A -9 +*82 ,6 ^l ^a O67 iBe -}saB --0+8 +} saB +-0 +8 c $. $1 -*8Ai97 +*8A i97 ^7 ^6 ^; $4 $7 $4 -,2'7 +,2 '7 i74 i78 i6l -s ''5 -T8.7 +s ' '5 +T8 .7 i3d O8B c -+1-7 ++1 -7 o6u D8 c } } c } } @@ -4643,20 +4613,20 @@ $t $o $r $i $n $s i78 i76 O29 O2B -'As\1 +'A s\1 o1t $3 $2 $9 o3y -.0z1 -Z1*14s%t +.0 z1 +Z1 *14 s%t u ] $d $b u $3 $5 -$8l +$8 l i30 i31 O21 *89 k OA2 $6 -sMEd +sME d $3 $0 $7 ^b ^d O51 o6q @@ -4666,35 +4636,35 @@ Y3 O53 i8e o3n o2v -s S*28T5 +s S *28 T5 o12 *81 $3 $4 $0 -DA,9} +DA ,9 } c $7 $8 $9 c $1 $9 $6 $7 $5 $4 $9 -*B0.5 +*B0 .5 C $0 $0 ^8 ^1 ^1 u $0 $6 -$osZw +$o sZw $8 $0 $3 C $7 $7 o9_ -cDB +c DB c '9 $2 -Z1sc@D5 +Z1 sc@ D5 ^c ^f p5 -9 c '8 $8 o3S K -9 -$?$? +$? $? O31 $8 ^j O14 *6B -0 O65 -T5sW{ -*41z1 +T5 sW{ +*41 z1 ,7 O01 $c $s *39 T1 O96 @@ -4705,35 +4675,35 @@ r d O4B i3p $] O5A ,7 -sI4T4 +sI4 T4 $p $a $l -,0 Z5 O67 -+1+5 +Z5 O67 ++1 +5 $6 $5 $2 *49 .0 OA4 -T4*B3 +T4 *B3 O39 O34 ,7 O42 o8+ -$E*48 +$E *48 $7 $9 $3 $e $r $a +A +A +A $2 $2 $5 o6l $5 l -l$* +l $* O3A *15 l Z2 --2^w +-2 ^w sNb O81 $N O38 -$Rs)| -sd4i42T8 +$R s)| +sd4 i42 T8 ^4 ^1 ^1 c ^4 ^4 y1 O45 -D5L8 +D5 L8 Y1 ,9 s85 ^h O63 @@ -4744,9 +4714,9 @@ C $8 $8 sae u 'A $2 i73 i77 -^fD9*05 -k$? -,7.5 +^f D9 *05 +k $? +,7 .5 ^7 ^8 ^9 ^1 i17 p2 '6 @@ -4755,35 +4725,35 @@ O52 OA7 sqm O1A o5u c $< $3 -str*3B$. +str *3B $. ^9 ^8 ^9 ^1 Y4 *87 O86 i78 i73 ^6 ^8 ^9 ^1 -$-$- +$- $- o1A u $9 $2 -s/OT1sZL +s/O T1 sZL O28 ^w $f $i $x o4t -$1$9$7$5 -s\=*76 +$1 $9 $7 $5 +s\= *76 i50 i52 u $6 $3 { sp- $1 $0 $3 ^0 ^6 ^0 u $0 $8 -$!$@ -+8o4a +$! $@ ++8 o4a u $1 $4 u $0 $9 DA *65 O89 $d $a $d $7 $0 $0 o6d -KsNh +K sNh u $7 $5 u $8 $6 L3 @@ -4791,14 +4761,14 @@ O31 ] p1 $c $h $i O36 L1 t OA7 -,6T3sXa -i82-9 +,6 T3 sXa +i82 -9 O7A } s/A +5 -3 -s8aT6 +s8a T6 O62 OA7 o66 -*08*6Bsfv +*08 *6B sfv o0N u 'A $0 +B -9 @@ -4811,7 +4781,7 @@ i53 i52 o72 u $5 $3 $a $i $l -sRso0H +sRs o0H $m $u u 'A $4 $e $0 @@ -4819,7 +4789,7 @@ $# d s#s $a $7 o8c *72 O46 -T5RB +T5 RB $a $n $i $1 $7 $6 ss5 so0 @@ -4827,21 +4797,21 @@ ss5 so0 $g $o $d u $8 $5 L8 -T4o7F-1 +T4 o7F -1 $2 $7 $8 -*61$3 +*61 $3 o7+ c -*B7*1B-8 +*B7 *1B -8 $6 $0 $0 --2+6 +-2 +6 iA/ OA3 } O32 O07 OAB *10 i31 i30 i65 -i97E +i97 E $g $a $t $e -]*79 +] *79 sPM O35 *BA O17 i7? t } Z2 @@ -4852,14 +4822,14 @@ O49 ,6 u $6 $9 o5t u $4 $1 -+0+9 ++0 +9 ^0 ^0 ^4 C $1 $3 O52 T8 O4A o3w $r $u $n ^9 ^4 -+AE ++A E *0B $b $c $f $f @@ -4871,19 +4841,19 @@ C $3 o3. ^7 ^5 '8 $8 -o8u$z +o8u $z iB7 OA6 s/Y i1d i1a -s[)'6 --5+8 +s[) '6 +-5 +8 $2 $3 $4 -+1+6 ++1 +6 $a $s $h i71 i89 i99 iA1 -*13oBy*4A +*13 oBy *4A i2a $) *0B O72 --Bs;mo0A +-B s;m o0A [ [ O04 [ O04 [ l $8 $9 @@ -4894,55 +4864,55 @@ $@ $1 $2 $3 u $2 $5 u $9 $7 $9 $4 $9 -s4xT4 +s4x T4 *13 -8 $3 $1 $2 -*84^I -.4{r +*84 ^I +.4 { r i2s i53 i51 -^4E +^4 E i44 ^i ^M -o25s)U +o25 s)U st7 i6i -o63*4B +o63 *4B iAs $t $h $e ^4 ^1 ^0 -DBo78.7 +DB o78 .7 $s $e $e -s*`,8 +s*` ,8 i1b i1a i0= r O72 -,3} -i69i0w +,3 } +i69 i0w -9 -B [ O45 *31 *49 i5n -'5u --0RB*A0 +'5 u +-0 RB *A0 s(j O61 O51 sub o1x *50 OA1 +4 -stm+A +stm +A $w $o $w -*52srF -$1$9$7$6 +*52 srF +$1 $9 $7 $6 T6 O78 l $0 $8 -Y2sLQsBf +Y2 sLQ sBf ^2 ^7 -*1Aswz*98 +*1A swz *98 u $1 $8 +1 -4 $a $c $e } z4 O87 d O7A -*78i68o76 +*78 i68 o76 i4u O03 *94 $1 $7 $2 @@ -4962,34 +4932,33 @@ O98 u $3 $6 c $1 $1 $7 y2 Z2 --1-3 +-1 -3 l $0 $9 o7d i1l O73 .7 -K.6sx9 -s/_Y1sH] -+1oBi +K .6 sx9 +s/_ Y1 sH] ++1 oBi l $7 $3 -$1$9$7$0 +$1 $9 $7 $0 $f $c $t $w $o $9 $3 $7 $8 $7 $3 T5 O6B i09 O6A -c$1$2$3$. +c $1 $2 $3 $. i0J i1a i19 i19 c $1 $9 $6 $4 $a $r $k -ssmsYtT5 +ssm sYt T5 $b $b slr DB O92 i81 i99 iA9 iB1 C $7 -o0S ^8 ^8 ^9 ^1 O91 i84 -C -D @@ -4998,7 +4967,7 @@ O93 oAG t O3B O87 i73 i96 O84 s%s -E.B +E .B i6' o4y l $9 $0 @@ -5012,15 +4981,15 @@ c 'A $4 $1 $2 $2 $! $1 $9 $9 $5 sRG O72 --3-6 +-3 -6 ] O53 } u $3 $9 s45 O29 $e $b -s17oA& +s17 oA& u $5 $2 O79 i2p -Y2T8 +Y2 T8 l $3 $0 i7+ o79 K @@ -5029,12 +4998,12 @@ O02 sN9 $o $r $e $s $p $a +D +E -ts&H +t s&H o36 d O5A i0a ^K l $0 $6 -s|;[] +s|; [ ] $h $a $m $7 $5 $4 i3o @@ -5049,18 +5018,18 @@ sbo u $1 $7 $9 $8 $2 l $4 $5 -+7Y2 ++7 Y2 Y2 O52 -*35^e +*35 ^e +A -C c $1 $9 $6 $5 ^4 ^7 o33 ^5 ^0 ^1 l $8 $4 -*9B^psmW -*75*7B -s#Pi0ec +*9B ^p smW +*75 *7B +s#P i0e c O2A sk] T4 u $5 $9 u $4 $5 @@ -5076,7 +5045,7 @@ i8. u d '9 *84 *83 $9 $4 $7 -*24Y1 +*24 Y1 u $5 $7 i90 $> @@ -5087,14 +5056,14 @@ u $4 $3 $s $i $n oB7 ] O35 o1h -T2*0B +T2 *0B o1k -s_@i99 +s_@ i99 u $5 $8 c ^5 ^5 o1e [ O1A O7B o0g -*4B*67 +*4B *67 i5k $1 $9 $9 +0 '4 @@ -5109,7 +5078,7 @@ $6 $9 $6 ^7 ^1 ^1 ^1 ^0 ^1 s[i O36 +0 -*83$kDA +*83 $k DA $c $a $p +D -E i3g @@ -5122,61 +5091,61 @@ skK l $7 $4 u $6 $8 $1 $6 $2 -s]z*75iAH -i8$$z +s]z *75 iAH +i8$ $z } O02 O6A -A -A -A -sKzs3`{ +sKz s3` { l ] $e OB3 s#" $h $a $t -iAWT7 +iAW T7 i2+ O16 Z4 l -o9iu -+9l -*BAD2 -*75s q +o9i u ++9 l +*BA D2 +*75 s q ^4 ^9 ^9 i39 i39 $7 $7 $5 $p $e $r -T7s3d +T7 s3d O58 -5 i1c i1a OA4 O86 ,6 $6 $7 $4 -D4o0b +D4 o0b o4o c ^8 ^8 ^8 u $3 $4 $t $e $a u $6 $0 -[sqY*76 +[ sqY *76 o98 O8A $l $o $c $k iA! r O79 -$uiBjsZ5 -$1$9$7$2 +$u iBj sZ5 +$1 $9 $7 $2 u $0 $3 i4d -*B5] -$i.9 -KY2 -D8Z1 +*B5 ] +$i .9 +K Y2 +D8 Z1 u $3 $7 $1 $1 $8 i0P i1a u $7 $6 c $3 $6 $0 o81 -$yoAS +$y oAS $o $v $a -*06sCQ +*06 sCQ o1z i59 i59 -$1$9$7$4 +$1 $9 $7 $4 o96 OB5 ssy u '9 @@ -5185,84 +5154,84 @@ $p $i $n ^0 ^9 ^0 u $3 $0 o6$ -i92*8A +i92 *8A i61 i79 i89 i91 c $! $1 $t $a $g $r $o $d -s)e*26*B8 +s)e *26 *B8 iBr -s[%o4!*97 +s[% o4! *97 s61 -sIu*01 +sIu *01 $2 $0 $5 $e [ $7 $8 $3 $h $e $r c ^x $x ^x $x -sU6i0N +sU6 i0N l i4+ u $9 $0 -T5oA1s_G +T5 oA1 s_G oBM O03 oA= -o61-9 +o61 -9 i51 i50 i7o -*26{ +*26 { $6 $1 $9 svU 'O u $6 $2 -sot*BA +sot *BA $e $a $r O29 -t*15 +t *15 f u c '7 $0 O05 i6! i77 i73 -i79sxk +i79 sxk $i $t $s O43 u *41 -A ,9 O75 -'9[ +'9 [ T6 OB4 $2 $1 $1 s8s u $3 $8 -szn{s7s +szn { s7s u $7 $4 u $7 $2 i8w -o0Gs O08 @@ -5449,18 +5418,18 @@ $o $w $n u $8 $2 u $2 $6 $5 $5 $3 -*75skY +*75 skY O1A -2 DA O84 { L5 -s5w-5 +s5w -5 s92 ^x ^X $x $X *52 o0B $1 $9 $8 --2+5 -^Bs0gD1 -sfpsVZk +-2 +5 +^B s0g D1 +sfp sVZ k u $7 $3 s^" O41 T3 i5@ @@ -5468,45 +5437,45 @@ l $4 $8 T2 O78 o6s O97 sI7 $w O7A -$A*6A --7o97 +$A *6A +-7 o97 ^0 ^0 ^0 -o8;$N +o8; $N $1 $5 $5 --3*26sIT +-3 *26 sIT $3 $4 $5 u $3 $1 z1 *76 O31 -sjf*58sq+ +sjf *58 sq+ D9 *86 O56 sa4 se3 -i5ey2 +i5e y2 ^1 ^2 ^3 -^ns,| +^n s,| *89 *B1 O85 $1 $2 $5 *9A z2 O91 --A*26 -'7Z1 +-A *26 +'7 Z1 u $8 $9 $s $o $l -y1^y +y1 ^y $a $8 -D8$* -sp3R4 +D8 $* +sp3 R4 u $9 $1 u $0 $1 d 'H $l $o $w *75 O72 -T2s8' +T2 s8' s91 l $3 $4 $0 Z5 u $4 $7 O7B O91 -s+v*57sI% --5-8 +s+v *57 sI% +-5 -8 o61 O51 sy1 i9? K @@ -5514,9 +5483,9 @@ O28 d Y4 l $3 $7 u $8 $4 $b $r $a -D4i4i +D4 i4i O2A Z2 -+8c ++8 c ^d ^A $j $a $m $e $a $t @@ -5526,20 +5495,20 @@ $3 $1 $1 l $5 $7 o2I l $4 $6 -.5sJ3L9 +.5 sJ3 L9 l $4 $0 $" c $i $r $e l $6 $4 oBe OB8 -o9Zs$C+2 +o9Z s$C +2 $g $u $n c $9 $9 $5 s17 O1B O41 sEL -O12 'B *B2 -s%]z2sVn +O12 'B +s%] z2 sVn O86 *B2 $z O71 OA8 T0 ,9 @@ -5547,26 +5516,26 @@ sLN O85 R9 $a $9 *32 *8B O54 l $5 $0 -o9c$s*57 +o9c $s *57 $r $a $t { C -^1r*83 -Ksexo1k +^1 r *83 +K sex o1k i3r } Y4 o8e $A $1 OA8 Y1 D4 --0s=M +-0 s=M $0 $1 $1 $b $d c $@ s38 -{sjoY2 +{ sjo Y2 C $3 $3 i2e $1 $4 $7 -*0Ati8t +*0A t i8t i1r $A O98 c ^6 ^2 @@ -5581,18 +5550,18 @@ $[ $\ l $5 $3 i4& -*93k +*93 k i5l c ^9 ^9 ^9 ^1 l $3 $5 -iBao29l -^l] +iBa o29 l +^l ] l $9 $1 O7B O73 -^ds>2 +^d s>2 ^7 ^7 ^7 -s|'T8 -ksH0 +s|' T8 +k sH0 i41 p2 O49 } O03 @@ -5601,9 +5570,9 @@ l $7 $6 ^0 ^2 ^1 c $9 $0 $0 .8 O8A -s#kDAiA6 -$@$# -*25s$jLA +s#k DA iA6 +$@ $# +*25 s$j LA ^0 ^0 ^8 l $6 $2 O87 ^O @@ -5612,41 +5581,40 @@ $o $l $d O97 +2 *A8 O21 s0K i1a i3a -*74*81 +*74 *81 E D6 i5S l s/2 [ O82 -L8z1 +L8 z1 O3A $b $e $t E O64 $a $r $c -Z1E -s8t{ +s8t { ^6 ^1 ^0 ^2 o8$ $< $3 $u $s $e u $D { O03 *29 -u*95$D +u *95 $D $t $a $x TC -*B6*68 +*B6 *68 ^3 ^8 ^9 ^1 -sDLi93D8 +sDL i93 D8 l $1 $0 o6S -+4*76*6B ++4 *76 *6B ^0 ^8 ^9 ^1 s7g l $5 $6 iA8 O83 K i9S l -o1es2v -^!smI*47 +o1e s2v +^! smI *47 +E -D l $4 $9 i9' @@ -5654,26 +5622,25 @@ c $1 $9 $6 $3 o5j l $0 $3 Y2 O29 -i7)T1 -o0f +i7) T1 o48 l $1 $1 $1 $1 $2 *7A +7 T0 $n O87 -6 -sHntp1 +sHn t p1 ^4 ^8 ^9 i5e i5d -sKm$n +sKm $n i8b O78 -]]]]]] +] ] ] ] ] ] c i6e Y2 O38 OA1 -s|g*16 +s|g *16 *65 y2 O01 o2r -Y1oAm +Y1 oAm p1 i91 i54 i51 $0 $1 $0 @@ -5682,28 +5649,28 @@ K O53 O69 O56 s(O $l $e $d l $4 $2 -sO]-0sAZ +sO] -0 sAZ sUs +7 +8 +8 sq# O3B p1 -^AsOl +^A sOl siE -s|vo5s +s|v o5s $r $a $m $k $e $n O94 OB3 -L8Z1Z2 -s/xsF?iA1 +L8 Z1 Z2 +s/x sF? iA1 O7A p2 -E*75 -i94} -$.$, +E *75 +i94 } +$. $, O42 [ *BA O21 Y1 $9 $8 $8 c $9 $8 $7 ^l ^J -$_$_ +$_ $_ l $3 $1 s\b D1 O91 skc @@ -5712,87 +5679,85 @@ o3$ +B +D skj O63 sVr -*63^6 +*63 ^6 O48 D6 o1S -s6Vo0D +s6V o0D o5k -y2c +y2 c D3 O27 --2sA= -Z3c -sweo9Mo3a -p2s&e +-2 sA= +Z3 c +swe o9M o3a +p2 s&e o7* *63 O14 $0 $0 $9 o6m p5 i5_ c $1 $4 $7 --5sz? -*34.6 +-5 sz? +*34 .6 u $2 $0 sou O35 $_ -Y1oBY$1 +Y1 oBY $1 T1 O58 O72 $. o3s l i3+ o5$ -oB/T2 +oB/ T2 $f $e $e ^9 ^9 ^1 i5o -sy\fu +sy\ f u ,5 p4 O15 -o4aslB -+4+8 +o4a slB ++4 +8 $i $f ] ] ] $s $b $i $d -$,$. +$, $. y3 O05 o4r -sr^$5 +sr^ $5 t '6 i9. -sk*T9*90 +sk* T9 *90 ^s ^a i3e i3d -Y5$w -c} -cK +Y5 $w +c } +c K Z4 s(q O82 $7 $1 $1 ^4 O28 s

c $9 $7 $2 -i6sDA +i6s DA c ^a ^1 -*85t -swn]E +*85 t +swn ] E c ^8 ^2 i33 i32 t O03 -^ms+" +^m s+" u O02 ^f ^e *02 O21 @@ -5951,19 +5915,19 @@ i3d i3a c $0 $4 $0 $4 $a $r $m $1 $2 $8 -sT%srou -.7*1B +sT% sro u +.7 *1B svn o6t O32 o3c O45 s/4 l $2 $8 -T4iA' +T4 iA' ^e ^e ^r ^f O8B } oAJ ^4 ^5 ^0 c $1 $8 $1 $8 -p2sbB +p2 sbB l ^d ^e ^r u T2 ^d ^r ^a ^h @@ -5972,13 +5936,13 @@ i50 i50 $p $i $g $b $i $n u $4 $2 -s}++5 +s}+ +5 O76 *56 -*B5T7 +*B5 T7 $t $i $c OA8 O82 s"I oBp --0] +-0 ] set .7 O5B swV $m $i $l @@ -5987,30 +5951,30 @@ T0 o68 ^w z2 O59 o4a o3k -o70s`1 -Z1*72 -y1,B*23 +o70 s`1 +Z1 *72 +y1 ,B *23 l i6& o96 -sQV +*75 s>V ,5 z1 ^w ^e ^n o6D @@ -6706,13 +6669,13 @@ O37 t p2 $l [ ^6 ^2 ^2 o6e -,6*30 -s.@^W +,6 *30 +s.@ ^W u 'B $0 y3 O07 oB/ u $1 $9 Z2 *6B O53 -*A3C +*A3 C $d $a $m O21 o9O O71 s4k K @@ -6720,27 +6683,27 @@ i55 i52 s3A ^8 ^2 ^0 c $1 $1 $0 -iA?.A +iA? .A o9+ -s4`.6+0 -*6A*50 +s4` .6 +0 +*6A *50 E O89 oA0 -oA&$k +oA& $k d O67 $d $2 -,5s.Y +,5 s.Y r $8 $6 o5( O53 *5A ^m O09 Y2 Y2 o38 -*91*B5^A +*91 *B5 ^A DB $4 i57 i57 ^3 ^1 ^0 $ $1 s67 -iBwi5s +iBw i5s $5 $1 $1 i55 i54 [ $r @@ -6752,84 +6715,84 @@ $8 $9 $0 c '9 $8 'P i5d i5a -*94p2 -o7wf -D9,5 -sg`*A0^0 +*94 p2 +o7w f +D9 ,5 +sg` *A0 ^0 i13 i12 c $2 $3 $4 ^6 ^7 ^9 ^1 O8B O61 sfB '6 $7 i51 i69 i79 i84 -^yT9 +^y T9 $2 $9 $9 i6h -TA+A -,3E +TA +A +,3 E s40 $0 $9 $9 K OA4 -R9T6+A +R9 T6 +A '6 $5 ^7 ^9 ^6 -o01sd2 +o01 sd2 ^1 ^1 ^9 -i52i7k*08 -$1$9$6$8 -tsgD +i52 i7k *08 +$1 $9 $6 $8 +t sgD O43 [ -*56*BAp1 -[sp@ +*56 *BA p1 +[ sp@ $2 $8 $8 -st$R5 -o9-E +st$ R5 +o9- E c $0 $0 $2 ^3 ^3 ^3 *86 O69 -Y2stP +Y2 stP $I $1 O71 -D7t -sbli00 +D7 t +sbl i00 y4 O82 l $1 $2 $3 $4 ^d ^B -^4s24 -*64z2 +^4 s24 +*64 z2 ^7 ^8 ^9 -Ep4 -sKL'5Z3 +E p4 +sKL '5 Z3 ^5 ^5 ^1 -]*A7 +] *A7 o7B -$3o8k -E.2 -i8o*86*0B -suek -$p*B2 +$3 o8k +E .2 +i8o *86 *0B +sue k +$p *B2 $n $a $p O32 { $7 $4 $1 -C*91,9 +C *91 ,9 r $1 $8 C $4 $4 $0 $0 $2 $4 D9 s2X -o9>^p +o9> ^p scU O51 r $2 $3 ^0 ^4 ^4 -i64ske] +i64 ske ] y4 s_4 O43 sq$ OB1 -o59i9p +o59 i9p stV O98 O5A -*A9s25+8 +*A9 s25 +8 o2h $1 $2 $3 $! c $6 $0 $0 -,4TB[ +,4 TB [ *93 [ *23 O81 i59 i55 @@ -6838,73 +6801,73 @@ oBv oB3 +5 -1 ^E O05 -sH=K +sH= K ^9 ^6 ^9 ^1 -*B6D2$e +*B6 D2 $e ^1 ^7 ^9 ^1 -sIm.8 +sIm .8 K f +8 -7 -7 ^h O24 C $6 $6 -$voA7 +$v oA7 +4 +5 +6 ] ] c ] ] c '6 $4 -Y1sSw*9B +Y1 sSw *9B c $0 $0 $5 -*65o72 +*65 o72 s20 -]C +] C y2 l $6 $7 $8 *73 -1 o7k ^r O25 -$ps]#E -$w*75 +$p s]# E +$w *75 i38 i38 i57 i52 --6+9 +-6 +9 i7e i7d -*89iB}o1e +*89 iB} o1e o0v ^h ^6 ^6 ^0 $2 $b O8A i8A -*67E +*67 E *02 ,1 $s $i $s ^4 ^2 ^0 $1 OB2 -p5r +p5 r z2 O3B --1-7 -+4-8 +-1 -7 ++4 -8 O74 o74 p1 l O76 ^4 ^9 ^6 -$1shS*4B +$1 shS *4B T6 O9B soF O95 O74 O1B $1 L6 { o0Q Z2 O58 --8i61 -T9*36 +-8 i61 +T9 *36 ^6 ^2 ^1 D2 k -*17z2 -*10c*93 +*17 z2 +*10 c *93 $- $1 ^X $X i3n -8 o0a OA3 -sz=T9 -$?*BAoA5 -oBj[ +sz= T9 +$? *BA oA5 +oBj [ i7P s}n O69 -sa1Z2 +sa1 Z2 $M $n $f O29 ^8 ^7 ^9 ^1 @@ -6916,11 +6879,11 @@ $d $i $n o6M $h $i $m $m $o $b -R0*67.2 +R0 *67 .2 L5 $l $a $y iB9 -s`*iA0 +s`* iA0 ^7 ^0 ^1 Y3 ] l i7& @@ -6937,23 +6900,23 @@ sYi O91 $o $w $l s56 c $0 $1 $0 -$1$9$6$7 +$1 $9 $6 $7 ^9 ^2 ^1 s7? -skG[ -+6sMu-2 -*68s|T*78 +skG [ ++6 sMu -2 +*68 s|T *78 $e $t $a -i9Mo3b +i9M o3b c $8 $0 $8 -,5sEs8' +T9 s>E s8' ^0 ^7 ^7 $g $o $o ^3 ^4 ^1 OA8 $* '8 $3 -T6*B9sk& +T6 *B9 sk& c '6 $6 c 'A $2 $1 $7 $7 d '8 $1 i40 i50 i67 -$1$9$6$5 -LA^MK +$1 $9 $6 $5 +LA ^M K ^0 ^2 ^5 Y4 OB1 -$($) +$( $) ^0 ^0 ^5 -E*32 +E *32 '8 $7 O4B -z1*A2o8= +z1 *A2 o8= $j $a $y u 'A ss5 si1 so0 sa@ i4@ -'B,9 -*24.BY1 +'B ,9 +*24 .B Y1 $2 OA2 $m $e $t -+5*5B ++5 *5B i1b i1e ^2 ^5 ^0 O4B T1 ] l $6 -y4u +y4 u $2 $5 $5 o02 p3 D0 o0k -i9,Y4 +i9, Y4 ^0 ^5 ^9 ^1 l $7 $7 O8B O08 -*92T7 +*92 T7 O15 .6 d ,4 O96 Y1 -*29K +*29 K s49 O69 sJf $p $a $r $a $0 --By2K +-B y2 K C $8 ^E i1l c ^8 ^0 @@ -7050,53 +7013,53 @@ c ^8 ^0 s45 '8 $2 Y5 O47 +2 -*80T2*5B -*68oA' +*80 T2 *5B +*68 oA' c '6 $0 [ K o2r [ +B -D $3 $5 $7 *50 y3 -]-8 -^ysVn +] -8 +^y sVn s'{ O8A *32 ^f } $2 $4 $4 o1s $3 $6 $6 -*03iA5D2 +*03 iA5 D2 D1 o1- { [ [ } *1B O42 K s#\ *71 O34 -'9p1 +'9 p1 E O16 ^a ] $1 $1 $3 r $8 $8 c $2 $0 $1 $5 -s^U$6 -o0ns $o7X +s^U $6 +o0n s $ o7X o6g O05 o9q -*40$6 +*40 $6 o27 c ^9 ^0 smG OB1 c -,7stG+8 +,7 stG +8 d 'I o4w ] O27 r O07 O16 -i01sP\ +i01 sP\ iBs O83 s@7 i35 i35 OA7 *73 *31 *20 O23 $r -l [ ^M +c o0M l O64 T4 ^1 ^2 ^0 o5z @@ -7108,22 +7071,22 @@ O42 Z1 $1 $2 $1 ^9 ^0 ^1 $4 $8 $8 -sHWseos25 +sHW seo s25 $f $b OA9 s0/ se@ -c$1$2$3$$ +c $1 $2 $3 $$ y4 O32 c s8' O12 s1U -D5c +D5 c +7 *49 i5s O78 -Z3*58'8 -s^$l +Z3 *58 '8 +s^$ l $1 $5 $0 i0i i2m i1a -i5"sU4o5_ -,9scU +i5" sU4 o5_ +,9 scU O87 OA2 sr( O32 $n $o $t @@ -7131,32 +7094,31 @@ OA6 ^p i56 i51 '6 $4 ^5 ^2 ^0 -KR5i9C +K R5 i9C $4 $9 $9 i6c D7 D7 -siDK +siD K $# $1 -sK$y4 +sK$ y4 *14 r -i8L$ks9z -]*28+5 +i8L $k s9z +] *28 +5 i3a i7a syi $T l o3h -o0E l -1 y1 R1 O3B i0J i1a i2n -iBN*78i72 +iBN *78 i72 oB5 i1y -*5B$3 +*5B $3 s18 sA. O83 O25 OB3 -*78T4s}E +*78 T4 s}E O34 s*x t } $U '8 $9 @@ -7166,22 +7128,22 @@ O98 y5 O28 c ^3 ^9 ^d ^f DB $6 -sXe*31 +sXe *31 -E -F ^2 ^9 ^9 -$7+B -*9A,3*0A +$7 +B +*9A ,3 *0A ^7 ^2 ^7 o5B .5 *16 OB5 -D4sk/i71 +D4 sk/ i71 $5 $9 $9 $9 $2 $2 } .7 $0 $5 $5 c $1 $0 $2 $0 i4m -,4D3 +,4 D3 ^4 ^1 ^1 ^1 o0@ $7 $2 $2 @@ -7189,15 +7151,15 @@ $7 $2 $2 ^7 ^9 ^9 i5h l i85 OA1 -s]6Y1 -z1EiAo +s]6 Y1 +z1 E iAo o3_ O23 D2 o1o -$/$/ +$/ $/ ^a ^x ^7 ^9 ^1 l ] $a -D1*20 +D1 *20 O03 sc> sco $i $d $s @@ -7219,22 +7181,22 @@ i6o i7n $4 $2 $2 o0r i0p c $a $1 -$Ol +$O l o3G -,3siz +,3 siz $d $o $s O02 ^j i4y O52 sv- s"x O42 $t $a $b -$1$9$6$4 -*A3^cE +$1 $9 $6 $4 +*A3 ^c E ^4 ^c -*9A+1 +*9A +1 ^8 ^6 ^9 ^1 OB3 s04 +3 -sr2*86 -iB0sbs +sr2 *86 +iB0 sbs OA3 +6 i59 i50 C $1 $5 @@ -7247,14 +7209,14 @@ $3 $5 $5 $f $1 *05 O03 d '3 p1 c ^6 ^0 -sb[Y4 +sb[ Y4 *19 T6 O41 $5 $4 $4 ^a ^B O98 p2 sbT -D2Y1 -*36LB^x -y3D6-B +D2 Y1 +*36 LB ^x +y3 D6 -B s+< s"p O92 $1 $8 $7 $r $i $p @@ -7264,7 +7226,7 @@ iAe ^1 ^1 ^0 *03 O42 *B5 i7i i8t -sVo$" +sVo $" i57 i51 $1 $8 $2 c $3 $1 $3 @@ -7272,35 +7234,35 @@ i6; O02 'A i3c i3a iAS -.7s#S -+8s>@ +.7 s#S ++8 s>@ o4g -C*4B*B8 +C *4B *B8 O9B i52 i50 -+4*90 ++4 *90 i39 i31 O83 O65 *B3 -i6Eso+ -*69s&5} +i6E so+ +*69 s&5 } t O85 i2k i97 iA7 iB7 -D3Z1 +D3 Z1 i2- u o6, -7 '8 i7x o2H c O52 O13 -E.Bp5 -D4L9 +E .B p5 +D4 L9 i4a i5n i6d o6i OB6 i51 r O24 O97 +5 OB4 smk -s}'iA8 +s}' iA8 ^3 ^5 ^9 ^1 ^7 ^2 ^0 c $0 $0 $3 @@ -7316,7 +7278,7 @@ O58 ^h $9 $0 $9 c $2 $0 $1 $3 sAe O47 R0 -*67$9 +*67 $9 $r $i $g $o $d $e i1A @@ -7324,48 +7286,47 @@ i2W d O0A l y3 ^6 ^3 ^1 ^3 ^9 ^0 -*23sf+s[m -o4Kc*0A +*23 sf+ s[m +o4K c *0A D8 'A -rsz; -$1$9$6$3 -T1s)M +r sz; +$1 $9 $6 $3 +T1 s)M c $0 $1 $1 i3b i3a -i9vY2 +i9v Y2 c ^3 ^0 $c $a $d i82 -K$4 +K $4 $5 $2 $1 -z2}*A5 +z2 } *A5 l ] $k ^3 ^5 ^0 O21 *5A u oB? c $9 $0 $9 ^9 ^2 ^2 -Y1oAeE +Y1 oAe E c $1 $4 $3 *4A *81 O32 *03 O34 *04 O25 -o0W -s%@k,1 +s%@ k ,1 i51 i69 i79 i82 -]*43*40 +] *43 *40 ^9 ^5 ^9 ^1 $k $c ^g O09 i7a i7d '6 $9 O63 O87 --2+8 +-2 +8 o0( -ff'A -l*03 -p1sZf -*51$. +f f 'A +l *03 +p1 sZf +*51 $. ^6 ^6 ^9 ^1 ^0 ^7 ^9 ^1 ^5 ^0 ^5 @@ -7374,11 +7335,11 @@ E OB9 +A ^a ^F o1g i8m -s)\s9bp1 +s)\ s9b p1 +4 O49 *82 c '6 $2 ^- s-m -$1 O71 +D7 $1 c $1 $6 $1 $6 RB O58 ^0 ^8 ^1 @@ -7389,33 +7350,33 @@ D6 t L4 '8 $4 $0 $2 $2 -i8W*B6-2 -sdk*74+5 +i8W *B6 -2 +sdk *74 +5 s-[ E O84 -s1qY1} +s1q Y1 } -0 $? T1 { $i $t $e -s4g*2BC +s4g *2B C i0J y4 i54 i54 C $0 -*1B^t +*1B ^t i58 i51 s14 i4+ si4 -}EsLP +} E sLP O43 o5l -s$cY2sSc -+0-9 +s$c Y2 sSc ++0 -9 $b $u $d '8 $0 .2 sBK O48 o1? $6 $5 $5 c $3 $6 $9 -*34$0 +*34 $0 i6D c $1 $9 $5 $1 $5 $8 $8 @@ -7423,31 +7384,31 @@ i56 i59 $s $p $y ^0 ^4 ^1 c $2 $1 $2 -o3f$o +o3f $o c ^4 ^9 sSX sM! O65 -sdgo7a +sdg o7a *03 O12 i58 i58 K z1 oA0 O58 O71 -Z2'B +Z2 'B $w $i $z -*32sJ. -*72o0e +*32 sJ. +*72 o0e d '7 $1 i9u o1R $5 $2 $2 O8A O03 -*72$0 +*72 $0 $a $s $k i3H l OA1 OBA -RBi6o -i3Ll +RB i6o +i3L l O1B OB4 *23 -sE/supT3 +sE/ sup T3 $6 $3 $3 ^^ u O97 sau @@ -7457,87 +7418,87 @@ O28 T2 *58 ^8 ^1 ^0 i5d i5e ^6 ^5 ^5 -s}t*91$2 -+7-A -o3rsQ) +s}t *91 $2 ++7 -A +o3r sQ) o0u -+1+9 --4iAlsF} ++1 +9 +-4 iAl sF} c ^9 ^8 ^3 ^6 ^9 ^1 i8u i34 i31 O87 o3a O13 c ^4 ^3 ^2 ^1 -o9pstE +o9p stE } ssO o0A T8 O19 -]]]]]]] +] ] ] ] ] ] ] $6 $2 $2 --Ai61 -s*Nl +-A i61 +s*N l i93 -rt -[s[RK +r t +[ s[R K *20 l OA4 o91 -k{ -]]c +k { +] ] c OAB *02 $b $u $m O96 D1 -s39.7 -*B4K +s39 .7 +*B4 K Y1 O8A ,8 -s38s}6 -$6*3A +s38 s}6 +$6 *3A K D7 -,3su) +,3 su) o4Y $2 $1 $2 ^6 ^5 ^1 OAB O23 y3 i4p -R6*17 +R6 *17 $5 OB1 OB1 [ [ [ $1 u d '9 $3 O12 TB $8 $5 $2 -*49+5oA? +*49 +5 oA? O9B *9A $d $3 ^e ^w ^0 ^6 ^9 ^1 o9r i6~ -^x$xl +^x $x l E K O45 -+7+A ++7 +A $f $a $t oAu i35 i32 *54 O84 ^0 ^2 ^0 c T6 T2 T4 -E*B7*34 +E *B7 *34 O08 Z4 c $1 $9 $4 $5 -$m*24 -]^u -*68Y4oBb -*83Z1.5 -sC_*21sY! +$m *24 +] ^u +*68 Y4 oBb +*83 Z1 .5 +sC_ *21 sY! $b $u $r -sjO*32 +sjO *32 o42 O72 Z1 O14 p1 c -iB3$w +iB3 $w 'A $7 -s`Uo2i -o4lD6 -*9A*65*34 +s`U o2i +o4l D6 +*9A *65 *34 $E $d $r $i $m $l $i $e @@ -7546,42 +7507,42 @@ smV c $8 $0 $0 $c $o $o O38 Y5 t -,2i9E +,2 i9E *05 O03 d u $_ o7? O45 -+2sAW ++2 sAW u 'B $1 D1 ^s -0 -1 -1 o8a s47 -*21oB_ +*21 oB_ $d $6 $r $e $v i8s O82 $t $i $e C $9 $6 *A3 sc3 O43 -o2o*B7 +o2o *B7 ^7 ^4 ^1 i54 i53 -*B8o7! +*B8 o7! c $e $1 i51 i53 --4+8 +-4 +8 c ^5 ^9 t K O6A ^1 ^5 ^5 $H l y5 O47 { y2 -tK +t K o4? $0 $7 $7 O02 ^w ^0 ^5 ^1 -o9i*32 +o9i *32 s57 O56 sZI o53 +1 [ @@ -7592,72 +7553,69 @@ $e $g $o u d '8 $3 -9 -A -A Y5 O63 *98 -*A5*72 +*A5 *72 ^9 ^4 ^9 ^1 O63 { +0 O73 D6 -6 O89 soh ^2 ^5 ^5 -[[[[[[[ O9A s9^ Y2 -s/z-5 +s/z -5 OB1 OB6 *B3 i41 i59 i69 i75 -T8^f +T8 ^f $0 $0 $6 o2O -s_++8sD@ +s_+ +8 sD@ $r $o $b -KD7{ +K D7 { o6s ^6 ^4 ^9 ^1 -.2*B6 +.2 *B6 ^0 ^4 ^9 ^1 ] $t 'B $e ] $i $n $g O35 u i8t -o11D7sDW +o11 D7 sDW y1 O04 *2B -.6*B6*16 -[ ^L l +.6 *B6 *16 r $0 $2 ^3 ^4 ^9 ^1 --9i9n +-9 i9n ^5 ^4 ^9 ^1 ^7 ^2 ^2 ^6 ^5 ^9 ^1 -lsaC +l saC c $3 $4 $5 -*B8$6 -s+dsSZ$5 +*B8 $6 +s+d sSZ $5 O86 *6B O32 $m $o $d ^4 ^4 ^9 ^1 d O9A ^6 ^5 ^4 ^1 ^4 ^0 -]]]]]]]] -u*3B$V +] ] ] ] ] ] ] ] +u *3B $V c $6 $2 $6 -] ^a $u $h q ] $6 o6# O14 ^m $v O73 O93 -+5$y ++5 $y ^b ^2 i26 p4 o5I i34 i32 $d $9 ^8 ^2 ^1 -Z1sN6 +Z1 sN6 y2 O14 --0+9 -+5s7N +-0 +9 ++5 s7N i51 i69 i78 i89 OB2 O19 p2 $9 $4 $4 @@ -7665,41 +7623,41 @@ OA8 ^3 O87 c $4 $m $e ] O34 sp* Y3 OB2 -*B1*47 +*B1 *47 O32 o2. OB6 i1R l D1 -1 *A0 $8 $7 $7 -s[0+6 +s[0 +6 s10 i1f i1a ^a ^n -*36Y3 +*36 Y3 *7A $7 $5 $3 ^2 ^5 ^9 ^1 i50 i59 -s%O+B -swDZ2 +s%O +B +swD Z2 +0 D2 i7i ^9 ^0 ^8 -i6H*80u +i6H *80 u ^2 ^b o8w o9r OA4 OA7 O32 ^t --2*23 +-2 *23 c $- $1 -sC!DA -$Ys_;*49 +sC! DA +$Y s_; *49 o2P $0 $8 $8 *01 O58 Z1 R3 *76 O52 -c^0^2^4 +c ^0 ^2 ^4 C $0 $9 ^t ^s ^3 ^0 ^0 @@ -7710,21 +7668,21 @@ i7p s0b O83 seu $8 $6 $6 $p $a $s -Y5E +Y5 E ^2 ^0 ^5 -R5iA{-5 +R5 iA{ -5 T4 siU O5A i3a i3b -o9@k +o9@ k ^2 ^4 ^9 ^1 o4D -i99y2 +i99 y2 $0 $1 $3 -s\J$h --1+7 -DBs6& +s\J $h +-1 +7 +DB s6& ^7 ^3 ^1 -s n$Hi9O +s n $H i9O +0 +2 +1 +3 +6 -7 -7 ^8 ^2 ^2 @@ -7735,36 +7693,36 @@ $2 $7 $7 i8o ^N l iB7 -y4'8sB3 +y4 '8 sB3 $0 $9 $5 ^3 ^5 ^5 $2 $1 $4 y4 O48 k -c.2 +c .2 *21 O2B ^t O14 -Y1y1 +Y1 y1 $b $a $d ^7 ^5 ^9 ^1 $1 D3 -sFI$I +sFI $I O57 *7B +1 oB4 -*7ACs;y +*7A C s;y i7\ -TAo3t -o6VT1 +TA o3t +o6V T1 i4j -6 -9 i51 i69 i79 i83 } Z5 O25 *79 O8B *84 T2 -'9 O37 s,7 -o8;o0T +'9 s,7 +o8; o0T s17 O61 c ^5 ^4 -D4*85E +D4 *85 E c R1 E OA9 sU_ i4j O23 c @@ -7777,10 +7735,10 @@ c 'C $1 D3 o0T i55 i59 l $! -sK+^* +sK+ ^* OA4 sf, .2 $_ $9 $6 -K-6 +K -6 saS *75 *90 O85 ^[ @@ -7789,45 +7747,44 @@ i3d i3e $_ O2B i51 i69 i79 i80 syj -sh@D9 +sh@ D9 $1 $2 $4 -l [ ^B +o0b c ^4 ^6 ^9 ^1 ^2 ^6 ^0 ] } -soAl +soA l OB3 o6a -*91$@D7 -ElLB +*91 $@ D7 +l LB ^7 ^4 ^9 ^1 sPB $3 $1 $6 { L1 -+4svE -*0Ay2 ++4 svE +*0A y2 ^o ^s ^5 ^9 ^0 y5 O73 E -o2Bc +o2B c Y1 O35 ^9 ^0 ^0 -sYdz1o59 +sYd z1 o59 O35 *71 *26 *32 O6B -o4loBU +o4l oBU O36 *9A d ^p O12 o5m -y5 E O73 i52 i53 D2 D3 $f $i $n r $7 $7 C $2 $5 --Ak +-A k { O47 DA D5 -*7A,9+0 +*7A ,9 +0 i8n O91 O87 $" $s $h $e @@ -7835,13 +7792,13 @@ p4 $u OB3 *43 $j $a $r ^3 ^c -,3sxz +,3 sxz ^6 ^5 ^0 +0 +A $e O02 o5A l $d $8 -D4*12 +D4 *12 ^1 ^1 ^4 i3a i3c l $. $c $o $m @@ -7855,10 +7812,10 @@ O54 -5 OA6 *13 s89 $1 $3 $2 -s4t*30*6B +s4t *30 *6B O84 l *09 o3? -i6 oBEs?, +i6 oBE s?, $8 $2 $2 *82 $| @@ -7866,57 +7823,57 @@ $| l ^e ^e ^r ^f O64 sis ^K i1e -*61$isen +*61 $i sen OA7 i64 *93 i30 i32 -D0EZ2 -s]>*73 +D0 E Z2 +s]> *73 C $9 $8 -o6_s!-ss" +o6_ s!- ss" O94 +B $c $o $p O9A Z5 O58 -+1-8 -sJ"^J ++1 -8 +sJ" ^J o0s O31 $M ^m ^5 ^6 ^9 ^1 -*82-7oBp -Z1i3c +*82 -7 oBp +Z1 i3c $e p2 c ^4 ^0 -y1s%rc --2*34y4 -*49$A +y1 s%r c +-2 *34 y4 +*49 $A i5R D1 O27 -Y1*7Bs[b -Ks " +Y1 *7B s[b +K s " O02 sGh T1 O56 *A1 $3 $4 $4 -s2x*47$j -*42,A +s2x *47 $j +*42 ,A c $5 $6 $7 ^P O12 '6 $8 d '9 $1 -*54s;coAz -o0pZ1 -*71^m^b -soP^Y +*54 s;c oAz +o0p Z1 +*71 ^m ^b +soP ^Y $7 $3 $3 *78 O62 l $1 $9 ^8 ^1 ^5 --Ac*B7 +-A c *B7 OA5 $2 sD3 o4i O31 o2W o1h +0 i6m s34 -.4c -+7*84 +.4 c ++7 *84 c $1 $9 $5 $8 ,3 +3 i8E @@ -7930,14 +7887,14 @@ o0H l *B0 O83 oAS O57 O31 O05 -D2*8A$- +D2 *8A $- O04 s&h -A -C $8 $4 $4 +5 +6 +7 s35 O52 -4 --4-8 +-4 -8 spF $r $u $m ^1 ^3 ^3 @@ -7948,7 +7905,7 @@ Y5 f OA1 i5& ^4 ^5 ^1 t D9 +0 -D8*12 +D8 *12 ^1 ^6 ^9 ^1 +1 +2 +3 i6& @@ -7961,9 +7918,9 @@ $r $e $p O16 k O62 iA{ ^ ^1 -*30,7*5B --3+8 --2*92 +*30 ,7 *5B +-3 +8 +-2 *92 OA3 oB_ $p $o $l i53 i59 @@ -7973,17 +7930,17 @@ O52 O19 o7b c ^1 ^9 ^8 ^0 ^5 o8) +4 O7A -R4D2 +R4 D2 o1j $1 $2 $6 +2 *02 $1 $0 $2 ^4 ^1 ^5 $9 l -y1l+0 +y1 l +0 $1 $0 $5 O02 D5 -DB] +DB ] i4h *45 i7' $9 $7 $7 @@ -7993,38 +7950,38 @@ c $1 $1 $! $! u d '9 $6 ^1 ^4 ^9 ^1 D7 OA9 -sj;*56 +sj; *56 $r $a $n $k -+7s$k*0A ++7 s$k *0A ^6 ^1 ^9 ^6 ^8 ^9 c $2 $0 $1 $4 -s/xiB! +s/x iB! ^3 ^0 ^5 u $a --3s+W --2D3 +-3 s+W +-2 D3 i6d i57 i50 -*2AY2 -s7Mo5ssx9 +*2A Y2 +s7M o5s sx9 [ O37 y4 $r d -kswn +k swn p3 ] -s)o^5oB3 +s)o ^5 oB3 ^8 ^6 ^0 $s D7 c $2 $2 $0 +7 +9 +9 -o5asEJsMU +o5a sEJ sMU O58 Y4 sG= $d $4 +7 -6 -6 $8 $5 $5 -coAb -*12s\1'B -[*24 +c oAb +*12 s\1 'B +[ *24 o5r OB1 $3 $7 $7 OA8 i2l @@ -8046,16 +8003,16 @@ o01 i5L l ^5 ^5 ^9 ^1 $w $a $g -sKf*7B+6 -sCki0S -K*38E -sG6o83 -ud*61 -Z1TB -o64D7L9 +sKf *7B +6 +sCk i0S +K *38 E +sG6 o83 +u d *61 +Z1 TB +o64 D7 L9 $2 $9 $5 -C*0A*A2 -+1s'] +C *0A *A2 ++1 s'] OBA { y4 o2p OA1 s*B u 'B $9 @@ -8063,10 +8020,10 @@ o09 o0g O36 o4y O0B c '6 $1 -i3<.3 -sP-*12 +i3< .3 +sP- *12 i50 i53 -o0ToB\ +o0T oB\ i6f oAa svp O74 OA4 @@ -8076,7 +8033,7 @@ $_ $9 $5 i57 i59 i50 i70 $b $o $o $k -sz9i3w +sz9 i3w c $2 $5 $8 i6% O57 s5? @@ -8087,7 +8044,7 @@ $3 $1 $5 $7 $5 $5 *49 O95 i97 sep -+5+9 ++5 +9 $2 $A D4 D7 *74 O54 sSc @@ -8096,13 +8053,13 @@ $. OA1 O91 +0 *20 +2 $0 -B -o0WT6 +o0W T6 i8h } y2 $d } O51 $1 $4 $5 D0 c O31 -T5R8sz< +T5 R8 sz< ^u ^e siD O32 c $3 $5 $7 @@ -8116,14 +8073,14 @@ s)D O65 s2? o9z $t $r $y O76 .B sPT -*21sd] +*21 sd] $n $i $x $8 $0 $8 .1 k -o10o8$ +o10 o8$ { Z2 +3 -1 -1 -KoBq+0 +K oBq +0 i56 i55 ^2 ^3 ^0 $h [ @@ -8132,8 +8089,7 @@ o1p OB3 o1a O5A i51 i69 i79 i86 $1 $0 $8 -E '8 -]i3k +] i3k r $5 $5 O14 *61 i3a i1a @@ -8147,25 +8103,25 @@ O32 *38 i2x +6 -1 o4$ t -$7o9'skd +$7 o9' skd i4x $g $e $m -*B4E,7 +*B4 E ,7 O04 *A3 ,B ^9 ^5 ^1 o4S l -+5s{/ -*79s!8i64 ++5 s{/ +*79 s!8 i64 O23 o9< O5A k -,5o8C -D8.4 +,5 o8C +D8 .4 $d $o $g -c*92] +c *92 ] ^m O12 $7 $9 $9 ^D i1j -D5*76.5 +D5 *76 .5 c $0 $0 $6 ^8 ^3 ^0 O2B sy{ O35 @@ -8173,39 +8129,38 @@ sca c ^7 ^9 ^3 ^7 ^0 *AB O45 -Ko7K*29 +K o7K *29 ^2 ^2 ^0 o4p o6w O19 o1o u $9 $4 $4 -oA7sCq +oA7 sCq $f $o $r $m $s +6 +7 +7 +1 +3 +3 ^h ^P -*43*B2*0A +*43 *B2 *0A ^1 ^3 ^0 $5 $3 $3 +3 -5 -5 -o0p$xsfc +o0p $x sfc O74 O34 o9$ s{^ O09 i2o i8l -*28.2 +*28 .2 ^2 ^6 ^9 ^1 i5a i71 $J $b D3 +2 -*58s!O*5A -[^K +*58 s!O *5A s0z ^8 ^7 ^9 O03 Z2 $7 $9 $5 -s2ao1i +s2a o1i '8 -3 ^6 ^1 ^4 c $7 $4 $1 @@ -8216,81 +8171,81 @@ i38 i30 $5 $1 $0 O4B +A u d '8 $9 -sQP$s +sQP $s D1 O3A o0r O21 -7 -9 -9 ^9 ^5 ^5 O42 z3 o7p -sCyp1 -$tssu +sCy p1 +$t ssu ^$ -*31.9 +*31 .9 +8 +8 -9 TA O6B ^C o1a $9 $5 $5 oAy $7 [ -s^0o41 +s^0 o41 $4 $9 $5 *34 O12 OA2 s6. s&% -R8$l +R8 $l O94 i0j $z $i $p O54 $6 -*B7*19*32 +*B7 *19 *32 d O2A $9 $9 $8 -*3Ao1k +*3A o1k c ^4 ^3 i40 sbe O03 $7 ^0 ^7 ^1 -R5-A*01 +R5 -A *01 o6t O47 T8 o7E *60 O15 -sjK*70 +sjK *70 OA4 O1B $2 $5 $6 O3A ^x -*A9T7$3 +*A9 T7 $3 O76 O94 -${o8p +${ o8p ] $d O5A s59 i56 i56 -oAYR7 +oAY R7 c 'C $5 y5 O5A i1c i1e $2 $5 $0 -s3^,6 -+7*A9 -r} -^ri9y +s3^ ,6 ++7 *A9 +r } +^r i9y O98 q i3. *32 O54 *9B OAB -l [ ^R +o0r c c $7 $1 $1 ss! o4b $e $e $l O57 $* LB c $6 $7 $8 -i7vr +i7v r +8 -7 +8 -ls6k+9 +l s6k +9 c $5 $0 $5 r $6 $6 K +5 *23 -0 O41 -Y3TB -o7c$8 +Y3 TB +o7c $8 D5 ] O14 O32 s`v i0o ^N @@ -8298,24 +8253,24 @@ iB. i51 i71 O97 i92 i31 i71 -iBKsK[o0p +iBK sK[ o0p c $6 $5 $4 ^8 ^3 ^1 O53 s2> -T6p4 +T6 p4 OA7 $5 .9 o6r ^6 ^3 ^2 ^( $) -se|].6 -T3*1A -,5E +se| ] .6 +T3 *1A +,5 E $a $h $a -s$O*26i7t -Y1+5 -o0GT5l +s$O *26 i7t +Y1 +5 +o0G l *65 O42 -s?Di3o +s?D i3o iD- i56 i50 $w $i $t @@ -8338,7 +8293,7 @@ Z1 *74 $c $b O63 Z1 c $9 $9 $0 --0}iBN +-0 } iBN *84 k i56 i52 ^2 ^2 ^2 @@ -8350,12 +8305,12 @@ i5i u ^3 ^a +9 +9 -8 d '8 $8 -.3y4'8 -$1$9$6$0 -o5LT3 -$+$- +.3 y4 '8 +$1 $9 $6 $0 +o5L T3 +$+ $- $3 $0 $3 -sIqTA'9 +sIq '9 $j $u $n $k ^7 ^7 ^0 u d 'A @@ -8363,14 +8318,14 @@ oB9 *45 O38 c o7I sau -p5o5e +p5 o5e i47 u 'C $4 i38 i39 c $2 $4 $7 -sg5kr -*8B] -.1spmi8& +sg5 k r +*8B ] +.1 spm i8& i1a i5a O82 skJ i58 i50 @@ -8383,41 +8338,40 @@ iA@ O23 oA( -5 -9 ^1 ^3 ^1 -l [ ^S +c o0S $9 $9 $7 -+3sE3 ++3 sE3 $h $u $g l $2 $3 ^4 ^5 ^5 *03 *34 O12 o07 i4a O52 -EiB7 +E iB7 c sa4 ,4 O6B sb2 $r $o $t $1 $9 $0 -c*68K -o0G +c *68 K c '6 $8 -s'?T7 +s'? T7 c $9 $9 $7 $1 $1 $9 -oBko3i -s"S+6K +oBk o3i +s"S +6 K i7d i7a ^c ^B -*A0*45{ +*A0 *45 { i5c i5a -sXV$4 -s3SR0 +sXV $4 +s3S R0 { R3 -l [ ^K +o0k c i58 i57 i8m i9e -se0T2s+T +se0 T2 s+T o5w -*89sN- +*89 sN- C $2 $4 $u $r $n c 'A $7 @@ -8426,9 +8380,9 @@ O54 O53 t o3p ^4 ^1 ^2 C $9 $7 -l+9 +l +9 D1 D4 -sk)*B8-2 +sk) *B8 -2 l [ ^A $r $i $d O98 i63 @@ -8436,49 +8390,49 @@ Y1 O12 y2 $4 $3 $3 ^7 ^0 ^5 ^0 ^3 ^2 -i5wp2 +i5w p2 $1 $0 $4 i37 i32 i9_ O74 ^7 ^6 ^0 s2. --6.2 +-6 .2 c ^0 ^5 -*56 D2 O41 +D2 D5 k *94 f s0! -sq+o2bsD& +sq+ o2b sD& C +7 O02 ^7 ^9 ^0 *9A OB2 $1 $3 $0 $5 $4 $3 $2 $1 --2-8 +-2 -8 iA? ^4 ^0 ^0 i3y -*46$R*A0 +*46 $R *A0 i54 i59 i52 i55 ^9 ^0 ^5 T8 $1 i7a i7c $1 +B -i3Ics.r +i3I c s.r OB6 sPN DB -*B2^h +*B2 ^h ] OB1 y1 $0 $2 $0 *67 O16 { ^r -o6_D5 +o6_ D5 $A ^a -+Bs9B ++B s9B [ o1y c ^1 ^9 ^9 ^1 $8 $0 $0 $0 i59 i58 -s[,o0h +s[, o0h O41 *36 $9 $3 $3 ^6 ^0 ^5 @@ -8486,8 +8440,8 @@ O42 { -1 -3 -3 ^a O12 O32 +2 -s%|*20D0 -]}.8 +s%| *20 D0 +] } .8 oA. c $2 $2 $5 sDL @@ -8499,7 +8453,7 @@ u 'C $2 O02 D3 o4v o1B -$-$_ +$- $_ O89 $0 o5* i36 i32 @@ -8514,22 +8468,22 @@ i1e i3e O71 s9U ^9 ^6 ^3 O13 i9A -o5r*94 +o5r *94 o7@ *B7 O58 ^3 ^5 ^1 ^4 ^9 ^0 -l*41 -.6K[ -s#u*97 -o80sy3 -^H*0B -shZ+1 +l *41 +.6 K [ +s#u *97 +o80 sy3 +^H *0B +shZ +1 -2 O32 -]y5 +] y5 'A $9 i51 i69 i79 i81 C $1 $8 -y1u +y1 u OB5 oAq Y3 $3 $3 $7 $l $a $p @@ -8552,15 +8506,14 @@ c $1 $9 $5 $7 oA8 c $1 $9 $5 $6 $l $i $t -s4sT0o68 +s4s T0 o68 ^0 ^5 ^5 c $1 $1 $8 -[ ^R ^3 ^0 ^2 o1L D4 o2g -sHoy5 --3-8 +sHo y5 +-3 -8 $b $o $w o5# i4E l @@ -8575,17 +8528,17 @@ sIY O42 i2s O02 O6B *16 o7I $l $a $g -s/4*43 +s/4 *43 ^0 ^5 ^2 ^5 ^4 ^1 -*70+1 +*70 +1 O04 *20 -*59*02o0R +*59 *02 o0R K *7A DA $0 $1 $4 i3e i3c $2 $0 $2 --9Z1 +-9 Z1 ^4 ^3 ^3 s23 O4B k @@ -8594,7 +8547,7 @@ O63 O14 iBi O03 *89 ^3 ^b -$ssXu +$s sXu iA2 l { o5& ^0 ^6 ^6 @@ -8603,12 +8556,11 @@ o3O l ^4 ^0 ^6 c ^2 ^3 o9i -D6E -$,$, +$, $, $o $d $d $u [ -*45T4L9 -*B7-1 +*45 T4 L9 +*B7 -1 i41 O24 TB O3B O2A *43 $0 $6 $6 @@ -8616,7 +8568,7 @@ l $0 $1 O81 O06 ^3 ^e *54 O75 O0B -^2i9F*36 +^2 i9F *36 ^2 ^d '8 $6 } C ^A @@ -8636,18 +8588,18 @@ o3S l $` u ^5 ^0 ^3 i5e i71 -*30o6, +*30 o6, i3+ -]Y2sRE +] Y2 sRE ^3 ^3 ^1 -+3+9 ++3 +9 ^9 ^0 ^2 -o0x*86 +o0x *86 u 'C $8 [ t D0 O6B [ -o1noAV -*75o72 +o1n oAV +*75 o72 u $5 $4 $5 $7 $6 $6 +C +C +C @@ -8677,41 +8629,41 @@ $0 $9 $0 D7 D8 O82 'A c ^' -o05sv} --1+8 +o05 sv} +-1 +8 c 'A $0 Y3 O5B slt 'Q -*6A+2 +*6A +2 i60 OA1 $a $n $y $0 $1 $9 [ Z4 i5e i5c -*83s%0K +*83 s%0 K k E T1 ] ^4 ^e +0 O12 K Y4 O83 --3*91 +-3 *91 u 'C $0 ^2 ^1 ^3 $2 $2 $3 $5 $1 $5 -sx,sszo9M +sx, ssz o9M i48 $m $u $m ^8 ^2 ^3 $o $a $k -.3*3B +.3 *3B +2 -1 -1 OAB O07 $. l -*60ssz$R +*60 ssz $R $d $0 -o6SsLR +o6S sLR c $1 $9 $4 $9 +1 -3 -3 O13 Z3 @@ -8719,14 +8671,14 @@ O13 Z3 } p2 scs O31 o0t --Ao2b +-A o2b O7A c O34 y5 O08 -$1$9$6$2 +$1 $9 $6 $2 +7 Z2 ^i ^s i82 i90 iA1 iB2 -Eo6ismo +E o6i smo o6I i4L $c $o $x @@ -8734,12 +8686,12 @@ $c $o $x o0Q i9n $v $s -*84-4.9 -*59i4dsYz -OA1 ] +*84 -4 .9 +*59 i4d sYz +] DA i6S -s5cY1y1 -.2sJN +s5c Y1 y1 +.2 sJN $1 $. o2K i3& @@ -8754,31 +8706,31 @@ i36 i36 $. p1 c $9 $6 $3 i1_ -*85-4 +*85 -4 O26 *6B sO' O61 sj\ O63 -sp-p2sTe +sp- p2 sTe o0e ^K l o5O -.5^u +.5 ^u $0 $8 $0 D2 O46 [ o0l -+6o0l} -]{r ++6 o0l } +] { r O42 O83 i32 i30 -*92sz}i7e +*92 sz} i7e $2 $0 $4 O8A $q -sxts"p +sxt s"p O71 C +3 -9 -*43*A9 +*43 *A9 ^4 ^0 ^5 +8 +9 +8 ^0 ^1 ^9 -$2i70 +$2 i70 O31 *95 *76 ^8 ^0 ^8 O95 i9y O95 @@ -8794,8 +8746,8 @@ c $6 $9 $6 [ o0d i6u O97 i4a O31 -o92slGsdO -Es\m +o92 slG sdO +E s\m c $@ $2 $2 $0 $9 $1 $a @@ -8803,32 +8755,32 @@ $1 $a i58 i52 i51 i70 ^9 ^9 ^0 -T9*97 +T9 *97 i38 i32 -s)S*A1C +s)S *A1 C ] *86 $6 $9 $5 ^5 ^1 ^0 u Z4 O48 -sok$p +sok $p ^1 ^0 ^2 $h $a $s $u $g $h +B $3 c ^8 ^9 ^9 ^1 -*78sYQ +*78 sYQ O68 $r i8U -sG)iA7 -i61Y1E -CT9 -R0-9 +sG) iA7 +i61 Y1 E +C T9 +R0 -9 O36 *93 i42 -s28*23 -*15*05*5A +s28 *23 +*15 *05 *5A sh2 $d $5 ^3 ^6 ^1 -y4oB= +y4 oB= $2 $4 $6 $2 $3 $0 $e $l @@ -8844,7 +8796,7 @@ o4x $1 $5 $6 d '3 $b $u $t -l [ ^J +o0j c o5o *4A O8B O63 Y5 i9o @@ -8860,17 +8812,17 @@ $t $u $n ^0 ^1 ^3 i36 i31 y1 +0 -o4y*2B-7 +o4y *2B -7 ^s ^L o1Y o8# -s<|+6 -sx[D9 +s<| +6 +sx[ D9 i8I l O2A K [ o3A -^x^X^x$x$X$xl -usRPT5 +^x ^X ^x $x $X $x l +u sRP T5 $m sms *87 O9B $4 i1a i3e @@ -8882,22 +8834,22 @@ $3 $0 $5 ^5 ^7 ^1 c ^5 ^0 c $2 $0 $2 -$@R7 +$@ R7 $3 $2 $0 s#| O82 l o8y -s_XZ1 +s_X Z1 $0 $3 $1 ^4 ^7 ^9 -^DsEU -*0B-5 -Y3sv$'7 +^D sEU +*0B -5 +Y3 sv$ '7 ] $z i5e i5b c $4 $1 $1 o5G oA< 'B O14 -s"2*35 +s"2 *35 +0 +1 +1 OBA *46 y4 '8 $5 @@ -8912,9 +8864,9 @@ $7 $6 $5 i0M O3A ^8 ^5 ^2 O08 OB2 -R0*A7 +R0 *A7 $/ t -s-vi3i +s-v i3i $2 $1 $7 O23 Z2 O65 O61 @@ -8922,34 +8874,34 @@ t ^B o3H K o7U O01 o8D -$1$9$6$1 -,2sNC*4A -oAy[ +$1 $9 $6 $1 +,2 sNC *4A +oAy [ s30 O15 u *12 O31 $d $i $g o8E o1m --0-9 +-0 -9 iB3 -D4*17 -scl,9 +D4 *17 +scl ,9 iAi +9 OB7 sL1 $2 $0 $3 $4 $e O21 r +3 -c-9scD +c -9 scD c i51 sb% O28 $i $l $k $3 $2 $3 $7 $4 $4 -*2Bo4h+7 +*2B o4h +7 l $1 $3 -i4m[ +i4m [ ^8 ^8 ^0 OA2 $_ O25 $d $i $s @@ -8964,29 +8916,29 @@ sbx c o11 oBJ D5 O45 R0 ] -$#$$ +$# $$ o2M c $1 $5 $0 ^8 ^7 ^0 O02 $n *92 O26 $v $1 $0 $6 -^psHf -*B8.7sJu +^p sHf +*B8 .7 sJu $2 $0 $6 -o43o6% +o43 o6% $1 ^@ -*45*7A +*45 *7A oB1 O05 p5 C $0 $7 -y2R8 +y2 R8 'B $4 k $M ^5 ^2 ^4 o5L ^0 ^6 ^1 -*67s1. +*67 s1. { ^O s4V $6 O64 @@ -8995,7 +8947,7 @@ O72 *61 *12 i85 ^4 ^6 ^6 i9` D1 OB1 -ty5o5' +t y5 o5' *49 *4A O36 u 'C $7 ^8 ^3 ^3 @@ -9004,31 +8956,31 @@ c $2 $1 $1 OA6 $5 *18 ^6 ^8 ^7 i60 O57 -Z2sD{*62 +Z2 sD{ *62 DA OA9 s7D $1 $2 $7 c $2 $3 $2 -*25*03 -o3i*8B -*53sko -i97l +*25 *03 +o3i *8B +*53 sko +i97 l i1e i5e c $8 $9 $0 -+B^u*A1 ++B ^u *A1 i7d i7e o47 $b O0B s3G ^r ^e ^p -s$.i5asF0 -*27se5 +s$. i5a sF0 +*27 se5 O02 $s i8> E O95 -^EEs$' +^E E s$' k +2 O18 ,B q -}ui9@ +} u i9@ ^r ^P -sH*$iR7 +sH* $i R7 C $0 $8 O73 *04 $f $x @@ -9036,11 +8988,11 @@ i54 i50 i52 i72 T8 *9A O57 O63 *A5 -.9*79 +.9 *79 i5c i5e ^1 ^0 ^5 ^4 ^3 ^1 -DB+1[ +DB +1 [ i38 i37 $s $u $e ^4 ^4 ^9 @@ -9052,12 +9004,12 @@ $5 $1 $8 $0 $2 $5 $4 $1 $4 Z1 O36 -*A9spR +*A9 spR r $0 $0 -lo9h +l o9h +2 +9 c ^7 ^9 ^9 ^1 -KiA+ +K iA+ *27 O15 $g $a $p D0 $Q @@ -9065,32 +9017,32 @@ D0 $Q O64 o3e $2 $3 $2 *A3 O62 O03 -+Bo0Z -o1J[ ++B o0Z +o1J [ $1 $6 $0 $1 $3 $4 $h $a $d -slu,2 +slu ,2 si' O09 r O72 K O73 O0A c $1 $3 $5 -$&$& +$& $& $7 $0 $7 i8A u $4 $2 $0 $w $h $o -$vE +$v E $s $a $w o2E -*58+2 +*58 +2 } O72 o0u k ^d ^i ^m ^9 ^5 ^0 ^1 ^5 ^2 -*8Br +*8B r OA7 i2l o9e O74 OA5 @@ -9100,10 +9052,10 @@ $2 $1 $6 i7A y4 o8A K O53 -sF[$2 +sF[ $2 i3c i3e *23 O3B -$@$! +$@ $! o1o D4 i82 i90 iA0 iB7 $1 $7 $0 @@ -9113,10 +9065,10 @@ o5p $3 $1 $7 ^8 ^5 ^5 i8" -*5B*31 -*B6-5] +*5B *31 +*B6 -5 ] O53 o5| Y5 -$1shW[ +$1 shW [ s02 svF O62 $8 $3 $3 @@ -9124,33 +9076,33 @@ $2 $3 $5 O59 ^A $5 $6 $4 u 'B -.8$&s[# +.8 $& s[# ^7 ^5 ^1 -*86*B6 +*86 *B6 ^1 ^6 ^6 c $7 $4 $7 c $1 $9 $5 $4 -*83Z2-9 +*83 Z2 -9 i38 i31 $1 $7 $8 i52 i71 OB6 i7- -CsmH +C smH O87 *B7 o65 -*37o5l -*5B-2o8z +*37 o5l +*5B -2 o8z i51 i59 $2 $0 $7 i79 i52 -iA.l+6 +iA. l +6 $9 $8 $0 $B $e O35 l O65 c sVU o0O O02 i5w -RB.1c -^yo71 +RB .1 c +^y o71 O12 *0B r $a O97 ^t O12 @@ -9164,7 +9116,7 @@ l $! $! $! ^0 ^4 ^2 -8 -9 -8 c O32 +9 -.9*A3$) +.9 *A3 $) ^e O58 c i41 -0 -3 -3 @@ -9178,28 +9130,28 @@ d Y4 i31 i42 i53 o0r ^b O95 l O96 -$[$] -Cs@ZsH* +$[ $] +C s@Z sH* O39 s)r *79 } O94 k c $6 $6 $6 $! -*A4su8 +*A4 su8 ^5 ^9 ^1 -i4a*50 +i4a *50 $e O93 i2o O01 $a $i $m -oAP-2sp% +oAP -2 sp% i39 i30 O15 Y1 s}T +0 O42 -i4ns%8 -sDUKD2 -*43'9 +i4n s%8 +sDU K D2 +*43 '9 $5 $4 $6 C $2 $0 OB5 *8B u -'AD3Y1 +'A D3 Y1 Z1 i0J } $` ^4 ^3 ^0 @@ -9208,13 +9160,13 @@ $e $o $n s03 +D -B o7g -i9io6a +i9i o6a o22 E ^l ^s $r Z1 T6 k s*h OB6 ^c ^r ^a ^M -i3r*0B +i3r *0B R0 O5A C *02 $= OB3 ] @@ -9223,14 +9175,14 @@ o0$ $c $o $t $3 $1 $0 i3a i71 -o8GsgtoA2 +o8G sgt oA2 i3e i7e $t $u $b ^5 ^1 ^3 ^5 ^1 ^2 o8t $1 $3 $7 -y2-1 +y2 -1 O06 $$ *45 O32 i8y @@ -9239,17 +9191,17 @@ C $6 ^9 ^3 ^3 OB7 o8f $7 $1 $7 -s)j+Ay4 +s)j +A y4 o9w -$9*91*BA +$9 *91 *BA i64 i73 i82 $2 $2 $4 s0m i18 i19 -,5sp) -s5%*30$. +,5 sp) +s5% *30 $. i52 i59 -*12*B1 +*12 *B1 c o10 $7 $1 $0 i37 i30 @@ -9260,38 +9212,38 @@ i55 i50 ^l OA2 l $0 $2 *78 .1 O58 -cY5sG| -sN^.1 +c Y5 sG| +sN^ .1 *31 o3p -s^v-2-2 +s^v -2 -2 +0 *31 l ^r ^o ^f -s'ic+7 -o88spx*34 +s'i c +7 +o88 spx *34 -5 -6 -7 sd1 i3z s37 -iBjD0 -o2msy= +iBj D0 +o2m sy= ^4 ^0 ^2 $4 $1 $2 ^6 ^7 ^1 i9* -i50*86 +i50 *86 ^3 ^0 ^3 -$ki7R +$k i7R i7a i7a $3 $2 $4 $3 $2 $6 -o5=t -*70^G +o5= t +*70 ^G ^3 ^6 ^0 C $9 $4 -loAmsQR +l oAm *BA O87 se$ c ^4 ^9 ^9 ^1 -*54s;Ms`p +*54 s;M s`p ^0 ^2 ^9 c $7 $0 $7 ^5 ^0 ^2 @@ -9299,9 +9251,9 @@ C $8 $9 -7 -7 -8 T0 T4 T3 T2 T1 $4 $3 $2 -KT9 +K T9 $3 $1 $8 -E.5 +E .5 ^8 ^1 ^2 -3 -9 $s $i $c @@ -9311,35 +9263,35 @@ o9c $1 $7 $1 ^9 ^2 ^3 i35 i36 -T2oA8 +T2 oA8 iBg OA4 $1 $4 $1 $- c d '9 $9 i33 i30 -,3s.o +,3 s.o $5 $8 $7 -*35TB +*35 TB +9 -3 -Y5Y5 +Y5 Y5 s[= O25 -$-sbC +$- sbC i34 i33 -$vo6A -]d +$v o6A +] d $1 $5 $1 $K sK1 $6 $6 $1 $6 $5 $8 $9 ^1 ^1 ^2 -$!$? +$! $? $s $a $d O97 i50 s]w i52 i56 i5b i5a $s $e $a $\ oBe -*86,5*1B +*86 ,5 *1B y2 *43 [ y2 sgc @@ -9349,10 +9301,10 @@ OA2 O63 s _ o4S i2s O32 -'7Z3 +'7 Z3 [ $a o2? -^j*50t +^j *50 t i11 i32 i53 i74 i95 i69 E $3 $3 $0 @@ -9371,21 +9323,20 @@ OB9 OA9 O25 O63 OA4 ^5 ^0 ^9 D1 z2 -T5*1BK +T5 *1B K i72 i80 i90 iA7 -E,5 O54 Y5 s53 +2 -3 -3 c $3 $1 $1 -*49^S +*49 ^S O8A s\b oA1 c ^0 ^9 $9 $1 $9 -[*04y1 +[ *04 y1 .2 O72 [ $4 -*2BR0 +*2B R0 s32 $2 $0 $1 $0 $* $9 $8 $5 @@ -9393,7 +9344,7 @@ $0 $3 $0 l T6 $1 $8 $9 } ,2 O46 -iA{t +iA{ t c ^7 $7 i5a i7a $f $a $x @@ -9407,13 +9358,13 @@ sgo s68 $p $a $w $n ] O06 --8E +-8 E l [ ^D -*56$3 +*56 $3 *8B -tiB]K +t iB] K i1s -*59D0o5t +*59 D0 o5t ,6 o1o ^d ^C $t $a $m @@ -9421,9 +9372,9 @@ $t $a $m +8 O75 -5 u $s i3e i3b -s,gD5 +s,g D5 OB7 O73 -oA$o0j +oA$ o0j i3a i5a D0 OA4 K c $1 $4 $1 @@ -9431,7 +9382,7 @@ i5N i34 i74 sJ8 ,7 OB6 $1 $1 $! $! -[o0T +[ o0T C $3 $4 Z4 O34 i3@ @@ -9439,21 +9390,21 @@ OB2 ^T [ o0o s'V d OA3 ] O16 ^h -*89*A5sS' +*89 *A5 sS' -0 *02 c $1 $7 $1 -*20i7j -$<$> +*20 i7j +$< $> ^4 ^1 ^3 -B sM< O5B -s*Ps@e-4 -o0k*82 +s*P s@e -4 +o0k *82 oA; sFb O82 -T1k +T1 k *B0 k O62 -3 -7 -7 -snGo57 --7sla'8 +snG o57 +-7 sla '8 C $0 $2 .3 *81 ^6 ^7 ^0 @@ -9464,31 +9415,31 @@ O9B i6A k r O45 ] ^8 ^0 ^0 -s%2^B +s%2 ^B '9 $3 i3C l ,1 O53 o3o ^1 ^c -D0stp] +D0 stp ] ^3 ^6 ^2 '8 $i i35 i30 i59 i52 i23 iA1 -+0i8aK ++0 i8a K $1 $6 $5 ^6 ^2 ^0 +9 +A +9 $9 $1 $6 -[i74y2 +[ i74 y2 $B l -,A$_ +,A $_ sS/ DB O39 -D7,6 -i0KsodE +D7 ,6 +i0K sod E ^b ^3 -i9J*42 +i9J *42 oB8 ^7 ^0 ^7 $5 $5 $6 @@ -9498,7 +9449,7 @@ $s O82 i5x i52 i70 ^5 ^4 ^0 -L5^7sFq +L5 ^7 sFq $0 $1 $5 *42 O45 sbm @@ -9514,11 +9465,10 @@ i6d i7e +0 -3 -3 ^3 ^1 ^3 +A -B -B -*2Ao3r +*2A o3r $3 $3 $4 -i6@+A +i6@ +A i72 i51 -co0M O02 Z2 $6 $0 $6 c $0 $0 $4 @@ -9532,24 +9482,24 @@ o5N -0 O12 $4 $5 $0 d O46 -,6C'7 -oACi1ns%F -i7as$S -ls10 +,6 C '7 +oAC i1n s%F +i7a s$S +l s10 $l Z1 s.< O13 i6v s1! -*4BT5 +*4B T5 Z1 O84 sEX s2u .A O96 } *97 smt o1V -*24+7 +*24 +7 [ $8 -i6-s6e -*34D7 +i6- s6e +*34 D7 D0 OA3 z2 l $2 $1 $1 $6 $3 @@ -9557,12 +9507,12 @@ $2 -9 $5 $7 $9 o2a O07 O39 O67 -B -u*27 +u *27 O82 ] ^5 ^7 ^0 -}*7Bz2 +} *7B z2 p4 O4A -o2vsd; +o2v sd; c ^2 ^4 O73 OA4 O76 *A9 r @@ -9571,7 +9521,7 @@ O76 *A9 r i50 i55 ^5 ^4 ^4 ^9 ^0 ^3 -y2sg1 +y2 sg1 sdo i42 i50 i61 i70 u 'C $1 @@ -9587,14 +9537,14 @@ $2 $4 $2 O84 ^c O18 O54 s79 -*31sev*2B +*31 sev *2B c o5. c $2 $1 $0 *20 -0 O2A *23 sv9 O32 Z1 -O21 o2z -Z2s?,i7S +o2z D3 +Z2 s?, i7S o2b o3O l i3& @@ -9608,35 +9558,35 @@ Z4 D3 O57 } saT $0 $4 $0 $8 D8 -,3[{ -sy!o5+[ +,3 [ { +sy! o5+ [ Y5 *1A O3B o3O O14 -$8*A4 +$8 *A4 o1p O2A ] O96 O35 O62 *74 O97 OA5 $D O06 +B -,3s<_ -*54^m --Ao59 +,3 s<_ +*54 ^m +-A o59 O65 s J E O3B *96 *46 -*7Br +*7B r $6 $2 $5 i51 i54 -$5o9e +$5 o9e ^6 ^9 ^0 sMH ^3 ^0 ^9 -iAZ*61 -}s`4c -DA.4 +iAZ *61 +} s`4 c +DA .4 oAs -3 -5 -5 $d $e $b -$-DA +$- DA c $2 $0 $3 $0 O86 O53 *02 o2w @@ -9649,27 +9599,27 @@ smb y5 O5B p3 smC $D .B O6A -sb^*32 -Z1.B +sb^ *32 +Z1 .B ^1 ^4 ^1 c o7- $7 $8 $7 O64 t s76 -s$8*61+8 +s$8 *61 +8 c $4 $0 $4 O31 O0B ^8 ^7 ^7 -^5L7 +^5 L7 k ^2 --2sa/s(u +-2 sa/ s(u $5 [ i6f O59 i3e i1e $2 $2 $8 $1 $5 $8 -i3q*13 -svxtsB8 +i3q *13 +svx t sB8 sek OA8 *56 O29 d spm O0A @@ -9683,26 +9633,26 @@ C $0 $6 ^0 ^8 ^4 } o7H ^2 ^f -*34i9[ +*34 i9[ y5 *74 O17 O63 c $0 $2 $7 i71 i51 --5s!0*87 +-5 s!0 *87 E i0J o6i ^L --8$1 +-8 $1 D1 p2 l [ ^L K $2 -*27o7u +*27 o7u +6 +8 +7 o7j $p $u $t -*49i18 -[Y4 +*49 i18 +[ Y4 o9v -*7At +*7A t O03 c i2@ oA$ @@ -9714,21 +9664,21 @@ O21 o0y O2B .1 O96 Y2 K ^5 ^3 ^0 -*15s;to7# -*90s"?o0V +*15 s;t o7# +*90 s"? o0V $p $u $p -sd3$9 +sd3 $9 sry -s(ys5[^E +s(y s5[ ^E $4 $0 $1 sf7 ^3 ^7 ^7 -*32T0sb8 +*32 T0 sb8 ^6 ^7 ^7 ^2 ^6 ^6 DA D4 -o8C*48T7 -s]#si1*09 +o8C *48 T7 +s]# si1 *09 +6 +8 +8 $9 $1 $2 s46 @@ -9740,43 +9690,43 @@ $2 $6 $5 $2 $3 $6 skd *02 O31 i1I -i67sZK -i9J*40$S +i67 sZK +i9J *40 $S +7 +7 +8 -o25.2iBn +o25 .2 iBn O81 i4t o2N i1p -]-9,B +] -9 ,B T0 T8 T4 i51 i56 i2X o5e O61 $6 $2 $6 O1A Z3 -[,B +[ ,B i72 i80 i90 iA3 ^0 ^5 ^4 ^6 ^9 ^1 $5 $0 $2 -D1s2b +D1 s2b O8B -6 $2 $5 $4 i71 i89 i97 iA2 c ^8 ^7 -sJ}*54 +sJ} *54 say $u $m $p k -1 O02 D6 O5B O21 -*9Bc-A +*9B c -A OA2 ] o5K l c $1 $1 $5 $f $i $e -+9^d*3B -*15qs%y ++9 ^d *3B +*15 q s%y D5 o5o ^4 ^4 ^0 ^i O12 @@ -9787,21 +9737,21 @@ O51 ^O o8| c 'C $4 O12 .2 ^5 ^6 ^9 -.4iAf +.4 iAf ^8 ^6 ^1 $1 $4 $2 -s+nsb${ +s+n sb$ { O19 ^B c o13 sp; O28 q oA+ -Ks!},3 +K s!} ,3 i3i [ -i9!l +i9! l c '7 -.5sb**09 +.5 sb* *09 O37 y2 R7 --9-1 +-9 -1 ^0 ^4 ^8 o1r [ $a k @@ -9813,8 +9763,8 @@ c $2 $5 $5 ^5 ^4 ^3 $4 $0 $8 $3 $6 $1 -s%*o6@ -$d*14R8 +s%* o6@ +$d *14 R8 $4 $3 $0 *02 o2z s63 @@ -9826,24 +9776,24 @@ $5 $1 $3 $2 $2 $6 ^2 ^0 ^2 $5 $1 $4 -*65sa= +*65 sa= i1L +0 D4 OBA *46 -oBKY1 +oBK Y1 o8j $4 $1 $7 O2B o5s $3 O89 i52 i54 -i8jy2 +i8j y2 i30 i70 i51 i55 siR u i1e i3a O4B R1 -i8msrDi9D -*80s/2*45 +i8m srD i9D +*80 s/2 *45 c $2 $4 $6 } $[ $K l @@ -9861,20 +9811,20 @@ i53 i50 'A $1 $w $a $x c $9 $8 $7 $6 -s5Dl^K +s5D l ^K $2 $1 $9 s58 i77 i51 -sh{$- -^M*93 +sh{ $- +^M *93 ^5 ^7 ^7 s74 o1K -^8K +^8 K c 'A $8 ^3 ^4 ^0 i1f i1e -Y1iAq +Y1 iAq K +4 $0 $2 $4 $5 $0 $4 @@ -9886,57 +9836,57 @@ D1 D2 c $2 $2 $1 +0 +3 +3 c { O65 -*79$- +*79 $- ^c ^3 c ^8 $8 i0m i1a i2g ^3 ^1 ^2 O62 c -iAf*0B*54 +iAf *0B *54 i5l i6e +1 -0 -0 z1 O54 O1A ^0 ^1 ^5 -Z3D8 +Z3 D8 $1 OB3 OA2 [ c O89 T2 ^6 ^1 ^3 -o6Z+5 +o6Z +5 o1s +0 } O34 -*A0RBY2 -u+7 +*A0 RB Y2 +u +7 c $7 $5 $3 -^Bc +^B c $5 $0 $8 -].3} +] .3 } s1w O76 D6 O8B z1 o9^ $3 $3 $1 i62 i70 i80 i93 -*76s=8'7 +*76 s=8 '7 i50 i58 o4K D1 k $9 $0 $1 -Z1o79 +Z1 o79 $5 $8 $0 $3 $0 $1 i1e i1d -iA2o2y +iA2 o2y i8d -i7i+3o95 +i7i +3 o95 ^_ ^1 -s6T'AscZ +s6T 'A scZ ^9 ^4 ^1 d 'J C $2 $6 s75 -^1Z1 +^1 Z1 ^1 ^8 ^9 r $9 $6 -*46s#*stx +*46 s#* stx ^c ^D O14 E O35 p1 *38 @@ -9944,9 +9894,9 @@ o0F l $4 $5 $4 o0j O31 o3g -*46sMrc +*46 sMr c O61 $y .4 -}sD5l +} sD5 l ^5 ^4 ^2 c $1 $9 $5 $0 o0P y2 @@ -9959,8 +9909,8 @@ $0 $2 $3 o8- -2 O92 o5h c $2 $5 $0 -sMj*93*76 -s;4c+5 +sMj *93 *76 +s;4 c +5 $6 $4 $4 $7 $0 $9 O43 Y1 @@ -9973,20 +9923,19 @@ O02 O91 ^e ^3 $p $e $e ^1 ^7 ^1 -sXNo3w +sXN o3w k -0 ^4 ^5 ^6 $9 $7 $8 i78 i51 c $1 $* -*96i6S +*96 i6S $5 $3 $1 -s|ER5 -c-Bs3I +s|E R5 +c -B s3I $5 $5 $2 -$-$= -o0O -oBI^!*51 +$- $= +oBI ^! *51 .8 O83 ^7 ^4 ^3 O46 u @@ -9995,25 +9944,25 @@ $2 $3 $7 s0m O97 y3 [ d O4A $c $f -T4*54*B1 +T4 *54 *B1 i82 i90 iA0 iB4 $a $b $c i0d i1e i2l -l C O67 +C O67 ^8 ^4 ^0 r O02 d -E-2 +E -2 i3L i39 i38 $7 $1 $3 -s;j*71 +s;j *71 $5 $1 $9 sK% O87 i32 i72 -c$1$2$3$+ +c $1 $2 $3 $+ +2 D1 u o5r -.4Ky2 +.4 K y2 T5 O81 +6 -8 -8 $2 $8 $0 @@ -10029,16 +9978,16 @@ r '7 sei ^0 ^6 ^9 [ d -smWsCE +smW sCE i1z i67 OA2 sds ,4 O98 -*5A*13 -^s-B +*5A *13 +^s -B o4e D5 i51 i5a -*29o2v +*29 o2v $4 $2 $1 O42 E $h $a $y @@ -10046,12 +9995,12 @@ o1W *80 O06 swF iAX $7 O74 -s?2+7+4 +s?2 +7 +4 $s $1 -s0Yky5 +s0Y k y5 o91 $5 $6 $9 -syKi99.4 +syK i99 .4 $3 $0 $8 $0 $7 $0 ^4 ^6 ^0 @@ -10060,15 +10009,15 @@ $2 $9 $0 $6 $8 $6 +8 oB[ O01 ^5 ^2 ^5 -s'>.4i7( +s'> .4 i7( i50 i54 c ^0 ^4 -*06o8s$q +*06 o8s $q $y $a $k $# O65 OB6 $4 $2 $5 $4 $1 $6 -*20o7?l +*20 o7? l $2 $5 $9 o8? O52 $6 $5 $0 @@ -10083,27 +10032,27 @@ o5' $5 $5 $0 $2 $5 $2 ^1 ^d -c$1$2$3$# --1oAi +c $1 $2 $3 $# +-1 oAi i3n O42 -s%7i3n +s%7 i3n $e $r $g ^0 ^5 ^9 ^0 ^8 ^9 -s]fZ1 -s`h]T1 -D3o3n +s]f Z1 +s`h ] T1 +D3 o3n l ] $A c $5 $1 $5 +B -A -A -*8B*53 +*8B *53 c ^6 ^8 $2 $5 $7 O46 o7/ s5^ -so"DB +so" DB ^6 ^4 ^0 -s1=-As>^ -D1i4e +s1= -A s>^ +D1 i4e $2 $8 $2 ^0 ^0 ^6 $1 $4 $8 @@ -10113,7 +10062,7 @@ sdt $3 $4 $7 i5a *56 u $b --6sF( +-6 sF( O48 i7T $H i34 i30 i56 i54 @@ -10128,55 +10077,55 @@ $1 $3 $6 *02 D3 ^3 ^4 ^2 i62 i70 i80 i97 -s.a$q +s.a $q ^7 ^4 ^0 c $5 $2 $5 -$a*79.3 +$a *79 .3 sf| l O23 ^2 ^1 ^9 -s#[o5A +s#[ o5A ^4 ^f -C -C -C -o4}ELB +o4} E LB ^6 ^2 ^5 -,0 O68 OA2 -+8+B +O68 OA2 ++8 +B ^9 ^0 ^9 -*32s,\ +*32 s,\ y3 O62 O2A $4 $5 $2 -*02*3A +*02 *3A $u $p $s $2 $7 $0 { $n $9 $1 $8 O91 +A $8 $0 $1 -i82oB% +i82 oB% $5 $1 $6 -$?$! -sy]y3s"? +$? $! +sy] y3 s"? $0 $1 $6 T0 ,7 O0B -4 -6 -5 u 'B $3 $8 $2 $8 i56 i57 -s^ho21 -i09-9 +s^h o21 +i09 -9 c $x $1 -{*03 +{ *03 sRe O64 $7 $1 $8 -ky1 +k y1 $8 $7 $6 ^e O12 *21 *13 st3 O2A ,A l ] $o -,A^q +,A ^q O42 E p3 -+6*7B ++6 *7B $g $u $t O42 p3 E $4 $8 $7 @@ -10198,22 +10147,22 @@ o7e $9 $6 $9 $8 $0 $9 $f $l $y $e $r -*7B*54 +*7B *54 $6 $6 $5 -*32o9o +*32 o9o r $2 $1 oAM O8A r K O59 l ^2 ^3 ^2 -*24sE( +*24 sE( ^7 ^3 ^3 s/" *65 O42 $Y o62 i0M i1a i2y oBz -K,6 +K ,6 Y3 O07 k -s71s}i +s71 s}i ^1 ^8 ^8 +6 i5l +5 swV @@ -10221,7 +10170,7 @@ $4 +9 O87 i78 iB) $- iB, O96 $5 $0 $3 -s-Ki9n$@ +s-K i9n $@ s60 i51 i73 ^7 ^5 ^3 @@ -10231,10 +10180,10 @@ i7c i7a K ^a $4 t c $1 $5 $1 -*57c +*57 c d '8 $2 c $1 $8 $2 -*08i75 +*08 i75 $0 $6 $9 c $1 $9 $5 $2 u ^X $X @@ -10247,15 +10196,15 @@ i32 i34 c $1 $9 $5 $3 D1 +2 $9 $8 $4 -$a*30s/O -T5R7 +$a *30 s/O +T5 R7 i73 i51 O54 $a sKj s#/ ^M O69 i3w c $0 $1 $2 $o $w $e -K*28*65 +K *28 *65 $y $o $n $1 $8 $6 c $1 $2 $5 @@ -10276,16 +10225,16 @@ ssn *A6 O61 *BA ^4 ^4 ^1 O72 f -o8@s&I*21 +o8@ s&I *21 ^6 ^2 ^3 $7 $2 $0 d -4 O18 -s]9Y1 +s]9 Y1 c $9 $5 $1 -$mo7[ +$m o7[ D4 O02 -$A*8B -i6n*5B +$A *8B +i6n *5B $5 $0 $6 O23 Y2 c $1 $9 $1 @@ -10294,18 +10243,17 @@ $0 $5 $0 $4 $2 $7 O14 c O19 i71 i5e -l [ ^N -.7sY% +.7 sY% c d $0 -T4s3b +T4 s3b O25 O67 $u ^6 ^4 ^4 i3a i1e +8 -6 -6 -*35sI7 +*35 sI7 O95 O16 .B ^8 ^5 ^1 -*61u +*61 u s52 $6 $0 $0 $0 s4n @@ -10324,26 +10272,26 @@ O17 i2i O13 O07 TB $e $k $e o0r o2k -*87s$C +*87 s$C i5e i5e suh OA2 K c ^x $x o7Y l -i5i*B6 +i5i *B6 i8j ^i ^n o5i D4 $- O4B *2A $6 $1 $3 -s;?p5DA +s;? p5 DA iA\ -s=Xs&no0h -$3*13 -sL!o67sJq +s=X s&n o0h +$3 *13 +sL! o67 sJq O4A DA -D2lTB +D2 l TB $4 $7 $8 -.0.6*A5 +.0 .6 *A5 o04 $4 $3 $1 o8n @@ -10353,14 +10301,14 @@ $5 $6 $5 [ O64 *31 O02 $5 $8 $5 -sS&{ +sS& { i6Y $6 $0 $2 $0 $7 $8 $2 $8 $9 i49 o3u D2 -KsjK +K sjK O82 s$Y sB# c $4 $1 $4 i4S O45 *2A @@ -10379,14 +10327,14 @@ c $6 $1 $6 o2N l ^8 ^4 ^1 spm -sKF$ZsG] -*35R2 +sKF $Z sG] +*35 R2 ^8 ^6 ^6 -stA*46 +stA *46 ssl oB$ ^7 ^5 ^5 -c*80+3 +c *80 +3 t O56 o1h [ *20 o0l @@ -10394,36 +10342,36 @@ $7 $7 $8 sem *B4 OAB ^9 $6 $1 $7 -iA%rR8 -*34*90 +iA% r R8 +*34 *90 $1 $9 $1 $m $u $d ^6 ^0 ^0 c $2 $2 $8 O85 ,9 -s^KZ5E +s^K Z5 E ^5 ^f C $9 $3 -.6E*68 -T4*29 +.6 E *68 +T4 *29 ^7 ^c u d '7 $9 -ci3o -l*83 -oAk*02 -^T'Bs#S +c i3o +l *83 +oAk *02 +^T 'B s#S $l $i $b -]spH[ +] spH [ ^n i1d $5 $2 $8 -,1+0 +,1 +0 O32 l O86 $d s70 -E.8 +E .8 $4 $1 $8 ^0 ^3 ^9 -,4} +,4 } $0 $8 $6 O6A o59 i7y @@ -10432,38 +10380,38 @@ i6Z O02 C $4 $1 $3 $1 $8 $1 -R1oA" +R1 oA" } O43 $2 $0 $8 i7c i8o -$4T7 -sE8*37y2 +$4 T7 +sE8 *37 y2 $b OA3 -*92iAs -o0fY1 +*92 iAs +o0f Y1 i3A i2n [ $n $a o3M ^m O13 -sL!f +sL! f c ^5 ^9 ^9 ^1 ^b O3B o86 +2 +3 +3 oBs $6 $0 $8 --9]s94 +-9 ] s94 p3 Y1 -DA$" +DA $" C $1 $9 O24 $3 O36 so$ -$=$) +$= $) y2 o0m -*90o6$ +*90 o6$ i2v O01 -sEm*24^e +sEm *24 ^e O82 ^D .0 O53 i9A @@ -10471,7 +10419,7 @@ D2 o0l $6 $2 $0 O52 Y5 O76 $s $u $b -*B3-6 +*B3 -6 i70 i52 c $1 $5 $5 $9 $2 $5 @@ -10480,13 +10428,13 @@ $c [ i39 i32 ^5 ^2 ^9 } } d -.0s+.z1 +.0 s+. z1 ^6 ^1 ^2 s0* c $1 $9 $4 $2 -c E O39 -*18^q --9*A9 +E O39 +*18 ^q +-9 *A9 *02 o3e c $3 $6 $5 $t O02 @@ -10496,43 +10444,43 @@ i55 i53 +0 ^p i36 i30 '9 $5 -o71sV3sLm +o71 sV3 sLm *02 y5 O82 -*43} -.9r$x +*43 } +.9 r $x D2 c -Y3T0 +Y3 T0 u O05 o3K -.7$4 -s)_p2 +.7 $4 +s)_ p2 o3C ^9 ^5 ^4 o0k O41 ^s O13 t O71 O9A O24 *3A -[[[[[[[c +[ [ [ [ [ [ [ c ^a ^3 R8 O98 -o9=o2u +o9= o2u $d $i $m ^0 ^2 ^8 -u*31s;` +u *31 s;` ^8 O94 ^3 ^f -s[P$E +s[P $E O35 -0 i0s i1u -.2*47o0l -o8b*79,5 +.2 *47 o0l +o8b *79 ,5 $1 $3 $9 ^7 ^8 ^8 -i1'*1A +i1' *1A O35 *17 -T3i59 -*87+2 -LB*17 +T3 i59 +*87 +2 +LB *17 u $V ^4 ^7 ^7 $s $i $t @@ -10540,7 +10488,7 @@ i34 i35 o2m D3 $8 $8 $9 i6i i7d -y4E +y4 E c $4 $5 $5 ^2 ^7 ^1 c $4 $5 $4 @@ -10549,30 +10497,30 @@ c $4 $5 $4 '6 Z2 i72 i52 o0V -uz5 +u z5 $* Z2 O52 +3 +3 $4 $6 $5 $3 $0 $2 u O26 O56 d -,5oB+ +,5 oB+ $x $x $x $7 $1 $2 -p5o6r +p5 o6r ^l z1 $2 $8 $1 OA5 sGj i3s [ i1e i57 i58 $1 $2 $3 $. -D2R7 +D2 R7 i6K [ i1z -*0Bi2rs5t -l [ ^C -o2g,Asj, -.3D5 +*0B i2r s5t +l o0C +o2g ,A sj, +.3 D5 $2 $4 $3 $n $a $g Y4 o2y O14 @@ -10585,20 +10533,20 @@ i69 O56 $s $a $y $0 $9 $1 Y2 O02 -s6T*67 +s6T *67 ^M O38 i36 i35 O56 ^L ^1 ^9 ^1 [ -2 -'9 s5y O78 +'9 s5y $# $! O92 $4 $4 $7 -*48o4ao5A -sarR8s-. +*48 o4a o5A +sar R8 s-. ^4 ^6 ^1 i67 OA5 snx -$aKk +$a K k ^w *21 O74 *0A -7 $h $o $g @@ -10607,23 +10555,23 @@ T6 OB2 OB9 i7e i7c +4 D3 $3 $5 $4 -si`y2 +si` y2 $h $i $s ^4 ^d *03 o0p $6 $2 $4 -+4szJ ++4 szJ t +6 -}iBOK -s/P^y} +} iBO K +s/P ^y } i3e i1a -*72*5A*92 +*72 *5A *92 $2 $5 $1 ^6 ^6 ^9 '5 $J Y2 *06 -sm/-7Z2 --6s*2*69 +sm/ -7 Z2 +-6 s*2 *69 i3B o4F o9S @@ -10641,13 +10589,13 @@ E O93 Z2 ^6 ^0 ^3 $b $u $n $0 $8 $9 -i0Ts`Z +i0T s`Z $1 ^! $3 $1 $9 ^p ^l d Y4 O28 i71 i5a -o63*97 +o63 *97 $4 $5 $8 .3 l t O48 +6 @@ -10661,14 +10609,14 @@ O93 i0V LB O08 sCn O84 i0d i1o i2m c $1 $1 $3 -T9*45T6 +T9 *45 T6 ^a ^4 i7; d O3B O87 iAv $9 $2 $0 -*B3-5 -iBbo4u +*B3 -5 +iBb o4u i51 i5e s-S O56 $n $o $r @@ -10677,31 +10625,31 @@ c d $4 $0 $5 $6 i5` K k -c,3 +c ,3 ^3 ^8 ^9 l ^. r ^6 ^8 ^3 O26 sD# t o2G l $9 $0 $8 -*56-BsKU +*56 -B sKU O02 ^g -*95,5 -DB*2B +*95 ,5 +DB *2B O21 o2i -*12*48 +*12 *48 i30 *21 O04 d R9 O3A O24 *96 $5 $2 $3 i2q O31 -T6i5q$5 -]Y1*56 -*62EY4 +T6 i5q $5 +] Y1 *56 +*62 E Y4 O01 *B2 $6 $5 $6 -]D1 +] D1 $9 $0 $5 i50 i56 $6 $0 $9 @@ -10710,22 +10658,22 @@ $9 $1 $7 O05 s[* O4A $6 O63 sZ$ OA2 -D6sq7Z2 +D6 sq7 Z2 *8A O72 -$8T5 +$8 T5 $k [ -oB>*64 +oB> *64 ^J l $4 $3 $2 $1 ^2 ^5 ^2 O09 OB7 *51 -$3s*4 +$3 s*4 i70 i51 o5c o1c -KiA" +K iA" $R $1 c -T7+6 +T7 +6 $4 $8 $6 $4 $6 $8 $h $e $s @@ -10748,14 +10696,14 @@ c ^6 ^5 siu $6 $0 $4 O12 i0B -D5i5- +D5 i5- o4K l c $0 $9 $9 $4 $4 $2 O27 T7 i3e i71 ^8 ^a -$.$- +$. $- $1 $6 $9 z1 i1n D5 l @@ -10782,7 +10730,7 @@ o2a OB5 -1 ^6 ^7 ^2 $4 $5 $1 -*31o9?c +*31 o9? c s62 ^4 ^5 ^2 $0 $9 $4 @@ -10795,9 +10743,9 @@ iA3 s16 i54 i57 $4 $5 $7 -Y3iB5 +Y3 iB5 *98 D9 -'6stbi7x +'6 stb +4 -9 ^2 ^4 ^1 i11 i11 @@ -10810,7 +10758,7 @@ T7 $1 $7 $0 $1 $o $r $b $6 $7 $1 -.5^w*B2 +.5 ^w *B2 s"i O65 O24 Z2 s/n iE- @@ -10821,14 +10769,14 @@ Z1 o2j O02 ^x OB7 i09 $2 $@ -'9o4@sI{ +'9 o4@ sI{ ^0 ^7 ^9 } ^M i7/ -,3*B0*26 +,3 *B0 *26 ^3 ^1 ^5 $4 $0 $7 -y3Es8d +y3 E s8d ^2 ^4 ^4 $7 $8 $5 c sl1 @@ -10836,8 +10784,8 @@ oA5 k +0 i63 i76 i89 $h $o $b $o -s&v[-7 -i6ysgA +s&v [ -7 +i6y sgA +1 *8A O4A } O46 $j O43 y5 s>P @@ -10846,7 +10794,7 @@ O94 r Z1 c $1 $9 $4 $1 O04 O57 [ i1w -$-$+ +$- $+ O97 *32 *4A OB7 ^T c ^6 ^7 @@ -10860,16 +10808,16 @@ $3 $3 $2 c ^5 ^3 T7 T8 O03 R2 *19 -o2m*7A -ro6yT9 +o2m *7A +r o6y T9 $v $i $a } $j O46 -o2ms)^*70 -Y2,B -s'%o9",3 +o2m s)^ *70 +Y2 ,B +s'% o9" ,3 $2 $4 $8 i8* -s7e*21*04 +s7e *21 *04 *68 D6 *67 sFB O81 O69 i4- @@ -10891,12 +10839,12 @@ $4 $0 $2 O42 o0j O63 i6n O68 o7- -i9P*A3*43 +i9P *A3 *43 ^\ $6 $4 $5 -i3-s63s}# -$1*84 -k*30 +i3- s63 s}# +$1 *84 +k *30 s0o c i2M p4 o9e @@ -10909,9 +10857,9 @@ $3 +8 i1a i5e ^d O13 $5 $8 $6 -s6f$? -us\h^K -sg|K +s6f $? +u s\h ^K +sg| K ^N $s O02 ^y $d $r $y @@ -10924,7 +10872,7 @@ i2E l ] $y ^8 ^8 ^7 $d $u $o -*93r +*93 r $8 $7 $8 $4 $8 $9 o8g @@ -10953,23 +10901,23 @@ d O07 'R c $1 $2 $2 $7 *B3 O19 OB6 --A{ -o6Kc +-A { +o6K c ^7 ^4 ^4 -o2b'B +o2b 'B s41 $2 $6 $3 .2 O41 -[Y5 +[ Y5 $l $a $x O91 O53 *70 ^9 ^7 ^9 +3 -8 -8 +0 -7 -7 *31 '9 -sSDTA$Q +sSD TA $Q i50 i71 --9^6 +-9 ^6 ^9 ^6 ^2 E O36 O71 O84 *65 @@ -10982,14 +10930,14 @@ $s $i $r ] $@ +1 +7 +7 i36 i39 -.5sJaY1 -*B6y5 +.5 sJa Y1 +*B6 y5 sCP -*A8*35DB +*A8 *35 DB *21 o0m O62 i6a i74 i51 -+6szr*3B ++6 szr *3B c $2 $2 $4 $6 $6 $8 $C $b @@ -10998,21 +10946,21 @@ O02 +1 ^2 ^7 ^7 Z2 OA3 -7 $6 $6 $9 -+4+9 ++4 +9 O05 k *61 $0 $4 $5 ^2 ^1 ^7 sTH oB7 O69 s&k -+4o6? -+8-B ++4 o6? ++8 -B C $2 $8 $6 $8 $7 scz $D $o Z2 O72 $u ^l D2 -Z3E +Z3 E $1 $9 $2 O95 O57 ^8 ^1 ^9 @@ -11020,12 +10968,12 @@ O95 O57 } R9 $8 $9 $8 $4 $7 $1 -sMv*B2*24 +sMv *B2 *24 $9 $1 $3 -o0Ls,OL9 +o0L s,O L9 ^s +2 c ^6 ^3 -sGs*01 +sGs *01 Z5 '6 O31 ] p1 OA1 $+ -4 *34 @@ -11040,24 +10988,24 @@ l O42 i3! ^3 ^3 ^2 C $7 $8 -*B4-2 -*24sEk +*B4 -2 +*24 sEk o7' -p5$A +p5 $A o0X i1' -sP?lo4+ +sP? l o4+ $2 $4 $9 $5 $9 $8 --7*8A +-7 *8A $3 $9 $2 -ss4^2 +ss4 ^2 d '8 $6 +9 -A +9 O14 suk -^zo7o -i50*49 -^B*96 +^z o7o +i50 *49 +^B *96 OA4 o3@ sNL r O72 +6 +7 +6 @@ -11074,7 +11022,7 @@ i4f O58 T5 *06 $3 $6 $3 O03 ^g -Z3'5C +Z3 '5 C sog $3 $9 $0 $2 $7 $4 @@ -11086,7 +11034,6 @@ D2 $1 o16 *31 syH O35 O67 $5 $6 $8 -[[[[[[[[ O32 l O97 O2A oA6 $h $o $s @@ -11103,7 +11050,7 @@ s42 c $3 $2 $3 $8 $8 $0 sX1 O57 -T7*84spF +T7 *84 spF +A -7 o17 o2Y @@ -11115,18 +11062,18 @@ c $1 $8 $1 i72 i7a $7 $6 $0 skG -iA3T8Z2 +iA3 T8 Z2 sDT c $1 $4 $5 i31 i33 $5 $2 $4 ^1 ^5 ^9 -$1oB- +$1 oB- $c $r $y $y $e $t $2 $6 $0 *29 -snp-4 +snp -4 ssz c $1 $3 $0 $8 $1 $9 @@ -11142,39 +11089,39 @@ D6 O03 K OB2 sch $1 $7 $4 -^5i8@ +^5 i8@ $a $x $e -+As8Z -y2E ++A s8Z +y2 E $4 $6 $4 -+Bk -R4o8=o8q ++B k +R4 o8q i1h $4 $6 $0 +A +A -9 -s5"$? +s5" $? i9! OA9 OA6 -*01s'Q +*01 s'Q i5@ O37 s1? ^2 ^0 ^9 ^6 ^2 ^9 -T7d +T7 d sb6 D7 O58 y2 $3 O92 -*B3o8r +*B3 o8r ssc -$)TB +$) TB s48 -Y2o4ei8I +Y2 o4e i8I .6 ] s1E O32 -Y3.8 +Y3 .8 +2 o0z .9 ] $1 $6 $4 -*81^J +*81 ^J O81 } *96 OB9 $_ u d '8 $8 @@ -11188,10 +11135,10 @@ o9k l ^5 ^5 ^9 ^1 +3 C $4 $2 $3 -y4sV> +y4 sV> ^8 ^3 ^2 o2P l -sy_o96 +sy_ o96 o8f D9 D4 OAB $R *2B @@ -11212,18 +11159,18 @@ sX+ T6 $1 $g $i $g O95 s-8 oBV -*69'9 -+6s-# +*69 '9 ++6 s-# ^5 ^8 ^8 -*31sgp -i40-1 +*31 sgp +i40 -1 c $3 $3 $0 -iA,i6n*5B +iA, i6n *5B *04 sai ^8 ^2 ^6 O23 Y3 -^L*A4 -i4Zo4zo8} +^L *A4 +i4Z o4z o8} $2 $8 $7 $6 $4 $6 i3S @@ -11243,22 +11190,22 @@ $3 $7 $9 ^d $D -0 { i3E --8i5bsXP +-8 i5b sXP i1a i3d $1 $7 $9 $0 $2 $9 O03 ^w ^b ^8 c ^4 -.8$L*2A +.8 $L *2A ^8 ^6 ^9 y5 O1B ^5 ^1 ^4 -sJRD7s0; +sJR D7 s0; t .2 i5a i3a O45 o15 -s2j*34 +s2j *34 ^8 ^6 ^4 ^4 ^9 ^2 $8 $4 $8 @@ -11272,7 +11219,6 @@ $6 $2 $8 $9 $5 $9 o2n O32 ^8 O0A svo -EZ3 o2S O34 *A0 ^c ^7 @@ -11281,25 +11227,25 @@ d O43 ^i O53 i1a i71 $3 t -l [ ^T -T4*9B +o0T c +T4 *9B ^8 ^4 ^2 ^5 ^9 ^7 $6 $9 $1 o3x -$=$= +$= $= C $5 $6 i3Y O34 i36 i37 -^Es<* +^E s<* t k ^f ^6 ^6 ^4 ^1 $8 $5 $6 O5A iA1 i5G -*03Y5*3B -Y2K*9A +*03 Y5 *3B +Y2 K *9A i53 i55 Z3 OBA c $2 $2 $7 @@ -11312,35 +11258,35 @@ R7 O63 +1 i1u $c $u $e ^9 ^7 ^1 -$mT6 +$m T6 O94 $) $7 $5 $9 *35 +1 [ T0 O73 -sK,o42 +sK, o42 +7 -3 -3 -i78sS+ +i78 sS+ +7 $a ^8 ^0 ^2 -slg+7,A +slg +7 ,A O02 k i1v d $0 ^9 ^6 ^9 ^o ^K ^1 ^2 ^5 -y5E +y5 E '9 $7 -R4s=%LA +R4 s=% LA $0 $3 $5 -i4l*74 +i4l *74 $5 $8 $2 ^Y l o5M ^4 ^8 ^8 ^1 ^4 ^4 $w $a $s -{ts f +{ t s f i55 i75 $y $a $p $8 $1 $6 @@ -11350,9 +11296,9 @@ c $0 $3 $0 o7/ C $2 $9 u ^K -o9L^A*A3 +o9L ^A *A3 $9 $7 $9 -L9^B +L9 ^B $9 $7 $0 c $3 $3 $1 $7 $1 $9 @@ -11366,9 +11312,9 @@ $a $s $p +8 O52 k o16 $a $d $z --1-8 -$1-2 -sXR*42 +-1 -8 +$1 -2 +sXR *42 s90 o0u ^t $6 $8 $5 @@ -11376,9 +11322,9 @@ s1l $2 $8 $5 *57 c O49 s36 -s;NT9 +s;N T9 ^2 ^8 ^1 -i0co5- +i0c o5- s72 i4E $t $o $t @@ -11391,12 +11337,12 @@ i6r i7a i35 i39 $! T0 -2 r -E{ +E { $4 $3 $5 $7 $3 $7 O54 *65 *A2 $5 $6 $1 -*3B$` +*3B $` $x $d ^2 ^5 ^1 ^d ^7 @@ -11411,7 +11357,7 @@ i33 i73 c $1 $0 $8 O73 O07 Y1 D4 -*2AD6 +*2A D6 $y $e $n y4 } c $2 $2 $6 @@ -11419,7 +11365,7 @@ O6A -6 *20 o3i ^x ^f C '7 $1 -sz6t +sz6 t o3N c ^1 ^2 ^3 $V l @@ -11428,7 +11374,7 @@ D2 +3 $. O03 *21 *20 ^1 ^6 ^5 -+1i9f ++1 i9f $4 $0 $3 i71 i89 i97 iA1 +6 -4 -4 @@ -11455,28 +11401,28 @@ c $5 $4 $5 c d $6 O42 oB= $6 $4 $0 -sSei0G +sSe i0G $3 $8 $0 [ o0z -+AsrN ++A srN +9 -3 -3 .6 O24 ^7 ^2 ^3 -,9*3B +,9 *3B $0 $6 $5 i71 i3e o0i +1 $4 $0 $6 i6@ O1A K O02 { -u*86K +u *86 K i30 i34 D3 k -Y2sUY +Y2 sUY O84 ssb -^7*76 +^7 *76 c $3 $4 $3 -*28*A8o35 +*28 *A8 o35 OA3 i82 *18 O51 $g $a $b @@ -11485,9 +11431,9 @@ $2 $6 $1 i5a i7d i8, ^0 ^9 ^2 -T3+B +T3 +B $e O71 -tsn(*94 +t sn( *94 E iB7 O53 ^6 ^a s]" O05 @@ -11496,39 +11442,39 @@ $1 T1 i50 i60 i71 o1q o6O -*45iBV -,3*56 +*45 iBV +,3 *56 *7B O74 -[[[[[c +[ [ [ [ [ c i8R l $d $i $p $6 $3 $6 -oBoy3o5s +oBo y3 o5s $6 $3 $2 $0 $4 $7 '9 $0 -c*24 +c *24 ^c ^2 -D4sVP+4 -R8R1i5M +D4 sVP +4 +R8 R1 i5M s09 $3 $A o2B l s.- $w $e $t o4q -z5E +z5 E i5a i1a o7T -*B6-6K -'8K +*B6 -6 K +'8 K o5C i58 i53 ^8 ^6 ^5 s19 OA7 *06 *31 $s *94 O8B -scxz2sr4 +scx z2 sr4 $3 $8 $6 $0 $3 $2 $2 $9 $1 @@ -11551,15 +11497,15 @@ o8N ^0 ^0 ^7 $3 $7 $6 K O96 -Z2o9t +Z2 o9t $6 $2 $7 u d '9 $7 ^6 ^6 ^5 $7 $0 $5 $9 $1 $5 -sGQ^GE +sGQ ^G E +3 +3 -1 -.6*8A +.6 *8A D0 i2m c $9 $9 $4 $2 $6 $2 @@ -11579,7 +11525,7 @@ i1e i71 *78 O6A i8s i92 o5& O47 -sGQZ1oBc +sGQ Z1 oBc sJP } -0 c $6 $9 $9 @@ -11590,7 +11536,7 @@ c $2 $4 $0 $4 sK` O53 $5 Z4 u .2 -*48$*T6 +*48 $* T6 c ^1 ^1 ^0 ^2 *46 O78 ^6 ^8 ^5 @@ -11602,7 +11548,7 @@ f o2u OAB $d $u $n ^7 ^f -.A{Z1 +.A { Z1 saA ^1 ^1 ^5 ^8 ^8 ^1 @@ -11614,8 +11560,8 @@ $9 $0 $3 o1| $4 $7 $5 TA O61 O52 -o0m { -D0i09 +D0 $m +D0 i09 o3y [ D6 $s ^5 ^e @@ -11627,7 +11573,7 @@ o9m u d '9 $5 $9 $2 $6 ^a ^9 -+3.B ++3 .B sm" $3 $4 $6 d '9 $2 @@ -11651,7 +11597,7 @@ $2 $8 $3 $0 $5 $8 ^0 ^7 ^8 } z3 -'6$2i6T +'6 $2 i6T *79 O7B 'A ^3 ^< ^i ^4 ^0 ^3 @@ -11666,7 +11612,7 @@ u d '8 $4 $i $v $y $4 $5 $3 i51 i78 -s9]i4r +s9] i4r l ^m ^i $9 $2 $8 ^0 ^6 ^2 @@ -11675,13 +11621,12 @@ C $9 $1 c $9 $9 $6 o1M +0 -2 -2 -} } D1 { $6 $2 $1 ^0 ^5 ^3 f O9A Y2 O43 $0 O02 o3y -rsSjc +r sSj c ^9 ^7 ^7 ^m ^a ^i ^6 ^2 ^8 @@ -11697,7 +11642,7 @@ $9 $6 $8 $0 $5 $4 $1 $7 $3 $p $u $n -s[ai4a +s[a i4a c O14 O58 ^6 ^6 ^1 r $l @@ -11706,7 +11651,7 @@ i11 i12 O04 y4 i4A o1g O16 -^foA"+8 +^f oA" +8 c d $7 $t $h $y $5 $6 $2 @@ -11714,7 +11659,7 @@ $5 $6 $2 -2 -3 -3 ^2 ^2 ^3 i72 i7e -D4] +D4 ] o5U ^1 ^4 ^2 Y2 $0 O43 @@ -11728,18 +11673,18 @@ l o1i ^5 ^3 ^2 ^7 ^1 ^4 *53 O74 -1 -DBz2 -D7*23 -$yo45T5 +DB z2 +D7 *23 +$y o45 T5 d '8 $5 O36 +0 sT6 O03 q -$1o3c +$1 o3c o6N O27 O95 $A -*29o70 +*29 o70 $5 $8 $4 -*50-8 +*50 -8 O65 O96 +0 ^g ^4 ^1 ^9 @@ -11752,15 +11697,15 @@ iBa i5o O7A ^9 ^f i6p -o6d.9sX{ +o6d .9 sX{ -3 -6 -6 $s $w $i $f $t -szxY3 +szx Y3 u d '9 $1 $7 $7 $0 snt -]Y4 -i6t-B +] Y4 +i6t -B c $2 $3 $1 $4 $4 $8 i4, s,k @@ -11775,7 +11720,7 @@ i7M l c ^4 ^8 Z1 $e i55 i56 -*7ArsFr +*7A r sFr oAA o9* ^8 ^d @@ -11786,16 +11731,16 @@ r '6 $9 $1 $4 ^R O57 O56 u -*29.6 +*29 .6 $4 $9 $8 o1e o2d -,8saO +,8 saO ^0 ^4 ^5 ^9 ^3 ^0 $8 $8 $6 -0 -A c $3 $1 $2 -*7Ao9v$a +*7A o9v $a O84 { Z5 y3 O17 $7 $0 $8 @@ -11812,20 +11757,20 @@ o9Y l o0, O94 -8 O09 $4 -KE*7B +K E *7B l Z5 O4A $4 $5 $9 -o9=sKX-3 +o9= sKX -3 u d '9 $2 ^u ^D $2 $9 $2 $6 $9 $8 ^. i0m -,4s+j +,4 s+j ^7 ^1 ^5 ^d ^8 -i4iiAcs&{ -Z2*67sWx +i4i iAc s&{ +Z2 *67 sWx $6 $7 $5 O67 o1i i6o ^s -1 @@ -11833,22 +11778,22 @@ s69 ^0 ^f O18 i79 $9 $5 $0 -*07$Gsk! +*07 $G sk! ^9 ^5 ^2 i20 C $3 $0 -k*20o0f +k *20 o0f $0 $5 $2 -st>R6 +st> R6 '9 $8 -oA%srt +oA% srt o8/ ,3 [ $p $e $a -$c*B8+5 -K*A2[ +$c *B8 +5 +K *A2 [ o7f -*95'A +*95 'A $9 $5 $2 ^5 ^8 ^2 i8$ @@ -11860,24 +11805,24 @@ c d '7 $1 $6 $7 $0 $8 $3 $0 +5 -1 -1 -o0RD7s*M +o0R D7 s*M c $9 $9 $1 u d '8 $0 s>D *79 c ^4 ^6 --6*90 -^qT9sbh -{*15R9 +-6 *90 +^q T9 sbh +{ *15 R9 ^1 ^7 ^7 $0 $8 $5 c $8 $8 $9 C $8 $6 -*0B$@ +*0B $@ c $6 $0 $6 $7 $5 $8 ^8 ^6 ^2 L5 f O25 -ts&yy4 +t s&y y4 $$ OA8 O14 Y3 i3j @@ -11888,7 +11833,7 @@ D7 T0 ^e ^9 +9 -4 ^0 ^a -s8D^d-6 +s8D ^d -6 i71 i1a i71 i7d i6b O71 @@ -11897,7 +11842,7 @@ $6 $3 $1 $3 $4 $2 +1 +2 +2 O62 s2x d -uT7 +u T7 ^0 ^3 ^8 ^3 ^7 ^9 c $3 $1 $0 @@ -11906,11 +11851,11 @@ OA9 +1 +9 ,9 s06 oAo $9 $0 $4 -s`Q'5,2 +s`Q '5 ,2 i6A i6! *30 O93 -i0Ar*93 +i0A r *93 +4 D5 $y $a +1 o0r @@ -11921,13 +11866,13 @@ Y2 o6_ OA7 ^A T6 i30 i33 s97 -L9y3c +L9 y3 c $0 $3 $8 c ^6 $6 $5 $9 $3 $3 $3 $6 $3 $5 $8 -.7R8sdA +.7 R8 sdA ^7 ^e ^9 ^8 ^2 ^9 ^5 ^6 @@ -11936,14 +11881,14 @@ $w $o $n o0K o1o $7 $6 $8 c $4 $5 $0 -z2sZu +z2 sZu O27 *12 ^0 ^7 ^4 *6B O01 O1B r c ^2 ^5 ^8 -sDAZ1 +sDA Z1 $5 $8 $1 $0 $3 $7 $7 $2 $9 @@ -11960,7 +11905,7 @@ $0 $2 $6 $W O59 i1e O87 i32 i37 -iB(o2h +iB( o2h ^2 ^6 ^5 *30 O32 .1 O39 { @@ -11974,21 +11919,21 @@ $6 $6 $1 d O69 ^C oAB O2B $3 $8 $1 -[} +[ } i8z $a O91 $r $i $b $4 $0 $9 ^9 ^4 ^3 i56 i58 -$2*7AT6 +$2 *7A T6 o4c O02 $h $u $m c $3 $3 $5 -o9Ql +o9Q l s'; O38 } -9 -9 -A -o6zsBK +o6z sBK o5/ i76 i51 Y5 O36 @@ -11996,9 +11941,9 @@ ssR D8 o7t ^b ^m O91 i1Q O04 -[srv +[ srv $3 $9 $7 -s]b*24 +s]b *24 c $5 ^5 $8 $6 $9 .B @@ -12010,7 +11955,7 @@ $. ^1 $7 $6 $1 $8 $1 $7 ^6 ^4 ^5 -kR0 +k R0 i59 i79 oBy ^a ^5 @@ -12044,9 +11989,9 @@ scS y5 iBA o0. ^3 ^1 ^9 -K,8 -Y3*15 -o0kk*73 +K ,8 +Y3 *15 +o0k k *73 $4 $8 $5 i12 i11 o6N l @@ -12060,27 +12005,27 @@ o3n [ i4t i5o $4 $8 $4 skJ -*0Ai6ls%7 +*0A i6l s%7 $7 $2 $3 O42 -0 -lT8 +l T8 ^3 ^7 ^1 -,2*62r -sc$*14 +,2 *62 r +sc$ *14 ^6 ^5 ^9 l o1e $7 $8 $1 -*96*40 +*96 *40 $5 $4 $8 o7f O04 ] O15 O5A t { -*A2$! +*A2 $! $5 $6 $3 O21 +1 -*B0Z2 +*B0 Z2 ^Q O05 -o8Gf +o8G f $t $o $w +C -E ^s O14 @@ -12102,11 +12047,11 @@ $r O76 ^A i71 i52 $9 $7 $5 ^5 ^7 ^9 -sgNK +sgN K ^c ^p i1a i1e u $1 $9 $9 $5 --BiB6 +-B iB6 k +1 ^2 ^9 ^6 u -A @@ -12128,13 +12073,13 @@ $6 $9 $3 -4 -9 o5b $8 $8 $1 -$%$% +$% $% ^2 ^6 ^1 *A0 O69 *29 O48 $_ O41 Z1 s_5 snz -o98s6U +o98 s6U ^f ^7 O45 L5 z2 $2 $0 $1 $0 $$ @@ -12146,7 +12091,7 @@ i78 i52 i3K l ^8 ^1 ^8 *BA s%+ OBA -*24sP> +*24 sP> d O1A $8 $2 $6 ^s D4 @@ -12160,17 +12105,17 @@ $2 $7 $6 ^7 ^0 ^2 -4 OAB $2 $7 $3 -^8o63 +^8 o63 $l $u $g O84 O52 -i4-s"d -o66l +i4- s"d +o66 l l $b $a $b $y $6 -9 C $0 $5 ^1 ^2 ^9 $3 $5 $3 -s6{*B8,2 +s6{ *B8 ,2 ^5 ^0 ^4 $6 $8 $3 o5i o6n @@ -12181,39 +12126,38 @@ O35 o6. O59 $7 $8 $2 *BA iB> O73 $y $u $m -sTYk +sTY k $5 $9 $7 T1 TA o0S O51 $! O9B i53 i54 -i2s*B8R6 +i2s *B8 R6 i3x $6 $5 $1 -9 o87 C $7 $6 +0 o33 -*A2.1 +*A2 .1 ^4 ^8 ^2 i58 i56 O59 O72 K $H O47 ^5 ^8 ^4 i7s i8t -] z1 $n $i $p o2R l O02 -$*o9. +$* o9. ^9 ^1 ^5 $9 $6 $1 -oBHi3a +oBH i3a i3a i5e -2 o0d -i5$sq<^! +i5$ sq< ^! $9 $6 $0 $3 $8 $5 D4 o0g -s"[TB +s"[ TB O72 $1 *34 O52 +6 D7 @@ -12221,18 +12165,18 @@ $7 $3 $0 sa4 si1 se3 ^e O3A ^7 ^1 ^2 --4sC! +-4 sC! *02 o1a -s-So92$S +s-S o92 $S i5o i6u $5 $7 $6 $8 $0 $6 $0 $4 $6 --5L6TB +-5 L6 TB ^0 ^8 ^7 c $2 $1 $3 o0f O12 -+5.B ++5 .B $9 $2 $3 $s $o $y ^j +2 @@ -12257,31 +12201,31 @@ c ^9 $9 ^! ^1 $n O71 $0 $4 $3 -L6c*87 +L6 c *87 $e $l $m i4w T5 O09 i4e $r $e $f O02 *20 -*9B^B +*9B ^B $l $y s59 -oB!o6z -smvo7+ +oB! o6z +smv o7+ +D +D +D $s $l $y -sF=$e -D1o45 +sF= $e +D1 o45 +7 -5 -5 -,3-3sw) +,3 -3 sw) ^7 ^7 ^1 $h $a $h OAB *70 u d '6 $6 +5 D6 -s!no78 -$+sbu -$s+5 +s!n o78 +$+ sbu +$s +5 o0t D5 c $1 $9 $4 $7 $4 $4 $6 @@ -12291,18 +12235,17 @@ $3 $6 $7 c $6 $1 $1 +5 $d u k -*29.0s'} +*29 .0 s'} *13 *04 O23 ^K $2 O61 -sk{oB8 +sk{ oB8 ^8 ^1 ^3 -o0r c [ o2z -o2a.B +o2a .B i53 i58 o2n [ -CZ1 +Y1 C $7 $0 $6 u d '6 $3 slp @@ -12322,7 +12265,7 @@ O23 O5B $3 $8 $9 ^2 ^4 ^2 O38 [ -seGY3sU. +seG Y3 sU. $7 $8 $0 c ^1 ^4 +9 -2 @@ -12331,15 +12274,15 @@ c ^1 ^4 *AB *15 O97 i3p *03 ^8 ^7 ^4 -$$$% -scl*56^7 -$+sGp +$$ $% +scl *56 ^7 +$+ sGp y3 c -2 *BA i3f i3a i3a i5d ^e ^p -o3L*29c +o3L *29 c i30 i39 K [ ^K { T0 @@ -12348,11 +12291,11 @@ O83 O47 i7e i7b o0P p5 $8 $1 $4 -o6cs*ps?% +o6c s*p s?% $6 $7 $6 *86 ^w O52 c ^1 ^8 -.2s&l +.2 s&l $8 $4 $3 ^8 ^9 ^8 i41 i52 i63 @@ -12360,7 +12303,7 @@ $o $s $f $d C $0 $3 i55 i58 -*24*A3 +*24 *A3 i6M i56 i76 O92 O7A @@ -12372,18 +12315,18 @@ $6 $8 $0 $0 $3 $6 $l $e $i $8 $5 $3 -o7I]c +o7I ] c C $9 $0 $9 $2 $4 $y t *62 O45 -sX]iA%o6x +sX] iA% o6x ^9 ^4 ^4 -+1-9 ++1 -9 D0 D1 k o1a D2 $b $2 -$@*58 +$@ *58 $9 $5 $7 ^5 ^8 ^1 ^b ^1 @@ -12405,7 +12348,7 @@ O65 sbH $0 $5 $7 O76 o4A sNH -s}%+7o9' +s}% +7 o9' $4 $6 $3 $4 $6 $9 $x $3 @@ -12416,7 +12359,7 @@ O14 i8[ sEb $0 $3 $4 c 'B $3 $3 $4 $9 -iA*r$l +iA* r $l $9 $6 $5 C $8 $7 ^7 ^8 ^2 @@ -12425,14 +12368,14 @@ C $8 $7 o4T $7 $8 $4 $0 $7 $1 -*65E +*65 E d O05 E O25 i8O $5 $9 $2 c $2 $3 $3 $5 $9 $6 -i0h ] +] ^h o1p -2 $r $e $t $e O29 s!> @@ -12441,28 +12384,28 @@ O29 s!> iA6 c $0 $5 $1 $1 +1 +3 +1 -oAl{ +oAl { $3 $7 $3 -R3Y1 +R3 Y1 ^5 ^0 ^6 $8 $8 $2 O09 *94 o73 $6 $4 $3 -0 u c $_ $2 -*04*91^0 -sKgi3p -]scC +*04 *91 ^0 +sKg i3p +] scC i61 i79 i87 i92 $0 $8 $3 --7Y2 +-7 Y2 c $1 $2 $6 $4 $6 $1 c $2 $4 $0 ^z ^s $7 $7 $1 -*54o3h -sJ,u +*54 o3h +sJ, u i1a i1a $0 $8 $4 c ^4 ^7 @@ -12470,8 +12413,8 @@ $5 $7 $0 $6 $0 $5 ^6 ^3 ^0 O13 o1u -svu$B -i0Es?5 +svu $B +i0E s?5 *70 ] c $2 $0 $1 $6 $0 $7 $9 @@ -12479,7 +12422,7 @@ $7 $4 $5 o0< i8' u d '7 $4 -*37*0A*56 +*37 *0A *56 $6 $5 $8 $6 $8 $2 O61 O32 @@ -12500,16 +12443,16 @@ $8 $5 $8 c $? o9u ^a ^6 -s=/$q*27 +s=/ $q *27 o9/ O93 $3 $8 $3 -sBF{ +sBF { $h $a $g -*41*8A -^hl +*41 *8A +^h l ] OA3 y3 O65 -K*0A,7 +K *0A ,7 $9 $6 $7 sm? sZg O81 $6 $4 $8 @@ -12524,16 +12467,15 @@ i5e i5f +7 -8 -9 $@ $2 $0 $1 $2 -7 D6 -'9E OB8 i0D O04 z1 sqg ^5 ^4 ^5 $6 $6 $0 -u*34 +u *34 ^7 ^3 ^2 i1w O06 -T8] +T8 ] ^8 ^e ^3 ^9 ^8 -6 -8 -7 @@ -12547,7 +12489,7 @@ O95 K saU ^4 ^3 ^9 D9 D6 -*34s-x*3B +*34 s-x *3B $8 $2 $9 D5 'B c $2 $6 $2 @@ -12556,15 +12498,15 @@ O91 O14 ^7 ^7 ^8 s9S ^4 ^8 ^3 -oAeL6 +oAe L6 o0v O41 ^1 ^0 ^4 i0z i1a -s"ro4@ +s"r o4@ i9u iAs C $3 $2 ^3 ^4 ^5 -tsZ"} +t sZ" } c $1 $1 $! ^f ^3 +A -8 -8 @@ -12596,20 +12538,20 @@ p4 $k ^0 ^3 ^6 o43 E ^3 ^6 ^3 -,6d -'9kl +,6 d +'9 k l ^@ ^1 -^fsaW.B +^f saW .B o0S s@T O51 c ^8 sre -se^*64o0Z -*76*50 +se^ *64 o0Z +*76 *50 *7B O56 -RA*B9l +RA *B9 l r O65 O6B ^X -sFw-6 +sFw -6 i52 i58 r $0 $9 d '9 $3 @@ -12619,11 +12561,11 @@ C $9 $2 $c $2 $f $i $x $e $r i39 i37 -T7Y5 +T7 Y5 Y4 l O68 -$$sc" +$$ sc" sli -,3s(P.6 +,3 s(P .6 o4J y2 D2 i1D @@ -12685,7 +12627,7 @@ $4 +8 i3e O43 D7 D6 c ^7 ^4 -sGM,6 +sGM ,6 ^9 ^1 ^4 i55 i72 i34 i37 @@ -12695,24 +12637,24 @@ r $2 $0 i3l [ +5 +6 +6 c $. $c $o $m -$BE +$B E *46 D4 +5 -7 -7 -s9{]o7n +s9{ ] o7n i5A -T0sDp +T0 sDp $8 $8 $4 sh3 ^5 ^4 ^6 -*6B^E -R5Z1 +*6B ^E +R5 Z1 i4h D0 c $3 $2 $0 ^2 ^4 ^3 i75 i51 $7 $5 $6 TD -Z1*87 +Z1 *87 $3 $9 $6 ^0 ^6 ^4 ^p *20 @@ -12721,20 +12663,20 @@ i50 i57 ^4 ^9 ^1 $4 $3 $6 ^8 ^7 ^3 -Z3oA;l +Z3 oA; l Y5 O4A O62 o6B $w $i $n $s $0 $9 $3 i50 i72 -iAxZ1i1c -oA.D9 +iAx Z1 i1c +oA. D9 c 'A C $6 $7 -D5sfF -o0Ss}s!'o79 +sr> s!' o79 u 'C $3 -s2ii7 s`$ +s2i i7 s`$ ^H O78 O34 *74 p2 -*3B[ +*3B [ u 'D $8 O25 sL/ Z5 $4 $3 $9 @@ -12821,11 +12763,11 @@ $7 $4 $2 ^4 ^2 ^9 +2 -0 -0 i69 $4 -o1RD9 +o1R D9 *50 O13 -Y2s`X +Y2 s`X O56 { -B -s`}*B0o3* +s`} *B0 o3* p4 D5 c $1 $4 $4 c $2 $3 $0 @@ -12835,7 +12777,7 @@ $s O53 i6a i7s i8d ^F l i3l O03 -s]#iB? +s]# iB? o0? y3 O32 O34 y3 O34 O32 @@ -12869,7 +12811,7 @@ c $9 $2 $9 -A oB8 sf\ O48 -5 -7 -7 -*8B^E +*8B ^E $3 $7 $4 D1 ^d +5 -6 -6 @@ -12901,31 +12843,31 @@ $y $a $m i3k o0d ^S $w $i $g -$1 O51 +D5 $1 i11 i32 $s $q $u $i $d ^5 ^6 ^5 D4 +3 $7 $4 $8 -LBy4 +LB y4 stj s/Z O56 o77 -1 K $9 -o4hs G +o4h s G o3D K O17 ^t ^o ^h 'B $l -z5tp5 +z5 t p5 $s $h $y *5B [ O05 o11 k -cD6*36 -.1T9*94 +c D6 *36 +.1 T9 *94 i5i i6s $6 $7 $2 ^2 ^9 ^5 -$yK+5 +$y K +5 ^e ^2 c ^3 ^8 o0s k @@ -12936,13 +12878,13 @@ u d '7 $5 ^9 ^4 ^6 u d '6 $0 ^J sd' O56 -iB5c +iB5 c $9 $5 $3 $0 $4 $1 $6 $4 $1 i7s T0 O92 o0E -s|^,6 +s|^ ,6 ] ] K $0 $8 $2 -7 OA4 @@ -12950,17 +12892,17 @@ o0R -2 r $? $8 $2 $3 $6 $6 $3 -DB$0 +DB $0 o5f r $2 $4 o9e O72 o6i O35 Z5 O36 o1f u Z1 $i -$_s7j +$_ s7j r $2 $7 $4 $9 $1 -i0W'B +i0W 'B [ i1d $6 $6 $2 $6 $1 $4 @@ -12968,7 +12910,7 @@ $6 $1 $4 ^c ^5 $9 $3 $1 i7* O81 -EY2 +E Y2 ^e ^6 o7K i3c i5a @@ -12980,13 +12922,13 @@ $0 $8 $1 ^1 ^6 ^9 ,3 O63 ^8 ^0 ^6 -*A7$ToBE +*A7 $T oBE ^4 ^1 ^4 $1 $- +A O91 ^6 ^0 ^6 k o0k -iB,{ +iB, { iBT *45 O64 ^3 ^1 ^8 $r $u $t @@ -12997,45 +12939,45 @@ $2 $9 $4 ^5 ^6 ^1 d E D6 L0 ^K -*56sHa -*02-4E +*56 sHa +*02 -4 E $9 $6 $2 $6 $6 $4 ^4 ^2 ^0 ^2 i71 i1e c $3 $8 $0 c $5 $5 $4 -+3D5 ++3 D5 +4 o0t ^7 ^b c $1 $1 $4 s!. OA3 ,B z2 -^q*4A -s-Do0O.9 +^q *4A +s-D o0O .9 $0 $6 $8 $8 $6 $8 c $i $t $e i31 i3e c $1 $3 $3 ^6 ^e -{^xoAR +{ ^x oAR *57 s"7 O51 ^6 ^7 ^9 c $1 $2 $! O24 O67 c ^3 ^9 ^9 ^1 OB1 oBa i7x -i5yT8 +i5y T8 u $3 $2 $7 o8C [ Y2 ^f ^B s3K ssa -.6E*4A +.6 E *4A i4/ -r.3L8 +r .3 L8 o6o OB2 o2x ^3 ^< i51 i75 @@ -13045,8 +12987,7 @@ i79 i59 ^8 ^f +6 p3 o5. O41 -d D6 E -sckiAu$+ +sck iAu $+ OA8 o6+ *49 p3 { D3 } @@ -13056,46 +12997,46 @@ o6( LA O72 l $s $t $y i2t -*A5R6 +*A5 R6 i6l i7o ^5 ^9 ^8 ^7 ^6 ^5 ^7 ^5 ^2 ^2 ^5 ^6 $0 $6 $2 -,6R9sum +,6 R9 sum oB> O61 *37 T1 T2 T4 T3 ^s +3 -*B6D8*67 +*B6 D8 *67 O2A Y4 i3f i3e OB9 s}S L7 -sh(*4B,4 +sh( *4B ,4 ^a ^8 u 'D $7 $0 $7 $3 -s3n^C -o0h+9soI +s3n ^C +o0h +9 soI i31 i37 C O12 i54 O86 T7 i52 i75 -5 D6 -L6s,o +L6 s,o $9 [ -kY2 +k Y2 O13 $x O2A i0k i1e -ss9*8B*02 +ss9 *8B *02 O5B s\E O75 -sq8l$6 -o6-s|3 -sP3i35 +sq8 l $6 +o6- s|3 +sP3 i35 K *65 -sd Y1DA +sd Y1 DA O03 O8B y5 -saZst",8 +saZ st" ,8 c ^2 ^7 sd[ sgk @@ -13108,7 +13049,7 @@ Y5 o1s O07 i5a i5e $7 $9 $4 $6 $9 $2 -i9n${ +i9n ${ $7 $3 $2 ^8 ^2 ^5 $8 $4 $9 @@ -13146,15 +13087,15 @@ i7a i3a *54 O14 k +2 +5 +3 +4 c $0 $1 $0 $4 -o7ysq{sD7 +o7y sq{ sD7 +0 i1O *31 D2 $* $1 $9 $9 $5 t y3 O56 i54 i74 f E -.0*AB -^3i6w +.0 *AB +^3 i6w 'B $9 ^2 ^0 ^6 z1 O07 y3 @@ -13185,7 +13126,7 @@ $5 $3 $9 O02 o1p d '7 $7 o4P l -i6i*27 +i6i *27 i32 i35 $5 $4 $2 c ^2 ^8 @@ -13194,9 +13135,9 @@ $s O64 $7 $9 $1 $6 $3 $5 u d '6 $9 -$)$) +$) $) ^9 ^8 ^5 -.5R1{ +.5 R1 { $9 $4 $2 ^z O13 D2 ^r @@ -13205,10 +13146,10 @@ c ^7 ^5 ^3 ^2 ^9 $4 $4 $9 d '8 $9 -Z1sw(iB) -,0 O4B O85 +Z1 sw( iB) +O4B O85 ^9 ^8 ^1 -D2o18*41 +D2 o18 *41 c $3 $0 $5 ^0 ^5 ^7 $8 $7 $0 @@ -13234,13 +13175,13 @@ $8 $4 $1 u d '6 $1 $b p4 Z2 O75 -o6k*7B +o6k *7B O74 R3 L9 o3w *32 -[d*0A +[ d *0A ^7 ^6 ^9 $n O82 -^LRB +^L RB o9O c $5 $1 $0 O72 O6B @@ -13255,35 +13196,34 @@ c *21 o8K i7m i8a i9n *35 D3 -+4smqZ3 -o8Ko2N ++4 smq Z3 +o8K o2N c $1 $5 $6 { D2 } R2 q ^- $- i51 i76 -i61 E Y1 i7( u $5 $2 $9 $f $r $y -^Ds,W -s-Ui8HR2 +^D s,W +s-U i8H R2 $j $a $w R7 O45 o9a OBA o6d -s}z^L +s}z ^L se@ o4' c $1 $9 $0 $3 i52 i79 -^@.9 +^@ .9 d 'A $1 -*84Y3K +*84 Y3 K $0 $7 $5 -oB3sbs +oB3 sbs O04 ^y -7 i3h O71 -D0sSaT6 +D0 sSa T6 $4 $3 $4 $ $2 d 'K @@ -13297,7 +13237,7 @@ i38 i36 O6B y3 o9f '9 $4 -oAE^F +oAE ^F $6 $2 $3 o3E ^e ^7 @@ -13306,7 +13246,7 @@ K OB9 Y2 ^6 ^7 ^6 ^6 ^0 ^9 ^c ^8 -Y2*76 +Y2 *76 $8 $6 $1 c O53 o5u i2n k @@ -13331,10 +13271,10 @@ sdk ^9 ^e o3l -0 -0 c $1 $9 $4 $0 -D8*3AZ3 +D8 *3A Z3 +3 O06 i7i -o6oK -*76s*v +o6o K +*76 s*v o26 ^A O12 i4H @@ -13347,8 +13287,8 @@ c i42 p3 oA} O61 OB9 oAI Y4 i54 i72 --4i7h -sFg*54*B4 +-4 i7h +sFg *54 *B4 c $8 $8 $0 sEd OA4 $9 $4 $3 @@ -13375,7 +13315,7 @@ DB O37 u d 'C D1 ^g $J O73 $$ -sb}'9 +sb} '9 i32 i3e i4d O34 i37 i38 @@ -13400,20 +13340,20 @@ $_ $7 *24 O67 o8. o3I *1A OAB ^2 ^0 ^7 -sETi8uo0C -*09l$- -i64] +sET i8u o0C +*09 l $- +i64 ] $w $e $l $c $h i2k [ O76 '9 y3 O73 T3 -sn]f*2A +sn] f *2A o9h *1A i79 i54 -D7$" +D7 $" i4l i5i -^C*A3*7B +^C *A3 *7B ] $P i53 i72 syJ @@ -13430,7 +13370,7 @@ $9 $3 $4 r C $8 $9 $2 +8 [ -i99*9BiA5 +i99 *9B iA5 [ o1g -2 -3 -4 $7 $6 $9 @@ -13443,15 +13383,15 @@ $8 $7 $5 $8 $7 $4 ^f ^4 O0A o3f r -$D'B +$D 'B +0 $s $s $o $x ^5 ^1 ^5 -si?s]W'8 -^Jsr_ -D1^4 -^urT6 -Y1i8? +si? s]W '8 +^J sr_ +D1 ^4 +^u r T6 +Y1 i8? C $8 $5 ^1 ^0 ^8 *40 O42 @@ -13459,31 +13399,31 @@ $g $o $t [ o3s $0 $7 $2 ^9 ^6 ^5 --7$Tk +-7 $T k $h $e $m $c $o $b -$_sZx +$_ sZx O83 [ z3 E ^S -sY{*14 +sY{ *14 i6U i9t *35 O23 -sU`Y5s;m +sU` Y5 s;m c $1 $0 $2 o8Y l O28 $x ^b ^6 o1a ,4 O89 -R5oB] -'8o3c +R5 oB] +'8 o3c c $3 $6 $6 ^4 ^6 ^9 O63 k z1 t i79 i55 ^4 ^6 ^8 -o43srl +o43 srl $8 $0 $4 ^2 ^2 ^9 f ^n @@ -13492,14 +13432,14 @@ o69 K si- $e $l $k c $9 $9 $3 -Y1.4u +Y1 .4 u E o6r -Y3DB +Y3 DB c ,7 c $7 $3 $7 -0 D1 -7 D8 -s\Ml +s\M l ^u ^S i1e i1c o5H @@ -13532,15 +13472,15 @@ i4C c 'B $7 Y3 O8A O96 O05 O25 -s,ao7f$O +s,a o7f $O *35 *24 +0 +5 +5 ,7 O05 -o7zsI+ +o7z sI+ o0p +3 ^0 ^2 ^7 ^5 ^9 ^6 -D6*13 +D6 *13 i7p O52 -5 -8 -8 O09 O29 r @@ -13550,9 +13490,9 @@ scg ^6 ^9 ^5 i2J c $2 $4 $4 -Es+P +E s+P i9c -y5l +y5 l c ^2 ^0 ^0 ^2 c $2 $6 $6 E O46 *86 @@ -13565,14 +13505,14 @@ i79 i7e p4 D7 ^8 ^9 ^3 d '7 $2 -*A2o6ts!( +*A2 o6t s!( stp p3 se! ^4 ^2 ^7 $6 $5 $9 p5 O5A o2S E O82 T0 -f'A +f 'A d O79 i6* -0 -1 -3 @@ -13580,32 +13520,32 @@ i6* o8l i38 i34 *01 ^v -$/$* +$/ $* i3e i3f $3 $9 $4 i34 i36 -*0Bi3k +*0B i3k $8 $3 $5 O82 i1j c ^8 ^6 ^c ^9 -s[+o69 +s[+ o69 ^6 ^5 ^8 i57 i53 c $1 T4 '9 $! -*A7-6 +*A7 -6 +6 O42 i6> $8 $6 $0 -*4A$zsV| +*4A $z sV| i56 i79 c +7 $8 $8 $3 -y1E*59 +y1 E *59 [ -6 ^M ] -y1+Az4 +y1 +A z4 ^o ^r ^p u d '6 $7 ^4 ^5 ^4 @@ -13613,8 +13553,8 @@ c $* $1 s0a o1O c $8 $6 $4 -*21oA} -liB{ +*21 oA} +l iB{ i55 i73 $h $i $d $8 $5 $7 @@ -13622,18 +13562,18 @@ $8 $5 $7 ^6 ^f $@ ^1 Y3 O78 -*58o5t +*58 o5t siy ^R O67 $o $a $t c $1 $8 $0 ^7 ^3 ^9 i33 i34 --3c +-3 c ^3 ^1 ^4 i27 [ $s $u $m -]Y5 +] Y5 i5q ^3 ^0 ^6 $8 $5 $9 @@ -13644,16 +13584,15 @@ O56 c u d 'A $3 c ^0 ^8 K o7t -Y1c O32 i5' ] O97 O03 $i O03 o1y i4' O13 i1j -sDP'4*48 +sDP '4 i35 i75 -y3r +y3 r { i0K o3* [ z5 @@ -13661,29 +13600,29 @@ o3* } O08 +1 -3 +1 +3 i4a -iBsE +iBs E -D -D -D -o58i3_*72 +o58 i3_ *72 +0 +0 +1 -+6+A ++6 +A ^4 ^0 ^9 -Y2*A7 +Y2 *A7 -6 O26 -s?]i0R +s?] i0R +1 +5 +5 O57 .7 -3 -9 -9 ^6 ^3 ^6 -oA\o9S*35 +oA\ o9S *35 i7- O43 ^2 ^4 ^9 *B7 sW' O03 -K*43 -*15+A} +K *43 +*15 +A } o6Y +9 -0 -0 ^6 ^8 ^2 --5Z1oBb +-5 Z1 oBb D2 p2 *76 O42 $w $a $d @@ -13698,9 +13637,9 @@ O03 '9 o5_ OBA ^O l D8 o7h --B$) +-B $) seu -iBzo6?u +iBz o6? u ^8 ^5 ^6 sFG y5 O02 @@ -13708,39 +13647,39 @@ O46 c Z2 l k O34 p2 o4m r O3B -sf}i76+8 +sf} i76 +8 O43 d D2 sRE l ^x ^X $x $X ^* $* ^* $* O19 $I -sJXq -lsi/ +sJX q +l si/ O09 O04 s8R i2n p1 O4A i0W O7B -]sU2^E -sqVo2e +] sU2 ^E +sqV o2e ^5 ^d ^r } i79 i53 -^I*9B +^I *9B sc< u d '7 $8 i3h O12 $2 $c -o5 y5 O76 -D9s3- +D9 s3- $8 $7 $2 ^8 ^2 ^9 i3a i3f -*97*87 +*97 *87 $9 *31 OA4 -4 O12 ^k t -*A0D6 +*A0 D6 +1 +3 -0 ,B O6A $Q +3 +5 +6 +4 @@ -14153,13 +14091,13 @@ E ^T o4l D3 O03 d '3 p1 c $1 $5 $3 -sy7*51} +sy7 *51 } ^8 ^7 ^8 c ^3 ^7 i4e O13 -c$1$2$3$? -'Ao0X -o9]*14 +c $1 $2 $3 $? +'A o0X +o9] *14 i73 i53 O28 d '4 Y4 ^7 ^6 ^3 @@ -14192,13 +14130,13 @@ i73 i52 ^1 ^6 ^2 i8a D6 O51 O72 D9 -+6Z1 ++6 Z1 z5 O25 o3X l k O12 -EY4 -sdr*96$1 -L4R3 +E Y4 +sdr *96 $1 +L4 R3 o5$ OA8 $5 $7 $4 i7i O34 @@ -14213,29 +14151,28 @@ l o3e i33 i39 O19 s$^ skt { c { -tY4 +t Y4 o7Z o2k [ [ i4l -R5*58 +R5 *58 O3A $^ *51 O43 *B8 DA -A i9m -*10o0M +*10 o0M i34 i39 -3 *43 O5A ^" -D8Y1T5 +D8 Y1 T5 $2 O42 OB5 ] -Y1C z4 $u O06 -*54Y5 +*54 Y5 -6 -6 -7 c $5 $4 $3 O34 .3 -sG'.3 +sG' .3 ^7 ^9 ^5 L1 o0L *41 O21 @@ -14247,14 +14184,14 @@ $r O73 ^7 ^2 ^6 '9 $c O61 D3 OA4 -s%}c-3 +s%} c -3 o1g D0 ^B s5- -T0*76 +T0 *76 i0d o1h sbp -s}\*85*0B -sYv+6E +s}\ *85 *0B +sYv +6 E .1 +2 sgp $3 $3 $8 @@ -14277,17 +14214,17 @@ i9 $1 ^6 ^8 ^4 o6T i32 i39 -sG|'7L7 +sG| '7 +B O92 c $0 $7 $0 -[i0pTA +[ i0p TA o3r sZ" O91 $8 $4 $7 +B +C +C ^5 ^6 ^4 -R8D3 +R8 D3 c $4 $8 $8 -y5^b +y5 ^b ^X O37 '8 Y3 +A O9A p5 @@ -14307,12 +14244,12 @@ $b $o $p +1 -3 -0 O61 O87 ^6 ^2 ^4 -*B4-6 +*B4 -6 O0B } { s-> -sTbi7mRB +sTb i7m RB s!I -,7D3 +,7 D3 ^6 ^1 ^7 c $1 $0 $5 $m $u $s @@ -14320,25 +14257,25 @@ T0 T8 sxp c $3 $2 $5 i5M -*82^L +*82 ^L *31 O32 p2 O52 D7 -$cp5 +$c p5 soz -^at +^a t ^9 ^6 ^8 +6 -7 +6 -^xsxM +^x sxM ^2 ^2 ^4 i31 i3a -CKs"W +C K s"W O03 $n O12 'B Y1 ^3 ^5 ^4 O48 [ i3a i4n *32 ^s -svTsWw +svT sWw ^2 ^4 ^5 o6v ^Z O06 @@ -14346,16 +14283,16 @@ $5 $9 $4 s9z $$ OA1 i10 i11 ^6 ^6 ^2 -*B9{t +*B9 { t .2 O63 o6C --0^h +-0 ^h $e o9l $n $u $b -RA$`u +RA $` u ^2 ^3 ^4 -,7,5 -s'*s2x +,7 ,5 +s'* s2x $F $m l ^w ^e ^n O13 i1r @@ -14370,12 +14307,12 @@ s1t i81 i99 iA7 iB1 *13 D1 'A $0 -o5S*93s>I +o5S *93 s>I O75 +6 -s`B*89i7! +s`B *89 i7! ^9 ^7 ^8 O45 o5E -D6^MD9 +D6 ^M D9 o8q ^e ^5 o1j -2 @@ -14389,19 +14326,19 @@ c $2 $0 $5 +9 i91 ^8 ^5 ^3 oAx -sN>z2 +sN> z2 O57 sJb O17 *65 D0 -tsf> -DAY1 +t sf> +DA Y1 i79 i56 i0J i1u i2n l Z1 OA8 sH2 O05 O34 O64 -*89loB& +*89 l oB& i56 i71 -*04*02 +*04 *02 o9? OB5 O86 o5b p1 O64 O4A @@ -14410,19 +14347,19 @@ c o5c k ^h c $2 $0 $1 sZT ^2 O4B -i0(sX. +i0( sX. o3H -sM/*95Z3 +sM/ *95 Z3 c $2 $8 $2 -s{XscE -z3*A2 +s{X scE +z3 *A2 c ^3 ^5 i2i O5A $1 $0 $2 $0 -*80D3 +*80 D3 c $6 $8 $6 o0X O7B sYf -s;w^Lo93 +s;w ^L o93 '5 Z1 ^s *41 s0+ O61 @@ -14437,7 +14374,7 @@ c $2 $7 $0 -3 .4 Y5 o9i O5B d '9 $4 -s,aT0{ +s,a T0 { +1 ^l o4y +0 $W l @@ -14451,7 +14388,7 @@ i70 i50 $_ { O95 ^X D3 o0h -R1+0 +R1 +0 o09 k i59 i76 +0 ^i @@ -14459,7 +14396,7 @@ i59 i76 O59 *48 +8 l i39 i34 -oB#Z5 +oB# Z5 o7l D8 o3G l *31 +2 @@ -14469,14 +14406,14 @@ d O63 +5 O62 o6= O75 $e -s=C'5Z2 +s=C '5 Z2 $8 $5 $1 ] ] ] $a c $. $2 ^5 ^5 ^6 $o $a $r [ ^h +2 -*47*91 +*47 *91 $s O94 s84 s82 @@ -14488,7 +14425,7 @@ s J O92 +3 -0 -0 O24 $5 O05 ^j -sE@+3iAr +sE@ +3 iAr O01 o3e -4 *45 Z1 $A @@ -14504,15 +14441,15 @@ c $6 $1 $0 O32 i1e i2V ^9 ^6 ^4 -i7msBS +i7m sBS oAH O76 -$@$$ -{$0 +$@ $$ +{ $0 O67 l -5 *65 *32 c -7 l -+1+A ++1 +A [ o3z y2 O43 y4 $y O94 @@ -14524,7 +14461,7 @@ z5 O27 'A O41 *57 O76 O02 o1z -^TsAk +^T sAk Z4 O24 D2 O48 D2 $4 $d @@ -14532,8 +14469,8 @@ o3( o4& $b u $a O73 -o5mK -o8>Z1[ +o5m K +o8> Z1 [ C '8 $1 E O15 oAP O62 ^G .A @@ -14542,7 +14479,7 @@ u $g ^5 ^7 ^6 y3 +0 O25 ^5 ^7 ^4 -*B0^,sgw +*B0 ^, sgw DB l i5j O45 ^3 ^9 ^3 @@ -14554,9 +14491,9 @@ scf T6 OB9 *02 O42 oBl i6m O91 i5e i7e -*24}o5R +*24 } o5R ^8 ^3 ^4 -s)Cy3 +s)C y3 d O47 i37 i33 O42 .6 ] @@ -14572,13 +14509,13 @@ oAz $6 OB4 z2 O86 ^9 ^5 ^8 -*5B^zE +*5B ^z E 'A $4 c $6 $2 $2 -^i*31 +^i *31 c $0 $1 $3 -*41ss5 -p1*58 +*41 ss5 +p1 *58 oA_ ^2 ^7 ^3 '6 $! $! @@ -14586,18 +14523,18 @@ i5r O23 i4r [ O71 O15 t $7 $3 $6 -*64*19 +*64 *19 C $6 $2 i61 i79 i88 i90 -sjt-8 +sjt -8 *6B O49 O62 *68 u O03 c $7 $7 $6 -s9Ks vZ2 +s9K s v Z2 $7 $7 $3 c ^0 ^7 O02 ^b -$,-B +$, -B c $5 $5 $2 ^1 ^0 ^6 $1 $_ @@ -14606,7 +14543,7 @@ c $1 $6 $6 o6; +9 -7 -8 i0m *02 -*04R7*91 +*04 R7 *91 $t Z1 i4O E r @@ -14618,18 +14555,18 @@ i1o i2t s +$r sV> Z2 O84 *17 -6 soh ^a ^h @@ -15260,11 +15197,11 @@ i1v O72 l ^d ^o ^o ^g o5a O32 $1 $9 $9 $1 $! -shk+7 +shk +7 k ^j -*14sa\DA +*14 sa\ DA O82 o1t -i7Q*43z1 +i7Q *43 z1 O15 *BA E *8A D8 'A $8 @@ -15274,7 +15211,7 @@ o0p o3e o3i *16 ^x ^A -2 i3h -]]]]]c +] ] ] ] ] c ^0 ^9 ^3 c $4 $6 $4 ^8 ^2 ^4 @@ -15282,9 +15219,9 @@ c $4 $6 $4 ^7 ^1 ^8 ^d ^1 ^# ^@ ^! -s`9y4 +s`9 y4 +5 l -KsCu +K sCu s-k O73 oAn ^5 ^2 ^0 ^2 ^d ^9 @@ -15307,14 +15244,14 @@ o8p i8F i52 i74 s76 c -*53T5*31 +*53 T5 *31 i5i T0 $R O79 sb( i4T -2 -7 -7 -y2sJR +y2 sJR -8 '9 Z1 -*90u +*90 u *35 O43 i7s l O31 o3a @@ -15323,7 +15260,7 @@ T6 O37 p2 i33 i37 O03 O64 o81 '9 -,3*A5 +,3 *A5 o3g *30 $d $u $e O58 OB9 @@ -15337,11 +15274,11 @@ o13 -3 O6B ,B o2t k z3 O74 *6A -Cs^G] +C s^G ] } iBB O82 -s[&o6 s0n +s[& o6 s0n O03 .7 -*93^J*78 +*93 ^J *78 +A -B +A ^5 ^9 ^2 ^2 ^2 ^6 @@ -15351,13 +15288,13 @@ i71 i89 i98 iA4 OA2 i96 ] i1F O65 +B Y1 -iAQ*74 -Z2E +iAQ *74 +Z2 E i1e i1a -s'r*73 +s'r *73 O41 *1A R3 -i3d*B0 -sumZ4s&( +i3d *B0 +sum Z4 s&( *74 O32 ^4 ^0 ^7 O95 O47 @@ -15368,21 +15305,21 @@ c $0 $1 $7 $6 $7 $3 ^E O16 ^5 ^3 ^9 -$!$" +$! $" D1 ^b O03 i2t $l O62 i6_ -7 i7T -Y1DA +Y1 DA ] $p -,BszCs3G +,B szC s3G O69 *78 oBL -^RiB* -*81] +^R iB* +*81 ] i9r -^CZ1 +^C Z1 i29 sis O69 O17 y1 @@ -15394,39 +15331,39 @@ c $0 $1 $! [ *23 R7 OB6 +3 -9 -8 -s!O^J +s!O ^J *53 *46 OA9 y2 -*09'5 +*09 '5 $c $4 -smdoB$ +smd oB$ $N { l $x $1 O74 O74 *B8 O04 O31 ] R3 -${s6A +${ s6A D1 o2c i4d i5i T0 i7_ i0b i1a i2l -,7-7s | +,7 -7 s | o4E ^3 ^2 ^4 ^3 ^2 ^8 { s ) O27 -T9{ +T9 { O62 +0 $l { o3f [ -$.$/ +$. $/ OB2 *7B *02 ^2 ^6 ^4 O59 t c $3 $9 $9 -$1y4 +$1 y4 O1A R9 -i46$7 +i46 $7 c $2 $4 $5 *36 O32 i5f i5e @@ -15443,15 +15380,15 @@ $e O53 -1 *12 i4i i5n i6g o8M l -+8sV7 ++8 sV7 E K OA6 i29 -0 L2 $9 $8 $7 $6 -Y2T0 +Y2 T0 D6 ^s -1 -2 -2 i5e i1e -,6*46 +,6 *46 ^1 ^7 ^8 -7 -7 -9 ^5 ^8 ^3 @@ -15461,14 +15398,14 @@ O45 R1 iAi t +D +F ^1 ^5 ^4 -+B+7 ++B +7 ^S OB3 $B O46 *47 f O76 i4l i5i i6n ^p -2 -0 ^d -i8?.0 +i8? .0 r $3 $4 ^4 ^3 ^4 ^m D4 @@ -15478,7 +15415,7 @@ O13 T0 Y3 t O4A *23 -0 ^9 ^1 ^3 -s%,k +s%, k ^2 ^9 ^7 ^4 ^6 ^4 sBH @@ -15486,16 +15423,16 @@ sBH o1K [ i6_ +7 s2- -*20^rs9J +*20 ^r s9J u O45 -^L.Asj+ -*27$6*6B -o1br +^L .A sj+ +*27 $6 *6B +o1b r i9R z1 +1 $1 $2 $! $! $2 $d -y1*A2 +y1 *A2 o0M D3 i5e i3e o4a O3B l @@ -15506,25 +15443,25 @@ O16 y5 O84 O53 u -B s21 iB0 O78 *09 -LAiAu +LA iAu ^d K i59 i73 -i3b*75i9" +i3b *75 i9" O1B $] +5 o37 i34 i38 i5e i1a -oB4iB8L6 -,2sw2{ +oB4 iB8 L6 +,2 sw2 { ^s O52 -+9+C ++9 +C l o5i O64 O39 -o95sB? -C*98 +o95 sB? +C *98 *49 ,8 O03 -0 -s{`^X +s{` ^X q OA9 ^t -2 l D8 @@ -15544,80 +15481,80 @@ o76 K $n +1 u iAt c $0 $1 $4 -*4A$/t +*4A $/ t i33 i35 sgd +0 O32 $p $i $p O68 sdo -0 -0 -3 -[[[[[[c +[ [ [ [ [ [ c s3E -s];k +s]; k c $1 $3 $! O34 'A d '9 $5 s50 -,6i6? +,6 i6? T0 i3s i7| O93 R8 $L $h $i $e -^6] +^6 ] O48 O45 k '6 -*8ALBsK, +*8A LB sK, i8N ^9 ^8 ^4 -^v+5 +^v +5 i1U ^3 ^8 ^5 -i7Pi40 +i7P i40 oBr oBS l c $2 $1 $6 -$Xs{6 +$X s{6 O23 O76 -T4*53r +T4 *53 r c z1 c $2 $3 $6 c $1 $2 $8 -$JskS +$J skS $1 $s $t T9 OA3 -sNu*A8 -i6ds$#c +sNu *A8 +i6d s$# c i79 i89 i95 $k O73 d s]N O5B ^4 ^7 ^4 *54 +0 D1 +3 -o3kR1 -*B3y3 +o3k R1 +*B3 y3 E O12 i59 i77 $n u +1 c $8 $! Z1 O73 -i78s)wo0K +i78 s)w o0K l $- $$ $1 $b $a $h -.8o7z +.8 o7z ^7 ^6 ^4 -3 o4e -$aE -D8L6 +$a E +D8 L6 Z2 +7 *03 o0l ^c ^F $w [ O23 u c $4 $1 $5 -o6Uc +o6U c *40 [ -*43i7VK +*43 i7V K ^9 ^1 ^8 s{- O6A ^@ $@ @@ -15628,25 +15565,25 @@ O85 -7 o5L u ssd oAR l -f,3 +f ,3 *13 *42 c $2 $9 $0 *49 OB4 o3h iBh O65 O02 o1n -]^R +] ^R i1X sip -o9_oB#*98 +o9_ oB# *98 spb -$rsIS +$r sIS o5y O01 i1o i2r i3d c $3 $0 $6 +0 +2 +2 +7 -8 +9 ^8 ^5 ^7 -E$Es7- +E $E s7- Y2 O12 sR( D0 o3m $_ $8 @@ -15662,39 +15599,39 @@ c $8 $8 $1 ss8 T1 O98 *93 .7 -1 ^1 ^9 ^6 -*57$5Z1 +*57 $5 Z1 o0h *12 -^"s!- -iB$iA$y3 -$UR9*B1 +^" s!- +iB$ iA$ y3 +$U R9 *B1 *BA OB4 o0s ^i *30 O23 o9b ^6 ^4 ^7 -4 -7 -7 -*01s6'*63 +*01 s6' *63 c $4 $9 $4 -^mEo8. +^m E o8. -7 o14 ^3 ^4 ^9 C $8 $3 i7a i19 O02 *23 -1 -7 -6 -s8)^H +s8) ^H o5u O61 $8 $6 $7 $j $a $g $a $w $e -sv8.4sFQ +sv8 .4 sFQ ^4 ^8 ^1 ^1 spl $5 $5 $6 $6 o1m *24 [ .A O4A -se9z2*3A -s6@s"\s,q +se9 z2 *3A +s6@ s"\ s,q z3 O15 t +5 ^j O32 @@ -15708,9 +15645,9 @@ c $6 $4 $6 i3o *20 i55 i70 ^A o1h -*14y4*37 -$`,5s`d -*74,As't +*14 y4 +$` ,5 s`d +*74 ,A s't -3 o4i d O76 c $2 $0 $1 $9 @@ -15736,14 +15673,14 @@ i8l i9a +6 -7 -8 y5 } sac -o8Fo6T*19 -} o0g +o8F o6T *19 +] ^g *01 O42 -s})$= +s}) $= c $1 $0 $6 i0e i1l sHT -*A4Y1 +*A4 Y1 O03 $r *10 p2 O1B $3 O61 @@ -15753,20 +15690,20 @@ i53 i75 i7# ^3 ^6 ^8 +3 +4 +4 -sMhoBe$P +sMh oBe $P c $7 $8 $8 -iA4^C +iA4 ^C *42 s+S O97 -1 k -K^oo6d +K ^o o6d -0 -1 -0 *68 Z3 O67 -*B2+6[ +*B2 +6 [ ^3 ^3 ^4 oBo T5 T7 T8 T6 K O91 y2 -+7sUI*79 ++7 sUI *79 $e $w $e Z3 *A6 O27 ^0 ^8 ^5 @@ -15777,12 +15714,12 @@ i0P o1w $8 D9 O57 p1 $2 $0 $1 $6 -s?-*A9 -R7$, +s?- *A9 +R7 $, O86 O51 *43 k $+ O48 r -*91o9[i1c +*91 o9[ i1c c ^9 ^4 O05 *89 ^3 ^4 ^8 @@ -15797,43 +15734,43 @@ q O08 T7 i19 i59 O46 i1a k *03 *41 -*50L6 +*50 L6 c ^6 ^4 O92 +6 *4B -C'8 +C '8 ^5 ^5 ^7 ^1 ^1 ^7 ^2 ^7 ^4 o5s l c $2 $0 $1 $8 -o5vsf6 -*74sI[ +o5v sf6 +*74 sI[ o1D u .0 -co7@sI. +c o7@ sI. +0 +3 +1 o8G l $b $i $b i4J C $7 $2 -$)$( +$) $( ^3 ^7 ^5 -R5*95 +R5 *95 +0 s)T O28 i4i i5n i3n O06 ,8 -i2pc +i2p c o6G o9# O64 o4w u $n O93 -l*32 +l *32 ^0 ^4 ^7 O17 sbl -s0I,6 +s0I ,6 i2s k i7c i7e so! OA2 -*B2+8 +*B2 +8 ^6 ^4 ^9 o6E O12 ^p @@ -15841,8 +15778,8 @@ O12 ^p +0 -7 -1 ^5 ^2 ^6 i8> -s;NR5 -D5Z2 +s;N R5 +D5 Z2 i66 i76 i86 c $9 $0 $1 c $0 $8 $9 @@ -15853,13 +15790,13 @@ c $0 $8 $9 o1l -2 o6\ i58 i54 -$=sKa +$= sKa i0A o6, O2B i7w $m $p i2e i3l ^7 ^4 ^7 -*86-1 +*86 -1 +5 o0N k o1a d O75 @@ -15875,25 +15812,25 @@ i34 i3a O76 Y4 O85 ^J O91 D7 i6i i7e -*18sIsC +*18 sIs C c $1 T6 O51 O03 i70 i55 -*9AE$7 -s|4o5M +*9A E $7 +s|4 o5M c $2 $6 $1 $0 $t O51 i58 i72 ^x c $x r -iAHu*28 +iAH u *28 { sHt c ^9 ^3 O37 $+ z2 TA O05 -uoAh +u oAh c $4 $! O96 *94 r -+As7z ++A s7z ^D y3 O34 c $9 $8 $8 O42 *53 @@ -15902,19 +15839,19 @@ o5; o4t O21 skp o7Y -i9*sfy +i9* sfy o0p *40 -^g+Asg* +^g +A sg* ^w ^t -s {iBs +s { iBs k i1e -,1o0C -CK +,1 o0C +C K ^1 ^8 ^4 +0 -1 +0 +B -9 -9 -s3}$OsQ= -s8QD9 +s3} $O sQ= +s8Q D9 ^8 ^4 ^5 ^0 ^7 ^5 -4 -5 -5 @@ -15925,7 +15862,7 @@ o0k O23 ^7 ^5 ^6 ^0 ^3 ^7 'A $5 -^HsbS +^H sbS c i44 '9 $k O08 y5 O92 @@ -15936,7 +15873,7 @@ i59 i70 ^F sWi O79 *34 OA9 E $a r -]sP\o8W +] sP\ o8W o8P l $h $e $y -6 -A @@ -15944,7 +15881,7 @@ $h $e $y +B -C -C i89 i99 iA9 '5 O02 { -i61i79i89i97 +i61 i79 i89 i97 l O7B O54 D3 l +4 -A @@ -15961,16 +15898,16 @@ $1 i0F C $8 $2 c $9 $6 $6 [ o4s -]p2*9A -{o9Z -Z2s0A +] p2 *9A +{ o9Z +Z2 s0A '8 $y y1 O24 O32 O91 t } c $8 $1 $0 -$DiBx +$D iBx c $8 $1 $1 -*A9^O +*A9 ^O D5 i3o -3 *23 o2e o4& O09 *49 @@ -15978,11 +15915,11 @@ c $2 $1 $7 $1 Y3 i51 i62 i73 l ^i ^n ^i ^m -}p1s1? +} p1 s1? C $6 $4 -6 o56 -$>$< -sk1sG)*68 +$> $< +sk1 sG) *68 i6o O49 i62 i70 i81 i90 c $9 $0 $8 @@ -15993,7 +15930,7 @@ o67 o75 f o1S C R0 D7 o8i -[*B6C +[ *B6 C i70 i7a ^7 ^5 ^4 O64 *02 *A9 @@ -16009,7 +15946,7 @@ c $5 $4 $6 o2b -0 $4 +0 ^4 ^9 ^3 -.6-9-5 +.6 -9 -5 i74 i52 slf O0B i3C @@ -16017,17 +15954,17 @@ i3C i3e *43 O06 '9 o3q DB p3 -i6zshc +i6z shc i33 i36 i10 i15 O6B i3f *B2 -i31-5smO +i31 -5 smO O65 ^l c -*8AsqZ +*8A sqZ ^v D3 ^6 ^6 ^4 +0 *05 -D9*93t +D9 *93 t p2 D9 c $1 $9 $4 $3 O81 E @@ -16035,10 +15972,10 @@ D3 ^p o0c scq o3_ D4 c $9 $8 $0 -E+1 +E +1 ^1 ^3 ^6 i1y O42 -$@$. +$@ $. i76 i52 o1w +3 c $2 $3 $0 $7 @@ -16053,11 +15990,11 @@ s5x scd ^7 ^3 ^5 c $1 $5 $8 -*AB.As.] +*AB .A s.] *24 +2 O92 C sgt -*39o7c +*39 o7c o5` o55 +6 $z O83 @@ -16071,20 +16008,19 @@ O02 *31 ^3 ^9 ^5 sC; O73 sLV -sL*i4@ +sL* i4@ d 'L -s;py1 -Z1 [ +s;p y1 c $1 $6 $8 O67 y1 OA1 $8 $A D0 o3n -*74*21 +*74 *21 *54 i6t -$!$# +$! $# -0 i1l ^2 ^9 ^2 -sIii0Z +sIi i0Z i39 i79 oAh p4 p2 *02 @@ -16118,35 +16054,35 @@ i73 i50 Z5 O4A ^1 ^6 ^4 r '8 -T9-2 -.3s;" +T9 -2 +.3 s;" srh c $1 $0 $! -i6_uT2 -i68*93 +i6_ u T2 +i68 *93 +1 +2 +3 +4 o28 i1O c $a $n $d O15 -8 oBa ^8 ^9 ^4 -sMA^I -sAH,6 +sMA ^I +sAH ,6 O9B R7 o4N { +2 ^3 ^3 ^6 -*30t -i2Rl +*30 t +i2R l i8+ O6A sQ4 *35 r $3 $0 -soyc +soy c i61 i79 i88 i93 l i5t +7 i8I O58 sDM -$Go9nsG_ +$G o9n sG_ o3o +2 i7a i7f y5 O92 @@ -16154,32 +16090,32 @@ o0d ] E *54 i72 i1a i9* ${ O31 -^m.At +^m .A t *43 o4l *76 o6a -.1se+*B8 +.1 se+ *B8 -6 D4 '9 i8r ^3 ^8 ^7 o1C +0 +0 +3 ^8 ^8 ^2 -i01o8A +i01 o8A *05 o0r +5 -0 -0 -*ABo16 -s]|-8 -$7snm +*AB o16 +s]| -8 +$7 snm i1a i72 $l $o $x c i31 -}*A4l +} *A4 l +1 i2g ^K O13 o3V *8A OB5 sT^ O2B TA -lY3 +l Y3 d '9 $0 i10 i12 l o7e @@ -16193,9 +16129,9 @@ i7b i7e o1R D0 +2 -7 -7 ^c +1 -KslQ +K slQ O26 ,9 O0B -*19Y1o4? +*19 Y1 o4? D2 ^m +0 -C l [ ^W @@ -16205,10 +16141,10 @@ o35 C c ^2 ^1 ^0 ^2 o9> i3d c -$;$; +$; $; c $1 $$ i6i l -s'n$, +s'n $, sa4 se3 so0 O5B Y1 t s0. @@ -16226,7 +16162,7 @@ $u $r c $5 $8 $5 c $4 $5 $2 c $3 $3 $8 -o8$^H*B4 +o8$ ^H *B4 ^8 ^3 ^6 c $6 $3 $3 c $9 $3 $3 @@ -16236,22 +16172,22 @@ $_ $9 *43 +2 $o $h $o +7 *73 -sX3'9 +sX3 '9 OB8 z3 oBj c $1 $3 $8 -1 *20 O19 y2 -]i43s9| +] i43 s9| i7e i3e O54 o8n ^1 ^4 ^6 O59 R1 D4 o4p -lo8L +l o8L o2d -0 +4 o0m i11 i13 -$0setK +$0 set K ^9 ^2 ^7 s96 'B +A @@ -16260,16 +16196,16 @@ s96 c $6 $5 $0 s^r OA2 [ l ^o ^t ^u ^a -y4sI7sU] +y4 sI7 sU] -5 o0G -DBy4 +DB y4 l *76 c ^e -ti9k +t i9k ^i O23 -*90^N +*90 ^N $J O3A s!* -l-9*B7 +l -9 *B7 OA2 O54 LA p2 O76 ^3 ^9 ^7 @@ -16279,15 +16215,15 @@ i7S ^7 ^8 ^6 i5b i7b r $4 $6 -s"`*ABo7* -sCxslZ*18 +s"` *AB o7* +sCx slZ *18 $s t $f $a $g c $2 $8 $9 *40 D3 -*59o5j -sVl-2 -$UsTs +*59 o5j +sVl -2 +$U sTs i61 i79 i87 i95 ] i34 O48 Z2 D4 @@ -16307,20 +16243,19 @@ o5g '9 l k i1s l o2o -o0j c i2c *30 o71 t i59 i74 *17 O42 -sOjo1z +sOj o1z i5e O23 r $5 $9 c $3 $0 $9 -i41iA0s&) -sUSi4c +i41 iA0 s&) +sUS i4c ^4 ^9 ^8 c $2 $5 $1 -Y3*3B +Y3 *3B ,6 Z5 O19 ^m -2 sa4 so0 @@ -16328,43 +16263,43 @@ o9g *20 *43 ^7 ^6 ^8 ^r -2 -sr1*32 +sr1 *32 c $5 $3 $1 ^1 ^4 ^8 -i60o9r +i60 o9r i71 i3d *35 *54 *50 *41 i9k -$*$! +$* $! E ^P sae D6 *85 D8 O05 *23 ] O43 -*39,7*A1 +*39 ,7 *A1 c ^e ^h ^T *05 [ i7n O81 $h $k -*81o1d +*81 o1d d O94 o1s c '9 C z1 $y -D5i0T --8.B +D5 i0T +-8 .B ^2 ^8 ^7 O62 i6m T4 T8 -3 t *64 -s0 -E$Y +E $Y D3 o1h -*B2,7 +*B2 ,7 C $6 $5 i3a *35 +7 -9 +8 @@ -16394,7 +16329,7 @@ o2" [ -3 o3J l -8 O86 -s.r^m +s.r ^m i72 i50 D3 *34 O21 o1n @@ -16403,11 +16338,11 @@ O47 y4 O56 L7 O4B $! OB4 c $5 $2 $1 -^*s)# +^* s)# i1i i2s i3t c $2 $0 $7 sxH O36 *12 -*75*1B+8 +*75 *1B +8 i3, $8 $3 $6 sLN @@ -16429,15 +16364,15 @@ O3A D7 Z3 o4= c o60 $_ $0 -Y2oB6y2 +Y2 oB6 y2 +1 o2w o7o O76 .6 -s{`*79 -co6g +s{` *79 +c o6g i71 i53 i7o OB9 c $5 $0 $1 -*A7$o +*A7 $o 'B o9i ^1 ^9 ^4 ^1 ^9 ^2 @@ -16446,29 +16381,29 @@ O41 $9 +8 -7 -6 C $5 $7 D0 i2j -.A*12 +.A *12 O75 $= -$_R9 +$_ R9 $1 $b ^7 ^9 ^4 '9 i8e iB5 -*79+8t +*79 +8 t c $2 $0 $6 O62 O02 *04 +4 O59 $x O93 -sTd*20 +sTd *20 O37 i0J O41 T9 O61 O28 i3i i52 i60 i70 i83 -sAi$^ +sAi $^ ^l +1 o0w *05 y4 O32 skq -$T+8 +$T +8 $4 O81 R6 O91 ^8 ^2 ^7 @@ -16478,8 +16413,8 @@ $t $u $x *02 +5 y5 O67 C $3 $8 -*06$1 -LBo4$t +*06 $1 +LB o4$ t i72 i5a i2l i3o d O29 @@ -16490,12 +16425,12 @@ O12 *4B .B i75 i7a i32 i36 ] ] $o -$*$/ +$* $/ O1A s x ^m -.2Y2 +.2 Y2 r $8 $4 -iAJ$/ -i61i79i89i98 +iAJ $/ +i61 i79 i89 i98 c ^8 ^5 y5 y1 C $4 $2 @@ -16503,22 +16438,22 @@ C $3 $5 i5Y i1e i7e O74 sP{ -[Y3E --8+B +[ Y3 E +-8 +B i3b i71 D1 p1 i55 i79 -$L*2B -^TD2 +$L *2B +^T D2 o0w O39 O68 i7c i7b ^o D3 i9B l RB O82 *B2 -*AB+3 -,Asbdi9G +*AB +3 +,A sbd i9G i1J -sW/.8 +sW/ .8 p3 .3 i57 i72 i30 i37 @@ -16526,14 +16461,14 @@ t O92 O68 s&# t O42 .A OB5 -$#s^K +$# s^K O17 c $| O79 ^& -smw^K -,5i6j +smw ^K +,5 i6j O7B ,2 -loBB +l oBB OB6 $1 ^q sJM OB6 } @@ -16541,10 +16476,10 @@ OB6 } d O64 sC. O57 .6 *79 O9B -s$b^Y +s$b ^Y ^3 ^0 ^8 ^3 ^0 ^7 -^GsJ@ +^G sJ@ o3< ^8 ^4 ^8 ^3 ^8 ^4 @@ -16553,9 +16488,9 @@ o3< ^8 ^3 ^8 O49 +2 i0p t oA" O7A -TAZ2 -l [ ^I -sMg^- +TA Z2 +o0i c +sMg ^- *34 +0 i5g D6 ] $n @@ -16563,9 +16498,9 @@ i5g D6 c $7 $1 $0 c $6 $9 $0 sD+ O48 ^W -*3A^V +*3A ^V o80 T0 -T2sZ] +T2 sZ] i7a i5a *67 o51 } i0S @@ -16574,7 +16509,7 @@ s78 O42 OB5 O78 $m ,3 *37 -y2sG[l +y2 sG[ l *36 O62 +3 -1 -0 O98 O67 @@ -16603,7 +16538,7 @@ $k $e t $d +7 p2 O35 [ i4n -s7Uy1 +s7U y1 O74 i8m s'* O02 o1. O37 y3 *17 @@ -16625,7 +16560,7 @@ o0+ *9A O54 sr. O65 i6a +5 -s6Asx] +s6A sx] *86 o8s p5 *39 ,8 +8 +8 +A @@ -16633,15 +16568,15 @@ p5 *39 ,8 ^3 ^6 ^4 i1e i1b $a OB3 -i1lszksy{ +i1l szk sy{ c $9 $7 $7 o4Q -Ks8K +K s8K c $0 $8 $0 $7 i5R i4s *06 E } -$dsfM +$d sfM i61 i79 i88 i96 i1Y ^m $1 @@ -16652,52 +16587,51 @@ y3 O67 K i5a i3e o0w *14 c -7 -s5Uo0I +s5U o0I sHB -$U*0B +$U *0B *53 -4 -s9dsgl +s9d sgl +3 *31 t $z OB1 sBP O43 y4 -*32E R8 O74 $j $u $g c $3 $1 $5 O03 ^u $] O7A sID -T8+8o0j +T8 +8 o0j } +4 } ^x *20 { $a -$Jo8; +$J o8; ^8 ^7 ^5 ssp o2' $9 D5 -$Eo9* +$E o9* O78 $= i32 i3a ^1 ^2 ^0 ^2 C $5 $2 ^S D2 o33 *31 -$@.6 +$@ .6 $w $o $k -o0[*1A -sCri4@ +o0[ *1A +sCr i4@ o2y T0 i61 i72 i83 i94 -^Rsfy +^R sfy c $8 $8 $6 ^m O32 -]$RsI] +] $R sI] c $8 $7 $6 $G c c $4 $3 $2 -s`5i8].5 +s`5 i8] .5 ^a 'B c $8 $8 $7 -C -E @@ -16716,14 +16650,14 @@ s/Z O94 O75 $f $5 [ *43 c $7 $5 $0 -s^Y,A +s^Y ,A *30 *17 +0 -B +6 $A $u D9 u $o d '6 $1 -L5*03 +L5 *03 ^Z O47 o3- *20 slf @@ -16739,7 +16673,7 @@ i6^ so0 $! o8V l d OB4 -c$1$2$3$_ +c $1 $2 $3 $_ $1 +7 ^5 ^1 ^7 i3e i5d @@ -16747,33 +16681,32 @@ r $3 $2 i52 i60 i70 i84 r $0 $8 c $2 $6 $0 -i8esSW +i8e sSW L5 $R O93 -std*B5 +std *B5 c $9 $5 $9 ] d u +8 -A -9 ^d O32 s}7 O25 o0C -^8sHc-9 +^8 sHc -9 $1 $* c $$ $1 i1T -T8sQvo9/ +T8 sQv o9/ O79 o64 z1 i1_ -i8as\e +i8a s\e s3e c 'B $6 -+9t ++9 t c s)x O46 $! O97 -B $3 -D1{ Y2 O86 $7 O52 oB5 DA -y5sW; +y5 sW; u OB2 *32 *34 ^m o3i @@ -16787,11 +16720,11 @@ O73 T6 .1 O9A p2 i48 +7 O6B ^3 ^7 ^4 -$msDY -.5*A1 +$m sDY +.5 *A1 ^6 ^3 ^7 o8f p3 -lR9 +l R9 O59 $} ses u 'D $9 @@ -16809,30 +16742,30 @@ Z4 iA2 O29 O59 o5g o2R -4 OB2 *49 $< -sv,y1 +sv, y1 i2n i3d i4a -*27+6 +*27 +6 -5 '7 ^% o8P i31 i36 -.1*79 -o2+*97 +.1 *79 +o2+ *97 ^l O41 -3 D6 y2 OA7 l O72 +3 -7 +3 O03 y2 -D6o6QR5 +D6 o6Q R5 sen z5 O26 c o44 oBt D1 o2g s28 T0 -*57o9Ko5s -DAszmsysrmE -R6'8s!8 +s>y srm E +R6 '8 s!8 i5- 'A -Z3szM +Z3 szM +3 -2 -2 K +1 i58 i79 i4o -3 d O84 -o2yi92 -$/s(5 +o2y i92 +$/ s(5 i4r D6 $2 $0 $1 $0 $_ oB+ ^a OA2 -f*05 -o9%.6 +f *05 +o9% .6 .1 O27 -sGK-8 +sGK -8 -3 -6 -3 -s?<.2 +s?< .2 i71 i89 i98 iA6 *51 [ ^9 ^2 ^0 ^2 -*57-8 +*57 -8 [ o0S u d $2 -Ck[ +D1 C o3/ T4 +3 c $3 $0 $4 i75 i50 @@ -17272,7 +17203,7 @@ T1 o08 C *86 O72 o6J '8 $s O43 -$$$! +$$ $! c $3 $0 $1 o2w k $h p2 @@ -17280,16 +17211,16 @@ $h p2 '8 $s o1S c o0t i1a i3b -^VRA -$%s2\ +^V RA +$% s2\ o62 +5 -,4s&n +,4 s&n c $4 $7 $7 .4 Y1 o4a O21 u +2 -.AsuJ -T7Y1 +.A suJ +T7 Y1 ^9 ^5 ^7 i50 i79 o8G @@ -17298,18 +17229,18 @@ snr D4 ^x $1 $E O54 s%g -^`sC"l +^` sC" l c o24 i4a i5k -+A$W*B6 ++A $W *B6 l [ ^O -^Jo9G*0A +^J o9G *0A +1 +1 +7 -Z2i7C +Z2 i7C i81 i99 iA8 iB4 o44 o55 $8 D4 -*68y2 +*68 y2 i72 i80 i91 iA0 o55 +7 i51 i5b @@ -17319,24 +17250,24 @@ $Z $9 OA5 $# l [ o0N .1 .0 -D9$0*74 +D9 $0 *74 o0t ^B T4 siU i19 i35 i9E i19 i36 -^N*48 +^N *48 $y u ^9 ^3 ^4 O04 ^l i5a i3d -s8?^! +s8? ^! O7B O14 z1 l +8 +9 +A -R5^S -*13sw&s'? -o9bsy! +R5 ^S +*13 sw& s'? +o9b sy! +6 +7 -8 c $3 $2 $8 o10 O54 @@ -17344,9 +17275,9 @@ k o1- i6@ D9 +1 +2 -3 c $0 $2 $5 -Y1'9 +Y1 '9 *B0 O61 -*54*67,8 +*54 *67 ,8 R8 ^s O83 si! O32 o0s +6 @@ -17355,41 +17286,41 @@ i2A [ { O01 +0 *79 ^8 ^8 ^4 ] $c -$4 O21 +D2 $4 o0e i1s O4A i1u i61 i79 i86 i95 c $3 $9 $0 -$_$@ -sdwsI3 +$_ $@ +sdw sI3 $v $i $d $a $l k o34 -RAo86o1! +RA o86 o1! -2 Z1 d O62 sRt O47 Y1 O76 O78 --8T1 +-8 T1 o8A O84 *78 O12 ^e *50 O43 oAg -i2x*48 +i2x *48 i54 i71 +8 *78 -swIc --4T7i0d +swI c +-4 T7 i0d O34 Y3 O25 o5q r k o2g u -6 -sOz$C -R4*89Y1 +sOz $C +R4 *89 Y1 ^9 ^4 ^8 scj $4 D7 -sfb[Y5 +sfb [ Y5 d O04 ^2 ^8 ^4 o7_ *76 @@ -17403,7 +17334,7 @@ Z4 O38 O8A i5e i70 ^c *12 i7z -*A6R6 +*A6 R6 O82 *81 o5w O02 ^9 ^1 ^7 @@ -17413,17 +17344,17 @@ E -0 l i8O O47 -5 *53 ^3 ^2 ^7 -$KsDS +$K sDS ^6 ^2 ^7 i7k i8a stj ^d D4 -2 O52 -*72^Gs=) +*72 ^G s=) *90 ] O74 f O39 -^.s+r -.7s*6 +^. s+r +.7 s*6 +2 D5 i57 i71 ^Z O49 @@ -17433,11 +17364,11 @@ i5d i7a +3 *52 O65 i8Q $o $h $m -R6o9v +R6 o9v $, O59 -+9-C -iAV] -$aD6 ++9 -C +iAV ] +$a D6 i0N i1o i2v i0k D4 i61 i79 i87 i94 @@ -17447,9 +17378,9 @@ i62 i70 i81 i97 $2 $0 $1 $0 $? sdn $A $v -sWiss.+9 +sWi ss. +9 s9k -$i*B9 +$i *B9 u ^x $x ^x $x c $5 $6 $2 i11 i17 @@ -17460,9 +17391,9 @@ $n O51 O12 E $l i7E T2 y2 -RBK +RB K c $2 $4 $1 -sL^$A +sL^ $A O13 ^m c $2 $4 $3 O95 o6l @@ -17479,25 +17410,25 @@ o0` sbM O75 -4 D5 i9g i52 i77 -*49sO,*78 +*49 sO, *78 o3s -0 c $2 $2 $! $! c $_ $3 i71 i89 i98 iA5 -*92E^( +*92 E ^( } -7 o4i O59 --6s'w +-6 s'w o2c O31 -i59] +i59 ] i78 i55 -o57R8 -s_'oA"L6 +o57 R8 +s_' oA" L6 i78 i53 $2 O82 O59 O03 -ks^oo21 -{R7 +k s^o o21 +{ R7 c $3 $1 $7 D3 o0S [ C O84 @@ -17525,32 +17456,32 @@ O32 ^e $s o7m +1 O52 i2i i3l -.2iA'y4 -*5Ai4u +.2 iA' y4 +*5A i4u $1 $2 $2 $7 d O34 ,6 O45 ^8 ^9 ^2 k t O93 -KC +K C z1 i1_ O28 i8i i9e iAs i2U c $7 $9 $9 c r T0 *25 ^j -s*;*A2i5q +s*; *A2 i5q i5e i3a O48 o2g O27 -$,sNq +$, sNq *23 *05 -ssgsH| +ssg sH| i42 i53 -A -A -B T0 T5 T8 '9 i8t -Y2*9A -*82E*54 +Y2 *9A +*82 E *54 O85 s|` c $2 $0 $1 $9 c $3 $4 $2 @@ -17564,54 +17495,54 @@ sDZ +5 -4 -4 o2t +3 ^c *01 +0 -KsBRL7 -R3snC +K sBR L7 +R3 snC o6s ^A o0B i64 c $9 $9 $! $! T0 i6_ seo -i0No8Q +i0N o8Q [ $4 K +0 o44 *23 O42 *64 O61 -snul +snu l i10 i19 $! [ -[D4s % +[ D4 s % O61 *AB c +3 ^t *15 sgy -i32i40i51i60 +i32 i40 i51 i60 i57 i73 z4 *59 O16 i4k D2 o3K *02 *B8 ^H O82 +8 -5 -5 -*B8$Ks"t +*B8 $K s"t +3 +A O32 k -Ks1Ss<_ +K s1S s<_ s0p O51 -.2i3r +.2 i3r o11 -6 i7f i7a { T7 c $0 $0 $! O71 OB4 O9B R7 Y1 -iAjsx] +iAj sx] sbj 'A -$zs-? +$z s-? T1 T3 T5 T7 i53 i78 o0Z O6B *68 i6_ *56 o6b -T1*46 +T1 *46 y4 [ y3 OB9 $l $i $n $e @@ -17619,22 +17550,22 @@ r $3 $1 $, O93 i55 i74 i71 i5c -sr?y2*A0 +sr? y2 *A0 $1 $C D0 O23 *30 +8 +A -9 o1H D1 $3 i9# -sa)i9. -]*78 +sa) i9. +] *78 O74 OA7 o5n -5 l c $4 $8 $0 -sEQt +sEQ t i6n l T3 D6 -D8*52 +D8 *52 i59 i75 *47 D4 c $4 $2 $6 @@ -17644,18 +17575,17 @@ o6L $p O92 +1 ^J c s10 -[ ^y ] O06 *38 i7c i7c +1 i1l k O43 c $, $1 +5 -A -i41i59i69i77 -r*94{ +i41 i59 i69 i77 +r *94 { d O27 d '7 $3 -+By1 ++B y1 k o2d ^y ^a ^l ^p O32 [ @@ -17672,7 +17602,7 @@ i6e l Z2 O43 i0y i1o i2u ,2 ,1 *02 -c$1$2$3$% +c $1 $2 $3 $% c $2 $. ] i66 'B $m @@ -17688,14 +17618,14 @@ o8R ^7 ^8 ^5 c $4 $0 $5 o65 +3 -*5B$% +*5B $% ] $l -3 o0G -sS$Z3 +sS$ Z3 i57 i75 *29 O06 ,B $5 T6 -i8qz3 +i8q z3 *04 O21 f o1O l d o4H @@ -17704,28 +17634,27 @@ i2l O48 c 'E $0 O87 y2 O05 O04 i0d -f] +f ] O7B RB Z4 O04 ^3 ^3 ^7 -^Io7bsFR -,5 O41 +^I o7b sFR c $9 $0 $5 sJN -$]o9J +$] o9J k ^M i70 i56 -5 OA2 -*8Al.5 +*8A l .5 } y5 '7 +7 o6_ i71 i80 i90 c $4 $0 $8 -i4isal +i4i sal c 'B $8 -rY4s7H +r Y4 s7H -7 OB3 E -D4+5 +D4 +5 $1 +6 { Y4 i81 i99 iA8 iB0 @@ -17735,11 +17664,11 @@ c $5 $0 $9 T4 $1 o4t D5 *32 i4s -$'sQg +$' sQg O01 i4u o5( O02 $g -o0cy3 +o0c y3 *25 +2 c $1 $3 $6 s6Q @@ -17748,8 +17677,8 @@ $z $x O43 i4@ OB3 D1 $1 i3b i1a -*A0[ -LAEsn9 +*A0 [ +LA E sn9 *65 c i78 i56 i5_ [ @@ -17759,10 +17688,10 @@ D7 o5v i54 i77 *76 $\ O09 *30 o2y -*42EsO< +*42 E sO< [ O21 *29 O02 i5e -*25toB" +*25 t oB" o5j *50 sgj ^f *21 @@ -17772,7 +17701,7 @@ c $_ $8 o6[ c T6 T8 T2 T4 ^k ^o ^o ^b -*B2i56 +*B2 i56 sa4 so0 si1 Y5 O91 o0- @@ -17787,22 +17716,22 @@ i8x '9 c $9 $4 $4 c $7 $7 $9 i13 i13 -iBAkp1 +iBA k p1 C $5 $8 c d '9 $1 O93 c } ^j o5% -[s\e +[ s\e *20 p2 O14 *78 O38 *18 c $5 $6 $4 c $8 $4 $4 l ^u ^e c $1 $9 $5 -i8K,B} +i8K ,B } ^q +1 -ssXs4o +ssX s4o i6a l $E O83 ^5 ^7 ^5 @@ -17812,33 +17741,33 @@ o5k D7 p5 O68 ^2 ^8 ^6 ^4 ^3 ^8 -o70i7z+8 +o70 i7z +8 ^9 ^3 ^8 *15 +3 sl% sl@ t -7 -s"-Y3*A8 +s"- Y3 *A8 o8r O71 i2Z -'8$#sU- +'8 $# sU- i12 i34 r $7 $4 ^7 ^5 ^8 i9q -+8s-v -i24{ -^Tls @ -o4NsYx*8B ++8 s-v +i24 { +^T l s @ +o4N sYx *8B .8 O02 O1B [ i15 -.4o6K +.4 o6K svp *72 O42 o68 *A5 O67 O97 -*38o10o9H -D2^J*89 -]qsqj +*38 o10 o9H +D2 ^J *89 +] q sqj iAt 'B O63 i18 O05 ^w @@ -17848,40 +17777,40 @@ O01 { O3B i3\ $m K O71 K -C*25 -s";.5 +C *25 +s"; .5 i1a i2i i3n -*87o4x +*87 o4x i32 i73 l ] $x -6 [ $B $d O2A y4 *0B $1 $9 $9 $0 $@ -$w+B +$w +B $4 -9 O42 *13 o75 t -Z1i9j +Z1 i9j iAk O82 -D6*B7 +D6 *B7 u $p -+8t*90 -.B*8Asb= ++8 t *90 +.B *8A sb= -6 O82 $y $u $k --Bs$_$T +-B s$_ $T +1 o0b O26 O46 i1j *14 ^t +5 s36 $` l -^1*18 +^1 *18 -4 Z1 O9A O15 -sqkDA +sqk DA +F +F +F -,1s}% +,1 s}% q O18 sQX +0 -9 +1 OAB O34 @@ -17893,17 +17822,17 @@ i8b $2 *59 O96 *B7 q O8A +8 -3 -3 -o7_s>1 +o7_ s>1 Z1 o0K +0 -1 +9 -sdfDB -o6A*94 -s0AsXGs-y +sdf DB +o6A *94 +s0A sXG s-y +0 -2 +0 O06 p2 ,3 *31 Z1 sSZ ,3 -uY1*89 +u Y1 *89 O97 ^i Y4 O16 ,3 Z1 *31 @@ -17912,7 +17841,7 @@ k i13 [ r O02 i62 i70 i81 i96 i8V -R7*90 +R7 *90 i41 i59 i69 i73 OB5 o1L O01 O43 *A2 @@ -17923,13 +17852,13 @@ O49 se1 +B l .4 k ,2 *34 -cY3 +c Y3 { o0G i1Z i58 i78 o7> d O95 -uls,h +l s,h O12 $s *27 +5 -1 -0 $. OAB @@ -17945,21 +17874,21 @@ i57 i79 ,8 OA1 o5n O86 i7H s8@ -*46*92*A8 -slFi77 +*46 *92 *A8 +slF i77 o88 +9 -sc[^V +sc[ ^V ^y O32 +5 Z1 ^7 ^0 ^8 ^1 ^1 ^6 *81 O63 -siks];D9 +sik s]; D9 ] [ k -$#$! +$# $! +4 *23 ^4 ^7 ^3 -L7c +L7 c i5_ ] i5S ] $0 @@ -17968,39 +17897,38 @@ D2 ^f +8 '9 $3 $b ^A +1 -Y3iBR +Y3 iBR i72 i59 -i6Rs"/ -*79o1r +i6R s"/ +*79 o1r sZ\ O36 *53 s0- -.5*78 +.5 *78 C $7 $3 sm) sbe O69 c $4 $5 $1 d O56 *79 O21 -i31i49i59i65 +i31 i49 i59 i65 p5 $G o9# i72 i80 i90 iA0 -s\9o7xs]3 +s\9 o7x s]3 u .3 -*51sqx +*51 sqx $c O73 E O15 o08 D9 t *1B sSB -L6p1 +L6 p1 $6 *9B -o8TsT@ -O02 ^A +o8T sT@ c $8 $0 $9 +2 i2d *54 O23 -*43s?. -sk6*81] +*43 s?. +sk6 *81 ] $p $a $p ^7 ^3 ^8 i2y i3a @@ -18029,12 +17957,12 @@ c $4 $0 $1 l O53 c $1 $+ $c $5 -T7-1 --3Z1 +T7 -1 +-3 Z1 Z1 O36 o60 -*79i2x,6 +*79 i2x ,6 iBb -oBmo0c +oBm o0c O18 ] p3 i4c OA5 *04 @@ -18046,15 +17974,15 @@ i3n l *62 O03 $6 $^ c $1 $2 $7 -+Bz3 ++B z3 i7a i5e o7H -*03iAT +*03 iAT d '7 $9 -*86sgo*69 +*86 sgo *69 sso K $X -s^YTA$D +s^Y TA $D $s $e $w i61 i79 i87 i99 O13 Z1 @@ -18068,32 +17996,31 @@ c $0 $2 $6 o4A c i72 i80 i92 iA0 smz -*97s\xi4h +*97 s\xi4h *65 -5 -R0sONi0i +R0 sON i0i d O06 -1 i1l s'S O15 -^1 O17 o6@ $1 *46 +4 O8A *A6 o2+ d 'A $2 o2o i2j o2b [ -s|0}st2 -.5s0a +s|0 } st2 +.5 s0a u d $8 t o70 T2 o02 i97 OA3 Y1 -i71i89i99iA7 -s-1^Ks5c +i71 i89 i99 iA7 +s-1 ^K s5c ^d *64 i2q D9 o7a o0z O13 -s@3o3l +s@3 o3l O62 O72 s^; f *02 o5P @@ -18103,7 +18030,7 @@ Z5 '5 { O02 +6 O02 so0 T1 c i71 -s>ql$J +s>q l $J O43 oBU +5 +7 -8 -6 *73 O52 @@ -18112,9 +18039,9 @@ C $5 $1 O34 t k o2l i81 i99 iA8 iB3 -i84T4 +i84 T4 c $5 $4 $0 -s.7*7B.1 +s.7 *7B .1 ^B l O42 i7e i5a o4m +0 @@ -18123,8 +18050,8 @@ $5 -8 *40 *89 c $2 $2 $2 $4 O08 E $9 -$4y1l -o8i*7A +$4 y1 l +o8i *7A i54 i5a T1 +0 l $7 $7 $7 @@ -18133,23 +18060,23 @@ $2 $0 $1 $7 c $7 $1 $3 q s{c O48 +1 O23 -*B7^g +*B7 ^g $9 $9 $! $! $k $e $g [ $. c $4 $4 $3 -s1i*82 +s1i *82 *B9 'A +0 i2j c $9 $7 $8 -*76i0- -o25R4oA! +*76 i0- +o25 R4 oA! l $6 $6 $6 c $x ^x ^X $X y1 OA4 i1u i2n i3t -^Ls^!*78 -{i7Ep2 +^L s^! *78 +{ i7E p2 +3 -4 -4 i62 i70 i81 i95 i41 i59 i69 i74 @@ -18157,18 +18084,18 @@ c $0 $9 $1 i2W i71 i89 i96 iA0 i2L -,9y5 +,9 y5 i7a i8r i9t d i3, O07 i6a i7r i8t --Ai3y +-A i3y c $8 $9 $9 s0H i13 i11 o2c O41 -2 l $f $9 -spksa_*B9 +spk sa_ *B9 O25 p2 K O28 r ^o @@ -18178,8 +18105,8 @@ o06 +1 i7= i3B l $8 $* -,9Y3i4m -$d+9 +,9 Y3 i4m +$d +9 T0 T7 T8 [ i5i O52 *41 @@ -18190,7 +18117,7 @@ O39 *15 s.9 l $8 $8 $8 O43 i4@ -sDM[ +sDM [ l $3 $3 $3 i5c i7a *98 O95 @@ -18202,16 +18129,16 @@ $c $6 $7 D2 ^2 ^4 ^8 D9 O81 +9 -o8_*39y5 -*8AZ3sim -sP(z2 +o8_ *39 y5 +*8A Z3 sim +sP( z2 O12 i2k -K.5szM +K .5 szM +0 i4z ^M +1 } ^P c $6 $6 $2 -Y1sJ&l +Y1 sJ& l *93 O61 ] c $6 $7 $7 ^4 ^8 ^6 @@ -18219,13 +18146,13 @@ o2l T0 i71 i89 i97 iA3 } ^l ^1 ^3 ^7 -ss9snl*36 +ss9 snl *36 sUH *7A OB4 O95 i9y *91 o1a i3Y O45 *12 -o2wso0 +o2w so0 $1 $5 $1 $5 i61 i79 i88 i91 O54 p1 O9A @@ -18239,33 +18166,33 @@ $2 $4 $0 $4 c ^1 ^0 ^0 ^2 O52 D9 o6P -*90*04 +*90 *04 *93 ] O61 $t $u $g *56 o5d O05 *B5 Z2 o4C -+2K ++2 K o4( Y5 K OB7 --Ao6h +-A o6h c $. $3 -o7?^O*82 +o7? ^O *82 Y2 O15 s Q Y3 O86 -s%9y5 +s%9 y5 $f $4 o37 o11 o6l slD -$o-9 +$o -9 i4t i5h i6e i7D i62 i70 i80 i91 C $3 $6 +9 +A -8 --5*82 +-5 *82 s5M O14 -$Bs]{ +$B s]{ O15 '3 ^2 +8 D2 i6e ] @@ -18274,7 +18201,7 @@ c $3 $3 $3 $6 O28 O17 ^o D4 *57 o0K -i7Is!W +i7I s!W -4 O03 +7 l s52 -6 @@ -18284,29 +18211,29 @@ O86 O48 -C -D -D D7 O04 y4 si/ -s+0*3B$^ +s+0 *3B $^ c 'C c $4 $5 $8 O92 Z3 --6+A -].4 +-6 +A +] .4 O7A i8l ^7 ^9 ^7 O03 +2 $j $a $b $0 $1 $0 $9 -EKsv> +E K sv> +9 D7 -syUsWGs8c +syU sWG s8c i5c i3a -T9s6;i7h -iB]Z1 +T9 s6; i7h +iB] Z1 $p Z1 OA1 i0Z O06 -.6T2 -oB"ss.sWf -*01,B$l -^I*0B +.6 T2 +oB" ss. sWf +*01 ,B $l +^I *0B +5 -2 +5 ^G E i5b i5b @@ -18315,34 +18242,34 @@ o6p $s -0 i2t O32 snY -4 i1A O41 *34 -$z*89 +$z *89 sLG *02 i3p [ s=d O67 $2 O63 i50 i73 c $2 $0 $8 -*63[i7< +*63 [ i7< $, $1 T0 $6 $ $3 u $t -sKG'B +sKG 'B ^C -4 o4X $2 $0 $1 $8 -oB"o8e +oB" o8e o13 t -*2B^Msr1 +*2B ^M sr1 $f $8 +0 +D $k O92 -Z1szIiB2 +Z1 szI iB2 y3 OA1 +D -F c $2 $3 $9 O93 O82 O96 -*95}o3r +*95 } o3r i19 i33 D7 } O58 ,5 O25 @@ -18350,34 +18277,34 @@ O13 ^e ^c O05 *76 O74 c $3 $0 $7 -*51{,A +*51 { ,A O01 o1a *18 O0B -3 -9 -5 -i0o*A9'4 +i0o '4 OB9 O15 O82 i3c i5e D2 y1 o32 *32 O35 o0k -$2sTL +$2 sTL u 'D $3 +2 +3 -0 $d $i $d -^l}^z -i6!*56 +^l } ^z +i6! *56 O81 o8s +9 o8i c $5 $3 $0 o4V +4 O03 ^x z1 -,5y3sJ% -z2*28 +,5 y3 sJ% +z2 *28 i0m i1e OA5 $_ i73 i7a -s!V^ZTA +s!V ^Z TA o4, $1 $9 $0 $3 *10 o1. @@ -18386,36 +18313,36 @@ O31 t s5( *98 +9 i41 i59 i69 i70 z1 i1i -DBD6 +DB D6 -8 -9 -A O52 p3 r $2 $9 -y1*0Ai7w +y1 *0A i7w d O35 -o9D],2 +o9D ] ,2 y3 O45 i1S -i4-$h +i4- $h K .1 ^9 ^4 ^7 OAB L8 scj E $o D5 *45 ^6 ^9 ^8 -^y$0 +^y $0 $1 ^. ^d ^h T5 } -s/,y4 -R6^F +s/, y4 +R6 ^F ^8 ^3 ^5 -o6.*A6s'\ +o6. *A6 s'\ -4 *02 +4 O62 O93 O08 i79 i5e o7$ s$b -,6Es]v +,6 E s]v i19 i39 i61 i79 i86 i94 *02 ^y @@ -18426,30 +18353,29 @@ c $4 $6 $8 } O06 *34 o2t o8u D7 -o48K.9 +o48 K .9 o37 *20 -s2A$\ +s2A $\ ^a *20 ^S +1 +0 -1 +2 -z1s6G +z1 s6G -5 *75 *56 ^M O85 *68 -o9rsbm +o9r sbm +3 *42 O28 s( +5 Z1 p5 *A9 -,A*45 +,A *45 *31 O46 *52 O04 c $1 $_ T2 T3 T8 O35 Z2 -^u O12 $t $c i73 i5a +7 O02 -'B*85shl +'B *85 shl u 'E $8 D5 $7 } O56 @@ -18460,7 +18386,7 @@ y5 OB1 s4T i1. i3. i5. i7. i9. $b $3 $0 $5 $1 $1 -{sT, +{ sT, +3 ^p sk? -0 *04 @@ -18469,7 +18395,7 @@ sk? *68 O42 O4B ^v O61 p2 O29 -*02scB +*02 scB D3 sea i6i i7c i8a ^t O43 @@ -18488,58 +18414,58 @@ s-_ C $p *76 o6g $@ O05 -$ksS^ +$k sS^ *34 o0z -$>sf,o8% +$> sf, o8% ^3 ^6 ^7 o5< -i5p,7 +i5p ,7 i1a i1c ^1 ^8 ^5 i5U +3 +7 -6 Y5 s7+ O14 O21 O01 spb -*10$c*28 +*10 $c *28 c o0t Z2 $1 -^g.1 +^g .1 ^v ^S OA7 O37 .2 -s9ylZ1 -*59*43 +s9y l Z1 +*59 *43 i2$ O05 d 'A $9 ^A D7 -$WRB +$W RB i56 i73 O35 o0w s8_ sEg OA2 o8y +1 +3 +9 i61 i79 i88 i98 -sT]*07} +sT] *07 } *51 -3 c $0 $1 $1 $5 $A { +6 -3 -3 -oB&so1 +oB& so1 *A8 O59 -*52T6] -$!$$ -,9$m -$(sA[ +*52 T6 ] +$! $$ +,9 $m +$( sA[ s2a *74 ^y O05 -.3*A9K -]lszZ -*72+9s(? -*A4^m -*86]l +.3 *A9 K +] l szZ +*72 +9 s(? +*A4 ^m +*86 ] l -3 O52 -$Cs = -i5V$x -Y5] +$C s = +i5V $x +Y5 ] +1 -8 +1 $l $y $e [ o3_ @@ -18548,10 +18474,10 @@ r $7 $5 $1 $9 $4 $9 O23 o2n i4w O03 -dswG +d swG -7 z1 D2 i9i iAe -o60*24 +o60 *24 i9l iAa f O83 s15 sxq @@ -18560,7 +18486,6 @@ s5R i62 i70 i82 i96 d O6A c $5 $0 $3 -D2 $4 +4 -8 -8 *61 O62 c $1 $# @@ -18579,7 +18504,7 @@ c $2 $7 $5 c $1 $7 $8 c ^7 ^7 ^9 ^1 $1 $d -o13iA+ +o13 iA+ i2s i3o i11 i19 o6l l @@ -18588,7 +18513,7 @@ i5a i79 l [ O12 Y2 D4 d -u]*B3 +u ] *B3 iBk $C OBA ^g O23 @@ -18600,11 +18525,11 @@ s80 +5 s26 l O42 *34 T7 T9 T8 -*89D6 +*89 D6 +2 +3 +2 '5 z1 -R0*87$u -*8A]s&s +R0 *87 $u +*8A ] s&s [ o4t $1 $? snv @@ -18614,7 +18539,7 @@ i7R O3B k s5a +1 -6 +3 O65 OA8 -.6D4 +.6 D4 z2 o1u i78 i59 i5a i70 @@ -18626,30 +18551,30 @@ i26 $n ^M *67 -5 i57 i78 -*25i4E +*25 i4E Y4 O14 +0 +2 -3 D9 l stZ Y5 Y5 O39 -1 -2 -3 -4 -z3siGR8 +z3 siG R8 o5\ -y5*BA +y5 *BA +A -8 -9 } -9 } -*61$7 +*61 $7 [ o5u *71 O03 ^j z1 -*0BiB. +*0B iB. q ] [ i75 i59 O07 c s+@ i7v .5 -3 O63 y3 -]iBH +] iBH u O48 sfj $4 $! @@ -18661,32 +18586,32 @@ $k { $l $u $m $p t $h o6y l -*78*20s2j +*78 *20 s2j k i2v i5e i74 $C O62 i1a i2k i3e *01 i3- [ c $5 $0 $4 -+1^kc ++1 ^k c +7 *65 z1 O08 i61 i79 i86 i93 k -6 -*38i33'5 +*38 i33 '5 sfF $f $3 *34 o4d o3h D2 -*0Asbl +*0A sbl i1n u ^1 ^9 ^3 O67 c O41 -R9snf +R9 snf i7d i73 -*A7y3 -i65L8o9t -sRvTAo2E +*A7 y3 +i65 L8 o9t +sRv TA o2E sbn d O38 O64 c $@ $7 @@ -18695,22 +18620,22 @@ o2g O51 i5s c ^n -1 o2k *01 -]$H +] $H +5 -7 -6 i51 i3a i81 i99 iA8 iB6 -Kc +K c ^7 ^2 ^8 -T9y3 +T9 y3 i3d i7d D3 ^z i56 i78 -K}^5 +K } ^5 O6A z3 $m O72 i5b i7a *60 D6 -R5o8rE +R5 o8r E o62 *56 r $8 $3 $1 O72 @@ -18720,11 +18645,11 @@ iBo o6t l y3 D6 { p5 Z1 -$-$. -$)*73 +$- $. +$) *73 O04 ^r .2 *12 -{T2 +{ T2 *25 O02 +B l O23 l o5n @@ -18732,25 +18657,25 @@ s7t k O61 i3d i1a o4Y c ^1 T7 -*8A+8o6S +*8A +8 o6S sm? ] $g z1 *02 -sNLty3 +sNL t y3 i5_ O64 -$Csq. +$C sq. O49 $[ D3 Y2 -RBi7*,A +RB i7* ,A -1 $b -K+0 +K +0 $d $u $h -,1E +,1 E *43 E D8 ,3 O43 i31 i3d O82 -5 -T8sgvR7 +T8 sgv R7 $f $6 d O97 O04 O28 @@ -18760,7 +18685,7 @@ $w { [ *0B o2z O79 c $1 $7 $0 $3 T0 T5 TA -R8$S +R8 $S i7U i78 i7e O74 +7 @@ -18769,19 +18694,19 @@ c $7 $9 $8 $U *7B O1B i1s *13 $m $a $w -*58D5 +*58 D5 i4, snp -[sY4o8- +[ sY4 o8- D0 O43 -$bsZr*12 +$b sZr *12 c $2 $8 $0 O2B T7 o13 -sl`s-po9Y +sl` s-p o9Y i50 i77 iA_ s2? -s6iusM= +s6i u sM= $7 *03 [ c $5 $5 $8 o0s l @@ -18790,7 +18715,7 @@ $5 *75 O63 D3 ^c ^h o2y u d 'A $8 -sDQy3 +sDQ y3 u d 'A $1 r $! +9 [ @@ -18823,9 +18748,9 @@ $r $y $e smr *42 sAB *34 o39 -$Qs$F +$Q s$F c 'E $9 -s\)$isn\ +s\) $i sn\ i4o i5n +5 D1 $h $e $p @@ -18835,19 +18760,19 @@ c $7 $7 $! p3 [ $y $e $a o0# -*0Bsdp +*0B sdp s!8 s6. -i64*B0 +i64 *B0 D7 o4e i6a i7s +0 +8 +8 i7P u -} o0k +] ^k $l $e $s $s f O93 .4 ,6 -*54E+4 +*54 E +4 i7C O04 +A ,9 o6h @@ -18855,24 +18780,24 @@ Z5 O5B O8A c ^1 ^# i6h O7B i58 i70 -,9o4. +,9 o4. *30 *43 r $7 $9 i5e i3d -*AB^s +*AB ^s *32 $1 l ] $h --5RA +-5 RA $z $e $d -.7q +.7 q s5S o8z D7 +B -0 D3 O62 O54 O62 suo -Ci0R -o6 *BAi9? +C i0R +o6 *BA i9? ^j O34 O42 ^K c $0 $8 $8 @@ -18883,13 +18808,13 @@ o8) szs $q *53 O8A c $0 $3 $3 -ER5 +E R5 c o20 ] o5l ] O17 i5e l r $8 $2 -i9hY5 +i9h Y5 O58 [ +C -D -D [ *53 @@ -18897,17 +18822,17 @@ O82 $t O52 ] c ^9 ^0 ^0 ^2 O71 *58 D5 -*81L9D1 +*81 L9 D1 i3t i4y *56 *76 -s"6Ek +s"6 E k i5L '7 r ^J O79 o3@ *39 O52 *02 -sB-*58 -o17*67 -s!+$F +sB- *58 +o17 *67 +s!+ $F oBk O94 *3B o64 l ^X ^X $X $X @@ -18927,18 +18852,18 @@ i96 ] i8s i9o iAn r $m $r $o $e -o47*59 +o47 *59 $2 O53 ^< +1 +C -*31-6 +*31 -6 i0m i1c -*B5,AsOP +*B5 ,A sOP i3y O0B -oAosDH +oAo sDH Z5 y3 O48 i71 i89 i97 iA5 -*9Bi6u +*9B i6u { $l *17 +7 O81 -8 @@ -18949,38 +18874,38 @@ $. ,8 OB7 $u O62 O78 *45 { $3 D7 -sy)LAo31 +sy) LA o31 saR c $1 $4 $8 ^2 ^9 ^4 ^1 -i9jy1 -RA-9i7m +i9j y1 +RA -9 i7m +3 -7 -0 +4 OA6 s2' O07 i5 O27 L6 *32 -*53*89 +*53 *89 C $8 $0 [ i0P O62 o9K -s*|Z3*1B +s*| Z3 *1B *36 D5 snc d O36 E ^F i10 i17 d O16 -o9r$E +o9r $E c $9 $8 $1 *43 *12 -$;$) +$; $) i77 i7e ] Z1 -2 c $5 $4 $2 -.8Z1 +.8 Z1 i12 i32 ^J O63 -sL$,B$. +sL$ ,B $. o3i c .7 O41 $= O74 s;x @@ -18989,7 +18914,7 @@ $= O74 s;x D0 iA4 Y3 O54 $s $o $p -{R9c +{ R9 c i78 i58 +7 -1 +7 i19 i32 @@ -18999,7 +18924,7 @@ i86 i96 iA6 ^p O15 c $1 $9 $6 *71 O02 -*A5z3y3 +*A5 z3 y3 o50 Z1 i4- O02 O34 i5] y5 @@ -19010,9 +18935,9 @@ scx o5g O02 i52 i60 i70 i80 t o7d -]iB(*98 +] iB( *98 o7, -stQo8B+5 +stQ o8B +5 ^n D4 o7E t i3* @@ -19027,7 +18952,6 @@ o39 *71 +5 -4 +5 O71 o8e $4 $6 $4 $6 -c 'B ^v +2 i64 i76 O02 +3 @@ -19038,7 +18962,7 @@ o5h O95 '6 i5p o4z *18 O2A c $5 $1 $6 -]sG"*7B +] sG" *7B i5k o6e i71 i89 i96 iA6 -5 O76 @@ -19055,31 +18979,30 @@ i1a i1b y1 O04 Z2 i1o O52 O12 Y1 y5 -i31i49i59i66 +i31 i49 i59 i66 iAh $3 $2 $1 $! -o43'A +o43 'A sjY c +5 *08 [ -{*95TB +{ *95 TB 'B $1 *24 -4 o2t +4 --Bi0O +-B i0O o1L [ $1 ^* u d $3 +7 i7_ i5i i6n iBd -*80i72 -i0QK -,7i9M +*80 i72 +i0Q K +,7 i9M *68 -6 d O83 -[ ^d -*80+5seS +*80 +5 seS *B9 O83 +5 -7 +5 sSZ @@ -19090,11 +19013,11 @@ $6 { O38 p5 i9p k *21 -$.$? +$. $? p4 t O35 O12 +2 c 'E $3 -.7^a +.7 ^a $r OB7 ^4 ^9 ^7 ^V O48 @@ -19107,64 +19030,63 @@ c o73 r $7 $2 i7e i74 i5e i3c -*43{ +*43 { -1 O32 O71 Y2 T0 i5x O32 *67 o75 t +9 -*49,Ay1 +*49 ,A y1 i2l i3e i4n l o5f ^d O42 i12 i33 u 'E $2 O13 q -*14c.A +*14 c .A i3f i71 $A D6 +5 .3 soi sph -*12sW's -$w*76k +*04 i94 sY> +$w *76 k +1 +3 -2 d 'A $0 i7e i5e @@ -19174,11 +19096,11 @@ c $2 $5 $4 ^j *41 i3e i72 i1e i3b -.5Y1s$/ -*14]f +.5 Y1 s$/ +*14 ] f i73 i55 i10 i16 -swx+8 +swx +8 *57 o7s i7k i7u sA` OA9 o52 @@ -19191,11 +19113,11 @@ k ^t sK{ O54 o55 +2 Y1 *A1 O56 -T1r +T1 r +3 -2 +5 +0 o24 $c $8 -EY3 +E Y3 O04 ^o i3a i5b ,1 y1 @@ -19205,11 +19127,11 @@ c $0 $1 $8 O6A O31 i6H D5 i72 -.3i6x +.3 i6x *61 O12 c O75 $c $o $y -cs8d +c s8d c $4 $3 $4 c $1 $2 $! $! ^g D4 @@ -19220,11 +19142,11 @@ i4f [ Z5 *36 O3A i14 i12 $a $p -*94o5ri9$ +*94 o5r i9$ k i0b +4 -0 -0 c $2 $9 $8 -cs6(Y4 +c s6( Y4 r $4 $3 $e ^d c $8 $1 $5 @@ -19235,11 +19157,11 @@ i11 i31 o6. Z1 o7i 'B i54 i5e -T1*53 +T1 *53 o7% *23 Z4 O6B -Y2o0m -^y*39 +Y2 o0m +^y *39 c $8 $6 $8 *14 *08 ] ^L ] @@ -19265,7 +19187,7 @@ i81 i99 iA7 iB8 $b $a $b $y c st7 k i1h -,3l*71 +,3 l *71 -9 *78 O69 ,1 *71 O52 +2 @@ -19274,31 +19196,31 @@ O13 ^v ,1 *16 [ -8 s0e -+2f ++2 f z1 -1 i67 i70 ^3 O12 -$-*37 +$- *37 *06 K p5 l i3a p3 i2- c $5 $1 $9 d o0c -*A0shRsCR +*A0 shR sCR +2 -1 -3 i58 i71 -[i9"Z1 +[ i9" Z1 $3 o62 *18 l ] $E O24 o2y O62 +2 O42 O29 y3 +4 o5y -i4ZL9E +i4Z L9 E i58 i76 Y4 OA9 i1s i2c -$ so` +$ so` i32 i71 c $3 $2 $9 d O85 @@ -19313,38 +19235,38 @@ c $6 $3 $0 i51 i69 i77 i82 i51 i69 i77 i81 ^h ^r -o7H^K +o7H ^K o0C O52 -i4$*93*92 +i4$ *93 *92 ^g Z5 O39 O12 o2r ^e ^r ^i ^f +6 +6 -5 -$`$` +$` $` p5 s06 D1 *13 ^1 ^6 ^7 c $7 $1 $8 -T5*B0T6 +T5 *B0 T6 o9P o99 T0 OAB T0 *50 O23 O02 $1 O95 T0 s{y -i3hs]7 +i3h s]7 i4o i5k ^S ] +1 +1 -6 sTM -Y2s7u$h +Y2 s7u $h u z1 O47 ^1 ^2 ^7 spd -0 -0 -6 l '8 i72 i55 -i7Ed*83 +i7E d *83 -5 -A c $5 $! s'e @@ -19352,7 +19274,7 @@ i15 i12 sLJ $y $a $w i10 i18 -,A*45.6 +,A *45 .6 i81 i99 iA7 iB4 c $2 $5 $3 r $3 $8 @@ -19374,9 +19296,9 @@ f O3A $- O72 +1 i0h } o1h -*97sBA +*97 sBA c $1 $0 $9 $4 -$.$! +$. $! i71 i5d l o2t c o57 @@ -19389,14 +19311,14 @@ E $E O1A T1 O07 ^e O51 O53 *68 d -iA*sPt +iA* sPt i53 i77 c o0r o1, $- { c $3 $7 $5 $r *78 -s8p$T +s8p $T R5 +4 ^2 ^7 ^5 i5r D2 @@ -19405,7 +19327,7 @@ sn2 o0R O31 i3l i4i i5n O61 ,2 ^t -sw3i1|sb) +sw3 i1| sb) +6 *57 O13 ^S O61 i2$ O13 @@ -19413,17 +19335,17 @@ o3E c ^[ $] $y O53 *0A O89 o56 -^cs[S -y2cK -L6E +^c s[S +y2 c K +L6 E i54 i78 -sGD[*96 -uT9s=u +sGD [ *96 +u T9 s=u $p $l $y *58 '8 D6 i1i ^3 ^5 ^8 -i2gsHQs)p +i2g sHQ s)p i50 i78 c i6_ y2 O72 @@ -19434,10 +19356,10 @@ i71 i89 i98 iA7 o0c *42 i71 i7f o4U -*B2TB*58 +*B2 TB *58 iAu ^1 ^3 ^4 -s=ti4I +s=t i4I c 'E $6 O15 Y1 *47 sbf @@ -19455,14 +19377,14 @@ i7G .2 .0 i70 i54 *67 [ -*6B*B2+0 +*6B *B2 +0 -4 *42 O42 -s;>o6f} -*ABy4 +s;> o6f } +*AB y4 *26 O53 o0b l C $6 $3 -$8 O71 +D7 $8 -4 *40 i6H u sty @@ -19471,7 +19393,7 @@ c $4 $7 $0 K $S y5 '8 O92 *52 -T1Y1*67 +T1 Y1 *67 o51 o66 O12 ^K i1e i7a @@ -19480,7 +19402,7 @@ O03 z1 ^0 OA5 o22 +0 OA7 O82 *06 --2Y3 +-2 Y3 *17 [ .5 O21 i81 i99 iA8 iB2 @@ -19493,7 +19415,7 @@ i7a i1a OA4 O69 y5 p1 s94 i0a i1s i2d -iAF$#s'J +iAF $# s'J c $_ $5 TB sSG OBA O51 o3s @@ -19502,7 +19424,7 @@ O76 s@R ^@ ^! D5 *41 ^p ^m -TBo6^o6Z +TB o6Z $8 O92 i54 i76 i54 i79 @@ -19536,7 +19458,7 @@ $b $4 r $5 $4 $0 $9 $8 $7 +0 o5t -$_.BE +$_ .B E p1 O59 *54 T0 o4r i5O y5 O3B @@ -19544,9 +19466,9 @@ C $6 $0 o0" D8 O05 $m $b -.Ao9Hi7d -,4[+8 -L9R6*84 +.A o9H i7d +,4 [ +8 +L9 R6 *84 i2t i3h i4a i4i +5 i49 i55 @@ -19555,41 +19477,41 @@ $n $i $k $k $o sob *35 o2m i2I -i8Sy4 +i8S y4 [ *64 +4 o0z i0m i1a i2y i36 i46 i56 c $0 $0 $! $! O53 c -$5Ko5! -*43*54 +$5 K o5! +*43 *54 ^l ^k O21 ^3 'B O63 o4" c $0 $0 $7 $! -s3ssOm*0B +s3s sOm *0B d '6 $2 -i21i39i49i57 +i21 i39 i49 i57 c $1 $0 $1 $! o1& OB2 OA9 k -rl*A7 +r l *A7 O26 ,5 c $1 $3 $2 $4 u $1 $9 $9 $1 -.B^N -[s2G*A9 -s5Psmo +.B ^N +[ s2G *A9 +s5P smo -0 ^g *02 o0r +2 i71 i89 i98 iA2 -o0Kp5 +o0K p5 sAG O24 y5 *32 *45 ^E D4 -sW`^2 +sW` ^2 i7Z i61 i79 i87 i97 i62 i70 i82 i97 @@ -19600,44 +19522,43 @@ $7 -7 s98 s94 i72 i80 i91 iA9 -sh}*04 -i2g*30s0( +sh} *04 +i2g *30 s0( D5 *57 -F -F -F -,4s{I --9$= +,4 s{I +-9 $= +1 -9 -0 -o7W${ +o7W ${ O52 O02 c $8 $* o5u T0 +1 +1 +5 +2 +3 +5 Z1 O43 -sqPs?%o4. +sqP s?% o4. +0 +5 +3 --7*43 +-7 *43 +9 +B +9 -'Ao48 +'A o48 iAz O82 -D2 E O31 c O7B -Cs6E -$2sDX +C s6E +$2 sDX DA C O7A -B Z1 +6 -5 -5 +5 -2 -3 o0M *43 -i21i39i49i56 +i21 i39 i49 i56 ^h O51 $g $a $g i50 i75 O19 *1A D6 -*07$!sz0 +*07 $! sz0 o28 *12 o6x O51 -o1i+6 +o1i +6 +9 -2 -2 c $x $2 s34 c @@ -19652,15 +19573,15 @@ o4j O31 c i5- i5e i7d O71 f OB8 -^^sOPu +^^ sOP u i3G *56 *64 o7> *06 O09 o2d c $4 $f $r $e $e O29 o7z -$ps[Zs@t -sxN$g*20 +$p s[Z s@t +sxN $g *20 ] sau O48 $h i0A r @@ -19668,11 +19589,11 @@ u d $6 O49 *84 ss! [ O23 $3 D2 -Es_SR9 +E s_S R9 y4 c -.6*13 +.6 *13 i8? -.B*50 +.B *50 *37 O48 s%m $b $e $g D4 O26 O74 @@ -19681,13 +19602,13 @@ c $1 $7 $5 c $4 $4 $8 d 'A $5 o0[ -^zs&5+1 +^z s&5 +1 u d 'B $6 c $5 $6 $3 $( O09 c $7 $9 $0 c $7 $2 $5 -+8$@ ++8 $@ c $2 $5 $9 o2* *51 sF_ @@ -19695,7 +19616,7 @@ y2 O38 $D O1B c $5 $0 $2 t i7c -]oA' +] oA' c $9 $3 $9 o0r +4 +A t @@ -19707,7 +19628,7 @@ c $7 $3 $3 O24 p1 o82 t $c c $8 $1 $3 -s2ei86 +s2e i86 O48 Y4 c $6 $8 $8 c $4 $5 $3 @@ -19715,21 +19636,21 @@ c $6 $2 $5 c $4 $1 $7 i9v iAz -s+D*27 +s+D *27 o2M O02 o3u o0p i13 i37 *74 O34 O03 ^L -+0sZJ ++0 sZJ p4 O65 O49 i5z q O6A c $6 $5 $7 c ^y ^M -i8|$a +i8| $a O61 o6g -T4'8s7t -i1fD9K +T4 '8 s7t +i1f D9 K +3 -8 -1 +3 +4 +3 +3 +4 -5 @@ -19737,7 +19658,7 @@ O62 $A i3d i3d c $0 $1 $6 o7D -*56R5 +*56 R5 c $5 $1 $4 T2 ] $8 i68 i76 @@ -19747,18 +19668,18 @@ i72 i3e O91 Y4 O85 o4O sKM O0A -sYut +sYu t $1 ^1 -0 o1j +1 T2 s!j OA7 i1L sl2 -p5,9 +p5 ,9 $5 $d .4 +7 $R O47 i1a i7e -s+Y^W +s+Y ^W i6, smG o9j @@ -19767,34 +19688,34 @@ o9j +1 -7 -6 $m Z1 'A +7 -Z1$3 -s9_skjd -sqY*B1*96 +Z1 $3 +s9_ skj d +sqY *B1 *96 z1 i1j -i32i40i51i61 +i32 i40 i51 i61 *63 z2 O92 $x O63 O71 -sGsKl +sGs K l RA s.Y O52 d O03 *20 O41 [ $4 ^M -y3sSc +y3 sSc r O81 o5& O63 sj{ O94 OA7 ,7 *17 -D3sCi*25 +D3 sCi *25 -8 *93 -*73*93E +*73 *93 E T0 T8 T6 i47 K srl o6% i4K E $4 $a -o8=sMl$Q +o8= sMl $Q $. O07 O14 O53 +4 O94 @@ -19811,7 +19732,7 @@ O04 i1a $r Z1 } *09 *76 $t O72 -.5o8R*39 +.5 o8R *39 o1p ^c 'A o7l D9 $r @@ -19821,12 +19742,12 @@ i31 i1a o0m l O1A O04 sah iB# O56 -.5L5 -R4T0 +.5 L5 +R4 T0 sms c $8 $3 $1 o6Z --0*51 +-0 *51 i19 i38 sBP O13 *76 @@ -19834,7 +19755,7 @@ i72 i1e i0O i1c i2t i83 c $2 $4 $9 -,B*04T4 +,B *04 T4 $d $e $p ] *34 i62 i70 i82 i95 @@ -19843,7 +19764,7 @@ sST D4 ^z o6) i41 i59 i69 i72 -o6s.5 +o6s .5 t ,5 ] i3s i3q @@ -19855,25 +19776,25 @@ c $0 $2 $7 c $4 $6 $9 sM- u O71 r $7 $6 -cY1*51 +c Y1 *51 $u O72 $z O63 i7a O01 i2r i3r i4a s!6 -o8ZD6 +o8Z D6 i3y u c $2 $3 $5 $s -7 o4o [ -]s1m +] s1m c i57 i0. } *13 O03 i0q i62 i70 i82 i99 [ [ $1 $/ O74 -oBf$% +oBf $% o1f *20 c $4 $0 $7 c $6 $0 $1 @@ -19882,29 +19803,29 @@ o2/ c $0 $2 $4 i1e i72 l i4_ -*A4s'Ou +*A4 s'O u *26 O62 o4/ '9 ^d O02 d i3m +2 -l$z +l $z c $# $3 *13 o0f -]*76 +] *76 $g O52 o1x ^l c $9 $4 $5 *51 +1 -stM$P +stM $P ^t *23 o8v D7 O62 [ -^.,7 +^. ,7 L6 O68 -s)dY4 +s)d Y4 s + O6B y2 -sjQE*71 +sjQ E *71 i12 i52 i3v i4i c $4 $9 $0 @@ -19923,11 +19844,11 @@ c $2 $3 $8 *30 D3 D4 i6s -2 *52 -$GsHr +$G sHr i7e i7a y2 O52 s}p O12 ^y -s3Q{*49 +s3Q { *49 o00 ^1 ^7 ^8 ^4 O37 s40 @@ -19938,29 +19859,29 @@ O82 O98 Z2 smy ^K D4 D2 *53 -*42t -o0p] +*42 t +o0p ] i5a i75 sup -kY5sdS +k Y5 sdS i70 i58 ^T O37 o5i i6r -*B4$@ +*B4 $@ i8i D6 i77 i50 O31 o4_ *6A -Z1*12RA +Z1 *12 RA i5b i7e i7% i82 i90 iA1 iB0 -o8R*21sX` +o8R *21 sX` -3 -5 -4 -6 +2 +5 -3 sh. +7 K -s"j*90T1 +s"j *90 T1 c $3 $7 $7 -5 -9 -5 y1 z3 O08 @@ -19970,12 +19891,12 @@ $3 $D u d $7 +0 +1 -2 $j $F -o9L*12sI& +o9L *12 sI& c o1y O95 i2e l $t $e $s $t $@ $7 -.6*35 +.6 *35 LA +0 -5 -3 O0B $L O95 @@ -19990,28 +19911,28 @@ o54 O41 $S { c $5 $7 $7 O89 ] -s5ts@0*02 +s5t s@0 *02 *80 *30 i71 i89 i97 iA0 E sco o6n D7 O43 i6a -oAUsB2$o +oAU sB2 $o -5 T0 O32 ^o --7o4e*B7 -i9Ms(E +-7 o4e *B7 +i9M s(E +3 -6 -1 -$F*A2 +$F *A2 *90 $R O9A -*1A^a -$/*1Asu* +*1A ^a +$/ *1A su* shp u 'E $0 *67 *86 +1 +6 +6 $3 i8_ OA1 -*65i3@*B0 +*65 i3@ *B0 c $3 $4 $8 $l O2B c $6 $5 $5 @@ -20037,7 +19958,7 @@ l O96 -3 o7M o3Y c $! +A -Y1T3swF +Y1 T3 swF $c $9 D8 o1! d O9A .9 @@ -20047,57 +19968,56 @@ $7 $@ ^R E i8z '9 +5 O59 -*98s;1 +*98 s;1 o7j p3 ,4 k +7 -4 -4 o7g ] +5 O91 -T1o1co8{ +o1c o8{ *94 O15 R2 OAB L2 c $6 $1 $7 -s(Eo4f +s(E o4f o65 -7 -d '4 Y4 -o3xs?o d '4 d +o3x s?o i6z O73 r O05 O04 Y1 iBt -i62i70i81i91 -i32i40i50i69 +i62 i70 i81 i91 +i32 i40 i50 i69 *5A O67 sk| O21 O3A O54 *25 -R7*89R8 +R7 *89 R8 $8 O63 -oBP}-7 -^Qs?W +oBP } -7 +^Q s?W ^1 ^8 ^6 c $2 $9 $1 $2 $3 $2 $3 -i71i89i99iA9 +i71 i89 i99 iA9 O74 *91 i6e [ i0f i1e i2r -.5TA +.5 TA i79 i5a *24 i12 -*2Ay5 +*2A y5 *23 k +5 -3 -0 i5o i6n +3 +3 +9 D0 k t i3e i4l i5l -iB6s"rso| +iB6 s"r so| +5 +7 +5 O47 i4d O81 $' -8 .3 -y2o00 +y2 o00 +7 $3 $1 $q $a $z +3 i4k @@ -20105,18 +20025,18 @@ i9a OA4 set $r +6 ^6 ^2 ^0 ^2 -sL.i7* +sL. i7* $! $2 oBu { D1 } ] $z $i $t -*98s0( +*98 s0( c { i4u O34 l ] $S D2 T0 o4# -sh'o4Y +sh' o4Y O81 i81 $x $2 u d 'A $0 @@ -20126,8 +20046,8 @@ O26 .0 *30 -4 -3 *24 o03 ^1 -sR2sU",1 -soLq +sR2 sU" ,1 +soL q c $6 $1 $3 O91 d i2g t O0A @@ -20144,11 +20064,11 @@ s!* *16 D1 i4e i5r $i *89 -*A0.9o1s -slfo5d*96 +*A0 .9 o1s +slf o5d *96 $i $f $s y4 O7A -so5T7 +so5 T7 +7 -3 -1 $2 $0 $2 $3 +A -3 @@ -20163,20 +20083,19 @@ i71 i11 i1u o3i +1 ^b [ $@ -o9S.A +o9S .A ^3 ^3 ^8 -$2 D0 +0 $2 O58 ,1 ^2 ^4 ^7 $9 -8 *61 O47 -s&^-6 +s&^ -6 *63 D3 c $@ $3 T1 $7 c $@ $9 -*81^R +*81 ^R C ^g -0 O32 O56 sFe @@ -20186,7 +20105,7 @@ O3A l T0 T2 T8 +B *9A ,6 O04 -T3.1s%( +T3 .1 s%( i53 i5e k D4 O8B sar @@ -20201,25 +20120,25 @@ c $4 $0 $6 t O32 O35 ^c t O03 d -o4y*A6i6$ +o4y *A6 i6$ O9A O35 OB1 } s.w i81 i99 iA7 iB5 o2u c -O03 i0T -,8s*8 +^T O13 +,8 s*8 se} ^J +6 -oA|kz2 +oA| k z2 c $7 $2 $6 l o0c O6A iA* c i46 -sEyC*64 -*B6iB3$K +sEy C *64 +*B6 iB3 $K O62 +7 -Z2D9 -p5-1 +Z2 D9 +p5 -1 DA l +3 -0 +7 C $5 $3 @@ -20229,7 +20148,7 @@ i0s ^p $1 ^- *9A O7A 'A -2 o40 -*ABsu$ +*AB su$ i5h T0 u ^C O05 ^h @@ -20237,20 +20156,20 @@ o9~ c $0 $2 $9 i62 i70 i80 i92 O47 *03 *80 -*25RB -*24^q -qsnh +*25 RB +*24 ^q +q snh +1 *87 c $1 $4 $6 +8 +9 -A *04 O12 -i32i40i50i60 -*A7sCo +i32 i40 i50 i60 +*A7 sCo -4 ^r i4D ,1 O63 ssi -R6oBf +R6 oBf l o4z Z5 O64 i9x .9 @@ -20263,7 +20182,7 @@ sdx l o0d o30 *63 o3& -z2p5 +z2 p5 D7 O12 c o0k +7 -5 +7 @@ -20271,7 +20190,7 @@ c o55 D4 D3 sgs iBt f -i6Dc +i6D c u 'E $1 *24 -2 l [ ^E @@ -20288,18 +20207,18 @@ i71 i82 i93 i7h O98 +1 O24 Z5 $3 $. -K]s,c +K ] s,c ] $M -]*68,B +] *68 ,B i81 i99 iA6 iB4 *52 ,3 sm` i2G -T0*78spq +T0 *78 spq $t O85 i1a i2u i3l -z2'8 -Eo9A +z2 '8 +E o9A i5a i3c O72 $t i2l O61 @@ -20317,31 +20236,31 @@ D1 ^N i4s -0 i5a i3b -2 o3J -Z2o9Q +Z2 o9Q $6 l O19 +8 t t ^t } sbJ -C} +C } p2 O34 r $0 $5 D3 i5n $k ,A sva O3B l +7 -o4EsZM +o4E sZM O34 Y4 c $6 $9 $! Z3 O54 $7 $A O46 i2| O34 q -o0Uo8> +o0U o8> D8 oA1 l o89 -s!?{ +s!? { O01 o4x -iB8$`*4B +iB8 $` *4B s3a s1* $j $o $t @@ -20357,9 +20276,9 @@ spM r o0H c $_ $0 z1 T2 -oBAo3" +oBA o3" $5 -7 -^B*B8 +^B *B8 r $5 $2 $b $u i76 i50 @@ -20369,7 +20288,7 @@ O03 $5 +7 o83 $. $5 OB1 $3 -}ssO*1A +} ssO *1A i31 i1e scf z1 ^a @@ -20385,12 +20304,12 @@ spC +0 *35 sDJ O45 *30 -l$J +l $J ^v *31 -z1s/ysN5 -o11i9, +z1 s/y sN5 +o11 i9, i5f i5f -sgp*A7 +sgp *A7 i71 i89 i98 iA1 o9y iB1 @@ -20409,26 +20328,26 @@ i5a i76 $h { T4 T8 T5 d 'A $6 -*4Bq +*4B q ^G l } ^k -^!LA -$9y4 +^! LA +$9 y4 ^Z l i58 i74 D2 $e l $! $! $! $! -T1*75 +T1 *75 O91 $9 i7u O84 -sQHiAMse3 +sQH iAM se3 *57 o56 OB5 [ O45 r i3d i1e o1e D7 -*89*B0y5 +*89 *B0 y5 $3 ^S -*3B*37] +*3B *37 ] *31 i3n l o6k O37 i9E *47 @@ -20446,24 +20365,23 @@ d OA5 c $3 $5 $8 $J $j l O26 O93 O91 -$msn} +$m sn} i15 i15 -^-sH4] +^- sH4 ] $d $a $b -o49E -$Us'? +o49 E +$U s'? *59 iAd O67 OB1 -B ^C +1 k O23 -[ $h o3, $a +7 i2d O79 $n +7 -y5DA +y5 DA +1 -4 -4 -iA#D7^P +iA# D7 ^P ,3 +0 o5k O04 O79 $n @@ -20479,7 +20397,7 @@ c $9 $1 $5 O85 OB1 i2y i77 i53 c $2 $2 $@ $@ -^KshU +^K shU c $6 $! $6 +8 *40 *34 @@ -20488,7 +20406,7 @@ i82 i90 iA0 iB9 c $5 $5 $5 $! R5 O94 c ^8 ^0 ^0 ^2 --9.1 +-9 .1 $d O8A i6o O32 *4A O6A @@ -20496,45 +20414,45 @@ T2 T8 T6 $A [ r -2 -4 -4 $7 *98 -*30sZS +*30 sZS { { c $2 $0 $2 $2 -z2,8Z2 +z2 ,8 Z2 $2 $0 $2 $4 O12 ^o K T6 i5, --7s)t +-7 s)t i42 i50 i61 i71 u T9 -skos}. +sko s}. c i5_ -$]+7 +$] +7 i0c i1h T4 +3 +0 +3 -5 +0 +3 -6 i5e i3b -$\ '3 O64 +$\ '3 spg -*2Ay2 +*2A y2 i8c oBY +3 K -coBrY2 +c oBr Y2 $5 O21 -s#DY2[ +s#D Y2 [ *75 o0J -s,Hss6 +s,H ss6 i41 i52 i71 i89 i98 iA0 i4h o2r i2t i3u i81 i99 iA7 iB0 -Z4D4 +Z4 D4 .0 -5 Z1 O91 ,9 -sDBsR^i0t +sDB sR^ i0t i3e i5c O04 p4 O31 K @@ -20554,45 +20472,45 @@ $4 O62 f O68 +9 p4 o0w *25 -slNy2 +slN y2 i57 i74 l o8e *8A Y3 O21 -$ToAr +$T oAr -E -E -E -o64,8Z1 +o64 ,8 Z1 c ^M sri -i9mz2 +i9m z2 o3o i3k O15 q c $2 $8 $1 ^h o2t -$Uo7| +$U o7| O43 i50 sjp -iAf$b +iAf $b -0 -4 -4 c 'C $2 -s3r+5K +s3r +5 K +0 +7 -6 -^js!< -$2k -Y3{ +^j s!< +$2 k +Y3 { o6k [ ^7 ^7 ^5 r $6 $1 *20 D5 -s^"'7 +s^" '7 d O4A o5l O98 sJ/ i9e O54 -*A1snu +*A1 snu T0 o3v c $9 $2 $1 c $x $x z4 O06 o3v -D6shs +D6 shs k ] *40 D6 O41 O02 O94 @@ -20606,38 +20524,38 @@ O19 sQI } sD5 i4e i5n i6s +6 -3 +6 -*87oA# +*87 oA# c $4 $8 $6 u $i --0*57 --9q*69 +-0 *57 +-9 q *69 O56 OA3 OB7 OB3 $K i9% o80 +7 i8v O5A O85 -y2D8 +y2 D8 c T3 $1 Y4 O02 O02 i9i o42 O74 T1 T6 T8 sbt -^Zsg6sxJ +^Z sg6 sxJ +1 o2b ^7 ] ^c i1j ^t l O17 Z4 O51 i6r -'AsFU +'A sFU o72 .1 -]]]]]]c +] ] ] ] ] ] c syu -4 o0G o0e -2 *19 O23 p1 sbl -*7Ai11 +*7A i11 O12 $l E *25 o0m T7 $3 @@ -20652,11 +20570,11 @@ i76 i59 syn [ ,1 sfn -R8+B +R8 +B O54 ] $M ss5 sa4 -sfCE -*14,5 +sfC E +*14 ,5 '8 K T6 O06 i0Z O0B O7A iBh @@ -20665,15 +20583,15 @@ O92 $y $t O89 $s $o $w o5D -i8So9F +i8S o9F $r i7t saq { O45 t O42 z2 c $ $3 -*5A$X +*5A $X { TB -}s@k +} s@k C O85 *BA i3d i5d +4 O54 @@ -20685,16 +20603,16 @@ i81 i99 iA6 iB8 c $5 $9 $1 p5 i2K i21 i32 i43 -oB2Y3*8A +oB2 Y3 *8A o7s *57 -snws@) +snw s@) c $8 $5 $0 o4; *15 O9A +1 +3 -5 -p1s(a +p1 s(a o17 [ -sdh*46 +sdh *46 i7Y O36 i7O Z1 +9 @@ -20702,19 +20620,18 @@ D2 -6 i77 i55 O31 [ Y5 i4_ O54 -*69$G +*69 $G -1 -1 -8 -p5-0 +p5 -0 i5t i6o ^A O21 -T3p5 +T3 p5 sys o0_ -o0b c -5 [ skh *48 O83 --2^2 +-2 ^2 O02 i4f o34 t c $- $2 @@ -20725,9 +20642,9 @@ sAO r $3 $6 OA4 O51 OA4 O87 -*6BY1 +*6B Y1 c $_ $4 -sCfssh +sCf ssh o2c sck -B $9 c $5 $8 $9 @@ -20736,41 +20653,40 @@ O86 R8 i1h i2i i3n z4 O16 i4e O13 ^W *97 -y2]s^W +y2 ] s^W $a O29 O63 *87 O21 *4A $3 O23 i8Y q O16 'A i54 i70 -*74+6 +*74 +6 [ o3r -[ E K +[ K E srg OB3 C $7 $0 ^a O41 -o0m^a +o0m ^a i5a *04 -+5sk9*29 ++5 sk9 *29 *9A *89 -*54K*A3 +*54 K *A3 *41 D1 -*65iBBsr< +*65 iBB sr< s{8 ^. O1B $2 $0 $2 $9 +7 *57 -s#al*48 +s#a l *48 o7u *67 i51 i1e -[ K E i74 i54 -stYsvp +stY svp i3e i5b i14 i54 c $0 $2 $3 O2A *85 -2 o4y -T4D5 +T4 D5 o1B *10 *50 O32 *74 *65 @@ -20784,7 +20700,7 @@ i57 i76 c $4 $$ c $5 $0 $7 r $5 $0 -s6osW( +s6o sW( c $4 $8 $7 *10 i3r ^- } @@ -20798,34 +20714,34 @@ c $2 $9 $5 i73 i59 .3 E -5 D1 -sk]d +sk] d O41 $4 K O97 siJ T1 $8 -*95^2 +*95 ^2 ^r i1t ^4 c o58 *65 o3r O42 -*ABz2 +*AB z2 ^b +1 O72 o6u -s<}R4 -*A8.6$| +s<} R4 +*A8 .6 $| OA3 ^Q l o8d ] -2 *53 +5 o89 +9 [ O57 K -s?K*40D4 -*59seZ -cs,.+5 -$>$= -i60t +s?K *40 D4 +*59 seZ +c s,. +5 +$> $= +i60 t $1 *54 -*68u +*68 u 'B o6l i45 i55 u OA3 s(= @@ -20834,17 +20750,16 @@ o4E t o8Q [ O91 i5. snh -s{J^Q -[dR9 +s{J ^Q +[ d R9 *16 O03 sbM O23 *A8 C $4 $6 ] $R i3e i4y -^T O13 ^0 ^3 ^0 ^2 -oB+Z1+4 +oB+ Z1 +4 o0h *82 OA1 +1 +5 +3 i7x O9A o8G @@ -20859,7 +20774,7 @@ o3k E s5t $2 $0 $1 $0 $# u 'D $6 -,8y4r +,8 y4 r *14 r *63 *25 D1 ^d O51 @@ -20872,13 +20787,13 @@ i19 i30 o1s i0g O14 ^y i2a i3n -$nsL@ +$n sL@ s_. -l [ ^Z +o0Z c u *75 Z5 u -sXb^yi3q -.5.2 +sXb ^y i3q +.5 .2 $+ O94 OA3 OA4 i9l D7 @@ -20913,7 +20828,7 @@ c $5 $4 $8 [ i31 O9B O3B D7 z2 o0m -*50Y2 +*50 Y2 l o3c -2 -A +4 *25 @@ -20921,7 +20836,6 @@ o9e O63 i17 i14 +9 +A +B i3e i79 -OA1 D9 E i2j i3a c OAB ,7 scK @@ -20929,11 +20843,11 @@ scK *34 +5 $s D1 O03 O84 -i91$n +i91 $n -0 -5 -3 $f $A -*89i1m -$AsUpiAk +*89 i1m +$A sUp iAk C '9 $1 $n $e $s $s +4 *02 @@ -20946,11 +20860,11 @@ o4< Z5 O1A $u O52 +2 -1 +3 -skWs!* +skW s!* *50 +0 z2 *31 D3 p4 -Y5Y2 +Y5 Y2 $1 $9 $9 $1 $@ o6` t c $5 $1 $3 @@ -20958,12 +20872,12 @@ smp $k i8o Y5 OA3 i61 i70 i80 -*58s_R +*58 s_R OB5 L6 O12 $l T0 D8 D5 *21 ^j -p2oAFs+# +p2 oAF s+# y5 O43 O04 $s c $2 $8 $6 @@ -20972,9 +20886,9 @@ i15 i14 $j $a +1 i0i O2B .7 *08 -sh[^e -*17$s -]o1h +sh[ ^e +*17 $s +] o1h i52 i60 i70 i88 -0 -0 -7 p3 *68 @@ -20985,7 +20899,7 @@ $d $u $g c o1e ,7 +0 i77 i54 -o1Hs[. +o1H s[. i71 i89 i96 iA8 c $1 $8 $4 $4 O28 @@ -20997,7 +20911,7 @@ i71 i3b i4z O53 o2z *21 D5 D4 -i89s)'*17 +i89 s)' *17 o1K k +A O62 o2p +3 @@ -21007,7 +20921,7 @@ o2l *42 l ] $B i0b i1a i2r o3U -siR*20Y3 +siR *20 Y3 c $8 $9 $7 o3s c +5 '9 @@ -21021,7 +20935,7 @@ l $l $a $n $d c $1 $& i6T $a D4 -l^U +l ^U ^z *13 *60 o6l i5g O01 @@ -21043,11 +20957,11 @@ i14 i34 $1 $2 $* $* *53 -0 R3 O7B s'D -i4h'A +i4h 'A i1e i5d $s $o $t *96 O52 -D1iAq +D1 iAq C $4 $1 o6e +5 +0 -9 -1 @@ -21058,9 +20972,9 @@ O67 $^ ^2 i85 sck O61 o3- [ -$%sLHl +$% sLH l c $0 $. -sB#sKW*15 +sB# sKW *15 OA9 OA3 i11 i51 $2 $0 $2 $7 @@ -21074,19 +20988,19 @@ O56 s ` R8 i6f *64 k +5 O43 q -EsJ^ -i7do5v +E sJ^ +i7d o5v k $x c $4 $4 $9 ^A D4 Z1 o5_ -]s\o -$_$! +] s\o +$_ $! O14 O1B $0 $4 $0 $4 -$$$# +$$ $# ^3 $d O07 -DA^' +DA ^' c $2 $1 $! c $5 $9 $7 i3- [ @@ -21097,18 +21011,18 @@ $p $r $y o6` OB2 i32 i1e K o56 -$2$0$2$1 +$2 $0 $2 $1 s0S K o7- ] TA O6A O12 $s i5a i74 C ^w -^0i5y +^0 i5y c $. $5 -*38*65 +*38 *65 u d 'A $5 -iA5$Ki8] +iA5 $K i8] +0 +5 +1 i7e i3a u d 'B $3 @@ -21118,10 +21032,10 @@ $m $o $t $e *53 o0z $A $x +1 -2 +1 -o4c.9 -.2'4*0B -*43k*60 -DA*38 +o4c .9 +.2 '4 +*43 k *60 +DA *38 } ^F +1 +9 +1 $9 OA2 @@ -21146,30 +21060,30 @@ sW" O39 ^h i54 i62 i70 i3g i4e i5r -3 -4 -3 -*76l$P -R1z1 +*76 l $P +R1 z1 ] o2d -*A0o2jo9l +*A0 o2j o9l E o5v o6` i5X o7s O51 ^1 ^@ -skjo7+s f +skj o7+ s f c $3 $8 $9 +3 -5 -2 i32 i3d *56 o5j sck O21 c ^ ^1 -o8+l -DB$5 +o8+ l +DB $5 o3d $1 ^s O82 o19 [ } OAB O51 $9 $8 $! --8sdU +-8 sdU s4) syk OB7 i67 i78 O64 ] @@ -21188,25 +21102,25 @@ O02 $A +7 $4 ,7 p5 O75 o59 sQF -D1K +D1 K i4d i5e i12 i35 D5 *24 -*B0i6N -sUyY2 -o8.l +*B0 i6N +sUy Y2 +o8. l Z1 O32 Z4 OB6 *50 O53 o3J $1 $8 $0 $5 y3 O37 -*B7^U +*B7 ^U p2 O62 '8 -^!s7j +^! s7j i11 i16 D6 *82 O82 -TBo1R +TB o1R $3 { o6s c i78 o0K @@ -21221,34 +21135,34 @@ i77 i57 o3s [ p2 oB! sbq -o1z*59sJV +o1z *59 sJV i4L .4 -*52s/6 -[Y1$h -*81y4 +*52 s/6 +[ Y1 $h +*81 y4 i50 i74 D6 ^m *98 O63 sag -y2Ki7R +y2 K i7R i5e i5a sio O64 Y4 i3d i7a i3b p4 '7 l -r*8A --8s9' +r *8A +-8 s9' s\J O45 O75 D4 o2b i3b i5e t i5y i8a i9n iAd O06 ^X *B4 -i32i40i50i68 +i32 i40 i50 i68 [ ^Y o1i i7c i7d *36 D3 [ -iA(syP$m +iA( syP $m O53 t i82 i90 iA1 iB5 O73 l @@ -21268,7 +21182,7 @@ sKN $3 $c $2 ^@ O28 t -.6sk} +.6 sk} i9? O93 *87 Y4 O87 'B $3 @@ -21281,20 +21195,20 @@ O25 Z1 i72 i80 i92 iA9 o3g *02 $7 $a -'7s<) +'7 s<) i72 i58 *A6 O31 T1 O9A *69 $1 -7 ,1 E -8 ^S t -O4B ,5 o5B +O4B o5B i6u D4 f O86 -sf`s#OsD{ -o8#RA +sf` s#O sD{ +o8# RA $c $0 -o4cK +o4c K $s iAi $y $s O95 O49 @@ -21302,30 +21216,29 @@ O47 *30 i3c i7c i74 i7a *54 o0K -$po1r -*38,A -Y2y2*96 -.7Y2 +$p o1r +*38 ,A +Y2 y2 *96 +.7 Y2 o6e [ $h $e $x -+4i7S ++4 i7S c $9 $0 $3 o3w *31 p4 s_; O32 ] o7n -[ ^L -o3nY5 +o3n Y5 O91 $k *12 o1j i5e i77 i71 i89 i97 iA9 i44 i52 i60 -*24l +*24 l ^j ^r O56 E Z5 l o4b i5d i1e -]Y1TB +] Y1 TB O12 *30 O31 $1 $1 $! OA1 $6 +A @@ -21341,13 +21254,13 @@ $1 $e O42 K t OB5 *51 O68 O84 -ko3% +k o3% Y4 .5 -s z*93y1 +s z *93 y1 *34 o2x D4 t $1 $9 $5 $8 -s*Hi8i +s*H i8i +5 O63 o7K t O32 o2. @@ -21357,26 +21270,26 @@ O23 ,6 y1 i89 -9 } ^b i0l i1i i2l -T7Z5 +T7 Z5 ^d ^o ^o ^w -$NsWp +$N sWp d i3J O29 -p4'B +p4 'B i2a l *19 i4s -Cs`" -uZ3 +C s`" +u Z3 O03 $7 o77 D6 -6 T0 -*A2o0i +*A2 o0i o7s c o5) -T7*64 +T7 *64 D2 ^b i2i i3t i4e i82 i90 iA2 iB5 --0s6_K +-0 s6_ K y1 -2 O14 C +8 O54 s#! @@ -21395,11 +21308,11 @@ Y2 O64 -7 i7o O43 sAT +4 -6 +4 -$>$> +$> $> i81 i99 iA9 iB7 -5 '6 k i1m -*68o5bRA +*68 o5b RA sSP c $1 $4 $9 -8 DA @@ -21410,7 +21323,7 @@ $u O2A o7p OA4 $1 $+ i14 i11 -srEK +srE K c $2 $8 $0 $3 ^g O32 *02 ^b @@ -21419,7 +21332,7 @@ D5 $i Y4 O36 o3v O02 $6 ^g ^o ^d -$!D6 +$! D6 s1J O91 .9 +0 ^1 i10 i50 @@ -21427,29 +21340,29 @@ i10 i50 z1 ^j o5j +0 D6 o2w -D8EsT; -i5{o6S^d +D8 E sT; +i5{ o6S ^d $i O12 -'7y3 -i51i69i79i87 +'7 y3 +i51 i69 i79 i87 u O67 O2A -o6oc[ +o6o c [ +3 +3 +8 Y5 i4- O28 c o30 i4A t -*5AseLo5s +*5A seL o5s O65 Z4 +2 o71 i18 i58 -s>}'9 +s>} '9 shv O02 ^X i79 i19 T7 ^1 OA9 ^o +8 o6a -^El +^E l o1l *13 c $8 $8 $! $! t i4y @@ -21460,14 +21373,14 @@ oAf i9J ] ] ] $d $o $g -6 O04 -^Cszx -s3Xtsi! +^C szx +s3X t si! *34 +1 $o $r $e $o i4m i5a i6n -i1bo9Zc +i1b o9Z c i6O K -T5Z1*87 +T5 Z1 *87 T0 o6s s3U i5e i76 @@ -21480,7 +21393,7 @@ O13 ,7 '6 *54 $4 $5 $1 $2 +2 +2 -3 -y3*69*68 +y3 *69 *68 i35 OB5 OB6 *32 *42 ^' ^( @@ -21497,23 +21410,23 @@ O31 T1 *40 O34 O7A ,6 .1 o0L p5 -kd +k d $K t +0 -2 +3 o5v D0 -*80y5 +*80 y5 $s *31 i81 i99 iA6 iB3 $K r +5 +5 +6 +2 -5 -5 -*32s2Ts?d -s1\$<'8 +*32 s2T s?d +s1\ $< '8 *B1 O6A $7 O54 c shj O67 *BA -*67*0B$x +*67 *0B $x $h $o $b ,7 +0 t sHP @@ -21522,24 +21435,24 @@ i15 i11 K } Y5 O8B d iBa O74 -T2[ +T2 [ o8Q sYj O1B -,Bs]x +,B s]x O14 i4y k O18 i4y -7 O03 -o3ii65 +o3i i65 l i6t $0 $5 $1 $0 -oAmi5& -.6L9s>i +oAm i5& +.6 L9 s>i +6 c O52 o4g -$iiBH -i7;s_>s,q -,5{ +$i iBH +i7; s_> s,q +,5 { -5 D3 -o6Os9" +o6O s9" t o0S o30 o62 *26 D6 @@ -21547,12 +21460,12 @@ O02 O82 u *30 -0 $a i45 i56 -L8$/ -$C*4B*B6 +L8 $/ +$C *4B *B6 o0g ] o8x o0b k -iBK[ +iBK [ o1* i56 i70 i3R @@ -21564,17 +21477,17 @@ O02 o4- 'B $0 } o1c i6# OB5 -D6-8 +D6 -8 *32 i1u d 'A $4 l $S -$csGZ +$c sGZ O21 O52 ^g ^s s|7 O61 *87 D2 O2A y3 i6i O02 -D6s#X +D6 s#X O54 $3 c $7 $7 $4 $v D7 @@ -21594,21 +21507,20 @@ sKC O47 O38 } ^s i71 i89 i98 iA8 *31 i1a -Ei8x +E i8x O01 $p c $9 $3 $6 E -5 l ^n ^a ^m } O8A i3n D5 o4d -si)T6i0! +si) T6 i0! c $8 $9 $1 sjc c $6 $6 $3 i57 D8 $b $o $s $c $h *79 'A -*01 [ $t c $5 $0 $8 $2 O32 Z3 TB O62 @@ -21624,28 +21536,28 @@ r ^S o7h o8i *21 O25 ^p t -6 -1 -i21i39i49i55 +i21 i39 i49 i55 [ Y5 O36 sci -4 -6 -5 -7 O75 sik ^R -o0y,8 +o0y ,8 o3B o2b *32 O12 r u $r -D5TB +D5 TB D2 *54 +8 D4 { $P l -*98p5 +*98 p5 i81 i99 iA6 iB7 Y4 O24 -o4fsDV +o4f sDV D7 p4 -D6oBmy4 +D6 oBm y4 +6 O73 -Ei31 +E i31 sAE OA6 i72 i80 i91 iA8 i72 i80 i91 iA7 @@ -21653,7 +21565,7 @@ i72 i80 i91 iA7 D8 ,8 *A8 O04 iBz sOI O07 -so=i3l.A +so= i3l .A +2 -8 -9 O71 'B o65 t @@ -21662,29 +21574,28 @@ sA2 ] o6g *94 .2 O05 +9 +9 -3 -^Psp6 +^P sp6 p4 *16 sae i2m i4d i5o i6n ^P +3 O93 sO| Y1 -csP;} +c sP; } +0 -2 +5 k o3- +6 -1 +7 sXw O45 sTL ] i4_ -O71 } $6 +7 +0 +1 -6 i0S D4 +9 -B -A -sslsAd +ssl sAd se3 $! *62 O42 i91 iA! c $@ $5 -iB5*28 +iB5 *28 i72 i80 i92 iA4 +1 -6 -0 -5 -8 -5 @@ -21692,44 +21603,44 @@ i72 i80 i92 iA4 i34 i45 i56 sXa oA_ R5 O62 -s/cp1*73 -.BR4 +s/c p1 *73 +.B R4 O39 K *52 o1A $E u -o5?*64 +o5? *64 ^e ^n ^u ^J i6m i7a i8r -0 -0 -5 D2 l ^M +7 i12 i13 -s'}sB`*8A +s'} sB` *8A $s $y $r $u $p oBf ^A +6 *76 o5t -*02r +*02 r +5 +5 -6 *40 O24 oA# $s O57 o2x *01 -*85o0d +*85 o0d s%} ,2 *64 ] Z1 T6 $j { *53 O62 i72 i80 i92 iA6 d O28 -.8*60 +.8 *60 sg7 *42 o0D $d O52 Z1 -A -s(=^\ +s(= ^\ -B D7 i0P D2 -snks27 +snk s27 o4R o3x *23 $2 $1 $! @@ -21750,7 +21661,7 @@ $9 { O29 *69 O5A i7a i72 O19 *0A -iAasT,'B +iAa sT, 'B u d 'A $7 K O84 -9 i5e O62 @@ -21767,7 +21678,7 @@ s5Z O91 o7s *35 D2 i8_ l -5 *46 -*82Y4 +*82 Y4 o0w z1 K +2 ^C +2 @@ -21777,21 +21688,21 @@ O92 $m i1r i2e i3s l ^d ^r ^a ^h y4 Y1 -+5+B ++5 +B iAm O04 $3 OB3 d -^a'4sO' +^a '4 sO' ] O38 o0t ^D $m D9 O03 f $/ $1 o7C -sjZ^^{ +sjZ ^^ { ^a ^g ^n ^a ^m ^y -2 -+1+B ++1 +B i77 i7a +1 $s oBg @@ -21801,17 +21712,17 @@ c $1 $6 $9 -3 ^r D1 $l *27 o2n -spWsxz +spW sxz O21 i6e *06 +6 -o60l +o60 l $$ O72 ,7 ,6 y3 O32 $b { O17 *86 Z2 i74 i55 -Es{J*52 +E s{J *52 s31 o77 o4x O21 T3 O13 sz_ @@ -21824,28 +21735,28 @@ D8 $2 t $w O18 ^Z *25 O32 -$x+0 -*60]E +$x +0 +*60 ] E c $1 $7 $3 i82 i90 iA0 iB2 l $i $t $e o7_ T0 i3f i7f -$($( +$( $( $s $o $b O41 ^i ^a ^n ^a i62 i70 i82 i98 stD O02 -Ei9msPD -s,Rs`Ei42 +E i9m sPD +s,R s`E i42 $z D4 [ o5g z2 o1k '7 $! std *78 '9 --8st7 +-8 st7 i7h l ^3 ^4 ^7 c $1 $9 $3 @@ -21853,12 +21764,12 @@ c $1 $9 $3 -1 i4a O43 E Z5 d OA3 -'7 O36 *31 +'7 *31 $s ^k $8 $a i5c i5f $k ^D -T4Z4 +T4 Z4 *8A p5 O19 O31 D4 -6 D2 o0D @@ -21867,29 +21778,29 @@ O26 sh{ o4r Y1 O6B o32 t r $6 $4 -*5A*57$! -*73^B +*5A *57 $! +*73 ^B $t O95 i3M -7 s1L c o1l -Y2*B6 +Y2 *B6 O48 D3 i1t -0 $7 ^7 r $7 $1 c $9 $0 $4 -s!P*69 +s!P *69 c $9 $@ u $2 $0 $0 $0 i2C o3u ^m O48 sS& ^0 -ki9dt +k i9d t o4o *24 ^H L1 o93 +8 -^!,A +^! ,A i0f i1l i2o +5 -0 +5 *62 O32 @@ -21904,34 +21815,34 @@ i73 i56 Z1 O72 p3 *16 D3 i4k -i9;s0k +i9; s0k o6c [ +5 i5z O14 -*59o8_ +*59 o8_ o5{ c $4 $5 $9 ^a ^g ^e ^m -$"$" +$" $" $s -5 c $7 $0 $5 c $3 $4 $1 O07 p3 ^R D3 -i7bE -K*50 +i7b E +K *50 +1 -2 +5 *68 o6r c i50 $c *67 c $5 $8 $7 -su}i6" -sU}]*53 -,1T6 +su} i6" +sU} ] *53 +,1 T6 O81 $9 Z1 O53 $r $h $o +0 i5t -o44,5 +o44 ,5 f [ +5 [ -2 i0$ OB9 *28 @@ -21940,22 +21851,22 @@ $a $s $u $s t ^e i19 i34 T3 T8 T4 -c$1$2$3$, -Z1*35 +c $1 $2 $3 $, +Z1 *35 ^y ^k ^s p2 OB3 -s+vZ5 +s+v Z5 i6R D0 c $6 $1 $8 -l'Br +l 'B r [ o5i +5 -1 -2 o9) O15 i6k T0 i5f O13 '8 i4_ -$3*47 -i42i50i60i70 +$3 *47 +i42 i50 i60 i70 O62 ^M i81 i99 iA7 iB9 $7 $7 $7 $7 @@ -21964,7 +21875,7 @@ o8m O93 -0 -5 -1 [ o5n c $2 $1 $2 $5 -y2D6 +y2 D6 *70 O01 c $1 $6 $4 O52 i5@ O52 @@ -21972,7 +21883,7 @@ $2 $6 $0 $4 i7j OB2 i0s $a -7 o6. -RB$p +RB $p i0f i1r i2e o3h [ snu @@ -21981,23 +21892,23 @@ i70 i10 $- -4 sCR t o77 -sezd +sez d T0 O74 suP -o81*4BDB +o81 *4B DB c ^1 ^8 ^9 ^1 c $2 $3 $! i51 i3e $r *A9 -*A8z1 +*A8 z1 $d D5 ^d *40 -s2w*20 +s2w *20 *62 +2 -*30Z1 -,6*19 -*64s;4 -*40s9B +*30 Z1 +,6 *19 +*64 s;4 +*40 s9B O61 ^i $L r +B +C +B @@ -22007,7 +21918,7 @@ o8~ r $6 $0 -0 -8 -0 c $_ $6 -*49saxsWk +*49 sax sWk c $2 $9 $7 *03 ^a -0 O52 @@ -22015,10 +21926,10 @@ c $2 $9 $7 *45 O67 i71 i54 +1 +1 +6 -*2B*9A*46 +*2B *9A *46 Y1 O75 o0D ,7 -TBi6j +TB i6j $b $5 Y4 O32 so9 @@ -22029,7 +21940,7 @@ O42 i3J i51 i69 i78 i85 $0 $1 $! $! ] $B -sD1Z3c +sD1 Z3 c s4A sub OA2 L0 z1 @@ -22046,28 +21957,28 @@ i5d i54 l i4h $a .3 *68 *78 --0i8A +-0 i8A i6F svm o1o O71 O43 o2n -[*92Z2 +[ *92 Z2 O31 o0D o0t z1 *62 o2s s0j i37 i3e l ] $R -*68*46 +*68 *46 +2 -3 -5 O1A ^q -}D8s/e +} D8 s/e i75 i7e i6s O21 ^$ $$ i4z *64 i4X -*4A}^9 +*4A } ^9 $e o8v i58 i73 c $3 $@ @@ -22085,7 +21996,7 @@ $i Z1 o5' OAB +6 -0 -0 iAn O64 -i72i80i91iA1 +i72 i80 i91 iA1 i5a i78 *15 O13 D2 O07 @@ -22108,15 +22019,15 @@ OB8 $Y *87 O92 s1M $b $a $a ,1 D3 -$=$- +$= $- +0 +0 +9 i5b i6o i7y -o2h*A2 +o2h *A2 $! $! $! $! '7 D4 i5r l O23 D1 ^0 -Y3u +Y3 u snl C O3A OA1 o2< @@ -22131,7 +22042,7 @@ c $9 $3 $1 i74 i53 O21 ^l D6 O97 -*08i2u +*08 i2u 'B +7 ^l *03 *67 o6- @@ -22143,7 +22054,7 @@ Y2 O43 *67 *56 *13 i4y i41 i59 -Z5s`j +Z5 s`j i0v i1i i1e i3c sc| @@ -22155,13 +22066,13 @@ D1 o2h O23 D8 p2 { O94 sme -sGi$8 +sGi $8 i0b i2g i1i c i72 -.1$n +.1 $n O15 o0j O02 *02 +3 -sjGcs!K +sjG c s!K -0 ^J D2 O59 O71 $a @@ -22177,7 +22088,7 @@ c $8 $9 $! k i3h $s -8 sv= i1h O29 -i72i80i90iA1 +i72 i80 i90 iA1 c $2 $8 $3 i0a i1n o7z l @@ -22187,9 +22098,9 @@ D3 D4 c $ $7 -2 i0m i6i i7n i8g -sRvi2' +sRv i2' o7~ -^6} +^6 } Y4 O2B O13 -4 -6 -4 D7 D4 @@ -22206,32 +22117,32 @@ O12 i3g $e $w c $X ^X $x ^x l Z1 $y -+3$?s^s ++3 $? s^s r ^M O52 Y5 E i4c l +9 D5 -sUG^0 +sUG ^0 ^s i1j -*9Bsu,i1c +*9B su, i1c i76 D5 i70 R6 L6 oA? Z1 O71 sA` +6 o39 i21 i32 i43 i54 -*31E +*31 E [ i33 o6t O03 $D r O24 ^m $9 $5 $! -s$bo4lsuO +s$b o4l suO r $7 $3 OA5 i9v sah O13 o0C -*52swJ +*52 swJ sFS o7( s(1 *18 p3 *48 @@ -22242,12 +22153,12 @@ $a OB4 l ^o ^r ^p +4 o3g sbk -+2} ++2 } r $4 $7 i18 i18 -sYhZ3 +sYh Z3 Y2 o9i -*28] +*28 ] O39 -1 p1 OA5 O07 i4n *65 @@ -22257,12 +22168,11 @@ r O63 r $4 $1 *87 .1 i68 i79 -*87.4 +*87 .4 l ^o ^i ^b o5v l p3 o19 -0 $1 -E *13 y2 O91 D5 ^e i6r i7e @@ -22273,25 +22183,24 @@ i7a i78 s5s O51 i44 i16 i11 -[ ^b i8Z .8 C O04 O19 syk -c*18K -sq@s){ +c *18 K +sq@ s){ z1 OB5 E -R1*A7K -R9Y5 +R1 *A7 K +R9 Y5 c $9 $2 $6 -*68^a +*68 ^a c $4 $2 $5 c $8 $7 $9 c o79 p4 o0x *9A +0 ^B $r *98 -p5so0 -]D5 +p5 so0 +] D5 O67 O98 Z2 sp% $o O65 @@ -22306,17 +22215,17 @@ t s9! O78 ^- o7U i7f i7d -o65]*2A -s;.$N +o65 ] *2A +s;. $N $M +0 --5*2A +-5 *2A ] $w D0 i5x ^j $s -so3s+K.5 +so3 s+K .5 s9# sAR -.4cY2 +.4 c Y2 } d O04 +7 ^F p3 K @@ -22325,14 +22234,14 @@ c $5 $. i3s i4e i5r $1 $2 $3 $_ o8n O91 -*28.1y2 +*28 .1 y2 y2 OA6 p3 -3 i0c i1a i2n -o9)^d +o9) ^d o6C t O09 i1j -s,(+7 +s,( +7 '9 o7n u i8, Z1 o59 @@ -22340,7 +22249,7 @@ syd OB9 o1j s$T .6 O36 o68 -8 r $6 $2 -*51ss9 +*51 ss9 O01 $x sxp i82 i90 iA2 iB6 O02 o2- @@ -22352,56 +22261,56 @@ O23 p1 O03 i2f O79 i3o i4t c $9 $* -i51i69i79i88 +i51 i69 i79 i88 ^x ] } -i22i30i40i50 +i22 i30 i40 i50 i71 i89 i96 iA3 +3 ^m -sh6*9Bi6Z -s1;i1a +sh6 *9B i6Z +s1; i1a ^T D3 i71 i89 i97 iA8 iBu o5$ OA1 -u*08 +u *08 sJK -*30$l -$L*6B +*30 $l +$L *6B ^1 o8k O95 O73 O53 +3 o4_ o3/ -*1B^M +*1B ^M +5 *65 ^` l } +0 o3i *53 -2 -2 -5 -s0)*56sAX +s0) *56 sAX } c sVR .1 [ +6 *43 O41 +4 i4z o1M { *25 *54 -sXR$9 +sXR $9 swy i38 i72 i72 i56 O28 sDU *03 O51 ^n i81 i99 iA6 iB6 -i31i49i59i67 +i31 i49 i59 i67 D7 o7- Z1 $. -oAssG- -shL^t +oAs sG- +shL ^t l ^p ^u i19 i18 -]R6 +] R6 r $6 $8 i6" O84 -*A8^0*4B +*A8 ^0 *4B i3U E O53 i11 i71 -3 *64 @@ -22410,23 +22319,23 @@ i11 i71 s!2 $9 o76 c $5 $2 $4 -*3B[r +*3B [ r +6 o78 -Y4$b +Y4 $b $i $c $y C $4 $9 d 'B $2 -i21i39i49i58 -s,&Z3 +i21 i39 i49 i58 +s,& Z3 o6m l i1a i79 $3 $* $t O42 } O13 -slny5 +sln y5 s3M OAB p4 -sz|^c +sz| ^c ] y4 $5 oAt '5 $3 @@ -22437,7 +22346,7 @@ c $7 $1 $5 +0 D8 s/X O85 ^c *30 --5.6 +-5 .6 t *31 c -3 c $4 $9 $6 @@ -22468,12 +22377,12 @@ O83 +0 -4 *42 [ *40 k $_ [ [ -*34,6 +*34 ,6 c D7 i4Y c c d '8 +5 -4 -6 -oB -*90^. -*18-7 +o9K s@> +*90 ^. +*18 -7 $# $3 -s0/i6@ +s0/ i6@ t ,7 i1o -4 --2s>Y +-2 s>Y i78 i5a $2 $3 $0 $7 i3a i74 O41 i2o *56 o69 $1 $9 $4 $5 -T9-1,A +T9 -1 ,A i67 i76 $n o9e Z1 $c @@ -22539,52 +22448,52 @@ i5e i6r i3k i4o i51 i69 i78 i82 $o +8 -s%(c*9A +s%( c *9A i9p O57 $1 $2 $@ $@ *65 o0r Y2 $2 E +5 O68 -*20.2 +*20 .2 [ o5l i0r +D -E -E $s *68 *32 *25 -ciBd +c iBd ^p O52 ^j *24 p1 s12 $h ^a -R4*7B +R4 *7B r $8 $1 -o0.^w +o0. ^w i0A i1u i2g --Bo6{o3I +-B o6{ o3I i72 i7d O32 D1 o8C O35 O08 f O8A o8a -*28o01 +*28 o01 iAc O78 +3 -5 -1 -DB^cs05 +DB ^c s05 $2 $0 $2 $6 $1 ^_ srn d OA6 c $3 $3 $! -,7o3r +,7 o3r D1 T1 y5 { -*B5^! +*B5 ^! c d 'A $1 ] o2W +2 +4 +4 -*1B$5Z2 -[*09Z2 +*1B $5 Z2 +[ *09 Z2 Z4 O38 LB -*47*80 +*47 *80 O84 O98 i5c i1a $r $i $k $i @@ -22592,18 +22501,16 @@ $r $i $k $i o4t *45 $* ^1 *91 o9r -$q$l*79 +$q $l *79 D7 $i -[ $9 r $3 $7 { -0 t O91 oAk D5 $0 O21 O62 i4N -s5=shD +s5= shD i56 i66 i76 i0b D5 -D7 $1 O0B s3X .6 D1 i4p -2 *12 +0 @@ -22625,27 +22532,27 @@ $4 $c sH5 i1a i5d i3/ -o2Ssqis>L +o2S sqi s>L scJ ^l '9 -s|9rE +s|9 r E i8G D1 ^B O56 $a OA6 -o7bsV& +o7b sV& $7 O82 O61 OA1 l -y1oAX -iBLR5 +y1 oAX +iBL R5 sNK i52 i60 i70 i81 -sUso9so6& -li6R -*69i8z +sUs o9s o6& +l i6R +*69 i8z O14 z3 -K*70 +K *70 i71 i89 i96 iA7 -i5hsC6 +i5h sC6 -4 { OB8 $m $/ O71 @@ -22653,7 +22560,7 @@ $/ O71 i71 i89 i96 iA4 i81 i99 iA8 iB1 i81 i99 iA8 iB8 -s%JoA|^e +s%J oA| ^e ] $3 ,2 *52 +4 +1 i51 R6 @@ -22681,20 +22588,20 @@ c $7 $0 $2 Z1 +6 *A9 'A Z2 c $2 $6 $9 -sdjsaY +sdj saY c $4 $3 $5 -s^fo4v -D4y5 +s^f o4v +D4 y5 c $6 $6 $8 $i ^d -sfk*1B +sfk *1B c $3 $7 $8 -s!hslbZ3 -o2jo8fT8 +s!h slb Z3 +o2j o8f T8 ] K D5 ] D5 K o41 *13 -s\>z2s$, +s\> z2 s$, +0 o4u i1g -0 O48 $& *35 @@ -22704,7 +22611,7 @@ i25 i33 i70 i57 i6f *76 *08 +4 --5*79R7 +-5 *79 R7 O3B c Z3 +6 *43 y3 O07 @@ -22716,10 +22623,10 @@ s.) OB3 O12 O07 i7, [ p1 O63 -o0C*A4 +o0C *A4 +5 o3k i1f i1f -'6dsx0 +'6 d sx0 i33 i74 +1 -0 +5 i1O t @@ -22727,7 +22634,7 @@ i1O t o4F O09 .1 O64 o8! *8A O54 -sGWi6;o8; +sGW i6; o8; .4 } *24 O56 l o9e @@ -22735,7 +22642,6 @@ l o9e O72 -5 o0r O24 sdg -} o78 E sBi O15 sxS $a t +2 -3 -9 @@ -22747,79 +22653,76 @@ z2 O0B 'A $i O54 ,1 +3 } O52 -Z4t +Z4 t ,1 i1i +8 +8 -0 c $9 $4 $! i9Z c $1 $3 $9 -o6Os6X +o6O s6X i78 R6 L6 i41 i52 i63 i74 slL -$C*74 +$C *74 o4N *23 o7r O82 -4 o52 i8_ p2 -s;qp1 +s;q p1 O32 ^S +9 +9 -1 o4p D1 O24 *74 K .0 -[ ^N o55 p4 s19 Z1 -r p5 c ^1 $3 D4 ^A $7 $! -Y2K*1B +Y2 K *1B i5n *76 i0f i1l -*75*12Y3 -*0Asb+ +*75 *12 Y3 +*0A sb+ i52 i11 i3? i3M O34 o0k *34 O13 -i41i59i69i78 +i41 i59 i69 i78 l ] $D $b sbf -'5 Y5 $j $o $g k OA9 Y3 o2Y t c $9 $2 $! iA2 l O59 d $7 -lY5 +l Y5 c $6 $0 $4 -[y4 +[ y4 u ^" -C*9B -l.6 +C *9B +l .6 i4P O21 OA6 *62 *73 -s2C*42*B9 +s2C *42 *B9 ] O71 -$1o4f +$1 o4f O51 O62 ^d ^a ^b *67 *B3 O76 ^r *03 -*78$r +*78 $r ^M -1 i9B D3 OB5 ^q z1 -s.KY3 +s.K Y3 c o2n c $0 $7 $8 -oBpsgP[ +oBp sgP [ l O39 $% O71 snG c i1i @@ -22829,19 +22732,19 @@ sIC *21 i4t O84 s.@ K o14 -s^_E} -*A2$h +s^_ E } +*A2 $h o3% c $4 $6 $2 R4 *A5 O67 -^dsV6*BA +^d sV6 *BA $! O02 o0x ] sBT O42 i6< o6t O93 p2 i4E E -*95]D4 +*95 ] D4 i71 i57 .4 soV O37 D7 k @@ -22857,40 +22760,40 @@ c $4 $8 $2 c $2 $6 $3 c $5 $9 $6 s7q -*B6sk^$| -s*-*06 -D0*A1 +*B6 sk^ $| +s*- *06 +D0 *A1 +0 +2 +3 O61 *41 i7E O07 *17 O82 +5 ^p O34 -i7ccoB) -y1*57D2 +i7c c oB) +y1 *57 D2 Y3 o0F -i1p] +i1p ] d '7 $0 i5p O12 K O93 $m $e $w -,1oB@l +,1 oB@ l RB p2 +0 -2 -5 i62 i70 i82 i93 $s *56 p2 $S K c $9 $8 $6 -i31i49i59i69 +i31 i49 i59 i69 i5f i71 q O36 i2E $e D4 -$ks"ac -'4y3 +$k s"a c +'4 y3 ^b o2n ] *20 sic O23 --8Y2 +-8 Y2 i9O -6 -7 -9 -8 ^p o1k @@ -22905,7 +22808,7 @@ c $3 $6 $2 c $ $9 O54 Y2 '7 +5 -o5dsw/ +o5d sw/ E R3 i4i i5t iB@ @@ -22915,13 +22818,13 @@ i14 i14 z5 O17 k O08 t Z1 OA3 -*24D6 +*24 D6 $4 O23 oB@ T8 OB4 o6* Z1 -*A9 O24 O51 -s5Qs 2 +DA O24 +s5Q s 2 o7) o3l *21 o7X @@ -22933,23 +22836,23 @@ i5- -6 t -8 .A s1x O27 $5 $a -^MK +^M K i16 i35 -*B5o0Oskr +*B5 o0O skr iAf { $e O13 $1 $t $e $s $t O89 +5 [ l O21 *74 -s=uD8iB< +s=u D8 iB< $9 $@ i6o i7n i8e -$tTB +$t TB i9a iAr iBt [ o5f i52 i60 i72 i80 -*49-8T7 +*49 -8 T7 *21 O38 d ^t *04 s%L O52 y2 @@ -22957,77 +22860,77 @@ i6n i7o i81 c $9 $6 $! '9 i9t slu -*B4E$W -$2p5 +*B4 E $W +$2 p5 D6 *05 i76 i5e p4 o15 -*93^R +*93 ^R +5 o4v ^S r O05 Z1 ] o5g -Y3*37 +Y3 *37 *41 O68 s8l O81 T4 .8 O04 o8z -i4sss2.A -*15*59 +i4s ss2 .A +*15 *59 O87 $n --8o9,sG\ +-8 o9, sG\ ^i ^b -.8Z3 -sbH^0 +.8 Z3 +sbH ^0 R0 R1 -o1vs,C -iBH*06 +o1v s,C +iBH *06 c 'C $7 ^w O34 Z5 O34 iAe O72 O17 s+v Y5 -R7d*8B +R7 d *8B $a $b $c $d O51 o1h *06 O42 i6m i7a -rsly +r sly o6w ] c $3 $0 $2 -.8$J +.8 $J *14 -2 -i4ksL'*39 +i4k sL' *39 i72 i80 i92 iA8 q t -s.X.0 +s.X .0 { -0 p5 -s+2^4 -o2fs24ss' -sQVR7 +s+2 ^4 +o2f s24 ss' +sQV R7 { O74 -sd%o7p +sd% o7p ^X O89 o7Q i42 i50 i61 i72 i3f i1e O02 $f -*78y2sKS -o4fsS0 +*78 y2 sKS +o4f sS0 R6 o0W r ^R p3 *34 Z1 k -7 [ sYB -$_$* +$_ $* i58 O23 -s",o1M -$_$. +s", o1M +$_ $. i97 O63 *61 O02 slz i42 i50 i60 i78 -5 o62 p4 s-* OB3 -i31i49i59i68 +i31 i49 i59 i68 ] +6 ,4 r sRG @@ -23035,9 +22938,9 @@ sRG sJC o1z ^j [ $0 -ko76 +k o76 i76 R6 L6 -iA]*65 +iA] *65 i5d i7d c $2 $k i52 i60 i70 i85 @@ -23045,14 +22948,14 @@ D0 o6g +B -9 -A O12 -4 sbe O57 c -.8i5j +.8 i5j D2 D1 D4 D5 -i72[ +i72 [ *03 O59 D7 $0 O19 o6y l -TAo1{o9e +TA o1{ o9e +2 +8 +8 $2 $m $e u L8 @@ -23068,24 +22971,24 @@ $1 $1 $@ $@ O36 { z4 'B [ Z1 l O2A ,4 -Ei4@ +E i4@ i2R c i5s D1 o3v *23 $M [ [ $f -Y4s(\ +Y4 s(\ i1a i70 Z1 D3 +5 -4 -7 -4 'A o8m sik O38 OA6 t O54 -cs0< -smO*95i9X +c s0< +smO *95 i9X i79 R6 L6 +C +C -B -*B1*94$8 +*B1 *94 $8 +2 -4 -4 +5 -1 +5 ss# @@ -23104,14 +23007,14 @@ o0J t $* i6* ^4 C i5e i6r i70 -+0sGo ++0 sGo -2 ^c i0h ^d siX O75 $A $2 $. ^C p4 -^Gi6= +^G i6= i78 i7a soU +3 +6 +6 @@ -23124,28 +23027,28 @@ r D6 ^G D3 +0 -3 -2 O64 i0k -+1-A ++1 -A +0 -D $s [ O32 -*69^@ -iB6Y2 +*69 ^@ +iB6 Y2 y5 O91 R5 R5 i0j i1a c $f $1 ^s l -i3s.3 +i3s .3 '6 $k o2- *01 ^o ^l o3t O53 iBn O75 +5 -$Cs8e -$esfNl +$C s8e +$e sfN l $w D8 [ slt k K -sd{iB) +sd{ iB) O13 *31 O78 $u ^e O71 @@ -23159,14 +23062,14 @@ o3[ O12 *01 D1 ] ,2 *74 +5 i5# -}+1 +} +1 O79 D8 c o77 i1H -3 *57 ,6 +3 o5- O03 -R4s-vq +R4 s-v q T7 o13 C '7 $2 $f $u @@ -23174,12 +23077,12 @@ i01 TA z2 c O2A syo z1 i1t -'5s+{Z4 +'5 s+{ Z4 OA2 [ O1B '9 O61 O76 i8g O13 ^x -*56*12 +*56 *12 i4? ] $o f +0 } @@ -23187,13 +23090,13 @@ p4 ,9 i75 i5e l s12 $b $6 -i52i60i71i81 +i52 i60 i71 i81 $n O65 i5d *05 o0b K O63 O74 ] $h sg` O87 -Y4s6} +Y4 s6} ^g O95 o0e o3l D6 o2d @@ -23201,16 +23104,16 @@ D6 o2d +5 o47 +2 o75 R5 O13 -s%<$u +s%< $u R8 O62 -Z1sd! +Z1 sd! *10 +7 Y2 -1 i0g O14 i1t s.8 O69 sQu -o39i1v -Z2}*01 +o39 i1v +Z2 } *01 sAe *54 D2 oAl @@ -23220,16 +23123,16 @@ $4 $b i62 i78 t o4y z2 o1l -i2|o8L*9A +i2| o8L *9A [ DB O91 $$ Z2 -i61i79i89i99 +i61 i79 i89 i99 i7e -8 O31 O42 -*20*39.B +*20 *39 .B D3 -6 *52 O2A -i6mo0q +i6m o0q so0 T7 t s52 *62 O02 @@ -23239,8 +23142,8 @@ l $w $o $o $d -9 D7 *35 *50 +5 *15 *23 -slU*B1 -s<`lZ1 +slU *B1 +s<` l Z1 c $9 $7 $0 c $9 $7 $5 s9+ O28 @@ -23248,9 +23151,8 @@ c $9 $2 $5 c $6 $0 $5 t o0n } o1o -'B Z1 [ $ $m -o2V*B6 +o2V *B6 T7 O93 p1 O82 'B O23 y3 @@ -23258,22 +23160,21 @@ c $8 $2 $1 o22 +0 ^n ^u ^s c $e $r -$GL7'7 +$G '7 i2h *42 -[ $k i6G } ^i ^i ^n ^i ^m c $1 $8 $3 c ^3 ^0 ^0 ^2 -DAsR[$c -*A2D0sek +DA sR[ $c +*A2 D0 sek T4 OA6 Z1 c i68 O7A O21 s#+ O52 p1 -*A7-6Y1 -*02*24y4 +*A7 -6 Y1 +*02 *24 y4 D5 } $e *67 c $5 $8 $2 @@ -23289,37 +23190,37 @@ O18 z1 s_P +2 ^L l ] $C -7 o80 -sC1o6Ps}% +sC1 o6P s}% oAl 'B i5n +3 o6j O02 Z1 O59 O28 Z5 -R4^q +R4 ^q svf c $6 $9 $2 $2 ^B c ^7 ^0 ^0 ^2 -^_E +^_ E o8a +9 -*39o0i +*39 o0i O43 ,3 o0t o3w +0 ^L -*B6Ci61 +*B6 C i61 i0s i1k sSW i49 i59 -sMQsTd$u +sMQ sTd $u i1d i1d i76 i56 $k +8 i13 i33 -*0Bsk-*A8 +*0B sk- *A8 D5 i7c sJD sJB -^cY5 +^c Y5 +5 *12 s.1 c o84 @@ -23327,8 +23228,8 @@ s3- o7v i7t *48 O43 +7 -6 -0 -$.*2Az1 -$/,9 +$. *2A z1 +$/ ,9 c o39 -A O79 O43 *B3 $< @@ -23339,38 +23240,38 @@ o1l *53 $1 $2 $3 $? +6 -4 +6 T0 T1 T5 T4 -*47*39,9 +*47 *39 ,9 Y1 o4n O94 ssX +4 -5 -6 O2B s7k oAL *87 O13 q -s%{RB -c$1$2$3$& +s%{ RB +c $1 $2 $3 $& i8k D6 -*B0^g +*B0 ^g ^N *06 O52 K o53 *1A O83 *09 $f $o $e { -4 c i5" -s^'$u +s^' $u +1 ^r -3 ^v c $5 $2 $7 -y5sfy -y1z5 +y5 sfy +y1 z5 o1u O56 T0 O13 ^1 -2 -8 -2 z3 T4 -smYo7n -]p2DA -D9,A*9B -s0HL8 +smY o7n +] p2 DA +D9 ,A *9B +s0H L8 c $6 $4 $0 -*8B.4TA +*8B .4 TA *B9 O73 ^c c $? $1 '8 *74 @@ -23382,7 +23283,7 @@ O71 +5 +0 +7 +3 $2 $6 $1 $0 +A -9 +B -'B*31o1! +'B *31 o1! *46 -7 i1o i2t i3o Z5 OB7 @@ -23416,7 +23317,7 @@ $0 $0 $7 $! [ o4w o4f D6 D4 r O83 -$!$. +$! $. +0 O24 O51 -7 T6 $9 @@ -23431,18 +23332,18 @@ l ] $s $t O04 O04 $r *32 O92 -smoc +smo c O51 i5N *04 D1 -}*21 -*87$2 +} *21 +*87 $2 ,2 z1 O29 +3 ^i -0 ^l ^p *40 -Y2Z1*29 +Y2 Z1 *29 i0w *30 -+9s-"C ++9 s-" C *76 Z4 O02 i2` O51 '9 @@ -23453,14 +23354,14 @@ i41 i51 o0k z1 ^m ^o ^c c $4 $0 $2 -sq5^m +sq5 ^m i74 i50 c $3 $9 $7 -i31i49i58i62 --6y3l +i31 i49 i58 i62 +-6 y3 l i32 i1a -D7s=w^u -$jsXp +D7 s=w ^u +$j sXp *58 *76 ^t ^a ^c O32 $A @@ -23468,20 +23369,20 @@ i80 i90 c o6_ i6u +5 i42 i50 -*23p5 -'7.5-7 -o71o6j +*23 p5 +'7 .5 +o71 o6j l ^t ^o ^h c $9 $6 $1 -*53o96*32 +*53 o96 *32 O84 d { -o2+*29*27 +o2+ *29 *27 -5 ] iB% O59 o2+ $1 $9 $5 $6 i65 i75 i85 *61 O03 k -$IEy5 +$I E y5 i3a i4m i5o i1c i71 i5e i7f @@ -23503,10 +23404,10 @@ o3. O56 o8' *39 +5 i0f i2e i1r -D9s_;^U +D9 s_; ^U o60 Y1 K O4A u -i21i39i49i54 +i21 i39 i49 i54 $/ O3A sjQ u o8s i19 i10 @@ -23515,14 +23416,14 @@ o1A E c $5 $6 $9 ^n +3 $1 o6c -soli31 +sol i31 $1 o6l D2 O03 K i33 i76 o9R O51 i3m c $ $8 -+8*42 ++8 *42 s3o o0~ ^S i29 .2 @@ -23538,22 +23439,22 @@ o57 o63 *51 D2 +8 o7_ ] *59 O73 -sBci3b +sBc i3b .6 D8 -^RL8*9A -se'.9 +^R L8 *9A +se' .9 -7 i7t i6< +3 { ^2 D4 -4 D6 -$gsA9.5 +$g sA9 .5 ^D o2D i6m O06 i52 i60 i70 i82 -i9Rs;c +i9R s;c i8- T0 -*5Bi7i'9 +*5B i7i '9 O73 o6Y *59 i71 i89 i96 iA2 i5n ] @@ -23562,7 +23463,7 @@ i5n ] O72 o0v i7N $5 $5 $4 $4 -*A9i2g +*A9 i2g i5O O45 $1 $3 $7 $7 i72 i80 i91 iA5 @@ -23575,9 +23476,9 @@ slK i16 i19 'A O42 -1 ^A -D2i9^ +D2 i9^ i71 i31 -^t*B8 +^t *B8 +5 i51 ^a *24 O91 +B @@ -23588,24 +23489,24 @@ l *86 D2 K O03 s1x E ^C -i42i50i60i77 +i42 i50 i60 i77 i34 i71 i1i -6 ] +5 -$-$* +$- $* sCF -o46skr +o46 skr c $6 $4 $8 O0A *92 Z5 D5 O23 ^3 ^R -.1c +.1 c c 'D $9 i0j i1u c $7 $1 $4 ^A D3 -swn*67 -$ $! +swn *67 +$ $! -B O0A ^Q i2a -4 O53 *56 @@ -23618,16 +23519,16 @@ O05 f ^u O15 ^s i0h i81 i99 iA6 iB5 -*16s@.$[ -*BAY2 +*16 s@. $[ +*BA Y2 c $0 $9 $3 i1a i73 D7 Y3 O32 --1u +-1 u O23 C ^o *30 *04 +3 -R9sn+ +R9 sn+ ^z O42 s4[ l OA1 i5l -6 @@ -23669,26 +23570,26 @@ sne o5y T0 ^1 ^K $g K +6 -+5s(6Z1 ++5 s(6 Z1 *71 o68 *87 +8 -z2*54 +z2 *54 O48 o9{ -s(Osu8'A -s]|i0Ps0c -y3*8B +s(O su8 'A +s]| i0P s0c +y3 *8B D1 i5n O53 ^- ^g c $6 $7 $1 $e $s $s O61 o8e d '7 $6 -y2s0W +y2 s0W *59 o90 'B $5 c ^1 ^! c o88 -+9*35 ++9 *35 f O67 E c $2 $7 $9 c o2k @@ -23716,17 +23617,17 @@ d O2B i6m i7a i8n i71 i89 i97 iA7 sdc sjm O49 -+0t ++0 t ^C } c ^6 ^8 ^9 ^1 c ^X $X $X ^X u '6 'B Z2 sy! -z3sVC +z3 sVC i1q -i31i49i59i64 -s8@sfzC +i31 i49 i59 i64 +s8@ sfz C t ,9 c d 'A *A9 o9n @@ -23739,7 +23640,7 @@ o8> { { c { +1 l o48 K -sTDo5O +sTD o5O t ,3 o1b o0r O54 p3 @@ -23749,7 +23650,7 @@ T0 std D5 OA5 O52 i4r i9Q -i3I}s-t +i3I } s-t p2 OA4 o1L t k i3b i32 @@ -23765,23 +23666,23 @@ i3d i32 $5 Z5 O56 i1d i71 z1 i1s -^PK -.5Z3 +^P K +.5 Z3 i51 i69 i76 i87 ^r O96 O5A sas i31 T4 i7e i1a c $7 $6 $8 -spvswl +spv swl *12 o1b -$]$[ -*B8ssJ +$] $[ +*B8 ssJ +5 { *B0 O07 -4 +2 $A O02 +6 -so=$= +so= $= i74 i5a o0k *46 i13 i34 @@ -23801,14 +23702,14 @@ Z1 +B -A Y2 DA -2 sdy sau O43 -*B1i88*64 -suiD8 +*B1 i88 *64 +sui D8 ^n D1 O61 -$ksy# +$k sy# sdy DA $v O67 Y3 D1 -i9?l +i9? l $2 $2 $2 $2 *74 *65 c r $5 $3 @@ -23816,7 +23717,7 @@ l i7e c $e $5 c $e $3 c $2 $b -s|qc*8A +s|q c *8A ^C O32 o2& o5K @@ -23833,19 +23734,19 @@ u $9 $9 $9 $r $p +0 -3 -6 $9 $9 $! -*68+3l -c$1$2$3$/ +*68 +3 l +c $1 $2 $3 $/ $e +0 i3t i4h i5e i1b i1c t o8m $g Z1 -[^fK +o0f K l -A Z4 l O96 ^h o1c sa6 -i52csdD +i52 c sdD i4a *36 i17 i17 i1? @@ -23857,11 +23758,11 @@ $a ^Y soO +1 -5 +2 ssJ -s^4i3d +s^4 i3d o9d O63 OA3 +5 ,B $9 O53 -R5L5*B8 +R5 L5 *B8 O6B d O63 i73 s1S @@ -23903,7 +23804,7 @@ c $5 $5 $! ^G *31 O0B o9L sEY O52 Y5 O8A -Z4sBW +Z4 sBW c $1 $1 $@ $@ s14 O52 k ,2 @@ -23920,12 +23821,12 @@ c $1 $0 $0 $! $6 $! O27 E $1 $9 $5 $7 -iAUty2 +iAU t y2 i0s i1e *20 o5s sF| s/M O95 +A $9 -*4Ai7? +*4A i7? i41 i59 i65 i5m i6a i7r +1 O24 @@ -23938,12 +23839,12 @@ DA c r $4 $9 +0 +4 +4 { ^F -+6Z2 -.9*BA ++6 Z2 +.9 *BA so0 T4 i75 R6 L6 -$+o8Ys^x -o5l*6Asi( +$+ o8Y s^x +o5l *6A si( $p O75 Z2 OB5 $K O49 @@ -23963,22 +23864,22 @@ i72 i80 i91 iA6 i82 i90 iA1 iB7 *79 O82 O42 +2 -*63*49 +*63 *49 i3d i72 O94 L5 -y4sg{ +y4 sg{ ^m ^b -4 $A +2 O36 *A4 *4B -sP^R8D2 -sF3o34oBn +sP^ R8 D2 +sF3 o34 oBn i82 i90 iA2 iB9 z1 *13 sJS p5 i9r $2 ^2 u $1 $9 $9 $6 i0F s7Z O5B -$@$* +$@ $* o4Z o5p o7n s7O E O71 @@ -23996,14 +23897,14 @@ l $e $n $t O52 i2u K $e i6q -sBmd +sBm d +1 *54 ssg -s(Us2Ds]I -,BY1+0 -*2BR4 +s(U s2D s]I +,B Y1 +0 +*2B R4 ,5 *43 -]k +] k i3a i72 OB4 TB c T8 O04 @@ -24014,16 +23915,15 @@ c ^d ^1 *A8 O71 O42 +2 L6 *6B u -O51 E i3$ *81 -0 +5 r -*70iA9+9 +*70 iA9 +9 i77 i5e c ^a ^2 $b $8 Y4 [ -D5d +D5 d c 'C $0 sRT i30 i1a @@ -24031,48 +23931,48 @@ i3b i31 K ,3 i1c i3a *04 *B6 O34 -sqey1C +sqe y1 C i75 i54 oAQ -*31E*B3 +*31 E *B3 i32 i74 d $3 -K[+A +K [ +A snR OB2 d '6 $3 O53 ,7 i71 i5b i1a i5b o0t *31 -i11*41 +i11 *41 o3= '5 ^! ^R $5 -$ziB^o7z +$z iB^ o7z i51 i3d O24 -0 L9 s1k sd, -*7Ak -.7$R -$O-A -L9s@- -+5Z2 -*52$vo0d -i62i70i80i99 +*7A k +.7 $R +$O -A +L9 s@- ++5 Z2 +*52 $v o0d +i62 i70 i80 i99 l OB7 O54 -sISZ5 +sIS Z5 d 'B $7 i1a R2 L2 -$csu8 +$c su8 i77 R6 L6 O71 y3 O91 o7J -E$# -oA;.1 +E $# +oA; .1 Y5 O34 o5d O71 -LB$z +LB $z O78 d O46 -7 q O48 i3k O26 @@ -24081,42 +23981,41 @@ O32 O83 .5 i70 R8 L8 O0B *3B p2 i52 R6 L6 -'Bts\| +'B t s\| i38 i3e *9A O72 -*95d*60 +*95 d *60 ^x *31 seO -s0HrY3 -'6s9[ +s0H r Y3 +'6 s9[ O31 y2 O61 -*73o59s'T -ly4 -s_\sbK-0 -[^@ --9sQ= -o8P-2 -dsOQ +*73 o59 s'T +l y4 +s_\ sbK -0 +-9 sQ= +o8P -2 +d sOQ ^V O42 c d '9 -o69oBMK -*14iA9 -Ck +o69 oBM K +*14 iA9 +C k *12 O1A K -^Eo6biA) -l*B6 -^rs6;*48 +^E o6b iA) +l *B6 +^r s6; *48 r O8A *15 -*0BsRJ +*0B sRJ .7 O74 -$*$+ +$* $+ c $e O31 O19 ^b *02 c $x O19 *57 -$=,8 -+9.9 +$= ,8 ++9 .9 o53 ,6 sES iAb @@ -24124,11 +24023,11 @@ o1} c $0 $@ i5E $5 $! -*97i2p +*97 i2p *8B O64 ^M *46 ] $j -sg]^RK +sg] ^R K i61 i72 $j $o $h $n l o0z @@ -24161,12 +24060,12 @@ c $9 $8 $2 c $1 $9 $4 svd i41 i55 --0^q +-0 ^q $0 $! c $8 $0 $4 *73 { O3B -sM<]y3 -Y4smP +sM< ] y3 +Y4 smP $s $o $n $i c $6 $9 $1 O73 $z @@ -24179,30 +24078,30 @@ c $6 $0 $8 c $5 $3 $9 i7S K c $9 $2 $8 -*40Y4^3 +*40 Y4 ^3 i14 i13 sid l ^c [ i0G +9 p4 K T2 -i5ri49 +i5r i49 r *53 *05 O21 sbH O52 +4 -sD|*21 +sD| *21 i7P -o9\$/ -o9+Y4 -$`l-B -*96i6/ +o9\ $/ +o9+ Y4 +$` l -B +*96 i6/ i4r i5y $A +7 +A o6_ *57 $A i0a ^m ^k sPk -D7Y1 +D7 Y1 *14 O35 O91 K i7l D2 @@ -24224,7 +24123,7 @@ O53 *64 ^m f ^t *34 i6p -7 -$ O56 @@ -24582,7 +24479,7 @@ t o5u i78 i5e i3d *63 sDC O81 ^Y -s9coBE +s9c oBE i3a i73 -0 O13 i51 i69 i77 i83 @@ -24597,13 +24494,13 @@ p1 y1 O39 o9_ *98 i7i +3 OA1 T9 --5s\s*07 +-5 s\s *07 o3L c O3B -3 [ Z3 o74 o85 i82 i90 iA2 iB4 -$NE +$N E O7A ^R d 'B $3 ^r +5 @@ -24622,7 +24519,7 @@ $d *92 O0B syI ^n ^o i55 i5e -Y5,8T2 +Y5 ,8 T2 ,7 O12 s1F O03 T4 } OA2 @@ -24650,12 +24547,12 @@ i5g o4a [ s07 $m +6 c $4 $7 $2 -i24LA +i24 LA -1 T2 -*13s7y] +*13 s7y ] T3 $1 sSO -sK!T0 +sK! T0 o1d o2e i81 i92 iA3 iB4 O42 Y3 @@ -24670,8 +24567,8 @@ O05 ^r o3# o71 Z1 *13 sau -$0*30svi -s&l^#l +$0 *30 svi +s&l ^# l snf sgb -7 D4 @@ -24700,14 +24597,14 @@ i15 i19 O06 Z5 o0J z2 D2 i3c i1a -y1*90 +y1 *90 c $9 $8 $3 .0 y2 O57 sIN OA9 o6T 'A o7b c $4 $0 $3 o76 Z1 -D7,3 +D7 ,3 o86 Z2 o67 l u s5R @@ -24716,35 +24613,35 @@ Y3 O52 c $5 $3 $2 $4 $. i3e i5f -i8pD5p1 +i8p D5 p1 c $9 $5 $6 o5~ -sS9o1O +sS9 o1O i6X t O02 z2 L6 O27 O79 -'A$esT, -sw1sdS -i21i39i49i53 +'A $e sT, +sw1 sdS +i21 i39 i49 i53 c $3 $8 $4 sP| O43 R8 o5F sng *37 +0 -sc^R2 +sc^ R2 skv -*30sbRo0I +*30 sbR o0I *58 OB3 l ^d ^o ^o ^w --6uD9 +-6 u D9 '7 $n D7 i4y y3 $4 [ +3 snz -c$1$2$3$= +c $1 $2 $3 $= i78 i57 y4 O67 -L7s?{ +L7 s?{ i79 i7d y2 O34 i51 i69 i77 i89 @@ -24754,12 +24651,12 @@ skl O47 o7^ O41 ^v -0 -9 -3 -sOW-3 +sOW -3 -5 $1 -.B z3 O5A +z3 O5A sdi -s_N*71 -s&'s5L-0 +s_N *71 +s&' s5L -0 +4 +4 -8 O25 .A O19 r +0 @@ -24767,11 +24664,11 @@ sh\ -5 $3 i3f i7e ^E ^D -i31i49i58i60 +i31 i49 i58 i60 D6 i42 +8 OA2 i8r -$fsc) -*85sL8 +$f sc) +*85 sL8 $5 +5 $4 Z3 $4 { @@ -24787,16 +24684,16 @@ D2 y3 $y +7 .5 o1m O18 -0 -sJE]y3 +sJE ] y3 D3 ^8 ^e ^c ^i $@ O02 +A -B -9 -*B2o1A +*B2 o1A +3 +5 -6 c $1 $5 $! ] ^Y O23 -TBsWX +TB sWX -3 o97 i90 c c $5 $8 $6 @@ -24816,19 +24713,19 @@ o70 $9 O52 *25 o9B i2" -$gsb, +$g sb, *34 ^p Z1 O42 i71 +8 i1q O7B ^f ^V -i8A*32*14 +i8A *32 *14 c ^b ^1 +6 o2s z1 O49 i51 i62 i73 i84 z1 ^w -,0oA#^^ +oA# ^^ c $0 $7 $9 o4& OA7 c $5 $6 $8 @@ -24841,34 +24738,34 @@ $a i0f E ^i ^r ^t $7 $* i52 i3a -,4]i92 +,4 ] i92 i36 i79 $d +6 -^X*89 +^X *89 K -1 c $0 $5 $8 -srF*21i0G +srF *21 i0G c $7 $. -C+8s\Z +C +8 s\Z s?& O03 -T5RBy1 -oAu*32 +T5 RB y1 +oAu *32 i7b i72 sMP -s6c^Q +s6c ^Q OA8 O35 OB8 c $6 $1 $4 -o67$Z +o67 $Z i5m i6a i7n *42 *21 -s%VscrslY +s%V scr slY sCG O91 O06 i0g z1 o69 Z1 c $X ^X c $2 $7 $1 -+5^" ++5 ^" sKZ o3z c c $2 $7 $6 @@ -24879,7 +24776,7 @@ o8B sLD O03 *34 s1I -Y5swu +Y5 swu ^S O14 i3a i4s i5d i2f +4 o2i @@ -24895,12 +24792,12 @@ i1a i11 Y5 O16 i14 i31 spx -^r,3 +^r ,3 i51 R6 L6 i6A Z1 sWw z2 E -s5?*7B +s5? *7B $g +6 O32 y1 *86 si8 @@ -24911,14 +24808,14 @@ O17 *39 O57 i85 +7 OA8 +1 +1 +4 +4 +6 +4 -*41sL+i7x +*41 sL+ i7x c ^1 ^a -]i7- +] i7- $1 $6 $1 $0 $d o6x i8K C *49 O67 -i8tt +i8t t c $- $7 *32 ^A i8v ] @@ -24928,20 +24825,19 @@ O36 y2 O09 T4 O52 $6 $1 -6 -s,Jo9}swq -$CsD7 +s,J o9} swq +$C sD7 O76 +0 i7Q *52 o3k o1o o2n $0 -5 -y3 [ $4 o5v ] O82 i19 i31 c $@ $0 +D -A i6@ O02 -$@$_ +$@ $_ $s O34 i7I c $7 $6 $9 @@ -24950,7 +24846,7 @@ sae $1 O21 i42 D7 O05 -6 i7d -synY4 +syn Y4 o6s O01 u L6 +5 O04 @@ -24971,12 +24867,12 @@ o1< +C +D +C c $3 $9 $1 D5 o1a -'Bs&j +'B s&j $n o7l -s`n'5Z5 -i31i49i59i63 +s`n '5 Z5 +i31 i49 i59 i63 o6z [ -s.ID2 +s.I D2 +5 o79 d O8B [ o4j @@ -24992,53 +24888,53 @@ i70 i1e ^B O32 i8i i9n i3c i31 -i81i99iA9iB9 +i81 i99 iA9 iB9 sSM D6 $B O93 D0 c i30 -o4)sbn +o4) sbn i1x o0a ] iAh o3n *35 swf Z5 s6J O34 $s +3 -o8ts(h +o8t s(h i4h O2B -0 o52 su7 ] ] $e O34 O09 *02 -Z2s!7 +Z2 s!7 ,8 OB5 p5 c $6 $8 $1 -*46$7 +*46 $7 +B [ -sev{ +sev { +5 -6 +7 *76 +5 +8 o5s R8 D1 i22 i30 i41 i50 -0 ^2 -to9l+B -$*$$ +t o9l +B +$* $$ O4A ^r *23 o1d i11 i31 i51 i71 -$ss+) +$s s+) -6 *63 c $8 $3 $0 $b $9 -^Ql-3 +^Q l -3 c $3 $# -T3*93f +T3 *93 f *46 O05 i5d i3d s74 +8 $o $h $s -*A2srs +C +A s>s i72 i32 $1 $9 $9 $0 $! D9 -7 @@ -25197,61 +25093,61 @@ $f $0 i52 i1e i71 R6 L6 -1 -3 -8 -.7C +.7 C i17 i11 -sHRE*05 -Y5y5T2 +sHR E *05 +Y5 y5 T2 c $9 $1 $7 c $7 $& +3 r -*6B]k +*6B ] k OB5 L8 *7B O64 O21 O25 o2u i3y ^( '4 y5 u -^--B +^- -B i5x D3 i34 i72 i2h l -o4do37 +o4d o37 $l $a $n $d +2 +2 +9 r $5 $1 i52 i5d O52 Z3 O79 O36 y5 -i21i39i49i52 +i21 i39 i49 i52 o7` l $X ^X ^x $x -o0B*0B +o0B *0B i74 i57 -iB".2 +iB" .2 c ^! ^1 'C $7 *46 o54 +D -C -C -^-sj%sr\ +^- sj% sr\ +0 T2 z1 -3 -$fsO]-B -o9Wi1poAb +$f sO] -B +i1p oAb O82 o0M i5Z -.7*85*4B -*68*06 +.7 *85 *4B +*68 *06 O89 *81 i52 i60 i70 i89 *02 $o -DB*04 +DB *04 i61 i74 i87 *86 +7 R5 +4 l -4 D7 ^d -3 O27 z5 -svYo7c +svY o7c i76 i7a ^K O42 r $3 $9 @@ -25262,25 +25158,25 @@ c $` $1 ^G $2 D3 sYS o4V K -*64D7iA8 +*64 D7 iA8 O03 $1 sLB } -3 ^p } c $6 $8 $2 -sP[Z4 +sP[ Z4 stP c $4 $4 $$ $$ -^5sK? +^5 sK? $3 $3 $3 $! +6 -0 -3 R5 l +4 +4 -7 +6 -^b*07d +^b *07 d +4 i1l D3 scR s|k O38 O78 -o6wo0[ +o6w o0[ $o O42 O07 k Z4 D3 @@ -25288,29 +25184,29 @@ D5 O04 T4 Y3 O12 i7a i3e O64 ^d -i1cs;5 +i1c s;5 ^1 ^B z1 *50 Z1 T4 d O5B -o5xD2 -s3#^p +o5x D2 +s3# ^p c ssO u $1 $9 $9 $4 +0 $* $p $o $x -sjbEo5A +sjb E o5A i21 i35 o5r -7 *54 +7 c $7 $6 $1 -T1skr +T1 skr o0V +2 R0 O21 O18 -.As#j +.A s#j i42 i50 i60 i73 O81 O42 -Ky2*17 +K y2 *17 o2i ] D3 ] o2s c @@ -25318,7 +25214,7 @@ i5i i6t -0 ^u D3 o1g i5T -$#$* +$# $* O07 z4 say c $4 $1 $9 p4 O23 .B @@ -25326,7 +25222,7 @@ o7& oAx O5B OB1 $1 '6 i3- *34 -6 -sJt^h +sJt ^h c $7 $8 $2 +6 *54 .3 p5 @@ -25334,14 +25230,14 @@ i2/ i5/ sDW T5 D4 $k *51 -o7GsLm +o7G sLm sqD i3w OB7 i6j i7a i8n c ^C c $8 $1 $9 O17 O51 -o8SoAw +o8S oAw y3 s1b O75 -3 *03 +1 c *65 o65 @@ -25352,7 +25248,7 @@ $2 $D } +9 O61 y4 OA2 *35 ^B -.7*51 +.7 *51 Y1 *A2 O62 $1 $9 $5 $0 *05 l O36 @@ -25361,19 +25257,19 @@ c $8 $. ^4 $4 $1 *02 sN4 O93 OB6 -$%$$ -i42i50i60i71 +$% $$ +i42 i50 i60 i71 i3e i2s y2 c ^1 -7 o5g o8j D7 -$%$^ +$% $^ ^b O8A K *54 -i9Io7b -i8-sP8 +i9I o7b +i8- sP8 c $6 $8 $3 -^h,1 +^h ,1 $2 $3 $! $! -3 *16 ^l ^r @@ -25386,18 +25282,18 @@ K -0 i76 i7e ^} -4 i5d --7^k +-7 ^k D3 i24 *89 -7 O89 *69 T0 s3! c $9 $9 $@ $@ -L7iB2 -+B}l -o77*16 +L7 iB2 ++B } l +o77 *16 O59 p3 -oB8^miAZ -^po1a +oB8 ^m iAZ +^p o1a c ^4 ^8 ^9 ^1 ^M O06 i1u i2z @@ -25414,7 +25310,7 @@ O26 *A5 O08 sSd ^z o1Z *41 ] -+8oBL[ ++8 oBL [ $! O84 ^R .5 i31 i74 @@ -25424,7 +25320,7 @@ s2+ *15 O12 +5 o72 c $2 $7 $3 -o8eRA +o8e RA sgd OB5 c $0 $3 $1 c $1 $7 $9 $3 @@ -25434,7 +25330,7 @@ sgL i13 i35 O16 p2 l T4 '8 -i32i40i50i65 +i32 i40 i50 i65 O5A si3 ^2 i0S $N u @@ -25450,7 +25346,7 @@ $1 $1 $* $* i7r p5 D7 $5 o0S i3x -[ [ O43 +O02 O43 o0n *61 O46 oA^ { ^9 @@ -25458,9 +25354,9 @@ s($ slH O18 +0 -5 +2 $b $t T6 o70 -*29sg5 +*29 sg5 +0 +6 +6 -sueD4 +sue D4 u $0 $0 $7 K ^S i73 i3e @@ -25468,7 +25364,7 @@ O03 ^5 c o90 snj $m $y $s -*7B^Z +*7B ^Z ^J D3 i38 i3a O62 $n @@ -25484,55 +25380,55 @@ O07 ssu d OB8 oAZ $1 $9 $9 $0 $* -$^$( -o64s"Ur +$^ $( +o64 s"U r O7A $p O76 $5 O32 c $3 $9 $4 -*9B^I +*9B ^I '8 k +4 O81 i1e i31 D6 $9 s3S -+6i6sR0 ++6 i6s R0 ] o5x [ o04 O5A [ i40 i59 o7" t O13 -s;#p1 +s;# p1 K ^g -us+M -^t+9TA +u s+M +^t +9 TA i3d o1r *71 ,7 OA8 r R6 O18 -i18Y5 +i18 Y5 u $y +1 +2 +7 +4 +5 -6 iA6 iB6 iC6 -*93i6s +*93 i6s .4 o5i p3 $j O62 +4 +4 +5 -sEG$? +sEG $? i18 i17 iB* OB5 Y1 $A $5 T0 i2d +2 sui -$=o67 +$= o67 O98 p4 $9 i60 +1 o8A O61 i3l -5 *25 $w $b -.6o0Z +.6 o0Z i2k i0t o87 +6 O46 ^S @@ -25545,7 +25441,7 @@ $m O43 T3 T9 i0p i1h o1a i4- -ts3B +t s3B t o2X $n $k oBZ @@ -25556,7 +25452,7 @@ so0 si! i7o i8n i0e i1s o4b *42 -szl*B8 +szl *B8 sis i10 i31 *17 +1 O61 @@ -25564,13 +25460,13 @@ i3a i4l i5i T8 TA T9 D9 +6 O81 si1 T7 -i41i59i69i79 +i41 i59 i69 i79 L9 O72 sk/ y5 O04 o44 *56 O82 O92 O34 ^p -}E +} E o8e '9 O07 sR0 q O08 @@ -25589,7 +25485,7 @@ p1 O87 { $i { $2 +3 o6e -i0Ho8O +i0H o8O *57 o56 i63 i70 i80 *54 D7 @@ -25613,7 +25509,7 @@ d i7a o4c c ^z -1 O51 ^2 -T8*9B +T8 *9B ^c } i62 i71 c T3 T2 @@ -25623,8 +25519,8 @@ d 'B $8 *02 ^f i51 i3b c $5 $@ -sjPs0H -rk*B3 +sjP s0H +r k *B3 o5w +7 i3e i4l ^n ^u @@ -25643,8 +25539,8 @@ i3c i3c s38 +8 *35 *41 i3d i7e -$!*05 -$/i8` +$! *05 +$/ i8` $s -1 ssV ] *79 O52 @@ -25659,57 +25555,56 @@ i3b i3b c $8 $4 $5 i6z D4 i37 i79 -$'$' +$' $' T1 ,7 -ls8OC +s8O C z5 O18 o0z } ss1 -*0Bi2v +*0B i2v ^. ^t o0g +6 -[ ^x '8 -5 c $8 $1 $6 '8 -6 D5 *46 -+5$% ++5 $% +5 k o0j o1( O12 $r -i3.*32i80 -cD5sK\ +i3. *32 i80 +c D5 sK\ i52 i31 $s i0h -3 o4s -o9D^M*A4 -kcs*K -.3*7B] +o9D ^M *A4 +k c s*K +.3 *7B ] i2n i3i i4s -$*$& -i3fs!6 +$* $& +i3f s!6 $0 o87 i4d *04 [ o7i i33 i3a s5k *12 [ ^R -o75o4m -*A7^M +o75 o4m +*A7 ^M s9M D7 ^Y i71 i58 -i32i40i50i66 +i32 i40 i50 i66 *47 ^1 -*2AsC#-5 +*2A sC# -5 c $8 $9 $5 -$w+7y2 +$w +7 y2 i7P c i16 i56 -sv9$p -Z1*4B.2 +sv9 $p +Z1 *4B .2 ^k D6 -*75i6-iB# +*75 i6- iB# r O47 OA3 o7J i31 i42 i53 i64 @@ -25723,18 +25618,18 @@ o6t D4 c ^J i5b i3a *15 Z4 -ssL*89 -y3*74 +ssL *89 +y3 *74 O34 .5 i51 T6 $1 d ] O08 i3" -9 $5 z4 O46 -O72 $$ '5 +$$ '5 c $7 $9 $6 u OA3 -Y2^P +Y2 ^P s26 $1 l i4n c o81 O08 @@ -25743,17 +25638,17 @@ OA4 sWd O1B k ^u u sS$ sns -s9H-5 +s9H -5 k ^G $6 $6 $0 $0 c $5 $3 $8 +3 $c } sNG -*56sP% +*56 sP% O73 i67 iB$ i1d i3e -*B4*25 +*B4 *25 i3e i70 o6- O05 i0K +1 @@ -25766,7 +25661,7 @@ c $3 $7 $6 i34 i77 T6 o53 $5 $@ -LA^w +LA ^w i7e i5b sGK i6e i74 @@ -25774,31 +25669,31 @@ i6e i74 O82 *98 R5 s4a c $7 $0 $6 -R1Y2,B +R1 Y2 ,B i16 i36 O53 ^F -sp$i9/ +sp$ i9/ O23 y4 -TBo35 +TB o35 Z4 O32 c i7@ -i0-s?T +i0- s?T i3R t o3t D6 -o6* T6 O67 +o6* O67 O4A Y4 } i41 i59 i68 i73 $m OA4 ^l o3o -Y1i5] +Y1 i5] ^3 $3 *93 -1 l *75 o4q [ O95 E r -i62i70i80i98 +i62 i70 i80 i98 { ^7 -*73*90i13 +*73 *90 i13 o3L [ i6d O81 O02 $* @@ -25808,7 +25703,7 @@ $0 O82 *53 *57 -2 o3j DB $e -$tD8 +$t D8 $1 o1M i0c *23 t o2z @@ -25819,60 +25714,60 @@ i73 i58 i0T r i82 i90 iA0 iB1 O6B p3 -iBlu +iBl u i15 i32 o1Z -L5sEg -*39DAswj -*41K +L5 sEg +*39 DA swj +*41 K i62 i70 i82 i91 $r +0 -y3rt +y3 r t i51 i69 i77 i84 D1 +5 $k O53 -snOZ3 +snO Z3 ^g O52 i2C *20 y4 O65 i82 i90 iA1 iB6 -*A0p2r +*A0 p2 r sp- O56 -D0-2s;j +D0 -2 s;j r $x +2 +4 +2 i72 R8 L8 -*7Bo74D3 +*7B o74 D3 O83 s6L *50 i77 R5 L5 -*51E +*51 E +9 +9 -0 -^yc --0ksFK +^y c +-0 k sFK $f $e $z O53 ] K +7 -4 +7 ^R O35 -$Xss, +$X ss, +1 -4 -2 $1 o8_ -Z1s>v*98 +Z1 s>v *98 $2 o62 K O57 i1a i2s i3e -$ap5sT9 -r*57 +$a p5 sT9 +r *57 +A +D *89 [ $` OA8 O87 -$n*85 -.Bs]!snu +$n *85 +.B s]! snu O15 O8B *38 -*57.5 +*57 .5 i11 i52 -T9-9 +T9 -9 i72 i7c -*30*B7 +*30 *B7 +5 -0 -2 i71 R8 L8 o6k $s @@ -25880,9 +25775,8 @@ sos +A -1 +0 +1 +8 O36 s<& -*2AZ5*B0 +*2A Z5 *B0 *51 K -o0f K -0 -2 -6 f t O5B o8g D5 @@ -25895,11 +25789,11 @@ p2 svs *24 o2x i7$ +2 *95 -si+Z5u +si+ Z5 u oBG -*A1i7R +*A1 i7R +2 -0 +5 -'B,7 +'B ,7 { iB# -0 -8 -7 o19 *51 @@ -25907,35 +25801,35 @@ o19 *51 $. $h $. $d +9 -3 -0 -$2D3 +$2 D3 o0m o5w *58 O87 -7 o10 +9 -0 -8 -+9*36 ++9 *36 +5 -3 -4 *23 t -s"4o56 +s"4 o56 *60 O51 *75 *67 $L $2 D6 -s;AT1 +s;A T1 sth +3 *75 o9J *06 OB9 -*09lo7! +*09 l o7! O6B -8 $# c o59 c o5a o4m O02 -D2D9s=} +D2 D9 s=} $L D6 $2 $! $@ $# $$ i42 i51 O23 D3 -T6o8]*01 -o74$. -s*-p1 +T6 o8] *01 +o74 $. +s*- p1 +2 +B O79 O84 *78 O8B @@ -25943,16 +25837,16 @@ o3n O41 O92 -8 i59 '8 O09 O9B -sp*Y2 -+9i7K +sp* Y2 ++9 i7K +4 +B $9 $* -.AsR+ +.A sR+ O58 D4 p5 ] D4 T7 $7 i0P .5 -o9-o2qTA +o9- o2q TA $a Z2 *63 D7 sPG @@ -25960,9 +25854,9 @@ E *78 -B iBG OA8 i0s i1c $0 -2 -s;fy5 +s;f y5 i3e i4l i5a -oB)u +oB) u i7e O85 *63 O53 i7c i3c @@ -25994,7 +25888,7 @@ c $- $8 i16 i15 stn i83 i92 iA1 -z1C +z1 C OA1 OA3 ] -4 o5k O04 Z2 @@ -26002,16 +25896,16 @@ O04 Z2 o64 l iBl D6 O92 --3*14 +-3 *14 t y2 u ^a ^1 o3g -4 $n $i $b $3 $! i89 i98 iA7 -$)$! +$) $! i48 i58 -i5B.1 +i5B .1 o5e E o5y -3 ^s ^s ^a ^p @@ -26020,14 +25914,14 @@ o8U i5d i6o i7g O81 i79 oBm -s%5o2Mt +s%5 o2M t +3 -0 +6 *59 Z1 O53 y2 [ +9 suy D8 +4 } -3 -5 -6 -*51c +*51 c u *46 D7 skt +4 -0 +4 @@ -26038,7 +25932,7 @@ R0 T1 *50 o3l o9) z1 O71 -^YsiI +^Y siI l o6- *36 '6 i73 [ [ @@ -26048,8 +25942,8 @@ c $7 $* i7J $6 $c +3 $1 -sAzo9$ -sfKs8tD6 +sAz o9$ +sfK s8t D6 ^k z1 z2 O63 $y $u $p @@ -26062,14 +25956,14 @@ u $2 $0 $1 $0 t O58 O74 o2" $2 $8 $0 $3 -s,!$fd +s,! $f d DB O05 i2w *03 i7d i3d -4 '6 O02 O63 ^t i5t -i7s-8 +i7s -8 T0 *78 OA1 ] OA3 c $7 $6 $3 @@ -26080,8 +25974,8 @@ i13 i73 o3b *43 $1 $2 $3 $+ so0 T6 -o8-] -${{ +o8- ] +${ { $l -5 q z3 O1A c $$ $4 @@ -26094,7 +25988,7 @@ r $c c $9 $0 $6 c $4 $9 $1 srn *20 --0*18] +-0 *18 ] $? ^1 o79 l -0 D5 @@ -26102,14 +25996,14 @@ O41 *30 +1 $0 $8 $0 $3 o47 o52 ^T .5 -i25-4sg` +i25 -4 sg` k o31 -KZ1*97 +K Z1 *97 szk -tRB,6 +t RB ,6 y1 R1 *74 O31 -s$\'A +s$\ 'A i3c i32 i71 i5f i0G ] @@ -26127,11 +26021,11 @@ c $3 $7 $1 i0J $d l O24 c $6 $1 $5 -*B7*58 +*B7 *58 O21 *25 -s(=s0X+0 +s(= s0X +0 c $2 $7 $8 $8 -*96*85srN +*96 *85 srN sko i5D c $0 $3 $9 @@ -26140,7 +26034,7 @@ i9M i72 i3c O03 C O84 sh{ -LBq +LB q l T7 O25 { p3 i3c i5c @@ -26157,15 +26051,15 @@ O71 $y p1 OB6 ^' ] s^p OA5 -*BAr +*BA r '7 Z2 '9 +0 ,5 ] *03 $1 $5 $! $! k *17 $. $7 -$N*B2K -s4go2L +$N *B2 K +s4g o2L +3 O53 c ^4 ^0 ^0 ^2 o2C t @@ -26181,29 +26075,29 @@ c $6 $8 $7 l ] $K o0f $1 c $8 $5 $9 -Y1,3 -sAci1. +Y1 ,3 +sAc i1. s1v ^M D6 $l *57 $r $e $n $u i5d i1a -o9Ok +o9O k -8 *8A O68 d D5 ^o *39 Z3 O1A *59 O53 Z1 $f $e $y -*52s9vswm +*52 s9v swm +6 O74 i11 i33 i31 i7a sdb D5 D6 sRl O2A --7*46Y1 -^MsJ, +-7 *46 Y1 +^M sJ, *37 +B O35 *7A O53 i41 i59 i68 i75 @@ -26219,8 +26113,8 @@ i7j l [ sat o6j D8 -2 ^C -Y4su7 -sbks#&s3j +Y4 su7 +sbk s#& s3j +5 -4 +7 o9' -7 K @@ -26229,7 +26123,7 @@ i0t i1e i61 i74 '8 r +5 -8 +5 -i72i80i90iA2 +i72 i80 i90 iA2 '9 Z2 i5P t O5A l Z5 @@ -26245,7 +26139,7 @@ l ^d ^l ^o ^g i6d -5 c ^5 ^8 ^9 ^1 $d ^d -*05Z2o3e +*05 Z2 o3e i14 i15 *31 ^m o7r O41 @@ -26258,7 +26152,6 @@ y4 O26 K $@ $4 $4 -8 sBL -D0 ^( O71 s.L [ o41 i6o O91 @@ -26272,32 +26165,32 @@ $A $4 o43 *57 ,6 OA5 sS2 -k^b*1A +k ^b *1A *42 ^w z1 z1 o0l -}scN +} scN } +4 i4r OB2 *94 '8 -*75t -Z3T8*37 --2*12s0; +*75 t +Z3 T8 *37 +-2 *12 s0; } +9 c $6 $5 $9 { O98 *31 i4d ^2 ^3 ^0 ^2 o2| -L4^" +L4 ^" T0 T9 T4 O42 y4 s6. o5r ,7 R5 i3d i5c d O26 -*05iB+*32 +*05 iB+ *32 c $! $3 o55 l -TAi2u +TA i2u $@ $8 $1 o8d ,6 D3 @@ -26305,38 +26198,38 @@ i7? syI l Z4 { ^i O15 -[p1sOr +[ p1 sOr ^j q O49 -LBtR7 +LB t R7 i49 i54 +5 i3o ] ] $1 i5b i5d O81 seo -^YE +^Y E i6n c -*B9sr@ +*B9 sr@ '8 { '7 ^C O15 i6K Y3 -s2c.9*5B +s2c .9 *5B i55 i66 i77 i1a *40 -*92s>v*04 +*92 s>v *04 i1d i1b O8A O81 +A o4d O71 -sS}sG!Z3 +sS} sG! Z3 c Z3 O53 i7a i5c o4D c *65 O65 i61 i79 i86 i99 -sxP$8 +sxP $8 y4 K O26 *58 D4 suo +5 -oBki9@ +oBk i9@ *34 ^x c $0 $1 $! $! o3X @@ -26350,12 +26243,12 @@ $. $h $r i81 i99 iA6 iB2 $4 *98 OA9 c ^_ ^1 -sLxi0h +sLx i0h D2 $- $5 $D i7p [ -*B6o7< -{*20s0z +*B6 o7< +{ *20 s0z ^B +5 c $8 $8 $8 $! -6 $z @@ -26363,7 +26256,7 @@ c $8 $2 $6 i59 i68 i77 *49 '9 $7 OB3 -o9q*58s2w +o9q *58 s2w +A O54 O91 o6p D3 O08 @@ -26379,32 +26272,32 @@ i77 i5a l o9i i3b i7a i4Y Z4 O08 -sp}i8py4 +sp} i8p y4 i1d i3a +8 -4 -4 *05 -1 D5 ^' i2u l o2r c -sdQT3 +sdQ T3 ^1 O45 i12 i71 i91 iA2 iB3 -i28*89 -s*Co03s'k +i28 *89 +s*C o03 s'k +4 +6 +7 i52 i60 i70 i86 '6 *03 o3D sD. D2 -o8Y*69 +o8Y *69 y5 [ sOR -0 -6 -3 o5" c $2 $5 $8 $7 -sk[sjf*40 +sk[ sjf *40 $1 $9 $5 $1 -i6u$% +i6u $% O42 .2 i4_ '8 c 'D $3 @@ -26412,19 +26305,19 @@ c 'D $3 ^y ^e ^k T2 ,5 -5 *74 -s0HK -p1sy} +s0H K +p1 sy} p1 O9B -[D3 -dEsBj -{*18t +[ D3 +d E sBj +{ *18 t $0 $0 $2 $2 l [ ^Y i1u l soE u 'D +4 *45 -*B4i7R +*B4 i7R $s -2 O62 i7r +0 O72 @@ -26432,7 +26325,7 @@ K ,2 *23 o4_ O7B sDS o0W K -^xT1 +^x T1 .5 *23 O24 T6 O31 o7o 'A @@ -26443,8 +26336,8 @@ o2m ^d o0k o1. o2h *26 sg/ O92 Y2 -$*$. -*2Ao8k +$* $. +*2A o8k i62 $9 i3e R4 L4 O14 c @@ -26457,19 +26350,19 @@ sSa r O37 $! D3 i0s i1p ^m ^e -^-.B +^- .B $2 +4 Y1 ^0 ^0 ^8 ^1 +2 -0 -9 -+7k -oA O5B sd sNY *23 O82 -T8L5 +T8 L5 i76 i57 i6 c D5 L6 @@ -28170,7 +28055,7 @@ sa_ sFI i1e i7d '5 $8 -Z3iAO +Z3 iAO p4 Z2 $1 $3 $* $* $9 $8 $! $! @@ -28179,7 +28064,7 @@ c $0 $9 $! $! $1 $9 $5 $4 c $9 $3 $! $6 $9 $* $* -syf*B0 +syf *B0 $1 $1 $? $? sb2 i3_ +5 @@ -28187,7 +28072,7 @@ scl $1 $9 $4 $7 $8 $9 $! $! o9a $7 -*08R4 +*08 R4 sPT o0h O91 o3Q @@ -28198,23 +28083,23 @@ oBx -8 L1 i8X -1 *52 -i32i40i50i64 +i32 i40 i50 i64 -4 Z2 -i8&s.FY3 +i8& s.F Y3 o4a o64 t o1U Y4 O26 $) +6 o4L [ o2q -+8i7p ++8 i7p i1c i1f *64 o3i i9i 'A +0 O53 se3 T7 $2 $x -$+$* +$+ $* oAo O72 +0 '7 O12 D7 @@ -28226,7 +28111,7 @@ o5z *02 ^s r i8e i9s iAs O15 i1r -$/$? +$/ $? o0V K O15 +0 O31 $o @@ -28234,7 +28119,7 @@ spK +8 o13 *13 O43 ,2 C -oA*D0[ +oA* D0 [ $9 -6 L0 L1 } 'A @@ -28250,7 +28135,7 @@ OA4 *B6 ^t $! T4 s2C s2f -s,dsots]T +s,d sot s]T s7. ] o3z i5W @@ -28260,7 +28145,7 @@ i4; -9 o7b sQW *25 o3m D4 -s+po3q +s+p o3q i71 i3f D3 o13 c i5. @@ -28271,7 +28156,7 @@ i68 i78 i12 i30 +3 i1m o9- D8 -p5^@ +p5 ^@ i3# *40 o3n *51 D1 *12 @@ -28286,7 +28171,7 @@ sug swk OB9 i3w *54 +0 O25 $8 $b -slMT2 +slM T2 -6 o7r D3 T3 ^h O16 @@ -28294,23 +28179,23 @@ D3 T3 O34 ^e o14 -9 $l -6 -Y3D8 +Y3 D8 z1 ^A o9F o0v ^b D7 o9b -s1zK -z1Y2 +s1z K +z1 Y2 o3| DA -B D7 *54 o5l -$oiA] +$o iA] k O62 i5a i34 i13 i15 $6 -0 -iAHC -$+$_ +iAH C +$+ $_ D5 t c ^d ^3 O19 i4D Z5 @@ -28318,12 +28203,12 @@ i9h D6 O52 o23 Y3 O32 z1 i1a -s i^U.B +s i ^U .B saO -oB|sLk^o +oB| sLk ^o *13 ^z o3s *31 -^ps/T +^p s/T T3 t c $8 $@ c $0 $* @@ -28342,15 +28227,15 @@ O52 OAB i95 O23 O07 D5 c i75 -tfp5 +t f p5 +2 +5 -8 i4h -0 'C $5 i2i i3s o5y +2 -o2uC -*0B$w -o8OsWe +o2u C +*0B $w +o8O sWe } O12 k *37 *42 T0 @@ -28363,7 +28248,7 @@ $a +2 $n +0 *86 C O37 y3 R6 -D5]y4 +D5 ] y4 *32 D6 T2 T7 T3 T6 [ i5$ @@ -28372,12 +28257,12 @@ T2 T7 T3 T6 ^g ^m o2p *51 p3 *02 O62 -o8o^od +o8o ^o d c $4 $7 $9 -*6A*A8i9= +*6A *A8 i9= OA1 Y2 c $4 $7 $3 -y3,8 +y3 ,8 o6l -8 i2n i3i *35 *56 @@ -28388,8 +28273,8 @@ c O53 +5 O05 p1 [ O51 o7d +2 +5 +2 -'7sqM -sT@sku +'7 sqM +sT@ sku o6c l iA* i2w OA5 @@ -28398,7 +28283,7 @@ c T5 se3 O62 o0f $p *86 sez -i9fsS^o9= +i9f sS^ o9= i7N c i5u *57 $t o7n OB8 @@ -28410,23 +28295,22 @@ o8I so0 u si7 -0 *16 -[ ^A scb O13 i1- ] l ssd -+Ai8O ++A i8O s0= } -2 k i31 i5e -,7sTQ +,7 sTQ spy O39 { o5Y oBO i16 i12 o87 +0 i6c c -*3A^h*B0 -s"`$dT7 +*3A ^h *B0 +s"` $d T7 -4 -7 -5 i1a i2r D1 *67 @@ -28463,17 +28347,16 @@ $_ $5 $0 $5 iBz *56 $1 o6r '9 -*57E -0 -4 -0 O05 k $@ DB O71 } z1 u +7 Z1 s8+ -o9Bk,2 -$|s[e +o9B k ,2 +$| s[e i74 i56 -i72i80i90iA5 +i72 i80 i90 iA5 c i5a $1 o7l sgq @@ -28486,7 +28369,7 @@ c L6 O4A O65 O18 $R c i66 i77 i88 -s-4*34 +s-4 *34 ^a i3l D5 o3q ^t ^u @@ -28499,18 +28382,18 @@ c i2u O71 O97 d 'B $5 O56 y1 -*56Y2.4 +*56 Y2 .4 D2 o6y -R7l +R7 l ^C o79 -*63*9A +*63 *9A l T3 i14 i30 i15 i10 i7i i8s i91 *32 T0 $1 $9 $1 $4 -Y4*A5*65 +Y4 *A5 *65 c O43 $7 OB1 $9 o2a -3 D7 @@ -28525,24 +28408,24 @@ $G l D7 +A +0 i3b c o1m -s Ks1+ +s K s1+ i79 i3a c $8 $6 $4 -oAK*64i6K +oAK *64 i6K sfg o2g D6 z3 O07 -kp2 +k p2 i6h +4 o2A [ -ds1ssqp +d s1s sqp D6 $7 $n [ $z ^r ^i ^a -su&'A +su& 'A i3e i4r O13 y3 -iAjs/ml +iAj s/m l K +4 D3 '6 d c $7 O43 @@ -28551,13 +28434,13 @@ i4S +5 +9 -1 +1 -4 -5 i2p *53 -kz3 -i6*i7)Y2 +k z3 +i6* i7) Y2 c $U o8s sfi o3c T2 o73 *36 -C*A2*05 +C *A2 *05 $f $i $b o5w sct o1w -8 @@ -28565,8 +28448,8 @@ $@ O12 c $2 $# s3. *07 D6 -*28*01*20 -L6] +*28 *01 *20 +L6 ] ^2 ^A o8E +0 sdm O32 @@ -28575,25 +28458,25 @@ $w $o $t *76 '8 $m +5 Z5 O07 -Z1z2 -c*69svy -sTClT5 +Z1 z2 +c *69 svy +sTC l T5 i1R O31 o4z sl` +6 O62 i0S d O45 sG; $4 +2 -DAoAZi8W +DA oAZ i8W *62 o2k O9A +7 i8 -9 -$!$/ +$! $/ i75 i3e +3 -0 +4 sMb p3 +3 soe -s$w$vR4 +s$w $v R4 -1 ^L +1 o0' O01 $n c @@ -28602,31 +28485,31 @@ c $9 $2 $7 c o32 stg i71 i89 i96 iA1 -*32EY1 +*32 E Y1 *5A O43 D5 '8 i5w O72 $5 $. -tsfH +t sfH i11 i30 O13 Y3 o7t O18 u -4 -s!di9W +s!d i9W i5e i6s -o2FsQZc +o2F sQZ c i43 i53 c $a $7 D1 D3 *97 o7i i9i iAn *76 o2r -T0{ +T0 { ss6 O24 s8V O84 sad sLt -*80{ +*80 { -5 *68 -9 -B -A c $0 $5 $! @@ -28640,15 +28523,15 @@ D4 O15 .9 i26 O32 O28 y2 o7c sao -*79s0g +*79 s0g '5 $7 i2y *62 o71 $7 -y4sI0 +y4 sI0 *30 O35 *94 O0A o7E K O42 -sU4$^ +sU4 $^ i8u O9B O68 i6i sv2 O31 @@ -28657,21 +28540,21 @@ u d 'C $6 ^1 ^E ^j O85 i71 i82 i93 iA4 --0o6Ic +-0 o6I c c ^A c se3 T5 i6z E sm- $c D2 -y5sh|DB +y5 sh| DB '6 $p *31 i1j $b +6 -2 R3 o1g T0 -oA1i7, -L5*7B -s>c]$a +oA1 i7, +L5 *7B +s>c ] $a L5 O59 c i61 i79 i86 i92 o7O K @@ -28682,26 +28565,26 @@ l ] $i $n $g O03 Z1 $i sPS i4e i5d -D2s{=c -D5i0. +D2 s{= c +D5 i0. r y5 y1 i9i iAn iBg i3e i7c -i32i40i51i62 +i32 i40 i51 i62 i46 i56 i66 $) O13 -s`h*67[ +s`h *67 [ sdc O74 C +1 +1 +8 O12 O32 Z1 o80 T0 i6c i7h -sPdo7< +sPd o7< c $9 $4 $7 -oANo8? +oAN o8? *95 O21 C -oA`Z1D4 +oA` Z1 D4 syb c $8 $7 $4 Y2 OB3 @@ -28715,10 +28598,10 @@ i11 i22 i33 $6 $b i73 R8 L8 i18 i38 -i53*92 +i53 *92 O48 $- ] f O51 -ti1l +t i1l +5 $g i1a i2m i6i -3 [ @@ -28734,25 +28617,25 @@ i4a i5d +3 -0 -5 o11 D7 i0" l -$vspG +$v spG D5 o0H i51 i69 i76 i85 i54 i7e O41 O82 -sJZ$v +sJZ $v i5e i6s i7t *24 o31 O31 sl4 $c +7 i7g OA3 K -K^0 -$&$? +K ^0 +$& $? '6 $! i5f i7e *9A OB3 D1 O63 i52 i5b -s#jsPH +s#j sPH i51 i69 i77 i85 Z1 z1 O25 O53 *35 @@ -28761,15 +28644,15 @@ i37 i50 +A *8A ] +4 [ +9 -o6HTB +o6H TB +2 -4 -3 O41 snl -$6Y5$5 -*5Ao5t+3 +$6 Y5 $5 +*5A o5t +3 $h O63 s1C -^bs0& -*86sD>{ +^b s0& +*86 sD> { $a o7f i1a i2n i7u -8 @@ -28781,33 +28664,33 @@ $1 ^^ $A c .6 $@ ^1 o20 -$@$? +$@ $? suA l -sip*68 -,1*49Y3 +sip *68 +,1 *49 Y3 ,4 Y1 'A o7h i3l i4e [ Y3 i35 i15 O04 sW $- -suUT9iAL +suU T9 iAL *52 r K D9 -kcp5 +k c p5 D3 z1 o2E *53 +0 $l i47 i57 s5b O43 t -KsiK*47 +K siK *47 TA t OB2 p1 -*42K +*42 K -1 -A -o48s|R +o48 s|R $2 *58 -sX%o8$s-M +sX% o8$ s-M O43 Z2 O95 *26 O52 $a @@ -28824,7 +28707,7 @@ i66 i71 OA7 o4I i12 i72 *13 i5u -sxksIs +sxk sIs s4k sn- T4 O31 ^7 @@ -28834,30 +28717,30 @@ i7m i8e +6 O12 O95 i7, i2c i3k -*71s"/*31 +*71 s"/ *31 c i4@ Z5 O13 *69 -$C*90*28 -$=$] -o0w'8 +$C *90 *28 +$= $] +o0w '8 se3 T3 r ^r { $w i17 i3a i4u o0r -,9l +,9 l $* +2 -y4] +y4 ] { OA3 O64 i6t $E k O72 +8 -i6DK +i6D K T7 ] -sxKi8A +sxK i8A i54 -6 O81 E -5 -*13^F +*13 ^F i38 i52 *42 *64 i6a O05 @@ -28875,12 +28758,12 @@ O03 $! i51 i69 i76 i86 i51 i69 i76 i80 $x *65 -L5s2GsgB +L5 s2G sgB O72 $4 $3 *97 O52 o4j $> OA9 -$ sNw +$ sNw O81 ^K *A9 .7 c $8 $5 $! @@ -28890,15 +28773,15 @@ OB5 y5 O87 i9W t *05 O45 O31 *54 ] -*34Cs9Z +*34 C s9Z K O56 '6 $! $! $! $! r o2D k -$@$% +$@ $% D8 i4a o6K O21 *05 *12 -*38i5* +*38 i5* i14 i22 i30 z5 .7 sfp @@ -28912,15 +28795,15 @@ OB7 q Z3 Y4 O06 i82 i90 iA0 iB5 L8 oA8 OB5 -o1O*76 -sHWspQ +o1O *76 +sHW spQ i7L c -*49$< +*49 $< O04 u O37 sa4 se3 si1 so0 i31 i59 o50 l -$Fo9] +$F o9] sWB i13 i10 i5d i3f @@ -28930,7 +28813,7 @@ c i6h *41 } } +3 -9 -6 i43 i50 -i8T] +i8T ] o5o *52 o6p *56 z1 *60 @@ -28941,25 +28824,25 @@ O81 i8a c i0d i1u O82 *86 c O25 -+0R9 ++0 R9 i3e *60 o4e ^j ^b -3 -s5@*26 +s5@ *26 +3 $4 '8 o5p K i6k i7a i81 $5 *56 i3a i76 i51 $2 -oA[s2X -o7ns8w$x +oA[ s2X +o7n s8w $x si1 T5 O53 i4l -$@$& +$@ $& ^D i86 *41 [ O21 -.2o99 +.2 o99 +5 Y2 ^i ^t ^n ^a o3. *01 @@ -28971,8 +28854,8 @@ o3i u u $5 $5 $5 +6 $p i55 i60 i70 -o7li8O -Es.asz0 +o7l i8O +E s.a sz0 z1 .6 Z4 O65 *12 [ o6o @@ -28991,7 +28874,7 @@ i0! +1 sfG O72 T2 O63 $R -$ws@S +$w s@S +6 -3 -4 C o1a i1o i2g @@ -29009,7 +28892,7 @@ O3B $= +2 +9 +5 o22 t { y3 -O61 ] +] D6 i2r i3e l '7 +3 i3a i34 @@ -29028,20 +28911,20 @@ E s3A ^H O72 l stm sSE -y2Y3 +y2 Y3 'C $2 O61 i8u $l i8e i4e +3 o5m O81 -5 E -]t$X +] t $X -1 -9 -5 O15 ^G s97 *67 *B1 O82 K u $0 $0 $0 OB7 K *7B -i8D^@ +i8D ^@ o3Y +7 l $1 $9 $9 $0 $- ^0 z3 @@ -29056,10 +28939,10 @@ i95 O71 $. $i $n o94 l k o4k -.9sC_ +.9 sC_ O74 $y $h OB3 -s.M^l +s.M ^l '8 K o5p r O73 *45 ^p @@ -29071,10 +28954,10 @@ o4p o5c i62 i73 sla O37 R8 -co2C +c o2C i9f +1 t -c[syo +c [ syo d 'B $9 Z1 $n i0k i1a i2n @@ -29083,23 +28966,23 @@ o1j *41 ,9 $h O63 O31 ] *54 ^v O16 -$*$# +$* $# -0 -8 -3 Y4 ] ^1 O52 i3f i5a o1a ^g i3e i4s -,3'8 -{szOY1 +,3 '8 +{ szO Y1 $h O53 -$&$^ +$& $^ -2 -2 -9 ^S *34 l O94 $- Z2 $0 $1 $0 $0 -o7$,7s.# +,7 s.# [ $n K c $0 $7 $5 o9r O71 @@ -29125,18 +29008,18 @@ c $7 $1 $9 O9B ] i75 O36 '9 o6m -[T5y2 +[ T5 y2 D2 i6r '5 $i '5 $x *37 i2n O49 *65 o65 c 'D $5 -*9Ai4l,3 +*9A i4l ,3 ] *10 i0c +8 -0 -0 i72 o80 -*70p1l +*70 p1 l $n $e $h $a i70 i3d k *13 -5 @@ -29145,46 +29028,45 @@ i31 i52 ^h ^s ^a l $l $o $o $p ^o ,2 -*31,7^D +*31 ,7 ^D c i3a -*06[ +*06 [ y4 oB O96 ,9 O63 $h o3Y l +7 o4k +5 o0c $0 *17 O12 -.8*A2iA3 +.8 *A2 iA3 ^t *65 *61 -1 f O4B $m O65 *35 -$IDA +$I DA l ] $W y4 O68 $t +7 -4 -7 -6 i3b i72 sxm -s-]sfr -i31i49i57i68 -sS+r -CD3 +s-] sfr +i31 i49 i57 i68 +sS+ r +C D3 i7a i75 '6 ^w D4 -B -*91to7P +*91 t o7P Z4 +8 o2t D1 k O28 '8 -2 -+8sfAsrH ++8 sfA srH o5e K -s8S$5 +s8S $5 i7e i8r o1V k -lD0Z2 -r Z2 c +l D0 Z2 *65 o43 $2 sbR o9i D0 @@ -29197,17 +29079,17 @@ $y +6 u $8 $8 $8 c $5 $8 $4 $o ^C -o6?s5N +o6? s5N .8 s40 d $9 -^.sl# +^. sl# D2 $. z4 O29 s@L OB3 s>4 o1e *24 OA3 .5 *41 o6a o4y -sRu$6 +sRu $6 i7d i5a O25 ^c LB O92 @@ -29215,18 +29097,18 @@ scv so2 O51 *04 o6g E -RAy5[ +RA y5 [ *43 O34 i33 i71 ssh i72 i7f -Z2sPb+3 +Z2 sPb +3 y5 O98 -s&?+9 +s&? +9 i48 i56 C o0P d C -,5*90*0B +,5 *90 *0B i32 i53 i3c i72 l R3 @@ -29235,10 +29117,10 @@ c $5 $7 $3 o1- s1a $1 ^/ d '6 $7 -^tt +^t t c O23 O69 sO- -i32i40i50i61 +i32 i40 i50 i61 o4 $1 *93 o30 D6 o60 @@ -29249,7 +29131,7 @@ l [ ^w z1 *45 O14 D7 o6G p3 o6i c -Ez2 +E z2 r ^O ^8 T2 i4i i5e @@ -29269,12 +29151,12 @@ c $9 $9 $* $* c $0 $7 $! o9o OA3 c $2 $3 $! $! -Y5-0 +Y5 -0 o5W sd+ O41 i12 i18 O64 '9 ^f p3 -i1zs@N +i1z s@N ^P O43 *78 $a O16 D4 p3 @@ -29284,7 +29166,7 @@ c $1 $1 $$ $$ ^b O52 c $9 $4 $6 i3m i4a i5r -^4Y5 +^4 Y5 c i40 ^p O62 i3_ +1 @@ -29296,22 +29178,22 @@ o9n O45 O65 c c $9 $9 $9 $! sOP -*B2$Y +*B2 $Y l $a $n $a c $! $! c $6 $6 $! O75 O14 -*42p1sMi +*42 p1 sMi c $0 $0 $1 $! c $m $a $n O59 s30 $0 $0 $! $! -lR8 +l R8 *34 *74 $2 $2 $* $* o5v T0 *34 O87 t -syb.0 +syb .0 u d 'C $9 -7 *68 i62 [ i0G @@ -29323,14 +29205,14 @@ $1 $3 $! $! i11 i1a O62 o3t i76 i54 -sZ/o9So8Q +sZ/ o9S o8Q +3 t -o7_*58i0S -s$-+9 +o7_ *58 i0S +s$- +9 l $1 $9 $9 $9 +0 O82 O54 Z1 -p2$1 +p2 $1 c $8 $8 $* $* T8 $7 $p *42 @@ -29340,16 +29222,16 @@ $4 $$ i32 i77 *B7 O85 i33 i77 -*6B} +*6B } i37 c -*2B^p +*2B ^p l $5 $5 $5 i55 E O91 t o0m l $2 $2 $2 -8 o66 OB9 i1y -p5oA$sXN +p5 oA$ sXN ^D Z2 O94 c $. $8 { { { { r @@ -29367,8 +29249,8 @@ s20 $! ^3 ^x ^o ^l ^l ^a sNO *A4 O21 -K*31 -^hs6x +K *31 +^h s6x i71 i84 i93 c $5 $3 $7 sn_ @@ -29403,12 +29285,12 @@ y3 *35 i4y u slf *12 [ -8 o5d -o6&s[H +o6& s[H -2 *26 i53 R6 L6 $5 ^5 ^N +5 -*BA{ +*BA { L5 y1 Z4 { O93 ,1 K @@ -29416,12 +29298,12 @@ $6 ^6 i58 i3a O38 i2j c i44 T5 -i31i49i56i63 +i31 i49 i56 i63 i1l { -t$y +t $y c $2 $6 $1 i6l i7i -$?$_ +$? $_ o56 ^L o72 Z1 i6w i7e @@ -29430,10 +29312,10 @@ z5 stn i5b i5c K *21 *76 s51 -o8,TA +o8, TA i5l i6a } $O -,6riB, +,6 r iB, *68 O03 y3 O42 ^4 $s @@ -29444,12 +29326,12 @@ i78 i3e +4 -7 +5 iBh o8F -'4$Y -*26oBQ +'4 $Y +*26 oBQ ^u *04 i9D i1. i3. i5. -*04o51 +*04 o51 ^k +6 *05 O34 O9B $t @@ -29466,8 +29348,8 @@ s1_ i32 i5a +3 -4 -0 i7M -$.$_ -*67*10^T +$. $_ +*67 *10 ^T D0 .4 O24 $* i0f i1u @@ -29483,14 +29365,14 @@ s5P +4 i7! +4 i75 l [ ^X -$usZgoBM +$u sZg oBM +2 -B O7B saG O95 K O93 i8m D0 -i6J*81 +i6J *81 o7c *75 -$<$= +$< $= o7G i76 i3a i0s i1o i2u @@ -29520,7 +29402,7 @@ u o1k i1` f O89 i4n ^k -+5o4_ ++5 o4_ l ^g ^n ^i ^k i81 i90 iA1 O37 E soH @@ -29528,7 +29410,7 @@ l oB1 T8 T4 T2 T6 i1. i3. i5. i7. +A ] -p5Z1 +p5 Z1 -5 $m +3 ^F T9 TB TA @@ -29543,26 +29425,25 @@ k o0t *50 o3t O21 Y1 O9A c O18 ^e -*B5i7` +*B5 i7` ^r D2 T0 O63 o53 D3 O93 ,2 i22 i30 i41 i51 -] ^k -6 $4 u d 'B $5 o3w k O67 T9 i6p ^! z1 -ED3sGB +E D3 sGB l ^m i74 R6 L6 -R9R5Y4 +R9 R5 Y4 iA1 iB2 iC3 iD4 iE5 *51 *14 R6 O46 -sYmsr9 +sYm sr9 so0 T3 +7 $g *54 p2 -2 @@ -29572,12 +29453,12 @@ c $9 $7 $! ^r ^a ^p o62 i51 o0t o1e o3t o2s -s2$s_=sP& +s2$ s_= sP& O52 $n -0 ,9 -o8KiAys|\ +o8K iAy s|\ ^i O54 -z3oB\ +z3 oB\ i4B svb { ^3 @@ -29594,35 +29475,35 @@ c $6 $9 $4 +9 O45 i41 i56 o4" O78 ] -us%3 +u s%3 O56 +9 c ss3 -o1Rs/!DA +o1R s/! DA O42 O48 o2b ^s +7 d o6t -sa&*20 +sa& *20 O73 $4 O25 *A8 i58 i5a ,3 *72 -+5*56-8 ++5 *56 -8 $5 $c +6 i64 -*92r'7 +*92 r '7 sk| O37 E O52 O68 o9l O52 o5< *14 sY4 +k sd> Y4 skt -*02*57 +*02 *57 O8A ^p iBB -D4*9B*A8 +D4 *9B *A8 R0 O18 O21 $1 ^= o0; @@ -30091,17 +29969,17 @@ $5 *57 +6 +9 +9 -8 [ $3 $@ -sq+8 +$X s%> +8 $2 $* O81 i8a o4X t @@ -30545,13 +30423,13 @@ O86 O72 c T9 i19 i14 O06 $1 -.5sWAK +.5 sWA K c $9 $6 $7 -s5wR7 +s5w R7 *85 O79 ssw D4 ^K -r*A2 +r *A2 ^g *05 ] TA o5X @@ -30561,17 +30439,17 @@ c $3 $8 $1 *43 $a O97 +8 O94 i32 i76 -o1x$q +o1x $q c $l $e $e i1d i1c l ^a ^n ^a c ^2 ^8 ^9 ^1 i5a i19 -i31i49i58i61 +i31 i49 i58 i61 c i3_ sgm c $9 $5 $7 -$]$] +$] $] i35 i72 ^q *14 i1c i3e @@ -30580,7 +30458,7 @@ i0a i1v o22 [ *21 *04 z1 } k -rq +r q O28 Y3 i14 i38 ^l O53 @@ -30618,17 +30496,17 @@ o4c +3 +1 $n i62 { +0 ^3 -[s=3d +[ s=3 d DB O56 i3_ *46 i0r i1o i2m i30 i1e T6 O72 -sF4saA +sF4 saA i8q O9B o5. Z2 i0m i1e i2g -*74i3esg@ +*74 i3e sg@ $! +1 *05 ^y $f O91 @@ -30638,22 +30516,22 @@ i3i i4t O85 sVz o9y l i6j O06 Z3 -$ysEb +$y sEb i12 i38 K o5p O12 *34 -to4n +t o4n i3m i4a i5n OA1 'B $1 L6 +1 *06 -i51i69i79i89 +i51 i69 i79 i89 i12 i36 *50 O16 z5 z4 O39 *85 O7B -CT4 -^#sA0 +C T4 +^# sA0 o7M D8 i64 i75 $6 O62 @@ -30664,34 +30542,34 @@ Z2 $7 O43 i2v i3e -4 O63 i54 i63 i72 -z2L7*B0 +z2 L7 *B0 -6 ^a i0v i1e i2r [ q O01 sry -}D2si" +} D2 si" i3a i54 -s"Zszk +s"Z szk r i1s D1 sds o8l -7 +6 *14 -$_$+ +$_ $+ i2s i3h $a *16 i0b i1o -sFti4ai9. +sFt i4a i9. i0h i1e i2r *89 o7p ^N O02 $x -Z1*B3-4 +Z1 *B3 -4 o4p c oAa O02 $1 -3 -iA1sA't +iA1 sA' t u 'E $3 o47 l -]*97s@b +] *97 s@b i4c k i3f i74 $i -9 @@ -30712,11 +30590,11 @@ Z2 o8s r *15 t D1 i4s i5o i6n -*69*79^; +*69 *79 ^; i1e i2t i0s i1h i2o i1c i5c -D7y4s#< +D7 y4 s#< O27 s_r o5z *23 *49 $2 O24 @@ -30747,10 +30625,10 @@ E ^i C D1 ^c c $f $f $x $c -*90$? -*57$X +*90 $? +*57 $X ^1 ^D -Z1*58} +Z1 *58 } c $x $0 i3o O73 c $2 $$ @@ -30759,11 +30637,11 @@ z2 -0 O43 ^x ^d *95 Y3 OB1 ^x ^c -{s9UsZ7 +{ s9U sZ7 oBR $A $9 D1 O5A E -l [ ^j +l o0j D2 o2x K *23 sap @@ -30772,18 +30650,18 @@ OA5 *67 o51 K i0J O6B O24 O29 o5y -saesVm +sae sVm *9B O43 ^Z D3 O6B ^y i1h -sY{c*86 -*07q -]]]]]]]]c -*B8o5_u +sY{ c *86 +*07 q +] ] ] ] ] ] ] ] c +*B8 o5_ u T3 $4 +B -6 z3 +0 -Y1RB +Y1 RB *67 $1 i3c i74 T3 O8A D6 @@ -30800,14 +30678,14 @@ C o0R O42 ,3 OA2 O72 c -9 *8A -o79$L +o79 $L $T { D7 OA3 c i13 *31 '8 Z2 s06 Z1 +7 o0a -*32i68 +*32 i68 *03 o2r +1 d '6 $5 i33 i7a @@ -30816,10 +30694,10 @@ siO o1U stq l ] -6 -1 -4 -3 -*87sdT -oAV*74i7i +*87 sdT +oAV *74 i7i T0 T2 T3 T5 -*96skb +*96 skb *26 D3 D5 ^G O03 *13 p3 @@ -30829,12 +30707,12 @@ t O12 i5} *24 +0 o8% *89 O98 O0A *80 -k[*61 +*72 D1 c $ $6 i1s i2t i72 i80 i90 iA6 -iB'y1*20 -lo0k*86 +iB' y1 *20 +l o0k *86 f sQ, O9A *30 D4 o4o K @@ -30850,18 +30728,18 @@ p3 OB9 O9B '9 $b } } $z +3 +6 +4 -*A1D1 +*A1 D1 o4\ --0sy.c -spjoAk +-0 sy. c +spj oAk +0 +0 +6 -0 ^e c $2 $8 $! i38 i75 *21 O25 -s2ts*> +s2t s*> ] -1 -i8OiB, +i8O iB, O61 $z i54 i5b $= O59 $a @@ -30872,49 +30750,49 @@ O45 ^e '5 $9 i5m i6e -4 -6 -A -+2lo2F +l o2F Z1 o0b O32 ^6 +7 $0 -*56s#I*A0 +*56 s#I *A0 i3e i1d i8z O05 t *52 -7 *20 -*2Bo7T +*2B o7T o0n ^n o3l -4 i5n i6a -*2Ao1Isz8 +*2A o1I sz8 t ^1 -,B-BsOu +,B -B sOu o62 l z5 O1A ^m *63 o0o ^h O75 i2^ -C*70$T +C *70 $T o6- O04 o64 Z1 ] O08 ^0 -D6s"R +D6 s"R O61 O14 -i7Psg] +i7P sg] p3 ^j O43 ^d ^9 O78 *8B -9 O72 K $g i3d i79 -Kshl -i31i49i58i63 +K shl +i31 i49 i58 i63 $! ^0 T2 O02 OA5 d y1 .5 -scm[ +scm [ { C [ -$z[ +$z [ i6E -5 +2 -7 -6 i3o i4u @@ -30923,10 +30801,9 @@ z2 -1 i7a i56 sMR sx7 -E ,8 -9 } -,B^eo0S -*29DB +,B ^e o0S +*29 DB i11 i35 i12 i37 O12 o34 @@ -30935,20 +30812,20 @@ i7m i8o i9n i4m i5a i6r $p +0 c $9 $0 $! -oAHo1o +oAH o1o +2 -0 -8 $5 $E O49 s!h ssG $t $g i3h i4o i5n szm -sk!sgF +sk! sgF i7F t k *76 -i9.^ssD, +i9. ^s sD, o3w +1 s2T -o5DsBz +o5D sBz i18 i10 d O73 i3` @@ -30959,23 +30836,23 @@ O38 s1< i5a i6t c D6 i7l i8e -*83^A -$vls{} -tsBvo8m +*83 ^A +$v l s{} +t sBv o8m swk -$to5G +$t o5G +8 ^a -D5sE'E +D5 sE' E stB O62 $3 --9o60 +-9 o60 l sgj i0a i1l i2a k O51 Y2 $. $c $a o7t O13 c ^2 $! -*18s5AK +*18 s5A K O12 D2 o0N *25 *47 *67 @@ -30986,32 +30863,32 @@ o7^ O8B O24 R9 $f $o $b i91 iA2 iB3 iC4 -$iT2 +$i T2 ,3 O96 -$u*2A -*25o7A +$u *2A +*25 o7A *19 z3 O07 -6 T2 *36 i6x -o3"k +o3" k i6\ i10 i32 +3 +6 -2 -sO'iAQ*B1 +sO' iAQ *B1 i0c i1o i2r i52 i60 i72 i89 Y2 -9 ^f ^l ^e ^s -sdf$> +sdf $> $w Z1 i81 i99 iA6 iB1 O21 O28 $l $g -{sGE +{ sGE O82 *56 sFW ^] O4A -^a*31 +^a *31 O63 $r '9 o4h o4k *35 @@ -31021,8 +30898,8 @@ l o69 c $4 ^2 D3 $* i4d i5o i6g -szYo6&sG$ -*B5i8n +szY o6& sG$ +*B5 i8n i1c i5e c i7. O32 d @@ -31030,14 +30907,14 @@ O32 O42 i58 i7a K -4 i0k i1h -*B9y4i3q +*B9 y4 i3q T2 s03 -^7*51 +^7 *51 sVN i34 i76 D8 o4c y3 '9 -iAd]i02 +iAd ] i02 o6m '8 o2z O53 i16 i39 @@ -31052,7 +30929,7 @@ Y5 O09 i85 i90 iA0 i53 i1a O75 ^# O67 -o8DsHq +o8D sHq i7H O17 ^M Z1 O62 { T9 @@ -31074,38 +30951,38 @@ oAp f OA8 oAr i59 i5a -$e+A -i2_T5 -sYis9%l +$e +A +i2_ T5 +sYi s9% l $q $a i52 i60 i72 i85 o5_ *24 L7 o6. { $7 p1 O79 l -^ts0+sz& +^t s0+ sz& i22 i30 i40 i59 i1u i2s i3t stb R0 oAm O7B *43 R5 .5 O2B O83 -s}`T3 +s}` T3 +5 -4 -7 -o2I*03*68 +o2I *03 *68 +0 +F o1o O25 $m $e $n $t i37 i1a --1*24 +-1 *24 T0 TA OB2 $7 ssz +3 +0 +6 +1 o53 D8 i7w O34 -oBM-BL1 -o9C+3 +oBM -B L1 +o9C +3 *89 k o0H .6 k i4v @@ -31114,15 +30991,15 @@ O92 u o0W D2 *10 r D3 ^d ^d ^a -s7xT6o5y +s7x T6 o5y i3e i75 i35 i7a $t o6k -s1v-9 -D3i9)E +s1v -9 +D3 i9) E i5c i79 ^y ^o -*90o0n*3B +*90 o0n *3B Z1 ^e $p l ^B D4 @@ -31139,14 +31016,14 @@ i33 i3d T1 K sJt s&3 O78 i3d i34 -i32i40i50i63 +i32 i40 i50 i63 i61 l u ,8 *53 +8 -*71+2 +*71 +2 o3L } -D3z2 -^7s0+ +D3 z2 +^7 s0+ sad O52 o68 ^K O08 ^[ @@ -31156,11 +31033,11 @@ i4M E i6G l i62 i79 i56 R7 L7 -.2o8il +.2 o8i l $7 o0Z -*B4^J -*47,6 -s-ui6f +*B4 ^J +*47 ,6 +s-u i6f c i2a i1f i1c +2 +4 +5 @@ -31184,7 +31061,7 @@ s!V q i2l i3l Z1 o7i y1 ^C -*31$- +*31 $- } D6 s4J i2k i3a @@ -31201,14 +31078,14 @@ $# $2 u R4 $2 O73 o8g o9r -$5*87sCz +$5 *87 sCz *10 sMd *76 *36 o6 o7b ^M ^A i2K i33 i7e -o0r*A6i0c +o0r *A6 i0c *69 ] -5 i7o -3 O21 o68 @@ -31219,12 +31096,12 @@ sfv i1a i5f i1e i38 y5 O63 -o0$sL0 +o0$ sL0 $P ^N o72 +8 o7b slZ l $r i8j -'8$J +'8 $J $f o6S i4F $0 *AB @@ -31232,49 +31109,49 @@ i11 i36 o4e $1 c $6 $9 $7 +5 -2 -4 -E$% +E $% o0d r OB4 D9 +7 c i2n i3t -+6+B ++6 +B i1e i76 O38 s>. -$$$* -q}*25 +$$ $* +q } *25 O74 O1A i7| -iA1D8$= +iA1 D8 $= i42 i59 T4 o0s -s${d +s${ d ^o z1 i16 i14 i3r i4e +0 Z1 i1b i11 -,5*15 +,5 *15 '9 D2 l OA3 -,A^6 +,A ^6 i76 R5 L5 -lo6+ +l o6+ Z1 *34 o1v OA7 i17 i37 i71 i12 i13 i29 -*51'5y2 +*51 '5 y2 } '9 i5a i52 -sr4R9 +sr4 R9 *21 +4 -$)'Bl +$) 'B l $7 $0 $8 $0 i4u i5s s0E *04 { -sWC$9 -]s+X +sWC $9 +] s+X sos O06 $1 $7 $0 $3 i50 i3a @@ -31286,33 +31163,33 @@ c $1 $7 $7 $3 Y3 D2 c $7 $8 $4 sGs -y3*1B +y3 *1B i7d i5f -6 i62 +8 D5 -*69ssX +*69 ssX y3 i9@ i57 i7a OA4 O51 O3A o5 Z1 -'3 O56 seb +'3 seb u *31 -y1i2H.2 +y1 i2H .2 i8' O8A R1 --3o1gi17 +-3 o1g i17 o0u i3- c $9 $5 $8 -T6s3(iB& +T6 s3( iB& i57 R7 L7 c $9 $5 $2 c $9 $5 $3 -o3e*A4 +o3e *A4 i6s i7t ^a ^e ^t +3 ^b +6 r i3m *14 -$dsI9 +$d sI9 i3Z ssa O93 { $B @@ -31321,7 +31198,7 @@ $0 *67 ^h D6 O42 z1 i0A R3 u -shPsMy +shP sMy $d -5 -0 i18 o31 [ k @@ -31334,38 +31211,38 @@ i53 i63 i73 sa@ u o3' ] i82 i90 iA0 iB6 -LBi4O +LB i4O ^b 'A i83 -7 O03 $R *60 O21 'B -o6mD3 +o6m D3 o0d $z -c*25iAF +c *25 iAF O04 ^x y1 o2c E -$/*48k +$/ *48 k i2w T0 l ] $z syx D2 ,6 D1 $u +6 -2 -0 -i31i49i57i64 -sgusbN +i31 i49 i57 i64 +sgu sbN so0 ss$ -y4z1 +y4 z1 i4n O91 i6j i6E i7i i8s } q '8 -sWbZ1 +sWb Z1 ^x '8 $l $i $n $g i1e i75 -$zY4 +$z Y4 O05 D8 -o08s._ +o08 s._ $_ O25 i5f i5b +B O83 @@ -31376,15 +31253,15 @@ i31 i3f sNC O58 ^4 O5B z1 O71 -sSJsY7 -o1!R6i5u +sSJ sY7 +o1! R6 i5u i5. O03 O21 o7I l f O56 } *05 *8B i73 i83 i93 -*A8z1sI4 -sz\iB&.7 +*A8 z1 sI4 +sz\ iB& .7 sky O31 i68 i75 i82 i7m +8 @@ -31401,14 +31278,13 @@ i72 R5 L5 O46 +3 i5e R6 L6 *46 *25 -]s{' +] s{' sGV sem o0g O91 ^. $! O71 i8= ^{ -lo0j *87 o7z D2 $S O02 t @@ -31417,8 +31293,8 @@ O64 Y2 Z4 O1A sMz $3 O64 i94 O71 -o8HT4 -^G*43sd` +o8H T4 +^G *43 sd` se3 T5 c ^3 ^< i62 i70 i83 i90 @@ -31429,7 +31305,7 @@ $* $8 ^h ^s ^i ^f [ ,4 i47 i59 -L9s>)o3k +L9 s>) o3k O61 *21 .7 R8 DA i5M O06 @@ -31444,17 +31320,17 @@ c 'D $0 ^5 z4 i0a i1p o2m $2 -s5|Z5 +s5| Z5 ^b $A +2 .1 O06 D8 O34 -*6B*16 +*6B *16 o79 *56 $i +9 O24 Y3 +B -4 o3d Z1 -i8s*B6 +i8s *B6 i4e i5e i61 sPM i6m i7o @@ -31470,7 +31346,7 @@ Z3 sK; O41 Y2 $1 *64 t ] o5S -^E*23 +^E *23 *52 O61 i3c i73 i1e R2 L2 @@ -31481,7 +31357,7 @@ s26 ^L sJH i3m l O73 [ -T7sp/ +T7 sp/ i51 i60 i72 ,9 $6 i8z O52 @@ -31492,10 +31368,10 @@ c ^1 $4 *18 O69 i0r i1a i2m O93 ^# -*42sg1 +*42 sg1 *25 *10 *24 OA5 *62 -s$5k +s$5 k i3n i4o ^1 ^- y4 y4 @@ -31509,12 +31385,12 @@ i6E O52 O13 s38 ^M p1 O78 y4 O64 -*52.4 +*52 .4 *37 O13 sVK $4 $f *B8 O14 -*B5s4l +*B5 s4l D7 O69 ^j i17 i36 i34 i7e @@ -31524,9 +31400,9 @@ i17 i39 i7a i38 st- c $0 $7 $4 -^cRA +^c RA f O8B -s0Ei03iA4 +s0E i03 iA4 +1 u i3a i78 $m *43 @@ -31536,21 +31412,21 @@ O12 *51 +3 -4 +8 +2 -8 -5 c $8 $4 $7 -o8s*90 -sqEY2[ +o8s *90 +sqE Y2 [ -0 -4 -2 o6f { [ *52 } s9F O97 D3 -Z1R1D9 +Z1 R1 D9 c T4 i4_ *03 ] *14 .3 E +1 +4 -0 -TBo6i +TB o6i $n i0R ^l i1c -sLno3a +sLn o3a +2 -1 -4 { $6 $_ ^t ^o ^o ^f @@ -31558,19 +31434,19 @@ $2 t O62 i6e i7l i81 z2 OB1 OB5 *43 O86 k -E*68$e +E *68 $e *0B O3A { K { E d o4y $9 $6 $9 $7 i5a i3f -o7fL8 +o7f L8 O02 -7 -*35sUEt +*35 sUE t ^R K -Ki1a -*97*03Z3 -*97z4*3B +K i1a +*97 *03 Z3 +*97 z4 *3B t OA2 i4y i5o i6u u O75 @@ -31580,7 +31456,7 @@ OB2 { O14 i5p k i34 i50 i74 R7 R7 --7DA +-7 DA *51 d { D5 o2_ i34 i5a @@ -31596,12 +31472,12 @@ i15 i30 D2 D6 sl; p4 O23 -LAo6l$[ +LA o6l $[ shl -uD2 +u D2 ^b O23 $3 ^@ -s3K*B3 +s3K *B3 { o0m Z1 O23 $= ^1 @@ -31609,14 +31485,14 @@ D1 D7 i3d i70 p2 O46 i33 i70 -Y5z2*93 +Y5 z2 *93 { o46 oAb p4 ^w OAB -sIpstw +sIp stw $9 $3 $! $! c $3 $3 $! $! -s[js=8sgs +s[j s=8 sgs o7c O34 $9 $4 $! $! c $2 $2 $$ $$ @@ -31624,7 +31500,7 @@ $1 $4 $! $! i1d i5d Z4 Y2 $0 $9 $* $* -iARs&( +iAR s&( ] O01 K +6 -2 -2 $0 $1 $@ $@ @@ -31636,39 +31512,39 @@ i3c i1c c $1 $6 $! c $8 $4 $! O43 ] -Ko9,l +K o9, l c 'C $6 -sFS}s0G +sFS } s0G $1 $9 $* $* l O14 -$koBz -z3{.A +$k oBz +z3 { .A $d $w p2 O6A -Es8s*28 +E s8s *28 +4 $5 $0 $8 $! $! c ^D O09 ^m $1 svU *53 -s(\]^n +s(\ ] ^n +1 -4 -0 sT+ -D8*70 -i9.t +D8 *70 +i9. t *84 -4 ^t ^a ^f +4 +7 +4 i16 i38 $8 $5 $! $7 $x -$)$@ +$) $@ O84 i8c +C -A -A -*07s&i +*07 s&i $9 $9 $* $* -*47i3_ -*40i6$y1 +*47 i3_ +*40 i6$ y1 Z1 y4 i1a i75 $6 $9 $! $! @@ -31679,17 +31555,17 @@ ss_ ^* ^* $1 $0 $@ $@ $9 $x -^oswo -i4cy4 +^o swo +i4c y4 Y3 O96 O82 O13 '7 $w $r $y ^k O2B O52 s+e O65 O5B -sIEs,%i26 --8*5Bu -,3s/+ +sIE s,% i26 +-8 *5B u +,3 s/+ i2$ z1 '7 ^M sbN @@ -31698,8 +31574,8 @@ c $9 $4 $2 sfK $x O76 O72 *36 -lr*3B -sfgY3'8 +l r *3B +sfg Y3 '8 ] D2 c $3 $3 $# $# ^r i4y @@ -31714,39 +31590,39 @@ T1 O27 d *BA oA1 i13 i38 iAn -soZD0p4 +soZ D0 p4 $k $i $b $a *82 O41 *14 ^w o4h +7 ^G O71 -T4'9 +T4 '9 ^G -7 D8 -5 -T3z1s7c +T3 z1 s7c l ^d ^a ^b -s6Y*34 +s6Y *34 i6 T0 *5B O91 O75 -^dsMWc -L4y2 +^d sMW c +L4 y2 k O27 O05 y3 i4l '8 l [ ^n -5 O05 -s\iT7 +s\i T7 c ^_ $_ O58 q u O03 O23 i3x -*58[ +*58 [ i48 i59 -Z4r +Z4 r ^2 z3 sa4 u o3 O21 -*14,5*A3 +*14 ,5 *A3 $h $g s01 o17 -1 -4 -7 @@ -31763,7 +31639,7 @@ i3e i51 $3 T2 c $t d '6 $8 -^XD6 +^X D6 iB* Y1 OB5 t -4 D2 '6 @@ -31785,18 +31661,18 @@ O43 $! O43 $5 $k O13 *39 O95 $k -*A6^M +*A6 ^M '9 i7w s92 -5 svz -E*85Z4 -*02t +E *85 Z4 +*02 t O72 k sJX i45 i52 i79 R5 L5 i1r i2i i3s i9g K -s ji82 +s j i82 D5 } D2 O52 $8 d $8 @@ -31806,18 +31682,18 @@ s!S D1 o7o O05 $4 y1 O16 -$+s/$ +$+ s/$ O08 *3B sKd -s*\o1I +s*\ o1I smk -o2ksE" +o2k sE" i6c *35 O37 i4s i7b i71 O61 o68 $A $8 K $1 -$h*67R0 +$h *67 R0 R4 o59 O52 +6 i7e i10 i70 @@ -31831,12 +31707,11 @@ $z Z2 i8B O34 o2e y4 OA1 -C,Bi8R +C ,B i8R i7e i8t i1c { O59 *89 Y5 l ] $Q -i3U O53 E o5a Z1 o1v +7 r -0 c @@ -31846,21 +31721,21 @@ l ] $G D2 z2 +A D4 l ] $I -o4FsU@+4 -sC#r +o4F sU@ +4 +sC# r z2 O04 srt sbM l *02 Z2 -A .2 p2 O76 -T6,9y5 +T6 ,9 y5 $$ ,9 ^m *06 +9 OA4 -i9y.A +i9y .A l O9A O61 k saj o5w *75 -s*2As=N -o2riB' +$> *2A s=N +o2r iB' i7a i8l r o6y -[ $1 i1c i5a -swnsWj +swn sWj o2s O81 swc ] i37 i48 i59 -sxgszT +sxg szT $4 k '9 r -i8!o0O.1 +i8! o0O .1 o0D Y4 i43 i54 *39 O14 @@ -32175,7 +32048,7 @@ c i6u i80 $4 c i6b ^a O16 -swms*E +swm s*E +9 Z1 l $l $i $n $e '5 Z3 @@ -32184,14 +32057,12 @@ sat i3t i4i t $E D6 $g -[^2 O72 *53 iBc $x D2 -*14 E .3 i0p i1r i4y i5a -z1+9 +z1 +9 y4 Y1 OA4 i2; D3 *56 @@ -32200,8 +32071,8 @@ Y1 O87 +2 -7 -0 l ^h ^g ^i ^h u $2 $0 $0 $6 -*07{ -sCno8& +*07 { +sCn o8& syl o4l o3r ^v z1 D2 @@ -32210,9 +32081,9 @@ O26 c E i2b i52 i60 i71 i85 y2 +7 -}p2sW, -sTky2*57 -s9{o1C +} p2 sW, +sTk y2 *57 +s9{ o1C O2B Z5 i3a i4t sDf O86 @@ -32225,14 +32096,14 @@ $- $9 s2M O38 -3 ^C *54 i5a i51 -sH2$,*04 -D8R4 -*9A+7*65 +sH2 $, *04 +D8 R4 +*9A +7 *65 Y3 O14 -$wsEP +$w sEP i35 i54 sfb -*17s9A +*17 s9A i60 i70 q O18 i41 i59 i67 i79 @@ -32242,7 +32113,7 @@ y3 O27 O52 $9 O02 $B D5 k -]o5S,7 +] o5S ,7 *B9 O73 i82 i90 iA2 iB2 Y3 O37 O56 @@ -32251,26 +32122,26 @@ sRP c $@ $6 ^v l i1a i77 -sTMs]V +sTM s]V i52 i60 i72 i84 -*58LA -*34$8 +*58 LA +*34 $8 ] *13 s!, O52 o41 -o8ZiA5 +o8Z iA5 iB1 O62 s1f i5a i57 +1 sBr -o2xZ1 -s>6i7#sT9 +o2x Z1 +s>6 i7# sT9 { ^A i70 i5d i41 i59 i67 i74 -s=&'7 +s=& '7 O83 $7 -s|UslW +s|U slW ^_ ^_ ,5 $2 i17 i57 @@ -32278,10 +32149,10 @@ i17 i57 suh sgu s2^ -s05o8e-8 +s05 o8e -8 i17 i38 i7b i7c -o7Ws|s +o7W s|s o0v r sEG $6 O41 @@ -32294,19 +32165,19 @@ sDJ ] i0g *16 l o1@ y3 OA2 -saD*5A +saD *5A i3u O02 $o K O21 ^q -3 { $i k i1a i2y o8m *67 -*6B-1.2 +*6B -1 .2 k .0 o8F i55 i7a -L1Y5 +L1 Y5 -5 *16 -s{z$g +s{z $g .0 C *15 *41 *43 *45 O52 } @@ -32316,7 +32187,7 @@ O49 ^J ] O56 O71 $g *87 o8A -lo1c +l o1c z2 Z2 z5 O2A O27 $x $s @@ -32326,7 +32197,7 @@ i0m i2m i1o O72 $! O47 sBu '9 i50 i60 i78 -+4i8t ++4 i8t ^% $% O83 O75 Z2 sb| O76 O3A @@ -32334,10 +32205,10 @@ sb| O76 O3A o3j *21 i52 i60 i72 i83 *72 O62 -$)o98 -so}*75 +$) o98 +so} *75 i3B c -Ko6r +K o6r } *15 O12 '8 ,6 o4A *12 @@ -32359,52 +32230,52 @@ O46 Z5 i36 +2 ^2 ^@ i1d i3d -+6sAWp2 ++6 sAW p2 -8 -C '8 *70 i3e i78 Z3 O07 sL] -i5#sJu +i5# sJu i78 i1e +5 s27 -*B0i4isn" +*B0 i4i sn" i7a i37 O62 i61 ] ,1 i0z i1i sdt ^v i74 i58 -L9^s,3 +L9 ^s ,3 o91 D6 l ^t ^e ^j *89 E O13 z1 -6 Y1 -i7SsFts27 +i7S sFt s27 OA7 *26 i1o i2a -$*$( +$* $( O08 O61 -^4,Bsu# +^4 ,B su# l *35 se3 T6 D4 ] o6m i1a R8 L8 i20 -0 -'7Z4 +'7 Z4 *70 O72 O92 o7J -2 $K -.5^F +.5 ^F -C -C -D -$Ko7@ +$K o7@ +0 +4 +0 sfC i4s i52 i4 E y1 f -s Zs@_ -D6Y1 +s Z s@_ +D6 Y1 *53 O34 *17 i5b i3b +7 O32 D2 @@ -32415,22 +32286,22 @@ i2? O31 r [ $K O13 o3v -y5,3 -*A9C +y5 ,3 +*A9 C O71 D3 $2 i0k i1r -*68o0C +*68 o0C o1t l -*47iA{o7A +*47 iA{ o7A i9r iAu { k $i i5e i32 +3 -B Y2 OB9 -5 -i31i49i57i66 +i31 i49 i57 i66 i33 i54 *61 ,6 -D2*89L0 +D2 *89 L0 O85 c i7w l O62 o4j @@ -32439,19 +32310,19 @@ i1e i51 i0h i1o i2l K o82 Y5 O53 -*57s&ry4 -$`sWE +*57 s&r y4 +$` sWE sy| OB1 $2 *30 slt *50 ^n ^e -*2Ai9o +*2A i9o o0O .1 sam D4 O51 -RA^A +RA ^A O53 o6a i3f i31 -Y2k +Y2 k i1e i2r $8 T4 O54 $q @@ -32460,7 +32331,7 @@ s9C -0 *64 O94 s|B i66 i79 -RBy5 +RB y5 i1a i30 E O73 y5 y5 iBA O79 @@ -32475,19 +32346,19 @@ i4a i5t i1i i2l i3l } O83 ^- *1A O03 -*02'3p3 +*02 '3 p3 $0 $@ c ^0 ^8 ^9 ^1 t i9e o30 t -*70} -y1iAGC +*70 } +y1 iAG C ssr q *51 O5A *46 O63 -*82+Ao0! +*82 +A o0! i39 i49 i59 -*43o1p +*43 o1p t *9A c $a $l c $8 $7 $5 @@ -32499,7 +32370,7 @@ o16 s'y O65 i36 i78 u O12 i41 i59 i66 i79 -*31c +*31 c -4 ^D Z2 $3 sLA @@ -32511,24 +32382,24 @@ D6 sng k o29 O15 i0A o6m $. -s3M*90 +s3M *90 sOL i7a i32 sly $x $5 T0 O34 c $- $6 -s[`E,9 +s[` E ,9 { *65 [ -0 T0 O61 $C -*15*70o0U -s$'stw.B +*15 *70 o0U +s$' stw .B O56 *93 O93 *85 O13 l ^h ^s ^i ^f +3 -2 +4 -^nt*9A +^n t *9A -4 O5B O03 sld i0m i1e i2r @@ -32541,12 +32412,12 @@ O5A sV] O12 K c ^# $# $h D3 -z1R0 +z1 R0 c ^a ^5 t D1 -3 i7. [ } o1a -T8^W +T8 ^W i0s i1n i92 iA5 +5 -0 -8 @@ -32555,9 +32426,9 @@ sTA i2n i3g f D7 O78 +4 $R -svn*86 -sVf$e -s(ps/tE +svn *86 +sVf $e +s(p s/t E o0g .1 $h $e $a $d +0 +4 -3 @@ -32566,7 +32437,7 @@ Z1 *A8 i2c i3a i4s D2 O03 -4 -4 -A -$!$% +$! $% -A o93 sA_ OB1 s\4 @@ -32585,25 +32456,25 @@ Z1 s90 i1m i2a s.6 O42 q -CsWE*27 +C sWE *27 Y2 $r -s.vse& +s.v se& i1a i51 -o85$> +o85 $> u ] T3 o0M '9 { i7F -Z5*8A +Z5 *8A i2v i3i O03 *32 +9 o0l sOG -Y1L6 +Y1 L6 i5b i7c Z1 o0k -3 O72 'A +3 --B+0,4 +-B +0 ,4 +7 D2 $2 *68 seL O3B $y @@ -32617,7 +32488,7 @@ i0s i1h i2e i67 i77 i87 K i9A *53 [ ] -*19s!b +*19 s!b +0 +3 +4 sGD i3b i34 @@ -32634,7 +32505,7 @@ i5a i56 c i5r O13 $2 o3p ^w -sgAo58 +sgA o58 i8v ^1 D4 Z2 +5 @@ -32647,19 +32518,19 @@ i38 i7e i7a i35 *98 .9 iAL -$E'B +$E 'B i22 i32 iB6 iC6 iD6 i01 'B s3r i61 i76 i84 +7 -o82s"E +o82 s"E c $~ $1 l $s $e $x $y sdr i3e i54 -y5o3t.8 +y5 o3t .8 i12 i7a o6O -5 ] *56 Y1 @@ -32679,8 +32550,8 @@ srv *40 O45 E d OB7 O17 -DAs/wsE5 -i21i39i49i50 +DA s/w sE5 +i21 i39 i49 i50 ,4 r E *65 *73 i3t i4e i5r @@ -32702,11 +32573,11 @@ T3 TA c ^d ^a i3w c ] T4 -$ $@ +$ $@ i47 i57 i67 -^8sZN +^8 sZN O21 O01 $7 -+1-C ++1 -C *04 i4t -1 o7m o69 *24 @@ -32714,37 +32585,37 @@ o69 *24 o9j +8 $ p1 +6 o7y -s'.*16 +s'. *16 +4 -0 -2 *43 *35 K c ^4 ^7 ^9 ^1 r sK, O58 O71 $2 D3 -*04{*85 -z4E +*04 { *85 +z4 E } *30 D0 -*A4s4Q +*A4 s4Q i32 i79 K $c y2 '7 k o3h c o8o -o8zsoA +o8z soA o7U c i31 i3c $d ^V -i21i39i48i57 +i21 i39 i48 i57 i1e i5f -o5st +o5s t o6^ 'B o8f -suoo39 +suo o39 $R *45 -sVx'A^C -.A*78t +sVx 'A ^C +.A *78 t OB9 O62 +8 c $9 $4 $8 -*74sD6 +*74 sD6 i11 i37 +1 +2 -9 -1 -7 -8 @@ -32752,11 +32623,11 @@ $2 O85 s9y z5 O27 O2A q O95 -oAh*47$e +oAh *47 $e o5t o3u z2 ] -6 O89 O01 -s3Is,Rl +s3I s,R l o13 Z1 i1\ sbd @@ -32775,11 +32646,11 @@ O24 *72 $B Z1 srx O32 l ^e ^r -sy%spv -i31i49i57i61 +sy% spv +i31 i49 i57 i61 o46 o20 i6h 'A -i8`*0B$M +i8` *0B $M *20 sri TB O27 $6 c $0 $3 $! @@ -32789,34 +32660,34 @@ i70 i30 OB8 o3) ^h sgu OAB i6g D4 -CY3 +C Y3 K E O82 Y1 +5 '8 i75 i7c i7W l $m $i $k $e -o8+.A +o8+ .A i79 i3c ^4 OA2 ^= $= O45 ,5 iB` ss O18 -T5i9_ +T5 i9_ Y2 spt O87 -*97^A +*97 ^A spJ +0 '6 -s-WshnD1 +s-W shn D1 $0 o67 -3 { $d O75 o5w c $. O05 -sQ-Z4 +sQ- Z4 c $0 $6 $8 o5m k -D4sO< +D4 sO< i39 i70 -7 i8. *0B O64 y1 @@ -32829,7 +32700,7 @@ c $6 $2 $9 ^M *71 +8 -1 -9 ] +4 l -s(}y3 +s(} y3 i77 i1a *36 -0 +5 sct @@ -32848,7 +32719,7 @@ sa@ T1 ^d o4r *B4 *31 k t --7-B +-7 -B c O68 O12 +1 Z1 i31 i5a @@ -32862,33 +32733,33 @@ u o9 O41 O54 i0t ^W -3 ,5 $K -o2+*05 +o2+ *05 ^r ^i ^a ^h *62 O23 R3 O74 iB7 O46 Y4 *92 O74 i3d i73 -o9/*A4 -E$lp1 +o9/ *A4 +E $l p1 o5l +3 *65 *67 OA6 -shuRA +shu RA i0s i1h i2a O93 $c d 'C $7 i0a i1i ] y3 -*17iA9 +*17 iA9 oAS O71 o8k i39 i15 O23 *A7 *30 OA1 ^1 O97 -sl]EZ5 +sl] E Z5 O74 +3 ^d T1 -+8$S ++8 $S D4 o7o i1e i2n i5e i6l @@ -32924,7 +32795,7 @@ o9p O09 o6F i4" *8A O45 ^T O53 i5A O32 -+2s)&Y2 ++2 s)& Y2 r o0b { *36 i34 i52 @@ -32936,11 +32807,11 @@ o7n ] O31 O52 *05 t O36 Y2 $4 -i5zo8+ +i5z o8+ i6= O2B ,7 k i86 i94 -*A6sis +*A6 sis *40 *54 oB1 O37 O73 y3 D5 @@ -32949,16 +32820,15 @@ o84 t O98 o6? z5 i3d R0 L0 sgT -s/\cy1 +s/\ c y1 o0` i35 i78 -R8*57 -T0*89$s -] DA +R8 *57 +T0 *89 $s +9 c OB2 sKO -i31i49i56i68 -Y2*75o7P +i31 i49 i56 i68 +Y2 *75 o7P $! O63 K o7K o2d *54 @@ -32971,14 +32841,14 @@ ss* i5d i7b si3 c $0 $5 $3 -s;#^sl +s;# ^s l *56 o2l ^2 ^K t o1B .3 r ^Y D2 T0 $9 -$^$_ +$^ $_ -A -D i82 i97 -1 .5 @@ -32989,46 +32859,46 @@ O07 ^s i3e R2 L2 o3; $X O0B *03 O42 -Y2*83DA -]*89 +Y2 *83 DA +] *89 i46 i56 -i31i49i56i69 +i31 i49 i56 i69 d i6s i0w i1h -z1l] +z1 l ] z1 $1 O03 z4 O6A +2 ] $3 ^l -3 i0s D9 -*29$_o62 +*29 $_ o62 ,4 ,5 sg{ i67 i71 i17 i31 -Z5sb9 -^j+3 +Z5 sb9 +^j +3 i7 l i8o i91 $s *21 ^P $b p3 i40 i6n i7a -Eo94 +E o94 -0 OB1 i6n i7e -D6 Z1 [ +D6 [ Z1 i9u O84 T6 *01 -.Ai5" +.A i5" .1 *51 $s Z2 ^@ y1 i4e i5s D4 $0 y4 O56 -*74.2*51 +*74 .2 *51 i52 i60 i71 i87 i53 i64 i75 Z1 o9y @@ -33037,9 +32907,8 @@ O67 i9" s>} o2d *08 OB9 o6S +3 i1i i2n i3g -D6 [ Z1 i3o i4s -*60oA0o65 +*60 oA0 o65 $j $u $n $1 i6o i7r .1 *63 @@ -33048,8 +32917,8 @@ i7f i7c o6 O32 so} o1i i6o -}s0A -*09*75 +} s0A +*09 *75 i3m i4a i5n i6o +7 o6F @@ -33058,7 +32927,7 @@ z1 O4B O12 Z1 +1 sth D0 f O48 -D7iA)i2x +D7 iA) i2x -3 $I slV o56 $6 @@ -33069,7 +32938,7 @@ K i5A o7n O31 ] O93 L3 $2 $6 $! -,4Y3s8b +,4 Y3 s8b [ o4m sHr O02 D8 $0 $3 $2 $8 @@ -33077,7 +32946,7 @@ sAO O72 +6 *02 se{ sPZ -i7Is"7t +i7I s"7 t o2r +3 O53 '9 T8 z1 i1. D5 @@ -33088,9 +32957,9 @@ i5b i73 shn sBN i4d k -Kp5Z1 +K p5 Z1 O96 sc" oAr -R5E +R5 E o05 z1 $c L6 c $7 $4 $3 @@ -33104,9 +32973,9 @@ scF i4H D3 c O04 D8 i3d i74 -$)$# +$) $# q O16 O52 -,3Z3D3 +,3 Z3 D3 O84 ] Z5 c ^@ $@ swt @@ -33117,16 +32986,16 @@ o4l o1k D0 oB2 siw [ y2 { -*43}y4 +*43 } y4 o4C t i39 i73 D6 i7x O34 i6- -.3*89l +.3 *89 l $p $h $a $z $e q r '8 i6G +7 l -Z4*A2'9 +Z4 *A2 '9 c Z1 O61 z2 *14 i31 i3b @@ -33137,7 +33006,7 @@ i6g i7o +4 $g [ soc *13 $2 +4 -{,9*04 +{ ,9 *04 $m +4 *B8 *A9 o73 o8N @@ -33150,21 +33019,21 @@ iAm OAB OA5 i7a i52 $a +3 i6- *78 -^^*96 +^^ *96 K p5 *06 sbe srx o76 ] $. $d $e i0j o0G *57 -p2skl +p2 skl i62 $7 O21 syu i38 i79 ,6 r -sR($3u +sR( $3 u i0t i1r -i8A*BA +i8A *BA o1= i51 i62 i71 O05 Z4 *46 @@ -33174,13 +33043,13 @@ $8 Z4 ^[ o6a s[d K i3t o1. O54 -s*\sl; +s*\ sl; O9B *78 *87 o76 sG' *81 OB3 s7O ^. z1 -,8i6m +,8 i6m O37 '6 c ^6 ^7 ^9 ^1 t o49 @@ -33192,14 +33061,14 @@ O7B *61 c -9 o0] *21 c O31 -$&$$ +$& $$ o8q O32 p1 i39 i14 -si[p3 +si[ p3 -0 ^T +5 +7 +6 +8 i3a R7 L7 -s}+^Oo0q +s}+ ^O o0q i7c i5e svy O34 d @@ -33217,7 +33086,7 @@ i1e i73 o2t $e ^b O35 s*m q O59 -snui0* +snu i0* $g +6 K -3 ^b o0M $n @@ -33227,7 +33096,7 @@ u $X ^X ^x $x +1 ^j ] T7 -0 d o5w -o97sm`c +o97 sm` c *42 i5n Y5 i8r O58 c $9 ^2 @@ -33238,41 +33107,40 @@ D5 +1 f O08 c *59 $Z O8A i2z c -$osGd +$o sGd i41 i59 i68 i71 ^k '7 -6 *24 D0 i1o i2w o3V O07 O74 -o8u*8A +o8u *8A -2 s\Y O5A i0a i1w +5 *60 sny $e smp -$0 O81 -i21i39i48i50 -*13R7$$ +D8 $0 +i21 i39 i48 i50 +*13 R7 $$ *53 o96 O93 *08 -*5A$8 -^6iAyi4r +*5A $8 +^6 iAy i4r ^4 O75 *73 [ i1a i13 -^B*39sy- -o8Z^cs>! -kD6 +^B *39 sy- +o8Z ^c s>! +k D6 +1 Z1 D3 i91 'A O82 i6a *9B O62 -Y5Z3 +Y5 Z3 i54 i3a ^m Y1 *A4 O05 O72 q -E*34 ^/ $/ *71 O13 OA9 i0. OA2 @@ -33280,13 +33148,13 @@ OA9 i0. OA2 s6K '6 Y3 p2 ^d } -^Y*B0 +^Y *B0 +1 $A *50 slh +5 i35 i71 i36 i55 d O0B -o4dl*76 +o4d l *76 l T9 i69 o77 i15 i16 @@ -33294,11 +33162,11 @@ i15 i16 l $0 $0 $1 c $0 $6 $4 i5d i78 -oAW*80 +oAW *80 ^P ^J +0 -6 -5 'A o3k -s./y4 +s./ y4 i1d i11 c T2 $1 O4A i9= @@ -33312,7 +33180,7 @@ sZ} O02 TA i6I E o3o i0h ^j i0h -i9{i3U +i9{ i3U } *31 C O02 s2M O61 @@ -33326,9 +33194,9 @@ i5$ +7 -2 -0 o0b ^t +5 -6 +8 -i3hY1 +i3h Y1 *A2 O39 sEP -$e*89o7] +$e *89 o7] *72 O23 i76 i3e '9 +2 @@ -33344,24 +33212,23 @@ i9, ss5 so0 sa4 +9 -6 -6 C .4 -+A.3 ++A .3 sbz c d 'B *37 O25 i9c iAh -s.1s 4*0B -o7;s.q +s.1 s 4 *0B +o7; s.q c o25 o3O -9 O79 skc [ -*03o2k +*03 o2k O32 *37 D4 o5_ T0 i30 i3c $f O12 siA C '7 $5 -d O09 $e +3 stg -1 ^T *79 -8 @@ -33387,17 +33254,17 @@ $v D1 oA_ O05 i54 l c $. K -l$ET3 +l $E T3 y5 o0C z1 o24 -o1U*A4 +o1U *A4 O64 T0 c ^1 $5 sic ^P ^L i82 i91 O47 y5 -i8Psd2 +i8P sd2 *04 o2- *43 Y4 O65 sh? @@ -33405,24 +33272,24 @@ i70 i7c i5s i6a i82 i93 OA1 o1a -'BY1 +'B Y1 i51 i69 i76 i82 $# $9 -1 ^8 O42 $k -TBs,JsRP +TB s,J sRP '8 i4u o6p c -i0msaZ +i0m saZ o0w $3 ^r *45 -$_EsJ{ +$_ E sJ{ $b $0 o9i O53 $2 -3 i5a i53 +3 } -$&$= +$& $= .4 OB8 R4 O63 i4s o4) @@ -33432,18 +33299,18 @@ o7P O97 i8i i9t i2u i3r r $a $n $a -$%$& +$% $& D3 q -sGm+B-3 +sGm +B -3 $t $b -*89*96*A7 +*89 *96 *A7 su6 k } -+7y1 ++7 y1 sl7 i74 i1e l i67 -$H*54 +$H *54 s!' o8" sfd @@ -33451,14 +33318,14 @@ y1 ^J o4_ -7 i38 i3d i10 i71 -*9Ao6x -k,6 +*9A o6x +k ,6 i3a i7b u $1 $9 $9 $2 o8i *57 *13 ^u r $q Z1 -sU_C +sU_ C -2 o1x O74 $i l O83 D9 @@ -33478,27 +33345,27 @@ i38 i1e o9S t *6A O94 Z2 -6 -o3*i8j.A +o3* i8j .A i6a i7c i8e -$%$* +$% $* i0c i1h i2e *05 skl O35 O6A O36 *0A -$$$& +$$ $& sMQ t i3p -s#xr +s#x r *13 K O31 *05 l -oBA+9i59 +oBA +9 i59 c *26 $+ ^1 c O61 Z1 ^j ] i6m O76 +6 i3_ --9$r -Y1sQ?-3 +-9 $r +Y1 sQ? -3 -8 $8 +0 o83 l ^o ^l ^l ^a @@ -33507,11 +33374,11 @@ u $0 $0 $1 o5r '8 +A +B +C i7a i16 -*42*A5z1 +*42 *A5 z1 i4r o5f i1i i2t i1i i2z -T3i78 +T3 i78 O65 *85 $t *57 i2d i3i @@ -33532,11 +33399,11 @@ O18 i7T OA2 i5c '7 o75 *68 $2 $0 $1 $0 $` -$?$. +$? $. *76 'B -4 -B *20 '9 -i8M+7 +i8M +7 $3 $f i15 i18 i4c i5h i6i @@ -33547,17 +33414,17 @@ i2s i3t i4a o57 *13 sts i5c i7d -*73*87 +*73 *87 r T1 *67 *37 i55 i65 i75 l $b $e $l $l +8 o9s -i11i29i39i46 -i7oZ4Z1 -^M*95 +i11 i29 i39 i46 +i7o Z4 Z1 +^M *95 i3a i51 -s5Nc$t +s5N c $t { i5n y1 +4 *86 +6 +7 -4 @@ -33565,7 +33432,7 @@ $2 O03 i50 i61 i72 p1 O86 i52 i3c -*80snc +*80 snc ] $a { sYE c i4u @@ -33573,36 +33440,36 @@ o49 O21 DB l +A syF *79 o48 D0 -^RL5 +^R L5 o7a *74 +6 -2 +6 i2r i3u K ,4 iA1 iB2 iC3 iD4 c d '7 $7 -saz*92] +saz *92 ] i2t scp $/ ^1 $N r -E[*41 +E [ *41 i0n i1i i2n -oA0^* +oA0 ^* ^@ l z1 i0k O61 C -^k*81 +^k *81 O54 *64 i6S O62 T1 $k ^m scZ i2m i3i $0 d -R2i3h +R2 i3h f O75 i7l -i7,y5s9F +i7, y5 s9F *B1 O03 sky i0n -s]%o3Js_1 +s]% o3J s_1 o63 O26 $r $e $n $z $e ^o -3 @@ -33612,14 +33479,14 @@ Z4 O75 Z2 O84 O03 $j $o O46 -s}'+0Y1 +s}' +0 Y1 ^x *1B O29 -5 $u i1R *05 ^1 ^. c so0 T4 i1r i2e -'7.7L6 +'7 L6 i74 i33 O31 E ^B L5 -5 @@ -33633,12 +33500,12 @@ i2i i3n i4g i6f l c d '7 O42 *14 -sWG*09 +sWG *09 i1u i2s O6B .4 c O95 '5 y4 -i52i60i72i81 +i52 i60 i72 i81 } $* i56 i5a i5a i11 @@ -33646,18 +33513,18 @@ i5a i11 $. $m $a i57 i67 i77 t DA O72 -o4As73DB +o4A s73 DB c o18 -+AT3Y3 ++A T3 Y3 i72 i80 i92 iA2 $M D7 O51 o6. c i79 t T2 -+8p5*B0 ++8 p5 *B0 Y2 O56 *56 *13 O31 K -oA O0A ^l *51 $4 $x @@ -33992,16 +33857,16 @@ O31 .2 o34 { z3 i6N O47 } *54 -iAzs;h -$s*78 +iAz s;h +$s *78 $h $z r +6 O62 Z2 y3 '8 Y5 *68 OA9 -T3i2zsn' -p2l -s q,8sjD +T3 i2z sn' +p2 l +s q ,8 sjD *63 .4 o8- Z1 Z2 o9d @@ -34013,12 +33878,12 @@ O23 r ^g D9 -0 o4f i9a iAl -o3sz2 +o3s z2 *68 .2 +9 -6 -7 -0 ^9 ^P o22 -sjqY3^r +sjq Y3 ^r *3A T2 ,5 +0 -9 -2 O07 L6 @@ -34030,50 +33895,50 @@ i6t i7h -5 O63 -2 -6 -2 O72 siS -$=$( +$= $( l z2 i0h i1a i2r O52 *67 i15 i53 p4 ^r -rst}^H +r st} ^H f O18 ^v *54 $z $a $r $i $f -oB+shZiAF +oB+ shZ iAF r c K i2a i3t $s $7 -s7p,3T5 +s7p ,3 T5 i41 i59 i67 i71 O25 sM} p3 s0@ l suy -^2sz@s>< +^2 sz@ s>< O32 o4w z2 +2 o5* Z1 *20 ^1 z2 +0 i8s OA1 s>k -s Ksof -z1rsO2 -o6Cs`U +s K sof +z1 r sO2 +o6C s`U T7 O92 *6B O84 O15 c *45 $6 O09 f +F -E +F -sQgo1E +sQg o1E D3 C $1 ^s $d i63 i73 O08 k i1u i2c i3k -t*31sgl +t *31 sgl O72 o3! -s#_*7A +s#_ *7A .3 *51 i7a i51 r O24 @@ -34088,14 +33953,14 @@ OAB p3 O51 } +B o25 t T7 TA T8 T9 -spWls&S +spW l s&S +3 +6 -8 D9 $p O67 *A0 o8> i38 i77 -i62sJY +i62 sJY i5O O02 -sV-oAz +sV- oAz o51 C o4M s^u oB= O74 @@ -34103,26 +33968,26 @@ O72 *52 +9 -6 +9 ss$ u +7 *56 [ -i0@*82*3A +i0@ *82 *3A $2 ^r -$os,xs;L +$o s,x s;L $x i6d i5f i7d -*84p2 +*84 p2 } ^8 o2k OB6 iAU ^d o4h i3; -o6=*37 -i21i39i47i53 +o6= *37 +i21 i39 i47 i53 O83 *57 *35 ^g -*64r +*64 r O52 r i6z o5s i58 R7 L7 -smksln -s(HY3 +smk sln +s(H Y3 s81 O79 o09 -1 T0 T6 T9 @@ -34138,7 +34003,7 @@ O7A s2h o7V K ^D O32 ,1 -soWE +soW E o8& Y5 O1A f O49 *62 O72 @@ -34147,7 +34012,7 @@ c [ K i5m i6o i41 i59 i67 i77 i5d i70 -s5TsRk +s5T sRk O13 ^A O52 $q OA3 oB, i6k i7i @@ -34163,56 +34028,56 @@ r ^l Y1 s1H D1 T3 O02 ^@ -$=$[ +$= $[ l $d $a $y O52 i59 o53 t -oAk*70 +oAk *70 +0 -6 -4 $i +3 -$;$' +$; $' ,5 O64 Y2 D2 } -o0?*69 +o0? *69 i35 i53 i6e i7m i8o i7Q l -sos$c -*1BdE +sos $c +*1B d E spc $4 $u $s -$ +$. $> $y *52 iA_ O46 K O3A [ @@ -34754,36 +34618,36 @@ i7e i5f { oB! O63 $K c $2 $0 $0 $1 $! -i31i49i57i65 +i31 i49 i57 i65 $o O87 i8r i9e O75 s3] C -L8o7W +L8 o7W i32 i58 i1O C *03 -i21i39i49i51 +i21 i39 i49 i51 i13 i7a O63 sAF l 'B +5 O04 i6_ $m Z2 -{-8Y1 +{ -8 Y1 o5U } D5 u ^T O34 -TBi5C +TB i5C som i0q i1w i3a i53 -$UD6s*q -E[s{. +$U D6 s*q +E [ s{. $1 $9 $4 $1 O71 sXO sV* q O56 ^D ^4 .6 z4 O54 $l k -szZ*56 +szZ *56 *13 K O46 f i3q O05 @@ -34791,19 +34655,19 @@ O13 ^@ o5a *68 o0? OBA *65 i7w -oBe*45 +oBe *45 l RA O81 c $2 $? i1r i2c *67 K *42 $s -.A+4 +.A +4 'C $0 ^C O24 O26 Y3 r O84 K -A *A9 -'8uD0 +'8 u D0 L6 k +0 o2k $1 R0 O43 s@| @@ -34811,19 +34675,19 @@ r i5_ *41 ] *06 ^7 } '6 ^2 -s1!C +s1! C ,4 i4k p1 O59 O75 o4d *53 R1 o01 -o0fsEa +o0f sEa i74 i3a -i72i80i92iA1 -*62*54si& +i72 i80 i92 iA1 +*62 *54 si& o1v [ r O32 -iBP*62 -T0i3l +iBP *62 +T0 i3l O82 -0 O0B '9 *42 ^_ ^2 @@ -34832,14 +34696,14 @@ $0 $2 $1 $3 iB1 iC2 iD3 iE4 i1u i2n q c -*30sK= +*30 sK= i5d i52 i5_ K *76 $o o6f *42 -].6 +] .6 i72 i5c -sFBD2$+ +sFB D2 $+ i54 D1 sQZ i69 O32 @@ -34847,62 +34711,62 @@ i61 i73 i54 i34 i79 i7b O54 *6B -KswP*56 +K swP *56 c slt *51 *54 +5 $D i5J *73 O19 p5 O8A -i9=$fy5 -]L3T7 -*02q -sI{smG,A -*93sX?saU +i9= $f y5 +] L3 T7 +*02 q +sI{ smG ,A +*93 sX? saU o7{ -R3,6u --BsXA -cZ5oAT +R3 ,6 u +-B sXA +c Z5 oAT o8^ -*52Y4 -i2b*47t +*52 Y4 +i2b *47 t sp$ -y2*15 +y2 *15 c ,1 O97 -*BAY4{ -*85smD -Y1z3 -s3koBa +*BA Y4 { +*85 smD +Y1 z3 +s3k oBa O96 u L6 Y4 ^0 O21 stO -so!o8] -*89i4Y -+Ai4N -.9*02 -$,o5Q -*38i5@ -$lsF` -y3,4 +so! o8] +*89 i4Y ++A i4N +.9 *02 +$, o5Q +*38 i5@ +$l sF` +y3 ,4 snJ -D6sP. +D6 sP. i3F i3) -o9#i7F -ci2cp1 +o9# i7F +c i2c p1 O97 z4 -i6Cq +i6C q i0; O85 o6r o9V o4_ OA3 -*B8Y3 -+4$Ysdv -*67C -*53ss#sIw -sf9l -'Ar -s9(z2 -o4)*5A -o2's/\ +*B8 Y3 ++4 $Y sdv +*67 C +*53 ss# sIw +sf9 l +'A r +s9( z2 +o4) *5A +o2' s/\ *B0 *62 O42 c d 'C T0 T4 TA @@ -34920,44 +34784,44 @@ c d '8 $7 Y1 soD C d $1 [ r O45 -sr9i1z -sbM+0 +sr9 i1z +sbM +0 O34 Z5 -.8-7 -i6c*ABR9 -*81+7 +.8 -7 +i6c *AB R9 +*81 +7 ^b O57 *02 s-l O98 O91 i91 iA1 iB2 -*5AK -sx,,8 -+5*2B +*5A K +sx, ,8 ++5 *2B i90 iA1 O7A *65 -o81*A3 +o81 *A3 si; OB3 i8d i92 -s2)-3i9' -*B8sbp --2s'/ -.6*9B*0B -s4.*74 +s2) -3 i9' +*B8 sbp +-2 s'/ +.6 *9B *0B +s4. *74 s|\ O95 *07 -*B7*A8+A +*B7 *A8 +A i87 i92 -*B2^3 -sD;{ +*B2 ^3 +sD; { o51 O13 -i3{i7V +i3{ i7V iA, *B5 -o4Q*0A -y5y1u -Z2i7\ -i0Y*B9.4 --3i1/ -o7O$&{ --1Z2i7M +o4Q *0A +y5 y1 u +Z2 i7\ +i0Y *B9 .4 +-3 i1/ +o7O $& { +-1 Z2 i7M Z4 O56 i5L T6 O17 ^- @@ -35015,7 +34879,6 @@ z5 O57 O76 [ z1 O84 -2 L2 -D1 [ +3 i5b } K *15 ^F o64 @@ -35051,8 +34914,6 @@ c $d $a $y ^t ^h ^g ^i ^n c $p $a $s $s l ^i ^x ^a ^m -l [ ^s -l [ ^m d $a l ^n ^o ^n ^p ^m ^a ^c @@ -35380,7 +35241,6 @@ Z3 D9 O61 o3M ,6 y2 +0 i7k Y1 O39 -q Y1 O1A s2J i21 O42 ^P s05 @@ -35557,209 +35417,209 @@ l ] $c i6d i7r ^0 ^0 ^7 r y5 OA9 -sjN*57 -^BsN@ +sjN *57 +^B sN@ z2 O05 O49 $m -sprs!x +spr s!x O97 ^K -*8AT1.7 -}sx&.0 -Y1iBKC -sqJ] -$DsMt +*8A T1 .7 +} sx& .0 +Y1 iBK C +sqJ ] +$D sMt *5B O49 *54 -R7iBw +R7 iBw OB4 $z -soa*58 -i6@'9 +soa *58 +i6@ '9 OAB o0K i9s -i8R,6 -i0s*A9 +i8R ,6 +i0s *A9 O05 i54 y4 -*46*A9 +*46 *A9 shZ -D2sk7 -o0Cs*? -i7_sh}sUR +D2 sk7 +o0C s*? +i7_ sh} sUR O76 D1 -slr*86 -*A4Y3 +slr *86 +*A4 Y3 O62 O19 'B -*6BuD8 -o4osxd -,3.9 -D0]sVm -sh9sGro7s -EZ4s(3 -,7Z3 -*A1o0W +*6B u D8 +o4o sxd +,3 .9 +D0 ] sVm +sh9 sGr o7s +E Z4 s(3 +,7 Z3 +*A1 o0W oB^ O02 O61 ,5 -Z3s|o -iAHE,3 -T5o8l +Z3 s|o +iAH E ,3 +T5 o8l OA5 $k s_T O72 O31 Y1 *96 O3B '7 u -*5BusKs -.7sgR -*5B,8sLu -o4ysOD -*63-3 +*5B u sKs +.7 sgR +*5B ,8 sLu +o4y sOD +*63 -3 r OA6 -^nD1-A +^n D1 -A o10 O39 -s^) ++0 *5B Y2 +o8u iBw s&F +D0 ,2 *AB +^z D7 +saR s@ s>) z2 O73 -sme+6 -+A$T -i7fc*9B -.5*B8 +sme +6 ++A $T +i7f c *9B +.5 *B8 snW -ssd*94,7 -R7$3 -i9;$h -$=$. -o5c*41 +ssd *94 ,7 +R7 $3 +i9; $h +$= $. +o5c *41 i5c i7b i5c i74 -+BC ++B C i78 i19 i5d i5b O2A y4 O39 -^$sZ/ +^$ sZ/ sSN O1A -Eo1Z -s;g^` +E o1Z +s;g ^` i35 i79 *30 OB7 -]Z5 +] Z5 ^B O93 *25 i3d i3c *24 O5B @@ -35767,55 +35627,55 @@ i18 i14 i1a i7b i31 i15 s7, -ss{{r +ss{ { r sRZ -sY%iA= +sY% iA= OB8 O27 -CZ2oBa +C Z2 oBa i1e i77 *12 O52 *18 -}$9 -suwo5W +} $9 +suw o5W s3< O65 D6 -sb0Y3*A5 +sb0 Y3 *A5 OB6 oBh s4f i59 i34 i7a i14 oBM O18 K svw i19 i55 -i21i39i47i58 +i21 i39 i47 i58 i17 i12 O58 r O53 sE; O5A ^z i76 i36 i54 i1e -R1iAC+A +R1 iAC +A i13 i19 k O74 O73 i13 i17 -i7to8< +i7t o8< *92 O8B sbE O04 R0 sa9 -o5y*96L6 -}*6Bsyb -sO+s3& +o5y *96 L6 +} *6B syb +sO+ s3& s3W Y3 O89 q -$=$! +$= $! i34 i3b i3b i33 i5a i33 i1c i14 -i31i49i57i63 +i31 i49 i57 i63 *A8 O71 O24 R3 se0 -$+$! -$@$> -$*$? -T1*93o30 +$+ $! +$@ $> +$* $? +T1 *93 o30 O64 *62 i77 ] i4y i6s $1 @@ -35823,7 +35683,6 @@ $? $1 i4y $1 i6s $6 $6 $! $* k -i55 O91 E ^B $o o8M O12 ^F z1 @@ -35863,10 +35722,8 @@ c $6 $. $7 o67 l $1 $9 $8 $9 D3 D7 -[[[[[[[[[ *70 E O23 *19 O81 -*70 O23 E o6% O54 Z2 l $1 $4 $3 l '5 $3 @@ -35883,15 +35740,15 @@ $6 -7 i0y i1e k $i *54 R7 +3 -s*ED1 +s*E D1 d O72 i3b i74 z2 ^a sy3 E +0 +8 -2 -$2$0$3$1 +$2 $0 $3 $1 $a ,1 -sjfs,O +sjf s,O ^l i3l i89 i93 i8l i9e @@ -35906,18 +35763,18 @@ i37 i71 $G O02 '5 $. Z1 i7t -]*A2^" +] *A2 ^" O08 ,9 +2 D4 *43 i7t i8e -+7s@.^D ++7 s@. ^D i78 i18 i1a i2i i3l O45 y5 o68 D8 i4i i5o i6n +0 -8 +2 -iAHsj( +iAH sj( i7r i8o c i3. O08 T9 @@ -35926,12 +35783,11 @@ O08 T9 spf t i7S *75 '8 --3*60s*o +-3 *60 s*o O03 p3 O51 $v o5c -0 O31 $_ -O51 *54 E O51 r ] O72 Y2 O42 *52 @@ -35948,7 +35804,7 @@ i33 i53 -3 -9 -4 o9J OBA i6L T5 Z1 -'A O9A i6N +'A i6N *A9 .8 o8w [ -0 '7 @@ -35960,7 +35816,7 @@ i50 i31 c $0 $) K ^l $7 -0 -oBKcT9 +oBK c T9 s9c OB1 o1p } i3a i1d @@ -35981,12 +35837,11 @@ i88 i99 i8M $v O67 i44 i53 -$q[ DB { -*6Ai6b +*6A i6b sm7 slm -s9?.2 +s9? .2 t o8L O09 ^! s!o +B -1 @@ -35996,7 +35851,7 @@ c $# $7 +0 -2 -8 O23 $d -2 O02 L1 O04 -sCnsoE +sCn soE q O7A ^w sil i26 i30 @@ -36010,7 +35865,7 @@ c ^K i2e i3r sr) i1b c -i6QDB +i6Q DB i81 i94 i7y c i4" @@ -36031,7 +35886,7 @@ O03 y3 i8s o1o i44 i55 i66 o1n .5 -oB/*38+B +oB/ *38 +B i7n i8a z2 *03 *67 OA2 R1 @@ -36040,11 +35895,11 @@ sA8 ^@ ] +3 *34 r c ^0 $1 -L9i9Zi31 +L9 i9Z i31 i13 O53 T1 +8 i6a i7y -o0rsVh +o0r sVh sud c i2l +7 ^w @@ -36066,7 +35921,7 @@ o4s *41 O62 *4A p5 +5 *78 +4 ^Z -*6A,6 +*6A ,6 o2@ T0 o3@ D4 i1u i2t @@ -36076,14 +35931,14 @@ t *93 i0t i1r i2a O31 O21 *45 'A +2 -s/F,5 -s1$p3 +s/F ,5 +s1$ p3 z1 $f o9z T0 O72 *9B *15 O89 OB2 u O4A *83 -*24*40*0B +*24 *40 *0B O71 K i9V { *32 *32 O96 *25 @@ -36103,7 +35958,7 @@ $ Z2 O32 o3@ i0f i1r i2a s9_ -*68T4 +*68 T4 o7r t $! O32 i7u i8l @@ -36111,15 +35966,15 @@ i0k $e i3u O63 Z1 o7p L0 o1. -^hy5 +^h y5 T0 O12 spy *92 '9 Z3 $S O75 -s|Wt*13 +s|W t *13 +6 o92 *54 ,9 -{*80sp- +{ *80 sp- OA2 O05 i73 i3c D0 s30 @@ -36127,14 +35982,14 @@ o1) o6R O1A i0j i1e i2n Z1 o5. o6j E -*96*A3E +*96 *A3 E ^x ^3 y5 Z3 O47 o2g o1d i6L OA5 c i5g i5a i6l i7l -i30.A +i30 .A T4 ] y3 ^B *25 D1 ^U @@ -36144,20 +35999,20 @@ r i7l i6e i7r i8s $A z1 i3a i4t i5a -Y1sFV +Y1 sFV i73 i3f -R7s/AE -$5*26 +R7 s/A E +$5 *26 sBw O02 K { o1s i3n -Esx?Z4 +E sx? Z4 +1 'B o1. O27 O87 [ p1 O0A -*46^D -sMjsQH +*46 ^D +sMj sQH $Y l +3 i4a i5n i6t i4- o0e *13 @@ -36171,27 +36026,26 @@ Z1 O51 o2r Z2 T0 -A se6 R3 Z1 o6t -}D4 O64 i4o i2. o0d -c*25E -i82i90iA3iB0 +*25 E +i82 i90 iA3 iB0 *31 .3 -sLTsHD -s56LBY5 +sLT sHD +s56 LB Y5 o0S O16 y2 r -7 Z1 sEH -$rk^f +$r k ^f c $e $d sKu { O42 i39 i18 $3 i6@ o4y l +0 -s+ysqf*75 +s+y sqf *75 *56 r --9iA* +-9 iA* O45 i0L Y2 *20 +0 c $* $2 @@ -36202,16 +36056,16 @@ l ] $O *41 *40 l ] $N $6 *57 -*8Bo3_K +*8B o3_ K $h -3 c ^3 ^7 ^9 ^1 i58 i5e -i3oLA*18 +i3o LA *18 i13 i1e -*A0s4q -sBjiB& +*A0 s4q +sBj iB& *54 o0H -$@$) +$@ $) O27 Z5 sVJ o2p O35 @@ -36229,24 +36083,23 @@ c ^$ t O04 O68 O15 Y4 t o8D -*6AsV0i6$ +*6A sV0 i6$ O21 scs $$ ^1 -s'Xp4'9 +s'X p4 '9 sOE { i66 '7 l ] $e $d l ^y ^b c $* sAJ OB8 -s2Ds?!o6$ +s2D s?! o6$ sQF y5 q OA2 s6Y O34 T0 i2p -sTJ^Ts#> -E ,3 -*A9z1 +sTJ ^T s#> +*A9 z1 O54 $9 i36 i1a C '8 $3 @@ -36256,26 +36109,26 @@ $A $C O57 o5j .2 d 'D $1 O43 ^C -$-L7 +$- L7 -5 -8 -6 -7 O67 } -*59^OiBd +*59 ^O iBd $* O51 -ET4r +E T4 r o7i i3X O15 -*16+5 +*16 +5 i38 i54 '6 $? sfl sun D4 $5 $f -ls@S +l s@S T8 O15 o3~ $d o0p +2 -1 +6 c $7 $5 $3 $5 --5E +-5 E o6k r sck O57 i59 i36 @@ -36284,14 +36137,14 @@ q O35 iAl -2 $4 c 'D $7 -+5o0ysBH -Y2rT4 ++5 o0y sBH +Y2 r T4 i1W o0/ d $5 --6,4D5 +-6 ,4 D5 -3 $b -i00z1*08 +i00 z1 *08 o0| $! $@ $# $$ $% ^! O69 @@ -36316,7 +36169,7 @@ o1" RA i6A O36 s17 *57 i12 i50 -oApT4 +oAp T4 c ^N s&@ i6m i7a i8y @@ -36325,10 +36178,10 @@ i5b i3c *43 t -5 $0 $c D6 sby -R4*93u +R4 *93 u $0 $d -s O68 s]e R3 [ $b O73 O38 i75 i7d -Ey4s^y +E y4 s^y T5 y3 -*97^cK +*97 ^c K } *1A z5 O71 c C '7 $4 @@ -36989,8 +36838,8 @@ $. $b $g o2n Z1 } sVR c *07 -0 -$,$- -sumY5L5 +$, $- +sum Y5 L5 T5 Z2 O14 i0T O69 .6 @@ -37000,9 +36849,9 @@ $* O57 i7s i8o i9n *48 O73 *97 o95 -oARsx) +oAR sx) r sL1 '6 -*19sv? +*19 sv? O35 ] Y5 c $1 $6 $! $! i58 ,6 @@ -37013,16 +36862,16 @@ i14 i1a O54 D3 t OB2 k O45 i1_ -*93-4sY| +*93 -4 sY| i3c i1f -0 ^5 s/P O6A O57 T3 sbu i5a i17 *79 i9n --7$us/x +-7 $u s/x i35 i58 -s!-*61 +s!- *61 *76 -9 *40 i7j i5s i6o i7n @@ -37033,7 +36882,7 @@ i1r i2m z2 { p4 $J +2 +5 -3 +7 -*62s^+ +*62 s^+ u ^3 ^2 ^1 sjv skP @@ -37044,7 +36893,7 @@ s2M O53 sln s3y $e o0d -*19su4 +*19 su4 c OB2 $g $i $r $l l ^r ^o ^o ^d @@ -37052,7 +36901,7 @@ l ^r ^o ^o ^d *98 O52 $e $2 o8b Z1 $9 -$&$@ +$& $@ i36 i73 { c { { i1d i13 @@ -37068,16 +36917,16 @@ i2k i3a i4s swn O87 z5 y3 O78 i79 R9 L9 -]L6$_ -$YK -s tz2 +] L6 $_ +$Y K +s t z2 i7a i39 -$bo9P*7A +$b o9P *7A i2R K i3f i5f $z $i $l $l $a -s.AR8 -sX'*32*40 +s.A R8 +sX' *32 *40 C ^7 O16 o6t c $0 $4 $6 @@ -37091,8 +36940,8 @@ $9 $0 $* $* O24 T9 o0\ O45 +A O42 -s?_*AB$p -i3TC +s?_ *AB $p +i3T C i7a i8y ^_ ^5 i59 O02 @@ -37105,16 +36954,16 @@ $d i0t O04 o51 +6 +6 +9 $_ l -*18sF4 +*18 sF4 i3b i3d { $_ +8 +9 -5 c $7 $x -t$9o0F -$Go9`RA +t $9 o0F +$G o9` RA -5 *25 l -o6oTA -sPloAF +o6o TA +sPl oAF Z4 O53 sao s8B c $_ $x @@ -37123,7 +36972,7 @@ o6p r i74 i5c i87 i99 Y2 ^S -+5^` ++5 ^` Z1 o4h i1o i2s i3t $a *73 O03 @@ -37132,7 +36981,7 @@ l ^t ^f ^o ^s i7f i5e D0 p1 O15 i3m D2 o50 -s@Lq*39 +s@L q *39 sIN sgz ^" O61 @@ -37143,7 +36992,7 @@ o1F R0 O46 [ r o0L i78 R9 L9 -]'6Y4 +] '6 Y4 T3 o76 y5 O39 ^! O71 @@ -37152,22 +37001,22 @@ Z1 i71 o2- o1w ] O86 i5i s1d -*76^wD7 +*76 ^w D7 -0 -3 -4 o0{ i3k i4i sx* i2U D3 -*49*71L8 +*49 *71 L8 i52 o79 r $b $o $o $k O53 -4 -iAx*BA +iAx *BA $1 ^c *31 ] -0 $. $p $l -s8DsNO -sB$o9% +s8D sNO +sB$ o9% k sej *02 *05 [ sps @@ -37184,8 +37033,8 @@ sDH i2n i3d s*R O92 O46 *35 -*76+8s6b -o7Fc +*76 +8 s6b +o7F c o6r ^C -A *8B O21 ^l ^i ^o @@ -37194,7 +37043,7 @@ i0k i1i i2t *15 i6T i13 i50 $a $l -.4oB` +.4 oB` D3 sbz O23 o2c *65 i66 @@ -37211,41 +37060,41 @@ st* ^2 ^B i9z E '5 i2. -$Ys4# +$Y s4# c ^8 ^7 ^9 ^1 i4e i5m i49 T5 o2@ [ s2_ $q O31 -.1Z5 -$+$# +.1 Z5 +$+ $# O52 i5@ O31 $6 sel sto -s/H.B +s/H .B st_ $C D7 } o3y D4 O5B *32 O47 o8M O52 -s$OE +s$O E { T1 *57 $o *53 sbn ss$ se3 O29 $x .8 -Y2r -*24sfO +Y2 r +*24 sfO ] ^q z1 ^V -7 '7 i1o q O12 O7B s%B -i22i30i40i56 +i22 i30 i40 i56 skW -i22i30i40i57 +i22 i30 i40 i57 i32 i3f i6t i7a i8r O72 *9A @@ -37253,7 +37102,7 @@ i1v -4 s./ '8 z1 i5n i6d -s4+$j +s4+ $j ${ s?M O86 O32 } i7A *30 '8 @@ -37261,10 +37110,10 @@ i7A *30 '8 u O38 i2m i3o i4n $2 $9 $! -+9^jD8 ++9 ^j D8 i47 i58 $E D8 -*1B*31 +*1B *31 sjy O45 $A i50 i3e @@ -37292,7 +37141,7 @@ i11 i7a R7 O43 O75 ^D *62 c O5A -D2Co4N +D2 C o4N O53 Z1 k i17 *6A '9 @@ -37308,23 +37157,23 @@ l ^g ^n ^o ^l p2 *36 O76 ^2 ^G ^ ^3 -i8 { -*A1{sWY +i8 { +*A1 { sWY ^@ O15 LB o4? O54 -q*21+9 +q *21 +9 -0 -9 -4 D6 $R $_ $i ,9 +0 -*04$Q +*04 $Q ^f O72 Y2 -.7sdK +.7 sdK $a $l $l $y } $z -o34*36o00 +o34 *36 o00 i3e i4m -$~$! +$~ $! i39 T4 D1 -7 i2# @@ -37335,23 +37184,23 @@ i71 i1b -6 -6 -9 snh *64 O54 -4 -*89D3c +*89 D3 c $4 $8 $0 $0 Z1 i1l l ^m ^r ^a ^f i0m i1o i2o -Y2,0'8 +Y2 '8 +7 OA2 *53 $L ^2 ^C -i7`ts?7 +i7` t s?7 o5D E k i4z ^; O57 -se&D2*45 +se& D2 *45 *02 $d -o97s,M*0A -LAt-3 +o97 s,M *0A +LA t -3 *61 -4 i8p i9e iAr $. Z3 @@ -37360,16 +37209,16 @@ o2% Z1 $g i5i i6n i7a sh. i2. O94 -p1o0isR6 +p1 o0i sR6 s1Y -ko8^^Z +k o8^ ^Z o9s $e i1w i2i i2e i3p ] -4 [ t } i7a { -]z3*93 +] z3 *93 i2e i3s Z2 *68 .9 s96 O72 @@ -37378,11 +37227,11 @@ i7* Y1 i5t i6a $1 -4 ^x Z1 -to3E +t o3E L3 O07 Z2 +3 -s]5i37 -$9R6*3B +s]5 i37 +$9 R6 *3B d O14 o1r O45 O45 ^m @@ -37390,13 +37239,13 @@ sHr c ^9 $4 i6t i7o i8n o3i *15 -R1Z2sbg +R1 Z2 sbg i74 i14 i5f i7f O82 l $= $a ^g ^j -iB#iA4 +iB# iA4 +0 Z2 i18 i33 i1d i1f @@ -37406,8 +37255,8 @@ i74 i7d i90 iA9 $8 i64 $" l -*65RBk -ky5sh$ +*65 RB k +k y5 sh$ i1I $0 O12 O82 r sOs O14 ^P @@ -37416,36 +37265,35 @@ i4o i5m +D -9 $9 $7 $@ $@ o4- -6 -T2k^p +T2 k ^p f O42 .4 K i50 R7 L7 sft O43 *42 *15 *43 -*70o9x,7 +*70 o9x ,7 ^S ^J i5c i75 i5c i77 i1a i1f i7n i81 *98 $e O52 -{ T8 -0 spm o9H ] sje i74 i3c C O04 l $j $o $h $n -+8sKlq ++8 sKl q DB O13 -$4o9u -y4s_" +$4 o9u +y4 s_" $1 *03 k K ^M DA { ^w ^a ^s -Z1*9A +Z1 *9A i11 i3e se! +6 *32 @@ -37454,7 +37302,7 @@ spw $s s2F E $f ^R *45 -s[I.0 +s[I .0 $0 ^@ i51 i69 i76 i84 sdq @@ -37469,7 +37317,7 @@ i07 O83 *53 { O07 L3 o1c D6 -*28s7z +*28 s7z i72 i5f i1a i2n i3s s1& @@ -37486,7 +37334,7 @@ o5y k $b O13 O71 D4 ^N *32 D6 *43 -}]sbB +} ] sbB i77 i7d o0D z1 ^t O45 @@ -37498,29 +37346,29 @@ Y2 -2 s_! L6 $h o4[ -*97z5 +*97 z5 *31 $r T9 T4 i2t i3e oA1 D5 O63 *34 -*36c +*36 c *32 OB1 iBp -z4.7 +z4 .7 O3B $n -D9D9 +D9 D9 o6i O12 -s[s$/ +s[s $/ *06 *31 z5 z4 -cy4 +c y4 +0 i6v o6p +9 c ^2 $7 L7 O52 c $1 $6 $4 $5 o9& -oB$*89 +oB$ *89 O34 Z1 O32 o5w +5 +6 -0 @@ -37534,7 +37382,7 @@ l $h $o $o $d sa* O92 *86 O34 z1 -sKQ*70 +sKQ *70 c $^ $1 *08 O45 t o9l @@ -37550,21 +37398,21 @@ i3b i5f -0 O24 *65 [ { o0C z1 -sg|DAi9m +sg| DA i9m o30 r *30 -o8C*A6*25 -*84o5w +o8C *A6 *25 +*84 o5w $K { ^P ^M +8 $g -t*70iB} -Z4*57 +t *70 iB} +Z4 *57 i2d i3y OB2 k l o9G -$nsQE +$n sQE ,9 O45 -o9ti7{ +o9t i7{ i0g i1r i2e ^$ O19 sJY +0 +4 +1 @@ -37585,17 +37433,17 @@ O68 s9I r f O3A oAD O58 ] i6N -*84sd"*47 +*84 sd" *47 ^f 'A +0 +7 -2 -$ai9$+8 +$a i9$ +8 ^n ^o ^n u i6_ i75 i35 +8 -2 -4 sak D6 ^b ^x -*58c +*58 c i62 i77 c $7 $8 $! p1 i4a O5B @@ -37610,8 +37458,8 @@ O2B iA" *50 i7u i8s *63 O64 p3 *B9 ] -s"Wi7M -D6i0Y +s"W i7M +D6 i0Y i66 i75 D2 ^, $y o1u @@ -37620,11 +37468,11 @@ O26 'A d *13 $M i3p i4a i1u i2i -*4B^P{ -*1B]t +*4B ^P { +*1B ] t O61 $i .3 t -TBsMW +TB sMW i0a i1m i2a i13 i39 +6 +A +6 @@ -37632,14 +37480,14 @@ i13 i39 ^f ^x i2x i3i c sb8 -^Fo8w +^F o8w i21 i38 $z O51 ] O83 l ^n ^u ^s O89 z5 O01 -s@us3d -koAn-4 +s@u s3d +k oAn -4 ^x O54 -9 Z2 *91 O48 @@ -37655,7 +37503,7 @@ O26 Z5 i9j OA3 ] i43 c $3 $5 $! -oBio56$# +oBi o56 $# srs saj i1r i2u i3n ssb k @@ -37667,15 +37515,15 @@ o0S *34 i1d i3f i39 i56 O64 D3 -^`sSBl -D4C +^` sSB l +D4 C *21 *72 ^n i0b *76 q $6 O73 ^K O48 -^1LB -s>J*A7 +^1 LB +s>J *A7 o51 o6b *43 $3 l ] $V @@ -37684,16 +37532,16 @@ i8 R9 i2g i3e i4n $h *54 -3 i33 -^HKl -[sl9K -o8sp5 +^H K l +[ sl9 K +o8s p5 } i56 *86 *95 $p *05 *16 *23 OA1 Y4 ,6 O98 o5s -Ey3 +E y3 O91 R3 c $6 $9 $! $! i86 i95 @@ -37702,29 +37550,28 @@ i7s i8e i4 D6 i34 i73 *45 t -l [ ^z r ^m r O35 -*25o5x +*25 o5x +B O64 -*19koA@ +*19 k oA@ +C -5 i18 i16 *32 i6_ D2 $o ss6 -o25*67 +o25 *67 l ^o ^s ^i ss- i3f i5c DB O64 *43 O59 -$qDA +$q DA O27 s-x -*B1$i +*B1 $i *A7 OA9 sz1 -t*7Ai9e +t *7A i9e $ $n l ] $X i34 i79 @@ -37737,8 +37584,8 @@ i3g +7 +2 c i35 i1a T2 oA2 -$o*08 -i7Js_D +$o *08 +i7J s_D O02 c $2 *52 o9t O8B @@ -37755,12 +37602,12 @@ saz D9 o89 s1h i52 i60 i71 i88 -T3o0f +T3 o0f Y3 O38 D3 $n -1 $3 +3 +9 -6 -C,6 +C ,6 c $* $3 O12 z2 T3 i1L u [ @@ -37768,26 +37615,26 @@ D8 ^H Z2 O13 i46 i51 O03 O4B --By5 +-B y5 i61 i74 i83 i38 i73 $5 $7 $0 $5 -s%$i2. +s%$ i2. o19 D4 l $1 $9 $9 $7 sfa $P -3 -+BY2^J ++B Y2 ^J O65 o0v i6h i7i -*08,1 +*08 ,1 L0 Z1 i1e i50 i3a i4l i5l l $0 $0 $3 i52 i32 i83 i96 -i21i39i48i51 +i21 i39 i48 i51 i09 +2 i1e i2s i3t c $1 $7 $* $* @@ -37802,16 +37649,16 @@ O26 ] -0 o7z $p $t i5i +7 -$di1uR6 -$)$% +$d i1u R6 +$) $% c $1 $5 $! $! c $= $2 *13 su[ sPN u $1 $9 $7 $9 -C*70 +C *70 E p4 D6 -*60Y2 +*60 Y2 i6t i7a k *42 i8Q @@ -37819,19 +37666,19 @@ z5 o6J O27 o6p o5l K *53 O41 -7 O67 -sx;^d +sx; ^d ^v ^u c $0 $6 $! -s Esu*s^@ +s E su* s^@ O43 O5B +8 i2a i3b -*91Z3 -]*A9 -$)$/ +*91 Z3 +] *A9 +$) $/ i39 i76 $0 $9 $$ $$ -o9UD1 -sHh+4 +o9U D1 +sHh +4 c ^1 ^7 ^9 ^1 ^t '7 *98 +1 @@ -37840,7 +37687,7 @@ p1 t O62 i4t i5a i6r D5 s13 l [ ^U -T7s;c +T7 s;c iAN O52 l $ $g *72 '6 @@ -37858,8 +37705,8 @@ i2a i3c i2n i3u c $o $n i57 T6 -L1*18 -s[K*A9o3O +L1 *18 +s[K *A9 o3O sov *82 O06 +4 c @@ -37869,21 +37716,21 @@ O7A ^9 iAz D1 D6 $8 $8 $@ $@ *78 R6 p4 -Ky2 +K y2 svD u *54 ^9 { i3n i4i *16 O41 *35 -*92R3s'9 -*B7LB*86 +*92 R3 s'9 +*B7 LB *86 *95 O82 l $m $e $n -[iA/ +[ iA/ o4b O57 *57 ^a ^r ^t ^l ^u i7o i8m i8f O05 O21 -o3y,A +o3y ,A } ^Q y5 O0B o6% [ @@ -37891,7 +37738,7 @@ Z1 *68 '6 $. +2 ^8 u $7 $8 $9 -i7#iBf +i7# iBf o87 O31 D3 ^6 i1f i3a @@ -37899,23 +37746,23 @@ $9 $1 $! $! c $A D3 ^i *42 K $h -.AY3 +.A Y3 OB6 .4 i1b i14 O31 T2 i0l i1o i2v i1b i1d -CsTyoAv +C sTy oAv i1a R7 L7 *68 O43 ^j c i6@ $8 *75 s7! -*34sB! +*34 sB! ^G $v i1a i2g *82 O81 -C^S +C ^S i5e i38 ,8 o7h i3s i4o i5n @@ -37927,14 +37774,14 @@ i42 i58 l ^n ^o ^o ^m l ^e ^e ^n ^k o2A -.8$V,B +.8 $V ,B $m -1 *62 *52 -s=O^k +s=O ^k u $2 $0 $0 $5 *84 O06 { svL -s!uswj +s!u swj i38 i50 sPA i8c i9a @@ -37942,25 +37789,25 @@ o4W sM O56 $_ i25 +2 p2 o3l o0H -*B4K] -R0s)V -Y2us(I +*B4 K ] +R0 s)V +Y2 u s(I D1 D8 i17 i7a O15 p2 -s^co3o*0A +s^c o3o *0A *40 O27 T0 TC s6L -,8*15i6T +,8 *15 i6T c $9 ^8 -*A3saU +*A3 saU i14 i71 sX- O49 Z2 i37 T4 R4 o57 -0 -D -$zs{t +$z s{t u .4 O74 i38 i53 o6m *43 @@ -37969,17 +37816,17 @@ c i25 c $1 ^^ $1 $3 $8 $5 i8t i9e iAr -o9wi5_ +o9w i5_ i52 [ -D9scs +D9 scs p3 ] *B9 o9y -3 ^r O16 sma i1o i2v -s%]*59C +s%] *59 C o41 O02 -s]bshb] +s]b shb ] L5 OA4 O9B T0 TA T6 i63 i74 @@ -37987,7 +37834,7 @@ O4A q z4 O56 T2 O87 O19 ^W *32 -*1B*83sTV +*1B *83 sTV T4 o5i -2 D0 *54 i8e i9r iAs @@ -38007,17 +37854,17 @@ c $8 $1 $! iBJ i53 *68 T4 o0H -y1Z5 +y1 Z5 i5b i70 i3d i3f i56 i5e -*B1}s'E +*B1 } s'E d sr5 O95 ^X O62 -$@$/ +$@ $/ K T8 $w o6a -s4XD3Y4 +s4X D3 Y4 c 'E O19 y4 *08 ^p O62 @@ -38043,14 +37890,14 @@ i21 i39 i48 i58 c ^0 ^7 ^9 ^1 i66 i77 i1a i2v i3e -,8Z4 +,8 Z4 O93 ^U $0 $a O56 $$ i2g i3e -s5+*58s|\ +s5+ *58 s|\ $2 $7 $! $! -C+2 +C +2 O5B s6. L0 *47 o7A D7 O23 @@ -38062,16 +37909,16 @@ y3 [ o0t O04 +5 s9J i67 O45 -$^$$ +$^ $$ s6< -s}I*48D4 +s}I *48 D4 o51 $9 $7 i2a *42 *41 $s *25 ^d i0O D3 Y5 O62 -s18i5P +s18 i5P *47 O06 T6 T9 i4c i5i @@ -38084,7 +37931,7 @@ spv ssy ] ssE E i5a i58 -*48-5+B +*48 -5 +B i0s i1h i2i D3 i93 *03 *47 @@ -38096,18 +37943,18 @@ O98 $/ OA5 ,6 -0 o1- '6 sie o6h -T3*5BTB +T3 *5B TB *85 O62 -$X*A4*A3 +$X *A4 *A3 o1o O53 Z1 -o0C{ +[ $C o3t *06 *53 smb -*59*73 -*04$wo85 +*59 *73 +*04 $w o85 c $7 $6 $4 ,5 s>K OB9 -iA3o9e*4B +iA3 o9e *4B c T5 i5- i58 i30 i5e i6n i71 @@ -38117,32 +37964,32 @@ O62 ^3 .5 *74 $) i4( k *07 -s)zoBLi9b -sSDi4) +s)z oBL i9b +sSD i4) t o7P s9. -$&$! -s)X$yLB +$& $! +s)X $y LB i18 i7a sy9 i4c i5a ^c O82 O54 p1 -s]W]o55 -$?$+ +s]W ] o55 +$? $+ u d 'C $7 -^pD6 +^p D6 i3i i4t i5a *47 ] o3F { u d 'C $5 siw O31 O36 *36 i6x -i22i30i40i55 +i22 i30 i40 i55 O42 K $a R5 s1n $y $e $p -Ki0V +K i0V i19 i50 -3 } k +9 @@ -38157,33 +38004,33 @@ i39 i53 E *79 O37 ^a i2l i3a i4n -RBsa4o9! +RB sa4 o9! Z2 *21 $. *45 $1 $9 $9 $2 $+ i1l i2a -$osG& +$o sG& O05 *20 *32 T7 D6 i8x D6 L5 o5t Z1 -*A9T6 +*A9 T6 '9 $. sMB O93 } -*9Bo9y +*9B o9y Z1 .1 O23 -sBk*21 +sBk *21 T2 k -i22i30i40i53 +i22 i30 i40 i53 i3h ^k sp_ D2 O83 *10 O97 z1 *23 i5f i1a -i6q+8 -*1A^4o06 +i6q +8 +*1A ^4 o06 D1 *21 $U o3s *51 *36 { @@ -38200,24 +38047,24 @@ i3r o6h O74 *14 O32 T3 *B9 O31 $M -r*B1[ -o7#Ko8$ +r *B1 [ +o7# K o8$ O58 c R2 -q*8B'A +q *8B 'A T2 O63 $7 $f Z2 { +7 *75 O31 O17 y5 -^3sH| +^3 sH| $v *43 -^FsO8 +^F sO8 O89 o6- t O6A i7s y3 O1B $d *21 O64 *63 $/ l -*37$4,9 +*37 $4 ,9 i4d i5o i6m o6m } O09 y5 @@ -38228,7 +38075,6 @@ l ^D i74 i5d szd } OB8 -*32 O21 z1 +5 -5 $T szn @@ -38239,15 +38085,15 @@ DA D1 Y5 O46 O45 .2 { O7A o7r -s5>*45 +s5> *45 oA; O82 sRX -s>X}K +s>X } K t o2T K o6U -s/l+1z2 +s/l +1 z2 i5c i11 -[y5 +[ y5 Z3 O43 o9t E l o4+ @@ -38256,19 +38102,19 @@ o3z { i4r O91 $k p5 ,A +9 -i7r*84s3x -s8,*75^A +i7r *84 s3x +s8, *75 ^A -4 $V T8 o7E -s;@*27,7 +s;@ *27 ,7 O62 y1 ^H ^C -*2B^l +*2B ^l *72 O16 ^E D8 Y2 *04 { -i9g$z -TAp2 +i9g $z +TA p2 i4a i5r o5+ [ r O6B @@ -38299,17 +38145,17 @@ i1b i3a Z4 Y1 O32 Z1 +8 o7u D4 [ $y -sBSo9$*75 +sBS o9$ *75 i30 i78 i61 i75 -s.m+2 -*38$r +s.m +2 +*38 $r o0Y *65 sSr O86 R6 r o65 o9H -*B0d -sNSs'g +*B0 d +sNS s'g i7a L6 L8 *65 O25 -3 c $L @@ -38319,15 +38165,15 @@ z5 O35 c $8 $& i1, $3 i8< -*19s^RY1 +*19 s^R Y1 c $1 $~ ^s O43 Z1 *05 -5 ] O64 i57 -,9s' s1G +,9 s' s1G svP i65 -8 -}T3 +} T3 o5 D3 'B *23 scL u @@ -38338,7 +38184,7 @@ O92 ^( O17 Z2 sdT i8e i9n -*97$h +*97 $h i1A O41 *84 ^s '8 ] i7T O23 @@ -38358,9 +38204,9 @@ s.R O75 *65 *61 O54 .4 $K -+3s9. ++3 s9. *B5 O76 -C]p5 +C ] p5 ^s Z1 O43 -1 skv sCZ @@ -38372,60 +38218,59 @@ i5a i1b O23 $l ^1 O0A +3 +8 -6 -o8/s%Ri5a -$a*AB +o8/ s%R i5a +$a *AB o5g *53 i2V K swz -*81C$a +*81 C $a q O89 -o1t-4 +o1t -4 ,A O72 c i7u i3c i1d ^B *57 $- *57 c $0 ^9 -s^nlo3x +s^n l o3x Y3 q O7B $O *25 c $t $y -o9fsz4 +o9f sz4 f O5A T0 sl4 -l [ ^p i9F *51 Z3 O23 $3 +2 -o9$$= -o9B}s1W +o9$ $= +o9B } s1W shS [ s60 *75 -Kz2 +K z2 i35 i59 -$_$) +$_ $) O51 o4N *26 *37 ] $F *35 K ^h O62 O91 o3H -oAc*37iA} +oAc *37 iA} O23 O17 soe -$o*2Bsj& +$o *2B sj& i33 i13 i7f i3f sn+ -s"esyk*18 +s"e syk *18 D1 R0 O64 $g -[i7D +[ i7D *46 o2d +5 c T1 O27 $t -uo0M -o32*49 +u o0M +o32 *49 D1 $U *21 -sKfsSM +sKf sSM +5 sib { *12 i3i i4n i5e @@ -38440,57 +38285,57 @@ i52 i60 i72 i87 +5 z1 o3_ c i8e i9r -T7^Ksix -skay3 +T7 ^K six +ska y3 +5 +0 ^r -sJR$y +sJR $y snb -0 *42 i5n l $6 Z5 -i7S,AT1 +i7S ,A T1 *95 O71 O02 +8 Y2 DB .1 } i53 i5c +7 -8 -0 -+1K -i78s,| ++1 K +i78 s,| ,8 $_ O84 -R7d*5B -*73sCSscu +R7 d *5B +*73 sCS scu i53 i3e $. $b $e ss& r O1B -p2sQN*29 +p2 sQN *29 O97 ^1 c -s28se(*BA -tKs%K -TAs`"f +s28 se( *BA +t K s%K +TA s`" f O05 i35 O64 *69 d i2o sDq .4 O58 -$nsWl +$n sWl O23 O17 '9 ^k i7e i3b i1l i2e E O23 -5 $j -*B3s%M$0 +*B3 s%M $0 } O59 +4 -2 +9 Y1 O68 $3 o58 -sZ0snf$% +sZ0 snf $% O63 $i p3 i60 D0 D7 t $9 iB" y5 O07 *23 +2 -.2i9( -*B0$B +.2 i9( +*B0 $B 'A O23 ^t ^u ^o r o41 @@ -38504,8 +38349,8 @@ O61 i8k { O83 -4 L4 o69 i0m -^DR8sun -o01-4 +^D R8 sun +o01 -4 c $5 $* c ^- $1 z1 $z @@ -38513,24 +38358,24 @@ z1 $z O87 } O63 o0A +B +E -$*T9 -*A3*62i9' +$* T9 +*A3 *62 i9' *14 O12 -T4skY -^1K*89 +T4 skY +^1 K *89 o6R -s 2$t*91 +s 2 $t *91 .2 -8 ,7 T5 +4 +A +4 -R9'A,2 +R9 'A ,2 sVD O24 -3 ^o slt -s>I*08$? -o94i3l +s>I *08 $? +o94 i3l Z1 i8v -^NsCU +^N sCU ^E -1 +4 +5 -8 i6r i7e i81 @@ -38546,10 +38391,10 @@ i1a i35 O17 ^m i91 iA0 iB1 T8 TA T9 TB -i31i49i56i67 +i31 i49 i56 i67 *23 i2- } O49 *78 -Z2-7*52 +Z2 -7 *52 sgY s"{ O06 i47 i53 @@ -38561,36 +38406,36 @@ i83 i94 O02 ^' T3 D7 *45 -4 $1 -s3f*BA +s3f *BA ^C '9 *45 T6 i5o i6t O52 } -0 *39 -srL*7AK +srL *7A K O02 $q $1 *41 O63 o0x o8X i4a i5s i6s -*98$W +*98 $W ssx c Z1 *01 O21 $. $h $n -z2 E O73 +z2 O73 E i2l i3l i4a y3 i9@ O7A O82 t -s3$.3o4e +s3$ .3 o4e -7 i6_ c -.9o7SoA5 -*45s") -*12p2 +.9 o7S oA5 +*45 s") +*12 p2 Y3 *A8 sze i4b i5e i4u i5n -+1Z1 ++1 Z1 O13 C O96 D1 Y5 C O42 *05 @@ -38602,24 +38447,23 @@ i6u i7s *40 O42 O61 +3 z1 +2 i2k i3e -$_$= +$_ $= Z2 -8 -*02*8A +*02 *8A o0t u *54 *37 L4 +4 O92 -*84$K +*84 $K Z2 *53 c +3 -8 -4 t T4 Z1 o4a -3 -B $8 $/ -z2 O73 E -o6SZ1.A +o6S Z1 .A $* -3 spr -R7skjK +R7 skj K Z4 T5 O23 spj ] Z1 u @@ -38633,7 +38477,7 @@ o0n o62 *15 +0 *67 r o4G -*41+7 +*41 +7 i61 i3o $q O02 i2v i3a @@ -38649,14 +38493,14 @@ o7u O04 ^p i2S [ o6l *60 ^ ^8 -.9*76i2h +.9 *76 i2h sl_ O42 -8 i5e i6r i7s i9o iAn i80 i97 $C p3 -,A*18 +,A *18 s2q OA5 s&u c seu p2 p2 @@ -38691,13 +38535,13 @@ i9$ Z4 O02 $h r ^0 } -o72y5*83 +o72 y5 z1 $l Y1 o0I $9 ^D srm E i2i i3k -oB'o7bi6# +oB' o7b i6# i17 i3d o2q i3i ] ] $q @@ -38706,9 +38550,8 @@ i8m i9a iAn i7e i12 z1 o2y i8k i9a -i5O *52 E z2 T3 -*81o2i +*81 o2i i50 i60 i79 D3 DB O07 +1 $h @@ -38740,7 +38583,7 @@ D8 s0a i5k i6a i8Z iB3 O02 -,2y5 +,2 y5 *25 ssv i1u i2b ^z -6 @@ -38748,9 +38591,9 @@ i8M O53 i82 O32 o6s sdy y2 T8 -sczo1N +scz o1N O51 T3 -Z1sKb^C +Z1 sKb ^C i3i i4d i5v i6e i8s i9a @@ -38758,11 +38601,11 @@ $0 O57 O5A i1N $4 $* i3i i4m -$?*65o4_ +$? *65 o4_ i41 i52 i63 i74 i85 O42 i4o snb o0L -o8[^D +o8[ ^D o4| i0k i1a i2m ^0 *20 @@ -38787,7 +38630,7 @@ iAu O46 i5s i62 i7e i8r i9s -0 $e --A*A7$Y +-A *A7 $Y O31 $m z1 ^R i5d i6i @@ -38797,18 +38640,17 @@ i5d i6i -5 c T0 O84 *35 D6 -,5$N +,5 $N '6 ^m q i5s D3 o71 i1n i2a -7 $b -s!s*1Bst2 +s!s *1B st2 z5 O36 i61 Y1 $u i5- i1a i2r i3t -D4 $y [ sBO i1d i79 ^2 ^F @@ -38816,10 +38658,10 @@ i0h i1a i2m D8 ^k +B -3 ^y +7 -'Ao4* -s,3.A +'A o4* +s,3 .A oBP Y1 OA5 -]*A2spc +] *A2 spc i6E k .2 K +2 +8 -3 @@ -38833,7 +38675,7 @@ p3 .0 OA3 i0k ^d ^a ^e ^l ] Z1 o5y -s|9+2R7 +s|9 +2 R7 i3a i4s Y2 ,3 i2d i3a @@ -38852,7 +38694,7 @@ O53 Z2 i6l i7a i81 O13 o4K l O54 $y -sn,*54 +sn, *54 O65 $c l ^i ^n ^m ^o iA< @@ -38862,18 +38704,17 @@ O82 -1 Z2 O93 -A $w -4 sgl -y1 E OA1 -o0.-B,0 +o0. -B O15 +2 scD +7 $2 $0 $1 $2 $! -i12s8( +i12 s8( Z1 i7r O42 i4= sk@ i7x i81 -DAld -oA1Y1 +DA l d +oA1 Y1 i89 i99 i7l i8a i9n oBK @@ -38892,7 +38733,7 @@ OA6 O1A i4c i5e s-/ c T5 i5_ -$($? +$( $? oB7 l +5 $4 D4 D2 { @@ -38902,23 +38743,23 @@ i4s i5a $0 O32 *03 ^z O94 o9g -k-7^n +k -7 ^n $A Z1 r $x *78 ] Z2 o5- r D2 i1a i2m i3a -i4zDAZ2 +i4z DA Z2 ssv +4 +4 -1 i6- o3- R3 o47 --6y4 -$r^0 +-6 y4 +$r ^0 z4 O73 -o08s4B +o08 s4B *67 i65 -*4ArT1 +*4A r T1 $x $a ^4 O23 O63 o3z @@ -38931,9 +38772,9 @@ o6b $m $/ $7 i7w O25 O51 c o38 -$O,9 +$O ,9 *53 $a -o3IoAT +o3I oAT T2 TA sl' $w +4 @@ -38950,12 +38791,12 @@ O41 $h [ sn' $r -1 $r -A -*19i9E +*19 i9E -A O35 D0 *01 } $! D9 s^= O04 *25 -k+7^J +k +7 ^J ^0 O12 i7c i3a s5@ @@ -38978,23 +38819,22 @@ i58 R4 Z1 sua o1a O63 D2 $t -$a*73sb' +$a *73 sb' *24 src *42 O46 -O41 [ $h *25 *93 i3t i4u $2 $U OB3 *B8 *31 -o7_z5DB -*61svI*84 +o7_ z5 DB +*61 svI *84 i77 R0 L0 i8a i9r *76 ] sK2 O35 iBr -*07r +*07 r i51 i30 -DB,3 +DB ,3 i1a i17 D1 D2 ^I D8 $! @@ -39005,27 +38845,27 @@ i5h i6e +0 OA1 i14 i59 DB O15 y1 -ui8# +u i8# i5d i31 O43 $4 i2c i3h i4e i31 i77 i74 i3b O68 s/a -s`z*73 +s`z *73 *35 ^h -$-$( +$- $( '6 i4g ^_ ^7 i5a i39 -s[zo8U -*14*57t -s]CY5{ +s[z o8U +*14 *57 t +s]C Y5 { K i0x z1 ^L z1 i33 i5e i77 i3d -i21i39i46i56 +i21 i39 i46 i56 i2f i3a i3e i4s i5t i3s i4s @@ -39037,24 +38877,24 @@ o8o O12 i65 i79 ^y $y i2g i3a -*81.A +*81 .A *25 ^a i2g i3h i3z *62 o4N O13 -$vsI6 +$v sI6 ^e ,6 $R O23 -to4S +t o4S i34 i59 i5c i58 O92 T3 i55 r -]s}/*61 +] s}/ *61 i33 i1a i37 i3d -$=$/ -R7Y1 +$= $/ +R7 Y1 ^c $2 *34 sas O6A i0p i1o i2r @@ -39062,56 +38902,56 @@ $R p3 sod i3s i4h z1 o3_ -^6D9 -s$1shW +^6 D9 +s$1 shW i3s i4a c O01 Z3 $# +0 i68 i72 -Z4s zZ5 +Z4 s z Z5 OB9 .A i6w i7e i8r i02 ^l i5m -0 i2a i3s sUK O06 sw. -*8A-0 +*8A -0 i0h i1e i2l OB3 sgU *46 *60 i2d O45 *43 sf1 O9A -KsYNo9C +K sYN o9C s._ -s07^5sS' -^ho0.*94 +s07 ^5 sS' +^h o0. *94 ^T O1B sCJ -.6f +.6 f i0b i1u ^B i1R z1 O83 $N k -o6}s1- +o6} s1- i4h i5a -*14o1C*68 -*17Eo9R -^-s1#'5 -kiA8q +*14 o1C *68 +*17 E o9R +^- s1# '5 +k iA8 q { *24 spA i84 ^1 O83 -s\Ii1H +s\I i1H smI -$]T8sL; -r+A +$] T8 sL; +r +A O42 i7P o7o i9= O86 } $o sqb -s5>i0n +s5> i0n +1 ^Y i53 i31 -i8F{sF4 +i8F { sF4 o6h '8 $x *54 D4 s.0 @@ -39123,15 +38963,15 @@ $2 *78 sHK $. *40 O14 [ i1e l -Z2,8sMs -s$%o3's a +Z2 ,8 sMs +s$% o3' s a *65 o2t *24 -Ki9Asu0 -+8Ky2 +K i9A su0 ++8 K y2 } o7\ c $3 $* i55 i5d -s=[i7NsM| +s=[ i7N sM| i4a i5n i6a i7c i74 i12 i1a @@ -39141,8 +38981,8 @@ o4u *21 i2k i3o Y3 r +A K -s7M+1*52 -sSBs;4 +s7M +1 *52 +sSB s;4 c $ $0 o5d '9 O83 i14 RB @@ -39150,21 +38990,21 @@ i3a R1 L1 l ^t ^a ^o ^b T1 +6 d i3s -s@=C -.0*9A +s@= C +.0 *9A r Z3 K *62 -$+$. +$+ $. k ssy -soBssU +soB ssU smc c $6 $7 $! --As Ss.1 +-A s S s.1 O03 f ] i5c i54 ^g *65 -sqds#.sI4 -Z5sJ)p4 +sqd s#. sI4 +Z5 sJ) p4 c TA O73 i38 i12 i54 @@ -39180,7 +39020,7 @@ T0 T9 T2 R4 *45 R4 ,4 O72 O81 +2 -sHKTB +sHK TB +7 $b i9? i1v i2a @@ -39191,19 +39031,18 @@ c d '7 $0 i3e i50 i5b i58 c d '7 $5 -*0Ay2c +*0A y2 c c i89 o52 l q OA8 -s3E*18oAX -D0p1s>V +s3E *18 oAX +D0 p1 s>V so? $6 $e o5] l d '9 $1 i7a i53 -] ^x -sCS*B7 +sCS *B7 i1h i2a c ^d ^4 c ^d ^8 @@ -39216,15 +39055,15 @@ OA2 $6 O41 O4A i8v T8 O31 O18 o2Y O3A -*4A^d +*4A ^d siN l i1; O82 $I K -s5(T7*93 -s_3o9n +s5( T7 *93 +s_3 o9n iBy i42 i50 i62 i77 -p5$E +p5 $E t +7 $d sMH t -6 u @@ -39239,19 +39078,19 @@ c $2 $5 $! o6# O51 c ^b ^5 *4A i8b O78 -iBksJp -R6-6 +iBk sJp +R6 -6 c -6 o3^ O28 ^( *69 O34 'D $7 -iAu,1+B +iAu ,1 +B ^r ^x O52 T0 $@ i1l i2l i3a R0 L0 -^Ds@` +^D s@` $c $w d 'C $9 O03 D7 @@ -39266,28 +39105,28 @@ $g *5B O65 r ] K o2l -8 $6 ^H -$*$@ +$* $@ *69 O35 O32 ^Y O59 O27 O74 O45 z2 O32 -*B8s0e*74 +*B8 s0e *74 O63 sV* i18 i1l i2u szW -*84T9 +*84 T9 s0U sif -oAzsg} -o0Fsu+ -s2**60 +oAz sg} +o0F su+ +s2* *60 i1d i3b i22 i36 -+2*1B ++2 *1B +A $o O12 -iBj$] +iBj $] } ^3 c O85 ] -z2sg= +z2 sg= *45 $1 -4 i33 i56 i1e i52 @@ -39300,11 +39139,10 @@ O8A *07 O38 ^I o49 $0 *23 $? Z2 -,5*15*23 -l [ ^v +,5 *15 *23 O82 $6 *16 L7 -o1i*27*B0 +o1i *27 *B0 i25 i32 i0m i2d i1a s(' i1b @@ -39316,24 +39154,24 @@ i3c i79 O14 O87 y1 l ] $U i52 i3f -s26T5y1 -^n-A +s26 T5 y1 +^n -A O49 O47 T6 O12 -o02s3O] +o02 s3O ] D4 r -{R6i92 -*02$8 +{ R6 i92 +*02 $8 i5e i34 O45 *50 i6h i71 i36 i3e i18 i36 -+9*A0 ++9 *A0 s1M *20 ^r Y5 Y4 O18 -$.$# +$. $# i3e i31 ^Y O12 O53 oAJ $0 @@ -39341,39 +39179,39 @@ i32 T4 ^8 *43 *A5 D6 $j i2i i3m -*6Bo21 +*6B o21 '7 $U -*6BT5 +*6B T5 ^m -7 l ] $u -o3Fsh6 +o3F sh6 i2n i3s i11 i7e -$\o7P +$\ o7P ^z +1 *60 O35 $r *21 -Z4s.E +Z4 s.E i92 iA1 oAR O15 O7B -Z3*B7 +Z3 *B7 i8P -s;5o43 -lp4 +s;5 o43 +l p4 d O64 -Y2^V +Y2 ^V i57 i1a O03 skK E O4B [ -+8d ++8 d c $% $1 i1o i2d -R6LB -y5sRBRA -o4KsRN -oBwR0 +R6 LB +y5 sRB RA +o4K sRN +oBw R0 ^j O5A O81 -+7.0 ++7 .0 i4K O53 Y4 sw^ ^g D8 @@ -39383,7 +39221,7 @@ r i2r [ +6 ^a o6t -5 d 'P -$a*24 +$a *24 O59 Y5 i2m i3a i4r p4 O25 T9 @@ -39397,21 +39235,21 @@ r $z [ ^H ] i41 i59 i67 i70 T3 O3A O98 -sWOD9o5a +sWO D9 o5a i38 i57 $C -1 $0 O05 i1l i2i $. $c $h ^R O25 -D8T2 +D8 T2 so0 T2 c ^T ^S u snN z5 } l ^t ^a ^c -sO]$b*94 +sO] $b *94 Z1 OA7 +5 K C sfD @@ -39419,38 +39257,37 @@ z2 *34 i6g t +4 D3 i1l i78 i7d -cs+!*36 +c s+! *36 i3b i73 c $4 $u $s i66 i72 -9 i6- -]o9B +] o9B ,1 $D -i3tiA_s/C +i3t iA_ s/C Z2 $2 ^P Y2 } z3 i97 O2A Z3 s/= -tsa1i0S -*40]iA8 -D1 C +t sa1 i0S +*40 ] iA8 *10 ^9 O24 sa. Y4 O15 +5 C K -,4[*96 +,4 [ *96 O64 i8! O6B o4 O54 i31 i49 i57 i60 -sY!y3 +sY! y3 O72 k +5 -8 -6 O02 ^v -$^sx7+9 +$^ sx7 +9 sz8 ^y ^b ^b ^o ^b O92 $6 -ETBk +E TB k i23 i34 T2 T7 T8 i3b i75 @@ -39458,15 +39295,15 @@ i3b i75 D4 R3 *57 .6 *53 T3 O29 -i21i39i48i55 +i21 i39 i48 i55 D7 O32 Y3 -s#dLA +s#d LA sku +A +A -C $5 O12 k $h +0 *32 } -swko9C +swk o9C O03 R2 ^o '8 i1i i2z i3z @@ -39476,7 +39313,7 @@ k $v *14 i2v l i1b o7_ O12 -o2@o0q +o2@ o0q iAT k $_ $_ [ @@ -39484,7 +39321,7 @@ $T -4 C s29 i2i i3c O14 ^3 -o0QD9 +o0Q D9 +2 p1 O23 i0M i1A i2r OB9 k @@ -39503,7 +39340,7 @@ z1 -5 *31 i4c i5o +C +C -D +2 z1 -s03] +s03 ] *61 O61 +6 i1d *65 i87 i96 @@ -39515,8 +39352,8 @@ i62 i71 i82 RB *27 O13 O14 $3 O34 ^u -*96*37 -*89oB( +*96 *37 +*89 oB( +4 +4 +9 s12 oA0 O14 $k @@ -39536,16 +39373,16 @@ l ^i ^t ^n ^a *14 +3 i2w s 3 ^y OA6 i7d i5c -[i5+ +[ i5+ o0E *65 y1 ^P -*15i9giBQ +*15 i9g iBQ o4S O52 +0 -4 -2 O02 $1 Z2 +9 -4 -0 O46 o3s -*B6o75 +*B6 o75 i7s i84 $f $C *21 O36 q @@ -39553,10 +39390,10 @@ i0a o6c ^, c $7 $2 $! } ^k { -s+;$P +s+; $P i1c +2 i5k $2 -s@}*94 +s@} *94 o14 p1 ^e ^d ^i ^s ^A O63 @@ -39577,23 +39414,23 @@ O72 o74 -B -D -D i30 i52 u ^9 ^9 ^9 ^1 -$Ds&\ +$D s&\ K t *45 $3 $4 $@ $@ i1f } o38 O72 i5r i6i -z2K +z2 K T5 D1 $x $b sS% OA3 s2{ -$o*A6 +$o *A6 c $0 $0 $8 $! -2 'A O49 Y1 +3 i2n i3d i4i '8 O61 -ssJ^k*90 +ssJ ^k *90 T5 D3 O0A *35 } ,6 O23 @@ -39613,8 +39450,8 @@ T5 z2 } ^6 i4e i5a $p Z2 -Y1Y2oAs -o4qTA] +Y1 Y2 oAs +o4q TA ] O23 ^V O85 +2 iA1 ^! @@ -39637,11 +39474,11 @@ c $9 $9 $? $? ^N C O48 O96 o9B snY y3 } -i31i49i56i62 +i31 i49 i56 i62 i7d i16 i7f i19 sn} -f*03.5 +f *03 .5 i31 i13 i2z i3z i5a i15 @@ -39652,9 +39489,9 @@ u d $9 [ O95 u s#i o8/ O59 O39 -sS7y5 +sS7 y5 $k D5 -iAZRB +iAZ RB D7 Z3 i48 i51 *73 o59 @@ -39677,11 +39514,11 @@ Z1 i81 ^V $8 *50 O56 *78 s71 -o3OC +o3O C D9 [ D5 -3 -L3*AB --5o14Z1 +L3 *AB +-5 o14 Z1 O94 O32 c ^a ^D i1o i2u @@ -39694,7 +39531,7 @@ i3d i50 } o7u i3d i51 -1 $v -*3AoB1 +*3A oB1 O6B *83 O7B K ser i1i i2v @@ -39704,7 +39541,7 @@ i1i i2v i7r { O5A p1 *46 Z1 -p4'9sGO +p4 '9 sGO O06 r smZ ssL @@ -39716,11 +39553,10 @@ $c $o $o $l +7 i6y i6t i7e i8r -3 smu -$=sF< -sb5o2W +$= sF< +sb5 o2W $f +1 -$i[ -o5;sHL +o5; sHL i7a i13 *12 O2B *3A l $1 $9 $9 $3 @@ -39728,25 +39564,25 @@ l $1 $9 $9 $3 -0 -9 -6 l $4 $4 $4 +6 -9 +7 -i6p-9 +i6p -9 O53 l *70 y3 -6 $p $a $n $d $a $1 $9 $9 $0 $# -4 u -$>p5 +$> p5 +2 sQA O0A $U o8s i2} i4n i5g i1b i5b i39 i3f -iAjT4 +iAj T4 ^* ] O13 d i4n i5e O41 [ $w -LBo2FsFC +LB o2F sFC $q O43 i7f i71 OA2 s0B ,9 @@ -39762,17 +39598,17 @@ o40 *32 r ] *45 *04 $p Z1 +0 +6 +3 -C*42 -s9jY2K +C *42 +s9j Y2 K o4 t $9 o84 c ^A ^A -+9$>,8 -csQ/*23 ++9 $> ,8 +c sQ/ *23 l '7 $1 $1 $9 $9 $0 $+ --9Z1*34 -*13*87 +-9 Z1 *34 +*13 *87 i4k i5a '8 o1w [ O71 o5k @@ -39780,16 +39616,16 @@ $E [ c +6 $j -2 ^s } t o5d D0 -p4s!a +p4 s!a c $3 $3 $* $* -$<$+ +$< $+ { *45 -s[sy5 +s[s y5 *17 *73 s7D -*81.2 +*81 .2 i1b i5a -,3i0` +,3 i0` i2c i3e T1 [ z3 O63 *42 @@ -39797,10 +39633,10 @@ D2 i3h $p -4 i7k i8i -8 ,4 -lY3^k -ry4*2A +l Y3 ^k +r y4 *2A o67 Z2 -*69-1Z5 +*69 -1 Z5 $w o4N T6 i31 i11 O35 p1 @@ -39811,53 +39647,53 @@ i1y +7 .3 O82 OB9 i5h i6o -0 sgc -Y3*85 +Y3 *85 c o5@ D4 $u o8] -'Bo7-scB +'B o7- scB -0 $c l i94 $m ^k O21 y4 O43 sBZ i12 i1e -^6*95 +^6 *95 i4a i5l i6l -sIH*28*31 -to64 +sIH *28 *31 +t o64 so0 se3 si! skb $l $i $k $e -s?Xi52o79 -^ms&\ +s?X i52 o79 +^m s&\ R9 s/c O37 c $7 $6 $! ] o56 Z1 O95 srz i3j l -$-$! +$- $! +5 +7 -8 -]*30+9 -D4{ -$c.B +] *30 +9 +D4 { +$c .B seO u *41 +1 O1A ^a ^i ^d -9 -D -KsP_Z5 +K sP_ Z5 O83 'A i5a i13 } soi s6C -sqGoB\^D +sqG oB\ ^D i27 $a +1 c o2y O31 o0Y OA8 o9y OA2 i7c O72 +1 -Z5'8 +Z5 '8 $3 *12 Y2 $Y O71 O25 f @@ -39865,7 +39701,7 @@ O25 f O2A -5 L3 [ [ [ c [ i5a i38 -+1*B7 ++1 *B7 t $6 O18 sn5 -2 *63 @@ -39883,8 +39719,8 @@ i38 i5a '6 i4p i7b i73 *83 K -$%$( -$%$) +$% $( +$% $) i65 i75 l ^5 ^9 ^9 ^1 O71 '8 $g @@ -39901,21 +39737,21 @@ D5 o5N O71 o5o o2r *04 *07 s7# -s20'B +s20 'B O47 q i1a i2v i3i c $5 $4 $! c $2 $2 $# $# *62 O43 D4 i7b i70 -$Vo9' +$V o9' o79 -6 O15 $5 l O75 i2f o5% O18 Z1 -0 -0 -^_D7 -Y5'8iBn +^_ D7 +Y5 '8 *62 l +6 -2 -4 E oA3 @@ -39925,17 +39761,17 @@ $6 $6 $@ $@ i3e R7 L7 i5f i51 O14 { -*4Bi7` -'Ao8C -t'7 +*4B i7` +'A o8C +t '7 c $9 $6 $! $! -T2o9Q +T2 o9Q i6a i7r i8i $y ^i +A -0 -0 D7 l OA3 -i7#qs}m -s4lk*62 +i7# q s}m +s4l k *62 O69 c o2k i3c i33 i5c i31 @@ -39959,8 +39795,8 @@ $6 $6 $! $! o6' $2 O57 i12 i3a O46 sx@ D2 -,3'5^6 -y3s9V +,3 '5 ^6 +y3 s9V ] O3A [ t ,9 OB1 i1o i2n i3i @@ -39968,11 +39804,11 @@ i1o i2n i3i i13 i51 { s1h ^. ^7 -*13*46s5i +*13 *46 s5i Y2 O71 $Y -o9Fs0_ +o9F s0_ $T o13 -slY^@ +slY ^@ i1c i12 i6n i7t *18 D8 @@ -39983,7 +39819,7 @@ O68 *34 u O24 D3 *13 i6n i7d O51 K -u*76oB{ +u *76 oB{ s-( O89 T3 +0 $C c $2 $2 $4 $1 @@ -39992,19 +39828,19 @@ i1i i2n i3k Z4 O6A ,6 $8 *68 OA9 k sNy -sDx$n -*02L2 +sDx $n +*02 L2 '8 i02 $2 i2a p2 -2 i4i i5e i6s *73 D1 -*38] +*38 ] q O52 -C$f +C $f i75 i7b .1 *04 -oB$*0BC +oB$ *0B C i6r i7s O89 ,6 l i4d @@ -40012,12 +39848,12 @@ s1y [ o06 $v o0J T3 o2C -s%asUc$_ +s%a sUc $_ s06 +1 ^m O84 s^D O03 O81 -i9<-2'B -sLrs.z +i9< -2 'B +sLr s.z i7a i5f i76 R0 L0 -3 D2 u @@ -40027,39 +39863,39 @@ iBX i6r i7i Z5 O7B +6 -0 -4 -o6#iA& +o6# iA& i8e i9s *07 *3A O19 *94 O75 +4 -6 -9 *47 *36 -*97$u +*97 $u $j r si3 O03 i2o i3r o0e Z1 k i52 i60 i72 i88 s9B -^ZR8RA -+3E*BA +^Z R8 RA ++3 E *BA c $0 $8 $7 $0 i1q ] i2o i3p ,7 *53 O42 sdp i8< O83 -*91s[n +*91 s[n i6r i7d O64 $u i57 i31 i3a i7f -o3A*54 -D6-1 +o3A *54 +D6 -1 o4b [ ^N Y1 -1 i52 i19 s0? -p5y1 +p5 y1 ^_ ^z Y1 -7 o0^ z1 @@ -40070,19 +39906,19 @@ i75 R0 L0 T2 y1 p4 *35 O69 r -2 -i8_sZRs>J +i8_ sZR s>J c ^2 $8 i6o i7m -s9Li9_ +s9L i9_ i05 D3 p4 *32 $9 $6 $! $! y4 O46 s7y -ssZy2 +ssZ y2 i67 i72 o9e K -$=$& +$= $& } $n O37 T0 -0 *01 i11 @@ -40091,36 +39927,35 @@ r $R i67 i77 C O32 C $5 $0 $0 -sasC +sas C $b O56 -*90o2Y +*90 o2Y l '5 $5 s6g -$0sGk.4 +$0 sGk .4 o1^ $9 $3 $@ $@ $A O24 -i8}i7Q +i8} i7Q i2c i3h -,9sZ9 +,9 sZ9 c $b $a $l $l -O41 $w [ d O17 i2p i3e sby -saRD0 +saR D0 'B ^1 -.1] +.1 ] i5b i51 -^eiA' +^e iA' i1' *23 -s0Y-7$g +s0Y -7 $g o8B O02 -T8.9T4 +T8 .9 T4 Z4 OB2 *83 -*53*57RB +*53 *57 RB i5f i54 -}s#hi1d +} s#h i1d i12 i73 Z1 o5c i7e i11 @@ -40152,7 +39987,7 @@ O03 ^@ i3 D0 O8A o9z i68 i71 -s1F'BsX6 +s1F 'B sX6 $7 $# O82 +1 i5c i76 @@ -40160,15 +39995,15 @@ st@ O93 s8+ ,5 ] i5f i52 -$,$? +$, $? *18 O17 O34 ,B ,1 -*5A,0sho -$_$^ +*5A sho +$_ $^ D2 sgc i2b i3o -i9.s"j -*8AsLJ +i9. s"j +*8A sLJ s?4 O02 T0 *03 i7x *67 +4 @@ -40176,22 +40011,22 @@ s7A O84 *16 s!Q i3c i3b O13 *03 -iAeE} +iAe E } '5 Y4 i7a i55 { ^k i17 i1e T1 +4 -r*1Ak +r *1A k i2i [ +0 -7 *03 Z2 o9m i3c i7d E $R -*60ksL+ +*60 k sL+ ] O01 } k sir -2 -$?$* +$? $* ,B O15 s/9 i15 i56 skm -5 @@ -40204,15 +40039,15 @@ $1 $7 $! $! sh7 *20 } i82 i98 -szao9vl +sza o9v l i39 i50 -T4p2 +T4 p2 c $8 $7 $! $! O65 $k ^o -6 O12 Y4 o3K u -y3slIsrJ +y3 slI srJ D7 $D $1 $6 $* $* l $2 $1 $2 @@ -40230,11 +40065,11 @@ i41 i59 i66 i71 i41 i59 i66 i76 c $9 $5 $@ $@ i21 i39 i46 i57 -s3g*3B +s3g *3B O89 y4 D9 $* D7 *62 D4 O43 -s2G*19 +s2G *19 Y3 Z5 O69 O7A O72 i51 i1b @@ -40243,10 +40078,10 @@ $1 $5 $@ $@ $i +6 l c $3 $7 $! i1a i2m i3p -o3e*68*40 +o3e *68 *40 i7i i8l s3P -.2-2 +.2 -2 $3 $4 $! $! $e o0F C 'B $1 @@ -40257,16 +40092,16 @@ o1I T2 *71 O65 c $6 $6 $* $* $7 $7 $! $! --3s8h +-3 s8h c ^1 $@ l $a $b $l $e '8 o12 T1 o2? i41 i66 o59 o78 c $0 $9 $* $* -{koAY +{ k oAY i2g *30 -i1_sT_ +i1_ sT_ +1 ^2 i73 i7c O92 i8g @@ -40277,13 +40112,13 @@ i6n i7o i8v Z1 ^W l $0 $6 $0 $6 'C $8 -s6ot*01 -^Q*58 +s6o t *01 +^Q *58 i35 i3d o6f o8c $1 $8 $! $! Y5 { -sI]*27 +sI] *27 -6 ,7 D5 .4 sy$ @@ -40304,7 +40139,7 @@ $m O34 o0t $! s.- OB4 oAX *43 O75 -sL@z1 +sL@ z1 C *78 O71 o81 -5 *40 @@ -40314,9 +40149,9 @@ t *65 -7 $f $o $p i16 i31 $g r -*21p2s"V +*21 p2 s"V i71 R0 L0 -skos56 +sko s56 *52 O45 ^3 o16 o2V [ @@ -40325,9 +40160,9 @@ z4 O93 c ^c ^2 o72 o61 i1a i52 -spD,8i0n +spD ,8 i0n { ,8 -$ +Bsm? +$ +B sm? c ^d ^5 i5d i76 $9 *14 @@ -40336,15 +40171,15 @@ $2 $4 $$ $$ 'E $9 i15 i72 i15 i75 -*02,B +*02 ,B OB8 o1y oBN i4l i5o -*06[s\m -*A3Y2.5 +*06 [ s\m +*A3 Y2 .5 DA D9 O37 O21 .6 -*57i3t*A4 +*57 i3t *A4 c OB4 TA $2 $9 $! $! i2s i3t @@ -40357,13 +40192,13 @@ c ^e ^8 c ^e ^2 ,3 O37 -8 O16 -D8s3*^7 -i0wsK6+8 +D8 s3* ^7 +i0w sK6 +8 i5e R7 L7 i41 i59 i67 i75 $3 -9 T2 T9 -l-0s;7 +l -0 s;7 c $9 $9 $$ $$ i7d i3e c ^1 ^b @@ -40373,8 +40208,8 @@ $j $u $t $8 $7 $* $* '8 D4 +6 swK -T1oB8$x -sn@+3 +T1 oB8 $x +sn@ +3 sy[ $p $y $x $k O83 @@ -40382,7 +40217,7 @@ i6j i7u i8n s-$ O97 $Q smo -ssk$l*B0 +ssk $l *B0 Z1 i4e O71 i9> R5 Z2 @@ -40402,14 +40237,14 @@ o4t *73 O34 D2 *57 o2t o7b c ^a ^0 -Z3-A +Z3 -A i56 i30 sKY -i7"*2BZ1 +i7" *2B Z1 $4 $4 $! $! -i0c -o9u$E*48 -oBps_6 +s-j s*> c +o9u $E *48 +oBp s_6 T6 TC i30 i72 o0u O06 *97 @@ -40441,7 +40276,7 @@ i4~ *42 Y4 c ^0 ^c O51 O25 '6 -*84p1y3 +*84 p1 y3 D6 o0w O23 $t C $x ^x $x ^x @@ -40455,16 +40290,16 @@ i2s i3h i4i O45 l O65 k iAw O26 -$($^ -+8i2z[ -*73'8 +$( $^ ++8 i2z [ +*73 '8 iBP i3a i37 -s;xsJX +s;x sJX *2B O46 $8 o1u sh4 -*71$h +*71 $h i22 i30 i41 i52 i7e i78 *93 O72 @@ -40474,14 +40309,14 @@ i55 i3e O68 o8% u 'E ^E *26 -$%$! +$% $! l $1 $9 $8 $8 -D4Y2 +D4 Y2 sCQ i5o $k O13 o5e z1 l O62 -o5?.7 +o5? .7 srD O54 sn| *90 o09 *13 @@ -40489,10 +40324,10 @@ $9 $1 $* $* O3A *65 D9 $2 $6 $! $! C T3 -sRh*02 +sRh *02 *03 $r $5 $3 $5 $8 -*45o0I +*45 o0I $8 $8 $$ $$ sl7 so0 *12 O54 Y5 @@ -40507,7 +40342,7 @@ i0s i1i i2l O45 *23 c $1 $> O19 svu o5D -*29i7rl +*29 i7r l slz '6 r *65 O32 z1 $n @@ -40521,12 +40356,11 @@ i6g i7i i4s i5t i6o $2 $5 $@ $@ $u D8 -} D1 $* O45 .B i4p *57 *63 *20 O96 ^P OA6 -ET4 +E T4 l $0 $0 $7 d i5n *34 $c @@ -40536,11 +40370,11 @@ c $3 $4 $! $! *52 O05 Y2 *68 OA6 ,1 O34 -*79+9 +*79 +9 sCU [ [ [ $1 $2 $3 *53 *72 -o8qoAA +o8q oAA i1e i35 O53 -9 $1 $2 $# $# @@ -40548,7 +40382,7 @@ $0 $7 $! $! T4 o0n c $0 $0 $@ $@ $. $m $m -o0os?U.0 +o0o s?U .0 $1 $8 $* $* O41 *63 *6B $4 *86 @@ -40559,14 +40393,14 @@ i89 i97 o5d *87 i73 i5b O98 O8B -$-$? +$- $? ^D o4m O38 $6 $6 $1 $! $! o2n d O58 T7 *97 OA8 i3u i4r -*21{ +*21 { *B6 O63 +8 i1c i7e i0g i1a i2r @@ -40577,18 +40411,18 @@ $# ^1 i37 i12 $8 ^@ K i8l -*43z1 +*43 z1 [ i32 o23 *2B O94 $8 $4 $2 $1 -L4Y1 -sHPo5C -s?$*23t -.7s>'*A5 -s+y,2i7* +L4 Y1 +sHP o5C +s?$ *23 t +.7 s>' *A5 +s+y ,2 i7* i52 i39 *35 Z2 O32 -o67RB +o67 RB ^@ +1 O23 Y4 D3 E @@ -40605,7 +40439,7 @@ i3x OB3 k ssS i27 +1 $a $s $a $h $a $b -s;jz2s2L +s;j z2 s2L i1t i2o *64 +8 i5a *50 @@ -40613,23 +40447,22 @@ D3 $? O74 E i31 i76 [ i4* -l [ ^c i39 i52 -'5[y4 +'5 [ y4 c $7 $+ -2 *03 scu s!Y ,7 o1g -i8r^2r +i8r ^2 r i64 T7 o3e *13 -9 D1 $1 $2 $3 $& -sy(k +sy( k i4r i5s O01 sl. i31 i7d -D0o3 T7 +D0 o3 T7 L6 y5 O79 p1 *50 O25 i4m i5a i6s @@ -40651,15 +40484,15 @@ Z1 *21 i3i i4r y2 o6E z2 i1n -*1B$os#s +*1B $o s#s $7 $7 $* $* i79 i5d i1o i2u i3r o6J l r -i5;s>? -s|2i9%*26 +i5; s>? +s|2 i9% *26 i3w i4e i5r -Y2+5 +Y2 +5 s5U O82 o4E TA i1a i2v @@ -40681,7 +40514,7 @@ sz9 i32 i11 i59 i32 D5 +2 K -Y1D8s6\ +Y1 D8 s6\ O13 O78 s$^ c o7# $c [ *56 @@ -40712,40 +40545,40 @@ l 'C i32 i15 i5i i6d sWK -^#sHA +^# sHA y4 $s -*87*54 +*87 *54 o6z Y1 -*09+4p3 +*09 +4 p3 i6a i7p *06 o3m c $1 $2 $$ $$ i1a i2n i3g -*58*96*62 +*58 *96 *62 L0 ^w o2p *37 c o7r l -6 +3 k o4c -k o1P +[ i1P i78 i88 i98 Z2 +3 c i5e i6y i2t i3o i4r i3m i4i -$!$, -r*A8.6 +$! $, +r *A8 .6 { i8V OB2 l i7n i8e ^Z Y1 ^e ^k ^i ^l ^i i7n i8g --9{sks +-9 { sks i7Y i2r i3o i4n '7 .4 -s,_i4A +s,_ i4A -6 -C OB2 .9 Z1 p5 @@ -40753,21 +40586,21 @@ s5l p5 i3a i4s i5s *9A $3 i5y i6o -i8@RB*59 +i8@ RB *59 *46 D7 o71 Z2 k -2 s+c l $9 $1 $1 O01 i8i -*65*39 -,2iBG +*65 *39 +,2 iBG y4 O86 i9e iAn R1 O64 l s1a -o86*53o9F -z3*8A*83 +o86 *53 o9F +z3 *8A *83 sbS i6r i7s i81 ^Y O23 @@ -40785,11 +40618,11 @@ o8[ ^1 r *02 O81 o5y o93 O74 Z1 sw\ -LBo70 +LB o70 ^G z1 ^r O16 o2x i3n D5 -$ $_ +$ $_ i8i K o5f $z i5t i6e @@ -40803,12 +40636,11 @@ T5 K q .7 O79 i6e $. o5 +6 -svRi9@s=s +svR i9@ s=s D1 $o i3b i4y Z1 *31 i2e i3t -*32 Y1 E $6 $@ O73 -8 $z o7z @@ -40822,11 +40654,11 @@ s3n +1 } i3a i4n i5t $3 $3 $! -rY5] +r Y5 ] i3k i4i i5n '6 ^p i6p i7e -R8suis1d +R8 sui s1d o2u o3e slG sAZ +2 O41 @@ -40835,7 +40667,7 @@ OB4 ,9 O14 D3 i2l i3s O25 $S -+A*34 ++A *34 i8A OA5 o4V O52 ^i o2g @@ -40852,22 +40684,22 @@ C $e $1 shS shr D6 i3a i4r -i3d*18 -s8mspV +i3d *18 +s8m spV ,6 t sa3 o99 -A -0 $E i7e i34 $y O64 -s.9f +s.9 f ^N $i *58 O06 R0 R0 K ^y i33 i57 O54 z2 -iBf^8 +iBf ^8 $3 $3 $# $# s5w c $8 $8 $$ $$ @@ -40892,13 +40724,13 @@ O54 O21 *31 p5 ,5 Y5 c ^4 i71 i1f -^bsZ? +^b sZ? O54 $t $3 $? s0k -i8%t^b +s>% t ^b O74 o7S stl l Z3 O36 @@ -41211,7 +41043,7 @@ o0z t O15 t iA- -B i20 i31 -EL8c +E L8 c c $7 ^3 O46 O75 sbs ^j @@ -41231,7 +41063,7 @@ c $3 $D +1 -E z1 i4_ r ^% o0c -kls*K +k l s*K i4i i5a *A5 '8 i75 i3d @@ -41239,18 +41071,17 @@ i2t i3a i4l i0f o15 +1 +4 +8 $i $e $r -*A0[-8 +*A0 [ -8 D8 O15 o96 Z1 i31 i50 -$&$> +$& $> +B -A -C c $* $7 *71 D2 r i7h O03 D2 ^W +8 o4l -,1*37[ $/ O52 $@ T6 i1u i2f i3f @@ -41260,25 +41091,25 @@ $i $a $l sO+ Y4 O6B i1r i2a i3n -5 Z1 -*63,4 +*63 ,4 u [ T3 D6 $5 -$)$^ +$) $^ O67 s,A Y2 *43 q i50 l Y4 o1u -lsex +l sex } i40 -3 i76 i16 l O56 '6 sND -t*70 +t *70 i7r i8r o5r Z1 c d '7 $9 -i6vsq} -o8+c +i6v sq} +o8+ c c d '7 $3 sRe $H Z1 @@ -41290,13 +41121,13 @@ i1h i2r O84 Z1 i92 iA8 i1h i2i -i0Qi6!s=A +i0Q i6! s=A [ Z1 o2u o6W O03 O75 o2C o7z o8o { O21 c -{s;.iB# +{ s;. iB# -2 ,7 c d '9 $7 i36 i5a @@ -41306,11 +41137,11 @@ i5Q $6 O05 $2 $1 $2 $5 ^T i0P -oBSi8'i7r +oBS i8' i7r i9r iAe -o5VsVn +o5V sVn $1 ^2 -t,A +t ,A i2l i3i i4n i5n i6e i5l i6i i7n @@ -41320,7 +41151,7 @@ o72 Z2 i7r i8i i9o i3f i1d } o3y -+4o9" ++4 o9" soy t k T3 sfF T4 @@ -41328,7 +41159,7 @@ sfF T4 ^g ^n ^i ^r ,2 *65 i2e i3d -*92$&i9U +*92 $& i9U i59 i68 i79 iA' i5u *68 @@ -41341,7 +41172,7 @@ $! i85 s-+ y3 o5s $- D5 -o8P$Ct +o8P $C t o0t o1o i5r i6a *73 O69 @@ -41352,29 +41183,29 @@ f .9 i3m i4e i5n i6i i7n i8a .6 i8a -o2jk +o2j k *32 Z1 D5 $R sAi *08 O47 i38 i51 -s 'sjC +s ' sjC [ T9 i4w ] o1% -'AZ2*01 +'A Z2 *01 o1e $7 *27 O43 ^p -KiB5 +K iB5 o4^ Y3 O8A O01 O54 o0d i1o y1 'B -*28^6 -^#*28TA +*28 ^6 +^# *28 TA O34 l o0k -o4CsZO*45 +o4C sZO *45 L0 c k ^1 *32 *91 O35 @@ -41382,19 +41213,18 @@ L0 c k OAB o9> o5| i9( -s;oL9 -s0E-9 -*1A.2shQ +s;o L9 +s0E -9 +*1A .2 shQ *70 O56 K *83 T5 Y2 -*01$]t +*01 $] t o3d ^z s5e -1 *52 K T6 '9 --Bcy5 -$.[ +-B c y5 $7 $+ iAo O96 o9a O43 @@ -41415,7 +41245,7 @@ L0 ^f -0 -5 -6 O62 *03 *A5 *B7 '8 -i2So7v +i2S o7v l $f $o $r $m t o7K O14 i1H @@ -41423,7 +41253,7 @@ O14 i1H *21 o28 ^j c f O26 -KsQHi7u +K sQH i7u K *47 o6x Z1 *B5 O58 @@ -41431,17 +41261,17 @@ iAZ O26 Y1 l ^r ^a ^w c ^d ^2 i0F *23 -,7p2'7 +p2 '7 $O Z1 i7h -9 *76 $5 sfH -oA4D7 +oA4 D7 iAW O32 o20 c si! so0 i7d i19 -*A7s7v +*A7 s7v O52 Z1 $q sm. oA3 Z1 @@ -41451,9 +41281,9 @@ sRD i54 i5c R0 ^B o0m T4 -C*68 +C *68 i5s i6t i7a -*46T6 +*46 T6 i2l i3e i4r i54 i5d q '9 @@ -41461,13 +41291,13 @@ q '9 i3a i19 *12 *42 s4c -$!,6 +$! ,6 *04 O41 $n $i ^H -]*62 +] *62 i8k i9e [ { *35 -i0;sjU +i0; sjU O85 D8 $L O48 Z1 *27 ,7 @@ -41486,7 +41316,7 @@ O34 D6 smj *25 $0 O63 c sg9 -sK@*63 +sK@ *63 z1 O02 o1B Z1 $b Z1 s9_ @@ -41501,12 +41331,12 @@ O82 T5 ^$ ss$ smu o4 i4o -s%mrY2 +s%m r Y2 i2r i3i i4s ^N O63 o9h s\# O62 i1_ } -$tsbk +$t sbk i1o i2h O74 ^2 *AB -1 i5d @@ -41519,22 +41349,22 @@ $1 i2. $5 $0 $! O24 $. D4 Z2 D0 -s1 sRC +s1 sRC *57 O16 '8 o6u D3 o33 [ ^E D3 -]$0s?R +] $0 s?R c 'E $7 -$|$| +$| $| c ^e ^9 .5 D3 $G O12 -sGj*6B-A +sGj *6B -A O24 $8 ^8 iB` O46 i6a i7t i8e -D5*5Ay1 +D5 *5A y1 c ^e ^3 -6 L6 i1o i2y @@ -41543,48 +41373,48 @@ O84 *12 stg O12 $d +3 $M O12 -o8Fs\o +o8F s\o sC[ O4A i4* -,A*61 +,A *61 $v -5 +4 $0 O61 o09 -+1CR9 ++1 C R9 z1 '8 c ^a ^A *04 $n O41 *B0 '8 -^ysoE -Z3s=* +^y soE +Z3 s=* c $7 $2 $! s27 C c ^e ^f +4 $u *42 ^f O82 T2 -]sN4T6 +] sN4 T6 o52 $x [ q O2A i5d i50 -ly3] +l y3 ] $m -2 O61 o0H i5p i6o -R7K +R7 K *29 O32 i1^ T4 -6 o8K c -Y2sCe*19 +Y2 sCe *19 *80 O36 ^C ] *A4 O21 Y2 *24 -sH[s\MiAT +sH[ s\M iAT Y5 D0 Z5 O43 i55 i1a -sHgs5! +sHg s5! $4 i5r ,2 T7 i8a i91 @@ -41598,9 +41428,9 @@ i72 i1d i1d i7a O98 $# D9 D3 *56 k -]+4i8J -y5s"8 -D5Z4D5 +] +4 i8J +y5 s"8 +D5 Z4 D5 O1A $t f i6o i1c R2 L2 @@ -41608,47 +41438,47 @@ l i5t +0 O36 d $y +5 K i8u l -z3q +z3 q i0a i1n i2i src -1 r *23 $j -*57^@iAR +*57 ^@ iAR *21 +4 l OA4 $$ sPN +7 i8S $1 -0 p4 i4n i5i -*84s.g +*84 s.g syR c $a $m i0B *83 O2B i51 i7e i6n i7e i81 -^*iBh+8 +^* iBh +8 o1J Z2 c -*29i3S +*29 i3S sGM $6 $* c o27 *B1 O86 slL '8 i53 R4 -.8i8% -sB2*34 +.8 i8% +sB2 *34 oBC i35 i13 -*B9.7^m -Y5s>%^h +*B9 .7 ^m +Y5 s>% ^h $* O12 o3k o1c o8a $x -*84s(b +*84 s(b *56 'A O72 ^2 sy] $l +1 o85 *97 -T9*80Y2 +T9 *80 Y2 i56 i32 sY* O01 T6 O35 i33 @@ -41683,7 +41513,7 @@ i19 i79 +5 d O75 s'+ O43 o4B -[s3w +[ s3w +0 +2 +8 } o8! $3 *18 @@ -41691,17 +41521,17 @@ o7b +4 i1e i11 *60 $s $t u -sET$rsU- +sET $r sU- -9 o64 s7R *41 o82 ^g i4g -p1svj,B +p1 svj ,B Z2 O06 *B6 O62 *46 $v y3 p5 s9* --1[o3Z +-1 [ o3Z Z3 O6B sJ3 $e O62 c $# $6 @@ -41715,7 +41545,7 @@ O41 O3A s5G E *30 $z O8A O54 -slio96sH$ +sli o96 sH$ i3o u i3Q c $7 $/ @@ -41731,18 +41561,18 @@ $p O51 [ $a *26 ^8 $9 c o68 -sL3*46 -^x^X^x$x$X$xu +sL3 *46 +^x ^X ^x $x $X $x u i3p i4e i5r $l $z -o5Ss5c +o5S s5c $l ^b sf$ i1a i16 l Z5 O57 q O68 *29 O64 Y4 O38 -*10o1L +*10 o1L O18 s.N .2 C z1 i61 i71 i80 @@ -41750,13 +41580,13 @@ smj -3 $s O87 O73 ,A sgo *76 D4 -.4*61Z1 +.4 *61 Z1 +4 -6 -1 C d '7 ^@ z1 O15 $z $2 -s;5^ssiA -+4oB$seR +s;5 ^s siA ++4 oB$ seR .1 s56 $! $0 i30 i3f @@ -41770,17 +41600,16 @@ c R5 ] +2 O43 *67 'B -3 -*74K +*74 K $b *58 i4h i5a i6n O43 ,2 c ^$ $$ -*97-8i1i +*97 -8 i1i i37 i5a i52 T6 -,1 *15 E +7 ^e -$,$; +$, $; i3x O46 } slc i5d i32 @@ -41789,12 +41618,12 @@ D1 D3 D5 $m ^i c ^R K i4s -o1usf(,3 -T3DBT0 +o1u sf( ,3 +T3 DB T0 -3 ^2 sPJ -6 O84 -*79[ +*79 [ OB2 s}) i43 sLW O03 Z2 *74 @@ -41807,19 +41636,19 @@ s4y O98 O6B O16 ^a o9x D6 OB5 T7 -$,s9(*57 -sxr] +$, s9( *57 +sxr ] *63 o1l -9 *01 O13 c +4 O03 *50 *12 -R6T7sl@ +R6 T7 sl@ +1 z2 ^8 O62 o92 O21 c ^3 ^6 ^9 ^1 i4N u -Z2*A4u +Z2 *A4 u p5 i5. i3b i4e i5r p2 -A @@ -41827,7 +41656,7 @@ O83 s$j i7K ^e .2 p5 O41 $H $* OB7 +2 -o08iB| +o08 iB| o1h o2e c o5- O06 c @@ -41836,10 +41665,10 @@ o8# D7 p3 -4 t *02 ^0 K O54 -^^sS( +^^ sS( i3t i4a c T7 so0 -L9]Z5 +L9 ] Z5 si1 T3 *05 K i5d i12 @@ -41856,7 +41685,7 @@ o0W t O43 C O08 z2 $c T0 s-M --4*B4*AB +-4 *B4 *AB O7B *12 [ *70 p2 OA3 @@ -41866,7 +41695,7 @@ i79 i7c i7i i8c i0c i1l i2a c $5 $+ -+0R2E ++0 R2 E $x $t [ O71 O05 O13 $. @@ -41897,10 +41726,10 @@ i5b i54 $p *64 c ^4 ^c i7t i8i -$#$) -sS%$wswa +$# $) +sS% $w swa d 'C $5 -*75se0 +*75 se0 t DA O29 O72 *13 O1B l s^d @@ -41910,7 +41739,7 @@ O73 ^i d 'C $3 d 'C $2 szc *87 OB1 -sZAiAh +sZA iAh .0 *61 i59 i1a i1m *45 @@ -41937,7 +41766,7 @@ i2r i3g i4e '7 -3 t *78 i3g -1 -,3.6 +,3 .6 i6G Z2 i37 i76 iB% c O94 @@ -41945,10 +41774,10 @@ O28 o5D Z5 ^y Z1 [ *A9 O1A z3 -s?x^. +s?x ^. R9 $0 -i21i39i48i52 -sFq{s-6 +i21 i39 i48 i52 +sFq { s-6 sSL i6l i7d i7a i3b @@ -41964,9 +41793,9 @@ i32 i3c D6 *36 O41 *B7 o4O c si1 T5 -T7z1 -sh!Y1Y3 -*01 [ i6v +T7 z1 +sh! Y1 Y3 +i7v D1 Y1 OB8 sMC D3 t i1o i2o i3l @@ -41974,9 +41803,9 @@ sNM r O5A O01 *67 ,2 i76 i7d u $1 $9 $8 $3 -*5Bo8U +*5B o8U p2 O83 -iB@,Bl +iB@ ,B l p1 OA9 O7A i7D O59 o6a ss! p3 @@ -41995,7 +41824,7 @@ t o0V i6{ O62 c $3 $1 $! s1q O91 -i8 *7B +i8 *7B ^F *13 l ^y ^l ^o ^p i7m i8i @@ -42012,15 +41841,15 @@ syF o47 } *56 s40 $/ $p -$%$@ +$% $@ seV i5O *42 K k -$\$\ +$\ $\ K O48 sGE i7o i8v -Y5ssY +Y5 ssY p1 $n O57 ,7 -9 $! @@ -42028,19 +41857,19 @@ O57 *02 d i7i i8o z1 o3m i0b i1r i2a -Z2s0M{ +Z2 s0M { L4 u O98 .B -D1Kk +D1 K k k -2 sir O07 i1_ -$=$$ +$= $$ O41 o7i -sG9*B1Y2 +sG9 *B1 Y2 i7l i8i -$E'9 +$E '9 ] -3 -^2siR +^2 siR o0b i4o i3c i4h ^( O06 z1 @@ -42050,18 +41879,18 @@ siq k Z1 O24 i7d i1e C '8 $6 -,5+A*63 +,5 +A *63 o7a OB5 -$($# +$( $# i8% i2n O52 O64 q ^B O04 z3 *78 OA2 -]*84 +] *84 t s"( O31 -Z3Z5 -$RT2 +Z3 Z5 +$R T2 sI0 p4 i44 ^l $1 @@ -42071,7 +41900,7 @@ i3u i4k y5 p2 O19 Z1 O54 i5d i58 -*27up3 +*27 u p3 O37 -0 T0 t T6 D8 k @@ -42083,10 +41912,10 @@ O73 o64 f O87 -7 -1 K *52 +7 -8 -5 -ssd]s1r -sS>so6 +ssd ] s1r +sS> so6 O7B ^S *25 -i75} +i75 } o0h ^s i3b i3c i65 o87 @@ -42094,39 +41923,39 @@ i4- *30 O31 sar [ $6 ^@ i54 i3d -s8T*09 +s8T *09 o9" i51 R8 L8 $0 O57 -+BK^w ++B K ^w O37 *59 p2 *A9 O52 O15 y4 i5a i6s i7s -p2sX-] +p2 sX- ] O02 o56 *40 o7y -sP'*81*7A +sP' *81 *7A sJO O03 Y5 i1u OA1 -s<*[p1 +s<* [ p1 O1B s{y z4 -s}ts.g$g +s}t s.g $g s1a O0A z1 Z3 ssx $J O63 i2h i3o O8A O31 -sY\sHi*89 +sY\ sHi *89 s<6 O17 O35 ^B O86 O82 i6n i7g -sWxR6 -.3^O+A -^1s"{*0B +sWx R6 +.3 ^O +A +^1 s"{ *0B sjm t *29 O13 o29 l @@ -42137,50 +41966,50 @@ s_# OA1 T9 T7 +0 $V O73 *B0 sSf -$isw; +$i sw; i9+ O62 sD@ sE( ^6 z5 -sK6s0f*6A -*79o9r +sK6 s0f *6A +*79 o9r ^l *56 i1i i2n i3o i19 i1a ^@ o70 -z3s2HL7 +z3 s2H L7 i76 i7c -i5Uo0c +i5U o0c C o1C $! ^2 O63 *52 r -sr;i7&+A +sr; i7& +A *54 +6 k p2 k O31 $y *15 *73 -TA[z2 -qiBv*53 -s;To5@ -y2o0Ysl/ +TA [ z2 +q iBv *53 +s;T o5@ +y2 o0Y sl/ O84 -8 Y1 ,7 st8 squ K z2 O23 ^p -7 -*B0i5Bo8O +*B0 i5B o8O Y4 p3 O4B -D2RBsd8 +D2 RB sd8 skb K *5A O06 K p2 -R2sX{i3c +R2 sX{ i3c i60 i78 szy $5 ^@ -*19sbS*14 -sNK^b -[i7a +*19 sbS *14 +sNK ^b +[ i7a i10 i36 i8g i9a O23 -1 y2 @@ -42190,45 +42019,44 @@ i50 i5c sdj i9E c z1 o6C -l [ ^k s-2 s8r E s1W *38 O23 .4 c $0 $# sem -2 -D9*08o9& +D9 *08 o9& i1a i2y i3a D6 } -Esb6Y2 -'8o7% +E sb6 Y2 +'8 o7% O21 O19 +8 *63 -i3zi9M +i3z i9M ^U O06 d o8b Z1 o2w ^n d o5n -oA,sEho6Y +oA, sEh o6Y sQA [ i8g i2o i3n [ O72 *42 k K t *04 k -.5D4 +.5 D4 i1a R5 -*76p1E +*76 p1 E o1@ -8 +3 Z1 -*A2+4 +*A2 +4 c '6 ^E D8 O76 i0Y OA5 *BA -*A5$9 -rT5 +*A5 $9 +r T5 i8g i9o -$2$0$3$2 +$2 $0 $3 $2 si1 ss$ O75 i63 T8 TA @@ -42251,18 +42079,18 @@ O23 ^W i55 i35 i1a i2s i77 i87 i97 -^$iBF +^$ iBF O31 s-F o0g Z2 -sZvi4S +sZv i4S Z1 D7 -iAGo7j +iAG o7j $_ $5 $4 $5 p3 OB7 O0A z1 *71 c ^9 $3 -sp@sGk -D6$, +sp@ sGk +D6 $, o8< O68 i4j i5a i6n O13 p2 @@ -42274,21 +42102,21 @@ s3v sS| O39 *98 ^C ] O97 o2t l o21 -sYEu[ -$.$; +sYE u [ +$. $; -1 C -*2Ai4* +*2A i4* i31 i58 o08 Z1 *87 *46 i3d i11 -Z1T2sAL -o4'o5[ +Z1 T2 sAL +o4' o5[ p5 k $u $w -z1Z2 +z1 Z2 O23 $! -s;\R8-9 +s;\ R8 -9 i6o i7u i4o i5t OA6 O37 @@ -42296,46 +42124,46 @@ OA6 O37 ,3 O02 o6d ,7 s1@ -Y1.A +Y1 .A *04 smv +1 sbq *86 O14 i4o i5p L0 E -o9?i2i +o9? i2i t *94 O1B -iAh] +iAh ] OB9 o6f Y5 +5 -C *54 O75 i16 i50 O52 sko o9$ -shv[ +shv [ O2B r i6g i7e i8r +4 -0 +6 'A +1 o5_ u -spc*A0 +spc *A0 d o8i -*64C +*64 C i7e i70 sAX OB5 i56 i1a -l-8o8` +l o8` o2r O43 $y o4f -D4i5DsP0 +D4 i5D sP0 L7 l c T3 i3_ -*57K +*57 K *41 Z3 OB9 o5o t sBQ i8a i9l iAl *34 $y { i2c -*96-4TB +*96 -4 TB i2g r O07 sO' $. *54 t *35 @@ -42343,33 +42171,32 @@ $4 ^@ $b O35 i91 iA0 iB2 s5T -sGO^W*32 +sGO ^W *32 $i O03 s#5 -*84^S +*84 ^S i11 i59 *56 *30 i2y i3x -*98 ] ^C O6B +4 l i6/ o4f $s -o9oy2 +o9o y2 i54 i14 so1 i38 i45 i52 D2 T4 q O09 *64 $x -o2a$es@V +o2a $e s@V $f D3 -^isU- +^i sU- c $p ^u z1 i1e i2r i3i i0c i2m i1a ^C p2 i1e i2k -$>$+ +$> $+ Z2 +A D0 i65 $6 u D3 @@ -42384,7 +42211,7 @@ y3 O58 y1 O1B $V { i3d i76 -i9q$u +i9q $u +1 skw c i52 T6 O81 -0 @@ -42403,21 +42230,20 @@ $9 $1 $3 $3 i1d i31 c ^m ^i D3 $x -*0A} +*0A } $S D3 *42 ss- i8x *14 O04 -T7s%H +T7 s%H l $i $a $n sw8 -3 o8k -[o5x*A2 -[ ^u +[ o5x *A2 i0v *07 o0v ^q ^, r O5B $G *27 -D5i7ciB! +D5 i7c iB! i5R O1A s@! d o9i i3i i4n i5a @@ -42433,18 +42259,18 @@ k ^J i44 i50 i1- i3- i5- i7- i9- ^m o58 -sX8^k +sX8 ^k s9X O78 z2 -sH"o4? +sH" o4? r O51 K i5x +2 -s4FD6^d -s\lo5ko9B +s4F D6 ^d +s\l o5k o9B O62 o6Z s&U slN OA4 -*14*75s(1 +*14 *75 s(1 i47 T5 -L8s!zL0 +L8 s!z L0 O6A sNJ o8t D1 i35 i12 @@ -42458,15 +42284,14 @@ o5n { $. $e $s i94 O42 y2 y1 DA -sVbsi- +sVb si- O06 o7! O68 -o0MY3 -T8Z1 +o0M Y3 +T8 Z1 O65 c sZT -cszp +c szp k i1- i7< OB1 -o1J c Z2 p3 t -4 sgn -2 c ^1 ^@ @@ -42477,25 +42302,25 @@ sly O43 ^g ^e ^l i9e iAr Z1 i4a [ -s5fdY4 +s5f d Y4 Z5 O81 O56 O49 i7m i81 ^D O43 p3 O62 -,8s8y$/ +,8 s8y $/ c $4 $2 $0 $! i9e iA1 i77 O2B O31 o19 -*40o8OsZb +*40 o8O sZb Z2 -3 $E O32 -Y1o6ws9V -[[[[[[[[c +Y1 o6w s9V +[ [ [ [ [ [ [ [ c D3 ^X p3 O69 $$ -i9Gp5 +i9G p5 $5 OA2 C +8 O65 y2 @@ -42504,13 +42329,13 @@ O65 y2 i22 i30 i42 i50 s(3 i3h i4i --A^b*48 +-A ^b *48 o1J O3B sWI $V $8 -s%DR5 +s%D R5 $i $c i7e i3d -q*74 +q *74 O61 .4 $y sLp $b *12 @@ -42518,10 +42343,9 @@ i3c i39 o6. ^m ^F *46 s(= O2A s3R -$=$> -sDF*85 -l [ ^y -sJRi0N*43 +$= $> +sDF *85 +sJR i0N *43 ^z +7 i2l i3l i4o O17 *B1 @@ -42533,7 +42357,7 @@ i1a i2z s-t -8 *24 OB4 O72 -s_No8h +s_N o8h sb@ O49 $] oBE O6B @@ -42553,19 +42377,19 @@ o3f O36 ^p +5 -9 -0 soJ i1a i2k -lswZ +l swZ i76 i58 O43 t Z1 +0 -5 +8 ] O12 i57 i17 -'A*15T5 +'A *15 T5 i76 i7f K O03 p1 O52 T5 R0 z1 D2 Z1 *85 D2 -$+-A +$+ -A ,5 O9B O73 *A8 u T8 *73 O43 @@ -42576,10 +42400,10 @@ i2b i3e i4r i2s i3i u sCK +3 '9 -*8A*15 +*8A *15 +6 $u i1a i38 -o6s*B3-2 +o6s *B3 -2 O23 O54 D6 ^3 i34 i70 @@ -42598,17 +42422,17 @@ i1i sih O13 ,9 z4 O16 o4v O05 r -]*81i6R +] *81 i6R OA2 ,2 -o3Tsp< +o3T sp< d o5b sgO *23 O86 +D -8 -s +-3 s&> i3p ^a ^g O36 Z1 O32 ^r -oBKs@C +oBK s@C O57 s'I O65 d E O95 -y3T3 -s3z,9 +y3 T3 +s3z ,9 O4A R8 p2 -*28s`$+A -o7Oi8Y$n +*28 s`$ +A +o7O i8Y $n k o91 o3a s41 $j O86 ,6 O83 r R3 +1 sjo +3 -s,2*41 +sf> ,2 *41 Y1 *89 O43 sbh i3e R8 L8 -s%k$C +s%k $C p1 O6B *02 *17 l D5 i7x @@ -42729,18 +42553,17 @@ i5l i6o O42 } O32 srs T7 p3 -o1v*81+7 +o1v *81 +7 i5w o9t O19 ,9 D2 Z1 o3n *83 O73 *1A -d O95 E i2k *46 -[o6yiA* +[ o6y iA* z1 O0A *07 D3 Z2 o2s -7 -c$S +c $S -4 r i1o i2n i3s *96 O02 @@ -42748,7 +42571,7 @@ $_ -0 o2q p5 OAB $9 u i71 R9 L9 -oBE^$ +oBE ^$ r $p i4a i5c t y4 @@ -42756,20 +42579,20 @@ t y4 Z3 Z4 O07 O29 p2 s-J *56 $4 -seoRA +seo RA oA' i6r $r O24 R8 p1 -i62*84*27 +i62 *84 *27 i7a R8 L8 O75 $u sax o3z -o9]$d.B +o9] $d .B l $1 $8 $8 O73 *51 $3 o6z O02 Z5 -sj5D8 +sj5 D8 *75 *63 O12 L1 *71 ] @@ -42780,33 +42603,33 @@ i57 L5 R6 *58 O92 p4 i8e i9t o6g $b -$i*69 -i73*A8 +$i *69 +i73 *A8 +4 *82 -$Qs{w +$Q s{w *16 D0 O04 E O53 O7A y3 R4 *57 *60 $i i5c { -TBsjd +TB sjd O14 O75 -i74'B +i74 'B OA2 O1B [ R1 R2 sJt i85 O1A y5 O2A -Z2*B2 +Z2 *B2 *48 *68 ^t y2 -s3;o6o +s3; o6o O74 sdf sbw O07 O85 $5 i2l *23 O89 i7t i8y -szfD7 +szf D7 l $0 $0 $9 *0A O25 d i3e R1 L1 @@ -42818,7 +42641,7 @@ DA O19 stv $h } K *17 K -R5D8*A2 +R5 D8 *A2 $w *86 *18 D7 O27 $i d @@ -42829,36 +42652,36 @@ t i59 i1o i2o i3m $T O31 shz -2 O31 -shao6c*A4 +sha o6c *A4 o82 $9 +8 k *12 y3 -s?>[ -dY3l -i89s;c +s?> [ +d Y3 l +i89 s;c l $4 $0 $4 { '8 ^b -*64iB, +*64 iB, Z1 -1 +7 O5A L4 T0 T7 T8 T9 -s*ls)Ny1 +s*l s)N y1 *80 '6 sia i6e *46 O7A O18 $8 $7 $7 $1 o0t $? -i8csiy +i8c siy } s/e D6 D8 q -sK\i8k -,8T3s_a -o3>^c +sK\ i8k +,8 T3 s_a +o3> ^c *B3 O53 ,2 -0 o2g *75 u o0B -s=4o7y +s=4 o7y [ $z O52 iBv t o9N @@ -42867,34 +42690,34 @@ i1o i2o i3p l '7 $5 l '7 $2 i4e i5r i6t -KR7 +K R7 O72 K i9! $1 $l -i0jsF"*8B +i0j sF" *8B K *63 *83 O32 *20 Z1 *21 *36 O92 k -srDs{c$. +srD s{c $. *B6 'B Z2 [ t i6s i7t i81 { i61 { O23 -i83uD9 +i83 u D9 $5 Z2 O15 ^e $t ^n } Y5 O18 Y4 Z2 O21 i0s i1a i2s -sC0$h +sC0 $h O49 Z4 -sbc^t -KL6 +sbc ^t +K L6 i1b i85 O63 -o3d 'B OA2 +o3d 'B O0A [ -5 f O38 ^l +6 +7 @@ -43022,9 +42845,9 @@ i33 i44 i55 i1i i2c i3h i2t i3t o2m .6 -sgCR6*61 +sgC R6 *61 ^M *68 -sbjt +sbj t sye i6a i7h i31 ,4 @@ -43048,14 +42871,13 @@ spm K T1 .7 T5 T8 i1u i2k -[ $7 *45 ,1 $v d O5B $1 +2 Z1 i3a i4t i5e i5t i6a i7r i6c i7a i81 -o9cY3 +o9c Y3 i1s i2a T1 T9 T5 d K @@ -43065,7 +42887,7 @@ s1= i91 l $7 $0 $0 $1 s8! -ER4 +E R4 i4p i5a i43 i54 i65 ^r ^u ^s @@ -43096,7 +42918,7 @@ s21 p1 O36 l +1 o3w i1V O31 $M -*90p4T0 +*90 p4 T0 i5e i6m i8u i9s i2t i3c i4h @@ -43167,7 +42989,6 @@ i6V ] i1e ^D ^f ^f ^o iBn OA4 O09 -i4E E O92 sgx o4s '8 o7S *34 @@ -43196,25 +43017,25 @@ i1e i2o oAD *17 O15 c o80 -L3{^u +L3 { ^u O04 Z5 o69 i2a -z3sYBsap -l[$7 +z3 sYB sap +l [ $7 [ *15 K -KE*98 +K E *98 $n *24 -$/$- -$^$+ -s9eZ4.9 +$/ $- +$^ $+ +s9e Z4 .9 r D3 -$ $- -$ $, +$ $- +$ $, -8 O24 -$~$^ +$~ $^ i45 i55 i65 i69 i77 -,4o1.sh- +,4 o1. sh- ssu sM' O3A o2j *60 @@ -43222,21 +43043,20 @@ ssZ -6 *70 i69 i73 $@ L6 -sr$[ +sr$ [ i1o i2r i3t y5 O8A $Z Z2 o61 i5h -i8AsFW +i8A sFW D8 OA4 -+0z3 -*76'7 ++0 z3 f O76 $g -T0p5 +T0 p5 '8 i6j -$k^Ys_( +$k ^Y s_( p3 D9 O0A -sQ>R1 +sQ> R1 i5r i6y *3B O94 i9v @@ -43245,8 +43065,8 @@ O78 t *27 *25 R5 *42 $' OAB D5 R4 -s?m'5 -$FD4 +s?m '5 +$F D4 $m l o8u O13 D7 $ Z1 @@ -43254,8 +43074,8 @@ i4e $a sQn O41 O63 i1e i2l i3i O07 $1 -*05*93 -iAm^^-B +*05 *93 +iAm ^^ -B skz O58 o8* $0 $= @@ -43265,24 +43085,24 @@ i5- $3 i5a i6t i7e D3 i2. i9s iA2 -s@ST7 +s@S T7 ^z O31 Z1 -o2'T7 +o2' T7 c $$ $3 o3s Z1 O24 $r O15 o3p D6 k o0v -*05i9d*18 +*05 i9d *18 o99 Z1 i4n i5a +3 r *34 -Z2[r +Z2 [ r ^z Z1 O31 sd} sd{ -1 Z2 [ -+AsNus}% ++A sNu s}% O71 *A0 i31 i40 i51 i7l i8l i9a @@ -43296,7 +43116,7 @@ i7f i74 D7 O93 l i5z D7 l $i $s $t -s9=L2 +s9= L2 c i34 T4 *46 *16 i6s i7t i8a @@ -43305,7 +43125,7 @@ i1m i2b snc +2 i12 i1d i43 i58 -*4AT0 +*4A T0 i3c i7b ^g ^w +5 ] i3x @@ -43323,10 +43143,9 @@ l f O46 i7h i8a *15 ^p *71 i3V -f $g O76 i5a i54 -$*$% -$*$^ +$* $% +$* $^ i33 i1e i7c i59 i37 i7e @@ -43343,15 +43162,15 @@ i5c i52 i7l i8o i3c i35 so@ -i22i30i40i54 +i22 i30 i40 i54 i5c i33 i5c i34 i14 i7e i1d i14 -i11i29i39i45 +i11 i29 i39 i45 i0b *17 c $5 $8 $4 $9 -*03RAz4 +*03 RA z4 i5{ l ^d ^e ^e ^s o7a O42 @@ -43363,15 +43182,15 @@ $w r -4 $] O07 O65 +6 o4/ O8B -o7(TB +o7( TB i1i i2n i3t -o2Vs8f +o2V s8f l i42 i0p i1l i2a d OB7 Z2 +5 $* o1j Z1 -z4s5x +z4 s5x o7m -8 D0 sfw O68 sDx @@ -43380,16 +43199,16 @@ svA i2b *14 *75 O41 ^g i2\ -^cY3 +^c Y3 i3l ^z i90 ^z O31 O12 *52 O52 $G -i9gs6j +i9g s6j l O38 -sV#,4i7y +sV# ,4 i7y ^/ OAB -*98sYJ +*98 sYJ l ^k ^l ^i ^m O3A *19 OB6 s1p @@ -43398,14 +43217,14 @@ s1p sda oA< i1c i2h -'6i5N^_ -L6E^C +'6 i5N ^_ +L6 E ^C } r D0 r $w o2j -5 } o55 ^n ^w ^o ^d -slW.7 +slW .7 r $h ^9 -2 *60 } D4 @@ -43413,17 +43232,17 @@ swG +0 O92 i14 i53 i5i i6n i71 -sCioAA +sCi oAA s@` -p3l +p3 l } z5 z4 i0m i1a i2m K OB2 *51 swE -]oBHZ4 +] oBH Z4 i68 i77 i4l i5a i6s -$$L7 +$$ L7 i1i i2p i3p i6a i8d i7n $i O13 @@ -43436,15 +43255,15 @@ l $0 $4 $0 $5 O15 Y2 ^e $l $i $u i3o i4p -i21i39i47i51 +i21 i39 i47 i51 $l $o $g $a $n -iAZ$o*71 +iAZ $o *71 z5 O48 $s $i $m $o i67 i79 c $1 $1 $2 $! O12 l K -,9*03$; +,9 *03 $; ^J D3 u $7 $4 $! $! i3o i4l @@ -43460,12 +43279,11 @@ TB TC $o $a $f O47 O2A i5G sbW O98 -[soH +[ soH c $1 $1 $7 $! c $1 $4 $* $* O93 O62 sJI -] ^7 ^d o2. u d 'D $6 D5 s7n O78 @@ -43493,7 +43311,7 @@ $1 $9 $4 $0 f 'B +1 Y2 c $1 $5 $7 $! -T1*A8$q +T1 *A8 $q c ^e ^a i63 i77 $0 $e @@ -43503,7 +43321,7 @@ OB8 $( *B7 C '8 $8 i6j i7u i8l i7f i54 -'B^K +'B ^K o2r +3 $1 $3 $$ $$ -4 $a { @@ -43515,7 +43333,7 @@ i8e i9r iA1 C '8 $9 i52 i30 -3 $4 -^ksA({ +^k sA( { ^p 'A i2& *10 i03 @@ -43528,46 +43346,46 @@ O0B o7\ i6l c $2 $6 $! $! 'D $2 $p *61 -$gt +$g t $p *73 -k^@ +k ^@ iBx i1a i78 $1 $6 $@ $@ c ^2 ^f -sTX*49 +sTX *49 suA *16 '7 -siT*7A -*37*67 +siT *7A +*37 *67 i6" i12 i7e i37 i74 '8 $* -*A6i0B -sBFi9I -$*$) +*A6 i0B +sBF i9I +$* $) i1e i56 -y1KsZ} +y1 K sZ} O06 'B *58 s13 D5 c ^i ^n ^i ^m -iBY^ws>W +iBY ^w s>W i39 i72 Z4 O29 Z5 -iA=s;,*05 +iA= s;, *05 [ $N c O96 d iAG $8 OA3 i1e i53 i1e i54 i5e i1c -Z2'7 -sGOEd +Z2 '7 +sGO E d i8h i91 l oAk '8 i2d -i6@*5BiBk +i6@ *5B iBk $d *69 c $9 $8 $@ $@ i6o i7c i8t @@ -43599,20 +43417,19 @@ o72 *43 $4 $5 $@ $@ $q $p $5 $6 $* $* -l^3^2 +l ^3 ^2 O59 Z2 l ] $m ^2 ^8 ^6 ^4 O91 l *51 c $6 $9 $* $* -*15*41sYx +*15 *41 sYx i1a i2b i3a l ^t ^o ^o ^b i2n i3k i2r i3b '7 $+ OA3 RA -[ ^V O34 sVc $2 $1 $$ $$ *02 o51 @@ -43626,28 +43443,28 @@ $2 $5 $! $! i2r i3t l ^r ^i C $9 $6 $9 -lo94d +l o94 d i1p *46 -D5$ysLi -iBs$5Z4 +D5 $y sLi +iBs $5 Z4 i5u i6r i9e iAr iBs s]u OB9 l -^kz2 -*A8.8 +^k z2 +*A8 .8 *06 s({ O29 -i52i60i72i82 +i52 i60 i72 i82 l $_ D1 -sV,^x.7 +sV, ^x .7 shn p4 L9 *4A R2 O27 -T1srz,A +T1 srz ,A D0 D9 -R4i4of +R4 i4o f l $1 $9 $6 $9 O13 $s O42 *52 t -oA5Z5 +oA5 Z5 K *79 O41 i39 i1a DE @@ -43657,7 +43474,7 @@ i53 i7e i53 i7d Z1 d O56 ] O2A *70 -swcLA +swc LA $2 $1 $? $? c $0 $2 $! $! 'U @@ -43666,7 +43483,7 @@ t i22 $6 $5 $* $* $0 $6 $* $* o1[ -iBpoAei9h +iBp oAe i9h $1 $8 $@ $@ $5 $5 $! $! s 1 *A6 OB2 @@ -43675,49 +43492,49 @@ i9a iAn i5b i77 D8 D9 $5 $5 $@ $@ -s.D,3 +s.D ,3 Y3 O37 y3 O75 t q $5 $5 $* $* D2 D7 i7g i8a c $1 $4 $! $! -sRA*A4 +sRA *A4 c $8 $5 $! $! s64 $2 D2 D8 O14 ,2 -*B3s3) -*68*57 +*B3 s3) +*68 *57 $o $v $e $r -*5B*70{ +*5B *70 { c $t $e $s $t ^z z2 z2 s6F -lo9) +l o9) l o81 *45 { p3 .9 y5 oA9 iB7 s3G -i5li9* +i5l i9* $3 *57 sBU ^f ^l ^a ^h { i16 O64 p3 ^e ^e ^z ^e -*21sXa^I +*21 sXa ^I ] smy [ ^x ] $x O72 -B u z2 O2A y1 sgv o0m -s}=s0) +s}= s0) p2 $5 -]o9F -$!$~ +] o9F +$! $~ [ ] ^x $x *48 *47 c $y @@ -43734,24 +43551,24 @@ i3f i1f ^9 *24 i5i i6a i7n $P k -,9^p +,9 ^p T0 D9 i38 i7c -T2*03 -.3ksHl +T2 *03 +.3 k sHl y2 ^N i2p i3i -*7B^UK +*7B ^U K i9A O6B *14 O2A -^ s(Z +^ s(Z K Y5 sa@ si! D0 p1 O21 i20 i39 c ^3 ^5 ^9 ^1 $2 $6 $2 $9 -tZ3s}> +t Z3 s}> $7 $9 $8 $1 '9 $B $3 $8 $6 $1 @@ -43759,7 +43576,7 @@ $3 $8 $6 $1 sAK l ^n ^o ^c i19 i58 --1^c+B +-1 ^c +B $5 $0 $3 $7 $4 $0 $5 $2 i20 D1 C @@ -43771,8 +43588,8 @@ T4 p1 +5 ^U O32 O72 s5O -*3AL9 -^xi9x +*3A L9 +^x i9x *A2 '8 C $1 $0 $0 s.& @@ -43786,18 +43603,17 @@ $i $d $e i24 *10 shp O01 c $2 $9 $2 -i3S*A3 -i0Ps)N +i3S *A3 +i0P s)N Z2 o8p i2c i3o T3 z1 -^zsDBs`a +^z sDB s`a o5B +6 K ^Z -R7} +R7 } i4\ $5 O3A O73 ^S -[ ^Y i50 i32 OB5 OB7 R7 R8 @@ -43805,7 +43621,6 @@ p5 i8! i5V i5d i56 i2z i3a *20 y2 -O61 E OB1 s6T sky D1 s6P @@ -43817,22 +43632,19 @@ O23 ] s8D $q -5 i37 i7d -$($= +$( $= sUN st7 u i36 i1e p5 *92 *01 i46 i58 -*43 E O63 sSX -oAa-9 +oAa -9 l $a $g $e OB8 R1 s_. i3f i75 -l [ ^h -7 *74 *64 OA2 u -l [ ^b i0j i1a i2s sd Y1 i3e i55 @@ -43842,18 +43654,18 @@ i8i i9a i56 i3e ^l i9n i2d '6 -sHc.B -l [ ^x +sHc .B +c o0x O23 p3 ss3 o3r *78 Z1 ^V D5 i78 i3c -slVsY].7 +slV sY] .7 ^9 O72 -^OsG' +^O sG' ^Z ^M -sf2R6 +sf2 R6 '7 o49 $5 ^! o3b t @@ -43861,46 +43673,46 @@ o3b { u $1 $9 $7 $1 i72 i3b c ^y ^m -*84$b +*84 $b ,6 T3 c $= $3 $+ $5 *45 $8 l $0 $0 $4 -*29+2s(. +*29 +2 s(. c +0 -$>*4Bc +$> *4B c i77 i7c $B $Y sr. O62 $w d OA1 -*45oAlK +*45 oAl K sGX o9G u ^Z +3 i3n i4e i33 i12 -s}Qi6Y +s}Q i6Y .5 .6 i71 i32 -R4D7 +R4 D7 c T2 so0 st) +5 ^g -*49.3o2z -.1^RoAA +*49 .3 o2z +.1 ^R oAA s'} '9 $M $P *21 c $8 $? -p5sC?$3 +p5 sC? $3 +0 d *52 Z1 sa. O41 -*8AsWR$u +*8A sWR $u sit -s$Asgz$- +s$A sgz $- ^[ s[d i72 i1b l ^d ^n ^i ^w @@ -43912,9 +43724,9 @@ $T k $H O15 } ^3 $v -7 -suOs}ys]m -sW3y3 -*97i6< +suO s}y s]m +sW3 y3 +*97 i6< i2s i3s i4e o2M d $4 Z5 @@ -43927,15 +43739,15 @@ o2V .1 O26 o52 sh' s0M -i9J$< +i9J $< D5 ^' E ^X -1 *42 p5 O73 sO< sm! -.3i88 -iAO*A6^r +.3 i88 +iAO *A6 ^r T7 i98 -+A,B ++A ,B i8u o0C Y4 O29 *A4 i51 i12 @@ -43944,7 +43756,7 @@ s5W OB5 p5 c $i $n $g ^m ^v -.8o5r +.8 o5r i4i -8 D2 OB9 *53 O74 @@ -43960,24 +43772,24 @@ sn_ l y5 O64 i2n i3c i4e O17 q -s2Llo6W -*49^M +s2L l o6W +*49 ^M Z4 Y3 O43 } i2b i7l i8o i9v $1 i7? -{R8 +{ R8 u ^@ c ^1 $- i3i i4n i5h -.3si1 +.3 si1 *54 +4 --6y2 +-6 y2 o2X Z1 -$+$% +$+ $% O1A q i51 i39 -[o75 +[ o75 s 1 i13 i1c -2 .4 @@ -43985,8 +43797,8 @@ O15 T1 OBA i7y $x c $s $h { o6S -csrHsWP -.2o9) +c srH sWP +.2 o9) O67 *B9 s4i o6y $k @@ -43996,7 +43808,7 @@ c $* ^* K Z1 o40 c ^. $1 D2 $M -s9d*13 +s9d *13 $T $M ^A O26 s1> oB@ O3B @@ -44009,14 +43821,14 @@ o7E .2 '7 K $H D3 *0B .0 -*20i6a -s\)ss2^, -^7sP- +*20 i6a +s\) ss2 ^, +^7 sP- i77 i37 l .5 i5a i14 -dc -D9^6 +d c +D9 ^6 i58 [ sUC i42 i50 i61 i78 @@ -44026,14 +43838,14 @@ sy{ *A8 O35 $! O25 l $m $a $n -*65*36 +*65 *36 O83 *64 i28 i38 sd3 u *41 -0 C ^w D7 -o0Ws^xs2v +o0W s^x s2v i3a i59 iBr O46 Z2 O04 @@ -44044,13 +43856,13 @@ OB2 sg0 iBg sKj *18 O56 t o2K -snU$. +snU $. iA& i79 i3f $& { *70 c O09 iB1 iC2 iD3 -s!--5$( +s!- -5 $( i5f i1f Z1 +1 o6^ Z1 @@ -44058,35 +43870,35 @@ O04 O38 p3 O26 t s6s -1 O25 -uY2sW7 -s{S{z1 +u Y2 sW7 +s{S { z1 o5H K OA2 O76 O32 O21 +3 r DA $b -*98i5CiA- +*98 i5C iA- i75 l T3 O37 $o O13 o8_ O02 o6f } i58 i39 -D2$c +D2 $c c $5 ^2 i11 i29 i39 i41 c o5X *95 O76 -lp5 -$1sgk$- +l p5 +$1 sgk $- c ^F c $6 ^7 c $u -k'A +k 'A i1a i2g i3a '4 $4 O62 sbd ^v z1 -}siGssA +} siG ssA o5> c ^H O32 ^I @@ -44096,23 +43908,22 @@ $1 *74 i5P O72 s|C i7c i5b i36 i53 -l [ ^r O2A Y5 sJU O27 -0 i3O +0 -s&{o3P -sdcs4V[ +s&{ o3P +sdc s4V [ O16 z3 sup O21 i62 i70 i81 i94 O34 i1v -*72+2 +*72 +2 c ^3 $4 i21 i39 i48 i54 i5i { -i5RsDI -^`o0ts0< +i5R sDI +^` o0t s0< O63 sEv c $9 $? y5 O39 T3 @@ -44121,7 +43932,7 @@ i77 i19 *03 *36 O67 ,1 i3| -i0bs3{iAd +i0b s3{ iAd i1a *37 sgz i0m ^O *02 @@ -44129,7 +43940,7 @@ c $9 $- O59 R3 $4 $# ^N O78 -LBs,Oy4 +LB s,O y4 O63 o3r $p L6 Z2 *20 O14 @@ -44141,7 +43952,7 @@ c $3 $+ sCH O62 $E Z1 i3a i4n i5e -*60s}2K +*60 s}2 K o3@ [ ^1 $0 c $# $8 @@ -44167,7 +43978,7 @@ R0 O13 i4z Z2 ^w O52 i80 o6. -*1BTA*31 +*1B TA *31 c $2 $_ +4 -3 -0 D4 $Q @@ -44178,8 +43989,8 @@ i5f i72 ^, O42 sb@ O23 +C -6 -s`Gi7D -s,9o25 +s`G i7D +s,9 o25 $i -0 *3A O05 +4 +A +6 @@ -44189,7 +44000,7 @@ i57 i19 o0h u -3 -3 -A s09 O81 -RAz1 +RA z1 sQO O27 OB6 E z4 -D -D -E @@ -44208,7 +44019,7 @@ i3b i70 oBE ^a ^r ^a ^s +2 -4 -6 -p5$rsQR +p5 $r sQR -7 -C O93 sht sav @@ -44237,29 +44048,29 @@ $- O32 O16 d +5 +6 -8 +6 D3 y3 -y1o3a +y1 o3a i77 i7b s*x c $+ $2 -$l,8 +$l ,8 +9 -8 -6 O35 Y2 ,5 -3 -6 -A $7 ^! sMN ,A o3y O0A -$!$= +$! $= +1 +5 +4 -o4$s`0 -T3sgcZ2 +o4$ s`0 +T3 sgc Z2 s$7 -*B6o9m +*B6 o9m .0 $k -o0so7[ +o0s o7[ t O0B +1 z3 i3a i11 -$$$) +$$ $) i71 i14 -B -F ^m srw @@ -44284,12 +44095,12 @@ i2n i3d i4e $6 o2r scy ^- r -*08'9 +*08 '9 -0 i0C -cTBs&P +c TB s&P $1 *07 O43 c so0 T7 -*9BY2 +*9B Y2 ] Y3 O95 o1u *57 O69 *65 @@ -44299,7 +44110,7 @@ o9s D3 i5& O07 c so0 T2 ] i4- O03 -*3B]Y4 +*3B ] Y4 i9m iAi O06 z2 i24 i38 @@ -44322,7 +44133,7 @@ p4 z4 O5A *15 sK` D0 o1q Z1 $2 -sY2 +T5 s"> Y2 +6 -0 -5 -sQ)o2G +sQ) o2G i32 i14 sGB +7 -sLys_xo9c -*19sl[ +sLy s_x o9c +*19 sl[ ^b O14 -o8JE +o8J E l ] $g i85 i92 c $6 ^2 ^y ^l ^o ^p soM '8 o2t D1 -{'B^z -s}&^9 +{ 'B ^z +s}& ^9 i2n i31 i5e r i77 i3c i18 i3a i74 i7f $T O52 -sdXo3D +sdX o3D i97 iA9 z2 ^b $m $a $r $1 $0 @@ -44572,9 +44383,9 @@ $m $a $r $1 $0 '7 *46 $7 Z4 i6a i7m i8e -l^9^1 +l ^9 ^1 $6 O62 O61 -l^2^2 +l ^2 ^2 O74 D9 z2 *71 K *20 d @@ -44597,26 +44408,26 @@ i1a i53 *A9 O57 q i3t i4i i5n c $5 $7 $! -*B8*24 +*B8 *24 r z3 i8h i9o i9a iAs o9* 'A i4/ OA4 z4 ^y O28 --7y1s0L +-7 y1 s0L z1 o59 +4 -9 -0 $d l o85 *75 i56 l -o2NsfV +o2N sfV o1x D9 { O92 c $1 ^4 +3 Y2 i36 i7d -s3_p5 +s3_ p5 ^b -7 $s i52 i4a i5n i6n @@ -44632,7 +44443,7 @@ i4p i5o i6Z sNg O94 R8 OAB $. $m $y -s]%u +s]% u $8 O42 Z1 O51 i0w *67 i70 R0 L0 @@ -44642,8 +44453,8 @@ i4e i5A O6A sdI i1f i3d O06 '9 -sjqs@p -*57oA?Y3 +sjq s@p +*57 oA? Y3 O72 ^l s0V i1a i58 @@ -44675,8 +44486,8 @@ i3r i4a i5n O03 o7@ c d '9 $8 c ^a ^f -s5wT9i6Z -sA|sFjLA +s5w T9 i6Z +sA| sFj LA c $8 $2 $! ^f { *14 D1 O75 @@ -44690,10 +44501,10 @@ c $4 $? l O21 i31 i1a i54 i5e i37 -$i*95*76 +$i *95 *76 i52 i35 c ^b ^8 -o3Su +o3S u +C -B +D k OA5 z2 *50 @@ -44703,15 +44514,15 @@ c $1 $4 $3 $! k i49 { o4q i4j i5o -*86i2l +*86 i2l $9 $e i19 i78 sWH $9 $f -*5Bi1D +*5B i1D *20 svt r *45 ^p -y3skn +y3 skn c ^3 ^d -7 i4x i12 i5e @@ -44721,22 +44532,22 @@ O6B s,s *62 i55 i1e ^r ^m 'A O43 -$+$@ +$+ $@ i4a i5m i6a OB3 Z4 D5 K *43 c ^f ^8 -s2#*31i1e +s2# *31 i1e i56 i35 s6P } *61 i6n c $7 $9 $! -$@$- +$@ $- i12 i20 i30 i49 O9A oA# d 'E $1 s-l -l*24o0O +l *24 o0O -6 O75 ^K *15 i1e i12 @@ -44751,7 +44562,7 @@ o7f t c so0 T1 o0z o1e Z1 ^o -[L6 +[ L6 *07 *83 O74 i1h i2o $! +4 @@ -44765,7 +44576,7 @@ i44 O15 q slc D0 c so0 T3 +3 O03 $w -Y3uD8 +Y3 u D8 *01 $f C '9 $3 c $3 $6 $! @@ -44778,11 +44589,11 @@ O9B O95 spT l *32 *40 z1 ^I o49 -T2+AK +T2 +A K T0 T1 T9 u 'F i1f i71 -*A4s3B +*A4 s3B -7 Z1 -3 O29 Y1 O6B i4C @@ -44792,11 +44603,11 @@ O92 'B i9) i1C { D2 i33 i52 svl -tY2,5 -Z2.1z1 +t Y2 ,5 +Z2 .1 z1 i39 i58 s7E O98 -+AR5 ++A R5 i7d i76 $s $o $u $l O76 O52 sGw @@ -44805,17 +44616,17 @@ i15 i50 *54 $3 OB8 i8" *A5 i2s i3t i4e -$+$? +$+ $? o1! T0 *51 ] *25 c i1R -o2f*27 +o2f *27 O5A OBA *80 z1 *29 O13 o37 i3c i77 i76 i3c -y5DB +y5 DB z2 -0 $\ $' s*O *37 O79 @@ -44825,14 +44636,14 @@ O42 O94 i3l i4y i3h i4o sdS O62 Y2 -{svLo5& +{ svL o5& i57 i5f i57 i5b i50 R4 iAE $r O57 -R8i7+ +R8 i7+ i1e i37 -.5^,o75 +.5 ^, o75 s7R OB7 OA3 o3{ $v L6 @@ -44847,36 +44658,36 @@ K i3m c $3 $- i5e R9 L9 i26 i35 -,1^s -sFX$y +,1 ^s +sFX $y $a u i7a i8t i9e -r-8-7 +r -8 -7 T0 T3 T2 T6 sap } -oB*Y2y4 +oB* Y2 y4 i11 i3a i5f i50 --6*60 +-6 *60 O76 s8s sqS t ,2 -5 i27 i38 } p5 L8 O92 -p3y2p1 -T2$u +p3 y2 p1 +T2 $u *A2 O13 i3j i4a *30 O45 OB4 { o20 -$ME +$M E i38 i11 $d Z2 -$_Z2'5 +$_ Z2 '5 s[X O89 -'3cs$? +$> $? D6 $w -scEs#O +scE s#O z3 O41 E i4o i5d o4t Z1 Y1 TA -y2o8>Y1 +y2 o8> Y1 ^_ ^g i10 i58 -5 ,1 @@ -45600,7 +45410,7 @@ Z3 $3 O65 o6p ^c ^c ^a i2e i3c -l-9 +l -9 k $l z1 o6x t s.= @@ -45623,15 +45433,15 @@ i5e i6r i7o O51 O05 i38 i76 $_ $h -lp1*80 +l p1 *80 i7c i5c O06 l d O38 y3 sl! -c.2*B1 +c .2 *B1 T5 o0S O52 $@ -D5i12 +D5 i12 soC c +0 $8 *53 O52 @@ -45648,10 +45458,10 @@ i2i i3g Y1 k i8r i9u ,3 $+ O15 -R2Z2 +R2 Z2 O69 ^4 i0n i1a i2r -sngo6N*0A +sng o6N *0A o5x o0k Z2 O53 [ i4k i5y @@ -45670,19 +45480,19 @@ u $H o0e O72 Z1 *25 D3 i7g c -Y1.7C +Y1 .7 C i64 i73 -sMDiAD +sMD iAD y2 $L OA5 D3 OA6 .4 O57 $b O45 -sCv*B1sL# +sCv *B1 sL# T4 i4_ ^B R7 -sDUy3 +sDU y3 $_ Y1 O41 -Z4s(g*04 +Z4 s(g *04 i3a i4r i5d i1r i2e i3e K *98 @@ -45706,7 +45516,7 @@ $2 +3 snl '9 i1o i2s i3e i99 iA0 -[*7BY2 +[ *7B Y2 siK z1 T6 O82 OB8 @@ -45721,9 +45531,9 @@ k $u y2 O36 i9s D6 o0t o2e -*B6D3] +*B6 D3 ] f O03 -^Esa**1B +^E sa* *1B i1d i51 i72 i81 i90 saF c @@ -45740,23 +45550,22 @@ q ] O83 $4 $4 $9 $0 i4u i5t i9& -*53svD*73 +*53 svD *73 i9/ o6M u O14 $p O21 i3l -swpsGPo1W -D4Z4.4 +swp sGP o1W +D4 Z4 .4 i7b i8o +9 D0 +6 Z4 O85 o30 i1k i2i i1k i2o -i71iAV*04 +i71 iAV *04 $. $h $k $w i7_ i1l O31 -*98 D9 *32 ,7 o5s $M y2 o43 i66 @@ -45766,13 +45575,12 @@ i5o i6w seq i4' O43 i83 i95 *74 c -*12D5^F +*12 D5 ^F i96 iA6 o3e { s., T1 i1_ o0w Z1 -z3 E O41 o4K D6 o5n t i47 i51 @@ -45801,7 +45609,7 @@ s.f i1i i2e i7e i19 o9a c -$/$( +$/ $( $) ^1 i2d p4 k '5 @@ -45821,35 +45629,35 @@ $. o0w i91 iA1 O6B s_9 O83 } p4 o7e -^NoAE -iA=ui9` +^N oAE +iA= u i9` *93 O07 O78 O74 K ,3 *17 -.9*17*0B -$_ O41 -+4+0'9 +.9 *17 *0B +D4 $_ ++4 +0 '9 O63 Y2 +5 -oAr+2 +oAr +2 $l ^3 OA7 DA *1B O01 --8sTM +-8 sTM *32 *73 ^b srz f O96 z1 'A -$tsX- +$t sX- i77 $? O42 i3. sSJ $7 OA4 r $k $o C i0M -o7|^7+9 +o7| ^7 +9 *47 *26 ] O49 ,5 -$kK +$k K { K *35 *64 R3 D1 l o79 @@ -45857,14 +45665,14 @@ O26 d l '7 $7 O63 $0 o7T r -*92o1.TA +*92 o1. TA D7 o2h *78 -A i10 i20 i30 -6 ] O74 o3m ^b .6 C -$FspO +$F spO *B8 -7 OB6 O08 O09 $k $4 @@ -45877,30 +45685,30 @@ i75 i1b Z1 *48 O32 ^t ^u ^c i7~ -^4o9K -i6l*97 -^bsU8 +^4 o9K +i6l *97 +^b sU8 R6 D5 -l*85{ +l *85 { $$ o80 *23 i2w .5 O84 -sELET2 +sEL E T2 o88 *34 -oA%o1.] +oA% o1. ] Y5 O94 D4 *6A D1 -.AsXU*31 +.A sXU *31 s | OB7 R7 *60 c i54 i3e -D4oBJ +D4 oBJ $2 *32 *86 D4 Z1 p2 *A2 ] o0Y D4 -^y-0*A4 +^y -0 *A4 $p *34 c $> $1 i1f i3f @@ -45909,7 +45717,7 @@ O58 Z1 *7A d O46 z1 O34 T3 o11 z1 -sUb*64 +sUb *64 *07 i8b [ u $1 $9 $8 $4 l '6 $5 @@ -45920,7 +45728,7 @@ Y2 *65 t $F *64 ^j O94 l Y2 -sCZ-2,1 +sCZ -2 ,1 $M [ -7 l '6 $0 i1t i2i @@ -45944,30 +45752,30 @@ O3A R2 *46 O24 ] i57 i3a spw -sZvKoBH +sZv K oBH ^1 OB4 O3B i7h s2$ z1 T5 O61 -^b] -RAD7^K +^b ] +RA D7 ^K $6 T3 $6 T2 l o1V -i8qi3o -*37s8OD1 +i8q i3o +*37 s8O D1 i0v i1e i5a i6m i7e -*9BD4*52 +*9B D4 *52 i12 i51 i6a i7d i8e Y4 +7 l i8c i9o *14 o1R -d*60s,M +d *60 s,M $o O47 D9 .3 -.9$i +.9 $i sa@ ss$ iBw ,7 *34 @@ -45976,11 +45784,11 @@ o8, D4 t O35 u T5 [ K *BA --9p1 +-9 p1 sZS o5M [ i3s i4t i5o -y5c*B7 +y5 c *B7 i11 i29 i38 i45 i58 i14 s4T @@ -45993,8 +45801,8 @@ i51 i38 R2 *72 sJg l y5 K O81 -.0]$8 -,1-2 +.0 ] $8 +,1 -2 *59 D2 *91 *04 O84 +9 @@ -46005,9 +45813,9 @@ $# O01 sb. [ iAC c ^ ^2 -li6H -$l'A -s)ho8yo3* +l i6H +$l 'A +s)h o8y o3* c i55 T6 -1 K { i60 i71 i80 @@ -46016,9 +45824,9 @@ sCA $6 O61 O62 Y1 $Z Z1 +4 i0B -]s_x +] s_x O36 i1E -*0Bo1K +*0B o1K iBu *B1 O06 { ^b Z1 $, @@ -46031,11 +45839,11 @@ i2r Z1 c ^g ^n ^i ^k c y3 l i6d O26 -s/uD2ssK -R5*B6 +s/u D2 ssK +R5 *B6 *38 O26 ^S $* -*34*9B +*34 *9B 'A $C ^X *31 sjG @@ -46047,42 +45855,42 @@ l '5 $4 snG c sej +7 $0 O15 -ssts0< +sst s0< $v O24 O23 $g { O84 -$8t+7 -*76*6A +$8 t +7 +*76 *6A p2 c -Y4o1ps7b +Y4 o1p s7b T2 ^K ^F OAB i4o u l '5 $2 $B ,8 $d -i81[RA -iB8^jsX\ +i81 [ RA +iB8 ^j sX\ o5g i7o -l{$7 +l { $7 o61 r iAE O57 $r *56 } -6 i7f i72 ^k $t -i7Ws5U -*2B+AsBC +i7W s5U +*2B +A sBC OA2 E i9? Z4 { O62 sy3 $v D7 O21 i2s i3s i4y -s8n[ +s8n [ i5e i51 -Z3*43 +Z3 *43 i2v } -oBIszti9q +oBI szt i9q OB2 t O02 -*21,1 +*21 ,1 i2s i3s i4a *32 sI4 O13 i3E @@ -46090,15 +45898,14 @@ O13 i3E o5z Z1 '6 $~ o9N *BA O29 -D1i4ap3 -*09'7sO2 +D1 i4a p3 +*09 '7 sO2 o3a Y5 -ts4% +t s4% O67 i6a r $s $e $x $y i2s i3s i4i l ^e ^d -] ^C O54 *45 $v -6 s0g o5] O45 @@ -46108,27 +45915,26 @@ i7a i3f l ^n ^u o6a *36 sIG K -y2.A -c*15.6 +y2 .A +c *15 .6 i3e i58 -*97t +*97 t ^+ ^1 i78 i5c o5W O41 O3A $i i70 i1c -^Ksil+6 -s@1sCn +^K sil +6 +s@1 sCn l '5 $8 K O37 O8B [ O67 c $f $u $l -[ ^I o1X c $8 $) i36 i12 -sOw'9s\e +sOw '9 s\e ^t ^a ^b o21 Y2 c $8 $+ @@ -46137,7 +45943,7 @@ sdl ^S { i3G sMT .5 $* O54 -s4H] +s4H ] *74 [ $* T5 z5 O2A @@ -46146,27 +45952,27 @@ i5\ *46 ] O24 z2 o1E c $D -$/$; +$/ $; i71 [ c $) $j ^s O06 i3K -i0,o8Y +i0, o8Y i0! O81 -o2coAq -s2j*63E +o2c oAq +s2j *63 E sXK $- K i30 i75 *B0 OB2 svm *13 O71 k *64 -*AB*39DB +*AB *39 DB s,h O57 -i1h-AD0 +i1h -A D0 sNk -*A5T4] -i5tsTq +*A5 T4 ] +i5t sTq o4> i78 i7b $% O52 @@ -46182,12 +45988,12 @@ y4 O53 ^K O64 o2b } i4b i5e i6r -oAE$( +oAE $( s0w -D3sH} +D3 sH} ^9 ^+ $2 ^_ -y3.1'7 +y3 .1 '7 y1 O19 { so3 i50 i13 @@ -46196,7 +46002,7 @@ i1c i70 OB8 D4 i1c i72 s7d -o3P] +o3P ] i56 i34 Y1 [ O25 -0 c @@ -46204,18 +46010,17 @@ $2 ^- iAT c i3d i4i r ^k -D5Y5 -i78*A5 +D5 Y5 +i78 *A5 *35 Y2 Y5 *53 i7l i8e i9s i5P O63 *86 -l [ ^f -*34o9m +*34 o9m { O28 O72 *76 -^&cs;* -+3+C +^& c s;* ++3 +C O5A Z5 D6 O31 y3 O65 +2 @@ -46229,8 +46034,8 @@ O15 k 'A $! t O85 z2 p4 ss$ O87 -^qsV( -$($- +^q sV( +$( $- } *32 t } k c $~ @@ -46248,10 +46053,10 @@ l $o $u $t i3@ O81 c $f $u $l u d $5 -Z3D6 +Z3 D6 O01 $n D9 E O19 -k-2.A +k -2 .A o2t *53 O02 q i50 i33 @@ -46263,53 +46068,53 @@ R1 -2 sA0 p4 oA2 c o29 -sQlD3 +sQl D3 *23 } -s-E[ -T1.8 +s-E [ +T1 .8 i32 i57 o7E { sz| O26 +2 sgb -D3Y5 -sSQ*B7 -p5Y3 +D3 Y5 +sSQ *B7 +p5 Y3 i3b R2 L2 +8 i9O Z2 o8o i2n i3n i4y *02 s@2 -o8<*7AE +o8< *7A E i45 i58 *A0 { -spno0# +spn o0# O5A k .3 O51 D2 ] -8 O12 i5b i56 *31 sE9 Z1 *69 -.2*B4D8 -o9w*32sTE +.2 *B4 D8 +o9w *32 sTE O28 q o8h c i8y c $. $1 $7 $1 $1 $6 $3 $2 i52 i61 i72 -Y3D7l -o4ws\2[ +Y3 D7 l +o4w s\2 [ i51 i7d $7 $5 $5 $9 $8 $2 $1 $8 sy8 } o5x i73 i7f -i6%sZl +i6% sZl O74 O23 L9 i59 i3e i62 i70 i80 -sA($E +sA( $E $9 $9 $5 $1 o2W T3 $4 *85 @@ -46323,12 +46128,12 @@ Y5 K O6A l ^g ^n ^i ^w .B O02 s.8 OBA -T7*54 +T7 *54 Z2 O24 i53 i39 sDv s9_ Z2 -.7$S +.7 $S OB4 K *68 i2d i3d i4y i5a i12 @@ -46351,7 +46156,7 @@ i3a i4m i5a i75 Z1 i3a i4m i5e -0 z2 -qs=f +q s=f c i4e i2p i3o i2m i3a i4s @@ -46398,7 +46203,7 @@ i3a i4c i5h ^^ $^ i1t i2a i3r i2a i3l i4i -'6sjy +'6 sjy *87 t O26 o18 u *02 ^s @@ -46411,7 +46216,7 @@ i3e i4k i6i i7l i2t i3e i4r i6i i7r -T3sV3 +T3 sV3 i3k i4e i4o i5n i6a i3w i4a @@ -46479,7 +46284,7 @@ i1b i19 o13 o2S '9 O43 *79 O8B -$Vi7? +$V i7? $F o7r l $1 $9 $7 $7 l $1 $9 $7 $9 @@ -46498,7 +46303,7 @@ l $1 $9 $8 $1 *31 +1 c ^2 i75 R8 R8 -i9ti1\o1t +i9t i1\ o1t o0/ z1 i54 R5 R5 i71 R8 R8 @@ -46526,7 +46331,7 @@ r ^z smt z1 { $2 ^. $2 ^$ -z5$4 +z5 $4 c $7 $? $5 ^. c $& $2 @@ -46551,7 +46356,7 @@ c $1 $) *60 -8 c $2 ^9 c $2 ^7 -saZi1k$! +saZ i1k $! s0_ [ *28 '7 c $* $5 @@ -46560,7 +46365,7 @@ l Z2 O83 c $5 ^8 c ^` $1 r Z1 k -*46R8{ +*46 R8 { c $1 ^7 c $1 ^5 c T6 i6_ @@ -46591,7 +46396,7 @@ c $+ $3 +2 $6 o3s r *43 suo -DAi4&*16 +DA i4& *16 ,9 DA Z1 d O65 O13 z2 @@ -46605,7 +46410,7 @@ d t D6 i6w $y i2D c *25 *61 o6g -oBmsB4 +oBm sB4 O42 .0 '7 o59 sbM l @@ -46686,14 +46491,14 @@ sna +7 ^D k ^X ,6 s91 -*4A]i6U +*4A ] i6U sHN t O46 O07 c T0 snv k $@ -i2|[sBS -s2z*BA +i2| [ sBS +s2z *BA $p *13 *15 ^H D6 [ $f @@ -46703,7 +46508,7 @@ k $d ^4 *31 ^9 z2 D5 $8 $D -iA_y5 +iA_ y5 $i *62 l +5 ^E o33 @@ -46728,7 +46533,7 @@ i60 *62 o8B D6 o6m ^1 u -3 ^E O51 -qz4 +q z4 c ^e ^h ^t ^W -6 ^H *63 @@ -46772,7 +46577,7 @@ i8v { $7 i63 ^Z *65 *52 o1a -+4srS ++4 srS u o4s i4b *45 $x D2 ^6 @@ -46784,7 +46589,7 @@ D1 ^Q $Z $9 *36 o0G [ $J -*84z4-6 +*84 z4 -6 o1e Z1 o74 smr *41 +1 @@ -46793,15 +46598,15 @@ Z3 O07 Z4 iAE $r K o9, [ r snw -z3sG2 +z3 sG2 s1R i0x *0A O09 C o31 -s2ip4+A +s2i p4 +A ^j } ^ ^y ^m s9L -LAy3 +LA y3 ] $O $n -1 K *68 @@ -46817,7 +46622,7 @@ o5l D6 $t *03 sWs O01 q O0B -$Hi6W +$H i6W *42 D1 Z1 o1o Z1 o7i L6 @@ -46830,13 +46635,13 @@ $3 $5 $! c o7$ r i1k '5 ^z -fY5,0 +f Y5 o53 u ^d $S -5 *79 p3 O65 *90 O26 -*62r +*62 r i4. t $@ OB1 sr] @@ -46847,25 +46652,24 @@ Y1 ^T $. Z4 $f Z1 O57 p3 O52 O2A -sfHoAm +sfH oAm s1q l O71 Y3 -o1DsYj +o1D sYj +4 O74 i42 *46 O93 -2 Z4 *41 i68 -$0y1 +$0 y1 $E -6 i4q *47 -*17o8h +*17 o8h O92 ^S ^1 -3 u o2i Z2 Z1 +2 -o77$.*41 +o77 $. *41 stJ -d O7A $a O04 -2 Y2 o4_ o7s o3e 'B @@ -46884,109 +46688,109 @@ k R4 O6B O19 } O83 o3m o60 -*23*B3 -'8]z3 +*23 *B3 +'8 ] z3 *12 i0a o0f ^7 *25 O13 ^I i0S $1 r O41 -,Ao6% -*1B^^ -*5AY5spr +,A o6% +*1B ^^ +*5A Y5 spr O97 ^O sO; o5D O81 -$.$' +$. $' o5a +9 -$/$) +$/ $) O31 *28 o5g Z1 -$?$~ +$? $~ +1 i18 -$_$; -'Bo8j -*18p5 -ksovC -^Y*35L5 +$_ $; +'B o8j +*18 p5 +k sov C +^Y *35 L5 O04 o10 ^s c +9 i8d -$]$= -$?$> -$$$_ +$] $= +$? $> +$$ $_ i3* O61 O71 O12 shs -i7Ro4%s^y -p3u +i7R o4% s^y +p3 u i6a z1 *78 i6k $0 O26 Z2 -L4o2Ik -o3}L5 -^d*68 -Y3i7s*54 +L4 o2I k +o3} L5 +^d *68 +Y3 i7s *54 L0 +1 $$ $7 o3 *53 -ksqP*26 +k sqP *26 O45 ^j $x k -sOW*20$G +sOW *20 $G *47 *34 ,A O48 i69 { D2 sgy -i9A*50^@ +i9A *50 ^@ -3 -6 o2a sml i15 r R3 s1j O05 Z1 $u O31 TA -*05LAi2L -o5j*A9 +*05 LA i2L +o5j *A9 o43 $1 t o0f -.Bo9F +.B o9F c si1 ss$ -R8i8' +R8 i8' i4k Z1 -o8#sOH +o8# sOH o8o Z1 O3B i1W ^s ^g u C i58 OA1 -i5Ai8^ +i5A i8^ siS -^x$p*A9 +^x $p *A9 u o1d sd) -i0fY4 +i0f Y4 o35 Z2 z3 o3j [ r +5 -.6sXv -c$1$2$3$< -c$1$2$3$> +.6 sXv +c $1 $2 $3 $< +c $1 $2 $3 $> ^8 $6 O3B sj ,3 o50 ^b -L2sW.i9Y +L2 sW. i9Y $X [ *56 R4 -*61iB@sSn -^X^x^X$X$x$X +*61 iB@ sSn +^X ^x ^X $X $x $X i3c i37 O43 $k -$_$# +$_ $# $c l $c t i12 i1c sBM i3d i39 skg -i21i39i47i55 -i21i39i47i50 +i21 i39 i47 i55 +i21 i39 i47 i50 [ o2G [ i0E i0E i18 i57 @@ -46998,16 +46802,16 @@ $H *60 l i36 i5c i36 i57 i59 i5c -$,$* -$#$- -$;$. +$, $* +$# $- +$; $. *98 +5 i14 i1b $/ i53 $1 Z4 i37 i57 -$&$_ -$'$( +$& $_ +$' $( i3e i36 s4m o3D Y2 @@ -47018,7 +46822,7 @@ i53 i1c O45 o4z i1f i34 $z *23 -i21i39i48i56 +i21 i39 i48 i56 s9% i1b i17 i1d i10 @@ -47037,45 +46841,45 @@ soG i1e i7b i10 i3e i5e i36 -$%$# +$% $# i5b i34 i5b i31 i1e i14 i13 i5e -$=$_ -i12i20i30i44 +$= $_ +i12 i20 i30 i44 i34 i7b i3b i1d l i58 i5f i33 i3f i30 -$($% +$( $% o2e *26 *31 C i57 i7b i19 i57 -$$$. +$$ $. i37 i16 ^9 OB1 } i5c i13 i5| c $9 $2 $6 $3 -i6W*B4 +i6W *B4 sPr -csS}Y5 +c sS} Y5 i8M O16 -*73*30sLV +*73 *30 sLV ^n R1 D2 K O36 y4 sRb o5x Z1 c $5 $8 $1 $8 -*50seT -Y1o2ly3 +*50 seT +Y1 o2l y3 $q k sc$ -iAb{*27 -sJ2,B +iAb { *27 +sJ2 ,B $X *56 Z4 $q O65 i7c i52 @@ -47088,50 +46892,50 @@ Y5 -A O08 iAX i58 i3b -1 K -y5l+5 -.0z2R8 -i4ero1! -$g-8d -se`T7*80 +y5 l +5 +.0 z2 R8 +i4e r o1! +$g -8 d +se` T7 *80 c $8 $0 $4 $8 -o8I$U -sxwo8] +o8I $U +sxw o8] iBN -z1y3 -z1$7 -sxfl +z1 y3 +z1 $7 +sxf l o30 O27 r -siGz2*30 +siG z2 *30 *50 i0B s#s y4 ] $n O0A ^/ -1 *31 r -ci6T +c i6T K *85 -]*ABsw! +] *AB sw! i7c i72 z5 O68 i7f i76 -,2o4u +,2 o4u ] *13 ] O93 C *65 O5B *95 -$ $* +$ $* sha -soKi2ds1P +soK i2d s1P Z1 o5@ .3 O72 l O95 *91 OB8 p2 OB7 o5t o1j -^ul*89 +^u l *89 *20 c *14 i14 OA8 s^G -p5z4 -sHR'B -^usEw +p5 z4 +sHR 'B +^u sEw o3n $4 i76 i3d i50 i7e @@ -47148,13 +46952,13 @@ c $4 $4 $@ $@ c $9 $0 $! $! c $0 $7 $! $! c o2L -u+4 +u +4 c $2 $1 $2 $! -s^'^u +s^' ^u $6 $7 $! $! -i8Os}I +i8O s}I i1c i3d -s*o-4C +s*o -4 C O19 Y5 $4 $5 $* $* i5[ @@ -47172,7 +46976,7 @@ c $1 $1 $# $# i1f i7a $2 $6 $* $* i76 i19 -*75RAsgv +*75 RA sgv $M $a $y $1 $3 $3 $@ $@ c $7 $7 $$ $$ @@ -47207,32 +47011,32 @@ $8 $6 $@ $@ iC_ *78 $9 $a $n $n $a -KR6 +K R6 -6 i4j -snIoAX +snI oAX iB% $6 $3 $* $* i35 i11 c $1 $6 $* $* *0A O06 s|. i19 i71 -+6+D -+6*A9*61 ++6 +D ++6 *A9 *61 iA^ c ^a ^8 -*52^Q +*52 ^Q c ^a ^b sZg D0 -2 -2 i5z ] ] -i9J*0Bi5$ +i9J *0B i5$ c ^b ^b -sDVo5/ -^usd0 +sDV o5/ +^u sd0 $G $A o4a t i2| -*7Ap5 +*7A p5 c 'F i52 i37 c $3 $0 $! $! @@ -47248,19 +47052,19 @@ o2) c $0 $0 $9 $! $7 $7 $@ $@ u d 'E $1 -csALy5 +c sAL y5 d 'D $3 C '8 $4 c si1 T3 su3 -ciA/s5d -sE3s%@ +c iA/ s5d +sE3 s%@ $9 $4 $* $* *45 { *25 $8 $7 $@ $@ i55 i31 u d 'E $7 -sP?s4I +sP? s4I i51 i36 i6) $4 $4 $* $* @@ -47274,19 +47078,18 @@ $5 $9 $! $! c $0 $3 $! $! iA! O56 O81 *23 *16 -syoszn +syo szn ^b ^b ^b ^2 c $9 $1 $! $! c $9 $5 $$ $$ OA3 O34 o1j c $3 $4 $! $2 $3 $? $? -^s*58 +^s *58 O68 ^$ -o75z4 +o75 z4 i70 i5b -[ $z -*A7q +*A7 q O03 l O28 *BA Z4 i5e i1d @@ -47299,38 +47102,38 @@ l oAf y2 O43 y2 c $1 $2 $? $? $D O26 sT& -i6IiAu +i6I iAu i56 i16 $1 $2 $3 $4 $5 $6 slo +5 -z2oBc +z2 oBc i76 i33 $8 $6 $* $* -D3sX- -*65*94 -o7do34 -r'9 -[i5d +D3 sX- +*65 *94 +o7d o34 +r '9 +[ i5d *72 OA9 OA3 +6 o74 -*80D1 -u.9k -*07$c +*80 D1 +u .9 k +*07 $c c $3 $1 $1 $! c $6 $4 $! OA9 o2v -DBo1i -*49*67 +DB o1i +*49 *67 { i65 -o61sPJs5n -i38*31o79 +o61 sPJ s5n +i38 *31 o79 $4 $6 $! $! ^6 ^5 ^4 ^3 ^2 ^1 -smFZ5si! +smF Z5 si! $2 $7 $@ $@ ^2 ^5 ^6 ^3 o1J OB5 -o9nY2*06 +o9n Y2 *06 c $8 $8 $@ $@ K o3c i2j i3a i4n @@ -47341,8 +47144,8 @@ O74 *27 $m $a $r $1 $2 $s $o $n $a $m O06 RB -,6o97s4f -rl*4B +,6 o97 s4f +r l *4B *32 O24 $3 $9 $2 $@ $@ O62 s;- O4A @@ -47352,80 +47155,80 @@ O61 sj- o7V Z1 O37 +6 c o4S OA3 O21 *A7 -Z1i5k +Z1 i5k +4 Z5 O58 i6Z u -o77sEq*93 +o77 sEq *93 sRv Z3 O26 -saisLf +sai sLf i13 i7e -sVMs!\ +sVM s!\ Z2 Y1 O87 ] O29 *92 O97 i7# [ i39 i3d i52 i1d i1a i7f -o3Z'B*51 -k$U -^z}*B9 +o3Z 'B *51 +k $U +^z } *B9 $0 $8 $* $* -s6Ly3 +s6L y3 swp -i9uRB +i9u RB O53 O85 z5 c $5 $0 $0 $! $6 $7 $* $* -i3,s$b -p5*63-8 -$Y-7k +i3, s$b +p5 *63 -8 +$Y -7 k i5> k ^r i11 i1c $3 $2 $! $! -Z2R1 +Z2 R1 c $5 $6 $@ $@ -o2-s,C -o1jY2R9 +o2- s,C +o1j Y2 R9 c $1 $1 $? $? -o5Ri9} -^{*58stI +o5R i9} +^{ *58 stI $3 $9 $* $* $1 $4 $$ $$ d 'O y4 D7 D7 i34 i3c --7s+oo5Z -sWZ*B4 +-7 s+o o5Z +sWZ *B4 c $0 $1 $$ $$ -z2*12D9 +z2 D9 $? O26 .5 *16 o3s ^' -tz2LB +t z2 LB O1A Y3 $1 $4 $* $* O36 $. $0 $2 $! $! -oA;K*30 -$@$^ +oA; K *30 +$@ $^ $2 $2 $$ $$ i38 i55 $j $a $n -i4Ss?' +i4S s?' O85 iAG *A6 -s^,oAF +s^, oAF ^7 -3 -*ABseK +*AB seK $z O71 O54 Y3 -*41Z1 +*41 Z1 C o6b -'9*08sRU +'9 *08 sRU s?E c oA6 -]o2!s[( +] o2! s[( s'r *37 $R s9Q @@ -47435,7 +47238,7 @@ i6@ K D6 O16 sIK E +4 siC l -*0As;@sqJ +*0A s;@ sqJ saC saZ u i5. @@ -47446,7 +47249,7 @@ O91 i0L sYi Z1 $U o5G D6 -stR*57 +stR *57 o6t ^u ] ] *13 Y2 y2 @@ -47469,27 +47272,27 @@ oAA O15 i30 i55 O63 Y4 *75 Y1 --3T1 +-3 T1 $5 +3 *16 ,6 *46 *A3 O43 -iAE*27$Q +iAE *27 $Q sN3 i37 i55 i37 i51 -s]hsBU +s]h sBU ,4 i7y $4 O58 -sBC*50 +sBC *50 O06 z2 $A '6 s6T O17 *97 l *37 O94 $k ,4 sfn *A4 O35 -i0rtLA -^6*98 -z5o8Dy1 +i0r t LA +^6 *98 +z5 o8D y1 C ^5 $z ^x i4G +1 @@ -47507,7 +47310,7 @@ O73 -1 su- -0 *32 i3f i79 *35 *51 -T8*69k +T8 *69 k f ^t O17 u i7R sa5 O62 @@ -47516,19 +47319,19 @@ $F ,1 Z4 O65 $q i3b i76 C +1 -iA7o3F +iA7 o3F *26 i7t -s93Y1^M +s93 Y1 ^M y2 *57 s90 Y2 O46 d iB4 sWF Z3 T3 O02 -^d.4 +^d .4 O34 -5 O34 -7 -*85i6/D7 +*85 i6/ D7 O83 Y1 O48 s1^ OA3 sY3 @@ -47539,11 +47342,11 @@ sVF i5d i77 sXT i72 i34 -sDd-5Y4 +sDd -5 Y4 i2b t i1e i7f s9^ O5B -C*14-8 +C *14 -8 OA2 ] i96 ,2 O87 set sCs @@ -47551,11 +47354,10 @@ z3 O48 $Z O56 .1 y3 c D9 +8 *87 -s]cR1 +s]c R1 r $V $4 C O03 sHU -o6s E *51 $2 O94 i74 i5b i1e i13 @@ -47584,14 +47386,14 @@ O57 p2 ^Y *65 i57 i34 i1o i2t i3h --4^F,B +-4 ^F ,B i1c i51 -*60*72'3 +*60 *72 '3 i5b i1b { scs +4 Z2 OA4 z1 *56 -,BD0 +,B D0 ,5 D8 sKO ,6 { @@ -47602,7 +47404,7 @@ i4K y5 } D5 z1 K i5A *06 z5 O59 i9L -o5Z] +o5Z ] sl` i7f i56 ,8 +9 @@ -47624,13 +47426,13 @@ i51 i35 i51 i32 ^9 p4 O91 s A -cs)CL9 +c s)C L9 i56 i1e i11 i79 -*63*47o2c +*63 *47 o2c sng i3t i52 i7b -$?$= +$? $= *21 C i4_ O84 ^i O7A z2 @@ -47640,8 +47442,8 @@ o0G p1 sb+ +0 O53 O73 -4 $B *56 -o5Ss2e -.8i3. +o5S s2e +.8 i3. i5a i1c sy6 Z1 ^' @@ -47650,16 +47452,16 @@ i7' O73 i7b i56 O18 *06 { D8 -*79slI +*79 slI i32 i40 i52 i61 o3Y i56 i3c -u.4 +u .4 i58 i5d sy' } p2 O05 u -s0GDB -sD*DB +s0G DB +sD* DB ^r u $9 +3 $U $S @@ -47668,69 +47470,67 @@ Y3 *61 O23 +2 i6A u O14 i1[ -o66i9g*95 +o66 i9g *95 O16 *2B O17 i79 -p5Y4 -]i5O -seqsKt +p5 Y4 +] i5O +seq sKt [ o6N *10 -0 o6p $X O12 k -$@$< +$@ $< i0I O53 -s1P*09 +s1P *09 T3 OAB oA& *42 Z1 D1 *52 ] i52 i60 i71 i84 -i12i20i32i41 +i12 i20 i32 i41 O14 $M Z1 *75 $m ^M *16 ] T5 i7A ^t O37 o3f $1 -*69i7Ns%^ +*69 i7N s%^ d O65 O52 i31 i7c i38 i56 -T3i2EiB" +T3 i2E iB" sKI -sRMo7^ +sRM o7^ k O16 oAJ R2 i28 -+0y2 ++0 y2 sJV K i4S o59 sPS D1 L0 -o9hd +o9h d O05 -4 -*76z2 +*76 z2 i37 i11 Z4 O23 -s&_o4XTB +s&_ o4X TB .0 .6 *01 *15 *13 .1 *60 sM4 $l ^O -z4Y3 +z4 Y3 i1e i17 o14 ^6 i42 i50 i62 i74 $w k -o0i c O71 sar i41 i59 i66 i74 [ O14 s2V O43 y3 sHW -*13 Z1 [ O52 shw ^9 i2+ i7c i79 @@ -47749,17 +47549,17 @@ oAn O26 ^L ^B O83 -0 *39 +6 -1 -2 -$XoBn+7 +$X oBn +7 [ i58 O72 *15 O93 ] -cp5smh +c p5 smh +7 -4 -0 O75 y3 +0 -8 -4 +2 +6 -5 -Y3rsCj -s1sR3 +Y3 r sCj +s1s R3 *2A Y1 O74 ^v O56 z1 i8a @@ -47780,7 +47580,7 @@ sfZ $l -1 -5 -4 i5f i74 +C -4 -$!$^ +$! $^ i7e i56 i55 i3d $! *45 @@ -47798,17 +47598,17 @@ p5 O57 *27 *76 i30 i57 ^5 y2 -K-8{ +K -8 { t ^d sC% -s8F*93*5A +s8F *93 *5A ^{ K o0I --A$Ci9o +-A $C i9o $6 k i3f i73 $u t -^Y*31 -o0=sKg +^Y *31 +o0= sKg i7f i5d i13 i57 '7 o1n @@ -47832,15 +47632,15 @@ i5k D2 -D -E -E *23 i0F i79 i3b -i7Ft*2A +i7F t *2A i7b i77 ^a ^v ^i ^v $t ^p +A -E -$'co8L +$' c o8L i7e i10 +5 +A +A -o3V*96 +o3V *96 ^o ^l ^l ^e ^h ^r ^a ^m ^m ^a +5 o2q @@ -47854,9 +47654,9 @@ i75 i3b i75 i3f +2 -5 -4 o0s Z2 -^BC +^B C $ *84 -s7.r$S +s7. r $S so. s1u *72 O73 @@ -47864,18 +47664,18 @@ sqs [ O93 *12 } ,4 d --A-4u +-A -4 u i54 i3b +1 szl ^k ^a ^k ^a ^k -.9K +.9 K ^# ^@ +4 -C r ] i0Z O61 O8A $) s'f oAV -]rY1 +z1 ] r y2 O47 i70 t s1$ @@ -47895,11 +47695,11 @@ R1 O23 *42 ,1 ^z i4_ r i0Z ] -o7 OA6 O19 C y4 -^/s6S +^/ s6S i4g l ] O42 i3U t seY *30 Y2 -tL7 +t L7 i77 R9 L9 -6 *96 *04 ^P @@ -48110,14 +47910,14 @@ O36 +3 $p $i $e $c $e O47 } ] $9 $! -T7i5P +T7 i5P ss2 T4 i3c '6 -+9*56 -cs.! ++9 *56 +c s.! sl9 i52 R8 L8 -kEoA{ +k E oA{ o3i OA5 O43 R5 -8 $w @@ -48126,15 +47926,15 @@ Z1 i58 p5 $h -2 l +7 -8 O14 -T5*A5*17 +T5 *A5 *17 ^F u y5 $2 i3d R5 L5 D0 t O36 sqe -}s5T +} s5T Z4 -4 O95 -i8y*59 +i8y *59 $q O86 Y1 i1a R3 L3 i51 R0 L0 @@ -48143,82 +47943,81 @@ i4 Z1 l $0 $9 $0 $y Z2 d '2 -$1y3 -*38$6 +$1 y3 +*38 $6 D6 o3F $@ O92 O83 oAo -7 i7e R8 L8 t ] { -sb-o0k -l^1$1 +sb- o0k +l ^1 $1 p2 O17 } o53 -s/}rp1 +s/} r p1 i4o +8 -iBzud +iBz u d } o5v i92 OA6 $4 -0 ^I sw8 O02 s," O61 -s5EspK] -o8,Z3 -RB O67 '9 +s5E spK ] +o8, Z3 +O67 '9 c sSa *02 -o0m*93 -*72Y2*0A +o0m *93 +*72 Y2 *0A O16 O72 k *3A O85 o60 -,A.4 +,A .4 D6 OBA p3 $3 l '5 $0 -Z2*B5s`O -$mDBl +Z2 *B5 s`O +$m DB l +0 R2 -6 i3i OA4 O03 -D6 $f [ D1 d OB6 Z3 OB5 p3 *75 ^, O28 -*B6fs{# -D5*86 +*B6 f s{# +D5 *86 *8A O46 Y4 .6 O71 -s4@*65s -i62i70i83i92 +i62 i70 i83 i92 $g $n $. ^6 suc @@ -48749,7 +48546,7 @@ i2e i3l i4i y2 -4 p4 z1 ^x c T6 T2 -Y1R4 +Y1 R4 $y $e $a $h O65 T9 .8 s-k O49 DB @@ -48757,7 +48554,7 @@ $X E $% ^1 $3 ^# O24 ^W -$Ts/nl +$T s/n l *13 *68 iAp $7 O03 *20 @@ -48776,9 +48573,9 @@ O19 s4/ O67 '9 R8 D4 K sah $a u +0 -T7*7A$h +T7 *7A $h ser -Eo0zo2v +E o0z o2v i6i svt T5 *67 o5i 'B @@ -48789,19 +48586,19 @@ i9N O2A se1 i57 i3c i57 i3d -+9oA( ++9 oA( i7d i39 i7d i31 '9 ^! Z1 -6 -Z3C +Z3 C i16 i7c i51 i13 -D4qoAZ +D4 q oAZ ^3 -6 saW s;# O23 sm+ -s%7^` +s%7 ^` i53 i30 $9 ^- iBS OB7 @@ -48824,11 +48621,11 @@ O21 Z5 *87 Z1 *56 Z5 O53 Y3 O8A p5 -Z4u -i9KK +Z4 u +i9K K +9 +D i59 i5f -s0rsyS +s0r syS ^- ^8 O38 T2 Y4 p1 s5b O73 @@ -48841,7 +48638,7 @@ f O2A OA6 c o1A O61 R7 o6o *20 O15 -R7*32 +R7 *32 i7d i1d O64 sI1 *90 *42 ^g ] @@ -48854,23 +48651,23 @@ i2r i3i i4e D1 sn_ i1u i2c sr! -*47$R -^Ns\Q -i7ks7k +*47 $R +^N s\Q +i7k s7k o69 D1 $f $r $e $a $k -KiAEs-S +K iAE s-S Z4 OA5 -sK%$W +sK% $W ] O64 +6 sTc O13 RA *36 *13 O24 $U O89 O47 i4& -L7s7S +L7 s7S i3b i1b c ^2 ^# -sECsWV +sEC sWV O3A sgp f i4g r $< oB4 @@ -48888,7 +48685,7 @@ o5@ *24 D4 *87 OB4 O57 o69 $f -i12i20i31i40 +i12 i20 i31 i40 i59 i3c i59 i3d sFA @@ -48901,17 +48698,17 @@ r O64 saD ^- O63 O2A *12 *06 -*94s!W +*94 s!W c i29 i3b i1c i1o i2m i3m $a +0 u -R4i43o9z +R4 i43 o9z i2m o52 l $. $n $l i3b i51 p4 *82 *10 -*91Z4D3 +*91 Z4 D3 sre D5 i10 i72 i75 i1d @@ -48924,7 +48721,7 @@ O59 *85 O46 i57 i39 r +1 +6 -9 +6 -*15o4S +*15 o4S sVN O8A sH6 O03 ,6 D2 C @@ -48937,11 +48734,11 @@ i33 i14 { +1 o5f i41 *04 O08 p2 -*56*B2$& +*56 *B2 $& $. $m $c -A LA O53 ^b -syss#^o9g +sys s#^ o9g szx *84 i9@ O65 c $1 ^= @@ -48954,8 +48751,7 @@ $i k Z2 +8 i79 i1c i79 i1d -s3ToBeo7t -D0 $m +s3T oBe o7t ^i ^o ^a ^y ^. O16 z2 +6 -5 -9 @@ -48967,10 +48763,10 @@ t o8h p1 OB5 p2 O39 c $6 ^4 -s -+3s;< ++3 s;< s4X i32 i3b -4 ss] O98 s.k sgE -i2L*0A*32 +i2L *0A *32 s7D O12 *32 O14 -8 -s'ho8B +s'h o8B O24 '8 sae *74 i3C u D2 -i1,sZ| +i1, sZ| O18 T5 p1 +6 u D6 D9 OA8 s}u LA '7 i44 i52 i60 *75 *13 -szSi9Ki3! +szS i9K i3! c $i $c O14 $n ^M i2b i3e @@ -49608,80 +49402,80 @@ $6 $1 $2 $0 $? $1 $9 $8 $9 z3 O39 $3 $3 $1 $9 -tsC+Z3 +t sC+ Z3 Z3 O23 l $7 $3 $9 $8 -+9s.[ ++9 s.[ '6 i24 i32 i40 -*76.2 +*76 .2 u i24 -*32{,A +*32 { ,A o0S sgL Z3 OB4 -sczo9. +scz o9. shY sc2 c $_ $7 $1 $1 syt O8A -^v*0B +^v *0B $3 $4 $8 $3 -Es[xo0* -$#$. +E s[x o0* +$# $. $O D4 c K p1 l '5 $9 -i67u +i67 u o0b *43 i2n i3c *49 O67 *14 $7 ^O Y4 -L4R8 +L4 R8 o1( u -D6*A8 --2i40scY +D6 *A8 +-2 i40 scY [ u O41 D7 Z2 i2i i3m i4e -p1sTE +p1 sTE +3 y1 O23 q i38 i7b -k*86 +k *86 i7r i8o i91 oAy O51 D5 D6 L6 r $o $l -i0 i6x i71 i82 i2c r .0 O74 i4e i5k -*68sG\ +*68 sG\ o5? i6? i4e i5c $. C -*53L6y5 +*53 L6 y5 O34 o3y u i21 ^2 i5r i6u i5r i6t O67 sU\ -*A6*B5,A +*A6 *B5 ,A $Q c *09 O34 o5h Z2 [ O84 seh $8 *13 -*B5swf +*B5 swf siz O01 O7A s2h O3B OB2 ^] i5n i6g ] { *56 ^- ^6 -iB_*24 +iB_ *24 o7. -2 i1o i2r i3r $c z1 o07 D2 -Y2d +Y2 d R5 Z2 *41 E O7A *01 -i9)sC] -$($! -$$$+ -$+$} -$;$] +i9) sC] +$( $! +$$ $+ +$+ $} +$; $] i2s i3u O51 O25 i3k -$-$/ +$- $/ ssj -i3T*32sjs +i3T *32 sjs O13 -0 K ss. ss7 @@ -50293,17 +50085,17 @@ i8b i9e iAr OA1 i2D sjr i8t c o2a swr -$ $+ +$ $+ u i5Y s0^ Z1 *78 *62 -$^$? +$^ $? c T5 i5. -i3"*2B +i3" *2B i54 *31 i9t iAe iBr i2s i3k -*A2*87 +*A2 *87 +B O89 s;e O24 $g i5a i6y @@ -50311,20 +50103,19 @@ snh *84 O54 i0o +7 svM p2 O45 -^2r$l +^2 r $l $. $s $h i5g { oBn [ -.0LBT2 +.0 LB T2 i6t i7y i81 i9t iAi o1i ^r +2 T6 -*42 ] ^g *B4 O37 i8v i9e l ^d ^r ^o ^c -E[-6 +E [ -6 i1e i2l i3e i5g T1 st^ @@ -50426,7 +50217,7 @@ O03 p5 '9 l o5, i4w i5a l o5< -L0y5+B +L0 y5 +B $q -7 O41 o0U i3f i4a i5n @@ -50492,7 +50283,7 @@ r o3p i1a i2r i3r i8n i9i ] i3r -*80z2} +*80 z2 } Z3 $S c .8 i20 i32 @@ -50502,12 +50293,12 @@ O04 p2 i2e i3n i4t i6d l o1A Z3 -y2L0 +y2 L0 +B O7B $r i6n i6o i71 i81 i3v i4a -^=*68 +^= *68 i7s ^j so0 se3 u k ] i2_ @@ -50542,13 +50333,12 @@ y2 O42 $- T7 i32 so\ O16 c Y2 -o1&s^3 +o1& s^3 *54 'B Z1 l *69 $f O57 Z1 $S O32 s8l ^P -O15 E '9 *83 $3 $9 $! o6n o7- @@ -50556,7 +50346,7 @@ sLf OB9 i3i i4e $1 $2 $3 $^ s8B -z2}LB +z2 } LB i4p i5e z2 $A i4e *34 @@ -50569,7 +50359,7 @@ i0K c +1 u i5E $Z D2 i51 i69 o78 -i4Aszxo8\ +i4A szx o8\ $! o6o i3@ '8 -2 $3 @@ -50578,7 +50368,6 @@ i4r i5i i10 T2 .3 O82 O42 i1a o48 -[ $u sdr $1 ^F O25 i4r i5t @@ -50590,7 +50379,7 @@ Y2 E i52 *17 O71 O25 O51 +2 +0 E R2 -T2^IsY| +T2 ^I sY| i80 i96 ^h y3 O12 oAs O42 @@ -50614,10 +50403,10 @@ O42 O92 p3 $d stm T7 } c $& $4 -o7^ss# +o7^ ss# f O34 T8 DA } -+1z2*34 ++1 z2 *34 i59 Z3 ^r o81 O32 .5 @@ -50646,8 +50435,8 @@ o1k ^i T6 O41 i8s OA1 '5 $r -o1&*B2s2T -T2$8*84 +o1& *B2 s2T +T2 $8 *84 i7a ,3 i86 i96 i1a i2n i3k @@ -50656,7 +50445,7 @@ i0K +1 c i7t i8e i9r O82 c O82 u -uR1i5B +u R1 i5B i4( i5e i6r i71 +3 z2 @@ -50665,11 +50454,11 @@ D3 OA1 D4 u o7I ^W *75 K *40 o0B -*A7*B2 +*A7 *B2 R2 +1 -Ey2 +E y2 i9o iAr -*9BsTs +*9B sTs i8a i91 iA0 $o k l i6* @@ -50691,7 +50480,7 @@ i6H Z1 i4i i5a i6n c ^1 ^e ^h ^t ^M sr1 -$h^z +$h ^z i7k i8e i9r +4 o7T O52 $O @@ -50703,7 +50492,6 @@ c se3 T7 O32 $L i7t i8h i22 i37 -Y2 i52 E [ oA4 } i22 i30 ^C ^A @@ -50724,8 +50512,6 @@ $. $g $s i8L $k sbp i7! i4u i5l -s2j E *63 -d O29 $z D5 o5< $+ .7 i8l i9o @@ -50749,7 +50535,7 @@ i1u i2c i3a +7 ^G [ ^X *12 p2 r O34 -*70shZ +*70 shZ $0 .4 +5 D4 z1 o7b *34 @@ -50813,21 +50599,21 @@ o8i $k *45 *72 c $$ $5 i2r i3i i4n -p2*B2 +p2 *B2 +2 ,4 +A D2 i5a i6m i7a O84 -7 -o8ly2 -R7].8 +o8l y2 +R7 ] .8 O05 y2 '6 i00 O97 c sA6 *76 O57 O04 z5 -Z1*64 +Z1 *64 O04 'B *78 -i8fi1lsLJ +i8f i1l sLJ *B6 O95 $c Z2 l $2 $3 $4 @@ -50838,7 +50624,7 @@ oB7 D8 srK O4A *68 O48 s45 O83 L7 -sUC^A*B5 +sUC ^A *B5 *02 s@G O56 p5 ^Z ,3 O5A ] y4 @@ -50849,7 +50635,7 @@ o7s O93 ,7 K sqZ l sa4 sg9 -sM($z +sM( $z o6n $y svg OA4 $k @@ -50863,10 +50649,10 @@ $? +6 $+ O53 r o43 O8B *24 iAp -*30s;Rc +*30 s;R c o20 Z1 $3 i66 -oBc.4 +oBc .4 *57 *53 l O27 ^2 .5 o4d @@ -50876,26 +50662,26 @@ o6H *0A O34 -4 O29 *12 i2- *43 -*56*BA +*56 *BA s7- -L6*B6 -*B3L7 +L6 *B6 +*B3 L7 R0 O25 o0v i75 O17 stz o4z -*6AL5 +*6A L5 Z3 O25 { *A9 i4a i5g Z5 O46 Y3 i4a i5b $- O52 -sPm^1*74 +sPm ^1 *74 i2b O14 sd" $P O78 iBP OA9 ^B -L7*3A -Y2sjc +L7 *3A +Y2 sjc i4a i5a +A O95 $j d i5m @@ -50904,43 +50690,43 @@ i1o i2o i3n OA2 O17 i2d ,8 $L O73 -sjp$z -'8sfC +sjp $z +'8 sfC i8e i91 -D5iAa -T4iB& -$g*3A +D5 iAa +T4 iB& +$g *3A o4w ^l -'A$Nl +'A $N l E O72 l '6 $4 *68 O21 -*80y3 +*80 y3 u $1 $9 $8 $2 O21 O5A z2 O93 O0B i6n o1- -D4L8 +D4 L8 O36 f t -R7*0A +R7 *0A O23 p2 O82 -i0Gs^u +i0G s^u Y5 O56 O01 -$4i51oA< -*4B]u -ssBi77*08 +$4 i51 oA< +*4B ] u +ssB i77 *08 i4e i5r i6b $x O79 '8 o7/ O65 $+ i5p i61 i72 -D2D9 +D2 D9 *B0 O36 $8 O28 su- +5 ,B s0k O97 s_< i99 O01 -*12*A8 +*12 *A8 T2 TB sK# O72 s4| q seW O5B @@ -50954,64 +50740,63 @@ Y2 $p y5 O93 oBf O26 $2 R6 -O81 '9 p2 *30 i54 R4 -i69s]ZD7 -sLoT1 -sSe] +i69 s]Z D7 +sLo T1 +sSe ] i59 L4 *16 r $# O5A O95 *70 *61 -T9*38o7a -R9Ky4 +T9 *38 o7a +R9 K y4 i36 L3 R5 Z4 O87 s/x OBA $d -sbpi7!s_) +sbp i7! s_) ^3 R1 D0 ,8 l '5 $7 -[s]ok +[ s]o k O03 o48 -s-GZ2 +s-G Z2 ] *6B OA8 Z1 i5e y1 O73 l O86 K ] O79 *30 --5]sXw +-5 ] sXw ^4 i7@ -s+>$eshQ +s+> $e shQ .1 *62 -$0sqys&V +$0 sqy s&V *06 ^h -i9ndspP -i6esF\ -*02*90 +i9n d spP +i6e sF\ +*02 *90 $n o2- ,8 *34 -fsq$ +f sq$ O32 OA4 E d OA3 R0 O12 O21 O68 Y4 -oB2+0 +oB2 +0 *41 i6s $d ,9 i0t z2 -sTKq,7 +sTK q *67 .8 -d*17 +d *17 sa@ c *80 o0k -'9s.8 +'9 s.8 O08 ^f i4h } o8G [ D6 O94 s/_ O52 -DA^a +DA ^a z1 O28 i1_ D5 *59 O04 r @@ -51028,12 +50813,12 @@ sea O38 $7 o7u OA7 OA8 } [ O13 $m -li3C +l i3C D3 c -1 OA7 i3K O18 -^0oA, +^0 oA, $i O36 -s9v'8-8 +s9v '8 o86 *53 OA2 oB; o2Z [ @@ -51044,7 +50829,7 @@ D8 Z2 i5e R0 L0 c i1- $, { O01 -s7Vo4F +s7V o4F q o8m DA *86 O84 ^/ c @@ -51054,18 +50839,18 @@ sq- O94 Z2 p1 OBA i72 R4 L4 -i9^l +i9^ l $C $D $p ,1 i7e R9 L9 p2 O37 -$|sLy +$| sLy $u d O58 i37 R5 L3 -ld +l d +7 i1p t i5g -R5-5sjQ +R5 -5 sjQ o6# Z1 i5e R8 L8 O08 O49 @@ -51084,15 +50869,15 @@ O62 q y1 O32 O24 ssh k Y3 O03 z1 -KsA>t +K sA> t *08 O97 r c i8a O51 *48 y4 -8 -T1s(i +T1 s(i o5k *21 O75 i2x -D4^g +D4 ^g *30 -9 i1f R4 L4 *25 *45 $p @@ -51102,89 +50887,89 @@ i5a R0 L0 ] *83 $> O65 s3b i72 R3 L3 -svoo7o +svo o7o i57 R4 -ls|!$w +l s|! $w i1e R6 L6 R5 *41 Z2 o4B O52 *A1 O17 *98 O96 OBA O03 $O -s3p*89 -*2Bi9wi12 +s3p *89 +*2B i9w i12 *49 O03 q -u*9AT4 +u *9A T4 O04 z1 sYl O42 O35 i3b R0 L0 -*9B^N -*08sHD +*9B ^N +*08 sHD R8 -5 o7 O02 p4 O85 ,5 O23 z2 O79 O68 -*18s{\ +*18 s{\ c i8# -+9o7] ++9 o7] o7s she o2P O61 -s#to8> +s#t o8> O51 i0w z2 O35 *03 i71 R4 L4 u ^0 ^1 i73 R5 i72 R6 -*7B-2 +*7B -2 o6 o8o [ O39 *07 o6z O4A [ -KoBQ +K oBQ i1a i2u *12 O52 O63 $6 O2A o2, $5 $x +8 o00 -*B3i80c +*B3 i80 c c $6 $x -*12'7E +*12 '7 E o9w *32 O32 $t i6e i7y i81 -E[svq -$xy3*A7 -o8-*68 +E [ svq +$x y3 *A7 +o8- *68 i1e R8 L8 -lKz1 +l K z1 c $c $7 i52 R4 i2l i3l i4i -*A9{^b -swn^/ +*A9 { ^b +swn ^/ i56 R4 -*3BD3z3 +*3B D3 z3 s-o -,1y3 +,1 y3 u ^a ^4 -s.j] -s$RswQY5 -]^mo81 +s.j ] +s$R swQ Y5 +] ^m o81 u $D $A +1 q E ,9 OB1 p4 d sbh -L7RA -*5A] +L7 RA +*5A ] $1 ^& -4 o1B o0p i42 i5@ p4 o2f } -$Ws}X +$W s}X smt o3p o2f r $r $o $c $k @@ -51192,7 +50977,7 @@ $r $o $c $k c $3 $e { i5i c $B $2 -sS.*21s3{ +sS. *21 s3{ C s04 $C $B $1 $k @@ -51200,25 +50985,25 @@ Y4 *1A O8B Z1 } o12 O17 $1 -9 O18 TA -rz1*42 +r z1 *42 OA2 *20 .A K K o2- i1t i2a O82 o3% O56 O05 D1 -*0A] +*0A ] O4A i3q -^i-1 +^i -1 -6 $p -2 { i5r -sY`i6y +sY` i6y Z1 *56 i5m sLP c T5 so0 -*5Ao33 +*5A o33 ^F ^d -o2V*2B +o2V *2B ^2 ^x q O24 z4 O84 @@ -51227,30 +51012,30 @@ o6t o36 K OA7 *54 O03 i8d i9a -*63s^4] -sDsDB -iABse- +*63 s^4 ] +sDs DB +iAB se- O35 *91 OB1 i1f i5f $8 ^* -s9Zs+{sXo +s9Z s+{ sXo *51 $z D3 O13 ^@ c $9 $+ ^@ ^3 -sZH*35 +sZH *35 c $< $1 -sVf$Q -s!/c +sVf $Q +s!/ c sMV O16 .1 i76 i5c i76 i5d +D -7 -sT\*2A] +sT\ *2A ] ] *72 D4 -$As"{^a -R2*69shx +$A s"{ ^a +R2 *69 shx O05 q ^B ^D ] *23 @@ -51517,7 +51302,7 @@ $m $0 $9 z1 $% O23 K ^2 -i6U sU $i +i6U sU $i i89 [ ^H O35 c so* @@ -51865,7 +51650,6 @@ s1D s1g sPS k [ D4 d -R6 $5 [ D3 i1c i2V p3 *30 o82 @@ -52094,7 +51878,6 @@ $p *04 R1 R4 Z1 O0A O13 *34 -'9 $6 O81 $T $C i4 -0 OA1 *24 @@ -52199,7 +51982,7 @@ K DA s,j -3 i34 Z1 *24 -i2/ O02 +[ o0/ OA1 oA6 O47 '9 r i4v @@ -52321,7 +52104,6 @@ i3i i4p } o3p ^k l ^l ^a ^m k p2 O62 -$J [ i1a i2s i3i *57 i8b $! C @@ -52404,7 +52186,6 @@ i46 i52 i6e i7v i8e $. $b $b $. $b $h -$f O01 i3z i4e i1w i2a i5y i61 @@ -52650,423 +52431,420 @@ l $5 $1 $6 $3 $0 $9 $9 } o7? y4 o8h -s{wo8o +s{w o8o sNP -s[}*45l -ts=).5 +s[} *45 l +t s=) .5 O01 sw] z1 $v O38 -*B6$W -D0i3es`} +*B6 $W +D0 i3e s`} l ^k ^c ^a ^b c ^2 ^4 ^9 ^1 -R9s"Qi0Q -[ ^Q +R9 s"Q i0Q O91 R8 ,B -y3*BA -y4sW! -R6iB? +y3 *BA +y4 sW! +R6 iB? l ] $v --3sS$ +-3 sS$ s1J -^RsaQ +^R saQ l ^n ^e *13 O27 l ^2 ^1 ^0 ^2 l ^s ^i ^h ^t -i7usw% -o7li89 +i7u sw% +o7l i89 c $b $e $l $l o5p OBA -*96*01 -i7#sHhsQF +*96 *01 +i7# sHh sQF l ^o ^n ^o ^m -us`asV, +u s`a sV, l $i $l $e -s%0D5-4 -T6*97 +s%0 D5 -4 +T6 *97 ^@ O46 O91 *6B ^y -i8-s"* +i8- s"* $. $n $o ^N O54 O7A -*A7y5 +*A7 y5 *02 sKG OA1 -^q*58 +^q *58 ^5 O78 -[ss] -+7*05 +[ ss] ++7 *05 r $i $l $y -$1^a +$1 ^a O12 svk Y3 l ^r ^e ^v ^o -iBko30sGh -l [ ^g +iBk o30 sGh D4 i1i O69 O38 D8 O82 T2 *A1 -^NRB +^N RB l ^l ^o ^o ^w s0D l ^d ^e ^b l $i $z $e -s[Mo5f -L5TA +s[M o5f +L5 TA sP] soK O43 iAw p5 O92 -Y4sGY -T1Y1 -z2*35 +Y4 sGY +T1 Y1 +z2 *35 l ^r ^a ^p l $y -y5s%Y +y5 s%Y RB O04 *A8 -Y3iB; +Y3 iB; l $i $n $e l ^m ^e -sJ#l +sJ# l *07 O28 p2 -C*4Bi60 +C *4B i60 l ^9 ^9 ^9 ^1 c $s $e $x $y -s#"Z1o0N -L7*02 +s#" Z1 o0N +L7 *02 TB O71 -[u-8 +[ u -8 l $l $y -seV^F*B5 +seV ^F *B5 c ^a -spF*64 -$Qs0To9+ +spF *64 +$Q s0T o9+ c ^Z -*25+A +*25 +A O04 'B -L7*2B -Z5s<) +L7 *2B +Z5 s<) c $m $i $k $e c $l $o $n $g o7? E $z s$t O64 [ Z3 $a i11 '9 -s_.i7u +s_. i7u $R ^8 i8a O3B -^Ys*y*0A -*79s;i -$.T4 -$gssy -sL=o9EL6 +^Y s*y *0A +*79 s;i +$. T4 +$g ssy +sL= o9E L6 sBC OB5 *73 Y3 Z2 .2 -*A1$c +*A1 $c $D Z1 $2 -E$x -E$* -li6! -i8HsQL -i4msW6 -^Is[l -{sV.u +E $x +E $* +l i6! +i8H sQL +i4m sW6 +^I s[l +{ sV. u i4o O21 O7A OA4 D5 ,3 -*A5Z4stv -spR$hDA -*80T3oB} +*A5 Z4 stv +spR $h DA +*80 T3 oB} O81 O53 s3N ^f O29 -s#&D9 +s#& D9 O21 o8M t $U R7 -p5[ +p5 [ R5 D6 Y3 o5j *02 *61 *87 O03 -oA2z2 +oA2 z2 i8L OA4 +6 OB9 O5B $f -D8,A -D8{ -i4.s'( -Y4 O02 ] -+0z1*8A -s O^h -,4l -*70sOu^d -oB9$H -[*82r +D8 ,A +D8 { +i4. s'( +Y4 ] O02 ++0 z1 *8A +s O ^h +,4 l +*70 sOu ^d +oB9 $H +[ *82 r ^t ,3 -i5giBLsR4 +i5g iBL sR4 OBA $Z OBA $R O54 k OB3 y4 s<5 o4p K D8 O0B -Y4 ] O02 c *43 O92 s`B q O19 OA4 o0X -iB.CK +iB. C K ,6 ^z l O45 L6 y3 c O3B O45 d z1 .5 { -s`D*43 -s"8^g -y2si- +s`D *43 +s"8 ^g +y2 si- O13 o8* y2 O39 O41 y4 r -sna,3 -sLOsS"L5 +sna ,3 +sLO sS" L5 ,B ^O O81 -}$.*39 -s\%$rT4 -*A8c*12 +} $. *39 +s\% $r T4 +*A8 c *12 O45 $k -$8*35 +$8 *35 [ i6b ^T O84 -*A1 '7 O78 +*A1 '7 q ] O32 +7 -3 OA8 -C*3BD8 -*75-7 +C *3B D8 +*75 -7 } *85 -[D6 -*B9*73$t -sdmsp} +[ D6 +*B9 *73 $t +sdm sp} sOb .3 O84 O21 K O73 -l$N +l $N Z3 O82 -$Xs]h -ss"-2[ +$X s]h +ss" -2 [ z3 u o21 O89 y1 o1H O05 -oA#st]L6 +oA# st] L6 O92 *09 sVr O5B o8E -sOUZ4 -i8wi6j +sOU Z4 +i8w i6j O17 p5 -s|G-3 -se6DAy1 -$Ks2F -o8Ac +s|G -3 +se6 DA y1 +$K s2F +o8A c ^e ] O29 $e u -sqg*A5-1 +sqg *A5 -1 Y1 p3 i8v Y2 q O68 Y2 ,1 -*86i1e -*70o96$> -,4iB2 +*86 i1e +*70 o96 $> +,4 iB2 O75 ^d O63 -o8/.0E +o8/ .0 E o1A O91 -^ls g +^l s g K oBn sHM O98 o9$ sxq *58 +3 *64 O67 -oA(s+go0a +oA( s+g o0a OB3 p4 O06 Z5 i8l -*8Assx +*8A ssx si2 O52 i3w s;V y4 O64 st% O83 sOK -^ds|" +^d s|" O62 E *27 -qE +q E o92 O86 $Y -ti90 -sR?Ep1 +t i90 +sR? E p1 O76 i3s *09 -*B6*42 +*B6 *42 OB3 -0 -o7esG2l -i6fskE -+3sUT +o7e sG2 l +i6f skE ++3 sUT sJ` O04 O69 O41 -s-Fp2 -i5jp2 -s7(q*4A -D3i9} -Z5R9 +s-F p2 +i5j p2 +s7( q *4A +D3 i9} +Z5 R9 O86 s_> *9A -]sgr +] sgr oBt O81 t D9 O29 Z2 OA3 o7, ] -D5*A2iB? +D5 *A2 iB? O14 p4 -$ *89 +$ *89 OA5 Z1 o9s O93 $e $7 C OB7 O1B ] O59 -R8D3sRE +R8 D3 sRE OB1 $r O26 s4X $k -^2T8 +^2 T8 O78 $d -*A4D1 +*A4 D1 y3 OB4 i59 R2 L2 -sF1T8 +sF1 T8 iA? OA9 [ .6 O63 -f*90c +f *90 c o9G D4 O87 i74 O96 sIh q O64 -p1KspO -s*4Y1 -$v'8sd4 +p1 K spO +s*4 Y1 +$v '8 sd4 ,2 O42 d o2i OA8 O73 sw9 -]sats0$ +] sat s0$ s`3 D6 OB9 sKO O51 *5A -i7gsva$o +i7g sva $o O53 y3 i77 R2 L2 sGs O61 -*58.6$g -$ls9i +*58 .6 $g +$l s9i O1B $o u O56 ] s2P ^1 O8A O17 $a i74 R4 -s1{R6 +s1{ R6 i1a R4 L4 s"x O8A R6 -q*B8 -rs3'*0A +q *B8 +r s3' *0A OB8 O83 -o0c.B -o6r*82*96 -y2sJy +o0c .B +o6r *82 *96 +y2 sJy i77 R6 -o6rs5[ -R7s(b +o6r s5[ +R7 s(b +9 O7B D6 -i6isFu +i6i sFu *53 Z4 O46 -,3p3sc, +,3 p3 sc, t O5A Y5 -$r*74 -y2s'+ +$r *74 +y2 s'+ *56 *83 O18 -o6rs=W -sv<$n -DB$x -ly4{ +o6r s=W +sv< $n +DB $x +l y4 { Y4 O01 D2 i3f R2 L2 -iBksoR -*30L8skJ -o1aC[ +iBk soR +*30 L8 skJ +o1a C [ i15 R0 L0 -$/T8 -i0iC*B5 -*39] -Ci8bszS -*37c +$/ T8 +i0i C *B5 +*39 ] +C i8b szS +*37 c s6B -s$Ao1H +s$A o1H O64 s 6 +9 O78 iA4 o7D T2 O46 i3a R4 R5 i71 L6 -o1z{ +o1z { i78 R4 i1a R9 L9 i34 L2 L2 -$_sJ'D1 -t]scd +$_ sJ' D1 +t ] scd i14 R0 L1 -sIBs7i -i6di9! +sIB s7i +i6d i9! ssd O61 q i1a L0 L0 i59 R4 L4 i70 R4 i55 R6 i55 R4 -.5,3r +.5 ,3 r i11 R0 L0 i19 L1 R6 -4 s{I O07 O12 q OB9 -Z2s;\+3 -c^c -sU.syR +Z2 s;\ +3 +c ^c +sU. syR O1A i2q -s%+'5p2 +s%+ '5 p2 O12 .1 O25 sw_ O06 *B2 O31 i56 L4 -$isj5t -'9Z3l -[soW +$i sj5 t +'9 Z3 l +[ soW $, O65 [ -i4f*87 -u*A9 +i4f *87 +u *A9 o0- OB8 } i74 R0 L0 O8B o8p OA6 i79 R5 i79 R6 -*62T5 +*62 T5 sMs O08 z3 +9 Z1 O16 -*A4^usO' -*05] -tR7sK4 +*A4 ^u sO' +*05 ] +t R7 sK4 i74 L6 i1d R2 L2 i76 R4 i3d R8 L8 i54 R8 L8 [ oBI O04 -i9hz3sQU +i9h z3 sQU O59 k i76 R9 L9 OAB i2? *A7 -,By1o4n +,B y1 o4n i71 R6 -sfY*60 +sfY *60 i53 R0 L0 i58 R6 -^K*74 +^K *74 *A4 O87 Y5 -{y3D8 +{ y3 D8 i52 L4 i1e R3 L3 -sRdoA" +sRd oA" s#t -i83i6X +i83 i6X *63 $0 O91 O13 i1* sk3 -s?5oAd +s?5 oAd snr *21 O72 *70 *76 .5 o4i @@ -53080,17 +52858,17 @@ s_X ^` OB9 s7F z5 O87 -oA?RB +oA? RB f O2A *50 C p4 O63 O24 *12 z3 -s=Hz2l -Z1s\J*63 +s=H z2 l +Z1 s\J *63 .0 O34 -*29Y3Z3 +*29 Y3 Z3 y5 Z1 } -Z2o7x +Z2 o7x O4A su1 s`$ i3c i53 O3B o9x y3 @@ -53102,7 +52880,7 @@ sNt O49 Y2 O35 L4 *86 p2 -i35*08sM_ +i35 *08 sM_ s.l '9 Y2 sm! @@ -53112,11 +52890,11 @@ i10 i76 Y3 $* i9s u '4 ^@ -$_$( -*41i6c +$_ $( +*41 i6c s1- i54 i32 -*08K +*08 K C ,9 T3 O42 i7f i70 @@ -53125,17 +52903,17 @@ soE O86 i2M *46 $> O93 z4 O12 o4J *19 ] -DAiBS -sGUsTr*B2 +DA iBS +sGU sTr *B2 Z2 ^t $l *38 OA5 -.3y1sxS -*63sz1smp -ro1lo8" +.3 y1 sxS +*63 sz1 smp +r o1l o8" Y3 c -*61-6 +*61 -6 O71 *50 O43 -s{1o82R1 +s{1 o82 R1 i70 i31 s{/ o8M O52 i69 *54 @@ -53143,10 +52921,10 @@ z3 s0y *63 O91 $0 i34 i51 OBA stx C -[s0c*B2 +[ s0c *B2 *36 ^s O82 -uo6tsG[ -i1@iAE +u o6t sG[ +i1@ iAE o9M D6 sFO oAK t @@ -53156,82 +52934,81 @@ i1d i52 t $O i51 i1f i33 i3f -sU|*19 -st$ry4 +sU| *19 +st$ r y4 O3B slO s16 O93 *06 i51 i19 -*A8s0/ +*A8 s0/ y4 *06 p3 i1c i6* -0 O46 z3 Z2 -i3y,6 +i3y ,6 s24 d iBp o3e *37 $R Y1 suC i1f i74 -shzL4sD$ -E*59y5 +shz L4 sD$ +E *59 y5 sDg z2 ,7 [ f *75 -$^$* +$^ $* -2 Y2 i53 ^v O26 $m o8d *23 i31 i18 OB5 z2 { -K^Y +K ^Y o16 d i79 i5f i35 i3f i7b i5c -E Z2 -Z1-1*21 -*A2-7*20 +Z1 -1 *21 +*A2 -7 *20 -4 ^Z sEj sEO K *95 i59 i31 O42 q sXG -o1J,A +o1J ,A Z5 p4 s(e i7d i79 O54 $V i1b i37 -$!$+ -T0L4s.5 +$! $+ +T0 L4 s.5 O51 [ Z5 -.1[*A5 +.1 [ *A5 O48 s@i OB1 O34 *03 .4 O53 O52 C .2 $p R9 -^>sJ* +^> sJ* +6 y3 D3 Y2 *02 l L2 *80 ^` O8B -*04srx +*04 srx z1 y4 p3 K DB -+8*14sXd ++8 *14 sXd *08 +7 z2 *24 ,7 Z2 { -o0p*62 -i7Z[sP@ +o0p *62 +i7Z [ sP@ i31 i54 i31 i56 O01 *50 Z2 z1 O09 -*27$)s|o +*27 $) s|o 'A ^J *12 sos *34 o5g O0A @@ -53241,11 +53018,11 @@ i3a i1f s_` i71 i19 i12 i75 -Y3T2C +Y3 C D1 o7= i30 i10 ,5 c -TB,BZ1 +,B Z1 ^" r *63 *83 O89 O3A s!z @@ -53268,27 +53045,27 @@ i1f i31 sQK [ i2J i3a i30 -D2k,1 +D2 k ,1 y1 O05 O51 Z5 [ T8 O21 O0A i1b i75 i13 i52 i78 i5f -o0!K +o0! K $, O56 s_6 -sar*27y4 -$($@ +sar *27 y4 +$( $@ R3 r -{se8s0m +{ se8 s0m c ,6 O23 $. O36 i3a i56 i10 i1d i10 i56 i15 i70 -^6p5} +^6 p5 } i5f i77 i1a i3l i2u i13 i79 @@ -53298,43 +53075,42 @@ skF k i1_ i3f i1c i3f i1b -*37Y1+0 +*37 Y1 +0 i9& E O21 suE ^3 O87 $G O76 ^f -s5(i6R*84 +s5( i6R *84 O15 D3 -oBhsCI +oBh sCI *4A O27 Y2 u i9V 'A -oA-s+Q{ +oA- s+Q { swq -*71*57 +*71 *57 i3f i37 r *47 Y4 *65 i3f i3c -,8o2V -o32o7^ +,8 o2V +o32 o7^ i56 i5d -+0{,1 ++0 { ,1 ^, O86 i37 i13 $3 o5j i1d i3c R4 '8 -sa$E +sa$ E O73 svB d Y2 -9 -A O05 O7A +4 -R1 c Z1 $i sen -$PoAdr +$P oAd r i5c i35 -]u*48 +] u *48 o4W OA8 -o6;sE% +o6; sE% i58 i36 p1 o0v o4p i0Y $f @@ -53342,12 +53118,12 @@ i1k $! i3d i3b C o2x O94 +6 -*78i1H -Ki8q +*78 i1H +K i8q O1A y3 i3. ^y +6 i38 *31 -+BLA ++B LA *43 O72 $# sKw sfJ @@ -53365,49 +53141,49 @@ i36 i10 i36 i14 i0Y .4 s.S -s'>o9v +s'> o9v i51 i7c *37 O45 sZV i35 i7c E o2W T3 -*3BER2 +*3B E R2 o6s *51 -*BAsS3 +*BA sS3 i7f i34 i1c i10 C *05 *BA $h i12 i58 iA. +6 -l*49i4O +l *49 i4O i6U O36 o5e -*B7^ sgR +*B7 ^ sgR p4 *37 *15 -sw si; +sw si; i70 i5f -R7*A7*41 -D4y1,7 -*76oB2 +R7 *A7 *41 +D4 y1 ,7 +*76 oB2 +7 { -+1*64 ++1 *64 i0b i2l i1a i74 i1f z3 O86 -skeZ4Z3 +ske Z4 Z3 T0 ,7 o2p OA1 i7f i5c E O46 -E,2*46 -*49i6Hs3_ +E ,2 *46 +*49 i6H s3_ o59 O21 -y2KsxZ +y2 K sxZ i78 i33 i7a ^k i11 i55 +7 *79 -oAPoB^*9A +oAP oB^ *9A r .6 OA6 c sGj OB4 @@ -53417,34 +53193,34 @@ OA3 O12 *30 y1 *89 O13 *03 $; -y1.9*03 +y1 .9 *03 O63 o3C -L0sS2 +L0 sS2 i54 i35 -}i9Z$3 +} i9Z $3 i5e i56 sA* *45 T4 -$"$? +$" $? o73 O92 i8# *03 p5 O65 -*1B*43 +*1B *43 i39 i10 O96 Z1 Z2 i57 i1e ,2 sdc sv1 O53 t $h -CT7Y1 +C T7 Y1 d *B5 O65 $_ r -*43i4j -iB-Y2-1 +*43 i4j +iB- Y2 -1 sCg sr| i5c i59 -^i{*13 -y5svx +^i { *13 +y5 svx O28 *42 *30 O35 T1 i4k @@ -53452,9 +53228,9 @@ i78 i37 i37 i18 i37 i19 i54 i3c -K-5*02 +K -5 *02 d -4 -k^@s80 +k ^@ s80 } Y5 OB8 sPl ,2 i7* @@ -53462,13 +53238,13 @@ sPl i3b i79 s]A ] O94 i50 i1d -y3s,B +y3 s,B sc[ i4/ OB7 i3f i77 sSc *78 Y2 i3e i13 -o6`soK +o6` soK .5 Y1 i3r p1 *26 r O45 @@ -53477,137 +53253,136 @@ i78 i12 O29 Y3 i5b i78 i0d i2a i1r -i2EoAY*69 +i2E oAY *69 *32 O54 -s,ps"Z -}*4BZ2 -s?wi8C -O36 E +s,p s"Z +} *4B Z2 +s?w i8C y2 ,7 i73 i1c -Z2,3 -*89o2* +Z2 ,3 +*89 o2* o3P ^1 -R0*10 +R0 *10 i76 i1d sbI -*6BiAJ +*6B iAJ O52 $O sKB -$&$/ -$;$/ +$& $/ +$; $/ $A T7 *67 k O82 -s{go1z^T +s{g o1z ^T O73 Y3 -R8{$B +R8 { $B ^z *61 seL C -1 *05 O57 -[oA!sQs -*A6*43^j +[ oA! sQs +*A6 *43 ^j -0 i86 p4 -so\*04 +so\ *04 O37 ss; Y3 so6 Y2 [ -*B9tshW +*B9 t shW i1c i15 -Y4sy7} +Y4 sy7 } K O93 iBX O83 o3+ *A0 -$#$% +$# $% i1d i78 -ui70 +u i70 sdI -T3sTr -]*04 +T3 sTr +] *04 i30 i54 i38 i7d -4 ^l -iAa*89 +iAa *89 ^M O85 i30 i7e C ^D -*79i7q +*79 i7q ^L o93 -y5o5d +y5 o5d z2 O92 -cR2 +c R2 i3f i51 .7 $0 -*30,9 +*30 ,9 O46 Z1 ^m -sczk +scz k D6 Z2 $) O72 -$@$; +$@ $; O18 *21 -*67$;*49 +*67 $; *49 i18 i74 -*B7,1*72 -.3*14K +*B7 ,1 *72 +.3 *14 K O87 *26 o6d -^X^X^X$X$X$X -^KY5 -s(yC -^,svo -^0z2'6 +^X ^X ^X $X $X $X +^K Y5 +s(y C +^, svo +^0 z2 '6 Z1 *07 O15 O06 s*I -^(ssqt -s>[o2Dk -to7< -*95sxk^q -iA3Z2 -si$L2 -*69o97$% -o0#*06l +^( ssq t +s>[ o2D k +t o7< +*95 sxk ^q +iA3 Z2 +si$ L2 +*69 o97 $% +o0# *06 l i3d i1b i7c i1a i59 i10 oAB $j O52 i15 i54 -^+*49 +^+ *49 O6A y1 -s2)*A3 -s1,i2_ +s2) *A3 +s1, i2_ i58 i15 o2t -8 i58 i1e i79 i5b -s"9s_m -ro8@Y1 +s"9 s_m +r o8@ Y1 O57 O67 t k Z3 OB2 $k $o $m $a $l -+9R1 ++9 R1 i50 i30 $m $o $m $o $s -s%OsgB +s%O sgB sq? -^7y1s.z +^7 y1 s.z i5e i33 -o4&sBu +o4& sBu $j $a $k $e $r -o4N.5 -i6Jsa&s\j +o4N .5 +i6J sa& s\j i39 i5a -*50D8 -*72^os6l +*50 D8 +*72 ^o s6l s0] sTU $y $u $n $i $s -*B7oAO +*B7 oAO ss/ +3 O57 k -Y1^b +Y1 ^b ^b O17 O8A i1e i57 i56 i3d -k+5*75 +k +5 *75 s+t -uTB +u TB ^2 ^e ^e ^f i1f i3c i12 i77 @@ -53615,7 +53390,7 @@ O39 ^i i5( c d 'C $1 c d '6 $1 -o0&s*{k +o0& s*{ k $2 $0 $1 $0 $) d 'C $4 u d 'D $2 @@ -53623,19 +53398,19 @@ u d 'D $5 i1= sM& t O85 c ^8 ^b -*96T4 +*96 T4 c d '8 $4 d 'C $8 c d 'B $2 *2B -o3ni2k*51 +o3n i2k *51 c ^b ^3 c ^b ^7 *5A O04 -*73sqYZ4 +*73 sqY Z4 +2 O07 i19 i74 -*A7o3Wi9V +*A7 o3W i9V sGf iB( u d 'D $8 @@ -53645,7 +53420,7 @@ i55 i1d O97 ^R C c ^1 ^d c ^1 ^f -s9>R9 +s9> R9 c ^e ^c c ^f ^7 i14 i1c @@ -53661,13 +53436,13 @@ c ^c ^a T5 TB O75 o59 o4{ -*36+5*B9 +*36 +5 *B9 T0 T6 TB c ^d ^7 O65 O43 T0 C '9 $9 c d '7 $6 -.1 o1V O6B +o1V O6B O3B p1 sJc i5b i50 @@ -53676,39 +53451,39 @@ sO- 'E $0 i19 i51 sA? O84 -,9i4M +,9 i4M C '8 $7 c ^2 ^a i12 i3e -z3s)q +z3 s)q i14 i58 -Y4R1 -sP7siT -Z5y2iA2 -^^sF@ +Y4 R1 +sP7 siT +Z5 y2 iA2 +^^ sF@ sL5 -sh'T7 +sh' T7 i17 i1c i76 i31 -sDwi9)K +sDw i9) K OA4 o6( O74 --6ksCe +-6 k sCe O3A sCA -*23^Q -o8X} -R6*B3sES -^+Y5+7 +*23 ^Q +o8X } +R6 *B3 sES +^+ Y5 +7 i7a i10 c ^7 ^e -T4iAQ$G -+3Z4 -y5^p -sg_o9F -*05Z5E +T4 iAQ $G ++3 Z4 +y5 ^p +sg_ o9F +*05 Z5 E s_? O86 u O48 R4 O03 O27 c -T5^z +T5 ^z i14 i56 i14 i55 i54 i11 @@ -53718,60 +53493,60 @@ O76 Y2 i7a i1d i1c i3b k O34 *0A -T7*63L3 +T7 *63 L3 O27 *A5 K ^; OA1 i30 i58 -*76$xy5 -sCRo5R-5 -D4i7>y5 +*76 $x y5 +sCR o5R -5 +D4 i7> y5 s!l o2$ O74 i5f i73 O64 O97 o2Y -Y1LA -o0eZ3 +Y1 LA +o0e Z3 OA4 sA[ i13 i3a ,A O09 sz1 -sFbsz| -p1y5 -*2Az5 -$UiAi +sFb sz| +p1 y5 +*2A z5 +$U iAi s-s O92 s@Z OAB O48 sRc r O74 -i0xy2shx -Y1stgo0v +i0x y2 shx +Y1 stg o0v i3d i53 -oBn^$ -s0QsGFi6C -o0@Y5s}l +oBn ^$ +s0Q sGF i6C +o0@ Y5 s}l s , -cT1i0* +c T1 i0* i7b i35 +3 *60 OB2 i71 i38 O14 Z3 T3 -,2T4Z3 +,2 T4 Z3 i5] -,Bo1# +,B o1# i11 i70 -i11i29i39i43 +i11 i29 i39 i43 i1b i7c i3d i19 i3d i14 i5b i13 i18 i1f -i11i29i38i40 -$+$$ -$+$/ +i11 i29 i38 i40 +$+ $$ +$+ $/ i17 i53 i57 i12 i5b i39 i5b i38 i5b i3f -$-$" +$- $" i5e i35 i32 i1c i17 i75 @@ -53789,25 +53564,25 @@ i5f i39 i1a i10 i53 i11 i5b i17 -$&$- +$& $- i35 i5e i5a i18 i5e i53 i32 i7c -i21i39i46i55 -i21i39i46i58 -Z1sdF +i21 i39 i46 i55 +i21 i39 i46 i58 +Z1 sdF i5a i1f i51 i7b i3b i30 i5d i17 i35 i7b -$'$? +$' $? i38 i3f i3c i11 i7e i18 i5c i38 -$($; +$( $; i50 i38 i31 i7b i3d i37 @@ -53817,61 +53592,61 @@ i18 i7b i1c i36 i1c i38 i31 i1b -c$1$2$3$; -$@{i7> +c $1 $2 $3 $; +$@ { i7> O93 *8A -sDx.1*60 +sDx .1 *60 sjc d O52 O97 O85 Y1 Y3 O6B O36 s,K -*83i5T -LAR1y3 -o5J$ *86 -rs `*4A -oBas/8+A +*83 i5T +LA R1 y3 +o5J $ *86 +r s ` *4A +oBa s/8 +A o7k OB3 sE2 -o7w^'o2i -s ^*61 -sw;-9 +o7w ^' o2i +s ^ *61 +sw; -9 q O31 *26 -sQZc -s{Ro4Z +sQZ c +s{R o4Z s/' sxi OA9 -*98sQ<+A -sy$*B8 +*98 sQ< +A +sy$ *B8 R8 O89 Z1 -]sQZi3) +] sQZ i3) sj! -Z4i7NDB +Z4 i7N DB i1$ O0B -D7i71 +D7 i71 *27 O96 -$%$? -$$$( -$&$( -$!$< -sD2sqZ -p3q*71 -$~$* -$$r -$ $~ -$<$! -$_$" -$_$% -$&$# -o4>i8EsBa +$% $? +$$ $( +$& $( +$! $< +sD2 sqZ +p3 q *71 +$~ $* +$$ r +$ $~ +$< $! +$_ $" +$_ $% +$& $# +o4> i8E sBa Y5 D2 -$^$! -$>$. -$/$% -$/$, -$/$= -.6^&iAH -k*05 -*34iB6 -^;,8 +$^ $! +$> $. +$/ $% +$/ $, +$/ $= +.6 ^& iAH +k *05 +*34 iB6 +^; ,8 O07 O54 ^u O38 OA6 [ @@ -53882,7 +53657,7 @@ Z5 O63 sh+ OB8 *78 i72 L6 $r -dY2 +d Y2 i3. .4 i50 T6 O71 o4s @@ -53895,8 +53670,8 @@ O41 z5 o02 ] C T2 sjG c -d*7B$d -p1*34*B8 +d *7B $d +p1 *34 *B8 T7 -5 ^B *63 p5 ] o9u @@ -53921,7 +53696,6 @@ u L7 $3 $1 $2 $! [ o4L $5 O15 Z2 -O46 Z2 c K *30 i31 ,5 -8 $# @@ -53932,14 +53706,13 @@ s2j E $8 +2 O45 y4 *25 $d -^mp3 +^m p3 q O67 ,6 c T6 ,2 $@ *05 p5 o6y s2D -o0T c p4 i8s o8j t O03 ^l @@ -53948,8 +53721,8 @@ C O86 [ O62 i0P s1X ] iAA Y1 -$dC -z1o9i*56 +$d C +z1 o9i *56 *30 o0I ,8 s91 y3 T9 @@ -53958,7 +53731,7 @@ s = OA7 [ D4 s14 y3 K T7 *04 -.0'3*2A +.0 '3 O03 Y2 D3 y3 $! +5 ^a @@ -53969,20 +53742,19 @@ o0Z *31 o6$ Z2 .2 $R z1 $+ -Ci5E +C i5E i6N $z $E O21 i0g t L7 i59 o62 *35 ^H i52 i60 i71 -o7a O52 ^Z z1 $L s72 $l +7 i80 c -Y4Y1 -*0ADA +Y4 Y1 +*0A DA *73 *46 o17 C O0A o5U @@ -53993,20 +53765,19 @@ $k ^Y Z2 o64 $0 $7 $! *15 .6 -sW[y4^I +sW[ y4 ^I o2b i0L u sKs O21 Y4 O35 Z5 O64 +4 Z5 O57 -O71 o7h +9 D1 ,8 } s3F i7g K -^msM$Y1 -ssY*40 +^m sM$ Y1 +ssY *40 sbS *14 Z2 O25 z1 ^A ^B @@ -54031,7 +53802,7 @@ $/ .1 ^a 'A ^i ^j $8 $$ -oAxp5 +oAx p5 O72 T3 O53 q s2B @@ -54044,12 +53815,11 @@ O43 i2u ,2 $F $z O64 'A ^C -s6c Z1 c $A $B TB O83 -A O21 *27 *56 -i4-y5 +i4- y5 ^T +1 y2 +4 o5d T7 @@ -54070,7 +53840,7 @@ i58 i19 i7c i19 i59 i7c i7d i13 -sY%Z2 +sY% Z2 i19 i7e i38 i13 i33 i19 @@ -54132,7 +53902,7 @@ $4 ^! $4 ^. $; ^1 $@ ^2 -ks"d*26 +k s"d *26 c $> $3 c ^@ $9 c $5 $_ @@ -54148,23 +53918,23 @@ c $^ $^ ^# ^1 $0 ^* $7 ^* -i3jTA +i3j TA c $+ $0 -*73L5oBI +*73 L5 oBI c ^8 $1 c $, $2 -sj=o5` +sj= o5` c ^$ $4 $9 ^! ^8 ^* -,9*BA +,9 *BA c $3 $, ^0 ^- ^3 ^+ c $4 $% ^4 ^@ c $9 ^4 -.8s)Y +.8 s)Y c $% $5 c $6 ^9 c $5 ^9 @@ -54208,8 +53978,7 @@ f O75 *4B i19 L1 L0 i11 L1 R0 } O76 -[ ^4 -Z3dD2 +Z3 d D2 l $1 $9 $8 $0 l $1 $9 $8 $6 l $1 $9 $8 $5 @@ -54219,33 +53988,33 @@ u $1 $9 $9 $9 D0 DC '6 i54 i62 i70 '4 $8 -KE$R +K E $R D3 D9 l $1 $9 $6 $1 '7 i24 i32 i40 '7 i74 i82 i90 -i9Ni5Y +i9N i5Y l $1 $9 $7 $4 sB- u $1 $1 $1 -l^1^1 -l^9^0 -l^7^2 -l^7^7 -l^2^0 -l^0^2 -l^6^1 -l^4^1 -l^4^2 +l ^1 ^1 +l ^9 ^0 +l ^7 ^2 +l ^7 ^7 +l ^2 ^0 +l ^0 ^2 +l ^6 ^1 +l ^4 ^1 +l ^4 ^2 Z2 d O86 OB2 Z2 -iA_^yp2 +iA_ ^y p2 -3 O94 sCP *43 --1sv0 +-1 sv0 *97 sv@ O95 -sw.,2 -*A4,7 +sw. ,2 +*A4 ,7 D6 '9 l $8 $8 $1 l $3 $1 $1 @@ -54350,18 +54119,18 @@ Z3 D2 ^n ^e ^e ^r ^g O65 s'6 *28 i8p -^h*27 -p5Y5 +^h *27 +p5 Y5 R1 ^` -+5s^Y+0 -K,8E ++5 s^Y +0 +K ,8 E O87 .B +B -iBLo9M -}t*6A -*89-1 +iBL o9M +} t *6A +*89 -1 $* K sxV $g --4*A4 +-4 *A4 [ $9 [ q O05 '6 sfs @@ -54424,10 +54193,10 @@ R7 O34 c o4+ sdb O31 R3 *40 -s%Ts;j$i +s%T s;j $i u d 'D $3 *65 O14 Z1 -^?sj> +^? sj> s_q *72 K O71 O62 *BA @@ -54436,17 +54205,17 @@ o68 .5 z1 o4k Z5 Z5 O56 i8q Z1 -L6*16 -R6oAU*17 +L6 *16 +R6 oAU *17 ] o11 -oB_sUX +oB_ sUX f O15 D5 y4 ] OB3 l iA] O64 i7f i38 D4 E -[sI7 +[ sI7 i4g } -3 Z2 D4 $. $e $c @@ -54459,23 +54228,22 @@ O21 sq7 i0< i5e L4 c o4N D5 $F -oB`i5l +oB` i5l *74 O49 y1 ,2 '8 *35 ^p -smQD0 +smQ D0 $9 i95 $w $i $s $e ] o8W i1a i2d i3i K s1S O43 y2 -{[d -Z3sP^ +{ [ d +Z3 sP^ iAN { C OBA iA2 O59 -'A T5 O82 O83 ^b O93 o2` ^u ^g ^u ^A @@ -54483,7 +54251,7 @@ $R r D6 *82 +1 T9 O21 ^9 *53 -$hsB) +$h sB) d o3b +E -8 $7 k @@ -54492,11 +54260,11 @@ o9F $t O41 $X i73 i31 $, *54 -sgCp2} +sgC p2 } i1a i2h sBt o5H K -D4$e +D4 $e $d o59 $b +4 O61 O8A ^< @@ -54507,29 +54275,29 @@ s4Q O71 o7h O81 ^- *63 ^e ^( i3) -+8*82 ++8 *82 i4e ] $J $$ O73 i58 ] $c $r $a $f $t -s,mK -*09*80$i -sbdL3 +s,m K +*09 *80 $i +sbd L3 i59 i68 i74 -y2sgz.5 +y2 sgz .5 ^s skc +3 -*43p5o92 +*43 p5 o92 O24 +5 i5f O95 o0M O45 ] -stOtR8 -snkz2E +stO t R8 +snk z2 E T7 ssg -8 O04 z2 i9a *69 ^/ O45 T0 T8 TA -*40s!I +*40 s!I *70 O13 *79 E O24 o3Y *40 p1 @@ -54538,22 +54306,22 @@ OB2 { $Z O21 O37 l i76 $A iAk -s`l*70 +s`l *70 i6o i7c ^0 T1 *38 'A T0 *43 o9D ] -s_?z4c +s_? z4 c i64 R5 -sN4D5 -,9d -$ *69 +sN4 D5 +,9 d +$ *69 O35 iA* $T D1 O8A *67 ^N i7w i81 -sDvLB +sDv LB i3h i4a i5r T0 T5 T3 T8 O18 R4 Z5 @@ -54567,20 +54335,20 @@ i3t i4t $i $s $e sf8 $e -2 -'A*4Bi3, +'A i3, i6o i7y i93 iA0 $t $o $m $e ^w ^o ^c T0 T8 T5 T4 ^O y1 -p4*7A +p4 *7A sn@ -$-$) +$- $) Y2 O58 $I O52 y4 -$.$< -*96i55 +$. $< +*96 i55 sPi i3g *10 *23 $i r @@ -54588,22 +54356,22 @@ o3? OA8 s#g p2 O16 o5t ] o9Q -p5z4*59 +p5 z4 *59 c *80 $9 ^g i2o i3g *31 D8 -*86-6sUW +*86 -6 sUW i40 T5 O91 OAB o84 O12 ^j o51 O04 d i0n -B -D -C -^FsS2 +^F sS2 T0 T3 T8 T2 z3 $X -snG*64 +snG *64 c T7 i7- -2 -6 -A c $5 $3 $8 $9 @@ -54612,14 +54380,14 @@ D1 ^` iA1 iB2 L5 sbL $1 E -sxDi0xY4 +sxD i0x Y4 T2 T7 T5 T4 i6* -0 -o9DKo7- +o9D K o7- O24 T1 s7E u $A $D -^c*1B*49 +^c *1B *49 i58 R0 L0 O63 u d OA5 O52 @@ -54627,11 +54395,11 @@ o08 z3 $m O57 f O09 ^8 T1 -ck*5A +c k *5A *34 ^Q C z4 O1B q *21 $/ -oB;rDB +oB; r DB i79 i30 y3 OBA ^Z O37 @@ -54649,15 +54417,15 @@ i3d R2 L2 i55 +9 O81 .1 *21 o2j *24 -L4D1z4 +L4 D1 z4 o5I ^1 i0p i2l i1a O95 Y1 $x o0M ] O45 o2+ *27 -$,$# +$, $# -0 y3 -sFosME +sFo sME -1 R0 *13 o1W O9A O09 *5A @@ -54669,7 +54437,7 @@ i37 i17 i53 i7c sM( O02 O76 O81 -^8k} +^8 k } i78 i30 i39 i1b C $* @@ -54681,13 +54449,13 @@ O38 OA3 z5 +0 y3 +B -C -D O43 +5 -$zL8*5B +$z L8 *5B Z1 i41 i2r i3g O23 O62 z2 o6n $9 $B -*80*B7 +*80 *B7 t *28 k O4B *AB O58 -A @@ -54700,7 +54468,7 @@ d 'D $2 O45 $p D4 z1 O62 l $. $l $i -$M.B$n +$M .B $n o73 o5O *34 o0k *30 p1 @@ -54715,7 +54483,7 @@ i4A z1 i2r i3d OB3 $O d $c -i11i29i39i42 +i11 i29 i39 i42 iA& O47 c +0 *74 i2r i3n @@ -54751,8 +54519,8 @@ T3 '9 $3 ^q $r i4E i0< O97 -]z3 -R3*B5 +] z3 +R3 *B5 i2r i3m z1 i17 -4 ] -1 @@ -54760,12 +54528,11 @@ t s3t $s $a $n slq $! *24 -E *37 c $3 $8 $! *34 $n -$Ds#! +$D s#! i3f i78 -]z5 +] z5 L6 O6A [ slJ -2 Z1 o1d @@ -54779,7 +54546,7 @@ i3i i4o i5n O94 $h i16 i76 y3 *20 O54 -so8.7 +so8 .7 i3f i7c OA7 T1 ,7 $- ^+ @@ -54788,11 +54555,11 @@ T4 TA T7 o4X '8 sET O49 sk> O19 k -iBqi1y +iBq i1y T2 T9 T3 i6E O74 k q O16 k -s6Jswfl +s6J swf l i5n i6t i3b i4l c $1 T8 @@ -54801,19 +54568,19 @@ sJw ^F r O4A p4 *70 s\h *51 OA7 -i12i20i31i42 +i12 i20 i31 i42 sek O75 { y4 O62 i3d -1 o9u O36 O41 T0 T3 T4 T6 o3a z1 -i4!T0 +i4! T0 i35 i3b ^x o4m y2 *8B O15 c T2 T1 T5 -$)$+ +$) $+ $F +7 -1 -2 C k *27 OA8 @@ -54832,7 +54599,6 @@ i37 i3c i7/ *46 i19 i54 T0 ^K -cZ3 ^' o2i O72 ^` *7B snQ O97 @@ -54847,7 +54613,7 @@ sRU O04 O3A ^M K sex T2 T9 T8 -$)$= +$) $= O61 ] k d D2 o4s $b $b $s @@ -54868,15 +54634,15 @@ o6V i76 i34 $s ^f r $t o4f -D9DA -[*38 -o3$lsic +D9 DA +[ *38 +o3$ l sic s3D o4I $b i5p i3c i30 -$yi9+ +$y i9+ OA5 E -p3sP_ +p3 sP_ sa@ so0 u i1k [ $M -0 y2 @@ -54884,19 +54650,19 @@ c so0 si1 se3 sjQ i3a i4m i5i O46 T0 -*93L5 +*93 L5 p4 '9 *21 T1 i7L $k t -sszskj +ssz skj ^0 O63 sfk $] o4[ +0 sc. skC O53 ^n o3n -*37o7. -Cs0W+A +*37 o7. +C s0W +A -2 T5 i6+ O18 O31 ^- '5 @@ -54905,7 +54671,7 @@ OA6 OB4 i76 i30 *63 } sl- -sPUiBd +sPU iBd C O01 -5 T3 ^H ^y C @@ -54915,23 +54681,23 @@ $W D4 O42 O57 s*Q i72 i80 oA7 Z5 l O95 -$L*47 +$L *47 R4 *46 Y1 -'8Z5o81 +'8 Z5 o81 O27 swo f +0 O16 c $a $f l $i $v $e O07 i1n OB1 $9 -oBs$m +oBs $m Y1 o34 i13 i7d D5 o7M +5 smk $. $e $d $u i88 i94 -Z3p4*69 +Z3 p4 *69 o4z { i88 i95 O85 D2 OB2 @@ -54951,30 +54717,30 @@ i5b i33 +7 *59 o5s D6 Y2 f O5A -i2z^js5j +i2z ^j s5j i5e i58 -co4ksU\ +c o4k sU\ Y3 O34 Z2 s1z T7 TB T9 i59 R6 -sl9^y +sl9 ^y *15 i5D *50 *03 $w -s2i*73L5 +s2i *73 L5 i98 O61 ^b ^4 ^0 ^9 i0@ oA2 i8h i9i -T3o4L +T3 o4L *64 .1 -T7o2J +T7 o2J i81 [ -o92$l +o92 $l *74 k O24 -o9jsOei1a +o9j sOe i1a i5e i30 -*42d*06 +*42 d *06 } $d R0 O21 O59 o1V sWS @@ -54989,8 +54755,8 @@ O43 K i2u o8# D9 *41 *47 +3 i04 -iA2$P -'9 sDz OAB +iA2 $P +'9 sDz z5 Y4 O79 i1u i2m i3b y5 OA2 @@ -55002,15 +54768,15 @@ O52 ^9 OBA O96 O39 z2 OB2 Y2 c K *68 -^tK +^t K iAF -^7o8( +^7 o8( T6 i6_ O21 $X [ -*75Z3*65 -Y2c*49 -*13sMz -*02Y4 +*75 Z3 *65 +Y2 c *49 +*13 sMz +*02 Y4 i4@ ^M *52 O23 $D $3 @@ -55024,20 +54790,20 @@ c d '7 $8 soV p2 i0@ c i27 -sQjoAj +sQj oAj *76 i4q } $8 $! sw! $; [ i7d i14 -*06^as1l +*06 ^a s1l $@ $6 i1c i79 Z5 O56 Z5 scf T6 z2 ^i -sEdl -*30*86*84 +sEd l +*30 *86 *84 K $d s18 u sM2 @@ -55046,7 +54812,7 @@ O69 l c $8 $# ^2 o42 sM6 -*69p5 +*69 p5 O41 t o0> z2 i7s sQ{ @@ -55057,18 +54823,18 @@ s$? i2 E T3 d i18 i1e -$gs^; +$g s^; E .6 O03 i10 i54 r $e $s $t *14 *26 +7 -4 +8 -*83s'j -o5qZ1 +*83 s'j +o5q Z1 $A o00 O48 $7 -0 l Z3 -7 -sdlZ2 +sdl Z2 O21 { l sKc O15 ^e Y2 @@ -55076,7 +54842,7 @@ sZ9 i31 i1d oA` z3 D5 -s[DY3 +s[D Y3 s$Q i1b i33 O43 c $d @@ -55093,46 +54859,46 @@ $d y2 i7i i8e o1@ ^s i6Q O02 *BA -'8y2 +'8 y2 Z2 O94 D7 -y1R0sP_ +y1 R0 sP_ -1 p4 O6B *36 u i9a iAr i4e i5l i6i o6y O71 -s/A$gs-# +s/A $g s-# T2 T9 TA *54 ^c '7 -i11i29i37i44 +i11 i29 i37 i44 O98 O05 s2m -+A*4AT9 -C'B*74 ++A *4A T9 +C 'B *74 o2D k o0K *02 syO OB1 i0c i5C p3 t O45 Z1 -*10 $0 +$0 k O72 [ l o2f s24 *40 ^G snM i4a i5n i6g ^. *03 $p -oBF^wt +oBF ^w t O61 O1A i8C i5f i58 iBM iAM ,9 -o3e,2p5 +o3e ,2 p5 DB ] O41 l ^l ^i ^o p5 $v -T4i6D -li0G+A +T4 i6D +l i0G +A i7b i12 -Z4s`" +Z4 s`" i61 i72 R8 O64 o5m -8 *32 O95 @@ -55147,17 +54913,17 @@ Y3 $p o5O +0 O82 sHF O0B i7n i8c -i12i20i30i41 +i12 i20 i30 i41 *13 D9 o5E O02 -o7MlTA +o7M l TA '4 $q T2 i61 i71 i81 [ o0M o5I O74 O24 o1- +B O24 i32 -fsvh +f svh O29 K p2 O71 z2 O31 Z1 o43 @@ -55165,25 +54931,25 @@ d O4B T2 T6 TB T3 o05 l o5= K -'AiA_ +'A iA_ u o2i z5 O0B +5 -}*89 +} *89 *24 O36 O08 f $( O65 ssv o5x +9 Z1 -8 -.2$o +.2 $o z1 r ^r D9 $J Z1 s0a -s%y[D6 +s%y [ D6 o01 i07 -*B7 '8 +O74 '8 O15 *04 i16 i77 -sd1$|.A +sd1 $| .A i19 i3a i3f i38 *21 f @@ -55191,13 +54957,13 @@ O02 sBD Z2 $5 *73 i76 i11 $C $8 -$"$_ +$" $_ i1b i5d o0c *86 i7d i34 -svjs)5i1E +svj s)5 i1E i3a i4d i5a -dstv +d stv i5c i1b i7r i8d i91 R0 o1r @@ -55206,7 +54972,7 @@ i8c i9e '4 t c ^6 ^c $m $a $y $1 $4 -^>s.o +^> s.o $c O36 i34 i18 $a $n $g $e $l @@ -55214,13 +54980,13 @@ u ^E ^D ^- O41 s@2 O17 $4 -siuy3Y3 +siu y3 Y3 O91 stk i7c i51 i8. o7l iA$ $. $k $g -Y5sgesSZ +Y5 sge sSZ i1f i73 t ^1 $2 T5 i5_ @@ -55229,9 +54995,9 @@ i7b i5a O54 o3D $l *53 *32 '8 $# -o4No9'se_ +o4N o9' se_ O57 ] O5B -^WsVL +^W sVL i1b i18 $Z *9A u { ,2 p2 @@ -55239,7 +55005,7 @@ O17 Y3 i74 i37 p4 T5 seF -^L.8 +^L .8 *14 -7 O81 O25 l c ^o ^r ^p @@ -55253,8 +55019,8 @@ p2 *71 O47 ^e ^c ^a ^l o5N t +2 i72 i13 -ts}= -Y5,5sE{ +t s}= +Y5 ,5 sE{ ^@ O5B C s49 f O05 @@ -55279,12 +55045,12 @@ i5U O14 [ c d '9 $6 $d o11 u ^e ^2 -D4s=QZ3 -sb/sth +D4 s=Q Z3 +sb/ sth l $. $s $k i59 i69 i74 p4 *17 -skcsbvsr[ +skc sbv sr[ *53 i32 o4d f $p -1 @@ -55295,26 +55061,26 @@ o72 sln i52 R3 L3 Z3 [ D3 ] $! Z3 -s@Bz2 +s@B z2 i4l i5o i6v i2s i3c l $s $h $i $p $d *61 -0 R5 O12 -Y3sfa +Y3 sfa shA *75 ^A $= OB5 $e o8[ O94 O2A t -*A3o7O^4 +*A3 o7O ^4 i7c i54 i13 i7f O14 $L O08 -0 $G z4 O17 sk! -s9)d] +s9) d ] sds u p2 O94 O4A i36 i17 @@ -55322,20 +55088,20 @@ i36 i17 *94 O57 $4 i5- p2 $n -}oBJy1 +} oBJ y1 i1a i2n i3e s8W c sSI i2s i3m D4 $c o14 Z1 -sd O5A l $1 $0 $6 c ^8 ^4 ^9 ^1 @@ -55698,12 +55464,12 @@ c o5W sNJ i1e i18 i4r i5d -*B3RA +*B3 RA Y3 OA5 *60 O03 p1 o5v *20 '4 $5 -L8^+ +L8 ^+ '4 $7 i59 i16 s7h @@ -55714,11 +55480,11 @@ l -5 i79 i38 i1i i2t i3t i3p i4h -i21i39i46i54 +i21 i39 i46 i54 sBD i3p i4e i2= O31 D3 -i52i60i73i82 +i52 i60 i73 i82 i1k .2 O42 +6 R5 { -4 @@ -55728,18 +55494,18 @@ T3 T6 T8 ] O52 D0 DD Z2 $0 -i3SL6i8d -*87s_&Z4 +i3S L6 i8d +*87 s_& Z4 *68 O0B sDI Z2 o2m -D5s70 +D5 s70 O27 o1y i03 K o6H OB7 q O65 O31 D2 T6 i3i i4s i5s -L5Z1 +L5 Z1 D3 Z5 c $d $f d 'H $1 @@ -55747,7 +55513,7 @@ d 'H $1 *46 $_ D4 i50 i7d '7 d -L7C +L7 C saX i32 i1d sa\ @@ -55770,13 +55536,13 @@ i78 i7f R4 [ s;= O21 *86 i5o i6c i7k -.B*87 +.B *87 l ^r ^a ^e ^b -oAE^*i5l +oAE ^* i5l +6 i3j *41 *86 -*42E -sx4R1Z4 +*42 E +sx4 R1 Z4 i1f i7f iBu O05 *80 t @@ -55788,8 +55554,8 @@ l $1 $9 $8 $7 l $1 $9 $8 $2 r $a $l o4~ -Esq!-3 -+7^Gs'l +E sq! -3 ++7 ^G s'l i31 i5d $y i1p K O08 c @@ -55805,15 +55571,15 @@ Y3 O57 k } r o6C O13 i3b R1 L1 -Y2*41 +Y2 *41 f '8 i5m k ^q oBl d ^6 *06 O62 -*B9*6A +*B9 *6A so0 [ o6L -oBgsEG +oBg sEG i6n i7g i8e i8k i9e iAy O32 *63 @@ -55826,7 +55592,7 @@ l o8- OAB i2a -9 $0 *35 LB O16 -s",^) +s", ^) T5 T7 T8 E d O04 s0Y Z1 O18 @@ -55848,13 +55614,13 @@ $1 O81 Z2 o0b o2u o3e i34 i10 c $. $f $r -sHrs-G] -s<9o8g +sHr s-G ] +s<9 o8g f ss0 -$<$, +$< $, i2a i3k -y5DB-9 -^jY5 +y5 DB -9 +^j Y5 c ^O i7d i52 *01 o8s @@ -55877,13 +55643,13 @@ O35 Z3 Z3 +9 { l O21 Z3 +6 -T8^2*A9 -s,C$c*82 +T8 ^2 *A9 +s,C $c *82 i5k i6i i7n -s>+^Eo33 +s>+ ^E o33 l ^y ^a ^w i33 i7d -R6s!l +R6 s!l $$ *54 'B *35 O52 u @@ -55893,29 +55659,29 @@ O42 oBo s2C O71 { $! $9 i4- o0e -Z2*B7*8B -,B^K +Z2 *B7 *8B +,B ^K O31 O78 p1 o0l -Z1L8 -o5^*29s|t +Z1 L8 +o5^ *29 s|t i9y iA1 -*95*6A -$Hp4 +*95 *6A +$H p4 $. $i $r -E^A +E ^A d D7 +3 O36 i87 p2 o8- i39 i7b sp9 -i8is?/ +i8i s?/ D1 i5n i5d i1b spS O1A i7f i3e -$|iA@ -saeo0v +$| iA@ +sae o0v ] o7c K O3B [ $! $6 @@ -55923,10 +55689,10 @@ i5a i6p i7r i5f i13 p1 O65 O31 i53 i36 -^x*7B +^x *7B t sLG -.3us!G -*65shc +.3 u s!G +*65 shc ^l ^l ^o ^r u ^d ^a *20 $2 @@ -55941,21 +55707,21 @@ K ,7 i1c i17 *41 k { i15 i1e -i9&*43 -+1*08 +i9& *43 ++1 *08 ^_ ^@ } z4 z3 -*95Z5 +*95 Z5 O51 i4A snM o83 saz Z1 -i60st]oB> +i60 st] oB> O92 OB7 R4 t -*B0'B +*B0 'B -1 i1_ -9 oA0 -$?$) +$? $) *72 s{n OB1 s@6 l $. $u $k @@ -55963,7 +55729,7 @@ i10 R2 O16 o0H Z2 O67 K *17 O41 -+8o3v ++8 o3v i0b i2r i1a y1 D6 O42 s@? @@ -55973,7 +55739,7 @@ $b *34 i7t i8t i9e ] +9 O14 u -iB$E +iB$ E Z2 o0h i56 i18 i6N $z O26 @@ -55983,32 +55749,32 @@ so0 ] D5 O23 $h $u $n $k $o i11 i74 -s}Ws>{sJ0 +s}W s>{ sJ0 i5f i75 c $1 $0 $3 OB1 .A .3 c $3 $2 $6 -snIs@/ +snI s@/ c *25 O13 *86 $3 O5B ^B .2 -,7Z2 +,7 Z2 $d $o $d $u -*64sTO +*64 sTO $h $e $a $r $t } D5 i30 -s{&o2u -s5U+Au +s{& o2u +s5U +A u D2 *59 +B -D +C sO2 -sW%o2Dy4 +sW% o2D y4 d T0 OA5 $o $e $s i7d i15 *52 ^s } o4a -*34*A8 +*34 *A8 ^W O05 $2 r $m $a $n i3c i7f @@ -56019,11 +55785,11 @@ p4 *64 l $. $n $e $t y3 o1a $0 *74 -i5od +i5o d $2 $$ Z1 *21 $1 -D9s 5*AB -sibo0Z +D9 s 5 *AB +sib o0Z L0 o2a OBA ^o i6% O71 @@ -56037,16 +55803,16 @@ i1c R4 L4 st1 u s6c Y1 D8 -D7o1L +D7 o1L i5r i6i i7n O43 O31 $x i4a i5s i6t -D3*26 +D3 *26 O23 +9 $J $a $n $1 o0h $a i4a i5s i6h -sXpsx1] +sXp sx1 ] l ^i ^m ^e ^s D3 R0 +2 t *57 @@ -56056,35 +55822,34 @@ O25 Z2 c O91 s92 i1e i2r i3a c i8- -s6^RAscg +s6^ RA scg sbU D1 ^s z2 -*13o7vs_w +*13 o7v s_w $! *24 *50 -R1k +R1 k k '7 i7U u o7S O68 TB c $1 $9 $0 o97 [ -O21 [ $X O8A z1 ^I i1o i2u i3n i0w Y2 i57 i5c i2l i3i i4p sJW -s]o'8 +s]o '8 $6 $5 $3 $7 O82 *27 OB8 K i3d i38 ^! +4 -*B6i9k^r +*B6 i9k ^r i59 R6 L5 i1p i2r O83 DA -sVuk*05 +sVu k *05 o4v O01 z1 o3z ^W $2 O05 @@ -56092,20 +55857,20 @@ i3f i58 i7a i81 i90 r t O41 i33 p1 -ry4 +r y4 $e i7a -^iT8 +^i T8 i12 i1f -8 o5m O72 TA *03 sjx O62 *13 u ^c ^a -$LoA; -.0*3A +$L oA; +.0 *3A $m ^1 -.0o4e -*19$/s-b +.0 o4e +*19 $/ s-b c T4 -4 O76 +B o12 O48 *02 @@ -56116,12 +55881,12 @@ i7c i8k -3 sfk i18 i72 s@T O08 z1 -sIZ.2R3 -$?$" +sIZ .2 R3 +$? $" i50 R0 L0 o53 $e oBZ O5B E -s RT6s&Q +s R T6 s&Q i6N O26 $z *04 T6 O63 $a o00 @@ -56137,7 +55902,7 @@ u ^0 ^5 u ^c ^2 i2f i3f *39 '7 -sDMs2Xo7F +sDM s2X o7F o6U +7 O43 $x O31 i2o i3v i4e @@ -56149,20 +55914,20 @@ c i49 T5 T3 } i5p i6i $w o4m -o2$*B1 +o2$ *B1 $1 ^> i4e i5r i6a -]RA +] RA Z2 O26 -0 o4l c ^1 ^c -*B6z2 +*B6 z2 $g -0 -oB$Z4*24 +oB$ Z4 *24 sIR -sacY3 -*65$+ -i1rsW5o0! +sac Y3 +*65 $+ +i1r sW5 o0! c ^7 $9 i0s i1u i2p $3 i9= @@ -56179,24 +55944,24 @@ l $l $i $k $e i1o i2m i3b i1h i2i i3l i7a i30 --8D6*29 +-8 D6 *29 Z5 OA5 u ^0 ^a -s{5^.sST +s{5 ^. sST i1h i2i i3c $8 ^. -*58D2*B8 +*58 D2 *B8 Y5 O5B *05 T6 i1o i2m i3o ^3 '7 -*A8}*10 +*A8 } *10 c $0 $? i30 z1 ^o z2 L3 O05 c $0 $; -.1{ +.1 { i0f i2r i1e ^z ^2 ^a O54 u @@ -56206,22 +55971,22 @@ $. ^0 o4v '6 +A O45 c ^5 ^d -}s|li7. +} s|l i7. o0a O46 ^@ ^8 -o3uiBC +o3u iBC oBV i1f K O4B O04 $x *71 -Y5'9 +Y5 '9 i3a i4n i5o o0o +6 $@ ^4 ^, '8 $2 ^/ i3n ^T *51 -swB.8 +swB .8 f O76 T2 T7 T5 T3 *57 i3s @@ -56231,21 +55996,21 @@ i1d i37 y5 Y2 O26 o0B ^0 o1u p1 -.1*09 +.1 *09 $3 ^2 z2 *61 sfI *04 .2 $! *74 -1 $5 -sI*sk7Y3 +sI* sk7 Y3 i14 i5f -s|Yo49 -s&_*59 -*23^- +s|Y o49 +s&_ *59 +*23 ^- O42 z1 i9c iAa -s`8]+9 +s`8 ] +9 i3k i4i i5e *41 d smt O81 @@ -56254,7 +56019,7 @@ K ,3 [ $b $e $s $t c ^! $8 D2 O32 z2 -]dD5 +] d D5 i2t i3m $. ^5 sf< @@ -56265,15 +56030,15 @@ p1 sbp } $X O52 R5 .8 O71 $- ^2 -z4Kq +z4 K q .0 +5 O23 -i9U,B +i9U ,B $! ^6 u ^4 ^a -snxs.6 +snx s.6 sFa -L6+7 -fp4*71 +L6 +7 +f p4 *71 l p2 K i2t iAX O59 i1e i2n i3i @@ -56285,7 +56050,7 @@ l { *02 r $m $e $n O8B O57 $l $8 -D4$Y,6 +D4 $Y ,6 $. $t $c O06 O45 $$ iAB @@ -56300,14 +56065,14 @@ c $= $9 *62 o12 *45 o4M .2 o32 -^9s&_ -sg3-1 +^9 s&_ +sg3 -1 { *75 o0v +1 o2u R3 ^B O67 O04 i17 i5e -*40$2scN +*40 $2 scN $F $M i72 i83 i92 $6 ^- @@ -56333,7 +56098,7 @@ i9e iAl iBl u ^7 ^0 L7 ] OB9 Y3 -y5$]s@F +y5 $] s@F o4k i62 ^2 ^+ i55 i30 @@ -56350,22 +56115,22 @@ o4g u i3e i4p c ^0 $! sxg -^lsWR +^l sWR -5 r [ ^f .A O37 c $1 $2 $8 $! i4f i5a c $) $0 $3 ^- -Y2Z4 +Y2 Z4 sAU oAO -{sVO+9 +{ sVO +9 o1& *13 o4D O21 $. O63 i33 i11 -s>/*A7sJY +s>/ *A7 sJY i3b i4l i5e c $7 ^4 s;M OA4 *24 @@ -56373,10 +56138,10 @@ c $( $8 +8 O08 c ^% ^1 u ^4 ^9 --3u*29 -s`**9A$` -s(!$z -L9s$a^| +-3 u *29 +s`* *9A $` +s(! $z +L9 s$a ^| -A O9B i33 i17 i4o i5v @@ -56396,25 +56161,25 @@ i42 i50 i60 i1n i2i i3m i3l i4l i5e c $+ $8 -i12i20i30i47 +i12 i20 i30 i47 $M $a $r $1 -ss1f +i8> s1f o32 ^c -*75'B +*75 'B i2o i3n i4e i2r i3a i4m -*68iBg +*68 iBg O54 $O i0W *41 o0H '9 i50 Z4 *42 ] O31 -^,s&Q -sE(} +^, s&Q +sE( } *57 o5R i4| ^G R5 O81 @@ -56724,24 +56488,24 @@ p1 O82 sL+ i1m i2a i3n o8= O0B z5 O72 R3 -sDgZ3 +sDg Z3 ^l ^e ^g ^n ^a i2a i3t i4e *78 $w *50 *03 O27 -R2q*09 +R2 q *09 y1 *8B O86 R3 -5 -o2- T4 O14 +o2- O14 i6{ O24 -y1s/|f +y1 s/| f i38 i15 O62 z5 O27 O1B z5 Y2 i22 i30 i41 i56 i2= C '7 $6 -[o37st6 +[ o37 st6 i14 i51 i16 i78 O02 O46 @@ -56758,14 +56522,14 @@ O03 *76 Y4 { o5z *15 ^p szi } -s_R$g +s_R $g ^. $p *03 -i3Ji2r -s'2*4BsG3 +i3J i2r +s'2 *4B sG3 f ,B O87 ^a ^k ^i ^r ^e i1b R7 L7 -iAFsP\ +iAF sP\ $( O51 o4K [ Z4 OA3 @@ -56780,86 +56544,86 @@ c oAm -7 TA O8B r Z2 *05 R4 D6 -+8+D ++8 +D i2r i3r i4e ssj i5r -*42i5x*34 -i5tp5 +*42 i5x *34 +i5t p5 OA6 *A0 } -+1+E ++1 +E i54 i38 s0S Z2 l -y4scv*20 +y4 scv *20 O07 $n O05 c -^uD7 +^u D7 i3e o2f $d $e $v $i $l R0 ^g D3 t Z1 -oAQTB +oAQ TB [ *10 y2 i71 R3 L3 $% O09 i79 i34 --5y5 -i4Ht -*B0sE`s +$$ $> stx l +5 Y3 O0A s3s O07 OA9 @@ -57018,13 +56781,13 @@ sD_ i2m i3b i4a Z3 Z3 O56 i3b R4 L4 -$=$\ +$= $\ D8 o8? i32 R4 L4 i14 i3c $j $a $n $7 -*B1^$ -*87-A*20 +*B1 ^$ +*87 -A *20 i1b -5 O4A *A2 C sP. OB7 @@ -57032,25 +56795,25 @@ i1d i77 ] oA1 $h $a $y $m $o $3 o93 -Z4*A4s1s +Z4 *A4 s1s o41 i3H l -*39o3! +*39 o3! sIV O3B OAB l $s $i $o $n O34 i5] z4 -*4BiBc +*4B iBc $1 Z2 O81 O92 +6 -so@*A9R6 +so@ *A9 R6 i4n i5e i6s { o1i *13 -slk*87 +slk *87 Z3 { '3 z5 } -o1Oi7uE -.6*03*79 -y1s}K +o1O i7u E +.6 *03 *79 +y1 s}K O35 $5 svt i59 R3 L3 @@ -57058,22 +56821,22 @@ OA7 ^I *46 O51 sMv *56 Z2 *A8 +A -$^$) +$^ $) R3 +0 -Z5oB|D2 +Z5 oB| D2 ^, $, -sAws@0*70 +sAw s@0 *70 i5a R8 L8 -s9 D2 +s9 D2 $! O18 -sU"-0 -$&$) -*59o3e -$*$> +sU" -0 +$& $) +*59 o3e +$* $> T1 i3m i1c i5b *40 *35 z1 -$S +y5 sDi s>S Y3 o0H -R4Z2 +R4 Z2 ^t OA8 i4, c $w $o $l $f i7r i8s i91 o5z O03 -s%7*6A +s%7 *6A *06 ^w i0J O65 i18 OA5 u @@ -57861,54 +57620,54 @@ i18 OA5 u -3 $t t Z2 i3y o4l u -D4u +D4 u i2r z1 O38 O6A z4 y2 p3 slt T6 -z3s=Co9e +z3 s=C o9e i15 z1 u $B *73 o8n O02 ^y i87 i91 -^9D7 -s8.i3E +^9 D7 +s8. i3E ^# O62 ] szZ -$?$$ +$? $$ $. $h $u *67 T3 $g i0r -*59o8TsqL +*59 o8T sqL O24 K $p R1 ^p sAj O0A *BA c $f $a $i $r $y sCO -i01sn` +i01 sn` u i26 -'B*03-8 +'B *03 -8 l ^e ^n ^i ^l OA7 se+ i21 *28 O87 E c ^p s_F -*08z5r +*08 z5 r o5p sek o7X +0 i54 O62 o60 *98 o71 +8 -K,7s?Y -i9hsiqo6U +K ,7 s?Y +i9h siq o6U ^k ^c ^a ^j Z5 O46 i7f i75 -o67y3 +o67 y3 L3 O45 -*16*60 +*16 *60 $y $u $r $i l i4d '9 o7z szM @@ -57921,8 +57680,8 @@ s1m i75 i34 i64 i77 l $t $i $o $n -sG($v -sP8k*04 +sG( $v +sP8 k *04 i7k i8s i91 i2t i3h i4i O73 o6Y @@ -57934,23 +57693,23 @@ o1A '8 i1v o5r $4 $1 $! o30 r -i2C*5B +i2C *5B o7J k -T7*69i32 +T7 *69 i32 i53 i3f o9h O62 Y1 o5F L9 l $# +7 -^/LB -,2*83y4 +^/ LB +,2 *83 y4 O1A iB\ y4 *20 -+9i05 ++9 i05 o91 Z2 o5- *40 Z4 O45 -*58$n +*58 $n L3 O56 *A3 o1k [ p1 T4 O12 Y3 @@ -57962,7 +57721,7 @@ l ^x ^e z3 O36 i11 O06 O13 *48 sW| -K.A +K .A 'D $8 ^f *18 o2` @@ -57977,9 +57736,9 @@ $w $i $f $e i3c i52 O4A sIO oBo O36 -'AsBq +'A sBq O25 T1 -^#E +^# E sFn $m $a $r $i $a o3C [ @@ -57994,12 +57753,12 @@ D8 i8J c $2 $5 $* $* l ^1 ^1 ^0 ^2 z4 O59 -C^U +C ^U $6 $5 $! $! .2 i17 c d 'A $7 C 'B $0 -o5h*98 +o5h *98 i33 r O18 z4 *15 $P O25 @@ -58012,11 +57771,11 @@ $9 $0 $@ $@ $w $o $r $l $d c $2 $7 $$ $$ [ i2A u -o7,} +o7, } $l $a $r $r $y $f $o $o $d c $7 $8 $! $! -C*08 +C *08 $f $o $o $l o0g T6 O15 c $8 $0 $8 $! @@ -58028,15 +57787,15 @@ c $9 $1 $* $* s(7 c $4 $6 $4 $! $p $u $s $s $y -s4o] +s4o ] O23 O38 c $2 $1 $3 $! -sBQsmr +sBQ smr c $7 $0 $0 $! *31 O29 -*57R6o1k +*57 R6 o1k sOu -lsz +l so> O35 Y2 $| K -*07$PsZ? +*07 $P sZ? O57 oBS *4B O73 O13 $h ^9 *91 *37 -z2i9E -,6i5d +z2 i9E +,6 i5d i3b i54 i3b i58 -.9.0 +.9 .0 D6 O63 i77 i7f s9= @@ -58393,7 +58151,7 @@ O25 s5@ *0A O79 s,z $u oA[ OA7 i2y -4 -sKn^0 +sKn ^0 s7@ s7N ,6 L7 -6 @@ -58409,7 +58167,7 @@ s*? $2 $5 $$ $$ O02 o4h $9 ,3 D4 *50 -sSRR4-0 +sSR R4 -0 s9e $k u D3 s*$ @@ -58421,19 +58179,19 @@ i1o i2o i3t c $1 $1 $8 $! ^n ^e ^d ^e l $9 $0 $9 -Z2.0 +Z2 .0 $5 $8 $! $! $4 $0 $@ $@ D9 *39 O26 -sP>sYh +sP> sYh $5 $8 $@ $@ i7b i3c $8 $7 $% $% -i9`s+Fi5` +i9` s+F i5` y1 -6 O06 q O24 s^V -i16*85 +i16 *85 i7v i8e i91 i79 i35 R4 $9 @@ -58448,10 +58206,10 @@ l $5 $5 $9 z3 -2 +C +C +E u z1 *31 -^#^@^!$#$@$! +^# ^@ ^! $# $@ $! $4 $5 $$ $$ i4a l -]t*3B +] t *3B *47 $t .4 O7A c $2 $0 $0 $6 $! @@ -58464,64 +58222,64 @@ i71 i39 k Z2 l '6 $8 $5 O83 -$&$+ +$& $+ O2B -1 l '6 $3 i1a i59 T2 '7 T1 T6 T2 T7 sSN -$.$~ +$. $~ o0C OA5 O52 c $0 $8 $$ $$ -^$d -KLB +^$ d +K LB $J L5 -^ *69 +^ *69 i1i i2j O05 o43 -*28-3 +*28 -3 s94 i75 l -{-5s)8 +{ -5 s)8 l $4 $0 $8 OAB L5 $0 $5 $* $* -i1P,B -LA+0z2 +i1P ,B +LA +0 z2 l $7 $2 $1 c $5 $8 $! -y1y3so4 +y1 y3 so4 O72 o3G $7 $2 $@ $@ -o98+3y1 +o98 +3 y1 l $7 $2 $2 -s@6Y2 +s@6 Y2 O13 ,6 $6 $3 $@ $@ $8 $1 $* $* y2 $f *10 -ds,e +d s,e y2 L4 i13 $5 O23 z5 l $7 $2 $6 o2% s`\ O15 O51 .9 O05 -y2*07.0 +y2 *07 .0 O15 l -^ysZfC +^y sZf C sm@ y2 O54 *A3 i3m i4e i5r i7e i3f -Z2z1D8 +Z2 z1 D8 i6M i7A i8R s54 -1 -$&o96 +$& o96 *28 O28 -*B8C+1 -,4s\w -o0+Y3 +*B8 C +1 +,4 s\w +o0+ Y3 +6 +6 -C O2B s_H i1: O75 *08 D7 @@ -58534,9 +58292,9 @@ s05 +8 q ] c $1 $3 $3 $! c $9 $8 $7 $! -i7>sLT +i7> sLT s3z -o7V*61*5B +o7V *61 *5B O92 { *92 l $9 $1 $4 i7f i3c @@ -58544,19 +58302,19 @@ l $9 $1 $9 [ +4 o5o -0 z1 u c $d $0 -*71sv)*38 +*71 sv) *38 i35 i18 O75 sck D3 s1Z O5B i34 *74 -L6$r*19 +L6 $r *19 ^1 -3 +1 +1 +E OA5 *36 ssr p5 s*f $" s}q OAB -$@K -r*27+8 +$@ K +r *27 +8 O08 z2 $a $u $g l $1 $5 $0 @@ -58572,49 +58330,49 @@ sLl O12 Z4 l $0 $2 $9 c o42 i7c i1e -}+A -*9Bs=& +} +A +*9B s=& l ^r ^u ^s $. $i $n $t i12 ,6 O83 O38 s!S i1t l $7 $4 $7 $6 r -D5slZsQm +D5 slZ sQm $, [ -6 -D c $c $e +0 +C +C l '7 $8 -iBGi2, +iBG i2, O78 s=k K s8{ O84 i2t i3t i4y -*B5Z2s#1 +*B5 Z2 s#1 R0 -6 +E -D -D l '7 $0 c $5 $0 $* $* l $3 $5 $4 -*71i12 -*76$/E +*71 i12 +*76 $/ E ] q c $1 $1 $4 $! $y *16 c $1 $8 $8 $! $7 $2 $? $? -R7*24 -i9RskM +R7 *24 +i9R skM c $3 $2 $@ $@ c $6 $1 $! -sP4D1 +sP4 D1 c $2 $9 $2 $! i4y +1 i3g $7 [ -2 d O27 $@ l $2 $6 $7 -i2TsgT -L1D2 +i2T sgT +L1 D2 srw t c $1 $e $T *87 @@ -58628,49 +58386,49 @@ O43 z1 O51 *04 *53 $y ,5 } c $1 $2 $4 $! -$=$* +$= $* $G c -0 c $9 $9 $8 $! Y3 Z3 OA7 l $3 $9 $3 ^2 D7 c -i8roAb +i8r oAb Z2 o50 +7 ^o ^y i40 i50 i60 ,7 -'BsU( -*7AsxW +'B sU( +*7A sxW i31 i10 O14 o40 iA7 o95 -s?e^# +s?e ^# l $. $r $u c $6 $1 $9 $! *54 OA4 T3 OB3 $4 $5 $! $! -i43*23 +i43 *23 $5 $1 $! $! [ C o2W -$z*2A*85 +$z *2A *85 i2t i3t i4e -tcsOC +c sOC $3 $7 $* $* o77 -1 l [ u -4 $3 $0 $* $* -sSM*49R3 +sSM *49 R3 i7e i58 +8 se, i7e i50 -i42i50i61i73 +i42 i50 i61 i73 ^m z1 D5 c $0 $6 $! $! -sIpsTW +sIp sTW *4B *37 +A -,8^/ +,8 ^/ OBA $F z1 -sabsN/ +sab sN/ O35 } *30 R4 +6 -5 c $5 $1 $! $! @@ -58687,36 +58445,35 @@ $3 $2 $* $* O71 c $2 $8 $3 $@ $@ sg" OA3 *14 -*45.8 -rsEts.E +*45 .8 i2n i3e i4s T1 T8 T7 T2 -R3C +R3 C c $1 $8 $1 $! i13 i74 i56 i38 c $9 $3 $? $? o6@ '8 -*A3s3h +*A3 s3h O67 *75 i7g i8o i9n *05 d $2 $6 $? $? -R0*5A -q*57 +R0 *5A +q *57 '7 $$ c $a $3 c $a $5 d sam -oBzi9` +oBz i9` $0 $4 $@ $@ -s20Z4 +s20 Z4 i4o i5v i6e Y3 *17 -iBzo9fz3 -T9Y4 +iBz o9f z3 +T9 Y4 i2e '7 -R0o4| +R0 o4| f '7 c $2 $3 $# $# T1 T8 T7 T9 @@ -58725,19 +58482,19 @@ sP[ $1 $0 $? $? sLZ sqX -+B*25 ++B *25 L1 T0 $j $e $s $s $e -Ci58 +C i58 $7 d O62 D0 *06 O87 -{{i6w +{ { i6w o4u t o2B l sxr $9 $8 $? $? +0 +B +1 i76 i1b -T9o9pi9^ +o9p i9^ *5B O05 [ E swy O2B sl6 p4 @@ -58746,49 +58503,49 @@ oB9 O05 c $9 $0 $9 $! $7 $8 $* $* i6a i71 i81 -*B8[Y5 -i22i30i43i51 +*B8 [ Y5 +i22 i30 i43 i51 O35 O45 -*25sta +*25 sta i1d i30 -$-$; +$- $; c $2 $3 $2 $! -s)0Y5 +s)0 Y5 +A -E -E -sa,*94 -TAi5IDA +sa, *94 +TA i5I DA c $4 $4 $* $* f O18 z2 o5' +0 ^y +7 l -*2A^b +*2A ^b i1d i35 c $8 $7 $8 -o8mZ4Y4 -*79s_C +o8m Z4 Y4 +*79 s_C sp? l $6 $2 $1 -*B5,9 +*B5 ,9 +C -D +E c $0 $1 $2 $! c s2m +1 O28 T3 srh l $1 $8 $2 -sV&o1P +sV& o1P c $1 $1 $5 $! c $3 $3 $$ $$ -[$\o0P +[ $\ o0P d '3 p1 ^2 D7 i7i i8d i7n i8t i91 d 'Q ^h Y2 -i1Gl +i1G l $2 $2 $# $# OA2 .4 -*85r*68 +*85 r *68 c $6 $3 $* $* d o0p i4j i5u i6l @@ -58801,7 +58558,7 @@ o8C O35 $2 $0 $? $? ] $+ l ^t ^o ^n ^k -sp2s4{ +sp2 s4{ c $3 $4 $@ $@ c $1 $8 $! $! o9J *13 @@ -58821,7 +58578,7 @@ L2 u i4? *32 O01 i13 i3c l $i $d $e -oB/sCu +oB/ sCu *45 *52 c $7 $1 $1 $! *81 O32 @@ -58830,10 +58587,10 @@ i0Q O26 $+ *24 $6 $4 $@ $@ $4 ^r -DB*94^b +DB *94 ^b o0Q sck c $5 $5 $* $* -$@$~ +$@ $~ .4 sgp c $9 $9 $0 $! c $6 $6 $! $! @@ -58853,10 +58610,10 @@ r $i $v $e s9b sfm r TB O74 -ssgs7",4 +ssg s7" ,4 syU i34 i5c -L0iBNE +L0 iBN E -2 z1 Z1 c $b $o $o $k Y5 O1A @@ -58869,8 +58626,8 @@ sL6 t o5J O5A Y2 O1B .8 ^v -sXf-4 -o2I*49 +sXf -4 +o2I *49 r *05 Y1 -5 $* i0d i2l i1e @@ -58878,12 +58635,12 @@ i11 i29 i38 i42 Z3 OA6 *58 i92 O9B s3I -R7,2sr( +R7 ,2 sr( Z2 o3u Z2 i78 $Y k sux -sLp^_ +sLp ^_ su} i0H i2l i1e i3l i4o sfc ^k @@ -58891,20 +58648,20 @@ i22 i30 i41 i57 sW, O91 iB4 ,3 Z1 -sj[o3= -$Eo3t +sj[ o3= +$E o3t O95 O23 o0W C O47 o8) O51 O5B RA O5A ^U -ci2lL8 +c i2l L8 sf0 l $0 $1 $4 -*50o67 +*50 o67 sf4 y3 ,3 -{z1z3 +{ z1 z3 oBa +A O98 RB sR# l ^h ^s ^a @@ -58917,18 +58674,18 @@ $> O14 ^S C z3 oAx O87 O61 Y5 -R8} +R8 } R6 *65 -*4A}^$ +*4A } ^$ sVT s#i O8B *04 i0K *43 l $0 $9 $9 ] D1 f i3* O61 -Y3o91 +Y3 o91 *23 ^W p2 O07 -*65*15t +*65 *15 t *10 o4w Z1 sH! o27 p2 @@ -58939,7 +58696,7 @@ l $5 $1 $1 p1 O65 [ O76 +7 svB *15 -st6*63 +st6 *63 i32 i40 i53 i60 i0g i2e i1r O54 Y3 k @@ -58956,36 +58713,36 @@ z1 o5k i11 i29 i36 i43 se3 R0 i6i i7e i81 -smJt -*34sIa*52 +smJ t +*34 sIa *52 i74 i1b ^q *57 O23 l $! s*D DB u sK9 -z5seS'A -sU,z1T7 +z5 seS 'A +sU, z1 T7 sIU d p1 O15 -*75o1rsg1 +*75 o1r sg1 'E $5 Z1 s2^ o6? E O5A *73 { -$TsLU*91 +$T sLU *91 i30 i53 .4 Z4 o12 *04 u i68 -T7stc*04 +T7 stc *04 u $9 $8 $8 ^0 *41 O91 *01 ^H ^4 O28 l sz2 l $1 $6 $8 -Y2o7u +Y2 o7u l $1 $1 $8 '9 Z5 i8n i9c iAe @@ -58999,7 +58756,7 @@ l $k $h $a $n o2I k l $1 $1 $6 z1 i3k -*A6p5 +*A6 p5 Y2 y3 o9Y c f s1& O53 @@ -59017,7 +58774,7 @@ c $o $l $1 *52 ^, $z i53 i38 -y4E*49 +y4 E *49 i1d i73 f O62 i53 i34 @@ -59031,7 +58788,7 @@ r T9 ,8 i78 OA4 o3@ O84 *AB k -$#$? +$# $? *26 Z2 D2 l $5 $2 $0 O02 ,6 z5 @@ -59040,12 +58797,12 @@ o4z l { i0H i1e i3l i2l i4o O63 DA $4 $8 $0 $7 -sIg*82} +sIg *82 } sfp k $3 $3 $0 $8 c $h $e $a $d O48 Y1 o5F -i82i90iA3iB2 +i82 i90 iA3 iB2 ^5 c c '5 $8 i5f i16 @@ -59053,27 +58810,27 @@ oBj O04 *83 O41 *61 i36 i7e *14 ^q -R5t +R5 t *10 Z1 o4w c '5 $2 -^QsrR +^Q srR i0u $3 *13 d O52 +4 $Y Y2 } i5V -*8AsQA -scCk +*8A sQA +scC k l $2 $5 $6 -ko4g +k o4g $3 $2 $9 $8 i30 i17 -*69*7Bt +*69 *7B t l $2 $5 $2 ^C ^1 l $3 $3 $2 T2 ^I -*A5i6; +*A5 i6; $5 $0 $6 $9 svp O74 iAU @@ -59085,16 +58842,16 @@ Z4 Z1 O75 o4} E se+ f O4B -i3R*23 -D9^[ +i3R *23 +D9 ^[ *04 $y *53 O05 C z1 -*52z1sDL +*52 z1 sDL l $9 $2 $2 sZT O23 Z1 sdg l $1 $7 $8 -*89s.Ks!X +*89 s.K s!X oBO O83 si" sZ= @@ -59106,22 +58863,22 @@ Z5 O0A *71 O56 *01 sVQ O1B *06 r -s|1i29 +s|1 i29 l '8 $4 *62 ^f *B3 O19 *A3 O27 -[T5K +[ T5 K } sUO l ^2 ^0 ^0 ^2 -z2^W +z2 ^W l '8 $9 Y1 ,8 i4b i5u oAU O0B o5s Z5 .6 O94 -*87u +*87 u sf( $C $T l $3 $6 $0 @@ -59137,7 +58894,7 @@ Z5 O65 $q K r .7 ^V O78 ^l -o1K.1 +o1K .1 q O17 -1 i76 i1f ^F O19 @@ -59145,13 +58902,12 @@ y2 O4B -3 O21 *A0 p4 i9x -A '3 p2 -O82 k [ -[+As/u +[ +A s/u o2 ^t sge i9" i52 i13 -$7l^m +$7 l ^m .1 '5 u $1 $0 $1 sHh @@ -59164,16 +58920,16 @@ Y3 O6B $v i56 i3b *74 O48 *7B c i69 -+5sgm$_ ++5 sgm $_ i23 i39 c i61 i1) -i7cs=. +i7c s=. $Y *63 i32 i40 i52 i69 i32 i40 i52 i65 *75 o5L -*68iA1 +*68 iA1 i50 i3f i13 i1d $h $e $i $d $i @@ -59191,43 +58947,43 @@ s7W O67 i4E s,M Z1 iA7 -{s>ty1 +{ s>t y1 O71 o2E s0v o6_ z3 O43 i5 O04 *72 ,4 O29 i73 i17 -{+3*A5 +{ +3 *A5 +9 *9A -s*R*79 +s*R *79 O26 -5 -squ{sAz +squ { sAz sUD L0 '2 s4F r O18 p4 d $d l $0 $8 $9 -'BZ4[ +'B Z4 [ .5 ^w o2V y4 -sGE*67sfj -$Y-9 +sGE *67 sfj +$Y -9 O41 f $J .3 l $f $u $l s8Y i1y i2s i3g i4i i5e -k*08-5 +k *08 -5 O14 O51 *63 y4 k [ O16 p5 l $8 $9 $9 R1 *5A O69 O37 O17 s9+ -r^8 +r ^8 Y3 O43 t *54 *20 ,9 r o51 @@ -59244,29 +59000,29 @@ f i1J O89 O06 *35 T0 TB T7 T3 D7 $+ -*A7s,z +*A7 s,z *31 ^@ -se8+2,9 +se8 +2 ,9 o0O u *53 d ^* O51 -$J*23 +$J *23 O37 z2 l $0 $0 $5 K z1 } ^G Y1 -{*89 +{ *89 l $0 $0 $8 -$`*80 +$` *80 s9R -^O*86 +^O *86 i3a i4r i5i -R9T1+A +R9 T1 +A i1a i2w -p4s94 +p4 s94 l $4 $0 $9 E o2W -*43Z2 +*43 Z2 i71 i36 $i Z2 O15 sz4 @@ -59284,19 +59040,19 @@ Z3 -9 } sro 'A scZ z2 $s -L9rZ1 +L9 r Z1 D2 Z2 O67 O87 l $2 $6 $2 y5 +5 l l $o $u $s y2 *65 -d*29 +d *29 RA O52 i1b i30 -sz1i07+7 +sz1 i07 +7 i50 i15 -oBLY5 +oBL Y5 o4v i0x O13 R5 o0` r @@ -59316,18 +59072,18 @@ O4A Z5 ^s O1A ^b d i51 i37 -LAsV, +LA sV, sP9 O87 L8 -L3D8 +L3 D8 sPf $! O19 R8 $3 O25 sZM Z2 y2 i4m sE3 -*84o0DY4 -oAVs#D +*84 o0D Y4 +oAV s#D O95 O42 i5e i6a i7r $h $a $p $p $y @@ -59354,7 +59110,7 @@ O14 z1 ^t ^a ^p .3 i76 z3 Z2 O47 -$,$< +$, $< ^f Y2 ^! O43 T0 $j @@ -59362,7 +59118,7 @@ T0 $j O71 o3| O81 Z4 T0 $V -y3^Z*8B +y3 ^Z *8B o5, O61 f O84 *35 $v $a @@ -59375,14 +59131,14 @@ O48 i0Z sBO O02 z2 O52 l D3 i0' -Z1o7.y4 +Z1 o7. y4 i1b i39 ^s ^p ^e ^e ^p i10 i78 ^E z1 p5 -0 Y4 K O45 -o3e*A2*65 +o3e *A2 *65 slB *38 O38 sWG @@ -59399,7 +59155,7 @@ i11 i5c O36 LB *41 i7x i4e i5n i6t -o2HDA +o2H DA i0P ^E oAH i5i $q @@ -59413,19 +59169,19 @@ z2 ] i19 Z4 O0B sL9 i72 i39 -$.$] +$. $] O27 $L o1I +2 i6s i70 sCJ *40 i6K u *04 ^0 -z3,4 -iAxsc6[ +z3 ,4 +iAx sc6 [ sGH ] *86 O04 D0 spe -ro2E +r o2E i3e i4m i5e ,3 sNU ^< c @@ -59434,7 +59190,7 @@ O24 $C *31 i99 Z1 [ y1 Z4 O69 sjK -ko2niBS +k o2n iBS *81 t '7 sTW -6 D1 O92 @@ -59448,28 +59204,26 @@ $0 O14 Y3 $v O6B O56 *50 k *62 -^4i9\ +^4 i9\ i57 i30 O15 } *81 O68 sO5 z3 O47 Z2 $a $b $b $y -$,$/ -stysAn +$, $/ +sty sAn l [ ^u O75 *67 -[ ^X ^f +8 ^X *14 $M O27 o7K O13 snZ K -[ ^U ] O46 ^b ^o c $6 $5 $6 -*09qs?l +*09 q s?l l ^6 ^9 ^9 ^1 i3v i4e i5r O74 O93 y1 @@ -59477,7 +59231,7 @@ O74 O93 y1 O52 z4 $a *81 i3v i4e i5n -E*29 +E *29 o0) o4j -1 i4a i5n i6o @@ -59495,40 +59249,40 @@ i70 i19 O24 *31 $C -0 Z3 i4d *42 O37 -o5Vs&J +o5V s&J c ^g ^o ^d $l *23 -$"$( +$" $( sn| sFo u -t*05*57 -s4Is)*l +t *05 *57 +s4I s)* l i1c i7d T0 T1 T5 T8 -$]*B8 +$] *B8 ^! *51 sAq L7 u -iBA*19 -sV{y2*45 +iBA *19 +sV{ y2 *45 ^X *04 *38 s\u O59 svT i8a i91 iA3 ^J R6 -soAb +t $> oAb $I T6 sy1 O36 O14 L0 @@ -59871,7 +59624,7 @@ o24 u ^r o2x ^1 Y4 T0 T7 TB -^Ys`%sW' +^Y s`% sW' O04 y2 Y2 c $8 $9 $4 O35 T2 +0 @@ -59881,8 +59634,8 @@ O24 y2 Y2 c $2 $6 $5 c $0 $4 $4 c $6 $1 $2 -o5o*90*51 -*20y5 +o5o *90 *51 +*20 y5 O62 *A7 i1u i2f $2 ^& @@ -59900,8 +59653,8 @@ c ^@ $7 ^r z2 c ^! $7 c ^! $0 -i8 R9snf -*82$_.2 +i8 R9 snf +*82 $_ .2 $5 ^# O46 '9 i3e i4i @@ -59912,36 +59665,36 @@ $5 ^4 O76 D5 q iAA $$ ^8 -.9^S} +.9 ^S } i2l i3v $5 ^_ $6 ^. c $. $n $e $t -o1csRx +o1c sRx o4w .6 i2l i3m '5 *20 *14 c $H se? i2c i3k i4e -*2As`7$f +*2A s`7 $f R0 ^E c $, ^1 -s-\$= +s-\ $= } ^7 i3c i4h i5a c $4 ^8 o6G $B --BsKL +-B sKL c ^6 $8 i2c i3k i4i c ^6 $! -$EK +$E K c $) $4 o7$ O24 c $& ^1 c $4 ^@ -sWA*03LA +sWA *03 LA R8 $N c $! ^5 i99 iA9 @@ -59950,46 +59703,46 @@ o4m *07 ^8 R1 ] O25 O17 { -o9SsaAs/U +o9S saA s/U +1 O92 i8s i9t iAe -s`4^Co79 +s`4 ^C o79 c $0 ^4 -c ^ $1 +c ^ $1 ^6 p2 c $0 ^# -uRAR7 +u RA R7 O86 O54 i1a i2t i3o O05 ^m O64 sjq c $0 ^@ i4e i5s i6s -D9s]^ +D9 s]^ ^e $7 $u O67 i5t i6h $a o6h +3 ^l y5 RA -o8\iAQ +o8\ iAQ sjx .4 $k d O27 .A -R9.9 +R9 .9 O81 O24 d K O62 -o6$L9 +o6$ L9 i6t i7i i8o o2j Z1 c $8 ^* sl; D1 i1r i2e i3n c $8 ^4 -qs(8 -.Bsh8Z4 +q s(8 +.B sh8 Z4 ^b oBh O27 -Z4s*Q +Z4 s*Q $z *72 i26 i34 T3 T8 T7 @@ -60036,18 +59789,18 @@ c o8$ c $/ $7 y3 O18 d o1I T4 -i5rL8*19 +i5r L8 *19 Z2 O72 -o6zlY1 +o6z l Y1 f O16 i3k i4e i5t c $5 ^7 -*70spr +*70 spr ^t ^a ^h i3n i4g i5e sib Z1 c $% $6 -Y1p5.9 +Y1 p5 .9 DB O12 y2 o5c i3s i4a i5n @@ -60058,13 +59811,13 @@ c $% $0 *25 z2 i6a i7n i82 $x ^b -li44 -*70y2 +l i44 +*70 y2 sxs +8 o6B +4 -1 Z2 -*9A^8sXT --5y4 +*9A ^8 sXT +-5 y4 O04 f L6 D5 c $4 $_ @@ -60081,17 +59834,17 @@ c $4 $+ i15 i3d L5 i6g T2 TA T4 -$&K +$& K *3A i7! O4B i2e i3m i4a i5n i6d i7o ^3 c -o7bs[h*34 -*A3*98 +o7b s[h *34 +*A3 *98 $# O61 T2 TA T3 sml k -r]i9w +r ] i9w $3 ^_ O27 Z3 c $$ $6 @@ -60099,7 +59852,7 @@ c $$ $6 ^3 ^! c o3! z3 o0f -L8s*P*39 +L8 s*P *39 c ^2 ^! ^0 ^@ c ^1 ^* @@ -60111,9 +59864,9 @@ c $3 $/ $i r i0n c ^& ^9 -sgOq +sgO q i4n r -D9oBc +D9 oBc c o1! l +A O45 O81 d D5 @@ -60134,10 +59887,10 @@ t $T *76 ^5 ^@ $7 ^_ *19 O08 -4 -Z1sE"-0 +Z1 sE" -0 Z3 c O85 ^* ^5 -o7Os7T +o7O s7T $i t O51 *98 ^[ ^1 @@ -60150,7 +59903,7 @@ o3t O47 c $2 $& i90 iA0 O24 OB6 -sYR.8 +sYR .8 *14 u O8B i51 O04 [ p2 @@ -60170,7 +59923,7 @@ i75 i1f ^1 ^< *85 i7e ^6 ^% -Y1-0+5 +Y1 -0 +5 T5 { i51 i14 c $, $8 @@ -60182,12 +59935,12 @@ O78 O81 sgj p3 *3A O25 O23 $_ ^9 -sAX^PsPK +sAX ^P sPK i76 +9 i4o i5y i2t i3r i4i slx ^i -Y1iBY-4 +Y1 iBY -4 iAj iA3 OB7 l ^d ^d ^a $i .4 @@ -60205,7 +59958,7 @@ $g O48 O46 ^R ^1 O76 $G -0 c -rKT9 +r K T9 $x D5 t z2 o2g O35 *43 R3 @@ -60217,7 +59970,7 @@ c $+ $+ sn4 sn0 +3 ] y3 -T9*62 +T9 *62 $7 ^. *32 Z2 O04 Z4 @@ -60228,9 +59981,9 @@ $0 ^( D1 $o OA7 o5e *37 OB8 Y2 -R4f +R4 f i9y iAe iBr -ci4OR0 +c i4O R0 $! ^8 O96 Y5 i8r i9d iA1 @@ -60246,46 +59999,46 @@ o3s C $* ^2 ,1 O21 $* ^0 -TAs=!$< +TA s=! $< Z1 ssu *56 D9 +3 c $5 $= T1 O54 -+6,A*01 ++6 ,A *01 O41 z2 -*95i0n -s-\.3 +*95 i0n +s-\ .3 c $5 $- O46 -2 -$(s8U +$( s8U O15 O68 shQ $@ ^8 -sV7D9 +sV7 D9 $@ ^5 $@ ^0 Z1 $m O46 -'7sb)D8 -sz|i21 +'7 sb) +sz| i21 $4 ^- -s0$*0B +s0$ *0B ^@ ^7 l ^t ^u ^o $3 Z4 -^dsB[iBH +^d sB[ iBH O73 s23 $? ^6 -B ,8 -r$i*B1 +r $i *B1 oBi [ $8 ^- O82 O06 i3s i4i i5e O91 OA3 O83 -*A4*41 +*A4 *41 O5B [ f OB4 c ^- ^4 --6s+{D2 +-6 s+{ D2 $. $t $t O42 *96 .2 O94 O13 @@ -60294,10 +60047,10 @@ l O23 z2 $7 O26 O35 [ $' i6g i7h i8t -$ *57 +$ *57 c -1 i3b i10 -s*y^W +s*y ^W i6; O53 ] z2 -2 K O01 ^z d @@ -60326,11 +60079,11 @@ C i27 i1p i2e Z1 f O38 O27 q -^m*98k +^m *98 k R8 O25 $3 r +9 O52 ^$ -smRi9K +smR i9K o1n { spu sJt @@ -60346,23 +60099,23 @@ i4o i5m i6a *51 O69 s8q Z1 R1 Y2 -'8cy4 -o7g*36^% -^@i9' +'8 c y4 +o7g *36 ^% +^@ i9' +4 *92 i11 i29 i39 i40 c i24 T3 +3 o0$ *50 o34 -*42LA -slJ-7 +*42 LA +slJ -7 ,5 Y2 r O04 R0 ,7 s)N o0Y O43 t R1 i16 i1d -o31TA +o31 TA D6 -6 ^5 D2 O6A ^W O76 *58 o5c @@ -60371,7 +60124,7 @@ i5a i6r i7i O67 i1w s+} ,6 ^g *70 *05 -s9o*7B +s9o *7B *32 $9 i4o i5c i6k sMB } @@ -60384,11 +60137,11 @@ $R T6 *85 Z1 -9 -6 Z1 syg -p3sGS +p3 sGS l o7T -0 i57 t *83 O92 -o7=] +o7= ] o1I ] O84 O58 O84 O49 O67 @@ -60398,7 +60151,7 @@ s1T z1 sot i20 -3 i0( +6 -]*A1iA2 +] *A1 iA2 .5 ^1 ^l ^i ^a ^j *07 O71 @@ -60409,14 +60162,14 @@ D3 ^i u i5! u i2S *10 s37 -o2}$? +o2} $? seo s25 o5! .1 -*6Bs)D +*6B s)D -7 sla t o0H O6B ^* -i4mo1Ys$3 +i4m o1Y s$3 c i1W $* z1 $. $a $z @@ -60429,8 +60182,8 @@ i1i i2k i3i i2p i3e i4r ^y l +7 *23 z1 -*9Ai7T -]s4;$q +*9A i7T +] s4; $q O03 O9B *20 ^6 t i1d Z1 @@ -60440,7 +60193,7 @@ d i5, O71 f u OB3 q O07 -s(J] +s(J ] ^i *02 ^M ^W O52 { @@ -60457,8 +60210,8 @@ sfo *20 O54 $t *92 -4 D1 *10 Z2 -fz5 -o04.A +f z5 +o04 .A y4 O4A o1m L2 y2 O4A @@ -60466,9 +60219,9 @@ o5v O82 ] $i $c $e $s +6 D3 D9 T3 -ls!Wz1 +l s!W z1 c o07 -'Bs$< +'B s$< -1 ^5 O8A T9 T7 T8 TB @@ -60479,11 +60232,11 @@ st% p2 O94 { sxr sqn -oAO,1oBt +oAO ,1 oBt i1s i2d *43 ^y *82 l -,0*97R4 +*97 R4 i8e i91 iA0 OB2 O97 saG @@ -60505,9 +60258,9 @@ O17 y5 O52 iBK *94 O61 slw O35 -.0s\Qs[Z -*79i1v -DAL8 +.0 s\Q s[Z +*79 i1v +DA L8 O68 p4 *A6 o41 i59 i67 l ^n ^u ^g @@ -60539,8 +60292,8 @@ l $. $p $m i7n i81 i91 t O07 Z2 o2d -i3b*68R9 -oB=s6x +i3b *68 R9 +oB= s6x p1 z2 O25 O15 O41 sp2 @@ -60548,13 +60301,13 @@ suh K +4 .8 O52 O1B y5 sD. -^m*42sj. +^m *42 sj. O43 D4 D7 i8* *03 -8 O15 l o5x ,9 srv -^^*A4 +^^ *A4 s^# O34 O2A i61 i79 i89 ] s94 @@ -60567,7 +60320,7 @@ Z1 i5= s7* ] i1m i3p i4l -T8^Z*85 +T8 ^Z *85 o0n t OB1 o2a $9 *61 O02 @@ -60577,10 +60330,10 @@ $z sry sgl l s0- +6 si1 se3 u -^w*4B +^w *4B o0n o7X *24 ] p1 -o9;i2M +o9; i2M O3B sf( i41 i66 o78 i1a i2h i3a @@ -60592,14 +60345,14 @@ k O15 t *53 +A i1e i2i *13 o7v -i9s]i +*53 s|> s]i t sBv T4 } O64 *81 @@ -60790,7 +60542,7 @@ i11 i29 i37 i46 i7k Y1 i4s i5h i6a -3 ^$ -'B*31s;T +'B *31 s;T $w i2d R7 o3y snP @@ -60798,20 +60550,20 @@ D6 *43 O14 $m o6l y2 i8t i9a iA1 -$q.BiA? +$q .B iA? o6V p4 o7- } f O65 $2 i8x OA1 p1 +5 l ^l ^i ^a ^j -R0l +R0 l sbl O98 *26 O85 sfu i5# -A TA -*8AsKj$g +*8A sKj $g *24 i3a $p -i8lTB +i8l TB k $Z O37 OB3 i6M O73 O84 @@ -60830,7 +60582,7 @@ u -8 D5 o5z -4 i7! $2 O42 O16 -sBf+4+5 +sBf +4 +5 O54 i8i *51 O71 *51 OAB o0K @@ -60839,7 +60591,7 @@ $p *15 ^n ^a ^m ^m ^a s.A $Y k r -Y3t +Y3 t i0r t ^8 l z3 o1c @@ -60847,8 +60599,8 @@ z1 Y2 O09 $b *94 stY $* D3 -*30*3A -us`/ +*30 *3A +u s`/ $. $k $r O3B *16 -3 k R3 @@ -60857,11 +60609,11 @@ l $i $l $y i76 .1 OA7 o0g z2 O26 *54 -t}*08 +t } *08 } s1d *30 ^3 R6 O76 -s_3-Ap1 +s_3 -A p1 K O62 i6& z2 ^y $7 $5 $! @@ -60869,7 +60621,7 @@ i7a i8d i91 i6l i7l i82 $j O02 *32 i7m -[i6m +[ i6m OA9 ^i $. $c $c z4 O85 f @@ -60881,10 +60633,10 @@ O92 o76 ^O -6 Z1 o4n Z4 O36 -sjRo0I +sjR o0I sa3 O15 Y4 O5A -*21*7B*73 +*21 *7B *73 i4r i5o i6c OAB *20 D1 r $a $n $e @@ -60897,16 +60649,16 @@ su\ r ^@ o5G y5 o6B *25 -DAo4a +DA o4a l ^l ^i ^a ^s i7n i8o z2 O54 y1 *52 ^b *51 ^W -$/Y4sCZ +$/ Y4 sCZ i42 ^z i1f i10 -,0 i6h O6A +i6h O6A D4 T1 i7O Y4 O8B i2r i3o i4l @@ -60918,7 +60670,7 @@ i3c Z1 i7n i82 D1 O3B O65 $B $C -s\*T1o2? +s\* T1 o2? .8 .9 i92 iA4 i3h t @@ -60927,9 +60679,8 @@ i5_ *97 o6a ,5 saN +4 Y3 -.3Y2 +.3 Y2 -7 *67 ,9 -d O62 K O68 Z1 O32 s}y R6 O65 @@ -60943,7 +60694,7 @@ t i0h u o14 o4X Z2 t r k -Y5s+Xt +Y5 s+X t $? .3 Z2 s0G l $. $l $u @@ -60958,8 +60709,8 @@ $f *34 $? *87 OA1 K LA O82 -*A9,Bo2e -syZ$? +*A9 ,B o2e +syZ $? i8o i9n iA1 +4 d $9 $2 $6 $3 @@ -60972,16 +60723,16 @@ sb8 u c *51 Y1 ^/ '8 $h T6 -*49-4*6B -*32*8B +*49 -4 *6B +*32 *8B o41 $v -*42*27z4 +*42 *27 z4 $3 i3f O56 O49 Y3 ^A ^C $i O15 Z2 T1 T3 TA -*1A+0 +*1A +0 O84 ^x .3 o6@ $3 i7y @@ -60989,24 +60740,24 @@ Z2 *17 *A1 OA8 -0 OA8 o0r i0c -i6!o6*o3C +i6! o6* o3C { i1x i4a OA6 O81 i79 *A9 ^K s5c -o60r +o60 r O32 d -2 T3 T9 T7 $% c O56 +9 D1 o1x u -*39} +*39 } i2d i3e i4r i52 i18 { O05 Z4 o3x O9A O23 -*6AsyLD2 -Z2T5i4x +*6A syL D2 +Z2 T5 i4x i2p i3l i4e OB9 i1- O13 Z2 ss5 @@ -61014,12 +60765,12 @@ i56 R0 L0 z2 i5L O36 i1n i2g i2o i3c i4o -]s"t +] s"t i1d R3 L3 p3 O71 siA3 +iB> iA3 i2d i3d +5 *79 -s*9Z5 +s*9 Z5 i2d i3f y2 O23 o1X ,3 ^V -Z5.5 +Z5 .5 ^- l O52 s3^ ] o3W i0b *57 z1 *24 --6s7p +-6 s7p $p $o i54 T7 -s$;+0 +s$; +0 { Z4 O05 s@S O61 $1 c @@ -61151,15 +60902,15 @@ O52 ^3 K i1k O42 i9e iAr iB2 o21 smH -oAtsn@ +oAt sn@ R4 D5 i4y o3` -sK>Z2s=1 +sK> Z2 s=1 i2a i3n i4k -sFr,4 +sFr ,4 y1 $@ o0( -7 -+7sNE*48 ++7 sNE *48 *2B OA3 i4i i5l i6l p4 o1a o2n @@ -61183,7 +60934,7 @@ i57 R0 L0 o4i O01 L6 +6 o68 D2 -i39.3*91 +i39 .3 *91 o2- O7B OB2 O91 i2m i3e i4s @@ -61197,7 +60948,7 @@ Z1 o5u ^s ^a ^b ^b ^a i3t i4l i5e OB7 O53 -o63R7s%A +o63 R7 s%A i12 L1 R3 O69 -0 *07 $p @@ -61208,11 +60959,11 @@ i51 R4 L4 r O42 O51 o0s D1 y4 -*65*9B +*65 *9B l ^o ^p ^y ^h i73 +6 +A $- -o1as(m +o1a s(m i4d i5r .8 O6B o0k p1 @@ -61223,7 +60974,7 @@ o1y T5 o1r Z1 L7 *47 i01 i19 i31 i29 -$ +sJ* *59 D5 +*98 L7 ^> $. $p $e o8p *84 +5 $O i2k i3k i37 L3 L2 -s^a,7 +s^a ,7 i11 R3 R2 -+3s=J ++3 s=J O52 $e E -r*8Bs_U +r *8B s_U ^k $$ d O05 D5 -7 $o @@ -61331,21 +61081,20 @@ i39 L2 L2 l $. $j $m ^9 D3 OB4 TA -y2sk= +y2 sk= ] $@ o3h r ^F +6 d O51 O12 $. $b $r -i99 [ Z1 -*54s}a +*54 s}a $p .6 o1D *21 i6s O09 D6 o0g -o0Qs|{ +o0Q s|{ ^f '7 $s p2 .5 -sZ-'AsJh +sZ- 'A sJh O7B $c +4 T5 i3m i4i i5n @@ -61355,15 +61104,14 @@ sWT Z1 $d O21 ] k Z1 { { -s/R*36+7 +s/R *36 +7 T2 T7 TB -*73Z2 +*73 Z2 O52 K ^3 -D0 O92 [ i8b [ i6o i7o i8d R0 i15 -*A9f*94 +*A9 f *94 k O71 Z1 sdW Y2 O42 @@ -61376,7 +61124,7 @@ i5- [ i6e i7y z1 ^4 } z2 u -*6B*1A +*6B *1A c o7M s4@ *65 *38 p3 @@ -61390,7 +61138,7 @@ O76 Y4 $2 i57 s2a o1f O05 ^# -o0g*96 +o0g *96 R6 T7 O32 y2 y2 $G i6D @@ -61398,15 +61146,15 @@ ski i4z $2 O04 i6o i7y i81 o65 +1 -^l^e*7A -$u*98 +^l ^e *7A +$u *98 i72 L4 O42 i62 o7F -1 -s-FuD9 +s-F u D9 Z2 z1 O73 -.9q -'9s,P +.9 q +'9 s,P i2p i3l E R3 y3 O29 ^n @@ -61419,10 +61167,10 @@ i9t iAe i4i O79 o1u sBm '8 $N -TB O2A '7 +O2A '7 i2p i3h o1d y1 -o8)$z +o8) $z i7B Y1 u oBo D3 +6 } @@ -61431,30 +61179,30 @@ i9e iAs iBt $5 $4 $* $* i2C O13 O58 s3< O75 p5 -s+yo0D +s+y o0D -0 '8 O41 z4 -1 O34 *25 z2 r -+0*03p1 ++0 *03 p1 '5 o2z K o4C +2 $i t o3p $d *46 -q*8A +q *8A i2b i3r -*A1+2 -*45*28 +*A1 +2 +*45 *28 iB* Y1 i5b i6e i7r O72 o5k *74 r OB7 i21 i39 i48 i1a i2l i3a -*2Ao8e +*2A o8e i1a i2l i3o $7 t +0 t i4t -r*B3 +r *B3 o3 ,4 y5 OA2 O34 +6 oAX OB1 @@ -61465,13 +61213,13 @@ u i5C $. $s $o *10 D3 r D3 o52 -p3*BA*A1 +p3 *BA *A1 $. $s $e o7/ ,6 $V [ r i3S -*B9^bs$X -*93$usg! +*B9 ^b s$X +*93 $u sg! O57 $* ^R o42 C p3 o7g @@ -61483,9 +61231,9 @@ saq z1 i4i i5e i6l p1 s'i O53 i5P O63 -^9*B3 +^9 *B3 *24 $p i3a -'8^b +'8 ^b O42 $a '5 $g i5b R0 L0 @@ -61494,7 +61242,7 @@ i78 R3 L3 o3n u +5 ,6 ^5 *31 -y3sf5 +y3 sf5 r D3 Z2 ] sio i5r i61 i72 @@ -61508,13 +61256,13 @@ $. $c $m O92 'A +7 OB6 +2 o59 r --3oB* +-3 oB* O38 -0 iAk O61 *13 [ p1 sHs O15 D3 Y1 +3 -ql +q l O04 *B0 D5 OB5 O93 p1 r @@ -61531,14 +61279,14 @@ $7 $1 $! i80 O02 O52 E $e i4m *90 O29 -oB_^t +oB_ ^t O23 ^w -$ip2sf7 +$i p2 sf7 o3i -0 i62 i81 i70 i90 s2z O61 ] ^9 -sgk+A +sgk +A s0U t D3 i71 i81 i91 -7 O56 *94 @@ -61564,7 +61312,7 @@ sIE ^A T5 O7A o7e O72 +4 -u*2AY1 +u *2A Y1 i0w i1o i2l k +2 Z2 snO @@ -61578,7 +61326,7 @@ O32 -A K $O *2A O91 O07 -6 -s*L-B +s*L -B r i1f i0s i2l i1o i0g *70 @@ -61587,8 +61335,8 @@ O34 o1j *30 y2 l $. $m $c Y4 $a O37 -o6ro8k -$p.6*6B +o6r o8k +$p .6 *6B L0 z2 p1 sgq s5* @@ -61602,18 +61350,18 @@ r $/ *34 o1_ $0 $7 $5 $3 i56 R6 -*42y5+B +*42 y5 +B *27 O15 O85 *40 z2 D5 T1 i69 i7e i8v -*02s\ND2 +*02 s\N D2 O15 $_ i7R k .3 K *14 OA2 ^@ -R8*2B -i5Ap2*14 +R8 *2B +i5A p2 *14 o50 .4 o0o ^h y2 i6e O82 @@ -61632,7 +61380,7 @@ i8R O52 s0B s0f O42 y3 -Y5*61z4 +Y5 *61 z4 R5 [ O04 o6n o7g O41 o7R @@ -61654,7 +61402,7 @@ i9r iAo .2 Z1 i9r iAi i3@ t -R5q +R5 q sbm D7 O93 $7 $6 $* $* $! L6 @@ -61677,25 +61425,25 @@ i1w O23 $d *9A i19 L1 R2 *2A O7B -R8+0 -i4+*B8 +R8 +0 +i4+ *B8 i66 O75 z5 O4B -6 i0f *13 y2 K k $d -*78r +*78 r i14 R2 L1 [ ,5 -y2swz +y2 swz i3e R4 T3 O68 D5 L4 sPE -$7o3siB@ +$7 o3s iB@ O21 i9i o4* +0 -DA$E +DA $E Y2 Y2 O45 T0 D3 O89 O97 +B @@ -61710,40 +61458,40 @@ t O16 p1 sb5 z2 O67 shX o8s t -T8*23z2 +T8 *23 z2 O71 iB& $` -^w$E*3B +^w $E *3B u O83 -s[|sb0Y1 +s[| sb0 Y1 o28 l -sM<*03y4 +sM< *03 y4 +9 .8 -sk]*37+0 +sk] *37 +0 i6n i71 i82 -C+9o01 +C +9 o01 O6A y3 i8s i9e iA1 i32 O9A s'C i79 O93 u *56 l ^y ^a ^l -$.$& +$. $& D1 o79 o7o r O09 z5 T6 -o4Wi9Bq +o4W i9B q *53 O54 -0 O26 $3 D4 z1 O2B o5% +0 OB1 *79 o4o ssl *03 -*04$G -$?$# +*04 $G +$? $# o5# O62 l $. $c $z $9 *20 -$_$` +$_ $` *52 O56 i39 R5 L5 sn7 @@ -61751,58 +61499,58 @@ c $3 $& syh D6 O23 .7 O5A l $. $c $a -$ $> -$ $/ +$ $> +$ $/ l $. $c $c -$ $$ +$ $$ } R2 i3f R7 L7 o77 -6 i70 R4 L4 -$lp5s3k +$l p5 s3k O13 i5F E O19 K -RBi4ei5A +RB i4e i5A ^1 -9 -coBu +c oBu O54 $2 s_k sOi OA8 -$@$[ +$@ $[ i6o i7v ^- i58 o0w -sw{^BZ5 +sw{ ^B Z5 i9p iAe iBr *2B O14 o2W u i1a R5 L5 -*A7oB$ -l'2,4 -i5e} -$=$" -$!$; -E${,2 -$!$_ -$+$< +*A7 oB$ +l '2 +i5e } +$= $" +$! $; +E ${ ,2 +$! $_ +$+ $< [ i0m D5 i9k iAi -$+$\ +$+ $\ ] i79 .6 K +7 sE4 i9w iAe iBr i15 R2 R3 Z4 O53 z1 -$}$+ -$}$( -$}$# +$} $+ +$} $( +$} $# i3a i4l i5d s7J i2a i3c i4h u i39 -iBfi3NRB +iBf i3N RB L6 O9B sH- i38 L1 L1 -$%$/ +$% $/ *A9 $g i5d R4 L4 i22 $r @@ -61810,15 +61558,15 @@ i7a R9 L9 +0 O23 y2 O42 O87 ,4 q -sHci4\ +sHc i4\ i19 L1 R3 O15 o1> $$ R7 o0K o3g -sE5oA^ -$%$= +sE5 oA^ +$% $= i3o i4m i5a -Z2c*B8 +Z2 c *B8 i32 i40 i51 i55 R4 L4 *30 O08 ^b @@ -61836,14 +61584,14 @@ T0 o3L i1e R5 L5 ^b -5 i5a R6 L6 -o5&s,++8 +o5& s,+ +8 $z Z3 -*02i3y +*02 i3y *87 +0 p3 O52 $- D1 i76 L5 -p5f +p5 f ^0 ^s iAk z4 O5B i1a R3 R2 @@ -61852,12 +61600,12 @@ L0 +2 O82 stC i2a i3c i4e y1 s"o O74 -sm"} +sm" } i72 L8 L8 *18 l $g $a O42 o35 -y2+5s[W +y2 +5 s[W r ] ^k R6 +6 OA3 $a ,1 @@ -61868,11 +61616,11 @@ o1u -0 i78 R6 i12 L0 L0 ^1 i21 -i3^k +i3^ k i73 R1 L1 ssx Z1 i16 L1 R2 -L3TA +L3 TA i4n i5c i16 L1 R5 OA7 *30 Z1 @@ -61881,20 +61629,20 @@ y5 O1B i7n D2 O24 O26 $f ^q l ^i ^p ^e -*70K +*70 K i38 R2 L2 i8a i9m o9} s-* Z2 *45 i8a i9c -sRf[^& +sRf [ ^& *93 r O85 $+ i2- O24 i9^ R0 ^9 i19 R5 L1 -*A3sP7s!l +*A3 sP7 s!l R0 ^4 i29 i34 ^r $b @@ -61904,7 +61652,7 @@ O04 i22 Y2 i8v +0 s4k i6i $6 --9Z3 +-9 Z3 i34 R1 R2 L0 T7 O3B i35 R2 @@ -61919,78 +61667,76 @@ i70 R3 L3 i2i i3e i4n Z1 O42 .3 $+ E -r ^k ] k D2 ^k -o44 $0 k sEl { i3w ^p q *62 O58 -oA,^Z*07 +oA, ^Z *07 ^s T5 O28 o5Z o1I -sC%sDu +sC% sDu O18 $s i8f i9e z1 O52 Z1 -.Al +.A l z1 O68 -,1z5 +,1 z5 i70 R6 -siXsKa -z5'8 +siX sKa +z5 '8 O03 i4m -sf-s7[ -*A1i8f +sf- s7[ +*A1 i8f O05 $D -9 ^5 O64 sWn OBA i41 i50 i61 -*32o9vs^E +*32 o9v s^E sm5 i4i i5t i6a i50 ,6 O14 y2 O61 ] Y2 L9 O85 -*85s8H +*85 s8H i3z r i9z iA1 *15 i3u k -sfcz1 +sfc z1 i1m i2o ^n ^i ^m ^. -1 t i6O -svwp5 -i4*s_W*B7 +svw p5 +i4* s_W *B7 o18 *31 O52 ^1 E r O49 i3p i4l i5e -*48'7*05 +*48 '7 *05 *70 +9 OA6 l i1+ i2m i3i i4l -y3s9Bt +y3 s9B t i3b R7 L7 o6t } s.q -C^n -s9I*50 +C ^n +s9I *50 i3n i4a i5n sZl u ^1 ^8 ^9 ^1 -*B0i4q +*B0 i4q se4 Z1 O31 i2s i3t i4o i9s iAs -y3y1*BA +y3 y1 *BA o2g { *14 *27 ] -*89-B -ro3z -sM^^} -o4Os6$*67 +*89 -B +r o3z +sM^ ^} +o4O s6$ *67 OA3 ,8 $2 $o O65 D0 @@ -62006,51 +61752,50 @@ O25 *3A l ^e ^d ^i ^s ^\ o69 O04 o1F $1 -i2,-1 +i2, -1 *7A $[ OBA i77 R4 L4 -se1^k$w -s=D.4*98 +se1 ^k $w +s=D .4 *98 o0o q O26 $# O71 -^o,2+A +^o ,2 +A DB O15 -.Bs*H -y1s_Z +.B s*H +y1 s_Z y2 O78 -sDLs)q*38 +sDL s)q *38 R7 O81 i9i iAa iBn O48 *28 -sr%s o -spX*6B +sr% s o +spX *6B u ^7 ^9 u ^7 ^2 -Ez4s!o -Z4.7D4 +E z4 s!o +Z4 .7 D4 $@ O5B *AB i6m i8n i7a i36 L2 L2 i2 u -o5ro3Y +o5r o3Y i3i i4l i5l $a p1 O02 $9 o4h i6d i7r i8a i3a i4n i5n sA? st2 OBA -se`*75 +se` *75 i1b R8 L8 -$K D0 i5t [ Z1 -*2BsPk +*2B sPk $4 r i54 i19 i32 i7b $i $e $s $t i6g u l ^c ^c ^a -$?$- +$? $- u ^0 ^3 i1c i3f $ +0 @@ -62059,29 +61804,29 @@ oBy O38 i31 i16 i35 i1d c spv -sicT5 +sic T5 i12 i1b sY+ ^F } O27 $3 l ^k ^n ^i i31 i7f -$>$! +$> $! i54 i1b i8W D1 O27 i5f i59 i1f i5b i1b i38 *16 snp -i22i30i41i53 +i22 i30 i41 i53 u ^d ^3 $q $u $e $e $n i7f i52 i1a R4 c $8 $D sfY -sRXi6< -sRW^p +sRX i6< +sRW ^p o5p Z1 } i7g i8h i9t *4B O25 @@ -62089,7 +61834,7 @@ u ^3 ^0 i11 i7b i10 i5b i17 R2 -csnP +c snP i19 i73 Z5 O51 *0B D0 O48 q @@ -62098,22 +61843,22 @@ i14 i3a u ^d ^d i30 i14 u ^D ^E -'AsgO +'A sgO i2a i3r i4i i7b i1b i37 i45 i53 -.2]z2 +.2 ] z2 i5d i14 $8 d ] i5d i10 T1 ^x -D8$d$i +D8 $d $i i1b R0 L0 i2a i3r i4t i7d i53 -Z3+5z4 -R3snu -$c{-A +Z3 +5 z4 +R3 snu +$c { -A i1c R0 i31 i5c i31 i5b @@ -62126,26 +61871,26 @@ sor { i8t i9h iA1 i5d i11 *A5 O26 s$# -$;$, +$; $, f z2 O2A i32 i7f i58 i5b -]o1j$+ +] o1j $+ i1e i10 i74 L5 i35 i1c -sryz3 +sry z3 i3o i4m i5e ^I *03 -o0 cc +o0 c i14 i72 i5a L4 i19 i53 -sX.^3,8 +sX. ^3 ,8 u ^A ^C i5a i35 -*48t^I -Z2ko41 +*48 t ^I +Z2 k o41 i1u i2p i3e i38 i14 i59 i12 @@ -62154,7 +61899,7 @@ c $A $0 o5u p1 i77 R4 i76 R3 L3 --4iB? +-4 iB? ^J '7 i14 R6 L1 i5f i12 @@ -62166,25 +61911,25 @@ i4l i5u i32 L2 L2 i3c R8 L8 o05 '8 -$[$; +$[ $; i1a i19 K -7 sez +5 -i11i29i37i49 +i11 i29 i37 i49 L6 O72 i1a i57 i7b i5d i51 R4 i38 i5d u ^a ^b -*3BR1 +*3B R1 i7b i55 -sY=*72 +sY= *72 c ^E ^E i7e i55 -sRWsvU +sRW svU *14 Z2 -D7sdxz5 +D7 sdx z5 i18 i56 i7o i8l z2 +0 r @@ -62192,28 +61937,27 @@ u ^a ^6 u ^a ^5 u ^b ^e c $) $2 -z1y3*56 -*7B^< +z1 y3 *56 +*7B ^< O83 $B D1 -*48s|b +*48 s|b O24 OA5 $S -s@is^0 +s@i s^0 u ^b ^3 c ^B ^F u ^e ^e i76 R2 L2 -$5 O71 i4@ Z3 O87 i7c i57 O59 E D9 Z3 i1e i2o i3n -y2lr +y2 l r i30 i5d i74 i1c i39 i7e i5i t -*83*96 +*83 *96 i1b R2 L2 i6i i7f i8e i58 i5f @@ -62228,12 +61972,12 @@ i4e Y1 DB ^E sL_ s#= -*52sBw,9 +*52 sBw ,9 $B $8 o0f Z3 ^4 ^x i33 i1c -$$$/ +$$ $/ s39 ^4 y1 *40 t -7 O03 @@ -62265,17 +62009,17 @@ i16 i1e sDp i77 i32 C o1i -o3<.A +o3< .A u ^A ^A -oB$iBB +oB$ iBB i5b i37 i56 i15 $C $E c $6 $5 $3 $7 i57 i18 i7e i52 -k^d -Z5p4spP +k ^d +Z5 p4 spP c ^C ^A O0A f i17 i58 @@ -62285,17 +62029,17 @@ $a $p $p $l $e i58 i17 p4 so7 i54 i30 -$|$? +$| $? O0B ^_ i14 i75 -sP"z5 +sP" z5 sst [ i7f i73 i5d i59 C $I c ^c ^F .4 Y1 stk -s#GLA +s#G LA i30 i5e O19 c i7d i32 @@ -62307,7 +62051,7 @@ O35 *65 i7b i3a s 7 O92 s]" o2Z -s#7sX- +s#7 sX- L7 L7 O31 R6 O86 c @@ -62317,67 +62061,65 @@ u ^8 ^6 i52 i7d s s i1c i18 -i11i29i39i44 +i11 i29 i39 i44 c O04 -5 i7e i36 -*3B$} +*3B $} O94 .5 i5X i3a i15 i11 i5d i3_ O37 i7e i54 -sp6o6\ +sp6 o6\ i11 i5e K o6m -^/KsV( +^/ K sV( i9b iAe -y2 *10 $f snr *21 sOr u $A $C O72 } -*24y5*46 +*24 y5 *46 [ srs $9 D2 -s@0i8p +s@0 i8p u ^6 ^5 -sRL,8{ +sRL ,8 { C +6 sz! O2A *46 f O29 $X O62 -.2^d -s24i9TC -sJaT8*38 -^.Y3s>H -i5+DB*54 +.2 ^d +s24 i9T C +sJa T8 *38 +^. Y3 s>H +i5+ DB *54 i8_ t sia Z2 szh -^%s[A +^% s[A Z1 syh s#n O45 o4g i6- +0 o1u ^k ^i ^r ^e i7) l O3B -d $@ O27 Z3 .3 -,6u +,6 u O82 z1 O15 o4a smZ o64 O81 Y3 $m s1m ^d ^o ^o ^l ^b s!z -DBz4sh. -i1!*5B +DB z4 sh. +i1! *5B i2w i3a u ^5 ^8 sEy ^a ^h ^a ^h -iBNE +iBN E u ^5 ^7 sBk u ^5 ^2 @@ -62386,41 +62128,41 @@ y3 OA4 i0= E ^n ^a ^a ^m $P D5 -s?!*67i4T +s?! *67 i4T ^G r u ^2 ^f u ^1 ^5 -seCL6s-x +seC L6 s-x c i10 T2 Y2 o8w ^l ^r ^a ^k i3i Z1 ^y ^g ^g ^i ^z i78 i31 -*5A^`*85 +*5A ^` *85 ^C ^0 c $b $e O63 d -*08L3oAD -Z1$C +*08 L3 oAD +Z1 $C *31 'A i87 i97 $7 O23 s_W Y1 *04 -o3=*09 +o3= *09 O31 $; O25 -5 --9^` +-9 ^` O72 z1 [ s0p o1e ^n -T0o2; -p4*47 +T0 o2; +p4 *47 c $2 $0 $3 $8 O24 o49 *97 o9o -ls-e +l s-e ^a ^i ^r ^a ^m i3c i57 i6o i7n i82 @@ -62439,43 +62181,42 @@ O75 z1 O75 z4 p2 O18 *51 sUh OA8 $( -t^(s|O +t ^( s|O $j t ^y ^l ^l ^i ^b -Z4^7 +Z4 ^7 i3c i4e i5l i27 i39 O45 { ^x sr, -*70s9FD4 +*70 s9F D4 i58 i5c ^l ^i ^v ^e ^h ^a ^l ^l ^a R3 o5m r $i $s $t -D0 ^" O37 f O58 +5 -+1Y3 ++1 Y3 d o5j *0A O23 p3 su1 OA1 -p5o2E +p5 o2E $g ^3 f D5 O23 L4 -^}s^ O3B sLy t i2P -.A$;o15 +.A $; o15 $d $o $d $o -i4l} +i4l } $h $e $l $l $o $s $h $i $t u $1 $9 $6 $9 @@ -62668,14 +62408,14 @@ s,_ $2 R3 $j $e $n $n $i O04 ^p -o1U*58Y1 +o1U *58 Y1 $f $a $l $l $s $p $a $w $e $l $d $o $u $g sSs O47 i1c i39 $s $a $u $c $e -o7]iA# +o7] iA# l ^2 ^9 ^9 ^1 s+g i1c i35 @@ -62684,7 +62424,7 @@ i28 i33 s8, O49 sZ+ $b $e $l $l $e -s5-s}li8( +s5- s}l i8( $p $i $o $4 o5d $k $a $r $m $a @@ -62693,41 +62433,41 @@ sjC o7q *67 sL! $w $o $o $d $y -s1ps^.+3 -s9-*58 -*2BK -szfs6MK +^u s>- *58 +*2B K +szf s6M K ^R *18 c $1 $3 $9 $! $j ^2 @@ -63793,10 +63525,10 @@ y5 O02 sT+ o6s ] i36 i3c ,3 ^p t -o4qo2asX4 +o4q o2a sX4 y2 o91 Y2 *04 -o8es[p +o8e s[p $u *02 z1 l o2g O7A k o9@ @@ -63807,57 +63539,57 @@ o4m .3 ] sjO p3 i1a i2o p4 sao -LBsG3s.A +LB sG3 s.A z1 O28 -1 sz6 ^7 $T $f *25 s=1 -CoAX$8 +C oAX $8 R1 K *56 ^j sik D9 $R O0B p3 o2i k o9| -*50u[ +*50 u [ i67 Z1 -li1R*3A +l i1R *3A { K ^d '8 *14 o1F ^1 s.D u O62 +5 ^j i61 *25 -*A9*B1r +*A9 *B1 r T1 T8 T9 TA OA2 i44 $9 o2a o77 l -1 -6 i74 ^n ^a ^n ^o ^c -^oso" +^o so" -2 Z2 sP$ -R2sw@ +R2 sw@ p1 o6d o77 *20 [ R0 sOa s1r R6 C -D6sFl +D6 sFl o7g u $e ^p -iBCl +iBC l s1M z1 i8e i9s iAt +1 d u c $i $v $e i2o i3w -*51sO? +*51 sO? u i2' -D3i7w +D3 i7w i3e i16 T1 T8 T9 T6 +8 +E @@ -63867,20 +63599,20 @@ p4 '8 k q O59 sec r i2o i3v -i5joB< +i5j oB< OAB -0 RA *64 '8 d O92 -*81E +*81 E r *42 *53 -s4c'7 +s4c '7 i3c R0 i3 -7 i8l i91 i3d i5g i4o D4 o7@ o6i .7 O92 f -+0sjd ++0 sjd l s6p *35 i5l *41 ^2 ^k @@ -63891,7 +63623,7 @@ r O28 p3 stw } +6 o73 T3 T7 T5 T4 -*40y2 +*40 y2 O15 Y3 i52 k u i2D @@ -63904,10 +63636,10 @@ $4 O83 -5 [ d ^s o1p Z2 R9 -*9B+0 +*9B +0 *21 d *53 ^m --7$^*6A +-7 $^ *6A i49 i59 i67 ^t o1o ^e O57 @@ -63916,9 +63648,9 @@ Y5 *69 O76 { ^P i2< O45 ^L -[*3B*B1 +[ *3B *B1 l $7 $4 $1 -tT1o4t +t T1 o4t z1 o91 ^i ^k ^u ^y [ ] o27 @@ -63929,7 +63661,7 @@ $. $t $h sGL l O43 K -0 O74 -s }s4a-6 +s } s4a -6 i60 O02 D5 ^t $e o7k *63 @@ -63939,26 +63671,26 @@ O72 [ *32 '3 R0 O76 ,6 s91 O09 $1 -o4J*3A +o4J *3A Z1 f -ro4i -o4osqE +r o4i +o4o sqE d O93 -*45 ,0 O08 +*45 O08 ,8 O15 '8 z4 -^csh7 -*31siZY2 +^c sh7 +*31 siZ Y2 ] O76 z4 i12 *61 -p4spk +p4 spk ^f ^a ^e ^l o1a *03 i4i '8 -.Bi0> +.B i0> $b shb i12 i5c -*52C] +*52 C ] *02 sdl *57 r $i $t $y T2 T4 T6 TA @@ -63973,7 +63705,7 @@ $v stk Z1 T8 i7h i8e i9r +6 $5 -i3HTAi28 +i3H TA i28 O32 $1 D1 i7b i8e i9r ^6 i42 @@ -63981,15 +63713,15 @@ O05 $2 O08 o9t s/[ O41 s-8 O79 i65 s\2 -sMi,3 +sMi ,3 O7B o48 q O16 E ${ i52 $9 -us!j +u s!j ^f ^t ^w c se3 si1 ss$ -$LT6 +$L T6 ] i3i L7 Z3 O0A i53 f @@ -63998,7 +63730,7 @@ i53 f u ^5 ^b ^n ^e ^y z5 O27 Z2 -^fsP< +^f sP< i3p i4i i5e $] O32 i3# k @@ -64011,25 +63743,25 @@ C oBe ^7 O84 O35 -1 i9A O04 -]iAY +] iAY ^a ^y ^a ^s y4 Y4 ] $^ u ^1 ^f ] $J -T2i8N +T2 i8N O23 Z4 -i8Gp1 +i8G p1 O02 o51 -3 L3 *31 o1! -D1sCa +D1 sCa ^n ^r ^u ^b O14 O95 -o8rsYQi1A +o8r sYQ i1A l $1 $4 $7 -,0st o8n -s8(s-C$} +st o8n +s8( s-C $} O42 *08 *58 [ q O27 i1f i58 @@ -64039,11 +63771,11 @@ i5f O31 p3 O0A OB7 O12 O62 O02 z4 -i5V*06 +i5V *06 K [ i2f s6. L0 $w $2 --6s*[s(a +-6 s*[ s(a s6H scj $z *73 $t @@ -64052,12 +63784,12 @@ o59 o41 i50 i60 i75 p2 OA9 O05 Z3 O46 -RA*BA +RA *BA O91 R9 i5g i6i i7r O67 $F i0c i1o i2o -s|lto9N +s|l t o9N $w $e $a $k i5A *06 O92 $J @@ -64067,13 +63799,13 @@ T4 TC sM? *43 +8 R1 R3 -+5iAh*87 +D3 s>h *87 i47 o1g $e R3 i6b O4B ^G @@ -64262,9 +63994,9 @@ i7) O8B O94 O24 Z2 .1 i0c shk ] o1* -iAJkd +iAJ k d O48 $8 -Z5iBK^l +Z5 iBK ^l OB6 siJ O73 o1y $K p3 @@ -64273,29 +64005,28 @@ c O35 *73 D2 i5l C sra D1 -sK0siH +sK0 siH -2 z2 s2* *42 D6 sma D4 sYA o1m O28 -iAs*64 +iAs *64 -7 O42 sVM sou '8 i0- O03 i2p -4 -D o5d d -o52'7 +o52 '7 +D +D -1 sRU $F $C y2 O25 $p d $t -E *76 sdL u sm9 -sU7o3& +sU7 o3& T8 o5T ^S Y3 sC0 @@ -64309,16 +64040,16 @@ l ^o ^l ^i ^k i74 R5 O43 svy s30 *65 -*94*47 +*94 *47 o1T z2 -5 c $i $o $n Y2 ,5 i77 i31 L9 sn2 O42 -sVvssQk +sVv ssQ k o0d O37 q i38 O71 -i12i20i32i42 +i12 i20 i32 i42 *05 -4 +2 ^o ^n szG @@ -64338,8 +64069,8 @@ i4a i52 i60 .6 $4 i2i i4g i3n u i5Q -}p2oA" -^bsoL +} p2 oA" +^b soL $h i92 O49 '8 R2 *AB O25 @@ -64351,7 +64082,7 @@ i59 $7 o1Y O31 ^s ^s ^o ^b ^7 $m -*ABy3 +*AB y3 c $t $i $o $n *A1 O1B si2 i60 -2 o5a o79 @@ -64361,7 +64092,7 @@ o09 *02 T2 Z1 *13 i64 { O42 -s#6s*{ +s#6 s*{ E [ ^1 o8k O65 O0B @@ -64380,10 +64111,10 @@ i9e iAs iB1 i3b R5 L5 ] O42 Z2 T0 T2 TB -.9sw| +.9 sw| o3z p2 i50 i39 -*60y2 +*60 y2 K sWw { o6o s4l @@ -64408,13 +64139,13 @@ l $3 $0 $5 c $4 $3 $2 $! +0 i1e c $i $d $e -$]E{ +$] E { i1f i13 -$($_ +$( $_ p5 i9r l $1 $4 $5 RA O26 OBA -i1Usx9 +i1U sx9 R9 $9 i1a O04 i72 *03 k @@ -64430,28 +64161,28 @@ i0g +5 T2 TB T5 ssn ^1 O09 [ $N -Y2*A8 +Y2 *A8 z2 *73 T4 TB TA z1 o8= { o7= -s@tp3 +s@t p3 i5U k O35 $5 d -RBZ4 +RB Z4 ^6 O56 scS stS z4 Z2 O1A +5 R0 T1 T8 T6 T4 -sm2$! +sm2 $! o6j +2 c +1 Y2 { -*81D1 +*81 D1 i9t iAs $. $6 sRw -L5$N +L5 $N p2 *53 O5A ^e ^d ^o ^c { i3g @@ -64471,33 +64202,32 @@ $5 Z1 *30 i5o i6v i7e i50 +2 ^0 ^x -sgqy4{ +sgq y4 { R5 O21 Z1 D1 i7_ u ^1 ^3 Z3 O34 ^5 -toBM -i04*2A*8A +t oBM +i04 *2A *8A ,1 O35 O47 $V .7 -iBK*34Z5 +iBK *34 Z5 R9 O71 i02 -sqZo8P -syx^u +sqZ o8P +syx ^u i16 R2 R3 D0 sbj Z1 $= $< sJC O62 sm; -s*Y$,*82 +s*Y $, *82 i0# D6 -k ] ^b syt O59 -i7$sS|i4s -DB+5*46 +i7$ sS| i4s +DB +5 *46 Y4 *A8 i2a i3d i4o i41 ,5 -*46*A0^F +*46 *A0 ^F o50 o34 sne K c T5 i5+ @@ -64506,15 +64236,15 @@ c o2- i3@ D5 i74 i12 l $o $n -y3ds]U -R9 o9[ O31 +y3 d s]U +o9[ O31 iE_ $b O73 sa+ -*A2y4 +*A2 y4 *82 'A i1d i15 -s8js.}^s +s8j s.} ^s O12 s2z i40 z1 o2c *31 @@ -64529,11 +64259,11 @@ $f $l $a $m $e O16 ] z3 $] O81 ^t *31 -iBPy4 +iBP y4 O54 $. $v T8 Z3 O59 -i0#Y2 +i0# Y2 y4 s.4 [ sC5 E O61 sJT @@ -64545,7 +64275,7 @@ oB7 O35 ] $g $a $n $g i3g i4o i5n i80 i98 -iAAs]VY1 +iAA s]V Y1 c $1 $8 $5 $! o0Z *31 K ^< O05 sc3 @@ -64561,17 +64291,17 @@ O19 i2N ] *85 D2 OA4 *59 l $5 $3 $8 -qsZm +q sZm iBT c L0 ^p $x O19 -.8i4G -o6;sZL +.8 i4G +o6; sZL ,6 $p ^_ *04 { -*B7R7 +*B7 R7 ^P L6 -c]Y5 +c ] Y5 c se3 so0 si! saU $i u ^9 ^2 @@ -64579,8 +64309,8 @@ O63 t $| oAz iB8 p4 k srJ -y4s,zK -i9)D1 +y4 s,z K +i9) D1 u ^9 ^1 Z1 O91 p4 $s $a $r $i @@ -64589,7 +64319,7 @@ Z2 i4j ] i72 i33 i1l O26 O31 $. $s $b -Z1i5w +Z1 i5w ,4 *67 i76 R4 L4 ^! z1 O64 @@ -64602,7 +64332,7 @@ i3l i4o i5v u ^9 ^c O74 .A sqm -}s,Z +} s,Z -7 -D u ^9 ^a O35 z3 @@ -64614,13 +64344,13 @@ r $i $s $e i0s i2m i1i l $. $s $d $7 D7 -q'B +q 'B su@ $9 .7 z5 O38 O43 sL0 sbc -+2$/ ++2 $/ O68 $h *73 $1 i6L O06 o1{ @@ -64633,9 +64363,8 @@ o7< K ^a ^i ^v O02 i34 T6 i0p -*4As@7 +*4A s@7 O24 ] -f $m O4B *24 *36 o6c OA9 Z2 o1D @@ -64653,7 +64382,7 @@ c $e $9 o24 $+ O02 i6r i71 i80 f D7 -$s*14*97 +$s *14 *97 Z2 *67 $r $a $v $e $n i41 i53 o60 @@ -64664,9 +64393,8 @@ Z1 *38 *30 { *35 sC0 .3 L5 t -szv+A+4 -E*52 -}d +szv +A +4 +} d o0W p1 $v O36 Z5 Y3 O46 @@ -64674,7 +64402,7 @@ l $d $o $m $e ^i D6 i10 i1e l $9 $1 $0 -fo1tk +f o1t k $. $c $k C [ +6 L5 c @@ -64693,10 +64421,10 @@ $^ l i5a i6k +7 L8 ] O05 l ^3 -i9bY3 +i9b Y3 $G ^f -]*93i5l -s6wi9, +] *93 i5l +s6w i9, O71 Z2 k o16 +3 R6 p4 @@ -64706,7 +64434,7 @@ ${ K ,4 .1 z4 y4 i5a i6h -*0At*72 +*0A t *72 i3l ] O68 $a o3E -4 @@ -64725,8 +64453,8 @@ q O29 t o5o ^g smj oA# [ -T7CiBw -s}#i3pr +C iBw +s}# i3p r O9B $' r sL1 z1 +A @@ -64736,13 +64464,13 @@ o5o [ z3 o3z L1 [ i2A { [ -sJm^g +sJm ^g i5f R8 L8 -9 { '9 -Z4D7 -^OsOj -i8es;E -sD![*9A +Z4 D7 +^O sOj +i8e s;E +sD! [ *9A O62 O03 O27 $r i4r i5m i6a @@ -64753,7 +64481,7 @@ o0t o2s s+a i4G O03 O57 s\U O9A -o3h]-4 +o3h ] -4 oA2 $! T0 T1 TA T9 q O27 @@ -64761,14 +64489,13 @@ c L2 i7e i35 i7f i1f i8T *03 -Y1sMR +Y1 sMR *03 y4 -d $B O47 R1 r y2 -3 y5 O85 skF s\G O5A -sSLss5i4s +sSL ss5 i4s O42 R7 *45 sa3 T0 T9 T1 T3 @@ -64777,20 +64504,20 @@ $# $0 d 'E $2 $8 o4c L6 o6r $9 $7 o7a $2 -.6*74Z3 -o4Vs!).A +.6 *74 Z3 +o4V s!) .A Z2 D1 Z4 o0G s2G O47 o0e i67 O1A $0 -5 -6 -A sz_ -o9`i7osiE +o9` i7o siE O91 p2 i62 O41 o45 -+2*B3 ++2 *B3 l $0 $1 $7 -*16s[!*57 +*16 s[! *57 c $2 $1 $8 $! o3] sb- @@ -64798,37 +64525,37 @@ Z1 ^j i88 O64 y3 l $7 $9 $2 OB1 ] { -o9l,8^d +o9l ,8 ^d +1 l i5a O2B *07 O71 o3K O53 i6i *54 z3 i2c O09 -D5Y2 +D5 Y2 $b z2 i3a i5e i4t l $7 $2 $8 Z1 sn. -*37Y3Z3 +*37 Y3 Z3 D0 o2R O07 Y2 y2 o0Q Y4 o3Y $1 i5c i16 -Y4L7 +Y4 L7 oAP p1 o6w p1 D9 p1 o6p *19 O83 ,6 i0U o4h -ds=^[ +d s=^ [ D8 ,9 E $= s)o O76 o2$ -*95*52o2L -.1*2BE -*16Z3 +*95 *52 o2L +.1 *2B E +*16 Z3 l d 'E o0j z2 i6u o7s @@ -64844,10 +64571,10 @@ O06 -8 ^n ^e ^b T0 ^A o3N *47 --0s5*Z5 +-0 s5* Z5 ^B ^V f O84 -sGEi2u +sGE i2u i8d i9o ^k R3 *45 T1 @@ -64860,20 +64587,20 @@ $O k o5 O13 l '8 $0 ^w ^k -^**B0*07 +^* *B0 *07 s-V o6L E Y1 ^K T1 -i7FLB -$;$@ +i7F LB +$; $@ R4 o53 T3 T8 TA *AB +6 $E -3 D4 } i5M -+3RBy4 ++3 RB y4 o7d O61 -*B1c +*B1 c *14 d s6, ^l ^a ^n ^i ^f $M $a $y $9 @@ -64894,7 +64621,7 @@ l $. $m $r R5 +2 k *54 R3 OA6 y2 -s3`*53 +s3` *53 c *B9 O71 *A4 O87 O06 o6s z2 @@ -64905,31 +64632,31 @@ O91 o6b l $. $m $p } svr l 'A $1 -E.7*32 +E .7 *32 *73 O57 -iAR+B +iAR +B K $& OA1 oB0 l $. $g $s -*69s+jZ2 +*69 s+j Z2 O07 -1 i4 '6 -s_f*B3 +s_f *B3 sNn O59 Y4 -D5o82,9 +D5 o82 ,9 sZ/ -R7*B4 +R7 *B4 l $. $m $n -sC$LA +sC$ LA $s $e $p i6m O91 c $2 $1 $0 $! sp[ -T1o7Vi9N +T1 o7V i9N l $. $m $k sq2 -EoAP +E oAP -6 $j K *50 +1 y3 O62 ] @@ -64939,7 +64666,7 @@ l $. $m $d O71 O48 y2 sP1 O42 T9 O65 O03 -T0*A1 +T0 *A1 $E O04 t srS Y2 Y1 *80 @@ -64950,22 +64677,22 @@ O21 f $1 O05 sb! $s $h $o $t -+7'6i10 +'6 i10 T4 *54 $5 ^1 -L6*36D8 -spsy3 +L6 *36 D8 +sps y3 l ^5 ^4 ^9 ^1 o4o O29 sXH sZR -$FscEo7s +$F scE o7s q { O18 o3x skb D7 i1B i8G i8g R8 o1f *31 -E*B8 +E *B8 y3 o0s O53 ^G u O32 $0 $7 @@ -64984,58 +64711,58 @@ o6* -3 O73 ^& o3e [ $z o00 -s|<*07] -*B4sN- +s|< *07 ] +*B4 sN- ^9 sD8 O17 o30 R1 $o $i $d O93 T3 -[*BAZ1 +[ *BA Z1 c T5 i5& d f O0A i0p *80 o0Z ^D O62 *92 i4s o5h -st<[f +st< [ f y4 $y p2 O0B ^6 L3 O02 O76 -{sN@ -*4As`1s@4 +{ sN@ +*4A s`1 s@4 si9 u $1 $9 $6 $2 C y4 -*BA$8 +*BA $8 O26 z2 srv u u O67 i0s s2y ^p O03 O85 i7A O23 -sb!y3 +sb! y3 r K Y5 D2 Y4 +7 -oBbE +oBb E $P $D t Z3 O32 -s!WL2 +s!W L2 s1P z1 i73 [ u K o0` T0 T9 T3 T4 z1 i5e -ssN$J +ssN $J i51 o69 $4 *5A O39 y4 O87 O71 ^7 *12 stc O5A -iBG] +iBG ] o1P r T6 -o7)i9k -i5%c +o7) i9k +i5% c O52 o1d z1 o0m ^i o1W ^1 l @@ -65055,13 +64782,13 @@ i8o i9d OA2 i2R K O04 *20 +D -1 -C -*B4R0sZr +*B4 R0 sZr +2 ^t O0B i5t i6t i7e OB6 *21 q i51 i7f ^s ^u ^s ^e ^j -*A0sBZ +*A0 sBZ *34 sKY -2 p1 O36 k @@ -65073,19 +64800,19 @@ $0 LB ^T '8 O41 $7 $6 $8 $9 z3 $B O29 -k*60 +k *60 y3 o7t -*6Ay4Y1 +*6A y4 Y1 i17 L1 R0 Y1 O1B ,1 *21 O42 z1 O42 y2 -s*HL8 +s*H L8 o5g z1 -2 O68 O03 d '9 O89 LA -i11*7B +i11 *7B [ *59 ] i1_ O81 o0m O63 @@ -65101,11 +64828,11 @@ $b s3G $c $h $i $l $d sfB O35 Y3 Y1 -s}=^0 +s}= ^0 i53 D0 ,6 i4Z Z2 -t$]sf( -TA O38 O62 +t $] sf( +O38 O62 p4 o0x f -4 l $. $g $b @@ -65117,7 +64844,7 @@ R4 l ^h ^n ^i ^l $3 $8 $6 $5 D9 o8> -*59i5r +*59 i5r $- O73 t i1- Z1 sgh @@ -65127,14 +64854,14 @@ i5g i6h -2 -2 -A $2 ^9 ] sSh O5B -p5*A1 -*4A'9i6' +p5 *A1 +*4A '9 i6' ,5 O17 T0 TE -s%ro2p +s%r o2p .1 $Y O97 +7 -o50u +o50 u O15 +3 -9 oAi r -4 [ @@ -65143,7 +64870,6 @@ $r $i $d $e $r r *07 *64 O94 T2 +0 i64 O3A -T5 *45 sy= i5s i61 i70 ^' E @@ -65154,9 +64880,9 @@ i9r iAa sI8 o56 $# o2v z2 -i5&p4 +i5& p4 i7f i77 -o0}*86 +o0} *86 .6 $e o4m ] .3 .6 $m @@ -65173,11 +64899,11 @@ OB7 *43 O47 o7E f O69 K T5 oA1 -^js_%*8B +^j s_% *8B i14 i77 *24 o8. -'5p1say -^$s^riA0 +'5 p1 say +^$ s^r iA0 t o4# O5B *A9 +0 c o99 @@ -65195,18 +64921,18 @@ i9r iAs i77 i3b i4l i5d $, O01 { -i32*B6 -RBZ4t +i32 *B6 +RB Z4 t ^e z2 ,7 O02 C d $5 O42 sl_ i38 R4 L4 K *12 Y2 -Z2o08 -*59s7?i5u --A^5 -^isUa +Z2 o08 +*59 s7? i5u +-A ^5 +^i sUa Z3 t $1 *02 o0s R6 O42 @@ -65215,11 +64941,11 @@ R6 O42 t ^+ ^n ^i ^b ^o ^r Y2 -1 -Z5iB9 +Z5 iB9 t O86 D6 i10 i7c O02 i4n -D7sMF +D7 sMF c '5 $6 z1 $3 { s0m @@ -65233,7 +64959,7 @@ c $1 $3 $7 iB# sa- l i3r i4i i5s -*BAsOB +*BA sOB Y1 OB7 ^s ^e ^v ^o ^l Y3 $s @@ -65252,13 +64978,13 @@ z2 +6 ^o $p i5r i6m sG2 O36 .0 -Y1RBo34 +Y1 RB o34 OB3 C -$@s6M +$@ s6M i36 i3f ^o $v -2 -4 -A -*A3D9o8> +*A3 D9 o8> L3 l O56 $n z2 o7. @@ -65290,7 +65016,7 @@ K i25 y1 o2| { sKE [ d TA -sJIi3C +sJI i3C ^E o6b .2 *41 c o9$ @@ -65298,10 +65024,10 @@ c o9$ O64 O72 $} D8 z2 o43 -*71*6A*40 +*71 *6A *40 T2 T8 T4 +3 O84 -s0PZ3*06 +s0P Z3 *06 i7v O68 *67 [ [ $2 sfe @@ -65313,22 +65039,22 @@ d s2@ O6A $Y [ u i5x i61 i34 L3 R4 -sx-K +sx- K c i02 i13 i23 i37 -Z1T6Y4 +Z1 T6 Y4 { O87 $G O06 -i1Y] -*39*46 +i1Y ] +*39 *46 *67 s1/ *71 O37 -o6;sWk +o6; sWk i52 O12 -6 i5, i30 i7b } O95 o7j R2 O51 -tsM>l +t sM> l s#W sPE .5 .3 OB6 @@ -65345,10 +65071,10 @@ i14 ^l sZR OA8 '9 o0q *42 *14 i0Y -Z1*03p1 +Z1 *03 p1 i8[ -Y3svM -$xi9v +Y3 svM +$x i9v o3G C } i1w i74 *72 .4 @@ -65359,16 +65085,16 @@ i06 i5t $a $c $l $e i0k i2n i1e y1 O28 ^o -Y1sm^TA +Y1 sm^ TA O16 y1 ,5 -+9sfa -*72so[ ++9 sfa +*72 so[ O24 O19 p3 -*B7i3$s"6 +*B7 i3$ s"6 l $2 $4 $3 oB! c o2x r -oB(,2 +oB( ,2 shy u '4 d [ i02 i10 i2D i3e i4c @@ -65376,21 +65102,21 @@ i75 i19 +4 L5 T0 O4B R0 l $8 $3 $1 -$I*7Asn= +$I *7A sn= i3a R6 sp, i12 *61 s93 ] ^4 ] sdx z2 O2B sw= -i5gt +i5g t o70 +6 i0t i2e i1r -*43^X +*43 ^X *82 O38 O92 ^4 C ^9 +7 -o79p3 +o79 p3 $f s39 $s $o $n $i $c o0F o2V @@ -65401,7 +65127,7 @@ o0k ,3 R4 Z1 sFQ ^j ^a ^m -*87^5 +*87 ^5 sH2 o0b i2r $a $r $m $y @@ -65411,7 +65137,7 @@ c sa4 $! Z4 O63 o60 l R1 C 'C -y3RB +y3 RB i8o i9w iA1 s6% l *73 o3p @@ -65420,33 +65146,33 @@ s6% l o1y -0 c $l $i $n $g c $1 $3 $7 $! -$Z*97Y5 -}s#gy4 +$Z *97 Y5 +} s#g y4 Y2 O45 Y2 -*BA*B7sS, +*BA *B7 sS, t $T i9q O43 u O68 d l *63 i3l o4o i53 i35 -Z2iBZ -rt*61 +Z2 iBZ +r t *61 *1A O4A -s9K$! +s9K $! i02 i12 i2M i3a i4r oBn O06 l $7 $1 $8 $w $i $n $g l $7 $1 $3 -$*$' -$'$_ -^x*94 -i8u^9 -$/$+ -$/$$ -$/$# -$>$( +$* $' +$' $_ +^x *94 +i8u ^9 +$/ $+ +$/ $$ +$/ $# +$> $( o4a Z2 ^) ^= o0s ] @@ -65455,25 +65181,25 @@ o4j +3 l ^n ^i ^t l ^o ^r ^y ^g i54 i1d -Ki0AR4 +K i0A R4 i70 L5 $w $i $n $d T1 T2 T3 T8 '6 $_ -csCh +c sCh i0p i2t i1e -*34p5*9B +*34 p5 *9B s0g -T3iB,o0` +T3 iB, o0` oA@ Y3 O85 { *06 $1 R3 O86 *08 { +8 -6 -4 -s/cL1 +s/c L1 o4b O12 R4 $2 --8-D +-8 -D K i4S O08 iBo O5B i54 R2 L2 @@ -65482,45 +65208,45 @@ i54 R2 L2 ^m ^e ^d o03 i3a O03 i0q -$/$\ -$/$] +$/ $\ +$/ $] -C -D -E -$#$( +$# $( O56 $w *0B O94 *30 C -$gC+B -$_$/ +$g C +B +$_ $/ i3b R8 L8 O86 T0 iA[ T5 -6 OA9 *59 t $; -o3Hk +o3H k ^s ^o ^a ^h ^c -.8[iAi +.8 [ iAi sMb { O93 T9 DB O27 -*73T6*B3 +*73 T6 *B3 ^a ^n ^a ^d i74 i10 -$<$" +$< $" iBN .1 t i4G [ i1" scU -$<$/ -$`$* +$< $/ +$` $* K $] ^l ^l ^i ^w -$<$? +$< $? sRl C q -$<$_ -p4+0 -$!$} +$< $_ +p4 +0 +$! $} *37 OB1 *A0 o0` O85 r C 'E $1 @@ -65532,31 +65258,31 @@ i0t i2n i1a $o $m $y f o4I i1b R5 L5 -+8Z5sOw ++8 Z5 sOw ss8 ^a D3 o2s [ O47 ^Q -$@$= +$@ $= c $1 T1 -sCfsW{ +sCf sW{ s%v Z1 *59 -$~$@ +$~ $@ s{K O94 i4L -cp1*14 +c p1 *14 ^E ^" Z1 i21 -lR8+9 +l R8 +9 u $1 $4 $3 -D3+1$% -*74sQ4s`p +D3 +1 $% +*74 sQ4 s`p z3 +5 ] E T5 E ,2 ${ Z1 d z1 i4s -T3*97y1 +T3 *97 y1 *62 '6 s49 o0l i15 R0 R2 @@ -65565,37 +65291,37 @@ $; O02 OB3 O93 i5s i6t i7e z1 i41 -$?$| +$? $| O49 i9g t -$`$_ -rE -$=$@ +$` $_ +r E +$= $@ $^ OB9 O12 i3c i50 $c $l $o $u $d $e $i $g $h $t O31 $1 -shJC +shJ C i4e $r -*80y2[ +*80 y2 [ $w O37 [ l T7 -f*63p5 +f *63 p5 *46 o7E y1 $T O35 Y3 $1 -$"$/ -$+$) +$" $/ +$+ $) ,2 -3 i13 R0 $l $i $o $n sS_ z3 O25 u .3 D6 -$?$< +$? $< O06 o99 s7u ^m ^a ^e ^t -{$< +{ $< i6. .2 $2 i6T i11 R0 @@ -65603,86 +65329,86 @@ r Y5 o3H D8 K *24 $L O86 +A C -^n*2BsMr +^n *2B sMr i15 i3c -D2*70sh@ +D2 *70 sh@ O16 z3 ] i7e L5 L6 -$$$= +$$ $= *15 Z1 *80 O45 l o1N o3z ^e ^r ^d ^n ^a ^2 C O51 o4o -*81^r -$[$, +*81 ^r +$[ $, o0Q } i77 L5 -T9+7y4 +T9 +7 y4 t i8C E o1W l $9 $0 $8 O53 o43 u i65 i1o i2e -+B+1L0 ++B +1 L0 u i66 i3/ OA9 i2y o4e -$|$# +$| $# ^i ^m ^a ^n -$"$# +$" $# s7U s`L -$=$; +$= $; Z4 *69 O32 -$'$/ +$' $/ i1o i2i -$`$! +$` $! K o7z Y1 -$"$& -o3P,6 +$" $& +o3P ,6 s/% O97 o2H i3a i4l i5a i2- skb i4C +8 D3 svy -Z2o9S +Z2 o9S D6 L1 -$)$$ +$) $$ ^k ^r ^a ^m -$%$" +$% $" r E z2 o7w t o3l $8 l ^d ^n ^a ^h u i62 -s[noBrE +s[n oBr E st2 o0j i7o i8c i9k Z2 O96 o73 ,4 u ^A ^B -z1s2H.6 +z1 s2H .6 o3B +1 -+6o1K ++6 o1K -3 f O12 -*18$V[ +*18 $V [ sF0 Y4 OA2 sr" r *70 -p5s#6$! -soETAZ1 -RBiA& +p5 s#6 $! +soE TA Z1 +RB iA& O42 sfn -*71u +*71 u i7b i53 t o3f $1 ^e ^t ^a ^h ^i -$h*B1 +$h *B1 i9g iAo $3 .5 l $i $a $l @@ -65691,13 +65417,13 @@ stj O56 Y5 O06 sOH O62 i8J -o6\q{ +o6\ q { o53 $4 O82 R7 O82 Y4 -s-}oBED0 +s-} oBE D0 +2 o4A -^j}TB +^j } TB i56 R1 L1 i7b i52 z3 ^B @@ -65709,11 +65435,11 @@ saF ^t ^h ^g ^i ^l s*/ O46 z2 -$' D0 -Ko51o6b +[ $' +K o51 o6b i1c R2 p1 O19 -i11i29i36i44 +i11 i29 i36 i44 $o ^s i0c i5d R6 R7 ^s ^i ^s @@ -65723,10 +65449,10 @@ l $3 $2 $9 Y2 OA5 i7f R7 R8 soq -Z1*48oB[ +Z1 *48 oB[ s7l i3d i59 -L5tRA +L5 t RA c ^c ^f i1e L0 *A7 ] @@ -65781,7 +65507,7 @@ O52 $0 $p i7q $' O62 z1 shp -skLKl +skL K l Z1 f O5A OB5 ^( iBN Z3 ^J @@ -65790,13 +65516,13 @@ LA OA2 ^@ ^6 l O42 ^2 O62 { -Y3Z2 +Y3 Z2 O92 O05 *84 -sqws"4 +sqw s"4 C d 'A $1 i3b i55 Z2 k *07 -oB#s,a +oB# s,a l ^a ^i ^d i14 i5c o34 s2n @@ -65805,9 +65531,9 @@ $z ssc $m d ] K Y2 i5q $5 -*B8q --B{ -*BAsXJ +*B8 q +-B { +*BA sXJ *15 *30 $_ O08 ^i ^r ^f @@ -65818,23 +65544,22 @@ $t ^3 o0! O34 i1d i36 O61 o3y -$$$^ -*29,2i0" +$$ $^ +*29 ,2 i0" O36 D4 i7d i55 q { o74 -*ABsIS +*AB sIS OB3 { iB! ] ] ^1 -] ] ^0 i16 L1 L4 i4n i52 *6B O35 -*06o87 +*06 o87 c $1 T9 +0 D3 O25 -$P*72 -*48o6/y2 +$P *72 +*48 o6/ y2 $a $l $e $x c ^c ^7 O34 i3# @@ -65850,18 +65575,18 @@ s@t .0 O6B u t O17 sa4 ] -sSg-A*05 +sSg -A *05 i2m i3b i4e -sb}oBc +sb} oBc O46 ^& O7A se6 sK; *73 iA6 O32 Z1 i64 -*68sl. -R8-1 +*68 sl. +R8 -1 O41 Y5 O34 -*63^b] +*63 ^b ] *43 O29 ^X ^s ^a ^m i2u O72 @@ -65871,56 +65596,55 @@ sB8 Z2 $h o13 o01 OB8 *7B -$,-5sy. +$, -5 sy. Y3 o7u *23 o1W i42 i53 i61 $T *80 O08 s(L -]o5} +] o5} O52 Z5 ^g ^d ^b i3a R1 R2 T6 i0N O79 oBj -B O05 -s3(t*50 +s3( t *50 i0j i2l i1u sr& -T7o3ji43 -z4.8 +T7 o3j i43 +z4 .8 o3g ,6 s@8 O45 { +0 OB3 O19 -^9oB8 -*08s+= +^9 oB8 +*08 s+= z4 i68 O64 i56 R2 L2 ^y ^h ^w -ui3L +u i3L $t *38 -D9kiA- +D9 k iA- sry ] -s8N[ +s8N [ *29 p3 ^h ^t ^a ^e ^d ,4 *20 $p *27 O4A i5v -s#uo1B -}s2/ +s#u o1B +} s2/ .1 O61 o8o i8o i9v O36 ,8 T1 -*38sWxsq] -iA;-Bs8F -sznk -sIJ-0 +*38 sWx sq] +iA; -B s8F +szn k +sIJ -0 l R2 s1p u i55 D2 -] ^g Z4 O62 { $i O56 *36 R3 i4t @@ -65929,39 +65653,39 @@ O08 T7 sBb sHx i0@ T9 O35 -.7r +.7 r OA9 *B1 *72 O62 -0 ] o5e -^gsIE +^g sIE Z1 i6& si- l o1u i77 i12 -sWzu +sWz u +9 ,A *98 DB O16 o2n i4b p1 .6 O36 $0 -${*A1 -tsoR +${ *A1 +t soR i5a R7 L7 ^r $Y -^XE -i1w^m +^X E +i1w ^m y1 o6u O46 *8B -s(KLB +s(K LB } *A7 srs $m O12 OA1 O34 skz -spO*9B +spO *9B R0 ^s oAg sdI O28 sa4 se3 sg9 se3 O73 -T1s(URA +T1 s(U RA i77 i10 i14 L1 R8 O83 { @@ -65972,15 +65696,15 @@ d O19 o4O Z3 O62 $g O52 T8 O74 o5V -sDMY3 +sDM Y3 slu $7 D7 i3, z1 O04 *56 i0h i2m i1a o5T O02 +1 -su5i8e +su5 i8e ] ^1 ] -+2sZtZ2 ++2 sZt Z2 i6j ,4 O25 l r $o $n @@ -65988,14 +65712,14 @@ Z2 l +4 D1 L1 p5 y3 OA5 i3+ r --As1; +-A s1; i1n $7 -*39sA= +*39 sA= c $3 $2 $5 $! st4 O13 -{s`.+B +{ s`. +B t O06 -p4+Br +p4 +B r +0 -A +0 Y1 i98 ^j o55 r @@ -66025,7 +65749,7 @@ so+ L5 O8A c T4 si1 y3 ssD -*3BZ2[ +*3B Z2 [ $D .1 O75 $ ^8 c OA2 @@ -66035,21 +65759,21 @@ i5a R3 L3 u $E $1 L4 O12 i70 i39 -o82$" +o82 $" l $0 $1 $2 i73 R6 R8 O32 *37 iAR ^i ^b ^i ^h ^c z1 i5n -sxNo6r^C +sxN o6r ^C O5B i3F s5| -*6B'Bs"7 +*6B 'B s"7 s8* -i7yi6n +i7y i6n i55 +2 f O9B sb# -$a$h*7A +$a $h *7A i3a i5o i4m $3 *53 O23 OA3 $K @@ -66057,7 +65781,7 @@ O03 i5G i61 O01 .9 +7 ^a ^r ^o ^n -Y3+B +Y3 +B skg +0 s"] s!e O21 i78 i10 @@ -66068,16 +65792,16 @@ O06 OA8 c ^6 ^5 ^9 ^1 O3B *A7 u ^e ^n ^o --AZ3 -*BA}$x +-A Z3 +*BA } $x R0 .2 Y1 O48 O53 $3 -i4K[ +i4K [ l O35 -5 i70 R2 ^Q t -y4s1; +y4 s1; ss0 Z2 i32 i41 i59 i70 R5 @@ -66087,20 +65811,20 @@ s32 ^i r s2K +4 s.z '7 z4 -srsr +srs r l ^h ^t ^a ^b *19 O97 k O06 O9A o0u ^q -i3d*A6} +i3d *A6 } o4p o3e i54 i39 -Y1z4 +Y1 z4 l $0 $1 $6 o8r ^2 s}' *30 OBA ^e ^n ^u ^r -sSJZ2 +sSJ Z2 $m $a $r $c y2 R7 L7 c $2 ^- @@ -66114,28 +65838,28 @@ c $$ ^4 c $$ ^0 $8 *43 +0 +6 ^- -,6z1 +,6 z1 i8r i9l c o4$ s}h O89 O61 O81 L8 d *B0 O64 o5# O14 f -.0i44q +.0 i44 q O03 O04 K f O17 i22 i30 i41 i59 shG c $5 ^0 OA4 O09 -*73'AsT` +*73 'A sT` $T O16 O69 c $| $1 O43 sN9 y3 ^9 ^* -*21sfai56 -*47ko3b -y1sI(T8 +*21 sfa i56 +*47 k o3b +y1 sI( T8 c $6 ^@ o5v *71 Z1 O79 @@ -66143,11 +65867,11 @@ O97 Y2 O54 OB4 OB1 i7H c $1 $| -*52o9] +*52 o9] ] o4x i3w i4e swf O94 -i1msMR*39 +i1m sMR *39 O15 $m i91 T7 R8 ^n ^o ^m ^i ^s @@ -66158,7 +65882,7 @@ c $6 ^3 O26 $a ^+ ^7 c ^* $2 -*40*97 +*40 *97 c ^) $0 R5 st3 *30 O32 $t @@ -66189,26 +65913,26 @@ O43 O85 c $1 ^& ^u ^p Z1 R7 D4 -R9C -y3z2l +R9 C +y3 z2 l c ^4 $* i0y $c ^f *08 z4 O52 *B1 c $1 $5 $6 $! ^v O49 -+5c$# ++5 c $# c ^. ^3 L1 +5 Z1 i3o i4v $x ^o -*A9E -sr|^Q +*A9 E +sr| ^Q +E -3 D4 q -iA\[q +iA\ [ q i2n i3n i4i -t$< +t $< +E -6 c $= ^1 $x ^v @@ -66220,15 +65944,15 @@ i9v iAe sH, c $4 $/ OB3 p2 -i1.*10oAB +i1. *10 oAB z3 ] *64 -o98ui9* +o98 u i9* c ^ ^9 -2 si5 c ^ ^4 ^e ^t ^a ^h O74 o8U -su?i2O +su? i2O O13 i4X t sLH c $. ^5 @@ -66245,31 +65969,31 @@ $4 ^= c ^3 ^# $. $j $o OA2 O16 -*53sL@R5 +*53 sL@ R5 c $^ $7 $2 ,2 p5 -rs69 -s+%RB*74 +r s69 +s+% RB *74 s.? i57 k -s5fD6i3o +s5f D6 i3o O45 z1 o4f *84 o8j t O98 -s'ju$K +s'j u $K i3a i4s i5t *14 -2 $i c ^4 ^! i8l i9e iAr i9o iAs -i8t*49 +i8t *49 OBA L3 o68 p3 TA y3 ] O62 i51 $4 o69 -LBc$j +LB c $j o1p ] O01 -*87sS( +*87 sS( ^3 ^@ c ^3 $* ,9 iB7 @@ -66284,7 +66008,7 @@ c o3+ i3n i4i i5s -5 R3 +3 $> ^1 -D5s8gR2 +D5 s8g R2 c o3, $> ^3 p3 OB5 *A6 @@ -66299,9 +66023,9 @@ l $1 $5 $9 O34 O36 c ^2 ^@ *12 sas -].AL5 +] .A L5 ^w sX[ O95 -*48]*84 +*48 ] *84 -8 [ l i3o i4b ^o ^m @@ -66314,7 +66038,6 @@ c ^1 ^$ c $; ^1 O4B sVC $} c $3 $% -] ^2 L7 O1B i7/ i2 ^k c $8 ^@ @@ -66332,14 +66055,14 @@ c $d $2 c ^+ ^1 c $3 $~ $c OB2 $9 -*19dy1 +*19 d y1 i54 i16 $+ ^0 i2e i3m $+ ^4 -2 i2x T3 st2 Y3 -R0*49 +R0 *49 c ^@ ^3 c o4* O61 o3p @@ -66354,7 +66077,7 @@ i1e R2 o64 *20 ] u r c ^_ ^0 -sA1^# +sA1 ^# c $# $0 O56 *36 r ssH l @@ -66367,22 +66090,21 @@ c $8 ^# i14 L1 L7 O37 p1 R7 O05 -*B8L6Y1 -*67 $0 +*B8 L6 Y1 ^? ^1 p4 O91 oB. --2]L0 +-2 ] L0 ^g k OB7 O04 o3} o0w D2 i7c i30 c o1V -*B8,Ao1* +*B8 ,A o1* i9i iAf iBe O9B { K -Co2x-4 -z2sw? -*58Z4 +C o2x -4 +z2 sw? +*58 Z4 ^n ^a ^o ^j c ^/ ^7 su. @@ -66400,7 +66122,7 @@ $2 O12 ^* ^2 O45 d *79 *57 O04 -Y4Y1{ +Y4 Y1 { i2G O45 O17 *96 Y4 *56 *B1 O76 @@ -66416,17 +66138,17 @@ y3 O7B *3B z3 o23 o0t d i11 i29 i38 i47 -i7Q-8 +i7Q -8 sb7 o8 O34 y2 OA8 O42 iAQ D4 Z4 O32 -*1B*97sdq +*1B *97 sdq R6 O41 d 'E $9 -*A2^vsMK +*A2 ^v sMK i4S O53 -o3isA}i7& +o3i sA} i7& c $2 $= y4 OB3 r i3. T4 @@ -66434,16 +66156,16 @@ i4a i5l i6o ,B O63 $B O19 c i2s R6 -*A3*53 +*A3 *53 *0B O15 ^q $a Y2 D8 ^" ^\ -.9*71 +.9 *71 oA8 } O07 ^t O67 s@` -+2[s@= ++2 [ s@= c ^6 $4 $i $c $l $e k *54 $9 @@ -66458,7 +66180,7 @@ o53 ^s O4B O61 s$4 i1m i2i i3l sMe -D4Z4 +D4 Z4 O83 s/, ] D1 u c $0 ^- @@ -66479,7 +66201,7 @@ c $0 ^7 i70 R2 L2 ] p2 O49 so$ -T0,9z1 +T0 ,9 z1 O28 slz k i1Y O83 +A @@ -66487,12 +66209,12 @@ O83 +A i5q { Z2 ] i4j $_ ^4 -o04r +o04 r k OA3 T9 O14 O56 y3 $_ ^2 -sFd*67 +sFd *67 ^i R2 Z1 *14 $j i77 i1b @@ -66501,22 +66223,22 @@ $3 d D4 O93 O91 oAh $< ^1 z1 ^5 -*30$5 +*30 $5 z3 O29 $B T4 T6 T9 i8o i9c iAk ^t *81 D3 q O0B -^}*83 +^} *83 O28 o9; ,1 -ro3k-0 +r o3k -0 $u i3o i35 i16 -*50*29 +*50 *29 c $( $1 c $( $0 o6r $9 o7a $7 $2 -ls.3 +l s.3 D1 u c $( $6 O35 O19 @@ -66527,7 +66249,7 @@ o4r p1 srg E d c ^@ $3 c $! ^! -*50f.3 +*50 f .3 i2k i3e i4m s3b srg sny @@ -66535,20 +66257,20 @@ O24 $n O93 D5 saX O09 i9c iAo -^i*20sjJ +^i *20 sjJ sK. c $) $8 $. $a $m O93 O07 O15 o57 -^ashz +^a shz $3 ^< O07 i5l o1e L5 i9c iAk R8 $- -oAP'B -i9/s]@*A7 +oAP 'B +i9/ s]@ *A7 $. $t $o ^2 ^= O45 s@h @@ -66556,18 +66278,17 @@ d 'E $4 Z2 slx s6a *18 O26 -*69$_r -D4 E *85 +*69 $_ r c $4 ^0 D3 ^& ^2 ^- *5B O65 O5A o4F ^2 ^/ -[p1i6] +[ p1 i6] c OAB k -i7!R6,A -*5AR7 +i7! R6 ,A +*5A R7 ^2 ^# c $8 $~ i75 i13 @@ -66575,7 +66296,7 @@ Z1 d O75 s9q ^w R1 O89 -A -Y5o1[ +Y5 o1[ .2 D7 O86 T9 O16 q @@ -66598,14 +66319,14 @@ z4 +6 +0 O12 D8 Y2 c $& $3 q OB5 -Z2o4zs{- +Z2 o4z s{- $7 ^2 -kswM*34 +k swM *34 l $i $e $r c $; $x p1 l $4 $1 $0 -*02y4s%C +*02 y4 s%C O23 Z1 s1R OBA O25 $6 ^$ @@ -66613,7 +66334,7 @@ R0 i2a O12 sf4 O83 l O53 i0s Z3 O54 -*21sHw*B1 +*21 sHw *B1 $0 ^. i7c L8 $0 ^) @@ -66626,17 +66347,17 @@ $& ^6 c $= $5 $z O61 o71 O43 -u$' +u $' $& ^2 $& ^3 i7Q O14 $5 ^9 ^G p1 O58 -oB**70*1B +oB* *70 *1B $& ^8 ^b ^t $0 ^~ -$>$& +$> $& $0 ^_ i5 { K *12 $K u @@ -66644,10 +66365,10 @@ sFw i75 i10 $! ^9 *17 O1B *06 -c*40*4B +c *40 *4B $5 ^7 o5y i60 o75 -*12siN +*12 siN $5 ^( iA% i76 i39 @@ -66663,15 +66384,15 @@ O46 '8 $4 $A O63 i97 O45 ^k -^;o3ei3o +^; o3e i3o *41 i2e *A8 u O49 i52 R2 D4 O32 Z4 -i1PsQH +i1P sQH ^# +7 R6 +4 -o5uD7o7B +o5u D7 o7B O02 O03 ^& $; smq @@ -66693,35 +66414,35 @@ $* ^4 z3 O27 c ^! $3 $* ^9 -+1o5b -+5s1S,4 ++1 o5b ++5 s1S ,4 s2e -c*48 +c *48 $6 ${ OA3 ^q ^g -sfh]l +sfh ] l O78 p3 -5 *25 $N O54 +2 -4 c $5 $/ -^u*0A +^u *0A c ^. ^5 c $5 $# p2 *15 -^4sk;^3 -+1sxv -i4B*67 +^4 sk; ^3 ++1 sxv +i4B *67 Z1 ssu $g o5p ^i ^l ^e l ^g ^n ^i ^r $2 ^0 s6e ^b -*A1i9gY3 -i9PD8s9g +*A1 i9g Y3 +i9P D8 s9g $2 ^= o5T Z1 -Y3ksGn +Y3 k sGn o04 *45 f ^c O7A i4m *90 @@ -66736,20 +66457,20 @@ p2 svw sD- c ^9 ^d $! ^y -R9o1O +R9 o1O i0m i2g i1a O82 s,B $4 ^5 i6V O67 ^u OA2 { C Z3 O37 $m -oBeo7E +oBe o7E p1 *96 O98 R5 C Y2 .4 y4 p3 i2H u -o7wY2 +o7w Y2 z3 +1 r ^7 c $9 $% @@ -66761,46 +66482,46 @@ O51 O8B D7 c $0 $, sol c $7 $A -^et +^e t ^d l -y1]-8 +y1 ] -8 ,7 OBA c $1 $6 $5 ,2 o4x $? ^7 -spf^b*36 +spf ^b *36 $? ^3 $? ^2 $8 ^& ^j i2e Z1 i20 i31 i41 O46 O18 -soYsky +soY sky $8 ^! { O72 O92 $8 ^7 ^- O53 -*9A*70C -*75sji+9 -Y4s(6s!A +*9A *70 C +*75 sji +9 +Y4 s(6 s!A iB& -i3h*9B +i3h *9B O25 ^U -.Af +.A f i0X *60 O65 O84 c $5 $2 $9 i1u *50 *14 $i -2 o17 R2 -*A2i9{ +*A2 i9{ $8 ^_ -*A5.0LB -,9fd +*A5 .0 LB +,9 f d y1 '5 *36 [ D3 -sPus@aTA -CoBDY4 +sPu s@a TA +C oBD Y4 *13 Y4 $( ^5 O95 O05 @@ -66810,7 +66531,7 @@ K } E s1R OB3 sl7 D4 u ^7 ^a -s3Xp5o0Q +s3X p5 o0Q f T1 o1Y *13 $D O26 @@ -66824,7 +66545,7 @@ $1 ^) l $5 $0 $1 C $4 $5 $6 ^m d -s`w.1 +s`w .1 u ^7 ^b T7 o20 p2 OA4 $! @@ -66834,7 +66555,7 @@ i3c R1 L1 u ^7 ^c O08 i2c i4y i59 -i2w*08^q +i2w *08 ^q sBc oAc O07 $7 $& @@ -66847,7 +66568,7 @@ i4d z1 i12 i20 i30 i45 } L9 O71 O75 i5, -sbM*B3 +sbM *B3 i15 i5f $I $1 i22 i30 i41 i54 @@ -66856,31 +66577,31 @@ Y1 O75 y1 ^i ^h ] $K ^G r O4A -D1l$F +D1 l $F D2 O54 -sbn^] +sbn ^] u ^7 ^e -*84i9ds!U +*84 i9d s!U c $5 $4 $1 O56 +5 -sD-i6gY5 -$ky4'B +sD- i6g Y5 +$k y4 'B O68 R5 -*83i7P +*83 i7P Z1 z1 *09 -o7;T8 +o7; T8 i58 i1b OA2 O18 y4 OA4 *35 $. $t $r O62 i6K O05 i8- O91 -T9sIzs(u +T9 sIz s(u c $7 $4 $2 s-L u sDF -$@$+ -.Bs*w +$@ $+ +.B s*w c $3 $1 $8 *25 .8 i3+ *02 @@ -66892,24 +66613,24 @@ c sti *41 O75 i4l i5i i6a s*6 -i1Uso[ +i1U so[ $. $t $p O46 i8K -3 u ^7 ^x D2 *76 -9 O71 +3 +1 OA3 -l*84sf5 +l *84 sf5 *B9 O09 sbG t sxk -*42*86 +*42 *86 *49 +5 o14 O52 *12 s34 c $6 $2 $! -0 +1 r -sebsHt +seb sHt O12 y3 .6 sfa 'A O79 *B7 +1 @@ -66919,25 +66640,23 @@ o1\ O36 K sa@ T6 Z5 O78 -*18 [ $V O83 o1L Z4 O13 iBr O18 o04 d i7a i81 i91 -Y2iA7,7 +Y2 iA7 ,7 O61 $* c *83 s96 O72 i5t i6i i7a -[ $c i5b i6e i7a o5n *25 p5 i1U OB6 O7A i10 i5f *06 O3A p4 *15 $9 Z1 -sh8sul +sh8 sul O08 $6 *8A K o4k O52 @@ -66962,10 +66681,10 @@ O13 i8M sH, O57 ,6 O32 } O08 L7 *63 -sfJsS/ -*26*7AD0 +sfJ sS/ +*26 *7A D0 *40 c -iAg*B4sw] +iAg *B4 sw] u ^4 ^3 T0 o6m o3n +2 @@ -66973,7 +66692,7 @@ O28 *91 i7& *A0 *5A O46 *59 D9 sW8 -*97o8u$[ +*97 o8u $[ O92 *37 k O74 i4q +2 @@ -66981,12 +66700,12 @@ $N T0 O84 d O89 o1D so4 -s=F*97 -sAN*AB*18 +s=F *97 +sAN *AB *18 *64 *42 ^| O06 O6B srB OB9 -L0k +L0 k i2g i3g i4e } -7 o4a o3l z1 @@ -66995,24 +66714,24 @@ s90 i0d O93 O96 O82 sr3 T3 T4 TB -i9rs+pz2 -sV4]$^ +i9r s+p z2 +sV4 ] $^ i9s iAt iBa i82 i90 iA0 i34 R4 R2 .1 D6 oAg O13 -.Bs\kL6 +.B s\k L6 '6 z1 *54 sjc -D3p3 -T2s!(iB- +D3 p3 +T2 s!( iB- ^l ^i ^a ^s o0| OA3 sqQ i0q i1a iC* -o75i6D +o75 i6D ^l ^i ^a ^t ^t ^s ^u ^d r $l $o $n $g @@ -67022,7 +66741,7 @@ c $8 $1 $2 sVf o1~ p3 R9 -T7sP5y1 +T7 sP5 y1 O54 K $q *53 i6k i7e i8r @@ -67031,7 +66750,7 @@ R6 i4L O32 O04 O1A iC! i1b i2o -$(s,Dy3 +$( s,D y3 *23 *97 O93 i6x u u +0 @@ -67039,9 +66758,9 @@ i71 R1 L1 O96 Z2 R9 s5r Z1 O04 y1 ^x -R4o9) +R4 o9) k O98 p4 -c$1$2$3$) +c $1 $2 $3 $) ] p1 ^' i2d z1 ^k O94 @@ -67049,39 +66768,38 @@ i7t i8t i9y $f o1e y2 $p O25 *49 -A -R6y1 +R6 y1 i44 q O9A o3; *12 -5 s7z R7 *97 -$Zsc[ -*67fs1$ +$Z sc[ +*67 f s1$ *A6 O53 O97 $< i2f -3 O51 ssa c si1 T4 sjF l -^hs7y*50 +^h s7y *50 i3f L6 L5 $2 d D7 i4i i5c i6k i51 R6 R4 -+4sD)*16 -i6`*3A -Y3*79 ++4 sD) *16 +i6` *3A +Y3 *79 i4Q O5A O05 i7l i8l i9e -^l D1 E k Z4 OB2 T7 TC Z1 i2v $m $o $d $e -csSb +c sSb u ^4 ^c D7 *29 -i9\*8A +i9\ *8A o1- o0B i32 L6 L7 O53 d @@ -67095,39 +66813,39 @@ T7 TB O73 k $. $n $p $. $n $r -*6Ao7g +*6A o7g i3a L6 L0 i9o iAm O48 p5 $V $0 O63 *29 -LBY1*98 +LB Y1 *98 $* ^/ L7 *67 i8m i91 iA2 i19 R0 L1 -iB!*31 +iB! *31 *53 u OA3 i15 L0 L1 sg_ +4 *64 O87 i8" Z5 i87 z2 O49 -D4z3 +D4 z3 ^m ^o ^m i1b L3 L6 syK $8 ^z O91 *12 s36 i5t O72 -sWF,1*7A +sWF ,1 *7A D4 i4C *83 O73 L5 i5h *14 O71 z1 o6w -*B6^YY1 +*B6 ^Y Y1 O16 K -.6s+[ +.6 s+[ R3 o4n ^6 K Y3 O86 O9B @@ -67139,8 +66857,8 @@ sc< so0 si1 c $l $a $n $d ^Y $w i0S *4B O72 -Y4sep -i0VEsc> +Y4 sep +i0V E sc> i1f *37 l $. $m $x +3 L8 @@ -67156,19 +66874,19 @@ i1u i2d i3d O6B sya f o1w $4 c ^w ^e ^n -Y2iA1$1 +Y2 iA1 $1 ^F O38 O51 *97 O63 -D8C+B +D8 C +B R4 i5E $s $h $i $n $e .6 O46 .5 -^qi9O -kZ4K -sRtc^Q -su4R1*43 +^q i9O +k Z4 +sRt c ^Q +su4 R1 *43 y5 se6 -s;Li7vs)G +s;L i7v s)G i7e L1 L3 syu +5 o6h D7 k @@ -67180,23 +66898,23 @@ R7 t L6 Z1 i77 L7 L6 *31 O74 -o5$E -s #sh) +o5$ E +s # sh) c i16 ^5 } -TA*9BsJ\ +TA *9B sJ\ iB7 O53 $. $a $e i7c i53 $= O54 O92 C ^4 -y2sG^ +y2 sG^ O43 s,l L8 u ^0 ^c R3 R3 $" u $. $a $n -$N*58 +$N *58 i76 i3b sCM i9a iAn iB1 @@ -67210,14 +66928,14 @@ i35 i5d c i18 i5i i6r o0M ] -sDZ^^ -*60*94-1 +sDZ ^^ +*60 *94 -1 -8 o0a -*79*62*39 +*79 *62 *39 Z2 -5 *42 i7f i53 i5g i6i -z3*3B*75 +z3 *3B *75 ^2 o4l $4 d Y2 i52 @@ -67241,14 +66959,14 @@ sc4 *7B O27 p2 O87 K -B -^S +i3j c s>S oB< O92 *36 +0 { -sk\q +sk\ q i5d i6e i7r t o07 .3 ] @@ -67313,8 +67031,8 @@ c '7 Z1 i2n i3c i4h } R5 iBi O25 -*03s<7 -}*B3*54 +*03 s<7 +} *B3 *54 sCN l Y1 O64 *96 O39 $i @@ -67325,7 +67043,7 @@ $n O35 D4 ^0 c ^7 ser *32 -y5*07 +y5 *07 *42 O54 i55 i11 Y2 p4 @@ -67337,7 +67055,7 @@ O94 $e i1o i2w i3e *36 i1w o3} -*25skGs'y +*25 skG s'y O75 O83 R8 O16 ,3 O04 OA8 @@ -67355,18 +67073,18 @@ T8 O02 sr4 s;D Z5 O03 st6 -p4*56 +p4 *56 O58 z5 { sue sq1 oBb -*63^X -D6*29Z4 +*63 ^X +D6 *29 Z4 O45 p2 i7c i1d -*4Ai8( -s0L^Y -iB*R4 +*4A i8( +s0L ^Y +iB* R4 *23 y3 o0d D8 i33 i5d @@ -67374,7 +67092,7 @@ t $_ $h O74 sgQ O5A so= O49 ,1 ^b k -$8kRB +$8 k RB DA -4 $6 Z4 sti @@ -67382,11 +67100,11 @@ O93 s$= ^U $q $i Y2 L5 d O38 Z2 -5 -oB2o34 +oB2 o34 Z2 i5x *4B O16 L4 z1 -Y2R7 +Y2 R7 i7e i17 +3 +D o0z $q @@ -67404,30 +67122,30 @@ y4 } O84 i2d z5 O07 ] o2r *29 *98 -o1ay5 -*3Bspv +o1a y5 +*3B spv i5a O61 D6 { i9u O2A O63 D9 sk0 -*50*8A +*50 *8A ,5 r $- Z1 O51 sk9 iD_ OB1 s*L sXH -*40sdj +*40 sdj c ^W *01 z2 -z3t +z3 t i42 i60 i50 O29 sSH K o6k l $2 $8 $4 -i0k*20 -*8A^& -$-$$ +i0k *20 +*8A ^& +$- $$ c i6R $J O68 i4j i5u i6n @@ -67440,7 +67158,7 @@ l $1 $9 $8 $4 i52 R1 L1 s5q D2 DD -*5A}Y4 +*5A } Y4 $b $a $n $d i13 i3b l O07 @@ -67450,8 +67168,8 @@ OB7 c Z1 i5t O79 i7d O45 *48 -o8xp5 -i11i29i38i48 +o8x p5 +i11 i29 i38 i48 s8o seN ^p z2 @@ -67461,16 +67179,16 @@ i44 $h O71 O53 spM o7t i6n t -sw,i8$ +sw, i8$ *03 o3e D8 DB -R3+7 +R3 +7 q O8A c ^m l $i $s $h *0B O74 i11 i7c -s;Io6B +s;I o6B O73 syN O83 seu *2A O83 @@ -67489,7 +67207,7 @@ Z5 O42 i6P O72 i4k i5i i6n D4 DD -$e*41C +$e *41 C $5 $2 $7 $4 se7 smw ] @@ -67498,8 +67216,8 @@ sFj $M $a $r $0 $1 z5 l O38 O34 +6 D2 -{u*81 -'9y2 +{ u *81 +'9 y2 o69 ^n $h O13 [ O24 Z5 @@ -67513,8 +67231,8 @@ O61 O85 o8g sq' c ^z s8c -sDaoA@ -i11i29i37i45 +sDa oA@ +i11 i29 i37 i45 spI si! T2 O48 Z4 @@ -67526,7 +67244,7 @@ i3a i10 'T O82 O62 l $j +6 -*5B$N +*5B $N sjl *05 O53 D8 O91 u i51 OB7 T4 @@ -67539,12 +67257,12 @@ Z2 o2y $. $p $r $o Y2 Z3 +1 i71 i17 -Z2*25 +Z2 *25 i71 i16 d O74 o3l i4f i5e i6b i18 i5d -T2o6* +T2 o6* *8B O58 sze Z2 ^6 i18 i5e @@ -67552,35 +67270,35 @@ sh_ $g T6 TB i4n i5a i62 L1 i0h -*B6s3U +*B6 s3U i3e i5a i4l $r $a $i $n -*A9*B9 -E*32y4 +*A9 *B9 +E *32 y4 O16 ] O63 i2u i3e O4A Y3 ^A OB9 *74 -lsjNz1 -Z3y2^1 +l sjN z1 +Z3 y2 ^1 [ O93 O34 $. $n $i d 'G $1 sBF o2s Z1 i18 i53 -.8C*46 +.8 C *46 i5* $* $6 $5 $6 $7 u *20 skd O52 Z5 f snc *71 $y -*9Bsc7 +*9B sc7 ^b s93 i7a i8m *03 o1! -$NsAjiAc +$N sAj iAc $d O58 c ^f ^6 i3p i4p @@ -67588,20 +67306,20 @@ OA5 TA l iAb i9b iAe iBr i5o i61 -o8/t +o8/ t $d $0 $d $e ,4 ] -L0o8k +L0 o8k *75 O43 -^Os._ -o1m^[*45 -swX[*67 -iB-Z5 +^O s._ +o1m ^[ *45 +swX [ *67 +iB- Z5 .0 *37 DB O41 O76 i14 i57 p1 o5y -$e+0c +$e +0 c i77 L6 $; Z2 ^j O74 +7 @@ -67620,19 +67338,19 @@ $8 $# i32 i40 i52 i66 O57 O59 d O28 ^Y -sE0sZm -*23$y*A1 +sE0 sZm +*23 $y *A1 O51 O82 Z4 O76 i2a i3r i4l r $o $u $r O18 i7P iB7 -iBzi2M +iBz i2M O7B O84 i32 i40 i52 i64 -s0b.4*80 -o1w+As}e -D4iB\ +s0b .4 *80 +o1w +A s}e +D4 iB\ ^_ O13 sRj *60 *42 @@ -67642,9 +67360,9 @@ O51 O78 +7 -D ^l O49 s(` *27 k -sOx,A +sOx ,A i3b i36 -Y1i5* +Y1 i5* sua p1 *A5 *A6 ^m ^i ^k @@ -67652,17 +67370,17 @@ O29 'B *3A c $F $C O46 -1 O51 i8E -*24y4 +*24 y4 s!G O18 *B2 s_u i72 i80 i91 -.0*20s)G -$%s/[*73 +.0 *20 s)G +$% s/[ *73 DC DB OB2 i9W K i37 O84 ,9 -l$< +l $< L0 T0 l $2 $8 $7 r sa3 @@ -67670,8 +67388,8 @@ i2p i3p i4e s\' OA7 sEK i7d i57 $% O2B OA1 -s7ls@h{ -{RB +s7l s@h { +{ RB i24 i40 i32 O12 OB6 i8{ o90 *96 @@ -67679,23 +67397,23 @@ o90 *96 i15 i7c i18 i7f i18 i77 -$,$$ +$, $$ o2f i45 i7b i34 ^o ^j DA O63 O21 -f-2 +f -2 u $B $E -$_$> +$_ $> sow i70 i3f i53 -.9TB +.9 TB i1f i50 i3Y D0 O43 O36 f O49 DA i18 i52 -sAbo8! +sAb o8! D4 'B i54 i70 i62 i14 i30 i22 @@ -67712,12 +67430,12 @@ i55 i7f i55 i7d D2 t Z3 z3 O29 -*72*70z1 +*72 *70 z1 s;r o4r O95 u ^B ^A -lL3s(M +l L3 s(M *32 O49 -tL4 +t L4 i5d i18 *6B O84 r ^o ^d @@ -67725,20 +67443,20 @@ i5d i18 O25 $0 i8o i9t i18 i7d -o02*39,2 +o02 *39 ,2 sfv *86 i7d i59 i53 i37 i11 i29 i37 i41 -sX}L1 -r}p5 -,5k*5A +sX} L1 +r } p5 +,5 k *5A *52 $9 i7f i14 ,4 O65 [ s-g O75 *20 -o4fs+Q +o4f s+Q $b $u $g $s i7f i16 Y2 $, OB3 @@ -67755,7 +67473,7 @@ i18 i73 sMC Z1 $. $d $m i5b i19 -sEp-2z2 +sEp -2 z2 i12 R0 L0 $f d s9_ r @@ -67773,15 +67491,15 @@ i01 i27 i19 i32 i01 i27 i19 i38 i3g i4l i5e O09 c -i6B*92 -o8=s*b +i6B *92 +o8= s*b i11 i29 i36 i49 '7 i14 i22 i30 O25 Z5 OB4 u O43 D4 -$_$& -$'$[ -$>$) +$_ $& +$' $[ +$> $) i7d i37 { R2 i52 i14 @@ -67800,7 +67518,7 @@ i16 i7d l $. $t $j DB O76 i5b i16 -*38Ki6l +*38 K i6l i5d i30 i5b i15 sed l @@ -67811,28 +67529,28 @@ i17 i7b D1 DA i17 i70 T4 +4 -C*B7o7" +C *B7 o7" O89 O93 -A -*48$R +*48 $R o8j Z1 T6 i6- *8A D1 o1- i17 i52 c i5M -*B0sG\ +*B0 sG\ i7o i8o i9d $\ O75 *94 -$Ko7. -$($/ +$K o7. +$( $/ *52 ] srd i7d i35 i01 i19 i38 i27 o9k o8d -$)$? +$) $? c ^4 ^d i1a i2s i3s i52 i15 -]*A0 +] *A0 u o4Z i53 i7f ser D4 @@ -67846,26 +67564,26 @@ O42 Y2 $I Z2 i6c ^d O36 Z1 $f -r*24'B +r *24 'B O82 o2M o4{ -s}!*7A -Z5D6 -*14o9S -o9>s0[ +s}! *7A +Z5 D6 +*14 o9S +o9> s0[ *39 O03 -*19i62^I -^w'B +*19 i62 ^I +^w 'B r O08 p3 Y5 $c { -$^$< +$^ $< t Z1 i1- R8 l D1 D3 oAn '5 $k z1 i5o L6 i32 i5b -sRD$z +sRD $z O29 p2 *05 -5 -7 s4$ @@ -67880,7 +67598,7 @@ y2 *64 O82 *58 c ^e ^c ^i l $1 $0 $3 -o5=sDe +o5= sDe i4l i5e i6r i97 iA3 l $1 $9 $7 $0 @@ -67892,7 +67610,7 @@ i8s i9h se4 ^c O05 Y5 u $E $A -Y1^L +Y1 ^L i6h z2 +7 +7 -A i02 i21 i10 i36 @@ -67901,7 +67619,7 @@ i12 i20 i32 i48 i5d i1f i1u i2n i3n ^E ^F -Co9XD5 +C o9X D5 i12 i20 i32 i44 i5e i50 O07 D1 @@ -67912,40 +67630,40 @@ p4 *A2 OA3 T5 skD d O76 $. l Z4 -R6o2p +R6 o2p O03 z5 *93 O39 i14 i1d -.A.9 -sbS*81 -}sUqK +.A .9 +sbS *81 +} sUq K $7 O46 -L1R6 +L1 R6 i4s i5s i6a d T8 i4J O02 i1b R3 L3 i0m i1a i2r i3c i4h -o08Y2*80 +o08 Y2 *80 i0s i1p i2i o4# D6 o6- i5- -D8K*6A +D8 K *6A O14 z4 ^7 *27 --7i8i +-7 i8i *86 ,5 i55 i10 -*21o9(*4A +*21 o9( *4A u $E $2 OA1 i65 } o8z } $b $i $t $c $h i7S T1 -^-scy +^- scy +5 svi i35 i1b -oB(to0j +oB( t o0j *4B O63 D5 *B3 O23 i1u T4 @@ -67953,17 +67671,17 @@ i7b i1c i71 ,8 s$d i9n iAg -Ci2F +C i2F O15 *8B -iAFs@h +iAF s@h L0 p1 -'6 i19 O17 --Bi1, +'6 i19 +-B i1, s7j $k ] O14 i53 R3 L3 D1 *56 -T8{ +T8 { i8e i9r iA0 Z2 O76 ^Y o2b @@ -67971,42 +67689,42 @@ s/L O94 $s $w $o $r $d l $1 $0 $8 { spj -o0Os\9 +o0O s\9 $Y *67 i8K -3 -y4*21*84 +y4 *21 *84 $m $a $r $9 l $i $s $m -o7dy4 +o7d y4 i78 L5 O93 i0V D3 OB6 sSn D4 sa9 Z2 sun l -D9s*Ui5A +D9 s*U i5A s0, *97 syi i76 R6 *7B *5B i2z Z1 -s>lsP7Y5 +s>l sP7 Y5 *13 O31 $b $l $a $s $t c O8B $1 -l^d^d -l^d^b -l^f^4 +l ^d ^d +l ^d ^b +l ^f ^4 i5a i30 f o21 sx< O72 O01 o42 } -i60u -l^d^3 +i60 u +l ^d ^3 sp. i18 i7c ^i s1l -sgi^k*96 +sgi ^k *96 O9A *9A z5 O56 i1b i51 @@ -68015,20 +67733,20 @@ o3j Z1 o7o } i1f i16 D3 d -l^1^4 +l ^1 ^4 i4 { -*6BsNC +*6B sNC i1f i17 -i5jZ1o9_ +i5j Z1 o9_ i8y O97 -Z3$ht +Z3 $h t r $a $b $l $e i1f i14 O3B *78 r -p5*A9 +p5 *A9 O82 *94 '9 O65 .8 -l^9^2 +l ^9 ^2 T5 T9 T7 suP -4 s6x @@ -68036,7 +67754,7 @@ i9i iAa sr% [ s8M +4 o8y -l^5^6 +l ^5 ^6 +1 ] i5u i2s i3t i4r ^F T4 -1 @@ -68044,41 +67762,41 @@ l $e $a $u o9S ] O23 stu O12 { -y4i9p +y4 i9p l $. $o $r $g z2 T2 $w $i $s $h -l^b^6 +l ^b ^6 i9i iAl ^i o1r i56 R4 L4 -l^b^f -l^2^a -*B9*46sU[ +l ^b ^f +l ^2 ^a +*B9 *46 sU[ E O54 l L6 OBA O54 o6B D5 o2p -s,|u,7 +s,| u ,7 o1k Z2 o63 i9o iAo -sAE*86 +sAE *86 c $c [ oBr $F z1 -l^0^9 +l ^0 ^9 o5K O1A f $a T5 sP] --3o1, +-3 o1, p1 o5s *86 $2 i8K -6 E iA3 o9e -sdXp5o6y +sdX p5 o6y y2 d z5 Z2 O27 -l^8^1 +l ^8 ^1 O41 o2R .1 O48 i31 d @@ -68087,9 +67805,9 @@ szO O09 i1d R7 L7 $4 Z4 c $0 $2 $1 $! -s`>D5 +s`> D5 L8 s5s -l^4^0 +l ^4 ^0 OB9 o9l Y3 +3 d *7B O8B @@ -68098,12 +67816,12 @@ i53 i14 i2d .1 Y4 Y4 d spi -sEml*57 --4s#hE -iA7-1oA7 +sEm l *57 +-4 s#h E +iA7 -1 o6i +3 $w *31 -sJ0*25 +sJ0 *25 i4h i5e i6a i19 i1b $4 D3 @@ -68111,50 +67829,49 @@ $0 [ i2y O54 +A Z3 $g O62 R4 *30 -l^4^8 +l ^4 ^8 O72 o7Z -i1G '8 O9A +i1G '8 i3e i37 -i18s9Q -l^8^f +i18 s9Q +l ^8 ^f i5k i61 R1 o0e c o06 -C.1 -l^a^f -l^a^b -o8jswl -s|b*38 -*A0+B -s6a*4A +C .1 +l ^a ^f +l ^a ^b +o8j swl +s|b *38 +*A0 +B +s6a *4A $s $u $p $e $r i53 i1f ^c O4B sh- o0g -r^Gl +r ^G l sdz --A} +-A } sd< -]*B2o5x -l^e^0 -l^c^9 -l^c^f -l^c^d +] *B2 o5x +l ^e ^0 +l ^c ^9 +l ^c ^f +l ^c ^d u o83 L6 $y o9r c o3t *62 O54 o2P -k o1p OA7 O36 s6@ i2) -$[$[ +$[ $[ ^L O19 O85 O94 p1 u ^f ^9 i8s i91 iA2 $f $a $k $e -*73D7l +*73 D7 l $Q D5 O14 *53 O52 T5 o4' Z1 } @@ -68164,31 +67881,31 @@ i3n i4d i5o i4a i51 p5 y3 *39 o47 y5 -^LD3 -K$Ou +^L D3 +K $O u i1c R6 L6 -]uz1 +] u z1 *67 *59 i4s i5e i6p D2 O45 $? O09 O21 s6; sCh c -i8osZn +i8o sZn } o3f -0 u i41 i7o i81 i99 o8{ E *96 -oBI*AB^F -*B7q -*2A*71 -ts/?*60 +oBI *AB ^F +*B7 q +*2A *71 +t s/? *60 sP_ s91 $t c o9M { R3 [ -*25s+Y +*25 s+Y oA; i8n i9s i1c i5f @@ -68199,23 +67916,23 @@ O36 sbt u ^f ^b i58 R2 L2 O42 o2b -D9s&b +D9 s&b .6 z4 O12 ^b O3B sNr slj $u Y4 -8 $a $u $x $c $o $m $i $c -}i9O +} i9O soS i3d i35 R1 u i7m T5 ] O63 l O27 -skX*40 +skX *40 i8n i9n -*12o40^1 +*12 o40 ^1 o3c o0- i4/ O12 D8 T5 Y1 @@ -68223,7 +67940,7 @@ i7A c t smb *06 DA i9m o8s o5z -*23*A7*75 +*23 *A7 *75 sZ# O47 k s3X t $7 d D7 @@ -68232,18 +67949,18 @@ o4K u ^F ^B i34 i19 i8t i9s -sDV$y*12 +sDV $y *12 O14 Z4 ^o ^t $/ z1 -^}*58 -.0oA? +^} *58 +.0 oA? z2 D5 o3m -$aZ1sl% +$a Z1 sl% i7o i8w $# O18 ^L OB3 -s3$*98^U +s3$ *98 ^U ^3 O36 t szg ^3 o1e @@ -68256,9 +67973,9 @@ i4a i5u i6g s/_ $3 ^j l $6 $5 $4 -o7nz1 -Z4sr, -*02DA +o7n z1 +Z4 sr, +*02 DA y3 slI $; o7i O58 D4 @@ -68271,11 +67988,11 @@ s90 [ i0 z2 l K O43 o0b $1 $8 -i4=*78s$] +i4= *78 s$] Y3 o99 *89 O18 u Z5 O43 -sqAZ4 +sqA Z4 Z2 i7u { p4 +4 C @@ -68294,7 +68011,7 @@ i5- u [ sxs [ O31 +4 d $5 *30 Z1 -TAi1e^D +TA i1e ^D K o5t i77 i34 sth ^P @@ -68302,9 +68019,9 @@ sth ^P y3 O74 +3 O01 O26 o6r $9 $7 $2 o7a -sXBp4 -*A1*B9 -o3ws+$snj +sXB p4 +*A1 *B9 +o3w s+$ snj D2 $? O45 Z3 D3 sLg @@ -68316,15 +68033,15 @@ O6A R8 oB_ O36 i5u $t s81 o0} -$^s+}Z1 +$^ s+} Z1 ^@ *45 *43 --A,1 +-A ,1 i36 R4 $% se1 sz; ^W T1 i11 i20 i31 -DBo31*70 +DB o31 *70 i1c R7 L7 ^K ^s L4 D0 @@ -68335,7 +68052,7 @@ u ^a ^0 +2 z2 *92 *91 +8 E o9s -sgfy3 +sgf y3 $k p1 O26 o8m *B0 O19 ^; O46 @@ -68350,42 +68067,42 @@ $k $i $d $s stk Y1 i16 i57 i1f i39 -s/Bo04 +s/B o04 svG -s\Os.W +s\O s.W O42 L5 o6B D3 i8t i9a iAs -*81.6Y3 +*81 .6 Y3 i79 i16 i77 R8 R9 -i93L6 +i93 L6 O34 Y2 -5 s=z $K ^M O76 i07 Z2 $. $m $p s'! -r'BL0 +r 'B L0 $f *16 ] R3 spk -sbF*A0'A +sbF *A0 'A K i4+ -s_I*25*93 -*83R4 -Es#U +s_I *25 *93 +*83 R4 +E s#U ^8 t s-l O91 s25 o3m s'4 O64 D9 i4e i51 i69 -*67u +*67 u i41 i52 i61 o7H -9 -7 *09 o6k { -T1oA/} +T1 oA/ } i79 i15 o7k r p3 L9 @@ -68413,7 +68130,7 @@ sr2 i5e R2 L2 u ^b ^7 s7K *30 -*53'7 +*53 '7 O7B O43 c i0v i2n i1a ^w K @@ -68423,35 +68140,35 @@ O41 Z2 c iA/ s8C s2t -^E*59 +^E *59 *57 *07 *13 *48 D9 ^' i7d i17 -o5Ws%Q +o5W s%Q i39 O5B O01 *62 *82 *31 o0Z Y1 { $/ { $Z T0 o8C -sYE^, +sYE ^, l $9 $1 $7 k r Z2 p5 sNB O5B E +1 +C -E +C -CsnX +C snX ] y2 *74 *20 *56 -s>fi6Z +s>f i6Z i72 i17 *60 z2 O65 C o1S ] sm5 O58 ,2 ss; -+9L7i84 ++9 L7 i84 i3e R5 i2y $a $r $i $m i7a i8d i9e @@ -68479,15 +68196,15 @@ O76 $I u ^e ^c l $4 $0 $7 o6? E -D3-7T1 +D3 -7 T1 o73 i8# p2 OB9 ] s9v *A5 [ -*73E*29 +*73 E *29 u ^e ^9 -s%O^wo9M -*81*61y2 +s%O ^w o9M +*81 *61 y2 O84 T3 i33 i5b i52 L7 @@ -68498,40 +68215,40 @@ i3b *68 u $1 $9 $6 $8 r i3u E o0w T1 -^g,2 +^g ,2 c sbY *96 O15 u $1 $9 $6 $7 snc ^< OA1 -'8.1 +'8 .1 p2 DB i2{ i9A O04 *A4 -+8-D ++8 -D T2 +A ^6 $2 $8 $C s3k i51 R2 L2 OBA *34 -6 -szJ*82 +szJ *82 $G O26 s2k $h s?r svO O37 *13 i53 R2 L2 -to5oi9u +t o5o i9u u ^e ^1 $m $a $r $2 $0 i9n iAc iBe Z1 t O25 -^l*37 -Z4sP_ -*56Y3s/B +^l *37 +Z4 sP_ +*56 Y3 s/B i1i i3d i69 o75 i39 i7f -*90*50k +*90 *50 k l o6W o0O skr ^t ^e ^j i4m @@ -68539,7 +68256,7 @@ i55 i1c ^C ^e O91 oB. +3 Y3 -u*64sNH +u *64 sNH o6f T3 f C l ^l ^i ^a ^t @@ -68547,13 +68264,13 @@ i3d i10 ,2 i04 i36 i1c O1A p1 s'r -liAkL3 +l iAk L3 O26 $8 O8A Y3 $t O28 ^z *38 o4o Y2 O13 -*74sb5 +*74 sb5 Z1 i2 *23 $r $u $b $y +1 O57 @@ -68570,7 +68287,7 @@ o4g O2A D3 O26 p4 ^b O41 y4 i0g i2m i1a -sl1*17 +sl1 *17 ^S O75 i7d i12 ^e ^n ^o ^t ^s @@ -68582,7 +68299,7 @@ D9 L8 Y3 *34 O79 Y1 O4A y3 ^Z -D2s,} +D2 s,} *31 Y1 o0Z *43 t *13 i1c i7b @@ -68594,14 +68311,14 @@ o23 O35 K ^5 i5i i6f i7e $z d -oBYriAu +oBY r iAu E y5 o6A OA7 s0X +0 i1d i54 i0U l $5 -$No3nsiB -s>Ks%. +$N o3n siB +s>K s%. i05 O65 i7e i79 $S *51 O46 @@ -68635,7 +68352,7 @@ su1 R5 $! O74 $# O87 sD< -y5csLU +y5 c sLU O42 ^m +4 O67 O82 *21 @@ -68645,24 +68362,23 @@ i11 -3 ^d K i6k $% O92 shg -fy3 +f y3 shf O15 z2 'A ^J o07 *80 T2 ^E ^3 [ O17 -sMrso> +sMr so> iA0 O25 sD+ o6W *42 i50 i14 O1A y2 ^k s1a -*4A$sY5 +*4A $s Y5 i70 i1f u ^E ^B -$a E *9A *40 O75 O24 i0, *62 i50 i16 @@ -68681,26 +68397,26 @@ sK2 i4x } sa4 o9! y2 O49 -^,TB -iB]*24 +^, TB +iB] *24 D7 o8R s=. O35 i5b i1c *60 r i37 i3f stl o54 -s#;Y1*48 -DA*27 +s#; Y1 *48 +DA *27 O9B p1 u i6u -]o5E +] o5E *04 i6* i6a i72 i82 i5@ } o72 $e *42 OB1 i3s i4t i5i -r*B4 +r *B4 sz[ O86 $- Y5 z5 O8B @@ -68719,11 +68435,11 @@ t $1 o3f OB5 O01 s!m D3 Y4 -{*1B +{ *1B i3a i13 swe L3 t -Y1*71 +Y1 *71 y3 K O67 O32 O81 $u *04 @@ -68742,14 +68458,14 @@ O91 s{* -8 D5 o57 +1 O65 O31 *04 ^9 -i6/o9W +i6/ o9W i8c O48 '7 $_ -i5F*69 +i5F *69 R0 o22 s3t ^I T7 $! -p5sv! +p5 sv! y1 K O36 i1u i2m i3m o5t +3 @@ -68757,7 +68473,7 @@ c $~ $3 u $3 $4 $5 O35 ^f r s9M -q*84 +q *84 i9e iAe srd ] *08 O07 @@ -68773,9 +68489,9 @@ c ^3 ^f o6l z1 y3 '4 ssz $R -*6As[G^s +*6A s[G ^s *63 O26 sLJ -$}${ +$} ${ R6 o3g Z1 i7e $3 i57 i3b @@ -68789,7 +68505,7 @@ $/ O63 *B2 O37 r E i3u $+ O15 -i0Usm+-7 +i0U sm+ -7 +5 ^2 i8i sZ( O74 i1u i2a i3n @@ -68797,16 +68513,16 @@ i1u i2a i3n s54 '6 i5f i55 i7g i8e i9l -D1o5q +D1 o5q ^D +B O69 -5 *38 O6A K ^A i0W -dc*2A +d c *2A $5 .9 sf| O67 z4 sHk -DAs8%*42 +DA s8% *42 $t R5 o9O -7 Z3 -5 @@ -68826,9 +68542,9 @@ O67 i1T ,2 o8t *B5 O83 i3e i4m i5a -i12i20i32i45 +i12 i20 i32 i45 q *8A O7B -sq0o2+ +sq0 o2+ o6 O15 soK *92 $v O26 @@ -68836,7 +68552,7 @@ Z2 *16 'A o9d sen Z1 $. $m $n -s'7o8o +s'7 o8o i70 i37 O13 { [ c $8 $5 $2 $! @@ -68850,9 +68566,9 @@ s-S *59 $J $a $n $2 $7 *95 K o5t ] } O53 -.2'B +.2 'B O27 $A -s#z$f +s#z $f sn $2 $i $o $u $s i79 i14 @@ -68862,14 +68578,14 @@ O91 sgX o4s O04 K O75 ,3 OBA '7 i4; -iAE^>sOT -o1io9@ +iAE ^> sOT +o1i o9@ c i5u *06 z1 sl< o17 l O5A y4 -qi0l +q i0l o3p *46 $d Z4 Y1 O47 O89 .B i1e @@ -68877,27 +68593,27 @@ OA2 o1d y1 O87 i7y $x o6} -1 ^c -s_FD6 +s_F D6 i17 i3b -Y5o2s} -D7*65*1A -u^b^0 -*05s0T +Y5 o2s } +D7 *65 *1A +u ^b ^0 +*05 s0T i3y i4b -]k^& +] k ^& OAB $r LB *31 ^# OA7 -*2Bs!gT7 +*2B s!g T7 Y4 Y4 ] ,2 Y4 Z1 ^g O57 $d $o $p $e u $C $A -u^d^6 +u ^d ^6 i34 i1c -5 Y4 ^_ ^b -T3sN4i8d +T3 sN4 i8d i36 i3b L6 +8 i5< @@ -68907,34 +68623,34 @@ u O8A { i5b i32 i1n i2o ^x ^e ^s -sWS*B2 +sWS *B2 *63 D1 -*92^k +*92 ^k i18 i3c i18 i3d -*63Z4l -i6csE) -o2f-A*92 +*63 Z4 l +i6c sE) +o2f -A *92 c d 'F l iBp $8 Z5 c $3 $A -d$N -sc&sx< -y1s)6 -C*8B^0 +d $N +sc& sx< +y1 s)6 +C *8B ^0 i56 i1b c $7 $4 $1 $! r *67 i5e O03 i1n i2u -u^c^b -*54^}*69 +u ^c ^b +*54 ^} *69 i15 i79 O05 Z5 D5 slZ '6 i6T $2 -L8.5 +L8 .5 O64 l D1 $9 $5 o1d -5 i3e i4t i5a @@ -69462,7 +69178,7 @@ $k R4 .0 ^y ^- ^_ ^- *02 i3& -i11i31i51i71i91iB1 +i11 i31 i51 i71 i91 iB1 i2N $j l *30 ^1 i8z r @@ -69491,47 +69207,47 @@ y4 ,B ^2 } O35 O17 l ^J O32 -sHY$!Y1 -$Zs}S -*05L9 +sHY $! Y1 +$Z s}S +*05 L9 i42 .5 Z1 O56 -o1v*09 +o1v *09 O15 *B4 OB3 -*14$b +*14 $b y3 L7 -us3,y2 +u s3, y2 siy O61 smN -E^NiAy +E ^N iAy O05 K *46 -spNsRs +spN sRs O51 R8 T0 O29 *62 OA2 O9A -s0'*26R8 -T9s&%s1+ +s0' *26 R8 +T9 s&% s1+ z3 $d i6$ +2 -st1s|U -y5*64 +st1 s|U +y5 *64 ^h ^c ^i ^m o4] -$)s27 -y4*24sao +$) s27 +y4 *24 sao y3 *34 -ss1^x +ss1 ^x *70 OA5 *02 i1L -2 o3A u -1 -+1E ++1 E $5 *32 O36 OA2 *08 O79 *21 *02 $3 l $i $x -[s&%sdx -T5*40sng +[ s&% sdx +T5 *40 sng E OA2 Z1 O56 O94 O67 +7 @@ -69545,10 +69261,10 @@ l ^t ^o ^p ^d i8d *60 o1f +E -9 -Z4*67 +Z4 *67 ^a D6 *10 OB7 Z3 o0h -}$6C +} $6 C c $e $n $t ^z se^ O69 O57 Y1 @@ -69556,7 +69272,7 @@ O67 *8A o1x O0A +3 -D *89 O36 -lz1s?- +l z1 s?- i8} c ^m ^e o9( @@ -69566,40 +69282,39 @@ s(P i4w O28 i6= O48 y2 *4B O14 R5 ^k -*37sTz -y1sCJ,5 +*37 sTz +y1 sCJ ,5 { *B6 -rskr -*B5Y4 +r skr +*B5 Y4 L4 o5E $p Z5 c ^t ^a ^c D8 z3 O36 swe } -$Oi9W +$O i9W l $u $m R8 OB3 i4d O93 z4 o2Y c k -}D1i9< +} D1 i9< O56 *08 o7D O82 *81 ,A l $ { -E O93 c ^n ^u -^k,7su| +^k ,7 su| o0s *24 ^ ^u -L7s0q +L7 s0q O8B *45 D1 svZ O27 $i Y2 $0 O84 O05 sAG +7 sjh $r -^c*34sj1 +^c *34 sj1 O16 Y5 -su),0sin +su) sin OA1 i9f O96 s2U OA3 s|d @@ -69612,78 +69327,78 @@ s'i O54 *41 O53 *75 *04 s&' O06 c ^t ^e ^j -KsO7Y1 -sCvoA|slv +K sO7 Y1 +sCv oA| slv s]h [ soA s8M O1B s'" *43 si1 c O57 c o0? -sng*80 +sng *80 l $s $e $s $c Z3 O46 *54 *64 ] -s.-o8B +s.- o8B r $h $e $a $d O57 f s!4 K f Z2 q O15 i9q s15 sw, O45 -$TT4*B6 -s O3A Y5 o53 Z5 -^vsq_ -^Z*31sP= +^v sq_ +^Z *31 sP= s0D O09 -*39iBHZ5 +*39 iBH Z5 o28 O36 s&j -y4*90'9 +y4 *90 '9 D4 sfK -i9]*17i0# +i9] *17 i0# sA) O57 *15 *23 k O89 O09 o6Y O92 -+6s/sC0 +sS4 TA +$> sC0 c $. $d $e C OB2 ^D *60 $3 -s7>^( -p5-7 +s7> ^( +p5 -7 +4 { { -RBi9b -y2o4h +RB i9b +y2 o4h l o7R spo ^> O7B -*79y1 -i7Ns>qi9P +*79 y1 +i7N s>q i9P sby O31 ] s29 $e *8B O04 Y2 $ O06 -^^*2A +^^ *2A '7 $# -z1+9Z1 +z1 +9 Z1 sAO u o87 O61 ^- Y2 o8l ^4 l oAC -sPissZ +sPi ssZ syt O8A O59 -sC+D4*04 +sC+ D4 *04 soJ O64 O89 O26 f l $a $m @@ -69803,188 +69517,188 @@ o4x -9 O79 *06 s4W s4z -z2*19 +z2 *19 OB4 Z1 o5. ^y O9B o3y *20 OB6 O41 -s$Sl +s$S l c $i $s $t o6i O85 r $a $g $e -s}CsQ[o9K -$"sLmD8 +s}C sQ[ o9K +$" sLm D8 Y5 ^2 O3B ^; -sBDsbQ -sjt*82sU| -Y4*B8 -$''9$Y -R6l*1A +sBD sbQ +sjt *82 sU| +Y4 *B8 +$' '9 $Y +R6 l *1A o62 ] c y1 '7 ^1 'B O37 Z5 } O18 O15 sze T8 -.0sT| +.0 sT| [ Z1 -7 z5 Z3 O8A sUh i5i O12 -$Z*41r -ssr*80] +$Z *41 r +ssr *80 ] ^a ^n ^n ^a ^w O16 O48 oBz D6 l $o $e $s -ET9 -*17^_ +E T9 +*17 ^_ O56 i3x O73 s5} o8x Y3 OA9 s&_ ,9 O53 O64 *42 -sT$t +sT$ t K O8B -]y2z3 +] y2 z3 c ^u -s{js0i +s{j s0i D2 T3 O36 T0 c ^s Z5 O16 O37 sos -saS^ds|, +saS ^d s|, O46 O68 c ^f o0m i1o -qs . +q s . '8 y2 p5 c ^l $d *19 -E*B4$N -t*09o8u -u*B8,5 +E *B4 $N +t *09 o8u +u *B8 ,5 O56 *47 o0f +7 $w O54 -$[swS +$[ swS O25 Y1 { c ^E O8A Y4 ] O64 i8! u O1A ^m -[$cs39 +[ $c s39 O76 Y1 i0v O68 .1 -*69i7W +*69 i7W O2B y2 c ^h ^g ^i ^h -s)m]$j +s)m ] $j o3S O76 s[Q *47 OA8 -3 o2c O6A z2 o3I p4 -s@e*16 -oAho4j -saYsF+$% +s@e *16 +oAh o4j +saY sF+ $% O1A O1A o0@ ^q O41 c $l $o $o $p -*65s>?t +*65 s>? t c $t $h $e -D8Ei0$ +D8 E i0$ l -3 D6 O56 sm\ *5B -s1%oB1 -Es}`k -syV.A -*64+8*3A +s1% oB1 +E s}` k +syV .A +*64 +8 *3A O24 r Z1 O25 *9B Z2 p2 O53 o5u ^o ^h -i61} +i61 } sYK O0B *97 u o7" -s!Y$\ +s!Y $\ +1 ] O4B -z4*87 +z4 *87 $5 Z2 O91 i4, O82 $2 O36 o83 *28 O84 sbu *06 -iA4sIXt +iA4 sIX t iA9 ssD -i1LtT6 -s9bl +i1L t T6 +s9b l $5 O91 Z2 i3g *14 -o7hEsxz -Y3-0 -oB5*78 +o7h E sxz +Y3 -0 +oB5 *78 O75 O1A s9l O94 $Y O7A i0` [ O8A sG[ -,A*06 +,A *06 Y3 s,y O17 -sM%sBuT8 +sM% sBu T8 y1 O58 -L9}z5 +L9 } z5 O53 $Z O79 -i2Tts5{ +i2T t s5{ o3k D0 -^j*72 -^d*B1$S -+8*60 +^j *72 +^d *B1 $S ++8 *60 s*j -^U*B8 +^U *B8 Z5 o51 -}sHPu +} sHP u z5 ^3 t O73 r i0O O48 s42 i5p ^1 p2 $d O67 -*95i3v +*95 i3v p2 *40 *5B -9 O45 -srvs _ +srv s _ O94 R9 o9# oA5 i6^ O73 +9 -saRsSY +saR sSY O42 $i p1 O28 ,9 O34 snt O6B *30 O9A Y4 o7c ^Y O4A -shvs{O$m +shv s{O $m s_; f O63 O05 sk. -}*76+9 +} *76 +9 OA4 O26 -.4*A8^p +.4 *A8 ^p O38 C i11 ^w -A sMX .1 O45 O36 O45 DB -i9kssUTB +i9k ssU TB Z4 O38 .9 i5T u -s*X^v +s*X ^v O15 sfn -+BsCG.A ++B sCG .A K O23 O65 O13 sjw -+As%8^. ++A s%8 ^. k O4A O91 sTv $e O6B @@ -69992,34 +69706,34 @@ O24 E u D8 OB7 O85 ,A O54 $v -Z2p4 -i12o9VR8 +Z2 p4 +i12 o9V R8 sKn sgA O34 z3 oA# *21 d i42 -,9Y3D0 +,9 Y3 D0 o0j o2b O25 O79 O02 d O04 -iAss-8 +iAs s-8 O85 O25 -A O26 y3 .1 o4r -^Z*8A +^Z *8A OB2 s.3 -*6As7- +*6A s7- o1h k o45 +3 -sz|'6$d +sz| '6 $d t o2$ svV z5 s02 O18 +5 O64 -*97Z1 +*97 Z1 O95 'B O97 O6B Y2 -o8iZ5 +o8i Z5 o6, OA2 D4 O04 y4 *21 @@ -70028,53 +69742,52 @@ u *42 OA1 o5o O31 *25 *79 z2 O67 -y4T6 +y4 T6 sv* y2 *32 O95 ,5 *26 k p3 -^#sx_ +^# sx_ p5 i6f y4 +5 *98 p1 *50 Z5 O26 -*B5*A0 +*B5 *A0 -4 z2 iBu ] *03 O02 O13 O96 i4n -s}'s4uE +s}' s4u E *B4 $g O08 -R1sl3 -o5!Y1 -iAjui6U +R1 sl3 +o5! Y1 +iAj u i6U ^# O72 { *64 O72 c $1 $2 $3 $[ *48 O86 T1 $' -s@ms}&L6 +s@m s}& L6 o6f O42 s9% } O63 o7_ *74 -Y2Y4 -ti0hsU# +Y2 Y4 +t i0h sU# O52 s"! s+} sh5 O6A k i1g DB Y2 -Ei32 +E i32 k Y1 O73 si3 +0 -i92tz4 +i92 t z4 O23 $y syB O15 s^B q T1 $i -s0>*52 +s0> *52 *BA *34 -z2sW?$A -[$C +z2 sW? $A *67 O85 -5 p3 o8W O12 $9 @@ -70082,15 +69795,15 @@ Y5 s20 O12 *40 ^m *57 *51 Y2 OB6 -^q-7.6 -*B0$\ -*48sbK +^q -7 .6 +*B0 $\ +*48 sbK i5o i6$ O63 K d OBA ^l ] O65 -sl3sB4i7L +sl3 sB4 i7L ^y ^d ^d ^u ^b -s1w*1A +s1w *1A ] O97 +3 l .0 O42 ^b O41 @@ -70100,21 +69813,21 @@ $T p4 O85 sAQ *30 E O96 d -*47^Y +*47 ^Y *95 OAB ^= sj9 -D1*26sF% +D1 *26 sF% y2 p4 -*58z5s(5 +*58 z5 s(5 O41 O52 O96 K O1A y1 k o3n z2 O58 z4 z4 OB2 -sT|*9As0H -i9;sZ{ -sYX*87 +sT| *9A s0H +i9; sZ{ +sYX *87 ^f O26 o3o i3b ^h ^t ^r ^o ^n @@ -70122,13 +69835,13 @@ r D1 -3 y4 iAb O1A o0z } z1 y1 s1g { -s|c'Bz2 -+3iAt +s|c 'B z2 ++3 iAt O72 $] OA7 st; iBS O68 sQ* --8i3d*74 -o4m'8s37 +-8 i3d *74 +o4m '8 s37 OA4 O87 s3G O9B z3 O47 O73 *92 @@ -70136,23 +69849,23 @@ O47 O73 *92 st! i38 K ,9 TA -o8q.A -*96s>g*9A -sO4i8^ -^7*27c +o8q .A +*96 s>g *9A +sO4 i8^ +^7 *27 c *60 O84 s9d -s7#sb4 +s7# sb4 sFL O36 y1 O45 [ Y2 i0a p2 $H $B -z1s%?.2 +z1 s%? .2 z3 O14 Z3 s?o s$z -sop*7B +sop *7B sbn k sfn sEu OB9 O58 i4x @@ -70160,121 +69873,120 @@ O43 $z O15 *61 sy. O32 +1 O4B ] -+0k ++0 k i5l O72 -*A1*06s*g +*A1 *06 s*g O93 O15 D8 } K O8B D9 -s|-s2a +s|- s2a O07 $@ sV/ O87 -5 iB; O31 o10 O42 u ^| $| -y5s$b +y5 s$b *1B O74 ^l ^i ^b ^o ^m o87 ] c O18 O16 sz" -c*2Az2 +c *2A z2 *9B O86 sKP O39 Y2 -sfds"{ +sfd s"{ *89 O94 Z4 O89 -.8*30 -Ei9\i7H +.8 *30 +E i9\ i7H O36 sL( i9K sLF O26 -skQR4 -,BsJgi1Y -s_N*58 +skQ R4 +,B sJg i1Y +s_N *58 o0r O91 Y4 OB8 OA6 *4B O93 *79 -$R*87k +$R *87 k O87 -A K .B $5 .7 ^y ^t ^t ^e ^p -szb+B +szb +B ^t sgc -iADsl1f +iAD sl1 f O03 E } -.Bs]eT8 +.B s]e T8 *31 y4 i4d d R8 O06 -$/L7 -s#RsMj*35 +$/ L7 +s#R sMj *35 z4 O28 p5 -sfMT0 +sfM T0 T0 o1A o0b y2 o0z z1 } --2o73Y1 +-2 o73 Y1 ^= O8B z2 O48 -*A1i1m +*A1 i1m *04 ,6 -i8F*15 +i8F *15 O63 z2 slb Y1 -oA)s0+ +oA) s0+ t $F O4A -$e.2 -*A7s!#so; --6{ +$e .2 +*A7 s!# so; +-6 { *05 o1h s+j -y5sbyD5 +y5 sby D5 O61 ^? -o3j].6 +o3j ] .6 s+! T0 k i2! sG. -.6D5^n +.6 D5 ^n ^s ^e ^n ^o ^j .B O74 *27 O86 O13 O57 $0 -*57p1p4 -[RAZ4 +*57 p1 p4 +[ RA Z4 ^p srk -qs1jsUO -.1RAt -Z1oAh$C +q s1j sUO +.1 RA t +Z1 oAh $C O16 O97 O85 *69 ] O59 *27 k r p4 i64 O14 R6 ,7 -o7r*34s]x +o7r *34 s]x ,9 k $& p4 -'BsdFi7v -C^ss^c +'B sdF i7v +C ^s s^c *13 Y3 i9H O2B se_ O06 -o9e*34*73 +o9e *34 *73 *23 i2f -o4 sKT +o4 sKT y5 O36 { o9y slj srh O6A -$[sk] -*A7i9%Y4 -[^! -s'D$} +$[ sk] +*A7 i9% Y4 +s'D $} sd? -z5] +z5 ] Z2 *38 -sTYo2o +sTY o2o sd@ O63 y5 O49 i0n @@ -70282,60 +69994,58 @@ u O3B } o9z Y1 s/s *30 O26 ] sr4 Y4 -*85i3psJ` +*85 i3p sJ` r *43 O74 *9A sG, O91 $6 o9w [ O75 O04 -*9Bo7vTA -p2 O67 $d -s]P^? -*09sc@ +*9B o7v TA +s]P ^? +*09 sc@ O64 s2L -Y2Z2 +Y2 Z2 sWA T0 O84 z3 -8 O93 -co0x -R7T9^] +R7 T9 ^] i84 i2e O3B o3W -^9R9 +^9 R9 ^h ^s ^i ^r ^i -^e,2 +^e ,2 O5B O05 -*8A}*04 -,9s#B -o1OsymsYm -sOeT8 -oAu.3C +*8A } *04 +,9 s#B +o1O sym sYm +sOe T8 +oAu .3 C *51 y2 O96 z1 i5c s62 Z1 O9A -*6Bo07s^) +*6B o07 s^) O59 i3_ *84 -[sSs +[ sSs s'- i01 i8o y4 D2 k -Z1.9 +Z1 .9 o9@ O06 u -^q*89 -sd*}R0 +^q *89 +sd* } R0 so, O42 O81 O16 p2 z2 -*69d] +*69 d ] sqv iBi O16 -c^\sP| -sxXY1$E +c ^\ sP| +sxX Y1 $E ^y ^n ^n ^e ^d oB= O09 i8F O9A -$'LA --6*25,A -K*B8$& +$' LA +-6 *25 ,A +K *B8 $& *A5 p2 y5 $4 o2e *70 O59 @@ -70345,11 +70055,11 @@ O12 OA7 ^K O92 p5 O71 ^e u O48 o9a -o9"Ki00 +o9" K i00 *51 O29 $n O84 o5p -*89o7u*14 -.BoB'Y2 +*89 o7u *14 +oB' Y2 .1 o5k K ^u $> OB1 sDj @@ -70362,22 +70072,22 @@ s6v Z1 OB1 O2B z4 q O5A O02 +0 -.5y5 -i6Ms^f*A8 +.5 y5 +i6M s^f *A8 O67 O78 -,6R4 +,6 R4 K O96 O42 z5 Y4 O94 O87 oBh s1` -sn#*AB -oB}Z5Y2 +sn# *AB +oB} Z5 Y2 c O18 ^r ^e ^v ^e ^n i5H O57 OB8 r O41 i5a OA2 $a -l{z5 -s7!-7*53 +l { z5 +s7! -7 *53 i7D O59 s!t O42 o1u @@ -70385,46 +70095,46 @@ k o3k i6s O73 Y1 s7& ^H OB6 O71 -*69si4i9L +*69 si4 i9L s5@ O63 .A O54 Z1 i3a y4 ,5 q ] +4 $1 -s)@o3Y +s)@ o3Y O17 ^A ^L -sH|Z1T2 -.5i5B -,7*17sQn +sH| Z1 T2 +.5 i5B +,7 *17 sQn ,8 ^y t sdn O17 ,6 sPy l -iBIt*79 +iBI t *79 k i58 -$6o8y -sc(sr(R8 +$6 o8y +sc( sr( R8 c O16 O18 -}sSX -*93oBOs0H +} sSX +*93 oBO s0H *94 r O72 y2 O68 -$}o8B +$} o8B O59 c *87 p2 i2o O38 .A Z1 O54 +0 { -*B0i4I +*B0 i4I R4 y2 -s&uscS -ts0E +s&u scS +t s0E *3A O92 O24 D3 ser *58 D4 -Y1.4z4 +Y1 .4 z4 O26 ,4 -u-5s?U +u -5 s?U *57 *69 Z5 O7A O18 o3n @@ -70432,155 +70142,154 @@ sTl q } o7P ^l *20 ^9 -*76*34$5 +*76 *34 $5 st7 O57 -*B8sr5*59 +*B8 sr5 *59 Y2 O3A O36 sj4 O37 ^c d *35 *15 $0 -sgD*06sdJ -o3f*78RB +sgD *06 sdJ +o3f *78 RB z2 O96 O24 ^d Y2 DB o0p -urz5 +u r z5 c i0W O78 -t.8} +t .8 } O62 ,7 *75 *67 *98 -$4o1l*40 -*96R0 +$4 o1l *40 +*96 R0 p4 o7l o6a -R7*53 -Ci8n +R7 *53 +C i8n *72 OB5 k -T7*B1+1 +T7 *B1 +1 O76 *04 ] *31 O48 -+BLBo1c -}-5-1 -iA9t -*7Ascq ++B LB o1c +} -5 -1 +iA9 t +*7A scq O78 i2x O47 OA4 -*38s(%R4 +*38 s(% R4 z5 D8 O51 o31 O65 O23 ,4 -s.8L9 -*03*57k +s.8 L9 +*03 *57 k c $o $v $a ^g ^o ^b -rCs-2 +r C s-2 O76 oAS s.y 'A O01 T4 -o9BsO( +o9B sO( o45 *14 -}soI -k^g -sw[ss_ +} soI +k ^g +sw[ ss_ D0 se6 -i6aT1*B6 +i6a T1 *B6 $0 Y1 O71 D9 t $c sgd -*19^` -i8!sbI -iBT^y -sN-Z1*60 +*19 ^` +i8! sbI +iBT ^y +sN- Z1 *60 O39 O65 -Y1sim^b +Y1 sim ^b $4 D1 -s62[ +s62 [ O03 ^$ -i8d.A -o32sqBsS0 +i8d .A +o32 sqB sS0 o8h p5 o2w d o6! *46 -T3i8Q +T3 i8Q $T O83 y5 d -.7*76s8v +.7 *76 s8v *73 O62 *08 O3B $F R2 Z1 -'8i5# +'8 i5# i75 l +1 f *64 i2v p1 ] i4i -i1#*7As?U -*7BT3 +i1# *7A s?U +*7B T3 o5j +8 Z1 -*B9s9C -o4psL^o7i +*B9 s9C +o4p sL^ o7i o2R O69 o0K *09 l [ -Y1s@sk -sMh,A -sshsVu +Y1 s@s k +sMh ,A +ssh sVu *62 O38 -sfjs)E -s?Iku +sfj s)E +s?I k u Z2 o1- -.0z3 -r*73 -su;iAY +.0 z3 +r *73 +su; iAY s/r -KsPE$c +K sPE $c $k $a s2c [ $D O0A C O42 T3 -o2$sUV +o2$ sUV y2 *B0 -D9*A3R4 +D9 *A3 R4 i9y O95 *23 ^' O2A c *80 -i6H*A7 -s1u$, +i6H *A7 +s1u $, } O85 *A4 Y5 O58 p2 -T3{ --6s-_r +-6 s-_ r ] i4- -*A8$F +*A8 $F OA8 s2 *A7 -*63Z4s<$ +*63 Z4 s<$ slZ *A7 O04 -c*72Z4 +c *72 Z4 T0 $b ^P -[TAy4 -sw0soK -sNMi9T -i6#.2 +[ TA y4 +sw0 soK +sNM i9T +i6# .2 OB3 s2L *14 *02 i1q D3 u $4 -4 *94 -iB[qs4! -oBpL9TA +iB[ q s4! +oBp L9 TA se5 O39 *94 +8 s!Q *07 *08 -o8BRB +o8B RB D1 o3O [ oAG -]$tsi^ +] $t si^ o7} -sCPlR5 -s-0*A5slP +sCP l R5 +s-0 *A5 slP sql d i6x O01 Y4 OB9 i62 ] y2 .3 O62 -*B3f -i5ps>X +*B3 f +i5p s>X ^e ^g ^d ^o ^d R6 D1 z5 O39 @@ -70588,302 +70297,302 @@ c z5 O18 ^o ^h ^w O43 s2i { O8B K -T3$L +T3 $L c *26 O47 p1 $v O73 -i6N*B5ss( +i6N *B5 ss( o2' } -.3Z2 +.3 Z2 s#_ sT2 O85 s/O -ED2LB +E D2 LB O9B .7 } sVR -^asW(y4 -Ks#/D4 +^a sW( y4 +K s#/ D4 [ O96 T6 Z3 O68 -*03$6 -Z4sV| -+1oB! -*09se1 -s[`$j -$DsJG -o0vf +*03 $6 +Z4 sV| ++1 oB! +*09 se1 +s[` $j +$D sJG +o0v f D5 o6o -sjX$$sf^ +sjX $$ sf^ ^y ^l ^l ^e ^n *05 OA5 -o4d-9 -*39$N --6o9> +o4d -9 +*39 $N +-6 o9> o1k L4 -^koAx +^k oAx i3L r -y4s}Z +y4 s}Z u o2$ OA1 -sBGR5sd4 -*3B]] +sBG R5 sd4 +*3B ] ] o58 O31 scF O15 f f O39 .4 [ o4% O23 O3B *2B D2 +5 i5# -d*42 -sdzo2a +d *42 +sdz o2a ] o7u -p3*B3 +p3 *B3 O65 -3 O64 -s2oz1 -sFOp2 +s2o z1 +sFO p2 OB4 { p3 u O74 *43 O32 i7w y5 -[y3*B3 +[ y3 *B3 OB8 T6 D3 y3 O62 -s76$f -LA$t +s76 $f +LA $t ^y ^n ^n ^a ^f Z3 O24 sUE $o O27 { O2A i39 -*9B-6 +*9B -6 l O78 *30 O92 -sE+y3 +sE+ y3 O72 OA6 -CsY7 -i5iL8$t -D9'7p4 -s_v$c +C sY7 +i5i L8 $t +'7 p4 +s_v $c O49 l '8 i35 R5 L5 -*1Ai9D] -,8K +*1A i9D ] +,8 K *02 O87 i35 R5 L3 -'A$) +'A $) p3 O15 Z5 sj D0 -Y4^2sa% -+7sZj +Y4 ^2 sa% ++7 sZj O61 p5 O72 O64 OA4 K O19 O46 O78 *67 O86 O72 Y4 O63 -o7hi6u -c$J +o7h i6u +c $J *A2 y5 O03 O78 y4 -L0o0hi8) +o0h i8) q D9 k O68 sta O94 Y3 *46 $u OB8 -*67^jsGY +*67 ^j sGY O26 i2p i59 L9 L5 O6B $2 y2 i56 L1 L1 -,6*09sV( +,6 *09 sV( *B8 -7 -{s#Bo0j +{ s#B o0j O38 Y4 -$hY4 +$h Y4 D2 [ O2A -s>b$c -*39.6$m -o6=Z3Y3 +s>b $c +*39 .6 $m +o6= Z3 Y3 *71 OA6 k t Z1 y5 i9' O93 i34 R2 -sZL*B3i8z +sZL *B3 i8z O84 *2B $c -s6?+5s3h +s6? +5 s3h c O03 O59 -sJesXa-4 +sJe sXa -4 O34 s6E -T4s*v +T4 s*v O3A $y -s}JsV**57 -,4{p2 -}iBMi1f -s!2^w -ds"l -*A5oBX[ -$"*3A -Z1*23+2 +s}J sV* *57 +,4 { p2 +} iBM i1f +s!2 ^w +d s"l +*A5 oBX [ +$" *3A +Z1 *23 +2 *1B ] O78 -*79^` +*79 ^` i71 R4 R5 O07 s}* $b K O36 *8B -.7$m +.7 $m sE\ O63 oB8 -Z4,4q -^'sLG +Z4 ,4 q +^' sLG O54 *65 o6r -*2B]$g +*2B ] $g OB6 Z5 iBg O17 i5O O53 O2A $M srG --2y5sL" +-2 y5 sL" i2l u -s"'*A9Z4 -*B9-1 +s"' *A9 Z4 +*B9 -1 q *87 --B*34sG$ +-B *34 sG$ i73 L4 Y3 O64 K -*93o6yse, +*93 o6y se, $8 q -lDBi76 -.3LA +l DB i76 +.3 LA *64 O41 O4B -{s]%*20 +{ s]% *20 *58 O92 -+1sSg ++1 sSg *4B O42 O79 -,4C +,4 C R9 O65 y2 -o7T+9 +o7T +9 ,9 *21 O47 sH< O81 -y4s}@ +y4 s}@ i3b R5 R4 -syY*12 -^fs^2*A3 -Ed*80 +syY *12 +^f s^2 *A3 +E d *80 i70 R8 -s53s^}Z4 +s53 s^} Z4 i39 L5 L3 y1 o0q OB9 ] O75 $. O6A -i0s*BA -+3]s+3 +i0s *BA ++3 ] s+3 i3a R8 L8 -s/asu0 -s_Eo1p -R9R7sG3 -T6$8Z3 +s/a su0 +s_E o1p +R9 R7 sG3 +T6 $8 Z3 OB7 *02 -$.Y1sI; -s&^p3sCo -^jy5 -i4p*B7 +$. Y1 sI; +s&^ p3 sCo +^j y5 +i4p *B7 O32 OB3 oA} o0r T5 -sukTA -$k*29 +suk TA +$k *29 O78 ,7 OA8 O3A +4 O95 O95 i9y -o6Yr -s)Jo6$ +o6Y r +s)J o6$ i39 L3 L4 OB6 -7 -o4us5@y3 +o4u s5@ y3 *32 O2B -'8y3y3 -s(r*54R6 -i6!oB=$! -uoAI +'8 y3 y3 +s(r *54 R6 +i6! oB= $! +u oAI i3h *20 O48 *70 i10 L2 -o41Z3 -T3sD(sp[ -*4Ai5a +o41 Z3 +T3 sD( sp[ +*4A i5a -1 O05 -sI.Z5 -iBMqy4 +sI. Z5 +iBM q y4 ^n ^a ^m ^o ^r i5a R9 L9 OB4 o9d sG/ OA3 O8B i5o -*47i0i +*47 i0i i3c R1 R4 $j p4 -^5.B +^5 .B z3 O5B z3 O52 i5w -D6y3 -$ s^l +D6 y3 +$ s^l *9A q O78 y3 i6c O92 O7B oB{ O31 -s(o-5 -iBZ}*74 +s(o -5 +iBZ } *74 i5e L7 L6 -^gK +^g K O86 D8 oA. -z1sT"'A -s4r-5] +z1 sT" 'A +s4r -5 ] O23 s@( *12 O86 ] p5 OA9 -D2p4 -R3Z4 +D2 p4 +R3 Z4 i3e R1 R0 O89 y4 -R8q -Z5,7Y1 -T9ssv -*BA*20 +R8 q +Z5 ,7 Y1 +T9 ssv +*BA *20 p1 ^a O67 OA4 O73 E O84 T3 -R9$@ +R9 $@ p1 ^l O43 O45 -$#sQv +$# sQv srl Z2 O12 *38 -s)uy2 -*69$l -y2*70 +s)u y2 +*69 $l +y2 *70 K O7B i12 L1 R5 -sFa^(s<) -^xs#c +sFa ^( s<) +^x s#c O63 $1 -o6v*92 +o6v *92 *10 O05 O48 ^z -i3m*43 -TA,5y3 +i3m *43 +TA ,5 y3 i35 L2 L2 p5 O92 L9 -R9sNT -s@l-5 -*57^( +R9 sNT +s@l -5 +*57 ^( s@} OB9 i1a O53 y2 K O2B *21 -DAo20 -sT*R8 -sE**41 -kz4 -sx)p3 -*6B^e +DA o20 +sT* R8 +sE* *41 +k z4 +sx) p3 +*6B ^e LB O95 t -D4seZ$9 +D4 seZ $9 i57 R7 L5 -y2shRsmB -ds`! -+B*31 +y2 shR smB +d s`! ++B *31 i18 R2 R3 O93 O7B ^j i37 L3 L4 -'9 t O73 +'9 t Z5 OA1 O48 T5 O93 OA1 @@ -70892,57 +70601,57 @@ O87 $Y Z2 O98 .5 ,1 O69 $_ O29 -y2*29 +y2 *29 O8B u --4-8*40 +-4 -8 *40 O56 *87 sIA O18 *20 -y3D8+7 +y3 D8 +7 O18 D1 -*A3*B0i89 -*43sMg -L9^f --4s9& +*A3 *B0 i89 +*43 sMg +L9 ^f +-4 s9& ^s ^d ^e ^e ^l -fsq9 -t-0l -Z4s;[ -D7s-8^r +f sq9 +t -0 l +Z4 s;[ +D7 s-8 ^r sK8 O63 -*2A*34 +*2A *34 { +B O69 -4 O85 $m O19 -s_E*64 -i9F O73 *A2 s[" O24 -,8.3*24 -oAa^h +,8 .3 *24 +oAa ^h O7A saG p3 -o76^w -s_`+5r -$)sFU -*B8o3h +o76 ^w +s_` +5 r +$) sFU +*B8 o3h *A4 s*L O63 -D0s80u -s.g$y +D0 s80 u +s.g $y O82 ^e O19 *54 o3c *95 O78 O4A O52 K i7o s{$ O4A -*09}Y5 -syDT8 +*09 } Y5 +syD T8 s46 O34 *73 o2f O96 -}sj{ -.7y2[ +} sj{ +.7 y2 [ Z2 o6P O64 -.9[*A3 -y4s\! +.9 [ *A3 +y4 s\! i1e R2 R0 O95 +A O94 L8 O35 -oB#s]7Z3 -sSJ} +oB# s]7 Z3 +sSJ } i72 L6 O68 .4 oAZ o0t *92 O72 s=s O65 i52 O19 *A5 O43 Z5 -sIdsNGi2s +sId sNG i2s OA6 ^g i14 L2 O53 sR\ -*68s?Q +*68 s?Q *3B ^w O54 -,4D8*28 +,4 D8 *28 oA" O02 i1r -o6gs*k*89 +o6g s*k *89 o3k ^u ] s_} O24 O0B O73 O75 sL\ O5B o2r shO OBA -4 i37 R5 L5 -q*80 +q *80 i16 R2 R0 Y4 O07 O6B -]i5ml -Z5s&Issy -s?NK*83 +] i5m l +Z5 s&I ssy +s?N K *83 O84 $j $g O68 *3B -.3sYt +.3 sYt i73 R4 O65 ^H D1 swf sok O75 -*79.2D9 +*79 .2 D9 iBS sgd O02 O94 ,3 +3 R8 O76 -6 *37 -*B8sj2*71 -Z1'B -Es89 +*B8 sj2 *71 +Z1 'B +E s89 Y2 o7f OB4 -sXPi83 +sXP i83 +4 O59 -sRi*23 +sRi *23 ^d spP OB8 -s!c$q +s!c $q $. O7A -]Z3 -'B*20 +] Z3 +'B *20 i1f R2 L2 -^r*78 +^r *78 i31 R4 L3 -*89D5*86 -*84*52R6 +*89 D5 *86 +*84 *52 R6 suf O73 --4s5< -^ou +-4 s5< +^o u OA5 R6 -D5p2 -+8sViY4 -sK5*14 -,8^2 +D5 p2 ++8 sVi Y4 +sK5 *14 +,8 ^2 o3m $o i31 L2 L2 *78 O92 O93 -*35y3$6 -^wT6y4 +*35 y3 $6 +^w T6 y4 K i64 -L8,3 +L8 ,3 i1a R5 R4 -*5Bs+\d -+1y4 -Y1+A +*5B s+\ d ++1 y4 +Y1 +A O8A +1 -*49,8} +*49 ,8 } O78 O45 sO1 O73 -*92Z4sCI +*92 Z4 sCI Z2 *50 [ DA O87 ^u f .3 @@ -71077,160 +70786,160 @@ O37 ^b i1d R8 L8 O04 ^g O78 f .8 -s Ess%f -*B5i1fo1v +s E ss% f +*B5 i1f o1v i16 R0 L1 i59 L5 L6 -i1lo4.d +i1l o4. d O92 r -sK_$w -*30y4so[ +sK_ $w +*30 y4 so[ O7B p1 ,2 O57 *A7 -p1rs=a -sE>iAm +p1 r s=a +sE> iAm i2i ^z -+A*02-3 -sU['8 -*79D4o3p -sOCT8 -^Ps{R -oB^D6$w ++A *02 -3 +sU[ '8 +*79 D4 o3p +sOC T8 +^P s{R +oB^ D6 $w su2 -8 *62 sR& O19 $s Z3 -*14*A2 +*14 *A2 *15 O95 O0A l -8 O86 -1 sih y1 O03 -Y2f -*40o0rp2 -rs;U +Y2 f +*40 o0r p2 +r s;U OB1 o24 OB7 sR" -2 -s'ry4 +s'r y4 D6 i1o O57 L4 t D2 O89 $; i38 R0 L3 s(| O75 s8U o3d z2 -*A3i2e +*A3 i2e $z OB1 -s KE -s&%D0 -qs\. -o8&,6 +s K E +s&% D0 +q s\. +o8& ,6 i27 $3 O21 s*y i3l *59 *98 -sxDD7sGl -s'=*15Z2 -[p4 +sxD D7 sGl +s'= *15 Z2 +[ p4 ,5 $a -Y2svP -*54d +Y2 svP +*54 d O62 s]F -^m] +^m ] O62 *A3 L9 -*2Bo80 +*2B o80 O2B +3 i17 R5 L1 -+2s$W ++2 s$W $7 O34 ,9 OB8 ^x OA3 O65 sm` -*2A$c +*2A $c y2 ^* -Z5D1 +Z5 D1 i14 R4 L1 s^X Z5 O28 $y *A1 i2s O59 -[sp*+0 +[ sp* +0 s[r $j OB4 y5 O97 -+4sl(sY> ++4 sl( sY> i1b Z4 -o0tT7 +o0t T7 O94 $; O73 z2 ^k *53 -i0csf# -uf*14 -i5su -p5D9 +i0c sf# +u f *14 +i5s u +p5 D9 $v O62 -s_V^b +s_V ^b O83 O43 i2o OB1 Y4 -syas@` +sya s@` +6 s+^ O27 -i5i*76 +i5i *76 O6A t y4 -i0eoB6s!@ +i0e oB6 s!@ i3c R5 $D -9 OB8 -i38*89 -+Bo3z +i38 *89 ++B o3z +7 O38 -li5r -Ey4sJ{ +l i5r +E y4 sJ{ OA4 D4 O97 O3B *48 O54 ,1 O45 d -TBsd4 +TB sd4 O7B o5S .1 O6A -*B5o2m +*B5 o2m *21 O19 -*BAo8i +*BA o8i O04 sRf *81 -*A9+B$v -skg]RB +*A9 +B $v +skg ] RB O05 o3U *53 O62 '9 -^olT9 +^o l T9 D5 o4+ -*7Bo3m -Y3D6 -s52Z5 -s8Uo1k +*7B o3m +Y3 D6 +s52 Z5 +s8U o1k OA9 .1 Y1 O63 C *56 sRM O43 -p5*75 -R4oBi -$oE +p5 *75 +R4 oBi +$o E y4 O47 *B8 O65 $o -oA&p3t +oA& p3 t *84 O5A -sq-sAfo4l +sq- sAf o4l O26 *12 L9 s}k O63 [ [ $3 [ [ $5 *23 OBA O0A O09 -*8Ao5f -*07+9$c +*8A o5f +*07 +9 $c OAB ^e -i0n*09 +i0n *09 i0] ^[ -+BD3 -*89tY4 ++B D3 +*89 t Y4 OA5 OA1 -+0*95*16 ++0 *95 *16 o82 OB8 -s(6,9,6 +s(6 ,9 ,6 $s *53 O9A -$us;$y4 -s|fo1h +$u s;$ y4 +s|f o1h y2 O71 O3B O34 s,< ^o i1' -z3oB]s1s +z3 oB] s1s *1A D2 O39 O13 skS i85 OB8 O07 @@ -71238,7 +70947,7 @@ OB8 O07 i39 L2 L3 i58 L4 sp' -o1V*58+3 +o1V *58 +3 i18 L1 L2 s5X O83 z1 c T2 i2. @@ -71248,12 +70957,12 @@ i70 R1 L1 sOT i5c R9 L9 .8 OB2 -*04,1s3r +*04 ,1 s3r O71 s2x -srL}*35 -$]sc@ -E.4 -s`{o45i22 +srL } *35 +$] sc@ +E .4 +s`{ o45 i22 O3A OB1 i3c R4 sVk O16 } @@ -71261,19 +70970,19 @@ i32 R2 R4 sY? i32 R4 L3 i3c R5 R4 -^e*72scT -T4z1.4 -i94*4BL0 -sWQ,3y2 -*26iB8s]D +^e *72 scT +T4 z1 .4 +i94 *4B L0 +sWQ ,3 y2 +*26 iB8 s]D Z5 O17 *06 -T1-8i25 +T1 -8 i25 i7e R3 L3 i16 L2 L1 OA2 k *79 i32 R2 L2 -Z3*1A.6 -*54*3Ay2 +Z3 *1A .6 +*54 *3A y2 i19 R8 L1 i72 R2 D3 o3j Z2 @@ -71285,7 +70994,7 @@ i12 L2 i17 R3 R2 p1 O03 O53 O95 $x Y1 -s#rs>) +s#r s>) O28 z3 i55 L4 i19 L2 L1 @@ -71295,19 +71004,19 @@ z4 } $t O4A *38 i34 L3 L5 i37 L0 L0 -^vc +^v c i59 L2 L2 -k*09z1 -iBM*35 -sD{i8=.0 +k *09 z1 +iBM *35 +sD{ i8= .0 i70 L5 L6 iBG soX O32 c *98 Y3 *94 O14 i16 L5 L1 -o4gR7 -sJh*A5 +o4g R7 +sJh *A5 t +4 Z1 i33 R2 R1 i34 L1 L1 @@ -71320,35 +71029,35 @@ O43 s_} E O26 ^% $l t i88 O32 -LAi0ao6h +LA i0a o6h *72 } z1 *13 D5 O95 o1E } -^no8O+7 +^n o8O +7 sn; -iB(s.X -+BsxG +iB( s.X ++B sxG sp5 -*75L4 +*75 L4 i95 i4| O0A i13 R2 R3 -y2y2TB +y2 y2 TB *52 R6 i17 R3 L1 i6m y4 O07 -.1sat*69 +.1 sat *69 i3c R5 L5 -*28$1 +*28 $1 i31 R1 R2 i16 L1 R7 -s^eD2y5 +s^e D2 y5 i33 L3 L7 *26 +4 z1 f O17 D5 i35 L1 L1 *17 O42 o4K $0 p5 -iA8*BA} +iA8 *BA } O89 ^> T4 i37 L1 L1 O08 $b Z1 @@ -71357,23 +71066,23 @@ O48 iAa i51 L4 i52 L4 L5 O47 +0 O84 -*19Z1Z5 +*19 Z1 Z5 O89 $a Y1 '7 O51 i70 L4 -o0Do9} +o0D o9} O21 ^y i37 L3 R6 o8p *20 +5 L0 OB7 sQD i10 R0 R2 -Csfws$h +C sfw s$h i6p o74 i33 L4 L3 i70 L6 o8[ O69 oAS -z4-B +z4 -B Y4 i0i i78 R2 L2 i1e R5 R4 @@ -71383,12 +71092,12 @@ s3g O2B i2@ L3 O58 C O97 o8X $1 D6 Z1 -o9cDB +o9c DB O34 { s*r O93 iB= D7 O27 -o6!s\$o7V +o6! s\$ o7V sc! i79 R8 R6 i3f R4 R5 @@ -71401,10 +71110,10 @@ i57 L4 o7J O4B k i18 L2 L2 O74 '8 l --4i7!iA0 -sY'o5) +-4 i7! iA0 +sY' o5) *12 O93 t -sw -o90i2E -l.3} +[ Z4 oA> +o90 i2E +l .3 } i39 L3 R6 c $7 $E -*B9rR6 +*B9 r R6 ^a ^d ^a ^d -i7Ys70*64 +i7Y s70 *64 i30 R4 L4 sk6 u ^7 ^f u ^4 ^8 -*24slwo3C +*24 slw o3C ^l ^a ^m ^a ^j o31 ,4 -sc6K -.7iAs$H +sc6 K +.7 iAs $H { O95 O16 z1 -$A{st| +$A { st| u ^7 ^8 i53 L4 i53 L3 z4 O16 u ^7 ^3 -c$.*92 +c $. *92 ^e ^o ^j -Y3s0Ly3 +Y3 s0L y3 -5 OB3 sW7 E OA2 $n ,7 R8 @@ -71498,45 +71207,45 @@ i79 R3 R4 i33 L2 L2 i6a o5r i3d L0 L0 -*09i7| +*09 i7| ] $a *64 u ^c ^7 u ^c ^0 -Z2*53*1A -Y1o9d -[i4D -*02*5Au +Z2 *53 *1A +Y1 o9d +[ i4D +*02 *5A u sv5 u ^c ^3 u ^c ^9 -R6*78$a +R6 *78 $a ] $1 +4 *68 OA7 E u ^0 ^9 *56 O68 u ^c ^d -*3Ao6ts|O +*3A o6t s|O u ^c ^e u ^3 ^b -y5Esk. +y5 E sk. i5a R2 L2 -*36*29syo -*45.0o8[ +*36 *29 syo +*45 .0 o8[ s!c -^yT5D9 +^y T5 D9 i1f O09 u ^3 ^4 *59 O98 i10 R0 u ^3 ^1 u ^3 ^2 -saTY1s1F +saT Y1 s1F k o1P O49 i3i O02 -$#*03 +$# *03 u $B $C u $B $B -]*A6r +] *A6 r i55 R1 L1 *19 O78 i3d R1 L1 @@ -71548,23 +71257,23 @@ i3d R9 L9 *52 O51 i4` O46 c ^3 ^c -sph*12sR6 +sph *12 sR6 i15 R4 R4 ^a ^R -o9=s5boBl +o9= s5b oBl u $f $3 u $5 $B i76 R8 o3b *02 c $f $x -.8p4 -s-`L2 -sa4R2sI7 +.8 p4 +s-` L2 +sa4 R2 sI7 T7 O05 i5e R1 L1 i32 R4 c $A $8 -$/u +$/ u *A3 O58 O2A i15 R2 i51 R1 L1 @@ -71572,12 +71281,12 @@ i53 L1 L1 c $A $a i54 R4 L4 c $A $E -o3v^I +o3v ^I u ^f ^0 i74 R3 u ^f ^4 -*06iB9*A8 -li4V*A3 +*06 iB9 *A8 +l i4V *A3 $8 -3 i37 L2 L2 i37 R4 @@ -71587,16 +71296,16 @@ $k O32 u ^a ^9 R5 L5 i50 L1 L1 -Y4*58*B3 +Y4 *58 *B3 i36 R2 i3e L6 i31 L0 L0 -*38smoq +*38 smo q sFU i77 L8 L8 D2 $1 D6 u ^b ^6 -C*75 +C *75 u ^b ^4 ^s ^l ^l ^e ^h i55 L1 L1 @@ -71605,17 +71314,17 @@ u ^e ^7 u ^e ^0 u $D $2 u ^B ^B -Cy3 +C y3 sma O78 R9 ^a ^m ^m ^o ^c -Y2o5A +Y2 o5A u ^F ^A i58 L1 L1 o07 y4 ^[ K *90 Z5 Z5 u ^E ^C -Y4-4] +Y4 -4 ] s#9 o7t O21 s#( @@ -71626,7 +71335,7 @@ u $F $A u $F $F sQc sQn -Z1^k +Z1 ^k p2 *87 *63 T2 [ K sw% @@ -71637,15 +71346,15 @@ z4 O7A $5 ^x { o4# D7 O85 -y4T3D5 +y4 T3 D5 O08 r u +3 sk5 *A7 O98 -$/*25 +$/ *25 o5B *15 i3y O13 o2D -oAa*94 +oAa *94 sE> c $B $C OB1 y5 } @@ -71655,8 +71364,8 @@ oBt O28 c ^D ^B skM sk] -sRno1YD7 -sL C +sRn o1Y D7 +sL C u ^D ^C c ^x ^A T2 *51 @@ -71667,9 +71376,9 @@ o1Q u sFS u $F $1 o5} -i9f} +i9f } OB7 C o1Q -csev*4A +c sev *4A sDq L2 '7 *53 R0 R4 @@ -71677,20 +71386,20 @@ R0 R4 O47 z1 ,5 u ^8 ^4 ^d ^e ^t -*45s@Lo8; +*45 s@L o8; $h s+j -k*08 -L9*78 +k *08 +L9 *78 D1 O36 -y5]D8 +y5 ] D8 d *67 -sczp1 +scz p1 sLv -*27s`Q +*27 s`Q *21 $W Y3 *93 -o8}}^p -i0ay1s $a -Z2semssY +Z2 sem ssY i4k R3 r +0 +4 +A -Y3{iBP +Y3 { iBP $0 *95 OA2 i5> O83 L8 @@ -72168,7 +71873,7 @@ o8< *78 +B +E +E sLs o5h O39 +0 -ui5A +u i5A ${ y3 oAw +0 -1 -A +C -9 -9 @@ -72176,11 +71881,11 @@ c O84 *63 ^y ^l ^l ^a ^r *96 c O43 ^3 -Y4+2p5 +Y4 +2 p5 sF< $O K s2D ^0 -RBi0> +RB i0> sfy $o O21 q +B +C -1 @@ -72190,8 +71895,8 @@ O05 O13 *68 sZ8 C $2 k R2 $6 z4 -s*l*0AT9 -K$AC +s*l *0A T9 +K $A C *05 z5 +7 *30 Z1 q O74 @@ -72232,10 +71937,10 @@ O16 $_ -8 -F -F s&` s&q -$'*A0s{A -*64*A9ss/ +$' *A0 s{A +*64 *A9 ss/ o3W T3 Y3 -o5>iB# +o5> iB# i7D z1 *64 *32 Z5 sBl @@ -72243,10 +71948,10 @@ o0c ^s Y1 k TA i74 i16 Z2 O09 { -i2 *68E +i2 *68 E OB3 *9B O67 -*32sxf -*07lZ2 +*32 sxf +*07 l Z2 *01 *4A O57 '6 q T5 *45 T1 @@ -72259,20 +71964,20 @@ p3 .A i0& spq sn! i1c i73 -.9^;s-] +.9 ^; s-] D6 O47 ^U ] ,6 -6 o7, y1 { ,B -o0iy2 +o0i y2 s)+ *A1 C O08 i3d i58 *9B O74 Z2 -}]d +} ] d -5 ^U -R7*36*93 +R7 *36 *93 +0 +9 +9 s'G s.i y3 @@ -72283,7 +71988,7 @@ s.i y3 O53 D1 *15 s'Y oA) -sXcs^U +sXc s^U D1 L3 i7f L6 -8 -E @@ -72296,7 +72001,7 @@ $F o9w $c *63 $0 sdY r } u k -sr^*A4 +sr^ *A4 sUA L0 o56 ^e ^n ^i ^n @@ -72307,7 +72012,7 @@ O76 k l *1A L0 O27 O08 *20 s)Z -*41$vT8 +*41 $v T8 +A +A -2 '4 Y2 R1 OB5 r @@ -72316,7 +72021,7 @@ R4 Z5 O67 D9 L0 s8z i79 i17 -*B4*09o4; +*B4 *09 o4; *AB O89 ^3 O04 iB4 o5p t @@ -72338,42 +72043,40 @@ i75 i36 *21 s0I s_G sem O45 -2 -*19i5U +*19 i5U u +A z2 '9 *76 ^P '6 *23 s6N $O O45 o6e -[ ^- -sFvoBV +sFv oBV ^e ^l *54 *69 O03 O56 -6 -D -F -F O37 slR -$!$] +$! $] ^) O14 u O41 d -2 i72 i10 sye *68 u t o25 -$!$> +$! $> i72 i19 -3 -E -2 $h O54 -*98'Bo3Z +*98 'B o3Z i7e i1f s@p -$0 k -.5i7W +.5 i7W sui u swe *63 s@k s@" -$`$} -$`$~ -L0*83 +$` $} +$` $~ +L0 *83 Z3 T1 p2 C z3 O52 ,2 O72 @@ -72389,10 +72092,10 @@ l sz; +1 -D -D z3 O49 +1 sYT -D8L1 +D8 L1 s*^ Z3 o6w -s4di25t +s4d i25 t i3f i50 s*a ^( *25 @@ -72402,7 +72105,7 @@ s9u s9a s*# s,u c -*97*0Au +*97 *0A u q s0! i7b i33 O19 ^d z1 @@ -72412,19 +72115,19 @@ s%w y3 .2 *42 ^l ^u ^j i79 i37 -i2sTB^l +i2s TB ^l L0 p2 s3G +5 -sZJz3 -Ks1+ +sZJ z3 +K s1+ O82 sa_ *75 O92 $b ^p sAn sS? +A -2 -2 -sdSsR^r -TAo3m^n +sdS sR^ r +TA o3m ^n O31 i9& *03 o5e L2 D3 @@ -72437,14 +72140,14 @@ se@ K E z3 'B sN1 o8 O02 -o7+o6X +o7+ o6X Z5 O51 p2 y2 L1 O43 *86 sZz s1B t l [ i5q O34 ssm -i9?*63 +i9? *63 i1d i50 r *83 *9B Z2 O74 @@ -72459,11 +72162,11 @@ O84 } sNy i1d i38 T3 O53 -i7)sA *31 -Y4rsPR +i7) sA *31 +Y4 r sPR +D -A -A $K q -y2,8*03 +y2 ,8 *03 i74 i38 O26 i3? sP{ @@ -72473,8 +72176,8 @@ s"= i7& { s"4 *89 } -rs[ko8n -iA-y2T1 +r s[k o8n +iA- y2 T1 s"[ Z1 *15 s"m @@ -72485,13 +72188,13 @@ $$ k o6r z1 oAr K o1n u -o2,sN+*72 +o2, sN+ *72 *1A ,9 -*67*37*A8 +*67 *37 *A8 Z5 .4 *81 O19 o1) R0 -7 -s14^_ +s14 ^_ +E -7 sNT y3 TA @@ -72509,7 +72212,7 @@ s5v sS` l z2 O9A O02 z5 z2 -*A1y1-2 +*A1 y1 -2 l o4! s5I O39 ^i ^j @@ -72520,14 +72223,14 @@ i2? r ^* i7D O29 *20 $/ O62 $w $o $r $d -$|$@ +$| $@ p1 o7& O6A Z3 O57 sAS o2k $p *21 -*10L6+6 +*10 L6 +6 *53 O14 iAl -4 -+B*A7[ ++B *A7 [ $h $o $o $k OA4 p4 O48 smG .7 @@ -72535,7 +72238,7 @@ smG .7 [ scb i7! O75 $; *18 *50 -sQ^z2Z2 +sQ^ z2 Z2 $l o5p ^k *82 T5 sT% @@ -72555,9 +72258,9 @@ O35 i8' *34 $c d $f i4u i3f i12 -soXs\- -s*\y2s9G -Eo7`*9A +soX s\- +s*\ y2 s9G +E o7` *9A +0 +B +B $% $3 ^y $j @@ -72573,14 +72276,14 @@ K R5 '7 [ *41 K RB i75 i16 -y1D8 +y1 D8 sUL sUW +7 i8I sU? Y1 y5 i10 i3c -,Ap4 +,A p4 O07 ^F u $1 z2 O45 D3 @@ -72597,7 +72300,7 @@ d o0f i2g L1 *71 sz8 O37 Z1 sLT -}sl* +} sl* *12 i2- p1 svg i8e R8 *45 @@ -72608,14 +72311,14 @@ c $l $i $l $a ^y ^b ^b ^a *69 D3 O31 si' -y2*19 -s)OsHQ +y2 *19 +s)O sHQ p1 ^y $h $a $l $l Y3 k i74 i15 $g $o $n $e -*A9*A0 +*A9 *A0 $y z2 ^n $5 +0 +0 O79 @@ -72631,14 +72334,14 @@ sIS s1Y y1 ,B O06 o5d i16 R0 ^O -{i6& +{ i6& OB8 } $i -{*89sCT +{ *89 sCT c $e $v $e $n i77 i14 -co2er --8^j*B2 -p4sA- +c o2e r +-8 ^j *B2 +p4 sA- $s $h $a $h $s $i $d su& @@ -72647,26 +72350,26 @@ k Y2 O51 O42 p2 p4 $I s-9 -i9u*24 +i9u *24 ^p ^o ^o ^p p1 .4 -3 O4B i5> -*B7sAV -i4IlY1 +*B7 sAV +i4I l Y1 *5B 'A -*64*A0 +*64 *A0 i9X K $t $o $k $y $o i56 i7f y1 O36 K -,9i3D +,9 i3D T0 L2 u i9V D1 ^3 sCS Y1 -s-_[ -*04sGr*9B -z2*1Au +s-_ [ +*04 sGr *9B +z2 *1A u O04 ^& ] O73 o6P $U @@ -72680,13 +72383,13 @@ $l $i $z $a *A9 O17 ] ^n ^u ^j sr= -o3%oBD +o3% oBD i3b *75 d .5 ^a ^m ^a ^r Y3 $J -*35sy8R8 -s^N^] +*35 sy8 R8 +s^N ^] o0I ^Q *35 O69 -9 ^1 @@ -72701,17 +72404,17 @@ Z2 k sL? r u i69 $d $e $l $l $a -o4a^b +o4a ^b ^t ^a ^n u i6' s0r L1 d ,7 ^o ^n ^a ^k -.0*7A*26 +.0 *7A *26 $c $h $e $n D2 d o5e Z3 o5i -o6C$jD3 +o6C $j D3 *9A O46 D5 q o4M { u @@ -72721,16 +72424,16 @@ o9# s52 $j $e $n $n $y *23 o5Q [ sgs o3p -s,qs>JsO8 -o3T*72s*D -^|*0A +s,q s>J sO8 +o3T *72 s*D +^| *0A ^o { y3 '4 i3Y ^k ^o ^o ^n *21 ^p O25 -s})t*83 +s}) t *83 O13 O13 $o -o6R*42'9 +o6R *42 '9 -0 ^[ ^n ^i ^d $i $s $a $a $c @@ -72741,10 +72444,10 @@ O16 t $C ^V '5 Z2 se# O32 u *69 O02 -Y1o6P*82 +Y1 o6P *82 sP0 syC T7 -s6Ck +s6C k -0 O67 O86 -7 sG2 @@ -72763,18 +72466,18 @@ i24 *42 p5 s,E su4 R1 p3 sNE -z5D8 +z5 D8 O86 *82 sGw O41 -D9^z -*14stEr +D9 ^z +*14 stE r sXL sXE Z1 stb -*18Cz1 -o1^l +*18 C z1 +o1^ l } i5N -iBosxQ +iBo sxQ ^d ^g *70 o0U +7 R6 @@ -72802,10 +72505,10 @@ sAe R0 $3 i1a O68 $r o4n R0 -tsOFsyF -}o8Y +t sOF syF +} o8Y i72 i38 -*07oA&i0y +*07 oA& i0y ss& r *31 O56 i8t i72 i37 @@ -72823,9 +72526,9 @@ sDh sif O26 o5\ u ^x *35 k -y1*75 +y1 *75 sT9 -p5^z +p5 ^z ^= O2A ,8 O26 i32 i40 i52 i68 @@ -72838,10 +72541,10 @@ c ^t ^s ^e ^t Y5 t O85 Y3 o1O '7 -lC$/ +C $/ y3 *23 O0B *41 -o1NR8,A +o1N R8 ,A i70 i7f T4 O54 srY u @@ -72849,7 +72552,7 @@ sD6 *04 -4 '7 -0 y1 Z2 +8 *65 R3 -s#,Z1 +s#, Z1 O38 i1t .1 Z1 *70 *30 $) @@ -72860,7 +72563,7 @@ O58 i8O { s8O o5w $j i73 i35 -*25-0y2 +*25 -0 y2 OA5 o0y R6 i38 L0 *14 sCP @@ -72869,29 +72572,29 @@ i38 L0 ^e ^v ^a ^g ^a [ Z4 Z5 sMg -sR$s"=i0q +sR$ s"= i0q $e $l $l $i $e *06 $q su3 O21 -smy$" +smy $" O17 Y2 i9. O46 K ^k ^o ^o ^r sZC -$@$| +$@ $| $2 -A D0 $s $e $n $s $e -s$+p4i8s +s$+ p4 i8s L1 +1 s9Z sbL l Z2 $s $t $e $e $d y2 .5 -s*']*37 -*85*03*A0 +s*' ] *37 +*85 *03 *A0 *A0 OA2 K -i8y*75siM -r,9 +i8y *75 siM +r ,9 z1 l O57 O45 z2 *75 Y3 @@ -72901,9 +72604,9 @@ i12 i57 s1e i4d 'B o0q Z1 -s6N$Lp4 -u*97 -}Y2o9F +s6N $L p4 +u *97 +} Y2 o9F ^W *03 sbf z1 i3@ -0 @@ -72920,7 +72623,7 @@ sEp sEK *67 ,8 E L3 O98 -uL5C +u L5 C $m $o $e Z2 i88 oB3 O07 @@ -72932,10 +72635,10 @@ i6R sJA sPK t ^F D5 K O13 -$Jo8'oA" +$J o8' oA" [ D7 $0 p1 o0v -$r*46*53 +$r *46 *53 -2 f [ D7 R5 $k $e $l $l $i @@ -72949,33 +72652,33 @@ R2 i3c *92 o9t E i42 i50 i63 i72 u *35 -E*48 +E *48 O92 { sCE i88 *64 i5r y2 T0 $s T0 $Y -iA$ry5 +iA$ r y5 s#X ${ O31 ,4 O65 k Z3 t O61 Z1 O25 z1 -*08*58 +*08 *58 sO) ^t ^i ^t $9 s4G -*38sDnt +*38 sDn t sOC i1c i37 *71 D3 o5G s3U ^o '6 k -sES[.B +sES [ .B $w $a $n $d $a i77 i1f -sx o8+l +sx o8+ l slX sl$ t i3. o55 @@ -72986,14 +72689,14 @@ sWR k { *18 O47 i11 i5b *31 o4; -iBf*86 +iBf *86 O35 f Y4 *53 $s $a $r $a $h Y5 sg+ O1B i79 i13 ^p Y3 -s@siA' +s@s iA' se9 z2 O15 f sj0 @@ -73003,12 +72706,12 @@ O69 +3 i5E o49 i79 i1f $p $e $r $e $z -i9+{sNg +i9+ { sNg D4 i5D s5) -R1R2s3} -*81o4tY3 -Ez3 +R1 R2 s3} +*81 o4t Y3 +E z3 i1m O57 O47 { ] f u @@ -73024,7 +72727,7 @@ D9 ^7 ,1 *56 O45 sO5 O16 sG5 -oA[sV$ +oA[ sV$ $n $i $n $a K '6 C r O94 @@ -73035,14 +72738,14 @@ $; u Z3 sM3 ^s ^s ^a ^b c $b $o $m $b -s_7p5sJ& +s_7 p5 sJ& sM3 ^I O18 O39 $| -Y1i9t +Y1 i9t sMZ sBq -sQ-tf +sQ- t f .5 *40 q O93 *26 O06 o28 @@ -73053,7 +72756,7 @@ O17 R6 *53 +1 { Y2 *16 l -0 O25 O63 -$Ns`4*07 +$N s`4 *07 y3 +9 ^n ^o ^l i0@ oA2 OB9 @@ -73062,16 +72765,16 @@ sMp Z1 -0 u sPa ^k R6 [ -ssAo0= +ssA o0= ^n ^a ^h O31 O49 $a $l $a $n $a D1 O49 Y1 ^c i58 z1 i72 i1f -DB*A4 +DB *A4 ^f $v -o4yo5VoBN +o4y o5V oBN O1A Z4 ^b O57 srg r @@ -73079,12 +72782,12 @@ srg r i70 i17 i70 i16 ^n ^a ^r ^a ^s -^&R8*8B +^& R8 *8B ^g ^b $U O18 -D6p4 +D6 p4 O75 K o6U -o8@{ss/ +o8@ { ss/ *61 '5 O09 o4c O69 ,2 @@ -73092,7 +72795,7 @@ sNF $0 Y3 R5 t ] sQV s$k -R3*23 +R3 *23 Z2 o28 y3 O69 i92 O05 @@ -73119,8 +72822,8 @@ sdx *53 O37 *74 O32 O04 *97 *46 O17 *34 -^!Z2 -.8*13 +^! Z2 +.8 *13 sgv Y1 $b $a $h $i $a c $d $u $d $e @@ -73135,19 +72838,19 @@ OB5 *A2 O34 ^S t +8 sDX ^E ^H p3 -*93sC\ +*93 sC\ *16 *48 -^csb^ +^c sb^ $N K i0M s_J s9u -7 L0 Y2 s;K -o4XZ2*76 -i1Us/@ +o4X Z2 *76 +i1U s/@ s*M s/E --6sow +-6 sow sRI Z2 $a $l $i O27 Z3 { @@ -73155,7 +72858,7 @@ O27 Z3 { $d $e $a $d O48 z2 l $) -sT7i3J +sT7 i3J l $] *93 O2B sWS @@ -73164,7 +72867,7 @@ sD4 $^ o9a u ^Y O3B i60 sN7 --2DA +-2 DA y4 '7 K p1 r E R8 @@ -73187,18 +72890,18 @@ O2B f *35 O59 l L6 u O17 -sra*2BC +sra *2B C i8a *18 O21 sBx O16 -CslR$D -*52Y1y2 +C slR $D +*52 Y1 y2 si/ D5 Y4 ^! *4B O24 -{*95^1 +{ *95 ^1 str OA5 $l $i $s $a -ro9s*26 +r o9s *26 p5 $! O27 Y4 *13 d @@ -73234,24 +72937,24 @@ o0# l $w $i $l $l $s sSs $s O32 [ -r*60Z1 +r *60 Z1 i5q o21 sqA s=* -Y1,Bo1G +Y1 ,B o1G ^M $D s=# $b $o $o $n -^^sN@.7 +^^ sN@ .7 y5 } r Z3 -4 -.6sqgy4 -K*0Ai8` +.6 sqg y4 +K *0A i8` O34 o65 -sT2l +sT2 l $R O07 s*w O5B $e $m $m $a -RAl +RA l $s $a $r $a t i62 *31 $c $h $i $l $l @@ -73272,7 +72975,7 @@ sX* L9 O62 $g $r $i $n Z2 oBh O56 -z1-2*59 +z1 -2 *59 sXs z4 O2A s&+ OB1 @@ -73280,10 +72983,10 @@ $z ^v C OA3 p1 *82 O59 ^H -L9s_U +L9 s_U *07 .2 $t $i $f $f -$^*45 +$^ *45 ^W ^B i76 i18 i73 i10 @@ -73316,21 +73019,20 @@ O15 .6 swY Y5 *42 R5 *42 R0 -$ -6 -+9y2p5 -E Z4 +$ -6 ++9 y2 p5 shv O46 O95 O34 i53 i1b r i2P ^0 Z2 -$'*68-9 +$' *68 -9 $- sgV l z3 -3 -5 -iBjs_O*96 +iBj s_O *96 O73 oAn *09 O72 -s0pZ2 +s0p Z2 ^e ^l ^a ^v *AB O29 *29 *3A O38 @@ -73351,13 +73053,13 @@ i30 i56 se$ *41 y3 ^t ^t ^a ^m -L6*35t +L6 *35 t $e $d $w $i $n ^s ^m ^r ^a l sd, sQ OAB shu ^3 *94 '7 -y3z3 +y3 z3 c $m $i R6 *61 $8 $7 $2 $4 @@ -73366,29 +73068,29 @@ $b $r $b $l $o $g LB O06 $* $1 $5 $9 -[Y4u +[ Y4 u *71 } O49 -sW#$o*70 +sW# $o *70 q O03 y1 set .7 $` *03 $y $a $c $c $p $a $g $a $n -Y3o88*AB +Y3 o88 *AB suy y5 O06 O07 $l -$w{*49 -uiBS +$w { *49 +u iBS O85 *09 *53 O0A $A d -$#$> +$# $> *62 Y4 sd6 $e O29 u Z1 ,B sd/ $a $b $y $s $s -*39z3 +*39 z3 i3% } ^a ^v ^a O28 *54 @@ -73396,33 +73098,33 @@ O5B u sDx s04 O86 sO6 -sOH*A5 +sOH *A5 o9- *97 R6 -3 O25 R5 -*3A,2$= +*3A ,2 $= O97 C O34 $< s K r d -sFos'rE -o3B*B0 +sFo s'r E +o3B *B0 ^f ^i i66 +2 l DA $u TA -*72o5! +*72 o5! O85 *51 i34 *74 *32 i05 R8 O34 -T5K*25 -*B0*49s"i -y3s74 +T5 K *25 +*B0 *49 s"i +y3 s74 O63 f D6 ^[ O15 '8 -s8t[ +s8t [ -4 L5 +5 -Ks$Ss}Z +K s$S s}Z sv2 O76 +3 *14 *63 r @@ -73430,19 +73132,18 @@ i9w O35 u *37 saw Z1 sd4 i42 -i1!*95.9 +i1! *95 .9 *06 $) -T1,2$F +T1 ,2 $F s'F iAd O67 -E O34 *5A OA3 s'2 $B *72 Y3 O12 -Y2*27sHx -sILl -^YY1*87 +Y2 *27 sHx +sIL l +^Y Y1 *87 $s $a $l $s $a *32 O3A o3= *03 slU @@ -73453,10 +73154,10 @@ so" OA5 D3 O46 o6f i2i i4e i3t -iA%ry4 +iA% r y4 D6 z2 O92 q O61 u -z1o8H +z1 o8H $5 d D4 s3) O37 ^q @@ -73467,12 +73168,12 @@ Z2 $u O72 +7 s4V s1U O3B O29 i6Z -$n*80 +$n *80 *74 i5_ -o3Hs}S +o3H s}S -2 R0 svB .0 *15 -s0Su*7B +s0S u *7B *BA O6B i5@ $# sbm z3 O3A @@ -73483,15 +73184,15 @@ s|H k z5 $d $i $c $k q ^# -*02L4o63 +*02 L4 o63 Z2 o30 c sv0 i9V O26 se{ E -oBMs-DL0 +oBM s-D L0 i56 i19 i01 i12 i2n i3o i4v -^aC,1 +^a C ,1 r '5 O42 ^3 o3B k @@ -73507,7 +73208,7 @@ Y5 O42 OAB $8 $6 $? $? c $2 $4 $@ $@ c $2 $4 $! $! -D7sGz +D7 sGz c $3 $8 $! $! c $1 $2 $6 $! i1j i2a i3n @@ -73533,13 +73234,13 @@ sy& ^1 d *57 *28 OA3 +5 -s5Ei5s{ +s5E i5s { $5 $0 $$ $$ d $w ,4 i9? ^s ^g ^u ^p $4 $6 $# $# -us!1 +u s!1 c $7 $3 $! $! ^e ^b ^a ^b t O12 i3J @@ -73548,7 +73249,7 @@ Z5 ] O31 p1 d 'R $0 $3 $? $? $1 $5 $% $% -z2'A +z2 'A '1 $1 $8 $? $? O34 C *94 @@ -73556,33 +73257,33 @@ c $1 $0 $2 $! $6 $0 $@ $@ c $1 $8 $0 $! $2 $2 $% $% -*04z3 -*B7f +*04 z3 +*B7 f c $3 $2 $3 $! { i8V O49 d i4, sm/ OA1 $5 $4 $? $? -,3y4 +,3 y4 c $1 $9 $$ $$ c $5 $4 $* $* c $1 $5 $0 $! $s $o $n $n $y -Z1L3*14 -o4>*02sA) -*3As( s!Q +Z1 L3 *14 +o4> *02 sA) +*3A s( s!Q iB4 *9A O06 -sZp*6B +sZp *6B $1 $8 $# $# -$/p5 -sQjiA,} +$/ p5 +sQj iA, } T4 $( OBA $0 $9 $@ $@ $4 $9 $@ $@ c $9 $2 $? $? -o3E*06 +o3E *06 o32 l ^c -^]*92'6 +^] *92 '6 c $2 $6 $* $* $6 $8 $@ $@ c $1 $7 $@ $@ @@ -73592,11 +73293,11 @@ $7 $5 $@ $@ i7f i55 skw r c $7 $3 $* $* -C*A8L1 +C *A8 L1 $5 $2 $? $? -i36kc +i36 k c c $6 $5 $5 $! -T6f-4 +T6 f -4 c $4 $6 $* $* i01 i16 i2M i3a i4r c $4 $0 $3 $! @@ -73606,17 +73307,17 @@ $8 $9 $# $# c $3 $6 $9 $! c $0 $9 $7 $! sPu -*87s,. +*87 s,. i5o L4 -iA{R6o5h -o8+*13 +iA{ R6 o5h +o8+ *13 c $5 $0 $$ $$ $7 $9 $@ $@ ^y ^n ^e ^d c $2 $4 $4 $! -oBQs%U --0]i7x -.4i36 +oBQ s%U +-0 ] i7x +.4 i36 i72 i16 i3s i4e i5p $6 $6 $% $% @@ -73629,11 +73330,11 @@ O39 s[2 ^% Z1 sa? s, +iB^ s>, c $0 $5 $% $% $C z1 -*07T3sF{ +*07 T3 sF{ c $5 $2 $! $! O86 *16 y2 $2 $8 $# $# @@ -73843,9 +73544,9 @@ c $7 $5 $5 $! $f $o $r $c $e $4 $1 $? $? c $9 $2 $* $* -sIs '8 O3A -sF1l -o8Sy2sUe +sIs '8 +sF1 l +o8S y2 sUe $g $o $o $d c $0 $1 $8 $! c $7 $0 $7 $! @@ -73855,15 +73556,15 @@ c $5 $5 $9 $! c $2 $5 $2 $! $7 $1 $# $# c $3 $1 $4 $! -*28*B2 +*28 *B2 c $6 $4 $$ $$ c $8 $0 $6 $! c $1 $9 $% $% $2 $6 $$ $$ -*42,6Y5 +*42 ,6 Y5 c $3 $1 $@ $@ $5 $4 $! $! -$[T4 +$[ T4 s+f s+b c $5 $7 $* $* @@ -73875,12 +73576,12 @@ i1F O0B $9 $3 $# $# c $3 $1 $$ $$ $m $a $l $l -Y4i1a +Y4 i1a c $6 $2 $6 $! ^s ^m ^o ^o ^b c $4 $0 $0 $! $7 $4 $$ $$ -s8wi1^-B +s8w i1^ -B $2 $9 $@ $@ c $0 $7 $# $# c $3 $6 $6 $! @@ -73900,7 +73601,7 @@ c $3 $7 $3 $! i02 i15 i2M i3a i4r i03 i11 i2J i3u i4l y1 O8A *18 -s4B*34o7f +s4B *34 o7f c $8 $4 $* $* c $3 $4 $0 $! ^l ^e ^e ^r @@ -73911,13 +73612,13 @@ O1B *05 c $4 $0 $7 $! c $6 $5 $1 $! $9 $5 $# $# -$*$] -Z4s\7r +$* $] +Z4 s\7 r c $9 $8 $% $% c $3 $8 $5 $! ^u ^n ^a ^j *56 z1 OA4 -u^H*8A +u ^H *8A c $9 $5 $% $% c $7 $8 $* $* c $3 $0 $5 $! @@ -73939,12 +73640,12 @@ $5 $0 $@ $@ c $1 $0 $5 $! $3 $8 $* $* ^y ^o ^s -o1wC +o1w C c $3 $9 $* $* -Y3.1 -s9Z[ +Y3 .1 +s9Z [ i01 i18 i2F i3e i4b -+7-E ++7 -E i7) c $4 $4 $3 $! c $1 $9 $5 $! @@ -73977,13 +73678,13 @@ c $4 $2 $3 $! O92 O27 Y1 $9 $0 $? $? $3 $7 $# $# -s;ms#l*A2 +s;m s#l *A2 i1a i15 -o6r*01l +o6r *01 l c $0 $2 $$ $$ -i4T*90 +i4T *90 c $5 $8 $@ $@ -oAB$' +oAB $' O6B r y4 ^i ^r ^p ^a $0 $5 $$ $$ @@ -73996,8 +73697,8 @@ $2 $1 $% $% c $3 $7 $7 $! $5 $0 $? $? ^l ^r ^a ^c -*34Z4 -o8bk +*34 Z4 +o8b k c $b $u $l $b c $8 $1 $2 $! *19 $! @@ -74009,19 +73710,19 @@ C d '9 $1 c $8 $6 $$ $$ c $2 $8 $? $? $6 $6 $? $? -p5s5t +p5 s5t c $0 $1 $% $% c $6 $8 $9 $! c $0 $0 $3 $! $a $p $r $i $l -T2$J +T2 $J c $4 $5 $$ $$ c $2 $0 $% $% O65 Z5 C '6 $1 c $8 $0 $5 $! $M $a $r $2 -$0z3,5 +$0 z3 ,5 c $9 $4 $# $# c $7 $6 $* $* $6 $0 $* $* @@ -74030,7 +73731,7 @@ T0 TC T5 c $4 $2 $6 $! c $9 $1 $@ $@ $m $a $r $0 $0 -*95RA +*95 RA c $0 $7 $* $* $4 $5 $% $% c $1 $8 $# $# @@ -74048,9 +73749,9 @@ i3] T1 s7A O43 O73 c $2 $0 $2 $! -y3}^a +y3 } ^a l d '9 $6 -*37*45+3 +*37 *45 +3 sF$ c $7 $3 $3 $! c ^6 ^a @@ -74064,13 +73765,13 @@ swU -0 d c $7 $1 $7 $! c $3 $5 $4 $! -z1*14iAs +z1 *14 iAs $1 $9 $$ $$ c $1 $7 $$ $$ $l $o $l $a d 'E $7 c $3 $5 $$ $$ -+5i9$$O ++5 i9$ $O c $3 $2 $? $? $3 $5 $$ $$ $r $o $s $e $s @@ -74087,7 +73788,7 @@ c $1 $5 $# $# c $0 $0 $2 $! c $3 $3 $7 $! ^a ^v -i9|*27 +i9| *27 c $0 $3 $$ $$ u $1 $9 $9 $7 s/5 @@ -74097,7 +73798,7 @@ c $8 $0 $* $* c $7 $5 $* $* s/` c ^7 ^0 ^0 -oBlsC, +oBl sC, s() c $5 $1 $* $* c $b $e $e $r @@ -74145,7 +73846,7 @@ c $9 $0 $@ $@ $d $e $e $d $e $c c $2 $4 $7 $! -$%so|*36 +$% so| *36 $8 $8 $% $% C 'A $0 ^r ^a ^e ^n @@ -74167,15 +73868,15 @@ $0 $7 $% $% $9 $3 $$ $$ $s $a $a $b c $9 $3 $9 $! -sbQ{ +sbQ { $2 $0 $$ $$ $7 $8 $! $! c $1 $2 $% $% -{*29i2x -s+gs?} -o7(-9*B1 -$,$@ -*05s%h*62 +{ *29 i2x +s+g s?} +o7( -9 *B1 +$, $@ +*05 s%h *62 siQ c $3 $8 $* $* $7 $3 $! $! @@ -74188,16 +73889,16 @@ c $1 $9 $7 $! C 'A $7 c $3 $4 $3 $! $2 $4 $? $? -^(sxU +^( sxU c $4 $6 $@ $@ $0 $2 $? $? c $8 $2 $# $# i02 i12 i2J i3u i4l -s4ZsQv[ +s4Z sQv [ c $4 $1 $5 $! O19 $ o0n c $4 $2 $$ $$ -p1+8.6 +p1 +8 .6 c $1 $4 $1 $! c $4 $0 $4 $! c $3 $5 $! $! @@ -74205,95 +73906,95 @@ i7f i5f } OA9 $U O28 O91 $2 L5 Z1 -*89s?_szb -s^qT6 +*89 s?_ szb +s^q T6 $6 $7 $@ $@ c $9 $8 $$ $$ $4 $0 $? $? c $6 $4 $! $! c $4 $5 $9 $! -,2o6j +,2 o6j $2 $0 $% $% c $5 $4 $3 $! ^e ^f ^i ^l --7Z4 +-7 Z4 c $1 $9 $2 $! $6 $2 $! $! c $4 $0 $! $! -,A^eo3\ +,A ^e o3\ i2j i3a i4N c $1 $0 $? $? -$+$^ +$+ $^ c $3 $4 $4 $! $1 $3 $% $% c $5 $2 $5 $! $y $o $l $o -i6tz5 +i6t z5 O4A sb^ -sR9*1A +sR9 *1A $q O67 Y1 $f $i $l $l $y $p $a $n $n $i $0 $f $e $e -y4o8hiA* -oBd*39 -Y3f +y4 o8h iA* +oBd *39 +Y3 f i92 iA0 iB1 iC3 -i1m^y -oA3*90 +i1m ^y +oA3 *90 $k $a $t $z $b $a $r $u ^ r -sT(sEz +sT( sEz O28 i1J $m $o $f $o -+6Z4 --7sa\^d ++6 Z4 +-7 sa\ ^d i76 i35 T6 ,2 O9B -szYZ1^W -*06o39*B9 +szY Z1 ^W +*06 o39 *B9 sLe $p $a $l $l OB4 L0 l $w p1 $s $a $s $h $a -Y5C +Y5 C ^8 s7e -[smU +[ smU *58 O94 sJq i57 i5d R6 Y2 s#< O32 o1` -*53*08 +*53 *08 O94 O26 c T5 +4 sC c sk$ sk> OA7 i27 y2 -o0Zr*3A +o0Z r *3A sgx *13 o5d ^i ^c O62 C i6' -}i7s$} -sWtk +} i7s $} +sWt k $! *A7 R4 i3i $X $J -sX(*60 +sX( *60 sU& O85 sd& +B *78 z4 $? 'A o3D -y2s|R -.Ai4Z +y2 s|R +.A i4Z O86 O0A O8A *1A ^r ^o ^o ^l ^f -*B0L2 +*B0 L2 ^n ^r ^o ^b sk8 o4 sl0 @@ -74301,38 +74002,38 @@ z5 o8Q ,7 r *26 u ^9 ^0 ^0 ^2 s@f -*76o7;R9 +*76 o7; R9 R3 o1t -Y2*52 +Y2 *52 $q $u -s"%*35k -p1*15*20 -s,|$7i8P -y1sZvy3 +s"% *35 k +p1 *15 *20 +s,| $7 i8P +y1 sZv y3 s!h i12 i5a s_& y5 i2R O13 O53 sne -i1nq -y4sF)y2 +i1n q +y4 sF) y2 *31 s8v iA@ y2 Z4 o93 $K O58 o0b p1 O25 *03 -*57s(i -sjds;Z} -*87i4; -sP.*1B +*57 s(i +sjd s;Z } +*87 i4; +sP. *1B $t O01 u i54 i12 s#O -sWIo4[Z3 +sWI o4[ Z3 $5 { i7a i1f -o0ky5 +o0k y5 ^m ^a ^s Z3 iAQ Z3 *90 @@ -74340,21 +74041,21 @@ Z3 *90 [ z2 $e sxF $g $l $o $s $s -coBb +c oBb o0| O5A E O07 *42 ^h ^s $= z3 ^g ^i ^b Z2 ^y -*92.9 +*92 .9 z2 i0l *A9 $K p4 -*64o3D +*64 o3D sVY -s,Bz1 -*57q -sriY5*48 +s,B z1 +*57 q +sri Y5 *48 o3x y2 L1 +7 sC= @@ -74363,113 +74064,113 @@ O56 LB R1 st[ i09 *64 s"x -s%,Z4 +s%, Z4 q { O19 s_h *72 O16 -*23T8q +*23 T8 q sBt u T4 O68 Y3 -B p2 +0 $] -Z1i7$ -^!l$9 +Z1 i7$ +^! l $9 O06 d $) ,7 O97 -R6i9Eo0W +R6 i9E o0W o5> O73 i1{ -T4i2^*14 -i9Qz4 +T4 i2^ *14 +i9Q z4 s+1 D7 ^Y E s-4 -*96o7 *92 -qp5s4. +*96 o7 *92 +q p5 s4. ^n ^o ^r ^i $j u $m $o $o $r -y5^,*9A -.7^Ck -*82[z1 +y5 ^, *9A +.7 ^C k +*82 [ z1 ^u ^r ^e ^p y4 O49 z3 -OB1 sP0 '8 +sP0 '8 *94 D3 -*17C -o1Dp5 -p1*B3o7c +*17 C +o1D p5 +p1 *B3 o7c *8A o7= O24 ^m ^a ^d ^/ O62 -*5BR2*56 +*5B R2 *56 o7m s5i $g $r $o $s $s y3 o9g O89 *64 *70 O08 ,A O65 -s,!o4Ri0a +s,! o4R i0a O68 *67 sB" O58 *28 Z3 *A7 -oA.R0*71 +oA. R0 *71 $a $d $d $l $e sv( sR$ $d $a $v $e -T9 C O6B +C O6B O2B s&q $m $c $g $e $e sFk -soxi6] -o3Ao7K*93 +sox i6] +o3A o7K *93 +1 Y1 ^8 -s`7sZq -i9ZL4 +s`7 sZq +i9Z L4 s_< -sCQ*71z5 +sCQ *71 z5 ^n ^r ^a ^d p3 *14 -o8oZ2*42 +o8o Z2 *42 sYb si% z1 o5w -Csj2 -di1b -^YrD1 +C sj2 +d i1b +^Y r D1 O28 *78 C *83 *39 o6T d O29 -s'qiB/ +s'q iB/ ^n ^e ^k -s\A*79si" +s\A *79 si" *02 sdl Z2 r Z2 -p2*25 +p2 *25 oAN O14 O85 ^n ^e ^g -o4>T7 -t^6Y2 +o4> T7 +t ^6 Y2 q Z5 O26 $y s8R -s\p*38 +s\p *38 { i4+ -*96sMN +*96 sMN T2 OB4 sP6 T8 +5 -o7^p3k -*75z3T0 -Y1qsa* +o7^ p3 k +*75 z3 T0 +Y1 q sa* ^s ^i ^r ^i O63 p5 i0B O48 -o0ofu +o0o f u *78 O6A Y2 i35 *86 -sXysNs +sXy sNs i53 i7b i5c i1f -$#$^ +$# $^ i5c i10 ^d O91 ssx *26 @@ -74480,15 +74181,15 @@ i7c i37 i7c i31 i51 i16 $m $i $s $s $y -$($$ +$( $$ *3A O49 ^M d i52 i7f ^i ^g ^a ^m i18 i1d i5e i59 -i11i29i36i45 -$=$# +i11 i29 i36 i45 +$= $# i10 i1c i57 i15 i5c i30 @@ -74498,7 +74199,7 @@ i17 i5b q O26 Z5 i17 i3e O13 spw -$<$# +$< $# i33 i1f $h $e $l $e $n soY @@ -74513,7 +74214,7 @@ i17 i73 $t $e $r $r $a i17 i7d i1d i5b -i12i20i30i46 +i12 i20 i30 i46 i78 i3b $t $a $m $i s$3 @@ -74539,9 +74240,9 @@ O47 i6f p2 '6 Z2 i1f i35 i1f i33 -o3#sF*$P +o3# sF* $P i73 i18 -o4`s(P +o4` s(P ^# r c $b $u $t $t i56 i5f @@ -74549,9 +74250,9 @@ t Z1 +4 i58 i7f i58 i7b T4 iB7 -$'$] -$;$* -i11i29i36i41 +$' $] +$; $* +i11 i29 i36 i41 i3e i30 i7c i32 i5f i10 @@ -74563,7 +74264,7 @@ i38 i1b i37 i5f i34 i1b i10 i75 -i32i40i52i63 +i32 i40 i52 i63 i5b i7f i1e i16 i79 i33 @@ -74582,7 +74283,7 @@ i32 i1b -6 k i6x Z3 +7 O45 -2 -$,$] +$, $] i35 i7f $a $y $a $l $a [ o2; @@ -74602,7 +74303,7 @@ i1b i58 i3b i13 i56 i17 i56 i11 -$IRA*56 +$I RA *56 i7f i58 [ o2A sk- @@ -74639,136 +74340,134 @@ OA8 iBN } Z4 D1 s4V ^> O0B O1B sd} -c$1$2$3$" +c $1 $2 $3 $" q O49 ^s -y5i0QY3 +y5 i0Q Y3 Z5 *20 O08 ^8 $w $K c oAC ^9 o6s i66 l +2 -$Ws,} -$`p5 +$W s,} +$` p5 sO} t OA7 -s>tY2R9 +s>t Y2 R9 $Z R6 $3 d oBx sVW OBA T0 i0? O63 t .A -.5z1s?n +.5 z1 s?n O65 i4= -syts-= -*3Bsi; +syt s-= +*3B si; O5B q iBL -},B-A +} ,B -A R5 O04 $n o00 -[*67Z2 +[ *67 Z2 $8 d -Z5o1h +Z5 o1h L7 O32 T9 OBA Z2 o76 i7z } z3 OBA --0p3 +-0 p3 $r $e $a $l OA1 O15 -[^, -Y3*7B +Y3 *7B f O75 T6 -i6'k +i6' k u { Z1 O08 i1a -T2s & -s&F*A4 -*64i3L*28 +T2 s & +s&F *A4 +*64 i3L *28 R2 o5v D2 $` O31 sl9 '7 *14 ] p3 O93 -^Ci7j*37 +^C i7j *37 O89 ,9 -*92'3y2 +*92 '3 y2 O89 sI| ^u ^m o62 sNT O57 -i7T^& +i7T ^& ^u ^l i4= O15 L0 $l r i6h O6A f *86 sgk 'B -]sWn -*A8o6!^| +] sWn +*A8 o6! ^| *68 O15 z5 -p2+0*72 -s!_^< -z5s|* -^yp5 +p2 +0 *72 +s!_ ^< +z5 s|* +^y p5 z2 i3h i84 +A -i4op4q +i4o p4 q z1 } $m -z3.A$d -$- [ +z3 .A $d p5 O4A R6 sEb sEr o9k i0s c ^r } -o2lz2 +o2l z2 swa -$u$xi43 +$u $x i43 +9 O95 p1 s68 -s3Wi9KsHo +s3W i9K sHo O14 sa? $d $a $r $e p1 sl7 $0 seu ^e ^t ^a ^t -L6*71 -*86s$>i8| +L6 *71 +*86 s$> i8| *01 { $6 -7 o5# sYr O97 *B3 -*A3.0sr= +*A3 .0 sr= O45 ^7 O23 f $f ^8 +0 O73 O53 -y5q +y5 q $9 q ^l R8 -sH=o3[ -D0z5-8 +sH= o3[ +D0 z5 -8 $Y [ $h $a $m $a $n $c $l $u $b -i9gs0$K -z4o2u +i9g s0$ K +z4 o2u $w q '6 $, -o0Z*10i6P +o0Z *10 i6P D4 *89 O09 $y L8 +7 O85 [ Z3 o56 -p5oBt*96 +p5 oBt *96 '8 i6P O86 y4 y5 i6t ^d O36 *35 R4 -ss3p5o1g +ss3 p5 o1g $x Z5 ^y ^n ^n ^u ^f -*65*B6 +*65 *B6 $) $7 O4A -d^Ni6H +d ^N i6H t f O4A smt i6i O02 sKc i9V O26 @@ -74778,28 +74477,28 @@ o2H T3 o2o R5 +2 sh, O14 ^k *78 -*46i1'*23 +*46 i1' *23 z4 *17 sOw s8l l -E*23o1W +E *23 o1W sO. -sOjL6 +sOj L6 u i31 $e u [ -qo0^ -,Ao8C +q o0^ +,A o8C u i32 -EZ5q -*80i1qo1H +E Z5 q +*80 i1q o1H u i33 u i34 u i35 u s9_ } R4 -z5z5*5B -*08z2$k -Y3R5*96 +z5 z5 *5B +*08 z2 $k +Y3 R5 *96 i3l Z2 o55 R0 k $u ^1 @@ -74807,29 +74506,29 @@ d *56 Z1 o3i *15 p3 O95 *08 d *52 -s c $0 $% o2p D0 D4 -syioA+z2 +syi oA+ z2 c $< ^1 c ^{ $} ^^ ^1 @@ -76148,7 +75836,7 @@ c $> $> c ^@ $# +9 OA2 Z2 ^i i8u -s_1*7B +s_1 *7B syz R5 *34 c ^^ $5 @@ -76161,7 +75849,7 @@ D4 sg- ^( ^3 $) ^0 $. ^, -s02z3.6 +s02 z3 .6 o6& $2 $b o3t o1f $b r @@ -76198,7 +75886,7 @@ c $( $( $I -3 u c $( $4 c $( $5 -s6Fr*47 +s6F r *47 c ^5 $- c ^5 $/ c ^5 $% @@ -76210,7 +75898,7 @@ c ^* $! ^S +8 t O4A ^W } o3A -1 u -TBi2* +TB i2* c $- $- c $. ^9 ^1 ^{ @@ -76308,7 +75996,7 @@ c $/ $/ ^9 ^) c $# ^1 c ^_ ^5 -oAwsk?L5 +oAw sk? L5 c ^2 $_ c ^- ^3 *32 O38 @@ -76326,7 +76014,7 @@ c $) ^1 Z4 *10 O17 c ^* $4 c ^7 ^# -y2f +y2 f c $. ^3 c ^8 ^* c ^8 ^@ @@ -76343,10 +76031,10 @@ c $/ $0 O71 O41 [ c $8 ^0 +5 } -i9Cs4` +i9C s4` $ *47 O3A O95 -sR5*15sl4 +sR5 *15 sl4 D2 suq c ^% ^3 'B $I @@ -76365,7 +76053,7 @@ $6 ^9 $6 ^= $6 ^< $6 ^> -^)s9v +^) s9v $6 ^& c ^, ^1 $$ ^7 @@ -76442,7 +76130,7 @@ OA9 O05 C $1 $5 $1 C $1 $5 $7 *61 o6O -s}Wy5z5 +s}W y5 z5 c $7 $3 $0 C $3 $0 $0 l OB4 @@ -76616,7 +76304,7 @@ i52 R1 R3 i7a R6 R6 i78 L7 L7 i3e R6 R6 -sQ;*25 +sQ; *25 i52 R0 i50 R6 i75 L0 L0 @@ -76696,7 +76384,6 @@ i61 ^t -6 y5 r .4 i1w Y1 -^c O12 O61 Y2 o7u $n -0 R1 @@ -76809,7 +76496,6 @@ i12 i20 i32 i47 i3[ [ q O6A } z5 -O03 ^k *79 O31 y4 O23 $0 p3 @@ -76836,64 +76522,64 @@ d o2G -2 scu o8x +0 ^/ ^7 -l^d^a -l^f^f -l^f^d -l^f^5 -l^1^e -l^1^b -l^3^d -l^3^7 -l^3^0 -l^1^9 -l^1^5 +l ^d ^a +l ^f ^f +l ^f ^d +l ^f ^5 +l ^1 ^e +l ^1 ^b +l ^3 ^d +l ^3 ^7 +l ^3 ^0 +l ^1 ^9 +l ^1 ^5 O03 o3O Z2 i6- -l^9^6 -l^9^9 -l^7^8 -l^7^0 -l^7^1 -l^5^4 -l^5^b -l^b^0 -l^9^d -l^b^c -l^b^a -l^b^e -l^0^3 -l^8^0 -l^8^6 -l^6^6 -l^4^4 -l^e^e -l^4^a -l^4^c -l^a^e -l^a^c -l^e^4 -l^c^4 -l^c^a -l^e^c +l ^9 ^6 +l ^9 ^9 +l ^7 ^8 +l ^7 ^0 +l ^7 ^1 +l ^5 ^4 +l ^5 ^b +l ^b ^0 +l ^9 ^d +l ^b ^c +l ^b ^a +l ^b ^e +l ^0 ^3 +l ^8 ^0 +l ^8 ^6 +l ^6 ^6 +l ^4 ^4 +l ^e ^e +l ^4 ^a +l ^4 ^c +l ^a ^e +l ^a ^c +l ^e ^4 +l ^c ^4 +l ^c ^a +l ^e ^c o5M D1 -l^9^c -l^6^f -C^X^x$X$x +l ^9 ^c +l ^6 ^f +C ^X ^x $X $x *78 *A6 sa0 l -s(%*94 +s(% *94 i8U $T O73 ssI *03 ^0 sqQ O04 p1 $l p1 $k Z4 [ t -*53Z2 +*53 Z2 o3b Y5 y2 s/5 -,Bdq +,B d q O27 d -Y4^?LA +Y4 ^? LA O0A R4 $K c O34 *43 o2X @@ -76901,7 +76587,7 @@ y4 $4 p1 Z1 R0 O12 $z s,y -y5+6 +y5 +6 ^; D6 i3q i4d s'$ @@ -76927,22 +76613,22 @@ O64 +9 L7 $4 O14 p1 O83 *41 $) -s'_Y1*81 +s'_ Y1 *81 c $4 $7 $4 -$D$8 -u^e^8 +$D $8 +u ^e ^8 $4 O35 i3b -*45i5# +*45 i5# y5 O2B -^#i9}*43 -sf3sE+ +^# i9} *43 +sf3 sE+ Y3 O09 stv -R4o3o +R4 o3o OA5 *17 -D1f -^`'A -shR*71*85 -L0iAR +D1 f +^` 'A +shR *71 *85 +L0 iAR Z5 OA9 s<4 O93 O48 *19 O41 p2 @@ -77043,7 +76729,7 @@ s0; l $9 $2 $4 o0i u l $3 $3 $8 -f-6oAG +f -6 oAG C $2 $2 $3 c $4 $9 $2 ^C ^2 @@ -77104,7 +76790,7 @@ s36 u l $5 $1 $5 l $6 $6 $9 l $0 $9 $1 -L9qoBk +L9 q oBk u $E $5 u $E $7 u $5 $2 $5 @@ -77119,7 +76805,7 @@ c d '6 z1 ^N u ^D ^D o2T Z2 -tz4 +t z4 *03 $t l $2 $2 $0 O24 o21 @@ -77419,7 +77105,7 @@ i71 i81 i92 i51 i69 i79 $* O43 DA k -o4"z5} +o4" z5 } c o7! u ^2 ^9 ^9 ^1 $s $h $i $l $l @@ -77508,7 +77194,7 @@ p5 s7- ^* *31 $r $o $o $f $t $o $o $t $h -y3*43*03 +y3 *43 *03 $f $l $o $o $d $g $a $m $e c i54 @@ -77602,7 +77288,6 @@ $a $r $i $a i6n i7n $c $u $r $s $e l ^9 ^7 ^9 ^1 -c Z1 [ Y3 *02 c i1_ c $e $l $l $a @@ -77677,9 +77362,7 @@ Y2 O51 O61 O42 sg5 T6 Z3 -[ $M y1 i39 -T0 Z2 i6X O47 *04 Y5 p4 T8 O05 @@ -78074,7 +77757,7 @@ O38 o1r ^a ^k ^e ^r ^o ^r ^r ^e syV ^O -i3 { +i3 { sc8 $0 d D4 sC* $T @@ -78082,63 +77765,61 @@ f *29 O01 o6# Z3 OB7 $1 *42 O3A -^},B.B -*62oAW +^} ,B .B +*62 oAW O76 O96 -i7I.8 +i7I .8 '0 ^> K O85 R7 Z2 L6 O74 -*1AKt -s}Po8% -slj*81 -i6*iB^s7; -i6_Z4*27 +*1A K t +s}P o8% +slj *81 +i6* iB^ s7; +i6_ Z4 *27 O96 $A -o52[ +o52 [ +3 -6 $7 [ Z1 i4v Z3 l +3 r -A -Y1Y4 +Y1 Y4 k R1 $A d *47 -*08csZy +*08 c sZy *B4 O3B s1! *B2 O4A y3 D3 p1 +6 z3 sZ! O79 -] ^' -*72usZ0 -.4.8*73 -D8s@H*6B -seQR5Y1 +*72 u sZ0 +.4 .8 *73 +D8 s@H *6B +seQ R5 Y1 *2B DA i5B p2 O08 L5 *02 i58 o30 O56 sm` y3 O52 -i3?i6UsaB +i3? i6U saB O15 o5x k $A R1 z4 srn O59 -c*36s9> +c *36 s9> O82 O47 *17 o85 o7y C ^P $3 d D7 Z4 $4 -]o6u +] o6u O98 [ O82 O21 -Z3y1 -i4lsx, -i2@sT9 -sC1,A*52 +Z3 y1 +i4l sx, +i2@ sT9 +sC1 ,A *52 $0 *73 O45 i0H O04 $4 -D8 $0 +2 ^q i51 ,6 .3 o3a ^a @@ -78149,7 +77830,6 @@ i2i O73 O74 ] ] [ k y1 *54 .1 -] ^f '6 $% O06 $2 [ i25 @@ -78191,7 +77871,6 @@ r $n $e $s $s '9 i57 ^3 Z1 O32 $0 Y1 -^t ] K ] ^2 o71 ,3 k ] *34 @@ -78254,7 +77933,6 @@ i3z ] z5 i0r O18 o1k O21 f *72 O57 -O54 E $x $d O42 p2 ] ] K o2k @@ -78376,7 +78054,6 @@ y4 *95 O06 $w O41 c o72 O02 soa -O03 ^m K ^s O26 $0 o1y O23 @@ -78423,10 +78100,8 @@ K Z1 $0 o5n *34 o8- K o1y +4 -o1A Z1 E o2n *02 O12 y2 *10 -K ^2 ] -6 o78 o66 *54 +3 Y5 O53 @@ -78520,7 +78195,6 @@ y2 c O41 O62 -5 i2\ O23 $2 o1o +6 -O02 ^t y2 $. O72 Z2 O43 [ D5 -6 @@ -78602,7 +78276,6 @@ o18 *01 o2n -0 +4 '6 o48 O71 -o2z D3 Z1 D6 u i8z O53 o6i o0c @@ -78643,7 +78316,7 @@ E se3 o5a *54 si* i3y O61 -lse3so0 +l se3 so0 [ siy o1I E D2 o60 D3 @@ -78664,18 +78337,15 @@ o1o o0p *53 o73 c D6 $8 o3g -0 -o2T E O31 i6x O03 ,3 *24 [ *43 r -o1I D2 E $1 .9 f O67 [ [ $5 [ i38 { [ O21 i1i o4j -0 -i45 ^8 ] O02 i50 ^4 O61 o30 +2 @@ -78817,7 +78487,6 @@ u O75 Z1 shm $m R5 $n +8 u -2 -$7 O61 R5 $4 i7s R8 Z3 o0d @@ -78900,7 +78569,6 @@ i7f i31 { i4J i32 i51 i40 i60 r O06 -^u ] ^R d C i21 sEA @@ -79172,8 +78840,8 @@ i5d R2 L2 *8B O16 $b D6 i74 o8k i9i oAd { i52 -*ABR6 -i9mo0] +*AB R6 +i9m o0] i38 L3 R6 $l $o $y $d i5c R7 R6 @@ -79181,38 +78849,37 @@ i5c R7 R6 L1 .0 ] s17 *34 ^t ^o ^n -*B8p3 +*B8 p3 ^c ^i ^t ^n ^a i18 R0 L1 -s8Gz4z3 -sXr*8AD1 -*64*80 +s8G z4 z3 +sXr *8A D1 +*64 *80 o3o *37 O43 O35 z4 o0c o2q sg2 o1j o41 -^Fsd- -^O^NZ1 -sPQ$! +^F sd- +^O ^N Z1 +sPQ $! i32 L3 R8 -u^{ +u ^{ u ^7 ^d -sF(fy2 +sF( f y2 i10 L2 R0 -i7.y4 +i7. y4 L2 $- i4e s49 *07 -K*91 +K *91 } +3 u *B2 '7 *03 -1 -p2p4 -s*m*29 +p2 p4 +s*m *29 i5f R0 R2 -i20*B2u -i5Ck -^k O17 +i20 *B2 u +i5C k $d OB1 s8t -D7^2 +D7 ^2 ^a ^n ^i ^d i18 R4 L1 O25 ^p @@ -79232,7 +78899,7 @@ sS; T3 T9 T8 T6 i1f R0 L2 O82 o3 ,4 -*3BZ3sH5 +*3B Z3 sH5 O6A i91 'A sm+ $1 i2d @@ -79242,25 +78909,25 @@ Y2 $/ O23 o4j R1 [ i6e o5b D7 -+0i5JsXQ ++0 i5J sXQ sm; O4A O42 -*5B*76y2 +*5B *76 y2 $t $i $a *24 *02 -$Pi8Gy3 +$P i8G y3 $m $o $e $t T0 T6 T9 TD -^|sld +^| sld i5a R1 L1 O23 o4w Y1 i50 R1 R2 -EsZq -*72o3PLA -s}/^xs{S +E sZq +*72 o3P LA +s}/ ^x s{S O53 o0R -o98.3z3 -T8s_4 +o98 .3 z3 +T8 s_4 se2 o59 o3f $4 sc0 O9B s@y p1 i1a R4 R3 @@ -79274,55 +78941,54 @@ o0e i8a o6a o4_ ,9 o1i ^A k *54 K Y4 O93 *0B -tD1*B1 +t D1 *B1 $l $l $o $y $d snm p1 O23 $k O03 $2 c TB OB6 O9A E sA[ -^`*85s6} +^` *85 s6} O16 D4 sb9 i5e L7 R4 R2 r R0 -o2`*A8 +o2` *A8 i5` O23 c $M $C O82 f -*7A$k +*7A $k $. o2, i19 L2 skY OA9 p5 O15 Z3 i3c R6 ^e ^e ^l ^f -[^; O14 d O89 Z4 O37 sjB $2 $g -Y3i8e*68 +Y3 i8e *68 '6 $Q O84 *80 -c*B5 +c *B5 o2g d -*90*45z2 -spKf +*90 *45 z2 +spK f i36 L3 L5 T3 TB T6 T7 -z3sC4 +z3 sC4 o4s -2 -*6AiA& +*6A iA& O48 sat i0j i2s i1u seo $n ^p ^a ^p o3h $r -o0Ys+m +o0Y s+m f ^T L8 { *78 -oAUsPz -*B6sA"sV4 -sGk$4 +oAU sPz +*B6 sA" sV4 +sGk $4 OB4 p5 D2 $, R6 ss8 @@ -79343,9 +79009,9 @@ T2 TA T6 T7 o3Q O24 O5B R2 o5o o6f O03 -y2sxn +y2 sxn $L -1 O36 -*A1sS@ +*A1 sS@ +8 O91 o5c i7p D2 Y2 y3 @@ -79354,7 +79020,7 @@ p1 k ] o2r Z1 *67 D6 L0 O31 -]iAd +] iAd $m ^C u i3e R5 R6 o63 i80 [ @@ -79371,7 +79037,7 @@ f *74 O02 O74 *62 sXO O82 sgT u -oApc +oAp c *59 OA2 D6 O79 L6 o4v O59 @@ -79379,9 +79045,9 @@ o4v O59 s-\ *09 { i0j i2s i1e -i78sVzsIH +i78 sVz sIH D4 o5+ D4 -+4z2y4 ++4 z2 y4 $A u O24 i7a R0 L0 O21 $5 @@ -79392,16 +79058,16 @@ u O05 .0 i15 R0 L2 i54 R6 -2 .6 -,9y1 +,9 y1 $ -3 E i5c R1 L4 i5c R1 L6 -k*37sqt +k *37 sqt $T O45 [ -*92i9_ +*92 i9_ ^v *61 O13 ^e z1 E -d{*A3 +d { *A3 ^i *52 o0j y3 T2 T7 TB TA @@ -79411,75 +79077,73 @@ O32 L4 $l $e $o $n R6 Z3 iBO -kR1*84 +k R1 *84 O94 i0W o2j D0 y3 *35 -k{$W +k { $W +2 u p1 ] O02 i72 R2 R1 -y1*94o2| -i12*A8 +y1 *94 o2| +i12 *A8 o7y o4x O02 f z3 -${r +${ r z1 *04 O31 Y5 .4 O64 -z1z2o9E +z1 z2 o9E i55 R3 L3 -7 $B O04 '8 s 5 i1. $. i3. i5. i7. -o0k.8iB( +o0k .8 iB( s24 T0 ^a ^t ^l ^e ^d o0i i2b i34 i4t o2s O41 ,5 ^5 ^e ^p ^a -o9=*A4 +o9= *A4 d *32 O21 $8 -s<)'3 +s<) '3 i19 R3 L3 Y5 iB, O26 -${l -*14*7B +${ l +*14 *7B [ o0t +2 ^n ^i ^g t *2B O86 swb Z1 y5 O7B *2A $f $a $i $t $h -D6o0] +D6 o0] T4 T7 TB TE -p4*6B +p4 *6B sH% O47 -*47z1*56 -srz$X,7 -*72D1 -[ $6 +*47 z1 *56 +srz $X ,7 i6s O23 O04 O72 -Ci4AoA= -DBC$G +C i4A oA= +DB C $G i70 R0 $s $p $u $n $k K o2l -i8Ysgto8% +i8Y sgt o8% suy u $s t *75 D2 { i20 r ^7 c $c $h $a $n -$fo6S*78 -DAoBB +$f o6S *78 +DA oBB p1 s.W O37 -szlY5 +szl Y5 o5i O86 -sq/*60 +sq/ *60 sX- -Z5*B3^U +Z5 *B3 ^U R3 -7 R3 -4 i3$ f O21 @@ -79490,19 +79154,19 @@ i54 R3 R2 i78 R9 R8 ^a ^r ^e ^s t i4A [ -i2Qs(g +i2Q s(g i33 $l o7g oAe ^u ^d ^r ^u z2 i3o ^9 o6f $d se6 su3 i31 R0 L3 z2 i3p -s5G+8E +s5G +8 E i31 R0 L0 i0d R6 sct *45 O86 Z5 -R6^j +R6 ^j i31 R0 L1 T4 T8 TA T7 $i $n $c $a $s @@ -79510,8 +79174,8 @@ $n $i $c $e *26 T6 O15 s3s [ i73 R4 L4 -{sO0 -iB[p5 +{ sO0 +iB[ p5 k ^x OA7 k +0 '5 @@ -79520,41 +79184,41 @@ o0l d OA9 T1 i4k O62 i36 [ k $1 -sx;o5TZ1 +sx; o5T Z1 i30 R0 R2 i8t i93 ^y ^v ^a ^n i17 -5 O18 *42 y5 p3 -oA4[^4 +oA4 [ ^4 O21 ^u $k $y $l $e *6B OB3 r R1 i36 L3 L1 -ri0' +r i0' *A1 o95 O85 O17 '7 sG^ *95 D8 u -*68*15sBl +*68 *15 sBl o2* z1 q '9 O21 T4 T7 TB TA l i1l $' ,9 k -Z5i1a -s\d*89$s +Z5 i1a +s\d *89 $s r o6o '7 R5 o2c K ,3 *20 -k$g +k $g k i3Q *62 i5h Z2 O6A -ry5D9 +r y5 D9 $m $a $r $s $h -*27p1p2 -*8Bs^X +*27 p1 p2 +*8B s^X z2 o1o c sgV i31 L7 R4 @@ -79562,12 +79226,12 @@ i3b R0 R1 *98 y2 O89 i9j O54 ^o ^n ^u ^j -s}_*4A +s}_ *4A D5 i4g s=, -*06^g +*06 ^g RA i9X O37 -}i09T4 +} i09 T4 o81 R7 ^l ^r ^a ^c c o0z i6- O53 @@ -79576,45 +79240,44 @@ o6c o4y y3 ,1 +5 +7 ,3 ^s ^e ^l ^o ^m -TAy3sgw -p1*41^W +TA y3 sgw +p1 *41 ^W i34 R1 R4 p4 R4 i11 R0 R4 o59 o31 -p3$d +p3 $d i7s y3 -sVuo1{ -L6]sH& +sVu o1{ +L6 ] sH& o2k -5 Y5 Y2 O39 i11 R0 R2 s8r E OB5 z1 L0 $1 -*70*24 +*70 *24 i51 L7 T2 T7 TA T5 s?l -iB/i2= +iB/ i2= $p $w -*34*26s{i +*34 *26 s{i -5 i3i O96 i16 O15 OAB O75 o9v *15 *41 *52 '7 i1i O71 sX- -siqsLys8j +siq sLy s8j Z3 o7o sWX -*5B*09 +*5B *09 T0 TC T7 T2 O5A i5 y2 -o8Qf +o8Q f i17 R0 L2 p5 *67 *03 *32 +3 -[ $l $p $6 o0w o6p +2 o4v ] i53 @@ -79622,57 +79285,57 @@ D5 R1 ^o ^w ^t i0f ] -7 o5e s9. -T6sVEy1 +T6 sVE y1 T5 i7A O6A i4a i60 i5n sC3 sa2 i4e i5y sx1 -Ks@% -sWoiAF +K s@% +sWo iAF o2c R4 -Y2p3 +Y2 p3 o2w ,7 $l d -o0)s\QsN( +o0) s\Q sN( i73 R8 R9 -o20*A0*A8 +o20 *A0 *A8 O4B Z4 Z2 o0( *15 -o1*R7 -y1sa(sXk +o1* R7 +y1 sa( sXk T2 TB T4 TA $j $u $l $i $e O95 z3 -y3s'hT6 +y3 s'h T6 i19 R2 L2 ^l ^l ^a ^w c sMu $f ^v -z4CTB -*83*A0 -,5d -s0Xz1s8@ +z4 C TB +*83 *A0 +,5 d +s0X z1 s8@ i5e L6 L4 f O28 o3p o0z o4q $9 $7 $2 s(W -toA]si& +t oA] si& $0 O45 ^e ^n ^i ^m -*A7^W*46 +*A7 ^W *46 o1h O42 D6 s82 i7c R8 L8 '9 o0K $x [ 'B O61 -li8m +l i8m sT$ o0i sa1 o2w i32 $f ^m ^c -sX[sWk +sX[ sWk r +0 } -+3$CZ5 ++3 $C Z5 OA4 l s\x i57 R2 L2 ^l ^i ^a ^n @@ -79682,7 +79345,7 @@ sba i16 L1 L3 i74 +6 Z4 O64 -s&1T5T3 +s&1 T5 T3 oA9 DB o2r i3g i16 L1 L7 @@ -79690,43 +79353,43 @@ i16 L1 L7 s20 Y2 ,8 .6 o7K sK4 O43 -R5$%y5 +R5 $% y5 z3 O72 LA o0D '6 o0n Y2 O43 OB3 T7 *07 OB3 -i7 s*ny1 -Y1sPZ -s y2 O71 *04 s3e +5 @@ -79986,59 +79649,59 @@ o3; '6 O31 Y2 D1 i18 L2 O28 y4 *36 -iBuo9I +iBu o9I f c O08 -$7*40 +$7 *40 $n $a $s $t $y ^l ^e ^w ^o ^t i2 sqt -,5*31Y5 +,5 *31 Y5 O65 slb -Z2lz2 +Z2 l z2 '6 sqg $6 -5 { z4 *81 Z3 *72 *63 -,7sMDK +,7 sMD K ^g z3 -y2K*31 -s\"D4 +y2 K *31 +s\" D4 O97 *30 O56 T0 TA T9 T3 -sge*3B -^4*27 -s/YR9*48 +sge *3B +^4 *27 +s/Y R9 *48 +1 sc5 ss0 i67 o7a -sln$] +sln $] O01 O43 o8v O15 u $8 r $a $u $x -*93o26 -p1q +*93 o26 +p1 q ] .2 $r O63 i5k i6b i3m $o [ O41 O37 -rsc9f +r sc9 f *42 y1 -0 -T6i9^r -*19s2] -*81i5x*A9 +T6 i9^ r +*19 s2] +*81 i5x *A9 o5s O1A sUt s2B u -.A$Q +.A $Q i6% +9 K O24 Z1 O28 t -*7B] -RA.5 -$P,B +*7B ] +RA .5 +$P ,B O06 Z2 r O61 +4 o1c o75 o5d o69 o3j ^- o0\ O9A -$fp2 -*36s+{ +$f p2 +*36 s+{ r *98 OB5 o2H Z1 u O7A ^u @@ -80046,37 +79709,37 @@ O75 ^N sQx E o3s s|3 O5A o3Y Y5 O36 -Y2R6s!; -$1$EiBB -,BsK# +Y2 R6 s!; +$1 $E iBB +,B sK# p4 o3z -$p*7A -.0y3 +$p *7A +.0 y3 ] z2 o07 ^2 -Z3s>S -*5B$"'A +Z3 s>S +*5B $" 'A ssV u O16 C u i0N O16 -*47oB{ +*47 oB{ T0 T9 T7 TA .1 OB3 sA? o2- o3h -*19Y1 +*19 Y1 $7 i54 i2L C sn^ i2C l T4 T7 TB T8 -,5iA/ +,5 iA/ +1 o2w s.q -Y1y3y3 -i84s!xo09 -L9$ZR1 -*B8y4 +Y1 y3 y3 +i84 s!x o09 +L9 $Z R1 +*B8 y4 K +2 T0 ^l O35 --2sk0*31 +-2 sk0 *31 i34 O14 O53 sT1 $- Z5 [ Z5 @@ -80085,33 +79748,33 @@ T1 T5 T2 TA sH^ OB2 $( o5r O02 -ki2t -Z1-3si; +k i2t +Z1 -3 si; Z2 O37 -Cy5sNg +C y5 sNg T2 T7 TA T8 -*8BD1 +*8B D1 p4 O03 O8B -T0*62L2 +T0 *62 L2 o48 .1 o1f [ svD -*A7s`,+2 +*A7 s`, +2 *63 [ -3 z3 R1 O15 -*34sf; +*34 sf; f O37 ] O47 O32 -*75] +*75 ] d *20 '8 d OB1 l -su+*87 -s*v$C -]^>-B +su+ *87 +s*v $C +] ^> -B +7 swg Z1 -z1^u +z1 ^u spT OB4 q -o4msvat +o4m sva t O64 $4 oAr O14 O54 R0 -1 @@ -80121,31 +79784,31 @@ o3j DB p2 'B *94 O35 *A7 { o6i -EsO; +E sO; O0A i0_ s]` O5A p2 y4 o3/ u u } o2E -^usFp +^u sFp T0 TA T9 T5 -.7i5i[ +.7 i5i [ Z4 OA6 .1 Y4 OA3 i34 L3 R6 K Z2 *58 i14 R0 R2 -*15cY2 +*15 c Y2 o5c *57 Y2 c p4 -s5u*24 +s5u *24 [ [ $0 O21 o5k Y3 y5 OAB ,5 -*6B*B0sHZ +*6B *B0 sHZ $m K slf i5p Y5 -*0B*B4i9D +*0B *B4 i9D i3x OB2 O24 sJ= p3 ^N O6A @@ -80161,9 +79824,9 @@ o6e O24 *35 ^, d i2L E O25 O64 f -csAw -Y3D7 -i0jsCo +c sAw +Y3 D7 +i0j sCo *26 ,8 *5A O79 O58 o2. @@ -80173,26 +79836,26 @@ u *05 -5 o53 z4 OA2 *80 Y1 ,1 o01 -oBAr +oBA r s U O54 o6u s;P O27 sl' O68 $f i8o i9y -fy4 -o0ZsTp +f y4 +o0Z sTp $r $m -s`%$$*81 +s`% $$ *81 o0P r -o9i^{ +o9i ^{ O45 OA8 -.9*6B -$r*60 -o9?*8BsX2 +.9 *6B +$r *60 +o9? *8B sX2 o72 k z3 Z1 o0m O48 i29 T2 TB T3 T7 -Z3^e +Z3 ^e .1 O06 Z4 o0( o6) O03 O9B { @@ -80200,15 +79863,15 @@ O7B O19 *58 Y5 .1 *07 *43 Y2 [ O27 -B -ds4.$w +d s4. $w o5o Y1 O21 i46 -iAlo7giAS -^AsF] -syo*B6 +iAl o7g iAS +^A sF] +syo *B6 $r $x c T0 *07 -i3d*71 +i3d *71 R3 '6 T2 TB T4 T7 Y4 d @@ -80216,14 +79879,14 @@ T4 T5 T9 TA E *75 $_ O48 k } O98 -]*18 +] *18 l i06 y4 O52 o5- T0 T4 T1 T6 y5 k O54 i3u O52 -sYCR8 -sA)*1A +sYC R8 +sA) *1A T2 TB T3 T8 i5v O83 O41 D5 su +[ *04 s>u ^0 *34 } *76 -*25i7_i31 +*25 i7_ i31 *24 .7 -o70Z4 +o70 Z4 i4b O02 -Y2D9 +Y2 D9 O23 o8_ -sFTD7 -*A1E -oBE[y3 -i4hs"GswR +sFT D7 +*A1 E +oBE [ y3 +i4h s"G swR $% ^* } *6B '7 o11 -6 @@ -80290,32 +79953,32 @@ iE1 iF9 iG9 iH5 sgr y1 $* ^K *35 R7 O64 -,0s%a*54 +s%a *54 O05 c $2 O4B C ,6 sxI -oA\+0sB1 -D1EiB$ +oA\ +0 sB1 +D1 E iB$ $t ,3 { O98 ^4 $y *16 *13 Z3 O95 i35 OB3 ^p O08 o7* o2i -*95*51] +*95 *51 ] O9B ^j -s^%Z4Y5 -i5dRA -*03^z} +s^% Z4 Y5 +i5d RA +*03 ^z } o3d p1 *82 '6 -*95${ +*95 ${ $. $g $o $v -o7w^K -o7*o2isqY +o7w ^K +o7* o2i sqY i62 i80 i70 i92 *16 ^1 -$au-4 +$a u -4 sNv +A 'B o7g c T3 d @@ -80326,28 +79989,28 @@ o1g '6 .8 $& snR ^b z2 -*89i7q +*89 i7q o68 -5 i4o i5o i6n $Q O31 o4e O13 p1 *9B -o99y5D2 +o99 y5 D2 o0s O61 { -5 ,4 -]y1*98 -$@'8 -somp1{ -^wsFqiAE +] y1 *98 +$@ '8 +som p1 { +^w sFq iAE OA9 ] R7 i5d *62 *15 Y2 c $A $D -s)G^9*69 +s)G ^9 *69 *20 Y3 } *9B -A c O03 y5 *9B -$Go9e*A5 +*BA iB9 +*45 s>e *A5 sg- O72 sa5 *B6 i32 D7 ,4 O41 ^m -5 -i83i3. +i83 i3. o82 } O14 O24 ^C '5 +1 o0n -i8(*43 +i8( *43 *20 s60 [ $1 k .3 *23 k @@ -80566,30 +80229,29 @@ i6a O31 s$o y5 O2A $g .5 OB6 $} -oAo$)K -$%*2A$3 +oAo $) K +$% *2A $3 .2 *05 $8 *43 Y1 $M O04 $O D5 y5 OA6 O21 d *A2 -Z1s;Ed +Z1 s;E d c i4& O42 p2 O79 -^/d +^/ d ,5 D2 OA6 i8n O08 O43 T1 T8 TA ^s ^y ^d -s7O O71 E y3 c O73 i4y $4 $u o5e -*BAi6Mo7S +*BA i6M o7S y2 .4 u O48 snw -5 L6 o4a +0 -*14i6n +*14 i6n i1e $h i4a i5r $i o0s O21 ^s ^y ^a ^r @@ -80616,28 +80278,28 @@ o4d i4l i0. OA2 s3B i4T f O47 -*28o3gs$l -+0y1*13 +*28 o3g s$l ++0 y1 *13 O91 i5? -R2-2 +R2 -2 O52 R3 o66 T1 T4 T7 T2 -i6LY2{ +i6L Y2 { O15 y1 z5 *14 i0c k o2m i9} *79 O7A sQz -sZ5sr1 +sZ5 sr1 i6q T3 O43 $s oAR O36 D9 +1 se1 i32 st3 sl7 o75 ^^ O68 s&d -spG^L*1B +spG ^L *1B *38 TB O95 [ Z5 o68 -o3fY4 +o3f Y4 ,3 o2J O01 D3 r T5 R8 @@ -80656,7 +80318,7 @@ o0- D3 y3 +5 Y2 o7f T0 T2 TB T8 -i78s7) +i78 s7) s3? O46 O05 i3. *20 o0g @@ -80665,11 +80327,11 @@ sx9 i61 i89 i75 ^s ^e ^l ^o ^p [ +1 $3 -Z4o3n.6 +Z4 o3n .6 O53 ^5 O58 Y3 O47 R1 -Z4RAsby +Z4 RA sby O53 ^7 O83 i7K spG ^L @@ -80679,8 +80341,8 @@ o5c O02 $4 z5 *36 i2i i4e i3v O36 D6 -*85*04 -*91-8 +*85 *04 +*91 -8 ^K o1e *9A O9B O67 o92 $Y @@ -80694,11 +80356,11 @@ i8` o9e p2 iB) O78 o4m +5 y2 i2t ] -sdF*35 -$B*96*98 +sdF *35 +$B *96 *98 O32 O64 -LA+0 -LAo1d*68 +LA +0 +LA o1d *68 O21 sln $? $@ $( y3 @@ -80706,10 +80368,10 @@ $( y3 $? $( sSq O46 O63 s71 ] -.0Y1*76 -qZ2 +.0 Y1 *76 +q Z2 O76 +2 -A -s;io6M +s;i o6M o4p *40 p3 O4A Y2 ss8 $9 O92 @@ -80717,7 +80379,7 @@ ss8 $9 O92 ] sdX o2j *34 o77 ^+ -Y2*3A +Y2 *3A O18 T0 -7 $g -0 c sy. @@ -80735,20 +80397,20 @@ i7t $3 Z4 *06 $p $u C L1 -R0s8d +R0 s8d spR $h $P $I szI $i OB7 sS+ E ] o5Y -+8*19 ++8 *19 -4 $8 O71 $/ $5 c *4A sr O32 -p5Z2 -^6*B5 -i4c*49 +p5 Z2 +^6 *B5 +i4c *49 -0 $v y3 scf o7n $x @@ -80762,14 +80424,14 @@ R5 st9 ^A u *54 *10 O83 *9A R8 t -iAKi49 -*07$' +iAK i49 +*07 $' O27 ^l c oB. p1 O31 O65 o5 O13 sdh O8B O34 -*8BT8s=& +*8B T8 s=& i52 i71 i62 *65 D1 O52 *34 } p1 @@ -80790,13 +80452,13 @@ y2 r *27 y3 O38 i5a z1 *36 [ o4j $7 -sB\Z1 +sB\ Z1 i5z q oA7 u -*32q +*32 q ^- O63 *06 s-* -+3{Y5 ++3 { Y5 O03 ^w u $. $f $i z3 *19 @@ -80807,14 +80469,14 @@ R9 D7 [ y3 -0 Z2 i4- scR O95 -^r*AB +^r *AB E Z2 O93 O76 ^L -'7o1u*20 +'7 o1u *20 y4 *38 O23 -o4?z4 -*79s;6 -*48s%2s#+ +o4? z4 +*79 s;6 +*48 s%2 s#+ iAH O62 sO3 o37 *13 @@ -80829,10 +80491,10 @@ o2! i3V L4 *89 f D4 s06 } -^lL9{ +^l L9 { O52 o5q O34 O74 sDe -s*2sNs^R +s*2 sNs ^R y5 O9B ^t $N o3n *75 i6- @@ -80843,37 +80505,37 @@ i33 R4 L3 *32 o3s p4 O31 *20 O02 .5 -.1 'A OB6 +.1 'A o4$ $$ c i11 i09 O1A f ^m ^a ^ ^i -$)ssL +$) ssL o1v i52 se1 i61 o73 T0 T2 TB T4 o4D *40 T1 T4 T7 T8 o6V O09 p4 T2 TB T4 T8 -*0AK -iBL-5] -R0*79 +*0A K +iBL -5 ] +R0 *79 E $8 O63 O84 $c D4 ,6 $Y ] TB Y1 ^e ^r ^u ^s -sM;^i -ssm{ +sM; ^i +ssm { O14 Z2 o1w .3 -sw&o8l +sw& o8l ^z o3a o75 o6u T6 TA T7 Y1 s1F i4n *58 r Z3 o0h -*B6q +*B6 q y5 O78 sji O05 u K s2P @@ -80883,39 +80545,38 @@ i33 R4 L4 i7) *31 y5 O74 -5 O12 s9n -[p5 +[ p5 T4 TC T7 TD o3E s4. ^g sg* +A k *49 O58 -R3*59 +R3 *59 f O13 -$WsR8 -Y3Z1*B1 -o5r*39 +$W sR8 +Y3 Z1 *B1 +o5r *39 ,7 O75 ^( O46 $; sxI -[ E O81 f $m T6 T7 TA TB +0 z5 -*43Y2,B +*43 Y2 ,B ^M O69 o2u ^i $y O07 se@ E -ss;$K +ss; $K o1* O47 z1 s8@ o0w o6p o4v +2 sf4 ^x -2 O31 i3r i5t i4e ^u $k -sRf*75'8 +sRf *75 '8 D2 y2 OA5 *35 D6 i4y i6s $1 o89 o97 -$(uiBv +$( u iBv K $A t O42 Y1 OA8 u @@ -80924,7 +80585,7 @@ q s4. o6g *02 ^/ O8A $. $u $a -i0vsTF +i0v sTF y5 O02 O51 C O64 sdG } @@ -80936,7 +80597,7 @@ $V .7 i39 *25 '9 *68 sri d -Z1o0{ +Z1 o0{ i4b +5 l O34 -7 ] o0D OA2 @@ -80947,16 +80608,16 @@ E O76 Y2 ^t o3R o3p } z2 scl -uT8*56 +u T8 *56 T5 TA T6 T9 iB1 iC2 iD3 iE4 iF5 -$/s d +$/ s d k s2c k E ^y i48 +7 i79 R1 L1 *70 i4g -o0Zs(a +o0Z s(a '6 o5* *A9 s5q E T4 T8 TA TB @@ -80964,13 +80625,13 @@ T7 saq i0M OB7 ^w O23 shX D4 -*24s[F +*24 s[F ^a O13 O54 $1 t ^9 o2r $7 -i8^i9dz3 -Y4s * +i8^ i9d z3 +Y4 s * i4h i2i K +3 $e l i4V @@ -80983,26 +80644,26 @@ O31 $5 ^^ OA9 T7 TA TB T9 z4 TA -s*AB -i2kk +i96 s=> *AB +i2k k T5 T7 TA T9 -o4i^4 +o4i ^4 o2T o33 -o9joAao79 +o9j oAa o79 +1 srD $2 -0 O12 $/ OB9 u @@ -81095,8 +80756,8 @@ Z1 i27 sik ^R o0z $9 o4q $7 $2 T1 T2 T7 TA --AsnFi40 -*29z1p1 +-A snF i40 +*29 z1 p1 *42 O59 -1 O1B ^e *32 @@ -81106,36 +80767,36 @@ Z1 c O08 O07 +3 ] siy $" $' -$f*87 +$f *87 z2 *15 } ^k o6d $3 +2 si3 d *69 O58 -s.(-B +s.( -B y2 y2 'B ^P O13 Y4 o1w se2 $4 o59 sc0 o3f ^K i71 -i7$i4f +i7$ i4f s_4 $) OA3 -o3ZsTHsXw -q$+ +o3Z sTH sXw +q $+ i11 *14 r $J o64 --5*7B +-5 *7B ^k p4 i4u *A7 ^K O42 r o1l z2 -7 ] -scSstS'A +scS stS 'A i7a ,3 O28 -p4sy;} +p4 sy; } l $. $n $r ^2 z5 -p4d*A2 -*83'8sma -sT@skRoAo +p4 d *A2 +*83 '8 sma +sT@ skR oAo l $. $n $p ^n $o OB6 o5c T7 @@ -81143,8 +80804,8 @@ o5c T7 o54 i51 o4h +0 s3p i0i -sd[csnO -*A5sus +sd[ c snO +*A5 sus D9 L9 O05 o1y sl1 $f $l se2 o2r sc@ @@ -81152,7 +80813,6 @@ y5 D2 i6c O92 D4 o6i Z1 iAP -O01 D3 [ i6e oAC ^t c O9A szY $u @@ -81160,38 +80820,37 @@ o15 $7 si0 .2 $2 T5 i5- T5 i5. s20 ^Q -oA=D3Y2 +oA= D3 Y2 o0t -7 i0h o74 O74 ,2 O16 p3 *31 i1e t o8Y D7 -Y2*63 +Y2 *63 O41 i6m -sp&o2fp4 +sp& o2f p4 OB3 f .1 -sq)f*6A +sq) f *6A Z2 .2 O63 -L7{$2 +L7 { $2 O61 s!a i9k ssU } D5 o0d -p1-AD6 -Y5rs3l +p1 -A D6 +Y5 r s3l -4 O13 -3 p1 O72 i4s O52 i2t i4h i3c $) y2 ^m *A0 O42 -i4/^1 -R6 Z1 [ -sy -$f*16sOm +.9 *6B i9> +$f *16 sOm ^z ^a [ i41 -7 sea @@ -81376,13 +81033,13 @@ z1 ,4 *40 *17 $K OA5 $2 o2w i0_ } -^CY2l +^C Y2 l { O02 ^v *78 O8B O7B -s{Ri3X +s{R i3X OB8 O19 T1 ,A -i3v*24 +i3v *24 o0d $9 D1 $5 i3b *68 +3 sxu o2d O32 @@ -81394,11 +81051,11 @@ i2s ^l +1 O42 t i4, *41 O52 o70 -RA*47 -sY*$OsqF +RA *47 +sY* $O sqF O32 i2f o56 OA4 -z2p1smj +z2 p1 smj s0G O52 ,3 s06 T6 @@ -81406,9 +81063,8 @@ s4Z [ *53 O8B ^g O45 Z5 spP -+0Z4 ++0 Z4 o1y -4 -sD1 c Z3 O12 i5T *35 O68 R4 O57 @@ -81422,31 +81078,31 @@ o1q si9 D3 o72 o6l i42 O62 } $m O61 i3b +2 -k*B1u +k *B1 u ,4 } O38 O32 o56 q -*5Asd8 +*5A sd8 T0 T8 TB TA ^j -2 $Y [ $N $j $u i49 u O35 Z1 -sd&Y4 +sd& Y4 p5 y1 O12 o5f *06 *04 o6z -*53sD#t +*53 sD# t f *93 O48 $+ ,A y1 .9 p1 O05 O94 -y3r,5 +y3 r ,5 spG D6 sbk ^0 $6 sm0 so0 ,6 -s[b]z4 -^1s6f*16 -[T6*83 +s[b ] z4 +^1 s6f *16 +[ T6 *83 O36 +1 ^k -6 *9B $R OA7 @@ -81463,24 +81119,24 @@ sla o1O i72 i80 iA1 i90 o1p ^r O43 $6 Y1 -s*ty2y1 +s*t y2 y1 T3 T5 T6 TA O81 OA5 E [ $. o1d +6 r $m -7 q sbB -lshzz4 +l shz z4 o58 i3_ T6 *43 ^' z2 -Z4*83 +Z4 *83 O46 i3A $h O52 -s%&Y1+3 +s%& Y1 +3 ,7 $) +7 i11 R3 L1 -s^]^mscq +s^] ^m scq *56 i7X s@u *56 i7, @@ -81490,8 +81146,8 @@ oB c O85 *53 { { r O31 ^x -i0vDBs4D -p2*6Bu +i0v DB s4D +p2 *6B u -1 OB7 o0b *30 i52 i71 i60 i82 @@ -81499,49 +81155,49 @@ i52 i71 i60 i82 C +A i2r s5t $/ OA5 -lo3u*A2 -spgi7hoAN +l o3u *A2 +spg i7h oAN z1 *84 -*24-A*B3 +*24 -A *B3 *01 O51 ] O8A i9) -Z1R9 +Z1 R9 } sRm z1 .4 O61 i3- *43 C $! s6Z -qsrsz4 +q srs z4 y3 i3. i65 ] ^7 i66 ,7 o2m ^s ^a ^e ^l o1u O54 -*B6$D +*B6 $D O9A i96 y2 o2k p4 o77 *41 $. i11 i29 i41 i39 y5 *74 O75 ^J C -s{_T6sB< +s{_ T6 sB< o19 .0 o43 *27 ,7 Y2 o36 -D3*71R9 +D3 *71 R9 o0x i11 i20 i41 i6f -*91so) +*91 so) ^e ^e ^r ^g ^a Y2 R9 ^i o4o i7/ *97 -'A^bY2 +'A ^b Y2 o2f s._ q O85 D8 o81 O08 c R3 $. $i $o -o7O*81 +o7O *81 D6 ^d r ^x .4 ^p @@ -81549,10 +81205,10 @@ r ^x o93 K *61 OA2 s8N t $> -*A7li0n +*A7 l i0n y1 K $y -*94i0n,B -+B$7*8A +*94 i0n ,B ++B $7 *8A O89 i5* q i7a +8 *41 o2z u @@ -81568,54 +81224,54 @@ $Z ^V i5< [ q *51 k O42 O62 -i6Ky4 +i6K y4 '5 y4 [ } E { ,4 Z2 c T9 i9- -r$cs\4 +r $c s\4 *3A O12 $Y $g O41 o52 -s$**52 +s$* *52 ^y ^a ^j z2 O07 *48 *63 stD *B7 OA7 ^6 *25 ^- -o3qs{D -s`"*15 -sT]iA4^s --0+9se@ +o3q s{D +s`" *15 +sT] iA4 ^s +-0 +9 se@ O32 ^T -1 ^@ s80 i1e +5 [ { *64 --3sh^ +-3 sh^ p1 o4p oBu OA1 y5 O02 O75 c i48 O64 sLi O0B -s)ZsBr*43 +s)Z sBr *43 i3c i5i i4h $) o5m k O63 -B ] O02 q -p2*57 +p2 *57 LA O13 -s!]tD7 +s!] t D7 Z2 sWx T2 T9 T4 T5 -,BsXz*73 -D1p4 -s{Ss.`i2k +,B sXz *73 +D1 p4 +s{S s.` i2k D9 O69 $p D5 o34 OA6 s>B i6# k D5 o4_ i52 i60 i80 i71 -sjzs*e-7 +sjz s*e -7 $1 o6a *3B ] OA9 s|) iBc @@ -81636,16 +81292,16 @@ T4 *63 o4a $! s@0 *02 $N *07 -s.e.AK +s.e .A K syg o2_ O78 Z3 -.5sq3 +.5 sq3 d oAn OB8 l o01 O82 *93 OA3 ^f *57 T5 D3 O07 R7 -*06o0HsPu +*06 o0H sPu sxG ^z O61 D2 Y2 @@ -81657,36 +81313,36 @@ i7c O12 O12 i4E ^J *78 o63 +3 -p5D8LA +p5 D8 LA -4 *60 T6 z5 i0# ^s ,7 -i60p5 +i60 p5 O52 i2v s4T c *72 o7m s_1 Y2 O35 +5 *31 -*63*B3stD +*63 *B3 stD c o5O i2u } O26 -{s8m +{ s8m o5t o3m ] o4l +2 -^'*B8+B -z2*90^v -}$Bs*y +^' *B8 +B +z2 *90 ^v +} $B s*y o2Z ^g i3K l st1 Z1 i48 o0q i3_ *84 RB OB9 i4b O37 o3a -Z5s7$ -s${*04 +Z5 s7$ +s${ *04 O23 Y1 o4w -*A7.6 +*A7 .6 Y4 O04 ] $; [ .5 O98 @@ -81698,54 +81354,54 @@ T0 TA TB T4 $F $D $F $A O84 ^r -sc?s_/ +sc? s_/ O32 o1u R0 +3 t O32 O72 *B2 i6U o5e -z2s@v +z2 s@v o1O E i7u -Y4*6B +Y4 *6B T7 O53 o5d D2 $g -.6fz1 +.6 f z1 i5n '9 o0z i6a o72 o4n o53 -CY2 +C Y2 i68 o75 -*6AspK +*6A spK { *20 O4B *30 O56 $2 z4 Z5 d O6B o4i *23 -]o0Esy} +] o0E sy} sdP l $. $g $h O41 soi O8B O25 o3c -6 +7 ^, -i9u*75 +i9u *75 $" O79 *9A $; *01 i9s iA6 -y3'7Y4 +y3 '7 Y4 sy1 *25 -Es3RiAU +E s3R iAU K Y3 O51 sM@ O58 i9o sr, D3 *46 *76 -qs3|z2 +q s3| z2 O07 shv Z1 $> o3m ] i02 i21 i31 i10 OA6 *A6 O53 sBe k -y5*90 -o8?s/a +y5 *90 +o8? s/a ] smb *34 ^m ^, o1e r @@ -81754,13 +81410,13 @@ f *06 O13 sd9 i1r i3s i2e k '6 l -RBD5*34 -R1o7T +RB D5 *34 +R1 o7T sd0 -+3p2s1' -^rZ5 -^zspIf -s{%'A ++3 p2 s1' +^r Z5 +^z spI f +s{% 'A E O78 oA; O68 sw[ z1 O42 $Q @@ -81769,7 +81425,7 @@ r } *42 -4 T6 d O54 *19 L5 +5 -D1s\] +D1 s\] *63 OB9 Y3 *95 O26 sc' @@ -81783,21 +81439,21 @@ O72 i9! o23 O41 o6# O06 Y2 iAf -s$csW7,6 +s$c sW7 ,6 sCM *32 -$Msi7 +$M si7 O09 z5 O01 sre o81 y3 *05 '5 -z5z5y3 +z5 z5 y3 o61 [ o53 E K i9$ -$usR# +$u sR# o0b +3 -^6sP7 -d$c*72 +^6 sP7 +d $c *72 o0p i2k se9 i4i o85 p3 OA1 *24 z2 @@ -81811,7 +81467,7 @@ O61 *34 D7 o3v o2a $t ,6 O28 l $. $g $n -*05Y2*71 +*05 Y2 *71 i5 y2 sb0 O3A o4i i7! @@ -81826,11 +81482,11 @@ spS O87 o65 Y3 .0 Z1 OA2 O17 -T7*81*78 -Y3+5*18 +T7 *81 *78 +Y3 +5 *18 O03 ^2 y1 -^"*73 -i4,c*83 +^" *73 +i4, c *83 T9 y4 O06 $3 *86 i5o r [ @@ -81842,16 +81498,16 @@ r i01 *35 o0N y2 l L5 O65 $N i7x o8G -s/J,4 +s/J ,4 o5t K O1B $| s/? ^b -5 s9l o0b o63 -o5FZ4^R -o4xDA +o5F Z4 ^R +o4x DA O53 ,5 D7 -*35y3u +*35 y3 u Y4 *9B ] i92 *34 *32 ,6 @@ -81863,10 +81519,10 @@ sW< O37 .A o8( [ T9 TB -i4zsxQ +i4z sxQ *B1 O04 E $T -^d*ABT9 +^d *AB T9 s8& $k T8 R7 O98 sg7 @@ -81879,25 +81535,24 @@ sd& i0c *13 O3A i97 i9c o7K ] seo sd- -$,s-, -*A8+4'9 -]*B5saz -*A2*57sH% +$, s-, +*A8 +4 '9 +] *B5 saz +*A2 *57 sH% l $. $g $l i41 i63 i52 i74 T2 T3 TA T5 -sm`sPQ+3 -*36iA? +sm` sPQ +3 +*36 iA? i66 *63 ] --2 [ $3 O06 *97 Z1 L6 -2 *4B 'A i1l O32 -d*27 +d *27 O94 iB4 -$gsb5 -sn7y3$4 +$g sb5 +sn7 y3 $4 ,9 ,6 ^o Z2 *10 i6r o5o @@ -81906,27 +81561,27 @@ OB4 -7 i1_ *43 ] sjf [ i30 -qT0 +q T0 z2 *67 C Y2 $ i9m -spc*20*6B +spc *20 *6B T0 TA TB T6 y4 C -7 $u -o7up1] +o7u p1 ] i9@ O04 i7a i91 i82 $0 -6 -sBV*87*2B +sBV *87 *2B '6 Z5 p1 *BA --6sB\ +-6 sB\ o76 .6 o36 +1 ^s siA y2 OA4 ,3 OB9 Z1 -*27C*69 +*27 C *69 -9 O18 O49 p4 O6A Z3 stf @@ -81934,69 +81589,69 @@ Z3 stf ^3 *25 *13 -B iAB -5 i61 -y1cR9 +y1 c R9 T1 i0* i6y i71 i80 -s8&s\/$k -*B1*71 +s8& s\/ $k +*B1 *71 ,8 $/ i81 iA1 i90 O24 sr4 i9/ *A7 -Z1sM{RA +Z1 sM{ RA o5k i6s i4i o5c s9y Z1 iF1 iG9 iH4 iI5 y2 .4 -*4B.4} +*4B .4 } $8 O28 -s'[i9( -o4@s[% +s'[ i9( +o4@ s[% R5 '9 R3 $r -,4p5 +,4 p5 $y *12 ^c ^k i5w ] o3k ^| *12 -T0i7Uz2 +T0 i7U z2 su2 -RBc -sSd+2 +RB c +sSd +2 $+ O02 Z2 o4a i1o O32 -l}D8 +l } D8 O0A ^[ i62 i82 i70 i91 D1 '6 -3 ^h *50 -o0di8} -*32siz +o0d i8} +*32 siz O03 ^V s'8 O46 O1B o82 -t*69y3 +t *69 y3 ,3 o0n -*4BE -snqT6o9? +*4B E +snq T6 o9? o7, -5 *64 O54 t *01 i32 i52 i41 ^a ^m ^l ^a O45 C -tZ1$3 +t Z1 $3 O32 o3+ q O04 OB9 s*} O57 -8 saA *31 -L3}p4 +L3 } p4 Y4 ^e OA4 $$ '7 c O01 D2 O19 *24 *08 O89 -*AB*29*31 +*AB *29 *31 s6p i0g i5a $a ] k ^o @@ -82008,7 +81663,7 @@ saq y3 s*U O96 *86 O84 t T0 TA TB T7 -sjisP)$* +sji sP) $* O59 i3_ shP i1a sp6 o6s o32 $e @@ -82017,12 +81672,11 @@ D3 $% +1 O03 ^o *A0 O38 $6 r t Z3 -O03 ^s ss! O4A i7o '9 -i8-o1e +i8- o1e Z2 ,1 -z2*5A +z2 *5A iA? [ O57 ,A ^P *24 ] *70 @@ -82040,27 +81694,26 @@ T1 T8 TB T2 o8G oA2 i0I ] ,3 O45 -T0*A3 -] ^e +T0 *A3 s3b ^i O94 *51 +5 y2 *05 O61 -$!u*56 +$! u *56 *7A OB4 y1 i0, i4& *16 -{o5t -i3r*65 -*06$y +{ o5t +i3r *65 +*06 $y ^q i2w T8 Z2 O47 i40 i55 -p5s;F -+4sfH*40 +p5 s;F ++4 sfH *40 sa1 -5 o13 p1 f ,A -s_^^S +s_^ ^S [ i5j D7 *40 d O21 } @@ -82068,16 +81721,16 @@ $^ L3 z3 ssz i5a R1 R0 O56 D8 OA5 -s.Ki6. +s.K i6. o2b o3s -ksrv +k srv O02 $k k -+2*1B.5 ++2 *1B .5 ] $Y ^B *39 y5 O9A o4a stY --AiB.$i +-A iB. $i $f shl $6 O71 ] $< @@ -82098,7 +81751,7 @@ i81 r ^T O58 sq' '7 o0U *56 -]s9c[ +] s9c [ ^6 Z3 ,2 *52 *04 Z3 @@ -82116,12 +81769,12 @@ i8p +3 i5s -6 OA1 s'G syP $m -*71L8*41 +*71 L8 *41 y1 *17 O12 o2u O41 'A *54 T2 T3 TA T8 -*B5sNg +*B5 sNg o4f D1 *45 Y1 Y4 i1f R7 L7 @@ -82129,14 +81782,14 @@ i1f R7 L7 ^G .B O14 y2 ] r O37 ^g -sIdi7k +sId i7k o4s i52 o7u i8t sm ,3 -Z4y5 -s& -p5}*96 +p5 } *96 s!q $u oBM L2 t -s*G$t{ -O39 E .3 +s*G $t { *60 O6A +3 *36 ,2 -*19*07 +*19 *07 O52 R5 o33 Y1 o40 i13 o2i O73 o1; O0A -sd7+A*69 +sd7 +A *69 p4 O9B D9 ^a p4 O61 *02 ^1 @@ -82592,7 +82242,7 @@ T6 -7 sae -2 ^3 *35 .4 *35 -s/|sn9 +s/| sn9 s6= d ,6 -2 .1 sqt @@ -82611,21 +82261,21 @@ L3 i4k O84 D6 O96 O1A ^m scd $5 -R8K +R8 K *32 O41 sv[ O04 ^^ -*37R1 +*37 R1 Y5 *13 O25 ,6 Z2 s#F i1i O64 s5w i6Z -+BY5 ++B Y5 i4e [ ^o se_ i7a o3i i5I l $8 i4& o7b i7? '9 -oAP$- +oAP $- O54 o55 *5B O25 p4 DA @@ -82634,14 +82284,14 @@ o04 $6 i2z '8 i7e i91 i8l O19 slt -Y3s=R +Y3 s=R o5l '9 ^k $z -$4p5 -o2@TA*B8 +$4 p5 +o2@ TA *B8 i8# *84 O42 +2 O72 ,3 -R0s+u +R0 s+u $i $f $y i63 i80 i70 T0 T3 T4 TB @@ -82669,33 +82319,33 @@ q O82 *27 *96 Z1 ^o ^v ^l ^a ^s O57 *76 -$ystP +$y stP soA p4 sb. o2m s8E o2z -7 *32 sb8 T0 -*96+1i8D +*96 +1 i8D i6k O02 T8 z2 i62 i81 i70 o2a $e i50 o68 +8 $7 -*48uo5B +*48 u o5B o5f $1 ,4 ^1 se3 si! ss$ $" OA4 f *15 -^6s%} +^6 s%} sOQ O64 o7. O27 Y2 so* o4. '6 sdi Z2 } ^l O32 -+8oBg ++8 oBg o23 *02 k o1f O6B o07 Z2 -5 @@ -82715,16 +82365,16 @@ O86 sQP O41 o7y ^! O38 Y5 s[g O68 o2+ -*10y2{ -*A7$y +*10 y2 { +*A7 $y Z5 D5 O75 T1 T2 TC -Kscq +K scq o92 i91 r O12 d o0p ,2 -5 O29 p4 -s8&$- +s8& $- i1V DA $5 O25 t *63 r OA3 @@ -82734,17 +82384,17 @@ O54 sQ< d } D2 +0 +2 ^1 sYR -p4Y5sv- +p4 Y5 sv- D6 ^^ ] i0m *63 z2 i6n *40 T3 T8 TB i45 ^6 -s\wi20 -oA[Z5z3 +s\w i20 +oA[ Z5 z3 i61 *37 O34 ^w -rT8*50 +r T8 *50 o8o Z2 C $r i3d } @@ -82757,7 +82407,7 @@ i14 R5 L1 ^1 *16 $4 R0 D4 R4 Z2 -*0B$li8| +*0B $l i8| ,3 ^6 ^K six sQ5 p5 O58 @@ -82766,18 +82416,18 @@ o0w o3g O94 sx3 *B0 i76 R1 L1 ^k O19 *41 -Z5iAYsvT -o7P*48o7f +Z5 iAY svT +*48 o7f ^* ^^ +4 i0t Z2 *84 i61 i79 i90 i89 O97 OA2 -s*2T7o0K +s*2 T7 o0K sb0 Y1 $r Z2 i5D *50 -+9oA)sk; ++9 oA) sk; o5U y5 .2 y4 OB7 { D1 @@ -82787,7 +82437,7 @@ O56 sQP o8E ^t -7 +8 ,A O04 i3u ssk -R9*76 +R9 *76 o1V u i6h i8r i7e O87 L9 @@ -82795,15 +82445,15 @@ O87 L9 *98 O63 O93 O04 O91 ,5 O57 -o9&i47 +o9& i47 O54 ^3 O06 $3 -i4qy3Z2 +i4q y3 Z2 O72 K *31 svm l *13 ] c y2 $b $a $g $s -*34Y4 +*34 Y4 i44 '8 O13 i8M i28 Z2 *35 @@ -82819,21 +82469,21 @@ sj] OA5 su> o7y O05 T6 sRJ O39 --5iA. +-5 iA. O51 O72 ] i6b O02 -7 *72 O41 *3B i33 oAe o7g $l -o2ws|L +o2w s|L i33 L3 R8 *B7 p5 O57 -p3*95z5 +p3 *95 z5 o8( OB7 -s<+'B +s<+ 'B *53 sn7 i17 ] -Z3,7z2 +Z3 ,7 z2 E r i7! T5 $r ^r *20 @@ -82856,9 +82506,9 @@ D2 L0 +5 s3h ^i ^r ^a ^m slf o5d --1svt +-1 svt +0 o3z -*73*AB +*73 *AB ,5 i54 T2 TC T3 T6 *92 i7d O93 @@ -82875,20 +82525,20 @@ i72 i92 i80 iA0 ^U $6 L0 l '7 p3 *60 -sQai6HY3 +sQa i6H Y3 szZ szR T7 R7 ^l ^a ^o ^c i01 i31 i19 i29 -{t*39 +{ t *39 *65 o6< T5 i4e -i4os&Ds=d +i4o s&D s=d $s $z s0r l ^Q D5 -p4s}pi5H +p4 s}p i5H T2 TD TA T3 f O3B Z4 stn @@ -82898,50 +82548,49 @@ q D9 O43 y2 *A9 O08 ^8 z5 c *05 -^fi1biAq -*81iB}.5 -Z5D9 -*49Kc +^f i1b iAq +*81 iB} .5 +Z5 D9 +*49 K c s/* K O72 T4 -oApo6Rs]^ +oAp o6R s]^ +5 seS -sWm-4*78 +sWm -4 *78 p1 o5g Z5 O83 -oAa.4 +oAa .4 i2w ^q s6^ scg $. $l $v $k *17 .2 +0 ^A O98 -*A3z3shl +*A3 z3 shl o14 K k $9 ^l o49 +2 i5c R8 L8 $3 *32 o8q o0r -*17i3? +*17 i3? i1d R9 L9 -Z5LB.5 +Z5 LB .5 s4` s4o -suU$] +suU $] O54 y2 i6z $O u $5 $6 $7 -oAw*12p3 +oAw *12 p3 *17 i0Z i5c K $3 o21 -i5G*2AsGv +i5G *2A sGv i35 R1 R2 -*29T2 +*29 T2 i6E OB1 y1 i75 O8A -E $. [ T0 TA T6 T7 o0x i1p i4L t @@ -82952,14 +82601,14 @@ O23 o2y ] i3s ] O53 *1A ^g *13 -^Ko8Zss{ +^K o8Z ss{ r i51 -seIsL# +seI sL# f O25 iA{ O67 -y5Y4y2 +y5 Y4 y2 -B O95 -^Uo7^ +^U o7^ o35 O95 } k Z2 i3I s.r c @@ -82972,79 +82621,78 @@ p5 $r sj. O95 *29 -3 o12 +8 $f -p2^# -c*59^' +p2 ^# +c *59 ^' o40 D1 -*58[Y1 -iB!i0cd -z5qs%S +*58 [ Y1 +iB! i0c d +z5 q s%S o0l y2 O7B O42 .0 o3J ] *23 $y ^B O12 z1 O36 -o09]p3 -o9x*B6 +o09 ] p3 +o9x *B6 o8# +9 [ $K E -s6]oA&o2h -*40+A +s6] oA& o2h +*40 +A RB ^l O0A --6E*B5 +-6 E *B5 ^> i6u i51 +4 E p5 OB2 -CsdPd +C sdP d Z2 shv o0l +3 i78 L4 -$qsn0 -iAgs'vo7O +$q sn0 +iAg s'v o7O ^t ^i ^l O57 Y5 o4Y c ] $o { +1 i27 s6J l -'3 ^z O13 +'3 ^z o0j i1k o23 o17 -Z5z5 +Z5 z5 i2A { $+ O2B .7 O03 iA2 *9B ^x ^z i16 sr8 $q i3i -R6*57 +R6 *57 o4m s37 O43 +8 ^n ^u ^f O61 OB3 $ ,2 -*21kY5 +*21 k Y5 OB4 oAX -s.}$,s+' +s.} $, s+' o0 t sr@ srE srV $9 O41 T0 -K E *38 E i4[ T2 Y4 ^l sc) O9A -z5Y4u +z5 Y4 u O3B Y1 *10 o4W q ] O65 ^0 sm0 ,6 $6 so0 O13 k c *A7 -^r*5B +^r *5B O2A oB1 } $6 $2 $6 $0 -.Ao5' +.A o5' *80 +3 L4 $0 $z K @@ -83052,7 +82700,7 @@ sds +3 $z iAl O63 o0i i53 R1 L1 -o6;o8`.A +o6; o8` .A ,7 +7 $) o3u +4 *31 ^7 O68 $E @@ -83061,30 +82709,29 @@ C O47 *15 p1 o5k o3* ,4 O16 ^q y3 -,4*58*8B +,4 *58 *8B sFz slO O32 -o6s^h +o6s ^h L8 } -sQ\i7j -$!*57*A8 -[ i1P +sQ\ i7j +$! *57 *A8 O52 O62 ^x o1i ^6 ,7 O49 $% o1B ^C $- z2 --Bz5} +-B z5 } *5B O92 i8p i7# [ T0 T3 T1 T7 i7I t -RAsD" +RA sD" O62 o1! $1 o79 O82 i6p O24 -0 sei -0 -s{"o6{ +s{" o6{ ] shl *34 sas p3 l } @@ -83093,8 +82740,8 @@ z3 ^w i3J t ^P O23 y3 } *60 -i3%spK -i4zsPH +i3% spK +i4z sPH l Z2 D0 s}? O46 q o5g O14 @@ -83103,7 +82750,7 @@ q O14 *36 $% O82 *BA z3 *28 -Kss[ +K ss[ i0l i2c i1u o5! .4 O63 *30 @@ -83111,11 +82758,11 @@ O63 *30 q s8O o32 sqB *41 T5 -*41so#T5 -sR=o6u -^7'BLA +*41 so# T5 +sR= o6u +^7 'B LA T1 i25 -,2*6A +,2 *6A -6 E +B t i5* sS) @@ -83126,14 +82773,14 @@ s7E *47 O13 o9L T4 $G O03 s}| -l*81sl7 +l *81 sl7 ^2 sv9 ^4 o60 O91 +2 $3 f O12 O28 ^9 se6 $d su3 o6f *14 o2b -o3\^hsHP +o3\ ^h sHP O3A spF o31 +0 o5r i9$ @@ -83145,9 +82792,9 @@ $h O32 *25 O74 i8l sXZ *32 O83 z2 *40 *39 -dRA +d RA Z1 O46 y1 -iA\sNju +iA\ sNj u O31 O04 .0 D3 iB( O73 o2w @@ -83165,87 +82812,87 @@ i50 i72 i61 T1 TB T9 T8 R1 i03 o5G *50 l -*12s36*80 +*12 s36 *80 -6 o7e -$jK*25 +$j K *25 +5 o22 i5K l o2r i3r i7o i9a $0 $o i72 i80 iA2 i91 sat r -spoo9c +spo o9c i39 R2 R1 -*91o4n +*91 o4n [ o3p { i6s R7 O23 d -ss'i34 +ss' i34 *B9 t i71 i89 iA5 i99 *63 L6 -s3!Y3sxZ +s3! Y3 sxZ *8A i64 O69 i2j O51 '2 p2 -sq.d +sq. d [ q o4m i2n i4e i3c O0B p2 ,2 O3B OB4 O41 Y1 *3B -{z3 +{ z3 O24 $d T1 T5 TA T8 i2b O32 -i9Bo6t^m +i9B o6t ^m sAb sAz -i6pi8+*B4 +i6p i8+ *B4 T2 T9 T3 T5 spT l +5 o2z y5 ] t O25 .1 -oA_^O +oA_ ^O i46 o33 -'8cs8( +'8 c s8( T1 T5 TA T9 -do5Mq +d o5M q O24 $_ Y2 ,7 +4 i47 Y2 ,9 y1 R9 c -i9z*85Y5 +i9z *85 Y5 T2 TC T3 ^h s7_ R4 O12 -s%NsbRr +s%N sbR r E O31 T2 -^+*62D6 +^+ *62 D6 $z L8 -i15s0} +i15 s0} ^m o4c -RAo68 -*46iB5s?N -T9*B3 +RA o68 +*46 iB5 s?N +T9 *B3 ] spG OB8 Z2 -*54s'\d +*54 s'\ d $$ R6 [ i3f -1 sij o0i $f o2w sa1 i32 -p1i6c -s%2$F -$wi8o -*A8,8 +p1 i6c +s%2 $F +$w i8o +*A8 ,8 O37 i6M O05 s?4 DA O1A K -1 T1 -oBSq*83 +oBS q *83 $g z3 *03 *57 ^s i6h @@ -83268,17 +82915,17 @@ p5 O3A o5e [ O37 O41 *16 O83 *8A r *21 *05 -*08{+0 +*08 { +0 Y2 *30 i33 o7g $l o6j OA1 -,7s+v +,7 s+v $L C c oB4 Y2 *35 O62 Y3 [ s2P ^1 -*86o9)sS# +*86 o9) sS# i11 R3 saz O35 O23 O12 i21 @@ -83301,22 +82948,22 @@ L1 O41 Y1 E $7 o0/ T1 sV( f O9A -i6wTB +i6w TB O05 O81 L8 i2l +0 -o8!o7v +o8! o7v c y5 sm2 O62 +4 Z3 y2 Y2 O63 -+As z$- ++A s z $- [ i4f sb, Z4 +6 c se3 T1 O37 *14 q $R O79 -*6A^[ +*6A ^[ i51 o2y f O52 .8 O86 iA_ @@ -83330,44 +82977,44 @@ o53 .2 [ R5 k $. $a $t Y4 O41 K -sqk*B8 +sqk *B8 Z4 +2 *0A i4 O64 s7n i0k -z1*25*92 +z1 *25 *92 i01 i12 i3a i2M i4r -7 *57 i59 R1 L1 i5d i7g i6o -sL%i6i*54 +sL% i6i *54 O13 o3l i4o i6a i5n ,7 *75 s9p k s92 -8 -*80o9? -u'9s]t -sRGZ1*26 +*80 o9? +u '9 s]t +sRG Z1 *26 O13 o3x T4 TB T7 stw O78 s7 O04 -Z2*27 +Z2 *27 sy% -*97sv".2 -^9sXqs>d +*97 sv" .2 +^9 sXq s>d q s8. T6 o0$ syN syM syS -$f+2 +$f +2 OB7 ] O83 O21 LA O51 sus O78 O62 ] T0 i14 $9 $3 ss6 i35 -*24Z2Y1 +*24 Z2 Y1 *32 O83 $8 l z1 o0d $9 D1 i3b $5 @@ -83383,39 +83030,39 @@ i72 i90 i80 iA2 O32 Z2 O35 o1d D2 r i30 *31 -*65T0z5 +*65 T0 z5 *02 L3 oAq k O94 --4iAq +-4 iAq z1 ,3 *25 -i9Oy4D7 +i9O y4 D7 o3q .2 ,6 sum -^PoBI +^P oBI $< o61 $u i33 si6 $b i54 f O28 ^p O53 o7_ -sk&o4s*80 +sk& o4s *80 o0B +3 D1 o2e o33 ,2 $' *63 D7 o13 -Z3*56Z1 +Z3 *56 Z1 l $. $c $n s3g ^k ^n ^i ^m O34 T0 q i8t *64 i7o ^H -$w$2s<& +$w $2 s<& i3h i5n i4a *04 $w -s%N$" +s%N $" '8 Y2 ^4 t ^i -ss]Y2iAf +ss] Y2 iAf i65 .4 O09 o0w O34 z1 *31 *46 @@ -83428,14 +83075,14 @@ k o0d ^r O63 z1 s4d OA2 o8+ O6A -sT2s+B^3 +sT2 s+B ^3 i7o i99 i81 c sd1 -s.[,B,B -p2*32 +s.[ ,B +p2 *32 l $. $m $h ] O5B -i6(*49*38 +i6( *49 *38 O51 i6s o2l o30 sGh -6 ,2 @@ -83443,7 +83090,7 @@ i1d O05 o2g Z4 O0B y2 i8n i91 iA0 O73 R9 $x -T8s.+ +T8 s.+ s4V [ Z4 -4 ,3 *A0 O12 @@ -83455,7 +83102,7 @@ s*l T9 c i55 O62 ^" ] i40 $1 -y1*B8p2 +y1 *B8 p2 p5 OB6 +B k ,5 .2 R3 '4 ^z @@ -83470,53 +83117,52 @@ o41 o0d $B *98 o1e -3 s-b O45 -o5ps4B +o5p s4B $8 O46 z2 -,9DB +,9 DB $_ $, sl] l 'B $4 -.0.0,9 +.0 ,9 O72 R1 E $_ $' o7r O01 -$Isgn +$I sgn ^e ^g ^d ^e sl" -*96p4 +*96 p4 $6 o1h O62 T8 Z1 T4 T6 TB T8 -i7v D1 -Csuy -sX +o4l y5 +*B4 $> .1 o8! z4 s0D .2 z2 ] ^4 ] -iB/s6' -^g*84 -*37y3 +iB/ s6' +^g *84 +*37 y3 z1 o7g o2v -6 -+2Z5s2` ++2 Z5 s2` o2v -0 O94 sFR *23 DB i6O O3A -*67s+k,A -iB'D9 +*67 s+k ,A +iB' D9 o2v -3 i7^ O7B p3 z1 i2R @@ -83625,40 +83270,40 @@ i9k iAs O67 Y2 y3 O41 r O2B s&; '7 -*25Z4 +*25 Z4 O35 r *B6 O34 O94 y5 -0 o2c o7% -oAd^# +oAd ^# i5< *30 *86 ^P -o9'+2 -$o*14iBY -s_+o8$ +o9' +2 +$o *14 iBY +s_+ o8$ i3Z D7 l $t ,6 ] o5q o2y ,2 set -Z5-0 +Z5 -0 RB O02 OA5 y1 *41 $v O12 s7z { -^g*8A -*26Y1 +^g *8A +*26 Y1 Z3 i1a '4 Z5 i1h Z1 O51 *32 i12 -i4_*B6 -*69,8 -R7*38o3y +i4_ *B6 +*69 ,8 +R7 *38 o3y i9N *56 -*71*63$y +*71 *63 $y $0 oA1 Y2 *68 -*76sqS +*76 sqS s$y i1H $! *57 O96 ^| @@ -83666,34 +83311,34 @@ o2u [ *20 o1q u R9 R4 O97 T0 --9sQU +-9 sQU i52 i72 i60 i89 ] u o42 Z1 z2 D7 -oAMsg8 +oAM sg8 i18 Z2 k O43 O9A -^@s%w +^@ s%w ^q Z1 O0B sB9 y2 -Y5D0Y5 +Y5 D0 Y5 l $. $m $w -z2o0noB3 +z2 o0n oB3 '8 L2 O5B *30 L2 o7a i2a i4e i3v z2 ^I Z5 o6m -$]sw>*90 +$] sw> *90 O76 i5L -$#o9l +$# o9l i32 i40 i61 i52 ^b ^u ^h $a Z5 Z4 l O61 o0H O41 ^4 -$Iy1Y4 +$I y1 Y4 O67 O54 $2 *24 q o0s @@ -83708,11 +83353,11 @@ T1 T2 T4 TC $% $. p2 ] O9A y1 i1= -Y2*12u +Y2 *12 u o5e o6x T1 TB T7 T5 i02 i20 i10 i37 -z5,9y5 +z5 ,9 y5 C -7 OA1 sub O72 f *53 o2e @@ -83720,21 +83365,21 @@ Y1 $@ O74 *14 o0z TA RA O42 q o1f -sCVr +sCV r O92 i4t -*64y2 +*64 y2 u $+ T1 T2 T4 TA ss$ T1 +8 *14 i03 iA4 -$Ws^2 +$W s^2 *03 '9 ^B Z5 s4V $g O73 O97 y1 -T4p1*9B -i8ei3p +T4 p1 *9B +i8e i3p c $8 $5 $7 O39 D3 sA6 i17 R7 L1 @@ -83745,11 +83390,11 @@ O05 $5 o5o ,6 *61 ,3 O17 $o --AtC +-A C o07 D2 *56 *50 Z4 O4B C ^X $X -*23*5B +*23 *5B i62 i82 i71 i7U z2 ^ O78 scp @@ -83761,59 +83406,59 @@ sy] D0 O39 O43 oA- { o6v O82 -sjo$? +sjo $? L6 O06 ^% *12 } o14 l $. $m $y q DA T5 ^T -+8y4*40 ++8 y4 *40 R4 o54 K d u z1 s9Z i2m *35 o1P -3 c $o $r $a -s%^D2r -s_[Y3s'z +s%^ D2 r +s_[ Y3 s'z OB6 T7 O91 s@) s13 K -o8qq*93 +o8q q *93 *34 o42 f T1 OB4 o13 i62 O31 } y1 T4 O25 -sAB*53p5 +sAB *53 p5 [ $7 o4j -.1^t*31 -z2*1A +.1 ^t *31 +z2 *1A i11 i29 i43 i39 $l p4 $e -oA { +oA { } s0G -$"s7* +$" s7* i4o i52 o6a o8h o5H l d $i O62 *51 -slLso@ +slL so@ +5 o4p y3 $+ O74 -o9^p3 +o9^ p3 *46 O72 TB i8e i9v iAe *34 o4u R1 O95 O84 oA9 i42 i60 i50 i73 -i9I^Z +i9I ^Z i42 i60 i50 i79 i1C D2 { -ssyp5$| -,8s{h*34 -i8'*64 +ssy p5 $| +,8 s{h *34 +i8' *64 ss& y4 +8 l $. $m $z @@ -83828,12 +83473,12 @@ iF; O43 y3 k y2 $f { o1e -RBDA +RB DA *27 O07 Z2 y2 $F -sF4,5*87 +sF4 ,5 *87 O21 o6n -$ko7.+7 +$k o7. +7 ^` O08 *A9 E s5q T4 $( @@ -83842,13 +83487,13 @@ $3 L0 O75 [ $w i0q ,3 '9 -Z4'A -s;m+B +Z4 'A +s;m +B i72 K O6B i7d *50 ^b z3 sy7 OB2 -[Y2*43 +[ Y2 *43 o2e D7 $& i5w p3 $1 @@ -83860,7 +83505,7 @@ O92 L9 sa4 R2 oBr E O02 O6A -i8TZ1i6n +i8T Z1 i6n O47 Z2 o4e i9+ { o6| Y2 @@ -83872,7 +83517,7 @@ O01 l $9 u o2$ $j i49 $u p5 .0 -.4y2iBr +.4 y2 iBr i34 R5 R4 [ L1 O01 D5 k @@ -83880,7 +83525,7 @@ i0c i2a i1h E o5P *40 R0 y2 .4 ] -o2rs{s +o2r s{s q $w k *56 -3 Z2 O03 z2 @@ -83888,25 +83533,25 @@ Z2 O03 z2 o4& $8 O5B i2y $B $E -y3oBk +y3 oBk o4q o2a -d*B1 +d *B1 o17 O1B sn) s8L O42 O52 $e Y5 *19 O04 -ser*8A*32 +ser *8A *32 r K ^0 spW l ^c *34 i7b } y2 -sg3s|0sIu -sL5*03 +sg3 s|0 sIu +sL5 *03 O61 $v +4 +A oBS $e ^3 o2d O9B -T4s6> +T4 s6> '9 $x i9Z Y4 O51 '9 $& @@ -83917,38 +83562,38 @@ T1 T4 T9 T8 r $o $i $d [ D3 R0 i4y i6s i89 $1 o97 -s\yEsn2 +s\y E sn2 O83 i14 ^1 *74 -i5c*8A +i5c *8A O17 Z3 C z1 '8 i9P *43 -*50sX4f +*50 sX4 f O36 z3 -o6fse! +o6f se! oBM O03 *86 O8B -*9A*32 -s"PY3 +*9A *32 +s"P Y3 *25 syA O35 s0_ -3 z3 i4b z1 -$^sLU +$^ sLU o5k o3n K i5c ^n ^i ^k ^a ^w .3 O78 -1 O45 u +5 -s?ci18*B4 +s?c i18 *B4 i43 i61 i52 i69 D1 $5 d ] Z1 i6b O14 O83 oB= sdn -,2sLe*65 +,2 sLe *65 K i5w R2 *56 i9s iA1 iB1 @@ -83959,7 +83604,7 @@ i1e i3r i2a D4 T6 sHr ] ^0 i36 so5 i46 o50 -T2*B2 +T2 *B2 OA4 OBA i0A R4 i2a i3t i4h @@ -83968,19 +83613,19 @@ sJU Z4 O3A y5 } O04 C OB3 O48 ^f O62 o0g -*0B^}E +*0B ^} E i71 i89 iA1 i98 -i7XZ5z3 -+5s+? -sBd*02s%8 +i7X Z5 z3 ++5 s+? +sBd *02 s%8 -2 O54 $h -Y4slx +Y4 slx D7 *05 L2 -t^L$' +t ^L $' T0 T3 T8 TD R3 O43 -*26*9A -o7/,6sL! +*26 *9A +o7/ ,6 sL! sk_ } O54 *8A oB3 i30 ,4 @@ -83995,7 +83640,7 @@ p1 sy9 O28 -1 Y2 O24 *13 *45 R1 -OB3 ,0 Z2 +OB3 Z2 L5 T3 .0 *76 Y1 ,A O75 O24 @@ -84016,7 +83661,7 @@ r ^+ f { O18 *65 { [ $Q O31 T0 -*75T7 +*75 T7 i27 *16 K +4 ,6 D7 o3y @@ -84024,10 +83669,10 @@ D7 o3y O12 R9 d O1A sKA o35 } -sB4Y3 +sB4 Y3 i6l ] *B6 O38 o7t -y4*08 +y4 *08 suk s#L *20 o33 @@ -84035,11 +83680,11 @@ T0 T3 T8 TB i4a i6l i5e O05 s]o O65 $j -s'1i0p$e +s'1 i0p $e } O81 L0 O71 R6 -T1sIZ$M -*5B*43 +T1 sIZ $M +*5B *43 O7A +0 [ y2 O81 D7 i5i @@ -84049,7 +83694,7 @@ OB4 O32 *63 T1 T4 T9 T5 } $} i7s i8m iAn i9a -*47*70TB +*47 *70 TB Z2 sem iD1 iE2 iF3 iG4 iH5 O02 *34 Y1 @@ -84064,18 +83709,18 @@ z5 'A y2 O34 ,3 s7L ] o6f [ { -Y1z3$j -LAp5 -Ei0e +Y1 z3 $j +LA p5 +E i0e i2a i4g i3n i7n i9s i8e -D3*8Bi43 +D3 *8B i43 o2g *46 t Y1 O42 smt -7 i8x D9 -*A8^}} -rsf*$/ +*A8 ^} } +r sf* $/ O35 ^T +1 OB6 TB s(B E O21 *21 @@ -84087,19 +83732,18 @@ s6% O42 ] i3o ] o4o $z DA ^5 O41 -s V^] -r ^0 K +s V ^] D1 o3y +2 i61 o0f o2c -4 .5 sBS *75 -D3seAz1 +D3 seA z1 s5n *52 E -+8s}$u ++8 s}$ u i5/ O93 O86 y5 E O38 s.p s"L O19 -s!asb8*76 +s!a sb8 *76 ^n *42 Z2 O13 [ ^2 D9 $V O81 @@ -84107,9 +83751,9 @@ O04 D6 i25 O61 T0 T1 TA T7 srT O03 -.Bo1Psp{ +.B o1P sp{ $8 O03 -*09i9U +*09 i9U i37 z2 $8 O05 o1O *86 @@ -84125,11 +83769,11 @@ Z2 O23 O12 O23 ^o O14 y1 $3 Y3 ^F -sl3*2A +sl3 *2A O02 y5 -3 o5a p5 sne -sDAt +sDA t stS 'A $C $A l i7x D5 @@ -84140,7 +83784,7 @@ R0 i1% i5O y5 Y5 [ O23 O47 O73 -*03*84} +*03 *84 } ^s ^e ^c ^a ^m } } y2 *84 T2 @@ -84166,24 +83810,24 @@ y3 *13 u ,B k o0k -1 k s10 -s/;q +s/; q $r $t $y -,9D2sg2 +,9 D2 sg2 s2U *53 o47 k R2 { $W --2Z5D3 +-2 Z5 D3 -3 o57 i2s i4a i3h O94 $4 { $% -flskt +f l skt { $3 p3 ,1 r *2B O52 o2d Y1 o3e -su$L9,3 +su$ L9 ,3 K L7 sBR i5P O72 stF @@ -84192,21 +83836,21 @@ stC [ t ] stS O53 D6 -$f*96Z1 +$f *96 Z1 -7 $1 O41 ^5 [ o5x O67 o5| o4n *40 oBy D1 -s&<^O-6 +s&< ^O -6 O41 -3 D1 O36 *32 .B O71 i78 -A -*29i1{-8 +*29 i1{ -8 -7 TA -D8T3i5d +D8 T3 i5d o9Q OAB Z1 L5 o2l } o76 @@ -84232,38 +83876,37 @@ p1 i6/ i41 i52 i74 i63 i85 o0p Z3 iC1 iD9 iE6 iF9 -ks/6,5 +k s/6 ,5 T2 T5 T3 T8 s.X O42 ] -*B8o0/swJ +*B8 o0/ swJ OB7 ^< TB ^J O15 z1 -3 d -y3 E *35 ^F *37 sh. i2. i2n i4l i3a } ^9 o0b $3 -o3#sPq +o3# sPq y4 O82 } } s1W } Z2 k o6c $e -*17*B5 +*17 *B5 -1 i55 L2 Z1 i8Y E O39 -ko9[L0 +k o9[ L0 s&@ O53 { -*78D8 +*78 D8 o3d *45 ,3 y3 i4a i9. } ^r '8 $/ *73 -*15[*85 +*15 [ *85 T0 T3 T8 TA .3 z2 o2g y1 @@ -84272,7 +83915,7 @@ y2 O19 O23 Z2 ^h $f o60 $1 u i11 i32 -*18L7sp+ +*18 L7 sp+ ss6 $B L0 u O14 *84 } @@ -84280,8 +83923,8 @@ sp1 T2 O3B sKa sSc O17 k ^8 O93 -*B4i9O -*89o4G{ +*B4 i9O +*89 o4G { i23 *63 Z1 O76 ,6 .5 O32 @@ -84293,20 +83936,20 @@ O9A O45 i1u $e o4t $w O45 p5 k $P -o6v*72K +o6v *72 K D4 ^f Z2 o5s -,8sDd-4 +,8 sDd -4 $X +8 ] T2 O41 iBV i4e i61 i5s -$`sQKt +$` sQK t T3 TB TA T8 O75 ,2 -L1CiAM -soty4 -,A.8 +L1 C iAM +sot y4 +,A .8 oBp p3 i3c i5t i4a o4N se_ @@ -84322,10 +83965,10 @@ O98 p3 u $K Z4 O73 D9 i5A -sB`Y4 +sB` Y4 *24 OAB { ^w ^o ^r ^h ^t -^Vs4\ +^V s4\ s`M s9F O49 Z4 *5A O65 *AB s7a O46 @@ -84342,7 +83985,7 @@ s8w $x o2u i4e i5e o3t o9p stL iAx E -*45sIRi7# +*45 sIR i7# i8i i9n iAe O45 -6 [ *09 @@ -84356,10 +83999,10 @@ O25 K O45 O32 *53 -4 o51 O21 ^3 r *06 -i9vz4Z5 +i9v z4 Z5 d Z1 Y1 u i11 i31 i51 i71 -i1T'7 +i1T '7 O58 s7h slO i6Z o3o O65 @@ -84368,18 +84011,18 @@ O81 o7b R0 shd *80 O47 Z4 y2 i9m -s2f$U +s2f $U ^m ^u ^r -sg?s4V -s>T*B1sQ3 +sg? s4V +s>T *B1 sQ3 TA O5B y3 [ OB1 i42 +7 -*28i1B +*28 i1B z3 p1 -C'B +C 'B { i68 -E^=s+a +E ^= s+a Z4 i2u sp5 C i4F i61 i83 i72 @@ -84391,14 +84034,13 @@ o25 z1 s/A s/o ^d ^o ^r -O32 E *69 o83 o7v $, *79 -i9Y*B7 +i9Y *B7 sJW O06 z4 o1d *12 sdi l -s}D*73 +s}D *73 T3 TA T4 T5 ^o ^t ^c ^e y4 OA2 O72 @@ -84409,33 +84051,33 @@ Y2 $a s&R [ o5t ^t -7 -usA& -ki4bs+v -$TsTVoAn +u sA& +k i4b s+v +$T sTV oAn ^K O14 u o0< sl] ,2 O61 O75 s7A *52 -5 z2 ] OA8 -[Z1i7s -Y5D6 --0*45RB +[ Z1 i7s +Y5 D6 +-0 *45 RB *60 K c $2 $7 $8 -$/^r +$/ ^r z2 i4i l $e $r $y -Y3z2,B +Y3 z2 ,B .0 +2 O3A [ s?b O3B k -sp7o6W +sp7 o6W +3 i3d o0M $2 O91 OA3 -^b*A7i2} -*A8*21^y +^b *A7 i2} +*A8 *21 ^y *82 i3l k *13 K *60 ^c @@ -84443,7 +84085,7 @@ o81 [ *56 sgo ,6 O03 { O56 o7D -y5^- +y5 ^- O02 TA O62 O07 D6 ,6 @@ -84454,7 +84096,7 @@ Z2 Z4 r d $t $y c $7 $3 $2 o7a s\G -Y5,9p4 +Y5 ,9 p4 -2 $i ^| OB9 O52 ^m @@ -84464,9 +84106,9 @@ $w o0s RB O74 $$ i8C O2A $w y2 -sKHs=" +sKH s=" i8s iA2 i91 -z2t +z2 t i6s Y1 O73 i6i i81 i7e $4 sxm @@ -84475,7 +84117,7 @@ sr8 +4 i2v O62 p1 *1B *B2 ^" *51 -.BsVN +.B sVN *94 O57 +8 *BA K ^t ^s ^e ^f @@ -84489,26 +84131,26 @@ o1c ^p .5 r i5c $^ Z2 O3A f -T1} +T1 } i0e *93 o1o O58 -9 ^f O35 o0l o1c i2c ] o4b -E*61*3B -sYE*37o8% +E *61 *3B +sYE *37 o8% o0f i4a *90 i1_ O81 *24 O72 i6P o0f i4k i0i ] -*46y4sq< +*46 y4 sq< O04 y2 +2 oA/ +B i2H *31 O37 [ o4L O93 o94 T3 i2n i4r i3e -saqiAPy3 +saq iAP y3 p1 o0d o7m O04 $b $o @@ -84517,7 +84159,7 @@ $= *04 .5 ^, ,3 s1* i1u *52 -^J*A3 +^J *A3 T8 R7 sgv o7` OA9 ,9 $^ $s @@ -84525,16 +84167,16 @@ o2X D9 O6B T2 T4 T8 T3 ] i4a $9 O31 -z2*8Ay2 +z2 *8A y2 sHm D2 o2y $5 Y3 -z5*58 +z5 *58 ,4 i49 i9e $S $h Z2 O32 -T5i9T*37 -RB]sjf +T5 i9T *37 +RB ] sjf O12 iB? ] i4d t o6Z @@ -84550,13 +84192,12 @@ i5n i7s i6e T4 ^I o2u +3 o59 *34 -O05 ^m ^o .2 o20 f O58 Z2 sMs *47 T3 o6u -7 -iBHs6i +iBH s6i O52 ^f ^4 O35 ^r O7B @@ -84582,29 +84223,28 @@ O31 *29 z4 O65 *83 $k +8 O94 -o6j OA1 E L5 u o3s ^a .6 *68 *40 -R5TB +R5 TB i82 iA0 i90 iB9 z4 Z1 O76 i2- O61 $A D2 -*B3s4< +*B3 s4< O63 sda y4 -c^t -s]FoBh +c ^t +s]F oBh *40 O34 u O31 Y5 [ O58 O71 -i5JTB +i5J TB D5 O01 +4 +5 ^p { *43 ^a sjz ^k K o1D *59 -Z4iB|s;E +Z4 iB| s;E O58 *34 sj' s#! @@ -84633,7 +84273,7 @@ O06 O0B ] O59 sra sjR } d o5- k -s(u*2Asy# +s(u *2A sy# ^ ^p ^o ^t *59 '7 *05 o4u @@ -84656,14 +84296,14 @@ s2Z L1 DB ^W *31 o3d K $e +3 -L2*50$E +L2 *50 $E i4y *20 -y4sKYK +y4 sKY K O92 $k s24 +1 o63 R7 -*84*9B -sh6y3R2 +*84 *9B +sh6 y3 R2 s9b p1 o4G { *32 O47 @@ -84671,11 +84311,11 @@ s3Q { s6c ^7 $E O68 O0B O95 -o1sp1 +o1s p1 ^_ *32 sfK D6 $^ O12 -i5Ps_D +i5P s_D Y2 O9B *07 c o5b o4o @@ -84690,19 +84330,19 @@ o62 .3 o1n k y4 O87 O58 i63 i89 i76 -skA*49-A +skA *49 -A oBE D0 c i10 i01 $k $i -i8t.9 +i8t .9 y2 oBb L5 $N O65 sPk t o3+ O41 -Z4p5l +Z4 p5 l i0s O62 } r { -$gC*3B +$g C *3B O67 o62 *05 D7 $5 oB2 @@ -84719,7 +84359,7 @@ Z4 ^X *35 $6 y3 L3 s4c O64 o08 -i7z^i +i7z ^i o0s R3 s50 +6 ^N *23 @@ -84728,11 +84368,11 @@ O21 [ i55 Y1 o1G $T O16 o0i o3d -swisvW +swi svW i01 i12 i34 i23 p3 k ,8 c sd$ -*70i74y2 +*70 i74 y2 $2 Z2 O23 Z1 o0s *34 O06 s&; @@ -84751,7 +84391,7 @@ o2h D5 i24 ] sNr O28 r Z2 O76 -Y2*56o4t +Y2 *56 o4t $w { Y2 $6 O75 ^N @@ -84761,9 +84401,8 @@ z2 s2L d O03 -5 O32 y1 O2A d R5 O79 --4 Y1 C y4 q DB -CstA] +C stA ] O43 $s O95 r *38 O91 @@ -84784,16 +84423,15 @@ OAB u q y3 O67 o7+ s f i2v ^z } -sa2oB;Y3 +sa2 oB; Y3 T3 TA T9 T6 -*0Bz3$p -$w*60s)> -d^k +*0B z3 $p +$w *60 s)> +d ^k *01 ] O51 O73 +8 -O02 O43 *74 i3R O08 -s bo1Ou +s b o1O u f O48 sh/ q .B y5 -5 O01 @@ -84809,7 +84447,7 @@ z1 O2A *15 ^N O39 O85 iB! Z3 T8 -RAR5D7 +RA R5 D7 *3A O19 o0e ^B y3 z5 @@ -84817,18 +84455,18 @@ y3 z5 $a D5 O98 sNv O03 D6 -*60sxg*03 +*60 sxg *03 O34 '5 i2n *40 i23 -0 -o6&L7,5 +o6& L7 ,5 ] ^w *38 o0f -*36sY< +*36 sY< sae D0 s.o $d R0 -uo6F +u o6F s.e o0e ^s $n O84 @@ -84842,26 +84480,24 @@ OA1 y4 O2A $& p1 Y1 O31 D6 i8a C -$N [ Z2 o7M +8 L7 K $1 -5 -T8o5Ts0? +T8 o5T s0? O08 y5 T1 o5E i4y $1 i6s i89 o97 -L9o6.^h +L9 o6. ^h ^d ^i ^o ^v sfF *70 i9i iA1 iB2 -${sWM +${ sWM z1 O67 z4 O5A O32 .B O13 D0 Y2 O31 ^R O3A O45 *71 -s5n E *52 O02 D5 *10 $M $n .B OA3 ,2 @@ -84883,163 +84519,163 @@ o0v o4o O51 z1 *23 OB7 O36 ^( ^q t -*A9z2 +*A9 z2 *35 $} sc[ O8A O76 i3s y3 O69 d L3 -6 i11 i56 -RBR2 -Y3z5,2 +RB R2 +Y3 z5 i70 i35 i1b i7f i7c i36 -$}$} +$} $} i57 i7c i51 i17 -$;$? -$}$> +$; $? +$} $> *1B K O08 spi -4 } *52 -6 i16 i3b -$)$. +$) $. .0 *38 -$($} -$($` -$($\ +$( $} +$( $` +$( $\ -4 z2 Z1 -$+${ -$^$[ +$+ ${ +$^ $[ sTf i11 K -$]$. +$] $. k Y3 O71 i7c i17 -$]$^ -$|$* -$|$$ -$|$& -$<$~ -$=$' +$] $^ +$| $* +$| $$ +$| $& +$< $~ +$= $' i54 i37 i15 i5d -$|$^ -$+$> +$| $^ +$+ $> L3 -4 *A9 *A5 i58 i13 i58 i12 ^v O79 i5c i39 -$<$[ -$+$( +$< $[ +$+ $( [ ^p $1 o48 D1 -$!$[ +$! $[ i50 +8 -$<$( +$< $( $7 +2 i3d i4l i61 *67 $9 o0a o1i i7c i12 O02 ^k -$<$] -$<$^ -$ $= -$<$& -$\$& +$< $] +$< $^ +$ $= +$< $& +$\ $& i34 i16 i13 i7b i13 i7c -$<$- -$\$~ +$< $- +$\ $~ +0 *56 i5b i30 y2 $. O73 i3f i17 -$#$[ +$# $[ i14 i7f i39 i5d i18 i3f -$-$\ +$- $\ O02 ^d -$%$] +$% $] i7b i31 -$%$; +$% $; i7c i39 i40 ^2 i33 i7f p2 O0B +4 oA0 K -s4h.1sWX +s4h .1 sWX $f Z1 +4 -$#$, +$# $, i59 i7d i59 i7f i0- o7r $n $q i7c i14 i37 i1b -$$$\ +$$ $\ o9s 'A O7B R4 i8v } OAB -$"$@ -$"$^ +$" $@ +$" $^ i19 i3c -$`$\ -i21i39i46i51 -$"$$ +$` $\ +i21 i39 i46 i51 +$" $$ i16 i7b i16 i7f p3 O1A o5< O02 ^4 i77 i15 -i6&sqM +i6& sqM i15 i3a $n ^n i3d i15 T2 T8 TB TA -oAVsSt*41 +oAV sSt *41 O0A ^S -$[$" +$[ $" D6 i31 -$~$> -$~$< -$~$. -$~$] +$~ $> +$~ $< +$~ $. +$~ $] i36 i7b -$}$- +$} $- c $i $n $a i38 i5b i33 i16 -$,$[ -$,$\ +$, $[ +$, $\ O54 +3 i33 i5f -$,$^ +$, $^ $g $7 O39 ^; -*A0.4*08 +*A0 .4 *08 K O59 O54 -$>$~ -$>$| -$>$_ -$>$@ +$> $~ +$> $| +$> $_ +$> $@ i78 i13 -$>$' -$>$% +$> $' +$> $% 'A *87 -$^${ +$^ ${ o2m *57 sc2 OB2 } o42 -*65^"t +*65 ^" t p4 o0@ D5 -i12i20i31i45 +i12 i20 i31 i45 i1f i36 i14 i78 i12 i79 @@ -85049,46 +84685,46 @@ k Y1 i0s i2k i3e i41 o2z i2t i7b i57 -$^$> +$^ $> i59 i13 i50 i37 -$'$, -$'$# -${$' +$' $, +$' $# +${ $' $2 o6e k ^k D2 -${$- -${$, -${$= +${ $- +${ $, +${ $= i16 i5c -${$] -${$\ -$[$+ +${ $] +${ $\ +$[ $+ i3f i55 -$[$) +$[ $) i0n O13 K -$[$> +$[ $> T2 TB T4 i59 i1c -$[$_ -$[${ -$'$@ -$'${ -$.${ -$'$~ +$[ $_ +$[ ${ +$' $@ +$' ${ +$. ${ +$' $~ i3f i13 -$'$) +$' $) *03 o27 -$$$< +$$ $< DB oA* i19 i5c i70 i15 i59 i3f -sQWs^WsHt -$&$[ -$&$] -$;$= -$;$< +sQW s^W sHt +$& $[ +$& $] +$; $= +$; $< i7d i30 k o33 O62 .A O78 @@ -85099,19 +84735,19 @@ O09 l Z3 y2 i3b i18 i75 O8B -^g*45Y4 +^g *45 Y4 i35 i17 $z D2 u -i9 -$'$; +oBT sRu +$/ $| +$/ $! +$/ $& +$\ $> +$' $; ^q ] i36 i18 i36 i5d -$|$( -$|$- +$| $( +$| $- i59 i15 i1f i77 -$V$0*B5 +$V $0 *B5 O59 Y5 *0A o0G Z1 -$|*20o9z -*68*71.6 +$| *20 o9z +*68 *71 .6 Y2 o45 -5 -i7PT8TB +i7P T8 TB i55 i7e i33 i7c i55 i7b @@ -85156,79 +84792,79 @@ i18 i5b i75 i37 O31 o2j i50 i7c -$;$} +$; $} ^w ^e ^n ^a i3a i16 Y1 O02 *43 ] y4 [ sqZ -s.Osul -o5Du*82 +s.O sul +o5D u *82 i2m +1 s03 T3 -+9+E ++9 +E i15 i5c -$!$| +$! $| s.# i74 i39 -$-$# -$-$% -$-$& +$- $# +$- $% +$- $& Z2 oB5 -$-$, +$- $, -6 ^s -$`$> -$-$} +$` $> +$- $} $o $z Z4 OA7 sgj *2A O75 .0 i1z f { [ -$`$| -$^$~ +$` $| +$^ $~ o7i +8 i75 i14 i1t ,9 o66 *24 c $3 $8 $5 Z3 t OB4 -sB's*C +sB' s*C y1 *02 O51 O04 *74 o0k o6k sq8 -*90sHwsvS +*90 sHw svS $y O52 t i7b i30 -$"$\ +$" $\ l $. $v $c i18 i79 $8 O14 -$,$> +$, $> sr3 sb5 $6 o4b $5 o0o y1 ^z O94 *7B -$_$] -$?$; -$?$, -$?$^ +$_ $] +$? $; +$? $, +$? $^ OA2 Z4 iD1 iE9 iF9 iG5 -$?${ -$?$} -$;$$ +$? ${ +$? $} +$; $$ i54 i1c -lsaY +l saY i54 i15 O31 ^9 y1 -*59.2 -o2n[Y1 -[s{8oAx +*59 .2 +o2n [ Y1 +[ s{8 oAx s#o O51 i08 O68 o9= o41 y4 OB1 -KoAY +K oAY t i5X O23 o4l f +7 @@ -85242,14 +84878,14 @@ O85 +5 O41 $6 o9` O01 p1 $y O03 -*79$oz3 +*79 $o z3 ^s ^m ^i ^s '4 ^S r $i $c $l $e -9 *0A O72 T0 T2 TC i3e i42 i50 -r*BA +r *BA D6 o4k O21 -7 O48 D4 Z2 @@ -85270,7 +84906,7 @@ o5y O64 *0A O76 i69 .5 K i31 i59 i41 -su#s[.*51 +su# s[. *51 $$ i0* *73 'A Y2 o8e O61 @@ -85279,9 +84915,9 @@ OB9 O74 { o49 ] *84 i6c t +8 -,B[ss2 +,B [ ss2 i8l i91 iA1 -^(*38 +^( *38 O8A D9 O42 i6. o31 *21 @@ -85291,15 +84927,15 @@ o81 $4 p4 o0l ] o1c i2c o4b o2j ^k i6d i8r i7e -$;o9Y +$; o9Y $k $1 s`W O65 st. -*56i6G +*56 i6G s95 O45 L1 i1o ssN O12 Z1 ^x ^j Z2 -$4s<@$& +$4 s<@ $& O12 '5 *20 O23 O04 -7 *38 @@ -85312,25 +84948,25 @@ o61 p3 sg4 k o3o s7o ^z O72 -sc`o4G +sc` o4G o2j +3 *43 iBy O43 OB4 c $. $b $e [ Z1 +5 -T7Z1*4A +T7 Z1 *4A O13 i3_ o1a $a i6o o8k o5m -s$8*06o4r +s$8 *06 o4r l $. $l $k O21 $h ^p ^o ^t ^s *31 o0L E $^ Z2 l o5m -*31o2y +*31 o2y } +0 i31 o56 *78 -*15uiAA +*15 u iAA o1L [ sLe O13 i41 i9_ O45 @@ -85338,7 +84974,7 @@ i46 *61 -3 'A o62 ,1 T0 T1 T9 TB --A^] +-A ^] srN D3 $1 o3o i3v Z1 @@ -85346,7 +84982,7 @@ O29 $y -7 O04 $B O62 O5B OA2 p4 -c*4B^; +c *4B ^; ^A $5 t f O3B Z2 ^l @@ -85359,7 +84995,7 @@ o0z $c o2a *56 se0 $w D6 $s D4 ^w Z5 O26 -qy3 +q y3 $5 i42 Z1 o24 ,3 .5 @@ -85369,13 +85005,13 @@ y1 O52 Y2 o1e D4 o4c O17 -1 y3 r O41 --9*68Y5 +-9 *68 Y5 oA0 DB q *53 i71 D1 c $b $o $l $d -B D4 ] -o8)LB +o8) LB ^2 .3 sNm p2 OB3 o6F O05 @@ -85394,16 +85030,15 @@ O56 O47 O46 '7 p5 +5 o0y y5 OA3 -$Do9_.A +$D o9_ .A o0T o1B O6B R0 -sHq*54Z3 +sHq *54 Z3 O13 '9 i7o ,6 k +5 o62 t O72 D0 -y4 O67 E -DB*60 +DB *60 sbv D5 u $2 $0 $1 $3 O62 si4 @@ -85411,7 +85046,7 @@ o0S ] i14 i35 $9 ss6 $3 f O57 o5d o0T T3 -*83^3D2 +*83 ^3 D2 o1a o3t i5i i6a O1A t O73 y5 @@ -85420,9 +85055,9 @@ shg Z2 o3a k o48 Z4 *78 O15 -*3B*89 +*3B *89 smq -0 -]*02i6w +] *02 i6w i9a iBd iAn t Y2 ,7 O05 O6B @@ -85433,7 +85068,7 @@ O6B .2 K k y2 -4 $z *54 O06 suz s,7 -.3z2*4B +.3 z2 *4B O63 srw O51 k ^r sC> O8B R9 @@ -85443,11 +85078,11 @@ O3B oA& o41 $l *75 sh4 iA0 O25 o0? ^! -*31o9+*28 +*31 o9+ *28 -5 i2d d seg $0 z2 -*09sz9 +*09 sz9 $+ o85 O12 +7 o8R *21 @@ -85466,7 +85101,7 @@ iA- O1B R5 ^s ^e ^d ^i o1U c $9 $7 o7a $2 -sfLi9V +sfL i9V iEt o3$ Z2 o0r q u @@ -85481,7 +85116,7 @@ OA9 +8 OB4 $z O21 D4 i7s [ o1j -Cp4 +C p4 T0 T2 T8 TA z4 D4 O24 se2 o59 $4 sc0 o3f @@ -85489,18 +85124,18 @@ i2n i4i i3d o7s *41 [ o1z o7a .5 -Z5o5e +Z5 o5e [ o1x s5l k sfp O71 -uo4ss') +u o4s s') o2e i38 i5e i6a oAg -i6us@*Y2 +i6u s@* Y2 o54 ] D5 $9 $4 D2 i3b ^r ^g -sd8i7O +sd8 i7O z1 D4 shQ i23 ,6 *23 o1f @@ -85527,33 +85162,33 @@ o06 O61 -2 ,3 y1 O17 ^q ,7 D5 -uKo2R +u K o2R OA4 Z4 ] O62 .2 ,1 -Kui1K +K u i1K Z3 o9r o6i i6v ^Y p5 { i0m o3v ] Z2 O42 O3B T2 -sCSs#* +sCS s#* *A2 O76 k -2 -3 OB1 syl *25 *60 -R8^wZ1 -s=hz4 -y2,AZ5 +R8 ^w Z1 +s=h z4 +y2 ,A Z5 i3i i5e i4n K r i51 *08 Z1 -szEsSL +szE sSL stq -i6q*03 +i6q *03 .5 *21 O42 i48 -i8Qz5 +i8Q z5 ,1 -0 r ] { O91 o99 @@ -85563,24 +85198,24 @@ c $. $i $n *94 O64 '7 sEU O14 *23 ] -skP*46u +skP *46 u O03 y4 *56 o6f 'A -*91sl0 +*91 sl0 O58 *39 sr5 +2 i2r o5g *12 o1h $3 i4p ] -*48,6o34 -s>hD8k +*48 ,6 o34 +s>h D8 k z5 *91 O46 o68 .5 K o4t u +0 i4a O45 T0 $5 -i8 +i7T s5> o5s o44 O12 c i4m O6B O52 @@ -86098,8 +85730,8 @@ o49 *02 o3g E *54 O58 y5 r s0 K -*9Bo3+ -z3o5u +*9B o3+ +z3 o5u O8B sec *B0 y1 O61 O84 O1A q T8 @@ -86111,9 +85743,9 @@ s0& i3& [ s?j O69 $x -sg&^# +sg& ^# OB4 O82 *BA -o2k*A6o4j +o2k *A6 o4j R8 o7x O02 o5g t o33 @@ -86129,7 +85761,7 @@ i66 ] *63 u o76 O02 o5z u o78 -s73y5 +s73 y5 r $w $i $s $e ^B i1b D2 o1t @@ -86141,7 +85773,7 @@ i2z '7 s.z l O51 o5* .4 *40 q -i0v^[ +i0v ^[ sk' O53 R4 $5 O83 s$s { @@ -86151,7 +85783,7 @@ t s<+ O23 i2x '8 *60 O56 i2i D5 -s?!o0U*56 +s?! o0U *56 K y3 O7B z2 ^a $c y2 o2j @@ -86165,7 +85797,7 @@ y4 Z3 O58 y3 *62 sGx *13 R1 -o6\y1 +o6\ y1 $z *50 O43 T3 TA T4 T8 o50 d @@ -86178,7 +85810,7 @@ D6 z3 p4 ^^ y2 *98 O36 ^U -,1oB$K +,1 oB$ K ^e ^z ,4 i2i ^p ^m ^e ^h @@ -86199,7 +85831,7 @@ scr so3 .5 $7 o3s $5 K -*64+3TA +*64 +3 TA *4B O93 *06 o39 O24 $u @@ -86248,7 +85880,7 @@ o3n i2k $p O76 -8 *07 K *04 sik p5 -sNhi7Bz3 +sNh i7B z3 D9 ,6 O63 Z5 { i2x @@ -86257,20 +85889,19 @@ sc9 i9! oAi o8e y4 *71 s7e K -oAZ*51 -o5q$e +oAZ *51 +o5q $e sw1 sw5 s!P ] ^9 O45 i5- '8 -y2^9{ +y2 ^9 { i34 Y4 o4o $8 s5X O12 O34 D5 s<_ -p3 Y2 O4A s/P *16 y2 .9 O72 @@ -86294,7 +85925,7 @@ O45 Y2 [ ] R7 $. $a $d D5 s7n -T6i3R +T6 i3R i2r O43 skg ] l d $5 @@ -86344,13 +85975,13 @@ i4, $2 ssg ,4 O95 t srp o4d -*41$kL7 +*41 $k L7 *74 O56 $? o6i +3 O38 O26 i0] -o5?oAH +o5? oAH i5* ,6 -sX1sAi +sX1 sAi O49 R5 i3v O01 { st5 q @@ -86358,11 +85989,11 @@ y2 t *75 *B7 O64 sm^ $1 t O62 $1 ^; -.AR5 +.A R5 i0e sn_ T6 i0@ -rD4*45 -RB^` +r D4 *45 +RB ^` c ^7 $/ OB7 ^( O36 O8A R9 @@ -86382,11 +86013,11 @@ $^ ^0 c $` $2 $1 ^| c ^7 $# -i8s^^ +i8s ^^ ^w i0c *37 $4 O43 *56 -Ku*93 +K u *93 ^p O5B y2 '6 ^l D1 c ^7 $$ @@ -86406,14 +86037,14 @@ p2 O64 u c ^8 $. o58 -4 c ^8 $- -$#*50 +$# *50 c ^8 $( ^r ^e ^u ^a ^b -{i9UL1 +{ i9U L1 d O32 Z1 $6 O26 OB4 s.{ -y4Y5 +y4 Y5 { Z1 *31 O32 d '6 $8 ^[ @@ -86439,13 +86070,13 @@ i3r [ i4i O65 $8 ^, s`R -^P^Js.) +^P ^J s.) $8 ^% o5c D3 *27 ^u $f o4o $y *7A T4 *7A T2 -L8$-z2 +L8 $- z2 ^a ^v ^i ^s $? ^4 $? ^. @@ -86455,15 +86086,15 @@ i5a i7e i6t sgk i6u p5 *27 i2i *53 -oAh*89L4 +oAh *89 L4 i6e O21 -]o6?^I +] o6? ^I i3d '8 s!q O14 -s&9sG. +s&9 sG. i4a O71 k O27 i4p -s3^i22L8 +s3^ i22 L8 $) ^9 y2 r ^t c ^( $0 @@ -86491,7 +86122,7 @@ c $0 ^. i7e i82 i91 ^@ ^9 sjP O79 -+AiA$ ++A iA$ O36 ^2 ^@ ^0 ^@ ^5 @@ -86502,26 +86133,26 @@ $4 ^# i3- snq D8 $e ^p ] i0j -c ^ $2 +c ^ $2 $4 ^+ -4 O71 $8 ^, ^7 c $< $5 c ^2 $= c $~ ^~ -*63s @@ -86688,7 +86319,6 @@ $7 ^| LA sC{ O13 o8x K O54 y5 o5v -o0Z c ^e ^r ^o ^s sb5 u i1i -0 @@ -86711,38 +86341,38 @@ o4s $1 +3 D2 ^2 ^% ^2 ^$ -i9wsA7 +i9w sA7 ^e ^t ^i ^l ^e ] o3h ^2 ^, -[.7,9 +[ .7 ,9 $y $1 O64 -*6Ao9X +*6A o9X c ^0 $. ^8 ^) o44 ] -uY1} +u Y1 } c ^0 $% -*56} +*56 } O0B -B c ^0 $_ -*B6*62i3! -sljz1$n -L4L1 +*B6 *62 i3! +slj z1 $n +L4 L1 $` ^9 Z1 se7 -$=*B9*04 +$= *B9 *04 *15 O6A sC" s.d O87 -i5AT7s9d +i5A T7 s9d O8A q $3 ^) ^2 ^_ $3 ^% o6z u c ^0 $@ -+A$6 ++A $6 c $` $8 ^2 ^` c $ $# @@ -86763,24 +86393,24 @@ i5O l Y3 K .1 *47 ^y ^t ^s ^i ^m $s $c O13 -.8o0-D3 +.8 o0- D3 c ^5 $* i34 *61 c ^5 $$ -*52*7A +*52 *7A o4K '6 { k *16 o1e O31 *52 .2 -i6"d -oBu$) -*B4o8B -*86sx8 +i6" d +oBu $) +*B4 o8B +*86 sx8 D5 *43 $9 -RBi8$ -o9{z1RB +RB i8$ +o9{ z1 RB c ^* $3 -iBWsvMY2 +iBW svM Y2 p3 +7 o1o o4r R5 *42 ^e ^l ^c ^n ^u @@ -86791,10 +86421,10 @@ c ^5 $@ K O76 O84 i25 -3 o2& -*97sC* +*97 sC* o4i +4 Z1 $s $f -z3i87i1O +z3 i87 i1O o8u ] i0b O13 -4 c ^ ^7 @@ -86808,7 +86438,7 @@ T1 o2w Z1 t r ^6 ^# $% ^@ -Z5,9 +Z5 ,9 ^6 ^) ^6 ^, o2e k [ @@ -86820,8 +86450,8 @@ c $& $5 $ O13 $7 $- ^1 ^( -i2R*4A --5q +i2R *4A +-5 q ^w ^h ^1 ^, i8k } O32 @@ -86831,14 +86461,14 @@ c $; $5 $e Y3 O24 c $; $7 c $; $8 -*57sahs#v +*57 sah s#v } D2 Y2 ^w ^s s?= i19 ,2 c ^$ $6 O12 y4 -^Q*48 +^Q *48 O12 y2 $9 ^& T0 TD T9 T3 @@ -86846,7 +86476,7 @@ T0 TD T9 T3 c $` $5 $9 ^> c $` $7 -ksw4Z2 +k sw4 Z2 c $` $3 ^) O03 se. $9 ^7 @@ -86861,9 +86491,9 @@ O0B ^S y2 o0h $9 ^~ *5A p4 -sjYsw=r +sjY sw= r c $~ ^4 -ui8k^' +u i8k ^' $7 p2 c $2 $( c $2 $) @@ -86871,20 +86501,20 @@ T0 R3 *27 O4B c $2 $" c $2 $> -*91rZ2 +*91 r Z2 r Y1 *47 O71 o5u c ^. $7 -y4y5 +y4 y5 sb4 -9 O03 sqh -A s3. u -*5A*A8E +*5A *A8 E oAq K O08 z4 z3 o21 -s+_$e$x +s+_ $e $x -5 *14 c $< $9 -7 ^e @@ -86905,7 +86535,7 @@ DA $1 ^8 ^. ^8 ^; ^8 ^> -sqZ$; +sqZ $; c $4 $) c $9 ^^ ^; ^1 @@ -86922,16 +86552,15 @@ k D2 +6 ^5 ^. E z5 O34 ^5 ^* -R4sW@ +R4 sW@ ^5 ^) o3z -2 O31 p2 ^5 ^% c ^/ ^1 *42 k ^3 -p2^p{ -Y3Z5 -i39 O12 $6 +p2 ^p { +Y3 Z5 q sud OA3 o0i Z2 c $4 $~ @@ -86941,10 +86570,10 @@ o5n *45 ] ^e ^r ^o ^b O06 ^w Y3 O14 ^2 ^5 -p1i8i +p1 i8i O43 y3 +4 OA4 OA3 -o3(.A +o3( .A ^4 ^= i75 *16 c T5 ss$ @@ -86953,7 +86582,7 @@ s,Y OA3 o3o o2c o52 *53 o30 O65 -Ks^U +K s^U +1 p4 OA3 c ^_ ^3 c ^_ ^2 @@ -86963,22 +86592,22 @@ c o1- c ^2 $# c ^2 $, q *14 -*2AR3 +*2A R3 c ^2 $/ -$ns#$^M +$n s#$ ^M { o2d -*76-2RB +*76 -2 RB *A4 OA2 -8 O03 OB2 z3 o2b L8 [ -Y4o4TL8 +Y4 o4T L8 ^} ^1 D9 o9e c ^@ ^5 -i0usg& +i0u sg& O65 *7A -*45Y4 +*45 Y4 c $~ $6 c $~ $7 $+ ^5 @@ -86991,9 +86620,9 @@ O94 O47 ^& ^0 ^& ^7 O16 Y1 -*0As@y +*0A s@y o2b L5 -qi4h +q i4h c ^9 ^. c ^9 ^, c ^9 ^* @@ -87005,10 +86634,10 @@ c ^9 ^! c $3 $] o0l i2e i4- i5a O26 $. *43 -Z4p1 +Z4 p1 o0@ O24 +4 Z2 -s$[L4*89 +s$[ L4 *89 o7Z c c $3 $; c $3 $= @@ -87029,7 +86658,7 @@ c $1 ^> ,3 p1 c ^1 ^= O21 o0T -szf*71sW{ +szf *71 sW{ T2 TD TA c ^1 ^+ .1 y4 @@ -87046,7 +86675,7 @@ y1 ^x O97 $] ^1 c ^2 ^$ O18 *40 -kK*82 +k K *82 c ^2 ^- c ^6 ^~ ^3 d @@ -87060,7 +86689,7 @@ O21 i5^ ^0 ^. ^0 ^# ^0 ^$ -i9V*6B*3B +i9V *6B *3B ^0 ^= ^0 ^> $6 ^_ @@ -87072,25 +86701,25 @@ $6 ^_ y4 O26 o69 i42 O91 O02 y4 E -$=*B6[ +$= *B6 [ ^3 ^$ C -4 O83 $& d ] ^3 ^= c $+ ^9 -y3*13svw +y3 *13 svw o0j ss1 i9t iAc iBh -spydt +spy d t s0x k o4, i44 Y1 sb8 -scGTA +scG TA $/ ^3 c ^3 $$ sj2 ^3 ^^ -so^,BsTA +so^ ,B sTA ] o8y r R4 } c $9 $[ @@ -87101,7 +86730,7 @@ O23 z2 Y2 c ^< $2 c ^< $3 O21 i1d -*07*B2t +*07 *B2 t c ^( $3 o8u D4 $` ^2 @@ -87116,10 +86745,10 @@ T0 T4 T8 T2 K O61 *54 O12 $h i5m O03 -i5*s[. +i5* s[. o97 T0 o3. O4B r -*07s&Z +*07 s&Z $} ^0 sdi *32 ^4 ^& @@ -87138,12 +86767,12 @@ O12 $5 $ D1 K f ] ^v ^k -sjo*0B +sjo *0B R6 o1y ^e ^c ^a ^r ^t -$uL7 +$u L7 ^w O51 snX -sY2Z2s0G +sY2 Z2 s0G ^% K *01 i8x D9 *32 O02 ^T @@ -87153,8 +86782,8 @@ OB5 iBi O6B O58 { R0 z1 .1 o4p -suJ-0*52 -$Ai9gz4 +suJ -0 *52 +$A i9g z4 o1+ t o4k D7 sjz K ^k @@ -87163,26 +86792,26 @@ O28 l ^7 ^` c $? $4 ^o ^s ^e ^p -{R0 +{ R0 c $1 ^} $3 R2 i4e i2W o17 *14 sc- OA3 ^7 ^$ -L0sQ< +L0 sQ< o4k o3o [ o2- o0z o0c sea ^7 ^- ^T t ^a O13 c '7 -T1z4 +T1 z4 ^h O23 i32 p3 c $% $2 -p1iBB -o5q,1 +p1 iBB +o5q ,1 Z5 k O79 c $% $4 u O64 @@ -87199,8 +86828,8 @@ i2H c *93 y1 O03 *25 O75 .2 o4c -*B1ssVz1 -s3muz4 +*B1 ssV z1 +s3m u z4 f O19 c $5 ^= [ Z1 R2 @@ -87219,16 +86848,16 @@ c ^$ ^9 c ^$ ^# c $$ ^9 i9e iAr iB7 -i7<*1A -sa>o9Z +i7< *1A +sa> o9Z c $$ ^1 c $$ ^6 c $5 ^_ $J ^S K Z4 *15 -y5'7T4 +y5 '7 T4 i27 +3 -*61*59} +*61 *59 } L1 i3e Y2 K O52 $6 ^~ @@ -87236,9 +86865,9 @@ o2t o3u l $. $p $w Z5 O72 Z2 c $/ $5 -$HT6 +$H T6 Z1 O16 D5 -*82o2\*71 +*82 o2\ *71 c ^9 $* T4 TB T8 T9 O34 *01 *62 @@ -87255,7 +86884,7 @@ i5/ T6 O1B Z2 ^s ^i ^n ^e ^d O9B s&S -*30snd +*30 snd i2c D8 c $# ^~ Y4 O6A @@ -87266,51 +86895,51 @@ sBW ^9 ^$ ^o *10 Z2 c $ ^1 -Y4Y4s6| +Y4 Y4 s6| O26 $F c $1 $( o79 D6 -T2*73Z1 +T2 *73 Z1 c $1 ${ -3 T0 l $. $p $f L0 +0 ,1 -sFcsx2 +sFc sx2 *42 o2g ^t c $1 $[ $4 ^` o1w ^s -L9s@b +L9 s@b c ^- ^6 c ^- ^8 ^+ ^0 Z3 +5 O6A c $h $a $d ^+ ^4 -sKbi9ss," +sKb i9s s," $4 ^^ c ^@ ^8 c ^@ ^9 -iB|*20sSc +iB| *20 sSc ^= ^4 ^= ^5 -^Vs7L +^V s7L $8 R1 ^= ^8 ^= ^9 O32 ^3 -sFo*B9 +sFo *B9 o10 o74 T2 o63 $$ K s/u Z4 O49 Z4 c $1 $2 $3 $^ -K*6By1 +K *6B y1 sj8 -Y1DBsiu +Y1 DB siu o2q +A -Z2iATC +Z2 iAT C { q Z2 O32 ^c c ^? ^1 @@ -87328,14 +86957,14 @@ c ^) ^5 ^/ ^6 ^/ ^0 R1 i01 -s.m^[*2B +s.m ^[ *2B D3 +4 i51 O13 O91 T2 T9 T5 O32 ^u c $) ^6 o18 o60 -*73sC- +*73 sC- O74 .9 *97 ] c ^ ^5 @@ -87362,7 +86991,7 @@ c ^9 ^( $4 ^< c ^3 ^! c ^9 ^$ -iBWlsj1 +iBW l sj1 i0s i2e i1h c $^ $0 iBu q @@ -87373,10 +87002,10 @@ c $3 $^ c ^0 ^= c $2 ^~ c ^0 ^- -s5Hi4p +s5H i4p ^& ^m i6l sln *15 -OA1 ,0 o8q +OA1 o8q ^7 s80 R3 ^q O06 c ^? $3 @@ -87387,19 +87016,19 @@ c ^4 ^, o3a $1 c ^. $3 c ^. $8 -lsi1so0 +l si1 so0 c $% ^1 c ^4 ^_ c ^4 ^~ O37 OB6 [ O46 ^U -^w-5 +^w -5 O5A ^& O21 o3h c $/ $4 p3 O92 O03 *50 O26 Z5 -D9o3E +D9 o3E $> ^7 $> ^8 c $2 ^+ @@ -87411,19 +87040,19 @@ O53 $q *24 OA3 .5 c ^% ^7 ^6 ^@ -*B2sam} +*B2 sam } c ^& ^2 -sy%i1LDB +sy% i1L DB *34 O04 Y1 o2r *21 -i3Js8"t +i3J s8" t c ^9 $? c $6 $; L5 -2 c $6 $= c $6 $# ^s ^n ^e ^w ^o -o77s6$o4- +o77 s6$ o4- c $6 $( c $6 $) sn6 @@ -87431,10 +87060,10 @@ c $6 $, i3b '8 c ${ $1 z3 i28 -s8sq +s8s q u i9U O86 z3 i26 -t*84^M +t *84 ^M Z1 O03 $0 T0 *90 O03 s14 @@ -87442,44 +87071,44 @@ OB8 sMT c $? ^0 +5 d siU ,7 l -$W*58 -^[oA@ +$W *58 +^[ oA@ ,6 Z1 [ -*3B[z4 -o1zZ1y4 +*3B [ z4 +o1z Z1 y4 [ q z4 z3 *65 -$EY3L7 +$E Y3 L7 c ^1 $( r $i $o $u $s [ *78 O4B -s9)^kz1 +s9) ^k z1 .8 O13 ,2 -*A4i65 -.8i7hs"5 +*A4 i65 +.8 i7h s"5 ^2 *40 -o0>*A7 +o0> *A7 i1a i2b i3b -*70*A3sok +*70 *A3 sok svJ c $7 $, -sg=*79*60 +sg= *79 *60 *79 *A9 -p5^O +p5 ^O O43 i44 o6e o0t O27 '8 c $0 ^& -o5bD2.7 -c ^ $5 -c ^ $4 -R9i7` +o5b D2 .7 +c ^ $5 +c ^ $4 +R9 i7` ^9 C O85 O5B sAe -]y5.4 -*50*2B +] y5 .4 +*50 *2B y2 +7 *56 -*73sf4T4 +*73 sf4 T4 D9 *61 $s $d d svt @@ -87487,25 +87116,25 @@ c $7 ^~ ^` ^1 O86 $h c $[ $2 -$[syF +$[ syF c $7 ^& K o1a O03 i4q i4h OB8 ,8 c ^% ^2 -Z2y5 +Z2 y5 O09 D6 c $7 ^0 O51 *02 o37 -sGOs07 -o8w*87 -^ws!B^D +sGO s07 +o8w *87 +^w s!B ^D Y2 u $B y2 o8v O35 i99 iA8 iB5 O15 Y3 q Y1 [ o2k -*79s9} +*79 s9} O9B O36 i4t o5h +7 +8 K @@ -87515,23 +87144,23 @@ $# ^9 Y2 O43 } c $2 D4 c $) $6 -D1i7_scA +D1 i7_ scA c $) $3 -9 .A [ sK" o15 .2 $7 si0 $2 O14 z1 z5 -{o3m +{ o3m O39 i4# c ^0 ^! +6 p1 'A o2O u O9B 'A u sVX -snRo6$ -sj!s&6 -sHCskS -oBTC,2 +snR o6$ +sj! s&6 +sHC skS +oBT C ,2 O5B [ -8 L0 o5c z2 .4 .2 @@ -87549,12 +87178,12 @@ $, ^6 $, ^5 $, ^3 $, ^2 -^%*80{ +^% *80 { O23 $0 i5N *56 *A0 OB8 ^9 ^. -^Ds|,*41 +^D s|, *41 $( ^3 $( ^6 c ^( ^1 @@ -87568,9 +87197,9 @@ c ^% ^5 c $' $1 ^6 ^_ ^e ^y ^k ^s -T4sHE*63 +T4 sHE *63 sau *57 -i2rY2sj6 +i2r Y2 sj6 c $ ^7 ^1 ^% $6 ^` @@ -87586,11 +87215,10 @@ $6 ^7 c o86 $6 ^( $6 ^+ -$0 [ $6 ^/ -*86s@3 +*86 s@3 $6 ^! -C$[ +C $[ i4s O02 c ^, ^7 +0 s{8 O08 @@ -87618,7 +87246,7 @@ O0B C z2 +5 *31 *24 O4A O72 OA7 i0Q -^]} +^] } ^8 u $5 ^/ ] *28 @@ -87627,14 +87255,14 @@ $5 ^& { k Z3 c $7 $= O82 o60 -s9ji3jz2 +s9j i3j z2 $< ^$ ] i59 $p u -5 O42 $1 c $7 $) o3s *45 -},A*09 +} ,A *09 *84 O34 o6n o2f +0 c $7 $] @@ -87643,14 +87271,14 @@ OB5 d $# ^7 $# ^4 $# ^2 -}oABy2 +} oAB y2 $# ^0 k ^f O32 o2a O71 O01 s[S i7W ^! C i2f .1 -s&ys_9sRr +s&y s_9 sRr $2 ^~ c $5 $( srp ,1 O47 @@ -87658,11 +87286,11 @@ $9 ^/ R3 i2e $9 ^( i34 -0 -q*73 +q *73 $z E O63 Z5 OA6 -iBdi4O -dsW<^v +iBd i4O +d sW< ^v *3A T1 $2 ^% ^b ^a ^c @@ -87685,7 +87313,7 @@ O7B *50 k K *13 C $0 $8 $9 $w O43 -*79c +*79 c i9i O2A T4 ^t ^u ^p C $2 $1 $0 @@ -87693,12 +87321,12 @@ c $4 $8 $5 O56 O1A c $7 $8 $0 d O26 O02 -^=oB_,9 +^= oB_ ,9 ^j O09 -s!wi9JoAo +s!w i9J oAo ,7 *B9 s"^ ,B O04 -y1y5s)s +y1 y5 s)s o20 p2 O03 *93 d ^M @@ -87710,13 +87338,13 @@ sg. *B8 C $0 $5 $9 C $7 $9 $3 O87 k -sRy*6BL0 +sRy *6B L0 O29 } c $3 $8 $6 u $4 $8 $6 K *40 c i4g i5e i6r -iBL.9L4 +iBL .9 L4 i47 *30 sIP i3m L0 @@ -87725,7 +87353,7 @@ s.* K C $3 $6 $9 q p1 O7A $d o0f -z3*AB +z3 *AB C TA D8 z1 O15 K i62 @@ -87736,7 +87364,7 @@ D4 z1 T7 p2 O36 z4 oDa -R9seK +R9 seK O71 $. ^2 O13 Z1 +0 *35 @@ -87747,7 +87375,7 @@ D4 OA7 K ^a O25 C $6 $4 $3 O71 Y5 -l*A3^p +l *A3 ^p o49 i53 o02 o11 C $2 $3 $6 @@ -87786,12 +87414,12 @@ C $3 $4 $0 C $7 $4 $6 C $3 $4 $5 C $6 $3 $8 -TBZ4 +TB Z4 o2v OA2 *31 R0 p3 i32 [ Y3 O48 -sH!csMg +sH! c sMg $1 *28 $9 *16 sTk @@ -87817,8 +87445,8 @@ K o3r D4 *42 *32 i4y .5 s!o O72 T9 -skLi2u -o7g*97.6 +skL i2u +o7g *97 .6 Y3 O41 i0s u $9 $1 $6 p3 -5 @@ -87865,8 +87493,8 @@ f T8 O08 $? O03 c y2 C $5 $6 $2 -+AR4 -sWs-7 ++A R4 +sWs -7 O73 { u $4 $7 $3 C $7 $4 $1 @@ -87888,7 +87516,7 @@ C $9 $1 $2 { *92 C $6 $9 $0 Z1 o3q -^u*96*18 +^u *96 *18 y5 ,2 i7* ] E sy1 @@ -87899,7 +87527,7 @@ sKq *03 q 'B Z1 r .3 D2 -^]sq8slL +^] sq8 slL $c Z5 C $4 $2 $0 k [ sau @@ -87911,7 +87539,6 @@ c $7 $1 $6 d O5A swU i33 $0 C $1 $4 $5 -y3 E O62 C $2 $5 $1 $* O52 -3 i33 $6 @@ -87923,7 +87550,7 @@ r i20 -0 C $0 $1 $2 C $0 $1 $3 c $4 $2 $8 -sP@[y2 +sP@ [ y2 c $8 $0 $6 c $3 $4 $9 c $6 $4 $1 @@ -87933,19 +87560,19 @@ O96 k p5 O57 O19 t R2 i3a iAs -lo8`*0B -^rz3 +l o8` *0B +^r z3 O5A *B6 ^o O24 s58 +3 OA2 i8x *42 c $6 $4 $2 -L7Y2*5A +L7 Y2 *5A $1 r ^3 C $7 $4 $5 i10 ^H C $2 $3 $4 -sDUR1 +sDU R1 C $7 $5 $9 O4A Y5 O12 ^l @@ -87955,13 +87582,13 @@ o1D u L6 o0t c $0 $6 $9 o3g +7 -*06TAZ4 +*06 TA Z4 y4 O25 $u Y3 $F i3i i4a i5d o8i Z5 Y1 u R9 *49 -i3koAgC +i3k oAg C Z1 *B8 *80 *A0 *16 *62 @@ -87970,9 +87597,9 @@ sgq +7 Z1 *28 st/ T0 T6 TC TD -}*2B +} *2B C $9 $1 $6 -*A4Y2i7l +*A4 Y2 i7l c $6 $7 $9 sbo O03 o60 Y2 @@ -87982,7 +87609,7 @@ c $7 $2 $0 sAp .5 o0h .5 C $6 $7 $8 -Y4.6 +Y4 .6 o0h .4 $x T1 o14 $7 @@ -88026,7 +87653,7 @@ i3a L7 R2 { ^f i17 R5 R3 i13 R3 R4 -k i2 s4; +k i2 s4; i11 L2 L6 i74 R5 L7 i3f L6 L1 @@ -88049,12 +87676,12 @@ i73 R1 R6 i55 R4 R3 i7a L9 R7 i7f L6 R7 -s&B*1B +s&B *1B i5b L7 L1 o5e [ i7e R1 R2 i5d L0 L7 -*A9{q +*A9 { q i51 R6 L0 i14 R4 R3 i35 R4 R0 @@ -88113,9 +87740,9 @@ i39 R5 R0 i7a L4 i53 L3 R2 i5b L2 R5 -sL*4B +o6= $> *4B i21 i39 i56 i47 i51 i69 i80 i78 o15 i5g $7 o3b @@ -89593,21 +89211,21 @@ $2 i31 i31 i49 i69 i57 i31 i49 i69 i58 i31 i49 i69 i59 -Y4*1AD9 +Y4 *1A D9 Z3 *49 '6 snX c ] $. 'B Y5 O06 O23 *12 -.6tR5 +.6 t R5 E s08 -{{{{{{ -i9OLB +{ { { { { { +i9O LB z2 O04 d O92 D7 srg u -s)No6} -*85sj@ +s)N o6} +*85 sj@ OB9 OA1 O34 Y1 O74 $@ Z1 $O O9B @@ -89686,7 +89304,6 @@ $0 o30 i0h i1e i2a u $9 $6 $3 u $3 $5 $7 -f ] O37 c $6 $2 $4 u $1 $3 $0 i84 O42 @@ -89695,7 +89312,7 @@ c $a $s $e u '5 $2 } i3N C '5 $6 -]oAa +] oAa O37 o0V } i3G O96 z4 @@ -89707,55 +89324,55 @@ O93 R5 o2c z2 o6T O1A oBm *A7 -y3*74t -y3sq)s'Q +y3 *74 t +y3 sq) s'Q i1i i2e i3r -'As!v*94 +'A s!v *94 p2 sx) -i7'sw# +i7' sw# i2c o3k o0k -5 ] i61 -.4Z4o01 +.4 Z4 o01 sb0 +0 +4 ^n z4 -{*89sx+ +{ *89 sx+ $6 r +5 L2 ^b ^` L0 -1 r O68 -l^d^e +l ^d ^e O4B OB1 i3z z1 O03 -ss%*78*97 +ss% *78 *97 o5. T4 -l^f^c -l^f^a -l^f^6 +l ^f ^c +l ^f ^a +l ^f ^6 Y2 o0t -$_'BY1 -l^f^2 -l^f^1 -l^f^8 -l^d^4 -l^d^1 +$_ 'B Y1 +l ^f ^2 +l ^f ^1 +l ^f ^8 +l ^d ^4 +l ^d ^1 ^k i2G -l^d^2 -l^d^9 -l^d^8 +l ^d ^2 +l ^d ^9 +l ^d ^8 r f O59 -iC4iD2iE0 +iC4 iD2 iE0 i7r i8r i9y -l^1^a -l^3^f +l ^1 ^a +l ^3 ^f } f O69 -l^3^e -l^3^9 -l^3^6 +l ^3 ^e +l ^3 ^9 +l ^3 ^6 O46 *56 -l^3^4 -l^3^5 -y3*91sG" +l ^3 ^4 +l ^3 ^5 +y3 *91 sG" *4A O07 sJe Z2 D2 i12 @@ -89764,117 +89381,116 @@ O12 y1 i0z o0T D5 'A i5" o5n ^a ^n ^u ^t -l^9^5 +l ^9 ^5 o0m i1e i3c i4s i5c O86 *16 sz> i0n i2t i1a i5/ O91 -l^9^3 -l^9^8 +l ^9 ^3 +l ^9 ^8 Z1 o2p O51 ^d -l^7^9 -l^7^3 +l ^7 ^9 +l ^7 ^3 Z5 O75 D5 -l^7^6 +l ^7 ^6 ^v $a -l^7^5 -ui7o^H +l ^7 ^5 +u i7o ^H y4 O76 R3 -l^5^5 +l ^5 ^5 { O79 sfx -l^9^a +l ^9 ^a i68 [ *31 -l^5^d -l^5^e -l^7^b -l^7^d -l^7^e +l ^5 ^d +l ^5 ^e +l ^7 ^b +l ^7 ^d +l ^7 ^e Y4 O2B -l^b^9 -l^b^8 -l^b^2 -l^b^1 +l ^b ^9 +l ^b ^8 +l ^b ^2 +l ^b ^1 O13 Y3 D4 o9x ^` iB1 iC9 iD5 iE2 T4 TA T8 -l^b^b +l ^b ^b p2 'B ^I t -l^b^d -l^0^c -l^0^b -l^2^c -l^2^b +l ^b ^d +l ^0 ^c +l ^0 ^b +l ^2 ^c +l ^2 ^b ^E s6A -l^2^e -l^2^d -l^2^9 -l^2^8 +l ^2 ^e +l ^2 ^d +l ^2 ^9 +l ^2 ^8 l o7K O43 D8 $4 -l^2^7 -l^2^6 -l^2^5 -l^2^4 -i8F*AB +l ^2 ^7 +l ^2 ^6 +l ^2 ^5 +l ^2 ^4 +i8F *AB *87 OB6 O41 R6 $z o2* O01 -l^8^3 -l^8^2 -*74s+n +l ^8 ^3 +l ^8 ^2 +*74 s+n O32 o2j -l^8^9 +l ^8 ^9 z3 o5b -l^6^7 +l ^6 ^7 d $a $n -l^6^5 -l^6^2 +l ^6 ^5 +l ^6 ^2 d $a $l l o7` R8 O43 O32 -l^4^3 -l^4^9 -l^6^e -l^6^d +l ^4 ^3 +l ^4 ^9 +l ^6 ^e +l ^6 ^d O53 *24 $q -l^8^c -l^8^b -l^8^d +l ^8 ^c +l ^8 ^b +l ^8 ^d $? L4 sPU O21 o0y .2 -l^4^d +l ^4 ^d -7 o2a i1l E *10 o2h si) ^e ^d ^a ^b -c o0S R5 i60 -l^a^5 -l^a^1 -l^a^2 +l ^a ^5 +l ^a ^1 +l ^a ^2 p1 O02 o1- $I $p O08 -l^e^1 -l^e^3 +l ^e ^1 +l ^e ^3 *03 o3x -l^e^6 +l ^e ^6 O67 *2A i4^ -l^c^6 -l^c^7 +l ^c ^6 +l ^c ^7 T1 T6 T7 T8 -l^c^5 -l^c^3 -l^c^1 +l ^c ^5 +l ^c ^3 +l ^c ^1 L5 { *30 k i15 -l^c^e -l^c^b -sxn*08 +l ^c ^e +l ^c ^b +sxn *08 i5e i7s i6r OB8 o0) i2e i3x i4a @@ -89889,7 +89505,7 @@ L8 R9 sB; *25 syA *17 O52 i3x -*28o3hi6i +*28 o3h i6i *73 *72 C srW C $A T2 @@ -89901,8 +89517,8 @@ O1A O5B i5a i6n i72 T1 T9 TA T2 } ^F c -i9v{ -s,.s]g +i9v { +s,. s]g ^z y4 i3j o2D sg= @@ -89910,22 +89526,22 @@ sGW z3 o3r +5 p1 *30 oA5 T0 -z5sR( +z5 sR( Z2 i6z i1a i3e i2t O56 ^r $b i2o i34 i4b ,7 o9a -z3,9$5 +z3 ,9 $5 d Z3 +3 o5b -i0Fsi|i8L +i0F si| i8L i7c O01 O32 -]'7z5 -,Bp5 +] '7 z5 +,B p5 o4m $5 ^J $k -RB*48 -sneiB9K +RB *48 +sne iB9 K p5 Z1 { '6 ${ t i1, @@ -89934,20 +89550,20 @@ c D4 $2 $h O6B O64 Y5 i3g { i29 -o9k^"C +o9k ^" C r OA1 ^o p2 i8M *B8 -^$szo +^$ szo O32 d ^s s?- $e i5/ f c ^i ^t ^n ^a R5 i2o $a c k -^lY1 -s'3s&# +^l Y1 +s'3 s&# D3 O43 -sv.z1 +sv. z1 Z2 *31 r O4A o1q ^@ ,B @@ -89955,7 +89571,7 @@ O12 o5, p5 *92 +8 *B1 *62 i8q -R9s$Gi7/ +R9 s$G i7/ R6 z2 *17 *01 d $k y5 +B @@ -89968,22 +89584,21 @@ O8B *62 ,2 i8f $w O67 -4 O01 i54 -*87 E -s"wT4^I +s"w T4 ^I s5. O23 sVT } r o3R R4 O63 *43 o2X s3B -t*63C +*63 C } *50 K -z4sK| +z4 sK| O31 ^^ -7 i8+ O06 -*52*B2 +*52 *B2 p1 o7h *83 r -sxko6;$G +sxk o6; $G o3e sRK i3o i41 i52 D4 +2 @@ -89991,13 +89606,13 @@ ssc *09 c ^t ^f ^o ^s s7q O48 [ O82 O94 -y4*12s[3 +y4 *12 s[3 s_e '6 $$ -$8s7. +$8 s7. sd *50 O13 f O02 -o1SsEX +o1S sEX L1 -4 i3K T0 ^n ^o ^j @@ -90008,7 +89623,7 @@ s[z O19 +1 o4{ *24 *25 z2 O41 -s.0z4z2 +s.0 z4 z2 $# ^J [ i21 o62 +4 i2P @@ -90016,12 +89631,12 @@ $# ^J K *8B s8\ shP C -*B5i3x +*B5 i3x -1 d i4C '6 sX& shy L6 -*38{ +*38 { l L4 *23 sxv +6 O14 ^q q @@ -90038,246 +89653,246 @@ i2s O43 *06 OB2 -3 u '7 $b T0 -*6Aqy1 +*6A q y1 i1U .B O01 sa` O89 *1B -srjo5+K -$^*A7 +srj o5+ K +$^ *A7 -5 +3 R3 s0( c ^e ^n ^i ^l ^; p2 O67 -sW4o9r +sW4 o9r i9e iA9 K Z3 +B s5b L0 $) O89 [ T3 T6 TC -p5*6A -cL8i3w +p5 *6A +c L8 i3w ^w t o3B -o13y5sNK +o13 y5 sNK $a R2 ^k ^n ^u ^k ^s -sN!i7G +sN! i7G i9e iA6 -*17$7 -$9R9Z2 +*17 $7 +$9 R9 Z2 sr3 sb5 o4b $6 $5 c $3 $7 $9 --0*59s"| -RAo8A -*7Bi9!sfg +-0 *59 s"| +RA o8A +*7B i9! sfg $\ O4B oBe O12 k O29 c $6 $7 $0 -c^1^e -c$4$a +c ^1 ^e +c $4 $a p1 *43 -$1$B -sZJsQJ -$9$D -c^B^a -.9} -u$f$d +$1 $B +sZJ sQJ +$9 $D +c ^B ^a +.9 } +u $f $d $T Y3 i9e iAv -^1^A -^1^F -u^0^6 -$d$A -c$d$F -u^8^F -u^4^d +^1 ^A +^1 ^F +u ^0 ^6 +$d $A +c $d $F +u ^8 ^F +u ^4 ^d d *45 -c$d$b -c$d$c -$D$2 +c $d $b +c $d $c +$D $2 i9e iAa -u^4^4 -u^4^2 +u ^4 ^4 +u ^4 ^2 ^p ^i ^z -u$F$d -u$F$e -u$3$E -u$F$a -u$E$B -c$d$3 -*04*32sV\ -$D$e -^5^B -c$a$c -}Y4y2 +u $F $d +u $F $e +u $3 $E +u $F $a +u $E $B +c $d $3 +*04 *32 sV\ +$D $e +^5 ^B +c $a $c +} Y4 y2 z4 ^e O38 -u^f^8 -c$D$9 -c$a$F -c$a$x +u ^f ^8 +c $D $9 +c $a $F +c $a $x i1l i2a i3c -c$e$b +c $e $b O14 ^e ^x Y4 -u$5$d -c$e$C -c$e$A +u $5 $d +c $e $C +c $e $A ^o ^g ^r ^a ^m -u^3^F -c^b^e -c$3$E -u$6$E -u$6$f +u ^3 ^F +c ^b ^e +c $3 $E +u $6 $E +u $6 $f C D5 sx| -u^b^c -u^f^A +u ^b ^c +u ^f ^A [ D4 Z3 -u^d^b -u^d^c -u^f^f +u ^d ^b +u ^d ^c +u ^f ^f sr@ OB6 -c$B$a -u^f^5 -c$B$B -c^3^x -u^d^4 -$B$9 -$B$5 -$B$0 -$A$7 -u^F^D -$B$x -c$0$e -$4$D -$4$E -u^6^e -c$0$x -u$b$8 -c^x^4 -c$b$E -u$c$8 -u^0^e -u$c$b +c $B $a +u ^f ^5 +c $B $B +c ^3 ^x +u ^d ^4 +$B $9 +$B $5 +$B $0 +$A $7 +u ^F ^D +$B $x +c $0 $e +$4 $D +$4 $E +u ^6 ^e +c $0 $x +u $b $8 +c ^x ^4 +c $b $E +u $c $8 +u ^0 ^e +u $c $b z2 i7o -c^x^5 +c ^x ^5 '5 d ^B -u$d$3 +u $d $3 l $. $i $o ^a ^g ^l ^a -u^5^4 -u^E^4 -u^C^E -c$C$8 -c$C$2 -c^E^9 -c^B^2 -^4^F -c^B^B -$1$F -c$C$B -c^D^A -*82*84s$W -u^3^f -u^3^e +u ^5 ^4 +u ^E ^4 +u ^C ^E +c $C $8 +c $C $2 +c ^E ^9 +c ^B ^2 +^4 ^F +c ^B ^B +$1 $F +c $C $B +c ^D ^A +*82 *84 s$W +u ^3 ^f +u ^3 ^e ^1 $0 *01 -$C$3 +$C $3 o15 $7 i5g o3b -u^1^4 -c^0^f +u ^1 ^4 +c ^0 ^f i1a i3a i2b -u^9^C -u$2$a +u ^9 ^C +u $2 $a i7e i80 i90 -c$c$4 -u$b$d -$C$9 +c $c $4 +u $b $d +$C $9 o5s i83 O31 OB1 *19 sbt ,3 -u$7$a -$4$C -^F^C -c$4$e -c^4^F -c$F$E -$E$x -c$F$a -c^A^2 -u$F$7 -u^d^0 -u$8$A -c$5$a -c^f^9 -u^a^x -u^c^c +u $7 $a +$4 $C +^F ^C +c $4 $e +c ^4 ^F +c $F $E +$E $x +c $F $a +c ^A ^2 +u $F $7 +u ^d ^0 +u $8 $A +c $5 $a +c ^f ^9 +u ^a ^x +u ^c ^c O28 L0 -c$2$a +c $2 $a O12 '8 u -c$2$c -u^c^8 -u^c^6 -u^a^2 -u^e^5 -u^e^4 +c $2 $c +u ^c ^8 +u ^c ^6 +u ^a ^2 +u ^e ^5 +u ^e ^4 O65 C O42 Y3 OA4 Y2 -*92*36o83 +*92 *36 o83 O2A z1 i17 -s\2*61 +s\2 *61 C -7 -*72DBq -^zp3 -sb&o9m -st-*34o3c +*72 DB q +^z p3 +sb& o9m +st- *34 o3c O07 *2A R7 oA^ ^i ^d ^u ^a -sc6rsSk +sc6 r sSk O46 *6A -o2$s|R +o2$ s|R oAL y4 *09 O37 s l -.Bs>s +.B s>s sE/ p4 OB3 -*8A*9A +*8A *9A sby l ^e ^k ^a ^h ^s O14 o4< o4m O67 T0 TA T2 T7 -o6`*38 -^zo1Z*2A +o6` *38 +^z o1Z *2A t O17 +0 *82 O48 -szy*62 +szy *62 O01 i5n O8B o3p } -^4^A -*52D2 +^4 ^A +*52 D2 z2 ^4 -sjez4s=K -i1xs/k*AB +sje z4 s=K +i1x s/k *AB i82 i90 iB3 iA2 -D4i79i9< -*09s8MY5 +D4 i79 i9< +*09 s8M Y5 i42 i70 i50 i61 t +2 i9" } O1A O27 i5C O67 { o6` -*06^_ +*06 ^_ i41 i59 i72 i69 *46 OB9 ,1 q ^a O6B o1M o77 *A7 -o4Q-9f +o4Q -9 f i2L '5 -s)Ms!J +s)M s!J O12 ^1 o7v O1B O39 -D7Z5Z3 -y3.6*29 +D7 Z5 Z3 +y3 .6 *29 '9 $' o6B O32 T0 T5 T1 T2 T7 @@ -90292,9 +89907,9 @@ l $0 $4 $3 l $0 $4 $9 i5a i6r i7s l $5 $8 $1 -oB$sWm +oB$ sWm T0 TA T2 T6 T8 --3C +-3 C l '9 $0 l '9 $4 c sGI @@ -90308,7 +89923,7 @@ o22 *60 D6 o0O T2 $i O09 i5e so9 i6n i71 RA -sq&E +sq& E ^a ^E $s $h $i $m O16 *08 *92 @@ -90322,7 +89937,7 @@ $3 $B p1 *32 '7 o5. *45 l $3 $4 $8 -}$=s&a +} $= s&a l $3 $4 $7 l $3 $4 $6 l $3 $4 $1 @@ -90356,7 +89971,7 @@ O56 o4s '8 O03 sy! +0 +4 $$ oAZ O64 -^?sl4 +^? sl4 *04 $y l $3 $1 $6 p4 *42 r @@ -90374,7 +89989,7 @@ u p2 O76 l $6 $8 $7 l $6 $8 $1 o46 *84 -Z5r +Z5 r D0 ^@ o43 s1. *57 l $9 $5 $0 @@ -90386,7 +90001,7 @@ s7n O36 i0k d s0k O7B t $* z4 -3 -Y2sqW +Y2 sqW ^E ^a ^E ^C l $0 $5 $4 @@ -90403,7 +90018,7 @@ i37 i1f l $2 $6 $8 Z2 $. o0r o2p -usJ1oBo +u sJ1 oBo '6 D2 c ^D ^5 O6A 'B @@ -90418,7 +90033,7 @@ $B $3 $B $7 $E $7 Y3 d -snp{p1 +snp { p1 ^j O39 ^3 ^A ^3 ^B @@ -90426,13 +90041,13 @@ c $l $i $k $e f Y1 l $. $s $v o1a k -Y4D1 +Y4 D1 i4w .5 O26 O83 O56 ^^ *05 $] o3[ -*86*7Ap4 -*64*42sF[ +*86 *7A p4 +*64 *42 sF[ O42 ^I ^Z z2 o19 f @@ -90442,7 +90057,7 @@ l $. $s $r c $4 $D d *28 O13 O7A *87 u -L5]o7. +L5 ] o7. l $3 $7 $0 s0, D0 l $. $s $o @@ -90464,14 +90079,14 @@ o2; *31 l $8 $9 $3 l $8 $9 $2 i2i i3c i4k .7 +6 -LAs|O +LA s|O sF. o6/ $6 i2~ -Cs8qp1 +C s8q p1 iE4 iF2 iG0 l $3 $0 $1 -sE+iBn +sE+ iBn l $3 $0 $2 sb, O49 l $3 $0 $7 @@ -90498,22 +90113,22 @@ l $9 $4 $0 l $9 $4 $8 $. T6 u i4! -s 2sy* +s 2 sy* s0X p4 *5A -*70iA5 -s(\i5< +*70 iA5 +s(\ i5< ^D } R3 *16 r O4B l $5 $3 $0 l -4 c ^E ^C l $5 $9 $4 -tkZ3 +t k Z3 ^u $f $y o4o l $2 $7 $1 l $2 $7 $3 -*93z1z3 +*93 z1 z3 *21 sdE O24 l $5 $3 $4 o5T O72 @@ -90528,16 +90143,16 @@ u i4J i9o iA1 iB1 $F $U u ^3 ^B -s&uk -^?*2B +s&u k +^? *2B i0j *02 ^u o4o $f $y ,1 *50 T3 T9 T5 T4 TA -*B4r.4 +*B4 r .4 l $5 $9 $0 l $5 $9 $2 -^(sp% +^( sp% $5 +3 L8 i4e ,2 l $0 $1 $8 @@ -90551,15 +90166,15 @@ $< ^> ^T $1 l $3 $6 $2 l $3 $6 $1 -sfSo3Cs'i +sfS o3C s'i o3b O52 l $3 $6 $8 z3 *06 L5 O86 -^]Z3*51 +^] Z3 *51 ,7 +6 Y2 s#0 sDK O47 -RAZ2y3 +RA Z2 y3 ^p ^i ^t z3 *07 $s O13 $c @@ -90569,12 +90184,12 @@ l $1 $7 $6 *98 *31 l $9 $2 $1 l $9 $2 $3 -R3sHzi9I +R3 sHz i9I c $i $v $a l $9 $2 $7 l $9 $2 $6 l $9 $2 $8 -suMi4k +suM i4k c $C $1 c $C $4 O26 ^b skr @@ -90587,12 +90202,12 @@ OB4 *50 svw o0M d C 'B $4 -s,xi6$ +s,x i6$ O19 ^& u $1 $6 $7 O68 i2d K l $1 $8 $9 -z4sR{ +z4 sR{ +1 O84 c ^a ^i ^d sv] @@ -90610,7 +90225,7 @@ OB2 O74 '7 $s O13 *92 *01 T0 T4 T2 T9 -^NC +^N C O34 $& O23 Y2 z2 O82 i7h @@ -90621,7 +90236,7 @@ i4. r $i $j scH [ p3 -r$XsHU +r $X sHU se& c c $x $8 c $x $9 @@ -90652,13 +90267,13 @@ c $e $B c $e $E $y i1p O27 o61 i52 -y2^ry2 -ls$Lo9q +y2 ^r y2 +l s$L o9q O64 O23 -*01sdbs r +*01 sdb s r O14 ^& r l L1 -sWVL3} +sWV L3 } O43 $4 D8 $@ u t [ O32 @@ -90693,7 +90308,7 @@ i2l i4a i3l l $1 $6 $2 o1a i2u i4. i5s i8e O5B i34 -Y3s'cZ3 +Y3 s'c Z3 $a O27 u $7 $x c $B $1 @@ -90707,7 +90322,7 @@ D9 r u $0 $D *30 { u i68 Z2 -E^n +E ^n l $3 $2 $8 l ^w ^o ^t f OA1 @@ -90730,7 +90345,7 @@ Z2 *51 l $4 $9 $5 l $4 $9 $0 l $4 $9 $3 -p3sl` +p3 sl` ^7 z4 l $6 $7 $5 l $6 $7 $4 @@ -90747,8 +90362,8 @@ c $7 $3 $8 u $D $8 u $D $5 C '6 $2 -C^t*97 -$di6as{( +C ^t *97 +$d i6a s{( $7 Z5 ^r '5 o3i soP @@ -90756,11 +90371,11 @@ O6B o5+ $. $d $o z5 O84 OA9 O57 -*19,1D8 +*19 ,1 D8 d +6 s[z O54 l $0 $9 $4 -o9u*8A +o9u *8A o70 ^a s74 Z2 L3 z2 @@ -90771,7 +90386,7 @@ l ^8 ^6 ^9 ^1 u $E $0 i2g O34 u $E $6 -$9i9g +$9 i9g *36 $J OA2 o8\ l $0 $1 $9 @@ -90783,23 +90398,23 @@ sYy o5u $3 l $8 $4 $5 i94 iA0 -*4A]*45 +*4A ] *45 c $d $D c $d $E z1 O07 z2 l $1 $5 $8 O13 o2b c *05 D7 -^@o70s%p +^@ o70 s%p c $d $7 -iAO*96*40 +iAO *96 *40 y1 sFs *75 $5 c $9 $0 $7 o25 *31 *65 K O47 -Y3rK -d*B4*93 +Y3 r K +d *B4 *93 ^c ^A u $0 $2 $1 c ^n ^i @@ -90821,17 +90436,17 @@ p1 +4 c -0 u $6 $0 $1 o9u c -s!nsW` +s!n sW` i2g O32 OB1 slq O43 o1u OAB c $4 $7 $5 -*ABy1o2' -EoAq +*AB y1 o2' +E oAq +4 q O53 o2t i6e i7m i8o ^5 ^9 O47 -^?R9 +^? R9 i0h *67 sv' L4 l $. $p $s @@ -90846,17 +90461,17 @@ l $6 $4 $9 l $5 $0 $4 l $5 $0 $3 shi -3 -$Q*47 +$Q *47 i7u i8e l $5 $0 $9 ^4 sb1 u $3 $8 $1 ^p ^i ^s Z4 O15 -*86t*4A +*86 t *4A l $u $p O84 'A -i0Hi8$ +i0H i8$ sd? O68 d o0T s6B o0w T1 @@ -90881,13 +90496,13 @@ saD OB7 i5A Z2 -4 i38 l $7 $2 $4 u $9 $0 $5 -'7.3 +'7 .3 l $7 $0 $4 l $7 $0 $6 l $7 $0 $1 l $. $p $e +4 l -sdW-7Z4 +sdW -7 Z4 o0d D1 i3b $9 $5 d $i l $6 $2 $0 @@ -90916,17 +90531,17 @@ l $8 $6 $9 o0* z5 svN t Z5 O12 -sUKiA+ -i9Z*1B +sUK iA+ +i9Z *1B l $1 $0 $2 z4 o3y l $1 $0 $7 { sn9 l $1 $0 $9 -*19*81*19 +*19 *81 *19 $0 sd7 D5 i89 o6g i97 RA -sz[syF +sz[ syF sB) l $2 $3 $5 l $2 $3 $6 @@ -90942,10 +90557,10 @@ l $5 $7 $0 l $5 $7 $6 i4[ ^F ^7 -o9ss4%*19 +o9s s4% *19 o2a o1w l $6 $5 $8 -z3c*5A +z3 c *5A sBn l $8 $1 $5 ^d i48 @@ -90968,7 +90583,7 @@ c $0 $7 $2 c ^h ^s ^a l $4 $0 $3 $v $u -u,BsUa +u ,B sUa $s $, i42 i50 i70 i61 l $2 $7 $0 @@ -91034,7 +90649,7 @@ i42 i62 i50 i74 o2m -3 c ^A ^D c ^A ^C -L3si{ +L3 si{ c $c $y i1e i4a $h $i i5r d $p @@ -91044,7 +90659,7 @@ Z3 O93 ^R l $5 $8 $9 sy. O84 -0 O4A -+A*48*47 ++A *48 *47 D4 -0 o6@ *76 T2 TA T5 T4 @@ -91056,12 +90671,12 @@ swm o1f K O65 l $2 $4 $1 p1 *18 -s9rsE3 +s9r sE3 k O41 R1 L6 ] *50 -9 -E O83 sa1 -s'DK*70 +s'D K *70 ^d o3s K O0A ,A s*6 c $c $1 @@ -91093,12 +90708,12 @@ o0o o1s *6B O16 c $d $x o7! Z1 -R9l +R9 l O46 O49 R1 l $0 $2 $6 l $0 $2 $7 $r $a $m $o $n -s]|Y4i8b +s]| Y4 i8b O21 o52 } f -0 -F @@ -91113,7 +90728,7 @@ l $4 $3 $0 L2 i4e $- l $1 $5 $3 O06 sEA -RBk{ +RB k { c $4 $0 $9 *B5 O68 u $B $x @@ -91134,7 +90749,7 @@ s8X ^l ^i ^m ^a ^t s8K O14 i1G -*3Bu^@ +*3B u ^@ u $2 $5 $8 C L4 l $. $u $a @@ -91188,12 +90803,12 @@ l $4 $5 $9 l $4 $5 $8 ssH soB l l $4 $5 $0 -suN$yT2 -Y3y3Y4 +suN $y T2 +Y3 y3 Y4 -5 $S o2e -7 } O12 Y2 -Z5C +Z5 C l $4 $0 $6 c $D $1 l $4 $0 $5 @@ -91207,7 +90822,7 @@ l $1 $9 $5 l $1 $9 $7 l $1 $9 $0 i4r *54 o4e -o2FiBi +o2F iBi o4e O69 T2 y4 O29 i5_ c ss- L7 @@ -91246,27 +90861,27 @@ u $0 $1 $3 [ i0s y2 *75 *76 u O59 $H -*B8L8 +*B8 L8 l $8 $3 $5 -o4?*B1 +o4? *B1 -5 Y2 i1h i3l i2i l $0 $3 $8 u o0U o6R l $0 $3 $4 $$ O64 -sM#i5K +sM# i5K l d 'D $2 l ^ ^p ^o ^t u $A $7 d ^c $6 $C -y3s5b[ +y3 s5b [ l $9 $0 $2 R1 ^g l $9 $0 $7 l $9 $0 $5 -s&3*51 +s&3 *51 u $2 $4 $9 u $2 $4 $8 L0 L5 @@ -91274,11 +90889,11 @@ u $2 $4 $1 u $8 $9 $5 O08 *63 l ^t ^n ^e ^c -^)} +^) } f O06 iB# ^s ^k ^c ^o ^r +2 -F -c$[ +c $[ o4t Z2 sa0 D4 o7d D8 @@ -91290,7 +90905,7 @@ u $0 $6 $5 $R $N o19 Z4 o0h D5 -*18*96sgR +*18 *96 sgR R5 Z5 ss^ O42 $% @@ -91302,9 +90917,9 @@ l $7 $2 $0 ^5 ^A O48 p1 i5t i62 -'7+Ay4 +'7 y4 OB1 t y5 -o2+*45 +o2+ *45 c $3 $a O53 z3 +1 $f @@ -91315,12 +90930,11 @@ l $4 $6 $7 l $4 $6 $2 o58 p1 l $4 $6 $8 -f O19 ] l $4 $1 $6 -o9bs,l +o9b s,l l $4 $1 $3 -slKR4*0B -$,*82s{8 +slK R4 *0B +$, *82 s{8 C ssN ^0 ^D $/ O75 @@ -91329,7 +90943,7 @@ l $1 $8 $6 *48 *08 Z4 O61 i2l i4p i3i -*06s6/ +*06 s6/ sbP O14 K +4 l $7 $6 $5 @@ -91342,7 +90956,7 @@ O29 ^{ -0 o0g r ^c ^d O49 -9 $% -^Lr*59 +^L r *59 l 'E $9 +5 -F l $6 $0 $2 @@ -91363,8 +90977,8 @@ s6b R0 OA1 O4A $y R1 d c s2* -*A8o0Dz1 -s7G*A6 +*A8 o0D z1 +s7G *A6 u ^F ^B u ^B ^C ^+ z2 @@ -91383,7 +90997,7 @@ c i1F se2 sc0 o3f $4 o59 u ^C ^D i14 OB7 -s0*sHti1V +s0* sHt i1V $. -8 ^w z2 *25 [ c [ @@ -91396,9 +91010,9 @@ z5 i71 O34 l $3 $5 $0 l $3 $5 $1 l $3 $5 $9 -spusi_ +spu si_ o12 L0 -s2,*9Bi4@ +s2, *9B i4@ OA9 o8) ^W O15 so> @@ -91423,10 +91037,10 @@ l $2 $9 $1 ,5 OA2 k ] Y5 O63 O3B R7 -D1'8q +D1 '8 q y3 p4 c $6 $2 $1 -o6|o9s +o6| o9s l $6 $1 $0 l $6 $1 $7 $g sr( @@ -91499,7 +91113,7 @@ c $) $( c $@ $! c $@ $? $@ $0 -z3oBR +z3 oBR $0 $& ^* ^9 ^l ^l ^a @@ -91520,7 +91134,7 @@ $* $4 Z5 q $3 $` $^ $6 -*51sQvo8H +*51 sQv o8H $3 $, $3 $$ $. ^! @@ -91536,7 +91150,7 @@ $! ^/ $- $8 $+ ^# O95 s?[ -^xo7, +^x o7, ^> ^> $9 $( ^) ^! @@ -91573,7 +91187,7 @@ u ^5 ^7 ^9 ^1 $j $a $d $e i6t i7t i8e '6 $^ -*04sgd +*04 sgd i6i i7o '6 $f i6i i71 @@ -91588,7 +91202,7 @@ $s $i $g $n $b $l $a $h $w $a $x $y $s $p $a $n -$Vy4syo +$V y4 syo O06 -0 Z1 $h $e $a $t $m $o $n $e $y @@ -91619,7 +91233,7 @@ $j $u $i $c $e ^ ^I c $4 d Z5 O26 t -Y4L6 +Y4 L6 $v $e i6. O82 C ^_ @@ -91654,10 +91268,10 @@ $a $x $i $s Z3 +0 $r $a $c $k T4 $@ -D2R7LB +D2 R7 LB $r $i $n $g sG& K O26 -Eo6I} +E o6I } i32 i52 i40 i61 $s $h $o $e $s $w $e $n $t @@ -91678,11 +91292,11 @@ st7 $! $v $a $l $o $r $o T7 ^m ^l ^i ^f -Y2*B5sKC +Y2 *B5 sKC $t $h $i $n $g i5i i6c i7k -L7i8h -'B i4K OB8 +L7 i8h +'B i4K $g $e $a $r Z2 $M $q $u $e $s $t @@ -91700,7 +91314,7 @@ $a $m $o $k i81 i91 iA2 O2A ^T *47 o54 -s)os*eoB$ +s)o s*e oB$ ^% ^$ ^# ^@ ^! $g $a $i $t $p $a $c $k @@ -91721,7 +91335,6 @@ $h Z3 $# O16 c $4 $M $e E $p -y5 O38 E $4 i10 i93 iA6 iB9 i6a i7s i81 @@ -91756,7 +91369,7 @@ $c $l $a $s $h +3 *78 $t $r $a $i $n $t $r $a $i $l -rsYN.5 +r sYN .5 o0d R9 $s $p $u $d $L *41 @@ -91770,12 +91383,12 @@ c o3& i85 i99 i85 i98 -4 s2m -R8,A+0 +R8 ,A +0 i2n i3a i41 $d $a $m $s '5 i3e Y2 O98 -Y5o0fs 3 +Y5 o0f s 3 D7 +9 $p $r $i $s $m .5 o0N ,4 @@ -91789,11 +91402,11 @@ z3 o0n sxL $S $V i2v i4l i3e -sqa*91*78 +sqa *91 *78 Z3 y3 $m $a $t $c $h *62 o18 *46 -sXMRAsIe +sXM RA sIe +4 ^c ^S [ $+ O1A ^t ^e ^n @@ -91812,7 +91425,7 @@ $c $l $a $w c i62 skP ,3 c i6a -o2Htsj? +o2H t sj? ,3 *02 D4 sah c d se3 @@ -91861,7 +91474,7 @@ $f $i $x $e $d *79 O97 o0A Z2 ^P o84 -*36i9! +*36 i9! $s $t $i $n $k $s $t $i $n $g *45 -7 ^0 @@ -91876,7 +91489,7 @@ r $g $e $n $y $n $u $d $e O19 Y2 $W Z1 -y2sn>+4 +y2 sn> +4 $b $i $m $b $o $d O82 $n $g @@ -91912,7 +91525,7 @@ z2 i73 *74 O83 d stp c ^4 ^1 ^0 ^2 -s?@i4- +s?@ i4- $b $l $i $n $k $b $l $i $n $d o8$ E @@ -91921,9 +91534,9 @@ i5i i6e i71 ^m ^a ^I $r L5 p1 O68 s68 -+5sKJ^a ++5 sKJ ^a i2v i3- i7a -*80-9 +*80 -9 O01 f t O41 Z3 *23 O53 ^p '9 @@ -91942,13 +91555,13 @@ i30 T4 i71 i80 i92 O15 z3 t i3t i41 i52 -$!*B0c +$! *B0 c ^0 ^q o3e o6o i1Y L4 $w $i $l $d $s $t $u $s $k O15 O21 --9oAq +-9 oAq $f $o $r $t $h i5g i61 i72 p1 spx @@ -91976,7 +91589,7 @@ $c $r $a $s $h i2m O46 o52 i63 i78 Z3 D5 o4u -EoA! +E oA! i8x O04 O81 sdj $. O0B T1 @@ -91998,7 +91611,7 @@ $c $l $o $w $n p1 i5@ $f $i $l $e $s i62 i80 i70 i96 -o2#] +o2# ] $h $a $l $e p4 ,3 $v $i $l $e @@ -92030,9 +91643,9 @@ k R1 *12 i4! c si! T2 c si! T3 -c^G.B +c ^G .B O1B Y5 -*B6ssz-7 +*B6 ssz -7 i92 iA1 iB4 p3 $q $o $n $t $o @@ -92050,7 +91663,7 @@ i8e i9n iAt i11 i20 i32 $w $i $n $k $w $i $n $e -o43*BAZ1 +o43 *BA Z1 -7 R2 $s $l $a $s $h +8 p4 @@ -92104,10 +91717,10 @@ $m $e $l $o $n $s $h $o $p Z1 O16 $= i77 i88 i99 -sH=o2z +sH= o2z $s $a $n $g $0 O32 y5 -$TsbW +$T sbW i4c s3* O16 O51 s5# c T2 d @@ -92116,7 +91729,7 @@ $r $o $m $a $n c ^ ^I $t $i $r $e i4d i51 i62 -*B2Ey5 +*B2 E y5 $p $o $r $t T2 i2& $w $a $n $t @@ -92134,7 +91747,7 @@ T7 $0 $w $e $a $r Z3 o2l '9 Y5 -}s?0*59 +} s?0 *59 c +B T6 $T [ o5H O31 @@ -92177,7 +91790,7 @@ $g $u $n $s s0q -4 z1 ^L i7n *45 -iBPsn=L9 +iBP sn= L9 d *64 $c $a $n $s $t $i $m $e $s @@ -92185,12 +91798,12 @@ i28 i34 i6o i7r i81 'Z $o $c $e $a $n -+Az2 -{*85 -oAt*53 ++A z2 +{ *85 +oAt *53 $n $a $k $e $d i3a i5d i4n -,A*B8Z1 +,A *B8 Z1 sOe +6 ^` O23 $* [ @@ -92202,7 +91815,6 @@ T1 Z4 $2 ] *08 i59 i60 i70 $s $p $a $d $e -+3 [ $_ *56 i5f +7 $d O45 p1 $$ o0J @@ -92213,20 +91825,20 @@ c i5* $v $i $o $l $a Z2 [ $. $c $o $n $e -^ ^s^i^ ^s^i^h^t +^ ^s ^i ^ ^s ^i ^h ^t $t $o $n $e $r i94 iA5 iB6 *02 o3f $i $r $k $e $d u $c -*57s{q{ +*57 s{q { k [ z3 $r $! i35 i41 i59 -^\l +^\ l i5n i61 i73 ^Y z2 -i89q +i89 q $m $a $n $e $g $r $o $w $l ^V +3 @@ -92237,8 +91849,8 @@ $m $o $n $k $s o2Y '7 $. o7` T1 +7 -'By3 -sDTy4 +'B y3 +sDT y4 $g $u $a $r $d .8 o2p $m $a $t $e @@ -92255,7 +91867,7 @@ $c $a $r $s $s $c $o $p $e $w $i $l $d i82 i92 iA1 -.2L5 +.2 L5 $g $o $a $t $b $e $a $m i3i i5a i4n @@ -92267,7 +91879,6 @@ $l $e $a $r $n o64 $! c i59 T6 i2c i4r i3a -p1 O03 $y OA9 y4 i83 i97 i83 i98 @@ -92404,7 +92015,6 @@ $b $i $r $d i5u i6s i71 sy5 i71 i92 i81 -*02 y1 ] $n $e $w $s $b $o $a $r $d *05 O28 @@ -92563,7 +92173,7 @@ $h $o $m $e ^l ^o ^c i6e i73 $b $o $n $e -*51R1 +*51 R1 T0 T7 TD $s $a $v $e $r o96 -2 @@ -92699,9 +92309,8 @@ $g $r $a $m i2o i34 i4b ,7 $c $l $o $s $e $s $p $o $r $t -O23 [ $* T5 TA T7 -sa4sc *57 ^t ^n ^a @@ -93712,17 +93317,17 @@ O4B i4> *57 spx *34 szi *79 i72 i82 i93 -y3o0i +y3 o0i *53 o1$ ^o ^M -st`*82 -z3p5 +st` *82 +z3 p5 $j $a $s $o $n Y4 ,1 p2 -TBko6u +TB k o6u r sbq ^d ^e ^n ^w ^o -cY4Y3 +c Y4 Y3 t skC O59 O7B y3 *81 O84 @@ -93737,18 +93342,18 @@ K s3r ^k ^s ^u ^m i0" O67 O35 $X -y2sKp +y2 sKp sRw D6 s&^ -$,$~ -$_$~ +$, $~ +$_ $~ s&S i1a i2s i3u s&N s&O o2; O75 $t $r $a $n -Y4s29 +Y4 s29 $v $i $v $a $s sB# $t $i $t $a $n @@ -93756,23 +93361,23 @@ O95 sk2 i3m l $. $t $m l $. $t $l ^2 O32 -o4us#W -*7Bi5l +o4u s#W +*7B i5l o0 Z5 ^c ^l ^s $a $h $o $y s&. -ks+Hd +k s+H d T6 i0! $f $o $r $u $m } sJ6 O25 *52 -z2R0 +z2 R0 l $. $t $v q O7B O07 o31 y1 ^o ^w -,4^n +,4 ^n ^g ^a ^w ^o ^w ^n ^a ^c ^s @@ -93780,9 +93385,9 @@ $r $a $t $s Y1 O92 ,8 ^m ^a ^l ^s ^i sM' -{sEio20 +{ sEi o20 ^8 ^n -*87i9[ +*87 i9[ sV9 o4D ^a ^k ^i ^t ^a K O56 O43 @@ -93797,12 +93402,11 @@ $k $a $r $i '9 i6' ^c ^c ^n ^o ^m ^s ^o ^k -Z3z4 -*73 E *93 +Z3 z4 ^h ^c ^a ^u ^m ^e ^h ^t ^a ^k -o3bz1 -*80Y4o1w +o3b z1 +*80 Y4 o1w ^k ^s ^i ^f .3 so* ^d ^o ^h ^s @@ -93831,17 +93435,15 @@ c $l $a $t $e *B5 $W O19 z2 T4 OA3 d O32 o6y -$}s i-9 +$} s i -9 ^a ^w ^a ^k O91 z3 -[$' ^n ^o ^n ^a ^k -*82 *54 E *39 O45 LA c ^y ^e ^h $p $e $t $s .0 O56 -$/$< +$/ $< o6> *20 ^y ^n ^a ^d $m $i $l $o @@ -93853,26 +93455,26 @@ oBc O61 O28 O0B i6c R9 $l $e -sJno3`s*Z +sJn o3` s*Z ^i ^n ^u *28 $E O86 ^e ^J O41 sh5 sP3 -Y4s42 +Y4 s42 sY5 *52 sy! [ saE O13 O47 -$I-9C -sZg*72siv +$I -9 C +sZg *72 siv $b R3 O08 $b $a $s $h ^j ^a -R7sgs +R7 sgs $a $u $d $r $a ^% *01 K -i59{ +i59 { O18 ^e ^c ^y ^m ^j ^g @@ -93885,7 +93487,7 @@ i43 z1 D2 $I Z1 ^m ^a ^e ^b ,2 iB2 -i9#^( +i9# ^( $d $u $m $b ^j T6 O12 ^t @@ -93898,10 +93500,10 @@ i07 Z2 L2 sds sA[ ^v ^n -s|>*18*47 +s|> *18 *47 $e $l $m $o -3 i18 -z4Z2 +z4 Z2 O12 ^c Z1 R1 ^a ^n ^i ^b @@ -93911,7 +93513,7 @@ p4 $) OA3 $s $h $u $n z3 O76 ^a ^u -y4.7sda +y4 .7 sda O05 *25 ^a ^n ^i ^v ^a ^n ^i ^z @@ -93925,9 +93527,9 @@ $. $m $i $l sB1 +4 sQ< ^d ^n ^a ^e ^m -*5As^Kc +*5A s^K c *03 Z3 -sMQ*57z5 +sMQ *57 z5 .1 spm sKZ T0 ^a ^n ^a ^i ^d @@ -93946,18 +93548,18 @@ Z3 *12 y1 s&Q p1 *63 O59 s'v -z1oAH +z1 oAH +2 R4 ^I *76 *07 $G ^o ^b ^a ^c sAL Y3 c $d $e $n -lse3si1 +l se3 si1 o73 u $Y sQN ^o ^b ^a ^g -Z1sA* +Z1 sA* *23 O56 i5l i7v i6o y1 sp! O37 @@ -93978,18 +93580,18 @@ i41 i51 i62 z2 $z ^a ^n ^a ^z ^y ^a ^h ^c -*26swKiB\ +*26 swK iB\ ^a ^m ^e ^h ^S k O75 $e $t $h $a $n $w $h $o $r $e -rsM'o9L +r sM' o9L O58 C s=- ^a ^n ^a ^k ^` ^` [ y2 +1 -L9*56i7, +L9 *56 i7, ^i ^r o81 sub r O85 @@ -94002,10 +93604,10 @@ t sUR ^c ^n ^m srq Y2 s1V -sDh^j +sDh ^j O14 sEb ^o ^d ^r ^o ^g -tz2Y1 +t z2 Y1 ^b ^r ^o O54 i1$ i9x O16 @@ -94013,27 +93615,27 @@ i9x O16 O75 O53 s`* ^i ^w -R5*A8*2A -*25^-*4B +R5 *A8 *2A +*25 ^- *4B s`= s`3 ^c ^m ^j ^e ^v ^i ^h i3h p1 -tZ4slb +t Z4 slb *05 i2L o1e i3i i6e i7n o9m O6A Z1 ^n ^a ^m ^o -sM>ul +sM> l $b $r $e $a $k ^a ^i ^h ^c Y5 p3 D1 ^o ^g ^e ^i ^d -sP;*94 +sP; *94 ^o ^j ^o ^r ^l ^a ^r ^i ^v -sD_i6( +sD_ i6( i8i i9s iA1 O7B *45 ^f ^l ^c @@ -94048,8 +93650,8 @@ $r $y $a $n *5A o5s ^h ^s ^u ^r ^c ] st% -r,B -r,A +r ,B +r ,A ^? ^= *12 '5 i43 *60 @@ -94070,8 +93672,8 @@ L4 '5 i9u iA1 *30 O15 sa7 D6 -*03s<'o3H -sIVY2 +*03 s<' o3H +sIV Y2 *56 i8b Y5 O96 $g $r $a $n $d @@ -94097,23 +93699,23 @@ $s $a $m $e *75 z1 $f $o $r $d i1e i2a i3t -,3*B3 +,3 *B3 ^o ^t ^o ^s p3 O28 ^a ^t ^i ^m OB1 Z2 *84 -K*68i4O +K *68 i4O ^o z2 o5l ^y ^S i7f i3b -D0sNb +D0 sNb i3m i5r i4a $j $o $e -s!R+7 +s!R +7 ^l ^u ^d ^b ^a ^a ^t ^i ^s ^r ^e ^n ^w ^o -*38s^Z +*38 s^Z O63 C p5 ^a ^t ^i ^r ^Z o1R r @@ -94154,7 +93756,7 @@ k d u *A6 l i7e i82 i90 ^t O87 -*6At +*6A t *21 q O61 o3^ D8 ^t ^s ^o ^h @@ -94164,37 +93766,37 @@ sZp ^+ ^- $t $h $r $u c $. $u $k -su/*BAK +su/ *BA K ^^ p1 *31 i3& *37 O48 ^i ^j ^n ^a ^s -.8s7r +.8 s7r $n $e $v $a -TB*20s_^ +TB *20 s_^ i3) *43 $p $h $i $l -*97Z4 +*97 Z4 $a $n $u $s -z3T1 -i4my1 +z3 T1 +i4m y1 *19 p5 } $a $m $e $n -,AZ4 +,A Z4 r O56 Z1 $, O54 p2 s08 ^s ^y ^h ^r *A0 ^t O87 -svQ*51 +svQ *51 .5 $1 y5 $i $n $a ^i ^n ^i ^h ^c { $T O14 ^a ^i ^z ^e ^k -$ei8c +$e i8c c O39 -*7BsHyi0; +*7B sHy i0; OB2 *4A $m $d s@A ^S @@ -94204,17 +93806,17 @@ s@A ^S *35 O56 z5 k sFd ^; ^/ -*70i1n*B0 +*70 i1n *B0 ^; ^) -sw\[ +sw\ [ sJ! $m $i $n $d $a $z $e -Z1R0 -*53Y4 +Z1 R0 +*53 Y4 u O04 p3 R4 ss) -K*38*67 +K *38 *67 sTc O13 ^u ^l ^b ^% ^_ @@ -94248,25 +93850,25 @@ i32 i42 i50 ${ ,2 OB4 *15 *B8 i7P *42 O0A -T1^;r +T1 ^; r i73 i1f *97 O26 ^a ^l ^u ^h ^c ^a ^m ^a ^t sD5 z2 -y2*70$4 +y2 *70 $4 D3 sKs *58 O05 ^i ^c ^u ^l O52 Y5 ^n ^o ^m ^a ^r -sc&*B3 +sc& *B3 o3X *06 *62 O56 y3 -*B9sv. -*68y5 +*B9 sv. +*68 y5 sGe -sYv+3s$9 +sYv +3 s$9 ^n ^i ^a ^l ^p $a $r $i $z ^p ^c ^a @@ -94276,7 +93878,7 @@ i36 i13 $v $e $i $n $s Z2 R4 svQ -st%'9y2 +st% '9 y2 o2# o43 $k $a $t $h $y O25 *73 O12 @@ -94290,25 +93892,25 @@ K -5 $1 ^y ^k ^n ^i ^p ^e ^l ^y ^t ^s iAd D3 -i9eiBT +i9e iBT c ^[ sa4 ss$ skh o3e O14 *26 *56 u O4A O94 -]^; +] ^; c o28 -r*81sO. +r *81 sO. c ^; ^x ^u ^n ^i ^l ^a ^j ^n ^a ^g c o22 s?x -o42*64.1 +o42 *64 .1 ^x ^y ^n ^o .6 O05 K { D7 -L7L3 +L7 L3 i32 *81 ^a ^l ^o ^a ^p sIV z4 @@ -94329,7 +93931,7 @@ $b $u $c $k $s K sGd k O6B +4 d ^l ^e ^r ^u ^a -s(}*91 +s(} *91 ^d ^a ^r ^b $x y5 .7 o9Z @@ -94340,9 +93942,9 @@ sb& O13 *16 ^d ^t ^m i6X c -R7o6] +R7 o6] oBB -]iA( +] iA( D0 sm> sWQ $l $y $n $x @@ -94351,7 +93953,7 @@ $l $y $n $x ^o ^n ^e ^r ^s ^d ^n ^i ^w ^d ^u ^a ^m -TB*02 +TB *02 Z3 u o4a ^g ^n ^i ^j ^g ^n ^a ^r ^t @@ -94362,20 +93964,20 @@ c $a $v sr9 ^s ^i ^n ^a ^h *81 *48 OA5 -^5.2 +^5 .2 $M O16 } ^g ^i ^w ^t i74 i19 ^s ^i ^n ^a ^m -z2L8 +z2 L8 c $e $m $u O61 O38 -sQrR3 -+7$,*59 +sQr R3 ++7 $, *59 ^o ^k ^i ^m ^o ^k ^i ^a i3i z1 -sH$$( +sH$ $( $l $o $c $k $e ^b ^e ^d ^s ^i ^n ^a ^y @@ -94389,7 +93991,7 @@ o3! -2 *B5 O19 $W sl? o5b ^z ^a ^t -Cz5 +C z5 ^z ^a ^q Z3 *37 o94 O72 @@ -94409,17 +94011,17 @@ p1 p1 O25 $r $i $n $g $o ^e ^i ^t '6 o1l -kp5+B +k p5 +B d o0C l i2% $c $a $i $n $f $l $a $t -*1BsQ# +*1B sQ# O68 s>E *29 O47 $s $e $m $i sD5 -[*37Y5 +[ *37 Y5 ^a ^e ^a l ^4 ^8 ^9 ^1 i8R +B @@ -94427,14 +94029,14 @@ o1G y2 O64 oB) O25 ^e ^i ^r ^e ^t ^a ^s -y3lr +y3 l r ^r ^o ^n *B9 O71 LB TB *26 *30 ^e ^o ^t ^e ^i ^m -$Do5D +$D o5D d D4 o4w ^o ^r ^t ^s ^a o9O Z5 O26 @@ -94460,23 +94062,23 @@ oA< O14 ^u ^d ^a ^r ^m ^d ^m i4y i5b i6o -z1,Bs]^ +z1 ,B s]^ r o7[ ^a ^i ^t ^a ^k i82 .7 i7H ^i Y2 $g $w $e $n -s-6] +s-6 ] ^e ^n ^i ^t sZ[ -t^% +t ^% R7 D3 [ -oAt*43 +oAt *43 $k $a $t $e sQX Z3 *15 $' $. $i $q -r*32s"4 +r *32 s"4 i2Q O18 O2B -3 sZf @@ -94488,7 +94090,7 @@ $p $d O39 $J O01 O67 $d $r $a $g -o1=c +o1= c s,1 ^l ^e ^t ^a ^p ^o ^r ^t ^e ^m @@ -94501,9 +94103,9 @@ $y $o $n $g $t $i $m $e Z4 [ p5 -3 ^o o7k -i0@T9s!L +i0@ T9 s!L ^j ^n ^b -o0G*5B^I +o0G *5B ^I s,m y2 s4D ^m ^m ^a ^s @@ -94526,7 +94128,7 @@ i18 u *76 i2h ^z ^i ^z ^a ^y ^e ^n ^o ^m -KsBq +K sBq l d $6 $p $m ^( Z5 @@ -94549,19 +94151,19 @@ c $_ $7 $3 $7 ^o ^t ^i c ^p ^m ^e ^t ^o ^g ^n ^a ^s -KL0s>9 +K L0 s>9 K o1F $2 $0 $0 $3 $6 $8 $3 $6 $1 $8 $7 $2 $1 $1 $5 $1 $1 $5 -,4sgC*17 +,4 sgC *17 O71 *53 o2E *84 u $@ $2 $1 $3 $4 ^Y ^O ^n ^a ^y ^r ^b ^o ^t ^u ^l ^p -s+S{u +s+S { u O15 -8 ^w ^e ^d c ^h ^e @@ -94585,7 +94187,7 @@ sc{ $2 $5 $0 $4 $8 $5 z3 O25 { ^a ^a ^l -lp5s ^ +l p5 s ^ ^i ^e ^t ^u ^c i6a i8g i7n ^o ^r ^e ^j @@ -94596,7 +94198,7 @@ OB1 *49 p5 $2 $3 $0 $9 $5 $0 $@ $2 $2 $4 ^p ^m ^c -syXsQ{ +syX sQ{ K { +3 *A4 OA3 O8B ^b ^a ^l @@ -94617,7 +94219,7 @@ $k $h $m $e $r $' c ,5 o8O $1 $4 $0 $8 $9 $0 -Z1sB[i9O +Z1 sB[ i9O +6 O82 $2 $2 $0 $3 $1 $9 c $@ $5 $9 $5 $9 @@ -94631,39 +94233,39 @@ $1 $2 $2 $7 $7 $8 $0 $6 $0 $8 $6 $0 $T p1 O18 -0 ^; -{*07i7# +{ *07 i7# ^u sbd -iB+sq7 +iB+ sq7 $l $u $t $e ^w ^s ^m O67 *56 *4A *8B O16 D2 R6 -*9Bz2^I -i7Cs/.+5 +*9B z2 ^I +i7C s/. +5 ^o ^i ^d ^a ^r -o81skby3 +o81 skb y3 $4 $9 $# $# Y4 Z3 O1B Z1 O39 '8 -$.$[ +$. $[ i2t i4a i3h $2 $8 $1 $2 $4 $0 O52 { O12 -o7ji2H*31 +o7j i2H *31 $1 $1 $2 $2 $2 $8 -s5qZ3] +s5q Z3 ] O43 L6 ^n ^a ^p '5 C O07 R6 OB4 $m $i $l $e $s ^a ^r ^t ^u ^p -i5{s3F +i5{ s3F f i0, $( O24 ^e ^k ^a ^m -R3z1 +R3 z1 u O48 Z4 $' t ^n ^i ^w @@ -94689,14 +94291,13 @@ O69 u $f $r $a $n $k $m $a $r $c $h ^e ^l ^a ^b -oB`t +oB` t ^a ^r ^o ^c -o0sY1y4 +o0s Y1 y4 ^i ^s ^e ^d ^a ^b ^m i4a i52 sd" -d o24 E ^a ^n ^i ^g i1c i59 Z3 *67 @@ -94727,17 +94328,17 @@ sqW ^ O02 sb| ^a ^t ^a ^m $m $o $p $s -^t*12,4 +^t *12 ,4 ^y ^d ^a ^e ^r $m $a $l $t ^s ^o ^r ^e ^h c si! sa4 O51 z3 *85 -*0B,0k +*0B k $k R7 ^0 ^J $e $a $t $e $r -$ho5Esz_ +$h o5E sz_ *2B O15 ^l ^a ^z ^i ^r Z5 OA8 @@ -94749,7 +94350,7 @@ p1 sNU sZX $u $2 sI< -.Bsq{i1R +.B sq{ i1R $o $r $t $i $z $; $p $V O25 @@ -94767,17 +94368,17 @@ i8e i9y $f y5 ^y ^h ^c ^t ^i ^s ^i ^r ^e -*26*23 +*26 *23 T0 TC T8 -*62s6P$Y +*62 s6P $Y i1i O92 -Y3,3*AB +Y3 ,3 *AB ,5 k *09 i3\ '5 c ^3 ^1 ^2 -0 R5 $j $u $d $o -*89Ci27 +*89 C i27 sFL '5 Y4 ^3 ,8 O3B *13 @@ -94789,7 +94390,7 @@ i5m i7n i6a O4A D7 *94 ^e ^r ^g ^i ^t T0 O16 -i7sy5 +i7s y5 ^n ^o ^n ^a i4y i6s o89 $1 o97 DA szm @@ -94799,7 +94400,7 @@ z5 Y3 s^J sYh ^n ^i ^e ^r -$0i0w +$0 i0w ] i34 O92 z5 q o9k Z2 @@ -94819,7 +94420,7 @@ q s=D z1 sK8 ^e ^d ^a ^l ^b c ss$ T1 -*40sxb +*40 sxb *81 y2 O17 ^a ^m ^u ^k ^a sNH y1 @@ -94828,9 +94429,9 @@ s*N sT( i3d i56 i7c i58 -z4saj -^oY3 -$>$/ +z4 saj +^o Y3 +$> $/ O15 +4 ^n ^i ^e ^l ^k $y $v $e $s @@ -94838,7 +94439,7 @@ $a $a $r $o $n *13 Z4 ^e ^m ^w ^e ^n z1 $+ OBA -$o,3*59 +$o ,3 *59 $a $v ^m ^r ^e ^g ,6 Z4 @@ -94866,8 +94467,8 @@ i27 y2 O38 o2g y1 i6` *56 O6B *58 Y4 -]Y3*37 -uo05 +] Y3 *37 +u o05 ^r ^u ^t ^r ^a $c $i siX O53 @@ -94875,7 +94476,7 @@ o08 O74 q *05 *21 R0 $ Z1 O1B -L9,A +L9 ,A O37 z3 ^a ^t ^i O14 $_ D2 @@ -94887,25 +94488,25 @@ O52 [ *48 ^g O59 ^e ^t ^i ^h ^w ^e ^h ^t ^e ^l -CZ3*25 +C Z3 *25 i23 *78 p2 y4 ^e ^n ^o ^l ^a -o2/iBx +o2/ iBx o0# *06 i2q O62 R1 $0 ^r ^a ^e ^s ^i $o -*BAsj+ +*BA sj+ ^e ^e ^n O53 L1 ^s ^p ^s ^a -$p*B0u +$p *B0 u u q o42 D3 D5 sr O54 -p4.4 +p4 .4 ^e ^e ^g $) O4A $7 ^o ^n ^i ^g @@ -94913,7 +94514,7 @@ OB7 O68 sD. ^l ^i ^a ^m ^g O42 O79 Z4 +8 o3g -Cs0QZ3 +C s0Q Z3 O61 D0 -7 sXG O47 r z3 R6 @@ -94928,8 +94529,8 @@ s_T O68 R0 $c $l $e $o q O51 +5 *06 D3 sMf -*85^m*50 -*59z4Y2 +*85 ^m *50 +*59 z4 Y2 ^r ^i ^m ^a ^r d u 'G $f $o $w $l @@ -94945,16 +94546,16 @@ O74 O94 O04 o8; ^^ i4b i6r i5e i5N i4p -,6p4l -o3 i8e -i0\sQl +,6 p4 l +o3 i8e +i0\ sQl s3| -*68iATY2 +*68 iAT Y2 i42 i50 i63 i71 ^a ^l ^u ^a ^p ^r ^a ^e ^d ^z ^e ^d -iA.o7[s +*A1 o5> ^6 *35 r O93 sn5 O36 @@ -95180,7 +94781,6 @@ i4a i5n i61 sli *86 ^n ^n ^e ^j ^k ^n ^a ^b -d Z1 O32 ^r ^o ^t ^i ^v oB` soE Z1 @@ -95188,9 +94788,9 @@ c $9 $5 $4 $! i28 d O94 y3 i7% D3 -*6B,8 -y3*29*09 -z3*95sF; +*6B ,8 +y3 *29 *09 +z3 *95 sF; ^n ^o ^i ^d +0 i5J ss9 *36 @@ -95204,10 +94804,10 @@ sG1 '5 c $. $j $p ^j ^y ^m oBP -$(*57 +$( *57 $e $a $v $e s}< -^F*B0 +^F *B0 $5 sLN swe o3a c $0 $4 $2 $! @@ -95228,19 +94828,19 @@ O09 y4 i4a i6e i5l ^a ^i ^f s}s -.9z4} -*9Ai5< +.9 z4 } +*9A i5< p5 RB O28 ^a ^i ^g ^c ^l ^m -sVSu +sVS u c $5 $9 $0 $! -^Ys,J +^Y s,J $m $o $v $e *14 sa\ $7 +9 O46 *50 -sM+7 +sp7 o0> +7 ^y ^k ^a ^h ^s c $8 $4 $1 +2 i2K @@ -95491,12 +95091,12 @@ $w $i ^a ^n ^i ^t ^x ^x ^e ^p ^a i01 i13 i2J i3a i4n -sd9y1p4 +s>9 y1 p4 ^p ^i ^l -L6sBR$q +L6 sBR $q +7 +7 -2 +2 -3 -A ,3 R8 @@ -95907,13 +95507,13 @@ i71 L9 ^n ^e ^l '5 L3 Z1 z1 O6A -sWk{ +sWk { ^a ^y ^a ^r -9 -9 -C +3 +8 +6 f sHi O26 -Y5*02 -Y5*01 +Y5 *02 +Y5 *01 +C -9 -B E O58 ^v ^a ^j @@ -95923,19 +95523,19 @@ t i1S O6B ,1 sq` i8q O57 Z1 -z2Y3 +z2 Y3 c $4 $0 $5 $! -[Ko2$ +[ K o2$ ^a ^y ^a ^h T2 '4 --2+D +-2 +D ^e ^v ^a ^n ^n ^o ^s ^a ^j $4 $m $c $e $l $i $a sQd ^d ^n ^o ^f -}i8^ +} i8^ '6 o5* T0 ^i ^r ^i ^m O18 o3V @@ -95948,7 +95548,7 @@ sQr +A -2 -6 OB1 $} sYQ $q Z4 -^ iB>o8m +^ iB> o8m { se8 O5B s1] +5 +9 +7 @@ -95974,7 +95574,7 @@ i7c L6 OA9 O24 $B $l $u $n $g ^_ ^e ^v ^o ^l -sWsDR -i3Vo9v +^> sDR +i3V o9v c i2_ O04 ^F *03 -[sNGsL' +[ sNG sL' *97 ^a k L2 O13 O28 @@ -96205,7 +95805,7 @@ Z1 sde ^r ^r ^a ^b ^x ^i ^m ^e ^r c $7 $9 $0 $! -i9?iB1 +i9? iB1 +9 -7 +A ^s ^s ^e ^j O61 z4 z5 @@ -96223,15 +95823,15 @@ r O67 i02 i15 i2J i3u i4n +C -1 -B ^m ^a ^i ^l -sQ_s`n +sQ_ s`n +A -9 -1 -[R1o7m +[ R1 o7m ^z ^a ^h ^c +1 -A +9 i7b i1d ^h ^a ^e ^y -*49iB[ -,8*15L7 +*49 iB[ +,8 *15 L7 $P L9 ^e ^z ^a ^l ^b ^s ^i ^o ^l @@ -96241,12 +95841,12 @@ i03 i10 i2N i3o i4v $Q $T *48 Z1 ^+ K -D7sTp +D7 sTp $r $u $t $h +7 +7 -0 i29 O19 *59 ^n ^e ^l ^a -o4&c$8 +o4& c $8 c $2 $0 $9 $! ^g ^e ^r ^n ^i ^v ^l ^a @@ -96262,12 +95862,12 @@ $g $a $m $e $r ^o '6 $n $o $r $t $h O81 z4 -*07,7$O +*07 ,7 $O *0A O68 $m $a $r $2 $6 +A -7 +A ^b ^b ^m -s/E s- f +s/E s- f O61 ^2 y5 ^u ^s ^t ^i ^m O25 z5 @@ -96293,7 +95893,7 @@ i33 R4 ^n ^i ^r ^i ^k ^u ^p scr Z1 -s'D*38 +s'D *38 ^u ^g ^n ^i ^p ^n ^i ^a i0m i2l i1i @@ -96303,9 +95903,9 @@ sqJ OB1 O07 ^n ^i ^f +9 -8 +B -sU@,3y3 +sU@ ,3 y3 +9 -8 +C -*27R4.5 +*27 R4 .5 i02 i18 i2J i3u i4n *A4 O19 *B4 Y1 O05 @@ -96318,8 +95918,8 @@ R4 y1 i00 i10 i2M i3a i4r c $9 $0 $5 $! c $2 $4 $3 $! -tsgB -*94z3*58 +t sgB +*94 z3 *58 ^d ^i ^a ^z c $9 $8 $4 $! O53 stM @@ -96332,7 +95932,7 @@ o6c o4y o7f ^d ^a ^h ^c i1c R7 +2 -1 -7 -i8\t +i8\ t ^r ^o ^g ^i ^g ^n ^s i90 iA0 iB0 @@ -96350,8 +95950,8 @@ $t O08 ^g ^m ^d sf{ OBA ^e ^y ^a ^h ^k -iBir -*08,7 +iBi r +*08 ,7 c $3 $7 $9 $! z5 +9 $s $a $k $e @@ -96362,20 +95962,20 @@ z1 Y5 skz '6 ^z ^z ^i ^f i3y Z2 O51 -o7pY3 +o7p Y3 ^e ^t ^n ^a ^d -8 -F s*i ^g ^n ^a ^e ^c ^o 'W ^d ^l ^a ^w -o9T,3Y3 +o9T ,3 Y3 *15 O95 i9h -oA1y2 +oA1 y2 i32 R2 sHt K s', -lsa4si1 +l sa4 si1 i60 *34 +8 -7 -A q O3A C @@ -96390,7 +95990,7 @@ sCe c -1 -A -9 $g $a $m $e $d L2 $a -Z4y3D5 +Z4 y3 D5 s'h s+W -1 -A -1 @@ -96401,7 +96001,7 @@ $k *15 O13 $b $r $a $n $d *81 O48 c $2 $4 $6 $! -$/$^ +$/ $^ ^r ^i ^e ^m O28 O15 i8> s'@ @@ -96409,28 +96009,28 @@ s'@ c $4 $7 $8 $! c $6 $3 $1 $! O63 z1 p1 -$[$} +$[ $} .5 s). O7A O27 'B ^? u O56 +2 -0 +A ^n ^a ^r ^f -*B1y2RA -k*2A +*B1 y2 RA +k *2A c $5 $6 $2 $! s%G o9L O87 ^e ^h ^q O48 +D -C +E c $5 $8 $3 $! -k$> -s'ep1D4 --1Z3 -s2!z2sLb +k $> +s'e p1 D4 +-1 Z3 +s2! z2 sLb ^s ^i ^w -p5sT] +p5 sT] i31 L6 -*95*B7K +*95 *B7 K +3 Z2 c $2 $5 $7 $! $v $o $n $d $a @@ -96439,13 +96039,13 @@ $a $d $a $m T2 $2 o4i Z1 +4 i0u i1a i2t -*76snLq +*76 snL q +1 -0 +C -iA)*36 -o7_d +iA) *36 +o7_ d O48 $x E i03 i11 i2J i3a i4n -*12svT +*12 svT u i4& s)w ^! ^* @@ -96461,26 +96061,26 @@ c $1 $3 $8 $! i2N O4B *85 O08 o0, -5 -D -qs56 +q s56 r O23 ^& ^@ -i9'sQO -D9*50 +i9' sQO +D9 *50 c $7 $3 $5 $! -L0u +L0 u suq z2 O29 Z1 +1 -5 +A K sp| l $. $i $r c $1 $9 $6 $! -s='sJbsO\ +s=' sJb sO\ ^9 O13 Y2 z2 +2 $5 ^x +7 -o3Wi4A,6 +o3W i4A ,6 s-P O19 -*86sLv +*86 sLv i5i } *87 sn] ^g ^a ^n @@ -96488,28 +96088,28 @@ sn] s&x ^g ^n ^a ^t ^z o2f -}*38DB +} *38 DB o0c ^a y1 O09 Y3 p2 O41 srV -o4UsqN -p1Y3oB6 +o4U sqN +p1 Y3 oB6 o6y i6v -4 T4 R2 O62 -+0sz@ ++0 sz@ s0K O1A ,9 { +9 $\ c $5 $6 $7 $! -'7z2Z3 +'7 z2 Z3 +C -E +D -*57z4 +*57 z4 c $5 $3 $6 $! +B +C +E +2 -D +2 -i9)y4 -D7sp0 +i9) y4 +D7 sp0 l $. $i $d R2 ^q O72 z3 O38 @@ -96520,19 +96120,18 @@ o79 i2i o1% k r +5 -7 +A ^c z4 -*4A*B8 +*4A *B8 ^r ^a ^c ^s ^o $w *63 ^g ^a ^f -1 i2R O16 $V OA4 *36 sn1 -T2 } o0f *46 r $o $e $s D6 o12 -$DZ1l -*98sY` +$D Z1 l +*98 sY` $i $r $a *12 } i01 +2 +2 +A @@ -96542,11 +96141,11 @@ c $l $o $w $e O07 .6 ^N ^n R2 *05 ^' -o8,Z4*A1 +o8, Z4 *A1 O59 O85 $B c $9 $5 $0 $! i4l i5l i6a -i8"Y3o7^ +i8" Y3 o7^ s>O $. *43 O52 p1 D1 +1 @@ -96562,12 +96161,12 @@ O23 i1o o0f *41 +0 -C -1 ^o ^r ^i ^m -o1bi35s+a +o1b i35 s+a sDw C *92 O18 c i2$ -so=*4B -*71i5[+9 +so= *4B +*71 i5[ +9 i4l D7 c $1 $5 $4 $! c $5 $1 $3 $! @@ -96575,26 +96174,26 @@ c i2/ +3 +3 +E s>* c $1 $4 $8 $! -sElt +sEl t s>% ^- ^( ^- ^# -Y3*36 +Y3 *36 *40 i47 o3t O52 c $9 $0 $2 $! -}*0A^w -z1Z4 +} *0A ^w +z1 Z4 *71 +0 y3 +1 z3 s8v s(x -*32Y4sjz +*32 Y4 sjz ^" ^( i6l i0Z *56 Z5 u O95 s(h -o1X-2 +o1X -2 s0| *36 i9c iAk iBs c d 'C $2 @@ -96602,7 +96201,7 @@ c d 'C $5 $s $h $o $e c $9 $7 $1 $! c $9 $7 $6 $! -o3}$+i7P +o3} $+ i7P *56 u O62 O65 R0 i8$ OB1 C @@ -96612,7 +96211,7 @@ sgQ i22 i30 i41 i2a i4e i3k ^A o5K z1 -^nD1$p +^n D1 $p *05 -2 *34 p1 o90 *65 O13 z4 @@ -96624,7 +96223,7 @@ c $j $a $r L5 sgw $F *BA C d 'B $1 -}o5' +} o5' p2 *78 { $x O28 $g i72 *61 @@ -96632,13 +96231,13 @@ c d 'A $6 D1 o0Q O34 c $d $o $w $n si9 i21 $4 $7 $8 -L3o4e -Y2*86Y3 -$zp4 +L3 o4e +Y2 *86 Y3 +$z p4 Y3 z1 c $3 $5 $1 $! i4y $1 i6s o97 o89 -*82so7 +*82 so7 L1 *15 o0d k $y $q @@ -96648,7 +96247,7 @@ c $3 $7 $1 $! +A .0 ^; ^' O89 O75 -RA*85 +RA *85 c d 'C $4 $j $u $n $e E sR, @@ -96663,11 +96262,11 @@ TB O19 $" z2 iC; O19 $5 *82 --AsA'] -*7As8' +-A sA' ] +*7A s8' O34 o1F O0B i8- -k^^ +k ^^ +A -7 -0 i6j i8l i7u -3 o2r @@ -96676,10 +96275,10 @@ O12 p4 $# T0 T5 TB +A -9 -D sFg -.BoA8s2d +.B oA8 s2d i46 t '6 T1 -i1dp4 +i1d p4 -4 Z2 O78 s!- *87 sGf @@ -96695,15 +96294,15 @@ c d 'D $6 $f $a $y $e d i8_ D4 p3 sYu -o3%sN- +o3% sN- u $F O23 i33 i41 i59 c d '6 $9 -y3y4 +y3 y4 O91 *19 z4 d *50 D1 K -[s+d +[ s+d c $2 $9 $1 $! *02 '6 t iB. @@ -96718,20 +96317,20 @@ i3v i5r i4e $z O15 *62 $j $u $n $o C d $8 -s@N*76szP +s@N *76 szP ^s ^n ^u ^s +3 +3 +D $n $i -*72*09*29 +*72 *09 *29 c $7 $2 $8 $! o3& l -2 $y $v O03 ^j y2 -,Az2 +,A z2 i7j R9 -r*16 +r *16 s)` O48 -$[$' +$[ $' -4 i4i iC? sW0 @@ -96739,11 +96338,11 @@ L4 Z3 *02 Z1 O71 i4e svp K D7 o5c k -$usgkk -oBnt +$u sgk k +oBn t +C -5 -7 -,4sh3 -sjbsY+Z3 +,4 sh3 +sjb sY+ Z3 o1i i04 ^s '6 s!^ @@ -96753,7 +96352,7 @@ $l $a $m $e s7g ] z3 sti [ T3 T0 TC T6 -iAHsD} +iAH sD} c $t $i $k $e Z1 sJd O51 *93 *A3 @@ -96765,9 +96364,9 @@ c $8 $2 $1 $! sY\ ^j r O05 c ^b ^c -+2sm% ++2 sm% L8 '9 -y2sGfsIe +y2 sGf sIe ^y ^k ^c ^u ^y i3p D7 q D0 O64 @@ -96775,21 +96374,21 @@ q D0 O64 $? o63 Z4 c s-' -Z4y3 +Z4 y3 ^e ^m ^a ^n '4 i0p O03 c O49 i3o i4c i5t ^1 z3 } -y1i8osf6 +y1 i8o sf6 c $w $o $l $f c $9 $2 $6 $! L4 *02 Z3 -*96^Vd +*96 ^V d f .0 i02 i14 i2m i3a i4r c $2 $3 $7 $! -sZ6y4*28 +sZ6 y4 *28 $M $a $r $1 $7 $M $a $r $1 $2 s=m @@ -96802,7 +96401,7 @@ O05 Z2 C Z3 s73 D3 '7 R5 s2y -$N^ji7} +$N ^j i7} o0l L5 i9i iAo i9i iAf @@ -96822,40 +96421,40 @@ c $4 $6 $8 $! $b $r $i $e O61 $3 i3p i5r i4e -spq{ +spq { ^e ^f ^a ^s i21 T3 -Cs7? +C s7? DA O47 ^n ^e ^h ^w $h i92 ^u Y1 s2i r D7 -*0BiA| +*0B iA| c $0 $1 $3 $! +7 OB4 z3 Z3 $q Z2 ^s ^m ^u ^b +B -8 -6 O15 O14 -sNHo2gy3 +sNH o2g y3 $z $e $a $l *80 T5 c $3 $4 $8 $! -sJ.Y4k +sJ. Y4 k *52 L0 $K o5B +A +A -0 O18 *98 OB9 i18 T2 o1y sc1 -*47Z1^j +*47 Z1 ^j O97 *2A s/# -*04y4 +*04 y4 $M $a $r $8 i0H i3l i4o i2l i1e -^Fs@mZ2 +^F s@m Z2 '6 o4O c $^ $4 c $5 $6 $0 $! @@ -96866,9 +96465,9 @@ c $6 $3 $2 $! *19 D1 p3 OA2 $i $d $a -Cs7Z +C s7Z $m O18 -sC-Z4C +sC- Z4 C ^7 Z3 i5y D2 i4c i6i i5h @@ -96877,8 +96476,8 @@ $d $e $c $1 $0 sr5 D1 sq( d ^r ^a ^j -{*67f -$|+A +{ *67 f +$| +A C d '7 $3 ^s Z2 c $7 $2 $9 $! @@ -96894,15 +96493,15 @@ c $2 $0 $5 $! sD -$aZ3,6 +$a Z3 ,6 c $s $k $i $d -^l$@ +^l $@ c $6 $7 $5 $! L6 '9 sm} -*46sB$ +*46 sB$ c ^6 ^f O18 *8B sz| ^l ^l ^u ^f @@ -96953,13 +96552,13 @@ O52 ,5 ^e O87 $p $r $o $d i0w i2l i1i -i1uy4 +i1u y4 L3 y4 i4y i6s $1 i89 o97 -8 $2 so9 O74 $i $b $i $s -*06s-**1B +*06 s-* *1B $+ *56 *17 D1 Z2 o2V -3 @@ -96967,39 +96566,39 @@ $s $l $i $p $s $r $e $n $o *05 O1A *02 *89 OA4 -]o1 +9 +B -C C o60 @@ -97083,10 +96682,10 @@ o08 $x r c $j $o +1 +A +2 f *32 -o6^,3 +o6^ ,3 ^y ^b ^u ^r c +5 -1 -A -^[s+= +^[ s+= K l i04 s/C T3 TC @@ -97094,14 +96693,14 @@ $E c [ i7l i81 i93 O39 ^1 '6 shb -*8B*2B,8 +*8B *2B ,8 ^f ^e ^i ^h ^c z5 +5 *25 ^a O8B +1 +C +B -se+shdsEt -oB?iAz,8 -i8Zk +se+ shd sEt +oB? iAz ,8 +i8Z k o4k OB1 $X sdr L6 $I *24 @@ -97109,28 +96708,28 @@ sc) *78 *A9 $f $e $b $1 $0 z4 *29 -z2i1v +z2 i1v c $5 $6 $1 $! -TAshZ +TA shZ c $7 $2 $4 $! O56 sqJ $9 O25 R5 o0d D1 $9 $5 i3b *39 D3 -5 -}L6*78 +} L6 *78 -3 -F L5 OA7 OA2 -$0oB] +$0 oB] c $8 $7 $9 $! ^d ^d ^i ^k $v $i $r $u $s c $8 $5 $7 $! -uY2s1p +u Y2 s1p i4q o95 -3 -D c $6 $1 $4 $! O23 z5 st2 -$'$\ +$' $\ $r $o $a $d i3[ O12 $b $i $r $t $h @@ -97156,10 +96755,10 @@ l o4t T0 ^D O64 sh/ ^s ^l -*74L0 +*74 L0 o0z $9 $7 $2 o4q iDh -s5}-7 +s5} -7 su+ +6 -F c $5 $4 $2 $! @@ -97175,7 +96774,6 @@ c $3 $7 $0 $! sJ# c $9 $0 $4 $! $q o0$ -,B E o2u O82 ^c ^i ^b ^u ^c ^E Z1 @@ -97185,28 +96783,28 @@ O67 z4 z3 *85 o7s *A0 O4B c $9 $1 $2 $! -i8yo4R +i8y o4R $j $a $n $e ^m ^a ^r ^p O37 O7B [ -y1co7% +y1 c o7% ^d O74 y5 -$7r+2 +$7 r +2 k r R1 $J $a $n $1 $7 $J $a $n $1 $3 $7 sgc -{Z4oBR +{ Z4 oBR p1 o7i i4r i5i i6n -o6so8Gi1B +o6s o8G i1B Z1 ^l i4b sGp c $0 $2 $7 $! -sE8D0 +sE8 D0 ,8 Z3 sgm z2 -l*76R0 +l *76 R0 c $3 $1 $5 $! o4o p1 ^e ^p ^o ^h @@ -97215,14 +96813,14 @@ $. *92 ^a ^r ^a ^l c $5 $3 $4 $! i4r i5i i6a -.Ai9f*95 +.A i9f *95 $g $r $a $p $e *62 *57 +7 *70 u O52 p5 o63 $! ^D $B O29 .A -siLK +siL K s35 d OA3 $1 c $8 $5 $0 $! @@ -97248,7 +96846,7 @@ i7d i3f O84 O05 O93 s"Y O71 d O07 -ky1,A +k y1 ,A sm( $1 y3 O28 l d 'A $7 @@ -97260,15 +96858,15 @@ $d $o $r $a i00 i16 i2M i3a i4r C d '8 $3 o3s o1w -oAs*1A -sb9s*O +oAs *1A +sb9 s*O $p O62 Z1 siV o0n o1i +9 $2 i6s D1 $+ C 'D $4 -*98.Bp4 +*98 .B p4 i6i ,5 i7U O81 $j $a $n $1 $6 @@ -97278,11 +96876,11 @@ Y2 O12 [ p1 ^) o2$ Z1 O42 ^k Z2 -3 -iA%s]7*0A +iA% s]7 *0A *50 K D1 l $. $k $g ^z O93 z1 -o2io6Q +o2i o6Q ^4 i0( $s $u $i $n $g -5 i55 @@ -97296,13 +96894,12 @@ l d 'A $6 T3 i3f O73 'A se* -y2-3syH +y2 -3 syH c $8 $9 $7 $! $N $o $v $2 $5 l d 'A $3 z1 { $s -p3 } l -.2*04$7 +.2 *04 $7 s?P O42 i3j o7i O51 @@ -97310,20 +96907,19 @@ l $. $k $e s?^ c $9 $2 $3 $! { r O32 -sF8i8E,3 +sF8 i8E ,3 iE& -i2Q+4 +i2Q +4 O53 *24 '5 L4 O21 -sQUE +sQU E O52 ^a -$l*30 +$l *30 -0 o17 -*B8iBf -CZ5 +*B8 iBf O19 suJ ^z ^o -y4*19D2 +y4 *19 D2 o52 *03 $m $a $r $i $e p4 sO[ @@ -97337,30 +96933,30 @@ s?9 o1O O52 O82 [ O41 iE$ -*3AR6p1 +*3A R6 p1 ^o T1 ^g c $9 $0 $1 $! sBe O04 -*85s;OoA' +*85 s;O oA' c $2 $8 $4 r o5" -o6I$M'A +o6I $M 'A +3 o1e ^s ^s ^o ^l -0 .3 O43 o1u c $4 $5 $7 $! +2 +E -z1i4w -o2Wz3 -*87Y3 +z1 i4w +o2W z3 +*87 Y3 s-` z3 i4r sk[ l $. $k $w [ r d sZz -+9L1s[G ++9 L1 s[G skf E $o sef *35 R9 @@ -97380,12 +96976,12 @@ sTk O01 o71 *50 z5 s?} O71 K ^f D2 -z4*28D2 +z4 *28 D2 i56 O13 -i4Es7@R8 -{.7s$U -s%Y^7*12 -ksyqs[K +i4E s7@ R8 +{ .7 s$U +s%Y ^7 *12 +k syq s[K c $7 $0 $3 $! O16 s&s d $1 ^s @@ -97416,14 +97012,14 @@ Z1 o5k ^t ^r ^o ^f $p $e $t $r $i o3k *14 -EsW!s#( -,7p1Z4 +E sW! s#( +,7 p1 Z4 ] p3 '9 o44 '6 $b $o $n $z $e o4i $t $a -o6Ry3sSm -,B*39 +o6R y3 sSm +,B *39 $l $o $u i0n OB6 O08 i45 o33 @@ -97431,7 +97027,7 @@ i45 o33 ^t ^a ^r ^u ^m Z2 p2 d sbw ] -s@jC +s@j C ^1 -1 O65 sH- $s $a $x $b $y @@ -97443,27 +97039,27 @@ $u $t $y $p $e O46 i4^ -1 o4x $n $u $k $e $m -ds|l,7 +d s|l ,7 $a $u $s $t i5o o2n $f $l $y $s Z2 *90 $e $s $d $o $l -sE?s)q -*29oAj -Y5} +sE? s)q +*29 oAj +Y5 } -0 -C -D $m $o $m $e $s $z $y $a s'_ -i0`Y1s{d +i0` Y1 s{d OA7 o4( O95 *4B -sDwsm( +sDw sm( o78 $4 -s.s} +s.s } o0w O39 Z4 -RA$p +RA $p s*P ^5 *65 o04 o0X u @@ -97474,14 +97070,14 @@ sy4 Y3 ^d p1 O27 .6 p3 $t $a $s $t $e -*1B^|sAK -*61d +*1B ^| sAK +*61 d o3k +0 $e $e $8 $6 +2 o0H f *16 +2 -6 -9 -s /+8 +s / +8 K O58 o3l ,1 i57 O03 @@ -97490,24 +97086,24 @@ $s $a $n $d $i i8i i9d iA1 o5i t $m $b $u $l -sw5s'5 +sw5 s'5 s,T -sMai00 +sMa i00 s7d ^i O07 $c $y $t $o ^k ^r ^u ^t s,W o3m .4 [ K o4t -Z4s[B +Z4 s[B O01 o2m sQ@ o6 O15 $s $a $v $e $1 ^S O6B L9 oA) $h $u $i -fs?`sn? -sD9i0Y$f +f s?` sn? +sD9 i0Y $f o7c *16 $5 *52 [ ^N o1u @@ -97525,20 +97121,20 @@ s{j c T4 i4+ $a $g $a $t $e ^d ^n ^a -*5Ai6{sCH +*5A i6{ sCH sRp O4A [ k y5 s,} o11 o9b O81 -*72sew -*79}$[ +*72 sew +*79 } $[ ^a ^r ^a ^c ^l ^a ^g $n $k $o $s $i +0 O36 $* $r $o $w $l $e smJ -*17ts?d +*17 t s?d sZ3 O91 *B7 D1 R7 O05 @@ -97547,14 +97143,14 @@ $l $y $t $h $u $n $t $a $r ^z ^e ^u ^s $h $a $n $d $s -*1A*B3 +*1A *B3 Y3 *26 D5 s,g ^3 s;. $] O34 -dT9*73 +d T9 *73 $t $g $o -Z3s;\i6d +Z3 s;\ i6d D5 O57 O25 D9 i2i i4e i3n @@ -97582,11 +97178,11 @@ O38 *4B +B o2k O81 i1f i53 se" -*50*79 +*50 *79 i1o i3e i2k ^i ^d +6 i54 p2 -*59tY5 +*59 t Y5 suM c p2 D3 O79 p2 O4B sN? @@ -97599,10 +97195,9 @@ $g $y } o1k $f $r ] $B *69 -] ^l O5A i4' } o1w -sl`*A1 +sl` *A1 D7 sA$ *30 ,3 *52 Y2 *71 @@ -97621,7 +97216,7 @@ T0 *07 O21 Z1 o5% k *B0 o4V *85 -ky5s^Y +k y5 s^Y ] o4b ^b o3a u ^3 @@ -97631,7 +97226,7 @@ i4k r R3 *07 O38 ^e ^p ^m ^e ^t O54 O01 ^r -o5pi1] +o5p i1] ^l ^a ^p $a $r $i $e $s E i9| OA1 @@ -97642,15 +97237,15 @@ O23 o36 o10 R3 $$ z3 *62 ] sui y1 -s@Y*70 +s@Y *70 *05 o5e o3H DB [ i2y -$hDB*27 +$h DB *27 *89 ] $b $l $o $g $s $c $h $e -Ep3 +E p3 i4g *23 y4 *58 $p O43 i5y @@ -97658,24 +97253,23 @@ p3 svk D0 ^% O69 ,B O41 $J o2t $r -$ $^ +$ $^ [ i2d z1 ^& -sXDfi0, +sXD f i0, ^* p3 i1. i3. $. i5. i7. sy? -E *A1 [ i2g O41 $2 D6 L0 O16 Z2 *96 T0 Z5 -R3i99 +R3 i99 Z2 Y5 -slY*06sUV +slY *06 sUV i2( O74 *9A -Z3i4e +Z3 i4e s9" t $s $u $g $a $r } *91 @@ -97683,7 +97277,7 @@ Z5 O39 ^_ t $= O96 ^b ^a ^l ^f -$ $# +$ $# O63 -2 z3 s/4 o7k D3 @@ -97691,7 +97285,7 @@ o7k D3 +D +D +F $t $r $i $a $l o15 o6u -D0z3*7B +D0 z3 *7B R6 C *64 ^n ^e ^p ^o $f $u $c $k @@ -97699,12 +97293,12 @@ y2 Y5 ^b ^o ^l o3j *85 .1 .0 +0 -*36s`n{ +*36 s`n { i42 sky y1 skm O27 { -*93s[{ -*18sR#*B9 +*93 s[{ +*18 sR# *B9 O14 O25 O09 o0& ,8 o4k $3 @@ -97714,10 +97308,10 @@ syP so0 D1 o0p +8 o46 z2 -$)K +$) K D9 LA o2k i4a -s;Jc +s;J c t i4< ^b ^o ^h *03 i5w @@ -97732,22 +97326,22 @@ $v $a $d $e $r p1 $V ] i2i Y2 s.f -qs8.sFu +q s8. sFu ] i2h q O6B -s;pshV+8 +s;p shV +8 s1w -4 ^m ^a ^l +4 +F o56 ,6 i11 .4 -Z3sa/ -+4s$2 +Z3 sa/ ++4 s$2 sbJ OB4 -5 *73 O41 ^y ^a ^d c z4 y1 Y2 -sw[c +sw[ c i3z D5 O31 i6i L0 q @@ -97765,10 +97359,9 @@ s/( i5e y5 r ^x ^n ^i ^j O23 i3t -diBl.5 +d iBl .5 O73 o1g ^s ^u ^n ^a -[ ^} i5a i24 O76 t L3 [ o2p *05 @@ -97786,25 +97379,25 @@ y1 y2 O6A $ } Z2 y5 O93 O62 O42 z4 { -*60'B +*60 'B o2p r L9 *96 ^a ^y -*A0fs(\ +*A0 f s(\ i67 *02 ,3 -2 ^8 s7e T2 t $D -s]is+Y +s]i s+Y l i1Y OAB R6 y5 sHe ^s ^a ^h i5a +7 o1o sWt -]o27^+ +] o27 ^+ sg) -Z1o22*80 +Z1 o22 *80 y2 *AB o0k *35 K O03 { @@ -97822,9 +97415,9 @@ O53 $h [ r O51 s#p o1? D7 -o5DsM][ +o5D sM] [ D2 y3 Y2 -Y5s6s +Y5 s6s s#H ^c ^t O31 O5B @@ -97846,9 +97439,9 @@ $u $n $i $t $e $a $u i22 '8 '4 ^L -*5A*B8 +*5A *B8 o9D $@ -ci8} +c i8} ^v '9 i8t y4 y2 l o0] @@ -97857,53 +97450,53 @@ o0i } *20 o5d O41 sde sNa -*17L1 +*17 L1 $y o5t O79 s|@ sv_ -Y5p4 +Y5 p4 Z4 *16 O52 ^O i75 i17 -s-)qD0 -qs,6 +i8& sN> ,6 O23 y3 } *5B OA5 u i5+ Z2 y3 -$rsUr +$r sUr O12 ^2 Z4 D2 -7 .3 i4m ^a ^v ^i D0 *7A -s}g$W*03 +s}g $W *03 -0 o3d sOH t i04 -4 s"] $K i5O z3 *43 -i7'sN_ +i7' sN_ .3 i48 -sK*s|% +sK* s|% Y3 o3A f O69 u p1 oAo sFf L7 O85 -s?u,B +s?u ,B $D OA6 $) D7 *68 *98 -*2AoA9sjf +*2A oA9 sjf Z2 O59 ^a ^l ^r ^a ^d -*39p3 -f O31 ] +*39 p3 p3 sQC -i6(z5Y2 +i6( z5 Y2 O07 o1 t o41 ^s p2 O04 @@ -98010,13 +97602,13 @@ p5 s6A o0i o4n ^p ^o ^m o4v O31 -R2DBi9F +R2 DB i9F o2s p1 ^U Z5 O48 Y2 u R9 -5 D8 R0 D6 -^S$*sUs +^S $* sUs O76 $i y1 OB1 i52 s,H O68 @@ -98038,12 +97630,12 @@ sA0 *20 *47 O68 Z3 sg% sDo -y4y1s/l -Y3R3 +y4 y1 s/l +Y3 R3 i3a *04 o60 O21 s?M -*35i8g +*35 i8g i5l +4 D0 O24 y3 i0A *31 @@ -98053,7 +97645,7 @@ K i1R s@^ OB4 iBr sN0 -*52T1 +*52 T1 } [ i3o ^l ^e ^d ^o ^m ,B $J O41 @@ -98079,10 +97671,10 @@ $0 ^o O83 -9 O52 i34 *18 K -.6cf +.6 c f d ^1 c $C $9 -i7Gsc@z3 +i7G sc@ z3 { ^y O67 i1e i2v i3e sN` @@ -98090,10 +97682,10 @@ sN` Y1 O38 z2 r s6k sI, -p2s u +p2 s u O37 ^p -qs(Ls8O -L3s>S[ +q s(L s8O +L3 s>S [ O2A l O59 ^+ O43 O83 i7a @@ -98102,22 +97694,22 @@ sdG O84 $f ^o O03 c $t $o $y i6x O72 -+5D8Z4 ++5 D8 Z4 L6 s61 -,8^8y2 -f^5 +,8 ^8 y2 +f ^5 sMr iE0 -}sB( +} sB( c $C $b -E-7i4[ +E -7 i4[ Y5 *87 +A -L8sZ *40 +L8 sZ *40 ] $a Y1 R2 D4 $a Z5 ^9 } OB1 -$\iB> +$\ iB> o6E p2 '9 y5 *51 *48 @@ -98127,13 +97719,13 @@ c $D $d $t $w $s $p $i $k $e c $D $8 -s3Ry2Z3 +s3R y2 Z3 $b $a $r $e s_0 *75 o0z ] *05 .2 y2 sTo -sx'L7iA2 +sx' L7 iA2 p1 $c y3 i31 O51 ^k ^s ^u ^t @@ -98144,44 +97736,44 @@ O47 d u $d $B sM@ s/p -D7o6Ao0# -$)$_ -Z3y4 +D7 o6A o0# +$) $_ +Z3 y4 o0m *54 L2 L2 ^= K s,K O09 i4W -*7As'p +*7A s'p *B6 c $I ^R -*B1sf>p5 -Y5*5Ao74 +*B1 sf> p5 +Y5 *5A o74 s`C C O12 ^c O04 $7 -B i3s i5e i4t s/9 -Y5sZzsHE +Y5 sZz sHE ^x ^0 O71 $s z5 -*B2iB!$y +*B2 iB! $y i3c $a -E^[r -s!q*91 +E ^[ r +s!q *91 si! T1 -s;B$B +s;B $B ^x ^5 Z3 o6k ^o ^i ^t ^a ^r i26 d o3u i2w -$po1f +$p o1f Z2 R5 $e ^< z3 $r $i $t $a ^` O75 ^x ^6 -sr,.9Z4 +sr, .9 Z4 o45 Z3 s+q Z3 s.8 @@ -98191,27 +97783,27 @@ z3 *67 OB9 l i5C p4 iAP O9A $w $o $l $f $s -Y2R9*41 +Y2 R9 *41 ^e ^t ^a ^n ^x ^8 -*26*58 +*26 *58 u $4 $E O05 $< p5 O4A ^D ^F s+K -sZ=s`Y -]i3< +sZ= s`Y +] i3< $0 O04 O14 O72 O21 -z2$8K +z2 $8 K E su] $' k O54 *03 u O3A o5S s#D i7f i3d -o1)*A5 +o1) *A5 Y2 D2 O31 .A ] o2u @@ -98228,27 +97820,26 @@ u ^1 ^2 i8j t O59 iB *4B $g $u $y $s -p1 ] O68 u ^2 ^D +3 *41 [ -^MsT=T1 -sWQi19K -f$S +^M sT= T1 +sWQ i19 K +f $S ^3 y1 } r p3 O08 -s&e*B4 +s&e *B4 } o81 *94 OA2 $p $a $n $t $s --7*08 -i1)*14 +-7 *08 +i1) *14 o0v i2m s;. p3 z1 i96 ^b z2 *56 iA& ^_ O54 $s $i $r $e -sRD*28 +sRD *28 +1 { *21 c ^i ^l ^a ^b *32 K @@ -98260,28 +97851,28 @@ sU2 o2r *54 *38 O83 u ^2 ^0 -*69sG[ +*69 sG[ OA8 O28 *42 -.8r +.8 r i2( r O62 *43 ,3 y5 O83 O03 i2n s?u O4A -z5z2] +z5 z2 ] su= { *31 Z1 -[E'2 -DB*23 +[ E '2 +DB *23 *01 i1u z2 ^& ^n ^e ^d u ^5 ^f sgI i2j -sCmsQ=d -o7_qo0= +sCm sQ= d +o7_ q o0= sst +9 [ -s5C*71 +s5C *71 i3o d $j $o $y $c $e slo O05 @@ -98289,20 +97880,20 @@ u ^1 ^E i35 o6z i2t i3t i4l i54 i1f -T9} +T9 } t k $P -s+r*91s0a +s+r *91 s0a u ^1 ^D t o72 u ^1 ^C { i4? Z2 ,5 i3, -4 -$tsR]TA +$t sR] TA *65 z3 *32 o2r i2n c O52 -*4A*23.A +*4A *23 .A u ^1 ^B c $E $7 R0 *54 @@ -98316,56 +97907,56 @@ O2A s|t z3 o0g -4 ^` -2 sf3 *46 -*8A^R.4 -o7(Y5 +*8A ^R .4 +o7( Y5 OA4 r [ y3 D4 o5& *02 i0, O17 u ^6 ^8 $k $i $n $g $s -^CL4{ +^C L4 { O4A p5 R1 $h $o $s $e Z3 i54 -Es;' +E s;' s7g z3 ] u ^6 ^a o51 .2 -fsMq*A5 +f sMq *A5 O94 O94 OB9 *0A i4W o0P O42 -4 -y3i6yY1 +y3 i6y Y1 k y1 { u $A $E o3k o0v O42 i1h o1f p2 $g $o $t $h -iA$*A7 +iA$ *A7 O42 R3 -s)1sKki3, -,2i1vsjC +s)1 sKk i3, +,2 i1v sjC sHv u $A $F T6 R2 ,7 O32 i11 y2 y2 O42 *38 i9D -^6i3 sW1 +^6 i3 sW1 $e $d $n $a -s&Is"asVN +s&I s"a sVN *16 O0A *35 ] o3+ sLs L3 L4 O42 *42 t z4 O98 -p4*76 +p4 *76 o4p Z2 $_ $a o7i -s@_} +s@_ } $h $o $p $e L3 R1 ^B ^x @@ -98374,10 +97965,9 @@ o73 *57 $. $s o11 p4 ,5 *7A o5Y OB8 -oBQE^r -L6s}U +oBQ E ^r +L6 s}U u ^8 ^b -i3t D0 O02 $i O31 DB T8 -1 } O85 @@ -98399,14 +97989,14 @@ TB *12 ^r ^o ^t z4 +B -9 oA8 -^3*9B*35 +^3 *9B *35 i1b i55 u ^8 ^0 $w $e $s $t *78 O95 O86 { OA4 Z2 *01 -s +$- $> *02 o3/ s1a R5 sB" @@ -98557,21 +98146,20 @@ u $C $D -6 ] $7 c ^e ^6 i15 i1f -o3g *54 E i17 i1b s0K ^Q '9 s-F $d $e $c $a $f O9A C -s-{i3^R3 +s-{ i3^ R3 O95 y3 O68 Z2 ^w szI k o84 O24 -$-$` +$- $` i39 i5f i17 i78 -Z3*29 +Z3 *29 ,1 D8 f o3A z4 $a i8b @@ -98582,19 +98170,19 @@ sQi so/ O58 '6 i5w 'B ^_ -Y3*27 +Y3 *27 *67 -4 ^p ^o ^r ^d c O73 L1 ] sPE ^ O24 i78 i36 -*60$% +*60 $% sQb s^q oBW O24 -*58*43o13 -$$$" +*58 *43 o13 +$$ $" K R0 T0 ^7 ^l '6 @@ -98610,7 +98198,7 @@ q $_ ^o ^r *A7 O87 D3 +A O64 -$"$= +$" $= Z1 O57 ^g ^l ^i ^o ^t O3A z1 @@ -98621,7 +98209,7 @@ i8a i93 scV RA o3r D5 u ^E ^A -i2K+8 +i2K +8 Z2 E p1 t *B3 O86 o1b +0 @@ -98636,7 +98224,7 @@ i5e i16 *36 *03 O02 u $D $F u $D $C -$~$$ +$~ $$ s,! [ $h i5r Z3 *68 @@ -98666,12 +98254,11 @@ o71 *15 $b $r $a $i $n c $i $o $u $s i52 i16 -} ] ^d i5e R6 R7 +7 Y1 *67 i5f i3b u $D $3 -*39*0BoAM +*39 *0B oAM L1 O62 O57 i8S 'A s+G @@ -98685,14 +98272,14 @@ i3e R0 i76 i37 i37 i5c i58 R3 L3 -o4&*10 +o4& *10 u ^b ^2 i35 R4 L4 $+ q -i2A{sn/ +i2A { sn/ i16 i5d u ^b ^d -$*$[ +$* $[ *06 R7 sA5 o7t *02 @@ -98702,9 +98289,9 @@ i1f i32 i7d i1b i39 R4 i78 R1 L1 -i9PY5 +i9P Y5 i71 R6 R8 -,6s+4R2 +,6 s+4 R2 ^e ^i ^m ^a ^j o9r o4o c u i7W @@ -98724,11 +98311,11 @@ K $8 i59 i17 s+2 i3o [ -sj +sj< sl> u ^f ^c i1c i56 Z1 O79 q -i11i29i36i40 +i11 i29 i36 i40 ,3 'A o3h O62 si[ @@ -98736,12 +98323,12 @@ O74 *56 o1R o6y i6a o5a *40 +4 i03 C -Y2Z5 +Y2 Z5 *25 $7 i36 i1b i17 L2 OA5 o7o -z5p5 +z5 p5 o0c i6n $3 i2h u ^f ^7 @@ -98752,7 +98339,7 @@ i3f R1 R0 c ^7 ^a i31 L3 R6 p1 -B -sH spC +sH spC p1 o1h ^e ^d ^i ^h c O14 s0Y @@ -98762,7 +98349,7 @@ c $z $o $n $e c ^7 ^b ^T *03 o58 $0 -i8X-2 +i8X -2 s"C D7 E ^Y L1 L1 @@ -98774,16 +98361,15 @@ iBu O56 i38 i1f K ^a -7 r +2 -O52 r p5 i1f R6 L6 O53 TA r sg3 -sx!Z1^- +sx! Z1 ^- i3b i11 o6s O41 O21 ^k o99 O62 -C*6Az3 +C *6A z3 i7e i3- u ^C ^F $d $e $v $i @@ -98810,11 +98396,11 @@ u $f $A K o0p i1c i78 ^# *52 r -*06z5 -$'$- --9o4ei5* +*06 z5 +$' $- +-9 o4e i5* u $f $C -*67*0B +*67 *0B ^l ^l ^e ^d z3 ] *62 +6 Y2 @@ -98843,7 +98429,7 @@ OA1 O21 O71 i73 R3 L3 i12 i3d ^t ^s ^u ^g -*94^0u +*94 ^0 u sLf OA8 OB8 i7f R8 L8 $s o0b @@ -98853,8 +98439,8 @@ q +3 [ i1f i78 O24 Z3 *15 i1f i76 -Cs&}i4F -o45DA +C s&} i4F +o45 DA i40 $7 u $B $6 i53 R9 L9 @@ -98865,22 +98451,21 @@ sm4 [ E y3 +4 i61 c $F $D -Y5ts\R -$$$; +Y5 t s\R +$$ $; O52 Y5 'A ^% O35 -$Dz2 +$D z2 O81 *0B ^n ^i ^r ^e $s $u $c $r $e +5 O02 *03 ^l ^l ^i ^k ^s $f +4 Z1 -o5Zd'8 +o5Z d '8 s # D5 o49 -[ $0 [ -o17p5*80 +o17 p5 *80 $k $o $r $e $a D6 i2r u ^d ^f @@ -98888,13 +98473,13 @@ k O31 K i16 ] *63 f O19 O21 z3 p4 O63 -o7_*76sKZ +o7_ *76 sKZ ^y -7 i64 O13 d -,8o0so5? +,8 o0s o5? i18 i5f y5 O68 -*67+8L0 +*67 +8 L0 i14 i3e i14 i3d i18 i5a @@ -98903,7 +98488,7 @@ svc d Z3 +3 *35 *61 u ^3 ^8 -ksPh +k sPh O68 d .5 $. $m i71 i18 @@ -98917,39 +98502,39 @@ i1c L3 D1 i5+ o0o ,5 c ss$ T5 -*3AY1sqH +*3A Y1 sqH oBg O29 -Z5o9. +Z5 o9. i15 i5e i71 i37 -s]*i2P +s]* i2P O31 o8Q z5 i54 O72 y3 ] *16 *76 O02 O3A o4" u ^3 ^5 -.1u +.1 u O68 $] -s"p$U{ +s"p $U { i77 L4 L5 o5o *13 ] ] Y3 O65 z5 o2U O53 ] Y3 ] -*98l^O +*98 l ^O c $8 $A -s,*i9u*B5 +s,* i9u *B5 u ^d ^7 -s*to9Vi6\ +s*t o9V i6\ i17 i1f s92 *57 i8M O67 Z4 i1f R3 L3 O61 $2 i36 i1f -*89o3S +*89 o3S i76 i38 t $Z ^i ^l ^a ^c @@ -98964,16 +98549,16 @@ $h $u $a $n $g O65 sFO o0s ,7 $z $e $n -so_i2(o27 +so_ i2( o27 u ^3 ^c o06 y1 $t $r $o $y ^T T1 -*A4D5i1- +*A4 D5 i1- i32 R7 L7 -*97^8 -i22i30i42i51 -sqV^E +*97 ^8 +i22 i30 i42 i51 +sqV ^E O27 ] o7B u ^3 ^E sk^ @@ -98984,7 +98569,7 @@ $f $i $s $t sZQ i52 i41 O08 '8 --8*68Y4 +-8 *68 Y4 i2i o5v ^z $k $e $y $s *09 O76 @@ -98994,11 +98579,11 @@ i1c R6 i62 +7 z5 ^w O35 O32 ,1 z4 -}iBe +} iBe d i0z o4s *62 u ^0 ^7 -ss6*28$B +ss6 *28 $B i4c *23 Z2 O23 { ^z ^i ^r ^a @@ -99008,9 +98593,9 @@ i31 i1f i5b R8 L8 i35 i5f i74 i13 -^8*19 +^8 *19 -3 D1 -s"H*02 +s"H *02 o1C u ^n ^n ^a i4e i5r i6i @@ -99019,74 +98604,73 @@ i4e i5r i6i skb [ O23 Z2 O23 [ ^h ^a ^e ^l -sJ;i89 -*96Z4 +sJ; i89 +*96 Z4 $e OB2 o2l .0 u ^0 ^d o0t +5 -Z4qZ4 +Z4 q Z4 sa4 C sf| D3 d *30 -$x[,2 -Z4+9 +$x [ ,2 +Z4 +9 [ $3 +1 ^a ^t ^l ^a -o9Es,&*20 +o9E s,& *20 O43 o3x ^T ,6 i4e i5n i61 sa4 r [ D1 { -f O04 ] ^y ^z ^a ^l ^4 c +8 ] O71 i0Z u ^7 ^6 -D7i1Bs.| +D7 i1B s.| i3 ] Z1 i8y Y2 *51 D3 -i3Ri7' +i3R i7' i11 O61 Z4 O67 y2 T9 O41 O15 o50 ^f $k $r $i $s -]$Ko0D +] $K o0D ^r ^i ^s ^e ^l ^a ^y u ^7 ^5 i14 L1 R7 O96 ^| E -s -$d$k -{-7 +$ ^> +$d $k +{ -7 i4m -D4R3 -$pZ2 -D0'B +D4 R3 +$p Z2 +D0 'B szt i1o -t^G -Z2+6 -O81$z -z1^7 --1d -DB$c +t ^G +Z2 +6 +O81 $z +z1 ^7 +-1 d +DB $c s+ -$8Z3 -i42-7 -o5z -^9c -D5$7 -co5F -$6-8 -+6*56 -^ho4 +$8 Z3 +i42 -7 +^9 c +D5 $7 +c o5F +$6 -8 ++6 *56 +^h o4 i7- -O02^y +O02 ^y o5d -+7c -D7$i ++7 c +D7 $i iAr -+3o3p +o3p smk i1f i7z oA4 -{i1a -O02u -$ D1 -p5Z5 -o55l -O51p1 --6-8 -[{ -L5R5 -+8-9 +{ i1a +O02 u +$ D1 +p5 Z5 +o55 l +O51 p1 +-6 -8 +[ { +L5 R5 i6+ o2@ -$(u -lo4a -+3*12 -o5sl +$( u +l o4a ++3 *12 +o5s l i6= $% -$o$s -^7^0 -$1O72 -$4+8 +$o $s +^7 ^0 +$1 O72 +$4 +8 s48 -DAl -$gl -$1*02 -L3O02 -O02i0f -[o2v +DA l +$g l +$1 *02 +L3 O02 +O02 i0f +[ o2v i8j -$@z2 +$@ z2 s52 --3o0G +-3 o0G o3` -O12o0p +O12 o0p o1w $] o1p -o4Et +o4E t o6. -O03^1 -^d^5 -$\Z1 -Z2-8 -dO09 -$5o65 +O03 ^1 +^d ^5 +$\ Z1 +Z2 -8 +p1 O09 +$5 o65 i2w i2u o8d i8u -$ZZ2 -$ZZ1 -$^l -'9o7n +$Z Z2 +$Z Z1 +$^ l +'9 o7n oAw *AB -ko2l -T0i3y -*32'9 -[o10 -*75t -T0i6_ -o7Yl -cO51 +k o2l +T0 i3y +*32 '9 +[ o10 +*75 t +T0 i6_ +o7Y l +c O51 sbn se5 -l-5 -*10*42 -$u$r -^0O12 -*35r -^gT1 +l -5 +*24 k +$u $r +^0 O12 +*35 r +^g T1 o3G -D2^1 +D2 ^1 o5l -$su -^7c -O03$r +$s u +^7 c +O03 $r o1! -^6z1 +^6 z1 o4h --2*10 -^z$z +-2 k +^z $z i7@ -R0z4 -ko6 +R0 z4 +k o6 O09 -$7$6 -l+9 -D1i1. --2D1 -^_O12 -o0-} +$7 $6 +l +9 +D1 i1. +-2 D1 +^_ O12 +o0- } s30 -O31o3a -+0D4 -[o0l +O31 o3a ++0 D4 +[ o0l O93 -$_Z2 -ko1a -i4wl -O02d -}p1 +$_ Z2 +k o1a +i4w l +} p1 O94 -i4:l -o0p'6 +i4: l +o0p '6 i6J -*79O81 -$jc +*79 O81 +$j c i4# -i0=$1 +i0= $1 si -^e^w -$pZ1 -+0-1 --1$7 -+1^l -p1o7o -co4l +^e ^w +$p Z1 ++0 -1 +-1 $7 ++1 ^l +p1 o7o +c o4l slw -i6,O02 -$3i7< -t$` -^\R1 -+6[ +i6, O02 +$3 i7< +t $` +^\ R1 ++6 [ OB4 -i2nk +i2n k i97 -T4[ -D8$7 +T4 [ +D8 $7 o3+ -O03^u -'8z1 -O54l +O03 ^u +'8 z1 +O54 l o24 -o0bk +o0b k o0X -^ad -fO47 +^a d +f O47 ^5 o4= -'7Z2 +'7 Z2 O84 --8O04 -O03d -$.Z1 -O03sld +-8 O04 +O03 d +$. Z1 +O03 sld iAx s0/ -L4L4 -cO03 +L4 L4 +c O03 swp -[o2z -sj\o6 +[ o2z +sj\ o6 o3= --6Z2 -ki0b -lZ4 -Z5{ -*79*95 +-6 Z2 +k i0b +l Z4 +Z5 { +*79 *95 i3M -$:Z2 -l*75 -sunD4 +$: Z2 +l *75 +sun D4 s4 -T0o6r -[$8 -^3Z1 +T0 o6r +[ $8 +^3 Z1 o7@ -'8t +'8 t o9z O74 -'9c -^eO21 +'9 c +^e O21 o7) R5 -z1sx -^K-2 -us0b -o2Z^g +z1 sx +^K -2 +u s0b +o2Z ^g i3A -p1-6 +p1 -6 sak -{^b -d*09 -sedl +{ ^b +d *09 +sed l o0Q -sR9z5 -t$= -o2lT0 +sR9 z5 +t $= +o2l T0 o4K -o0Sp1 +o0S p1 *42 -$3D3 -{R9 -$.D1 -*40t +$3 D3 +{ R9 +$. D1 +*40 t s73 -i2a*32 +i2a *32 sch --5o61 -D7o5v -O02*20 -[+2 -^4T1 -Z2o8t -^6i05 +-5 o61 +D7 o5v +O02 *20 +[ +2 +^4 T1 +Z2 o8t +^6 i05 ssc -p1s6w -$t$b -d -$eO53 -O41o3l -t^\ -z1Z1 -$ O16 -t$T -z1i1e +p1 s6w +$t $b +$e O53 +O41 o3l +t ^\ +$ O16 +t $T +z1 i1e sb0 -D3^@ -^tl -'Ai7s -z2-1 -O52D7 -[o33 +D3 ^@ +^t l +'A i7s +z2 -1 +O52 D7 +[ o33 oA9 -o2Mc -$2*14 -rc -p1O9A -*15o5 +o2M c +$2 *14 +r c +p1 O9A +*15 o5 ssp -i4ec -p1t -*42p1 -+3i4k -do6u -Z2O82 -O12$* -^cO13 -*71'9 +i4e c +*42 p1 ++3 i4k +d o6u +Z2 O82 +O12 $* +^c O13 +*71 '9 o7y -ko2d -o3g-4 +k o2d +o3g -4 o6c -}^b -qO05 -}i56 -$h$ -O81'9 -*02O21 -$rL8 +} ^b +q O05 +} i56 +$h $ +O81 '9 +*02 O21 +$r L8 skx -$n$a -k^r +$n $a +k ^r o3& -'B$l -tz2 -$8@y -p1$e -+0z4 -$TZ1 -*03$r -$5DA -Z1o0t -$.Z4 -r$z -^6^c -$7O62 +'B $l +t z2 +$8 @y +p1 $e ++0 z4 +$T Z1 +*03 $r +$5 DA +Z1 o0t +$. Z4 +r $z +^6 ^c +$7 O62 i2= sa. -$ O18 -$7o61 +$ O18 +$7 o61 syz -$/@o -O61O21 -Z3l +$/ @o +O61 O21 +Z3 l i3b i8y -dO94 -i3eD5 -^Jl +d O94 +i3e D5 +^J l sml -D8O61 -$uO52 -+7$% -$X*56 -{$w +D8 O61 +$u O52 ++7 $% +$X *56 +{ $w o16 o1v o6` --5'6 -i3ml -dsg0 +-5 '6 +i3m l +d sg0 i7= -}^k -^ O62 -Z1o5_ -^BO32 -o3ic -o3 O21 +} ^k +^ O62 +Z1 o5_ +^B O32 +o3i c +o3 O21 i4d sgj -sa3z5 -k$d +sa3 z5 +k $d sfa -slZl -R6t -i2[l -$5i6 -^7^4 -usCK -+4Z3 -+6O32 -t$; +slZ l +R6 t +i2[ l +$5 i6 +^7 ^4 +u sCK ++4 Z3 ++6 O32 +t $; iAq -o1h+0 --9l -O32^e -kO13 +o1h +0 +-9 l +O32 ^e +k O13 i31 -p1+2 +p1 +2 o8n -$1p1 o4d -'8^a -$%Z1 -dO37 -$x$p -Z5$6 -z5sG6 -O46T0 -$2T0 +'8 ^a +$% Z1 +p1 O37 +$x $p +Z5 $6 +z5 sG6 +O46 T0 +$2 T0 i5A ^& -o2d-0 -o1sc -*76'8 -z1o3- -^/c +o2d -0 +o1s c +*76 '8 +z1 o3- +^/ c i92 o8& -Z3O74 -*21d +Z3 O74 +*12 p1 i5h -t'B +t 'B *15 shk -D5-4 +D5 -4 s0e -Z2c -d*53 +Z2 c +d *53 o7J -T0i3s +T0 i3s sdg -$:$1 -$$C -i8Il -L1{ +$: $1 +$$ C +i8I l +L1 { sie o0x *85 -L1+1 -o7"T3 +L1 +1 +o7" T3 s98 -l-A -z1i17 -L7'8 -r*68 -C$2 +l -A +z1 i17 +L7 '8 +r *68 +C $2 $h -$ $7 -$wi6q -o3mO41 -i0fo15 -+2c -$Xt -i2ul +$ $7 +$w i6q +o3m O41 +i0f o15 ++2 c +$X t +i2u l stz @b srb -i7jl -*50O15 -cD8 +i7j l +*50 O15 +c D8 @h o3r -D2*02 -+8Z1 +D2 *02 ++8 Z1 i4; -o3 R0 +o3 R0 o6& -O83l +O83 l snc i1z -^k*13 -$3$i -p1O02 -*03oBc +^k *13 +$3 $i +*03 oBc @a -*21R0 +*21 R0 i5P o6I -p1O19 +p1 O19 i5$ -+1$n ++1 $n i6a -Z3O53 -+0$` --2R0 -^C^ --6$7 -R1R1 --8$! -*78-6 +Z3 O53 ++0 $` +-2 R0 +^C ^ +-6 $7 +R1 R1 +-8 $! +*78 -6 so8 -q$1 -*45D0 +q $1 +*45 D0 s0+ -to3f -*60D6 -^l^s +t o3f +*60 D6 +^l ^s oA5 -*60*01 -Z1$e -ci4 -o0b*02 +*60 *01 +Z1 $e +c i4 +o0b *02 o5@ -L3L1 -p1O28 -p1o0b -o6od +L3 L1 +p1 O28 +p1 o0b +o6o d o1c -$3T2 -di7, -li5t +$3 T2 +d i7, +l i5t o28 -i6_D2 -[o4j -$yD8 -$4-7 -T1k -*65$! -$uo7u -O81o8s --3O41 +i6_ D2 +[ o4j +$y D8 +$4 -7 +T1 k +*65 $! +$u o7u +O81 o8s +-3 O41 i8. -$2[ -$8DB -lL1 -T0r --6-5 +$8 DB +l L1 +T0 r +-6 -5 i3= i8d s2e -$Wl -z3{ +$W l +z3 { i4S -$iD2 -+2D3 -i3i[ -o2*d -*53*46 -'7i5_ -$1O51 +$i D2 ++2 D3 +i3i [ +o2* d +*53 *46 +'7 i5_ +$1 O51 sh -^6^a -Z1T4 -o0t$9 +^6 ^a +Z1 T4 +o0t $9 s47 s07 -o08z2 -OB1$3 +o08 z2 +OB1 $3 i34 -i6rZ1 -O32*35 --1o01 -*57o7s -+5'6 -lO03 +i6r Z1 +O32 *35 +-1 o01 +*57 o7s ++5 '6 +l O03 ^A -^ji0h -u$! -ls' -$xD2 +^j i0h +u $! +l s' +$x D2 sy1 -^ZL0 -s0 z2 -}O03 -Z1Z5 -$?Z2 -p5z3 -p1i5s +^Z L0 +s0 z2 +} O03 +Z1 Z5 +$? Z2 +p5 z3 +p1 i5s swd s51 -i3 D0 -^ z1 -O72l +i3 D0 +O72 l o4g -o71+6 -T3i3f +o71 +6 +T3 i3f $C -p1D1 -$zZ1 +p1 D1 +$z Z1 $X -$4o4o -Z2-9 -ki2z -z1^4 -$!T3 -^rz2 -$ep1 +$4 o4o +Z2 -9 +k i2z +z1 ^4 +$! T3 +^r z2 +$e p1 ^g -$.$9 -p2O0A -^1i16 -$!^0 +$. $9 +p2 O0A +^1 i16 +$! ^0 s14 -T5o7 +T5 o7 o31 -p1+9 +p1 +9 ^y -L0Z5 -^qz1 -l-1 -O02+1 -O62T6 +L0 Z5 +^q z1 +l -1 +O02 +1 +O62 T6 s38 oAj -+3+5 -s25Z1 -$4{ -O03O43 -uO02 -'9i8r ++3 +5 +s25 Z1 +$4 { +O03 O43 +'9 i8r @3 -[o0d -$2*68 -do0z -T7^2 -o0bp1 -*04O32 -O71o81 -i3nl -^7^f -o1Kk -$eZ1 +[ o0d +$2 *68 +d o0z +T7 ^2 +o0b p1 +*04 O32 +O71 o81 +i3n l +^7 ^f +o1K k +$e Z1 i1b -}D1 -l+3 -O06d -*BA -i8Rl -O03D1 -O07i5 +l +3 +O06 d +i8R l +O03 D1 +O07 i5 i12 -fO59 -qs2 -ti0B --4D5 -$-Z3 -co3m -z2L1 -D1^d -+1p1 -o16*31 -^/r +f O59 +q s2 +t i0B +$- Z3 +c o3m +z2 L1 +D1 ^d ++1 p1 +o16 *31 +^/ r O73 -['8 +[ '8 o1z -d+1 -to0F +d +1 +t o0F o7, -OB2-B -i5+l -$&Z2 +OB2 -B +i5+ l +$& Z2 s0) o8A *76 o7P -'8*76 --2k o7F -i5Nl -o5.Z4 -T0o7 -uT1 -i8iD6 -^tO13 -i4qr -$0O82 -i2sO32 -$wZ1 -c$+ -$ii3 -^3^c +i5N l +o5. Z4 +T0 o7 +u T1 +i8i D6 +^t O13 +i4q r +$0 O82 +i2s O32 +$w Z1 +c $+ +$i i3 +^3 ^c i2\ -R3p1 -O05z5 -o7m$1 -{Z1 -$lZ4 -i3p} -Z3o0j -'7$. +R3 p1 +O05 z5 +o7m $1 +{ Z1 +$l Z4 +i3p } +Z3 o0j +'7 $. o0V -Z2O31 -i10d -*13o4B --8[ -o6mc -c^A -OB2$b +Z2 O31 +i10 d +*13 o4B +-8 [ +o6m c +c ^A +OB2 $b s26 $+ -$YL8 +$Y L8 s3f o7] -*51[ -D3$. -rT0 +*51 [ +D3 $. +r T0 i9h -^1^c -^nd -o7>c +^1 ^c +^n d +o7> c i68 -$($) -c^2 -o4Dc -$!D9 -{^a -o7sO51 -p1i4g -$1+7 -*53*20 +$( $) +c ^2 +o4D c +$! D9 +{ ^a +o7s O51 +p1 i4g +$1 +7 +*53 *20 sv, -di4, -^t$. -lO95 -dO53 -$jZ1 -z1-1 -i3p*03 -R0^1 -i5;*34 +d i4, +^t $. +l O95 +p1 O53 +$j Z1 +z1 -1 +i3p *03 +R0 ^1 +i5; *34 i9a s24 -i1do1z o4, -R5Z1 +R5 Z1 o1r -i00^d -o6wO71 +i00 ^d +o6w O71 sa6 -D3+2 -*12l -p1OA3 +*12 l +p1 OA3 i8a -co7r +c o7r s39 -D8c -co1y -rt +c o1y +r t srz -o03+1 +o03 +1 o0$ -T8[ -lsp1 -$er -D4*30 -$IZ2 +T8 [ +l sp1 +$e r +D4 *30 +$I Z2 o0E -$IT2 -o3dp1 -^2z1 -}k --6+0 +$I T2 +o3d p1 +^2 z1 +} k +-6 +0 i5p -lsr[ +l sr[ s2f -p3O73 -i3^O41 -z2-0 -*45o0g +p3 O73 +i3^ O41 +z2 -0 +*45 o0g i84 -D1^7 -cL0 +D1 ^7 +c L0 sbg -$*^$ -*57O16 +$* ^$ +*57 O16 ^! -^c*12 -L3+3 -$.-5 -o4tO21 -sdil -+0T2 -R5R5 -O46$1 -o0'{ -Z2-4 +^c *12 +L3 +3 +$. -5 +o4t O21 +sdi l ++0 T2 +R5 R5 +O46 $1 +o0' { +Z2 -4 o5x -qO12 -*97$q -z1$d +q O12 +*97 $q +z1 $d i4* sec -^o} -$`O02 +^o } +$` O02 s2a -}^c -O04p1 +} ^c +O04 p1 o9g -i0f-1 -o0m{ -sud$3 -^9^6 +i0f -1 +o0m { +sud $3 +^9 ^6 stc -O24d -p1o5k -l+4 +O24 d +p1 o5k +l +4 i4k ^` o67 -+0z1 -$qL9 -'7c -Z3t -o1r[ -*58'8 ++0 z1 +$q L9 +Z3 t +o1r [ +*58 '8 O07 -R0'1 +R0 '1 o4% -^Az2 +^A z2 sjh -^h^a -[o3z -doBa -Z2O03 -^]$[ -di5 +^h ^a +[ o3z +d oBa +Z2 O03 +^] $[ +d i5 $> oAk -}O02 -O04L0 -T2+1 -o0aT2 -O32$7 +} O02 +O04 L0 +T2 +1 +o0a T2 +O32 $7 slF -[*05 -o3g*30 -o76Z1 -o3n[ -^5^c -$Qc +[ *05 +o3g *30 +o76 Z1 +o3n [ +^5 ^c +$Q c stm -'5q -^8^3 -dT6 +'5 q +^8 ^3 +d T6 ^B -dO32 -p1O74 -^Mz1 +d O32 +p1 O74 +^M z1 o0H -o07$ -$!O21 +o07 $ +$! O21 sbe i6: -l^m -D1+3 -Z3$- -$<^< -*06l -o91D4 -*67 -^k'7 -z5O25 -o9eO63 -L5O32 -$-$x -^vO14 -$yZ2 -o67+8 -*67o75 -$$^# -o6k[ --5t +l ^m +D1 +3 +Z3 $- +$< ^< +*06 l +o91 D4 +^k '7 +z5 O25 +o9e O63 +L5 O32 +$- $x +^v O14 +$y Z2 +o67 +8 +*67 o75 +$$ ^# +o6k [ +-5 t oA1 -[+1 -^l^k -O62c -$%i61 -[i1z -'7$9 +[ +1 +^l ^k +O62 c +$% i61 +[ i1z +'7 $9 i8f -'BO71 -i54*31 +'B O71 +i54 *31 sj -*54-4 -u-5 -O02^X -p1O34 -$ $3 -o1yp1 +*54 -4 +u -5 +O02 ^X +$ $3 +o1y p1 o2. -D6d -O81R8 +D6 d +O81 R8 i82 -+8-6 -O21+1 -O03$! -D6$9 -O01r -fO43 -O31-0 -$6$7 ++8 -6 +O21 +1 +O03 $! +D6 $9 +O01 r +f O43 +O31 -0 +$6 $7 o6B -'5z1 -+0^p -o12$! -o1K[ +'5 z1 ++0 ^p +o12 $! +o1K [ s2c -}Z2 +} Z2 o56 -+0+3 -D3p1 -i0do1h -$mZ1 -i7k+8 ++0 +3 +D3 p1 +i0d o1h +$m Z1 +i7k +8 srS -^ik -di5p --6-7 -Ck -O26d -o0kO23 -^c^1 -d'9 -i3mR3 -$9o76 -c'9 +d i5p +-6 -7 +C k +O26 p1 +o0k O23 +^c ^1 +i3m R3 +$9 o76 si* -$2$x -^8z2 +$2 $x +^8 z2 sdm -^ z3 -p1o5g --7+9 --AZ1 +^ z3 +p1 o5g +-7 +9 +-A Z1 s86 -$z{ -$-$. +$z { +$- $. $G -o4cO02 -'2z3 -'8$a +o4c O02 +'2 z3 +'8 $a i6E -R0} -fO65 -O34q -^GZ2 -O03^g -lO23 -D4o0m -*86+7 -ci8 -l$u +R0 } +f O65 +O34 q +^G Z2 +O03 ^g +l O23 +D4 o0m +*86 +7 +c i8 +l $u O0B -$AZ1 -p1O72 +$A Z1 +p1 O72 soe -O0Ai0 -ki0r --0c -D6$0 -O61$+ -fi01 -$ +0 -$qd -o1;l +O0A i0 +-0 c +D6 $0 +O61 $+ +f i01 +$ +0 +$q d +o1; l sbk -fO91 +f O91 o4A -*74*65 -^n$1 -Z1o0K -^K^J +*74 *65 +^n $1 +Z1 o0K +^K ^J s4& -p1+5 -z2i1n -o44d -[o3_ -o0L -O41i2o -kO12 -$!-5 -Z2d -$-Z4 -$i$n -p1O36 -o6cl -u+7 -T0^e -sz t --3D2 -$id -^S$S -O71+5 -*56$1 -O21+6 -$:d -o2d-8 -lssd -o3 } -CT7 +p1 +5 +z2 i1n +o44 d +[ o3_ +O41 i2o +k O12 +$! -5 +Z2 d +$- Z4 +$i $n +p1 O36 +o6c l +u +7 +T0 ^e +sz t +-3 D2 +$i d +^S $S +O71 +5 +*56 $1 +O21 +6 +$: p1 +o2d -8 +l ssd +o3 } +C T7 i2g sl4 o7= -uo6A +u o6A o27 -O23o2n -$b$a +O23 o2n +$b $a iBs -*74$k --4o0P -^tO12 -[-3 -i4 +7 -'5^z -$5O52 +*74 $k +-4 o0P +^t O12 +[ -3 +i4 +7 +'5 ^z +$5 O52 i2y -T6T5 -Z1$2 -dOB9 -[o1o -T4'A +T6 T5 +Z1 $2 +d OB9 +[ o1o +T4 'A se, ^H i9o -dOA5 +d OA5 O45 -*45p1 -z2R1 -p1i6r -$4T5 -^.^t -'6Z2 +*45 p1 +z2 R1 +p1 i6r +$4 T5 +^. ^t +'6 Z2 o6; -*10R1 -rf -o6.*07 -l$q -i6%c -c$x -O04T3 --4Z1 -*21o1e +r f +o6. *07 +l $q +i6% c +c $x +O04 T3 +-4 Z1 +*21 o1e i3z --3+2 -^sO14 -i1b$s +-3 +2 +^s O14 +i1b $s i6I -se8d -*13*42 -R2o2v -z3+1 -$#o0w -$0+5 +se8 d +*13 *42 +o2v +z3 +1 +$# o0w +$0 +5 sas -p1O47 -l*35 -[$@ -p3O4A -^v} -*02*97 -dsh6 -*76*68 -$7O52 -$2O53 -o8ru -LBO92 -sb7l -$3k -Z1L5 -O25p1 -p1O98 -dO67 +p1 O47 +l *35 +[ $@ +p3 O4A +^v } +*02 *97 +d sh6 +*67 *86 +$7 O52 +$2 O53 +o8r u +LB O92 +sb7 l +$3 k +Z1 L5 +O25 p1 +p1 O98 +d O67 spt i0i -*67*86 snk o9m -z1*50 -}$% -o2-^k -$!O71 -^;$ +z1 *50 +} $% +o2- ^k +$! O71 +^; $ i6` -fO7A +f O7A s65 -$;@p -l^D -lo6. -$2$! +$; @p +l ^D +l o6. +$2 $! i6w -Z1iB8 +Z1 iB8 sw -$1o7l +$1 o7l i7k -$ sro +$ sro oA- -$!O61 -^q*14 -T2T9 -Z1i5e -}R0 -cZ1 -^.^1 -D0+1 +$! O61 +^q *14 +T2 T9 +Z1 i5e +} R0 +^. ^1 sr! i9t --6+5 --3d +-3 d s2# -o0KT5 -^0^c -o54*02 +o0K T5 +^0 ^c +o54 *02 i5z -o2Pl +o2P l o7$ -D0^u -o0Fl -*30O41 -cL5 -lO26 -z1^d -^Rl -T7t -i27[ -p2O04 -}i1f -i47c -do0f +D0 ^u +o0F l +*30 O41 +c L5 +l O26 +z1 ^d +^R l +T7 t +i27 [ +p2 O04 +} i1f +i47 c +d o0f sce s5b -*20-0 -o4sl -i4El -i6zc -^WT1 -O32o0k -[$r -o4yo2k +*20 -0 +i4E l +i6z c +^W T1 +O32 o0k +[ $r +o4y o2k sed -o5Ac +o5A c s1e su1 -o4iO31 -p1O68 -o60Z5 -$PL9 +o4i O31 +p1 O68 +o60 Z5 +$P L9 o7^ -[o3 -p1c -[f -$>$ -[$i -$j$o -}O04 +[ o3 +[ f +$> $ +[ $i +$j $o +} O04 i6u -'7d -T0*9A +'7 d +T0 *9A ss7 o4D -*46+4 -t$B -p1*78 +*46 +4 +t $B +p1 *78 s1m -*46$v +*46 $v i73 L1 s50 $B sb3 o26 -o2mD3 -*05[ -i5d*05 -+AO82 -^ci1j -t*20 -L0c -$8@m -c$k --7l -cO53 +o2m D3 +*05 [ +i5d *05 ++A O82 +^c i1j +t *20 +L0 c +$8 @m +c $k +-7 l +c O53 o6W -p1o0h -^ $ -[d -$zZ2 +p1 o0h +^ $ +[ d +$z Z2 o4; -*02i0s -up1 -+5p1 -O01+6 -T7*64 -o1Ul -o64$o -^md -p2O58 --7-9 -}^e --4O31 -fO53 -o73o89 -c$^ +*02 i0s +u p1 ++5 p1 +T7 *64 +o1U l +o64 $o +^m d +p2 O58 +-7 -9 +} ^e +-4 O31 +f O53 +o73 o89 +c $^ i6g -i09} -$9*01 -k'9 -^2$$ -*65*67 -^.z2 -^gp1 -[z2 --1^8 -^4^4 -i05p1 +i09 } +$9 *01 +k '9 +^2 $$ +*65 *67 +^. z2 +^g p1 +[ z2 +-1 ^8 +^4 ^4 +i05 p1 i7b s1+ -@ed -+7Z1 -O46z2 -o2b-0 -O02i5e -$oo6w -^i^M -L5O04 +@e d ++7 Z1 +O46 z2 +o2b -0 +O02 i5e +$o o6w +^i ^M +L5 O04 @8 -^Eo4e -R6+5 -q$d +^E o4e +R6 +5 +q $d o6z -co7M +c o7M o37 stD i6z -i5ju -o0kz1 -p1oBr -$p^9 -^1^b -o1j$1 -o6?*45 -$,*64 -$M+7 -^S^J -^7O21 -T8D5 -O45l -i5i{ -o04 -^Sz2 -^4z2 +i5j u +o0k z1 +p1 oBr +$p ^9 +^1 ^b +o1j $1 +o6? *45 +$, *64 +$M +7 +^S ^J +^7 O21 +T8 D5 +O45 l +i5i { +^S z2 +^4 z2 seb sb2 -R0O13 -^V$v -o23R1 +R0 O13 +^V $v +o23 R1 s6e -o1%u -o6@$1 -+6-5 -'6*54 -^g$7 -o8m*67 -to86 -*50O53 -^mo2i -$VZ1 -o2r^v --6^@ -o5s+4 -$bO72 -O12o4 -$e^d -*37$k -$-D5 -o5$Z3 -O73OA2 -^.^a -[p3 +o1% u +o6@ $1 ++6 -5 +'6 *54 +^g $7 +o8m *67 +t o86 +*50 O53 +^m o2i +$V Z1 +o2r ^v +-6 ^@ +o5s +4 +$b O72 +O12 o4 +$e ^d +*37 $k +$- D5 +o5$ Z3 +O73 OA2 +^. ^a +[ p3 sko s_4 --3o4e --4t -+7i5j -^=z1 -saeD6 -+6o5w +-3 o4e +-4 t ++7 i5j +^= z1 +sae D6 ++6 o5w *63 o8` -$B$J -$+@9 -i2-^z -o8Kc -i0h^r -^t*23 +$B $J +$+ @9 +i2- ^z +o8K c +^h ^r +^t *23 o6^ -D2$. -o52$x -O93L9 --1{ +D2 $. +o52 $x +O93 L9 +-1 { O87 sPs -$*$1 -o5Kl -^ z4 -^aO12 -$1^c -O43l -o8go9r -o6/$6 -o1ki1u -$"i7! -$4O62 -$iO62 -$!^D -t$" -qO86 -[z5 -DB$4 +$* $1 +o5K l +^ z4 +^a O12 +$1 ^c +O43 l +o8g o9r +o6/ $6 +o1k i1u +$" i7! +$4 O62 +$i O62 +$! ^D +t $" +q O86 +[ z5 +DB $4 i2- -o0gd -ki3f +o0g d +k i3f i7* i7, -*74O41 -@9p1 -T3i3- -i1kT6 -$3o6= -$1+6 -dO81 -o81sub -o2d[ -rZ3 -T7o5z -*71[ +*74 O41 +@9 p1 +T3 i3- +i1k T6 +$3 o6= +$1 +6 +d O81 +o81 sub +o2d [ +z3 r +T7 o5z +*71 [ ^< -^ki1i -Z1*34 -'7o6z +^k i1i +Z1 *34 +'7 o6z svg -+9o8j -$V$6 -*85i7e ++9 o8j +$V $6 +*85 i7e oAs -Z1O03 -o6TT7 -o0iu -$q$w +Z1 O03 +o6T T7 +o0i u +$q $w i2$ -sh-o0g -o1j*41 -D5*45 -Z4O61 +sh- o0g +o1j *41 +D5 *45 +Z4 O61 oA7 -li6t -*27D2 -O21f -^MO43 -*53T4 -*97syi -i5KO64 -i4@-8 -ci31 -^5^b -i5#-9 +l i6t +*27 D2 +O21 f +^M O43 +*53 T4 +*97 syi +i5K O64 +i4@ -8 +c i31 +^5 ^b +i5# -9 o4T svn *97 -DAo91 -dOB4 +DA o91 +p1 OB4 sx+ -DBO71 +DB O71 i1! -O12$s +O12 $s oAx -sunsjk -+5+7 -*13p1 -OB2l -Z1T0 -$7+1 -$9+4 -ri4, -+0o44 -Z2$5 -}z4 -$2O51 -o0uk -*87o0p +sun sjk ++5 +7 +*13 p1 +OB2 l +Z1 T0 +$7 +1 +$9 +4 +r i4, ++0 o44 +Z2 $5 +} z4 +$2 O51 +o0u k +*87 o0p o4G -*31q -$-$+ -R7l -L9O62 -$uO62 -sJgl -O14^g -o6d-6 -r$; -'9r -tO72 -$`Z1 -o8Ec -Z3$5 -o61T5 -L1-0 -*A9+3 -$JL5 +*31 q +$- $+ +R7 l +L9 O62 +$u O62 +sJg l +O14 ^g +r $; +'9 r +t O72 +$` Z1 +o8E c +Z3 $5 +o61 T5 +L1 -0 +*A9 +3 +$J L5 s1I s,g -+6R5 -$ R5 -o0W*31 -$6T2 -o4Uc -O02^j -^c^4 -{o6t -+6$A -[*64 ++6 R5 +$ R5 +o0W *31 +$6 T2 +o4U c +O02 ^j +^c ^4 +{ o6t ++6 $A +[ *64 so& -i3mt -$pT2 -o0Ku -+2$ -i4 *37 -o6M$2 -kc -o4Iu -uo1d -^[l +i3m t +$p T2 +o0K u ++2 $ +i4 *37 +o6M $2 +k c +o4I u +u o1d +^[ l sfj -+6O42 -^zL0 -[$- -kO31 -o9/T0 -^sD4 -^,f ++6 O42 +^z L0 +[ $- +k O31 +o9/ T0 +^s D4 +^, f s!6 -$?$2 --2o0T -li5- -@6o57 -^0*20 -i0.c -kq -k*51 -+5o4 -o3 ^4 -*23^ -$:$! +$? $2 +-2 o0T +l i5- +@6 o57 +^0 *20 +k q +k *51 ++5 o4 +o3 ^4 +*23 ^ +$: $! s3o --Bl -i3ou -$"Z1 +-B l +i3o u +$" Z1 srm -{R2 -z1R1 -D6L5 -i6aO02 -O16$_ -$f-3 +{ R2 +z1 R1 +D6 L5 +i6a O02 +O16 $_ +$f -3 o3O -+9i91 -$ui5- -dO21 -i3Qo3h ++9 i91 +$u i5- +d O21 o6E -$.$K -$roAg -*97@a +$. $K +$r oAg +*97 @a swc -lsgj -T0T9 -$pD2 -^u^n --0l -c^M +l sgj +T0 T9 +$p D2 +^u ^n +-0 l +c ^M o1, -$g*54 -*45R4 -i4:*02 -$=T5 +$g *54 +*45 R4 +i4: *02 +$= T5 oA0 --1o0t -^3z2 -*40O42 -o15[ -i3e$Z -$3$ -o4;^c -^y^o +-1 o0t +^3 z2 +*40 O42 +o15 [ +i3e $Z +$3 $ +o4; ^c +^y ^o o7f -p1O76 -*36O32 -dsam -@bi5 -i5^[ -sprd -^Zi4X -z2R2 -O14i0T -o7&$y -sBLp1 -O0Ad -$ *52 +*36 O32 +d sam +@b i5 +i5^ [ +spr d +^Z i4X +z2 R2 +O14 i0T +o7& $y +sBL p1 +O0A d +$ *52 i90 -z4O46 +z4 O46 i2j sb7 s7f -O02'A -$#*57 -$di4 -*21f -s4/Z2 -+0$s -p1*A8 -T0^S -^u^S -R0q -[u -di0m -Z1*21 +O02 'A +$# *57 +$d i4 +*21 f +s4/ Z2 ++0 $s +p1 *A8 +T0 ^S +^u ^S +R0 q +[ u +d i0m +Z1 *21 i7S o3D -p4Z1 -D8i5b -Z2*65 -$U$J -R0p1 +p4 Z1 +D8 i5b +Z2 *65 +$U $J +R0 p1 iA0 -$z$2 -$mk -lo1a -sfg*91 -o2-+4 +$z $2 +$m k +l o1a +sfg *91 +o2- +4 iB5 -$"iA! +$" iA! s62 --6O51 +-6 O51 s28 -o7 $l +o7 $l @6 s5 s09 -^sL0 -*16O43 -dO07 -^x'8 -$.O63 -o4"o0! -lo6k -o3np1 -i3-c -di4y -o7cZ1 -i3h} +^s L0 +*16 O43 +d O07 +^x '8 +$. O63 +o4" o0! +l o6k +o3n p1 +i3- c +d i4y +o7c Z1 +i3h } i4% -i0s$a -$eZ4 -C^7 +i0s $a +$e Z4 +C ^7 slm -$fO82 -O05p2 -sgml -o7mO81 --0^2 -*74+5 +$f O82 +O05 p2 +sgm l +o7m O81 +-0 ^2 +*74 +5 L4 o9@ -t$F +t $F s9 i1_ -o6tD4 --8*BA -o1kL4 -D3i3_ -O51Z2 -s3Tf +o6t D4 +-8 *BA +o1k L4 +D3 i3_ +O51 Z2 +s3T f sw6 -o7#R4 -L2O02 -$qZ5 -*62*73 --3O02 -{$i -di5o -R0o1 +o7# R4 +L2 O02 +$q Z5 +*62 *73 +-3 O02 +{ $i +d i5o +R0 o1 scs -^6D2 -to61 +^6 D2 +t o61 OA2 -o54O41 -{^d -Z2*53 -'Bt -*65O42 -O51*57 -$"u -}o0x -s2eq -*46Z1 -o0kO41 +o54 O41 +{ ^d +Z2 *53 +*65 O42 +O51 *57 +$" u +} o0x +s2e q +*46 Z1 +o0k O41 $" -D6^b +D6 ^b spj -^eO12 -i67*53 -p2O2A -D1^p -$o*82 -i4!c -*40'9 -$vD5 -s3e$7 -$xO92 -[o1t -^yi3_ -i15r -+6$0 -+9Z1 -i4.r -@5+2 -T3$1 -T6Z2 -rs1 +^e O12 +i67 *53 +p2 O2A +D1 ^p +$o *82 +i4! c +*40 '9 +$v D5 +s3e $7 +$x O92 +[ o1t +^y i3_ +i15 r ++6 $0 ++9 Z1 +i4. r +@5 +2 +T3 $1 +T6 Z2 +r s1 i74 -i5q{ -*06$1 +i5q { +*06 $1 sms -$q$a -O09$ -Z1i7o -f@a -z1o4, --2u -'6$i -$1-6 -*78s71 -i6mO06 -p1O09 -$N*65 -'8-2 --1$5 +$q $a +O09 $ +Z1 i7o +f @a +z1 o4, +-2 u +'6 $i +$1 -6 +*78 s71 +i6m O06 +$N *65 +'8 -2 +-1 $5 s@, -z1o91 -L1O23 -$X$2 -OB3Z2 -$pL6 -*24k -o5/i0A +z1 o91 +L1 O23 +$X $2 +OB3 Z2 +$p L6 +o5/ i0A iAs --6i5, -O81seo -Z5OB6 +-6 i5, +O81 seo +Z5 OB6 shd -i00o6m -p3O0A -$mZ2 -$7Z3 -L5O62 -+6*57 +i00 o6m +p3 O0A +$m Z2 +$7 Z3 +L5 O62 ++6 *57 i1d -o1q^& -^k$a +o1q ^& +^k $a sor -O2Bo2 -to0V -r'A +O2B o2 +t o0V +r 'A o4' -o0=^b +o0= ^b O39 -sAcp1 +sAc p1 O15 -T0i3: -O72^l +T0 i3: +O72 ^l sNS -O61O14 -$hZ2 -^wz2 -$1*74 --2r -Z1i4K -o6p*56 -O02z1 -o8i*57 -o5 @e -}'A -T4i4! -o5,O61 -Z3D7 +O61 O14 +$h Z2 +^w z2 +$1 *74 +-2 r +Z1 i4K +o6p *56 +O02 z1 +o8i *57 +o5 @e +} 'A +T4 i4! +o5, O61 +Z3 D7 i46 -O61*9A -^N$H +O61 *9A +^N $H s23 -}o0 -^so2y -i1-u -k+1 --0$u -^j*41 +} o0 +^s o2y +i1- u +-0 $u +^j *41 i1p i5L scf *25 i4? -qq -$4+2 -fO64 -O06R1 -Z1-3 -i2w@o -$lZ1 -d*03 -$_$+ -O13o1u +q q +$4 +2 +f O64 +O06 R1 +Z1 -3 +i2w @o +$l Z1 +p1 *03 +$_ $+ +O13 o1u s!+ --0$1 -$hp1 -+4*53 -o89Z1 -*72$q -o5ei2U -l^4 +-0 $1 +$h p1 ++4 *53 +o89 Z1 +*72 $q +o5e i2U +l ^4 sx) i37 -uo0W -o7<*67 +u o0W +o7< *67 i4P -Z1ssB -*41d +Z1 ssB +*41 d oA -o9iD0 +o9i D0 i5E -^Ct -o6xO51 -O71O21 +^C t +o6x O51 +O71 O21 o2? o9x -i56l -+6*75 +i56 l i6q sp+ -$1O53 -z5R5 +$1 O53 +z5 R5 o5N -'7^ -+0*32 -^a^p -O13i1j -O04Z3 -*61O12 -$_$i -@8k -p1i5z -i3uq --6$8 --1*13 -$sk -o5.O41 -^8+1 -s9 O01 +'7 ^ ++0 *32 +^a ^p +O13 i1j +O04 Z3 +*61 O12 +$_ $i +@8 k +p1 i5z +i3u q +-6 $8 +-1 *13 +$s k +o5. O41 +^8 +1 +s9 O01 @5 -$xl -^lo3 -o51$k -o0sO31 +$x l +^l o3 +o51 $k +o0s O31 o4@ oBy -Z4+7 +Z4 +7 o2: -$3srl -[O32 -D3$g -o06@r -^1z3 -*32i4s -'4z5 -z2sD -$1*34 -$7s4_ --5$? -D6o2d -$yp1 -R2^b -$6[ -i6a+5 -+5$g -$w$e -+6+1 -o8![ -'5$3 -fi5n -o40p1 +$3 srl +[ O32 +D3 $g +o06 @r +^1 z3 +*32 i4s +'4 z5 +z2 sD +$1 *34 +$7 s4_ +-5 $? +D6 o2d +$y p1 +R2 ^b +$6 [ +i6a +5 ++5 $g +$w $e ++6 +1 +o8! [ +'5 $3 +f i5n +o40 p1 sn2 -$ sg; -*10o1. -i3mZ1 -ci1F -OB1oB3 -$ ^b -*40q +$ sg; +*10 o1. +i3m Z1 +c i1F +OB1 oB3 +$ ^b +*40 q oBr -dOB8 -*68D6 -$9*14 -Z1ss& +d OB8 +*68 D6 +$9 *14 +Z1 ss& i9e -OA1D8 -$@u -^AD4 -z1o2O -o2H^H -$.i12 -Z2$, +OA1 D8 +$@ u +^A D4 +z1 o2O +o2H ^H +$. i12 +Z2 $, shO -$y$s --4z1 -o65Z2 -*65^z -$4p1 -i46i42 -T5O62 -O01*42 +$y $s +-4 z1 +o65 Z2 +*65 ^z +$4 p1 +i46 i42 +T5 O62 +*53 [ iA! -$d-8 -$Po6. -z1^i -$LO73 -r'6 -d^1 --4-1 -$-Z2 -O82T7 -*46l -Z2$v -i3jl -^@^p -$5O41 -Z3o4a -O23q -O21+2 -L5i6g -O21^k -^6^4 -o4tZ2 +$d -8 +$P o6. +z1 ^i +$L O73 +r '6 +d ^1 +-4 -1 +$- Z2 +O82 T7 +*46 l +Z2 $v +i3j l +^@ ^p +$5 O41 +Z3 o4a +O23 q +O21 +2 +L5 i6g +^6 ^4 +o4t Z2 i3! -u$m -*05+3 +u $m +*05 +3 ^W o6x -+7i6y --7i7t -L4'5 -O01i4u -L0L0 -i4aD2 -D2-2 ++7 i6y +-7 i7t +L4 '5 +O01 i4u +L0 L0 +i4a D2 sd* -+6d -^Pz1 -Z1^4 -^kO15 -+5*78 -dO75 -D7*78 -$8*78 -^a} -'6o5l ++6 d +^P z1 +Z1 ^4 +^k O15 ++5 *78 +D7 *78 +$8 *78 +^a } +'6 o5l o6< -Z1*86 -T1T6 +Z1 *86 +T1 T6 skr i1= -$s$m +$s $m o8M -i8tc -i5O{ -+5*35 -Z5se6 -L0z2 -D7u -i41r -l$i -T4+2 -T9T8 -to8T -^mO12 -D4o4 --0d -Z5O43 -*03o5_ -c$? -$u^? -i3y*42 -s, q -O32O42 -p3O65 -loB1 -^6L1 -$1O58 -}^w -*32^s -o2rq -o1oL0 -z2o1. -$0c -*50*41 +i8t c +i5O { ++5 *35 +Z5 se6 +L0 z2 +D7 u +i41 r +T4 +2 +T9 T8 +t o8T +^m O12 +D4 o4 +-0 d +Z5 O43 +*03 o5_ +c $? +$u ^? +i3y *42 +s, q +O32 O42 +p3 O65 +l oB1 +^6 L1 +$1 O58 +} ^w +*32 ^s +o2r q +o1o L0 +z2 o1. +$0 c +*50 *41 $T sx! -li8a +l i8a si. --8DA -$iO54 +-8 DA +$i O54 s74 sft o6/ -^0-5 -i0d^7 -L0^h -{$6 -O42-4 +^0 -5 +i0d ^7 +L0 ^h +{ $6 +O42 -4 oA3 -$8{ -O13+0 -s37L1 -i31o0s -*62O03 -L1R1 -i7iT5 -$e$m -oB9+8 -R7Z3 -^Vi1c -+6Z1 -fO27 -^1'8 -D3sao -Z1i8x -i01$9 -[z1 -i65'9 -i74i8z -sm8O21 -li3/ -D5d +$8 { +O13 +0 +s37 L1 +i31 o0s +*62 O03 +L1 R1 +i7i T5 +$e $m +oB9 +8 +R7 Z3 +^V i1c ++6 Z1 +f O27 +^1 '8 +D3 sao +Z1 i8x +i01 $9 +[ z1 +i65 '9 +i74 i8z +sm8 O21 +l i3/ +D5 d sdq -'4[ -z5O62 +'4 [ +z5 O62 scv -o6l+3 -o1eo2d +o6l +3 +o1e o2d s1/ o7% -^/z2 -fi6o -z5o7 -fO49 -R7*67 -to9H -D6'9 +^/ z2 +f i6o +z5 o7 +f O49 +R7 *67 +t o9H +D6 '9 o5K -rs0- -i4qo5u -i3:c -O03Z5 -*01R0 -$8d -o51c -o0f^7 -Z5$a -O02+3 -^>o71 -^ei13 +r s0- +i4q o5u +i3: c +O03 Z5 +*01 R0 +$8 d +o51 c +o0f ^7 +Z5 $a +O02 +3 +^> o71 +^e i13 s90 -o0dD5 -lZ2 -O37p1 -o2su -$s^k -i62[ -o3wl -L0p1 -o4aZ2 -*03O43 -T3$D --5+2 -p1+7 +o0d D5 +O37 p1 +o2s u +$s ^k +i62 [ +o3w l +L0 p1 +o4a Z2 +*03 O43 +T3 $D +-5 +2 +p1 +7 s6a -o70c -$6$2 -OB3Z1 -$-@T -*01$f -$Ml -lo5< +o70 c +$6 $2 +OB3 Z1 +$- @T +*01 $f +$M l +l o5< *16 -*37$" -i1Eo8E -O72c -dOA6 -^c+1 -*12o1b --7$5 -^l-8 -O62O13 +*37 $" +i1E o8E +O72 c +p1 OA6 +^c +1 +*12 o1b +-7 $5 +^l -8 +O62 O13 syj -Z5$c +Z5 $c sMk i9u -*25z2 -T0$9 -O34ssp -^2$* -fO76 -*65l -Z1+1 -D3i4, -R7'8 -lo5n -+6k -$t$h -o9sD3 -*98O71 -Co6: -r^z -p2O06 -$k^m -$xf -*21O41 -L6Z1 +*25 z2 +T0 $9 +O34 ssp +^2 $* +f O76 +Z1 +1 +D3 i4, +R7 '8 +l o5n ++6 k +$t $h +o9s D3 +*98 O71 +C o6: +r ^z +p2 O06 +$k ^m +$x f +*21 O41 +L6 Z1 oA, -D1sn_ -c^H -*57$0 -i2a-4 -o8#+9 +D1 sn_ +c ^H +*57 $0 +i2a -4 +o8# +9 i57 -$p$l -$?+6 -o75t +$p $l +$? +6 +o75 t sn, -*46-7 -*87$1 -$8*75 -*31D2 -$d$b -i0esn_ +*46 -7 +*87 $1 +$8 *75 +*31 D2 +$d $b +i0e sn_ s9x -+0*86 -i42@2 -^#O61 -o56$6 -i0P^E ++0 *86 +^# O61 +o56 $6 +i0P ^E s9G -R2l -$:c -c$" +R2 l +$: c +c $" o8$ -$ +$< ^> i2H -O12$6 -$i$d -*03sbe -Z2O23 -s2 '3 -$s$4 -$Gc -*B1O03 -^pc -'5$r -O52*67 -*54o3 -O31-2 -{^L +O12 $6 +$i $d +*03 sbe +Z2 O23 +s2 '3 +$s $4 +$G c +*B1 O03 +^p c +'5 $r +O52 *67 +*54 o3 +O31 -2 +{ ^L sx* -T2^) -*41s9< -^/^7 +T2 ^) +*41 s9< +^/ ^7 i5F -^bD4 +^b D4 sla -+7l ++7 l o8) -$hi8% -di6b -qO4A +$h i8% +d i6b +q O4A sac -O02L5 -o1k^s -'5p3 -$ O73 -o5 '6 -'8*70 -T0$} -^s+7 +O02 L5 +o1k ^s +'5 p3 +$ O73 +o5 '6 +'8 *70 +T0 $} +^s +7 sbp --BZ1 -*35t -qr -$Ru -R4R2 +-B Z1 +*35 t +q r +$R u +R4 R2 s0q -O96-6 -D0i2m -Z2$7 +O96 -6 +D0 i2m +Z2 $7 $l -D2+3 -c^< -[s7+ -$sD7 +D2 +3 +c ^< +[ s7+ +$s D7 o7w -T0T5 +T0 T5 sv6 -*74O54 -i8zr --7o80 -*02^b -^#$@ -*87+8 -tD1 -i17C -fOA5 -^_T1 -$#O62 -*61*21 --5*68 -z3o12 -uo7% -si\*12 +*74 O54 +i8z r +-7 o80 +*02 ^b +^# $@ +*87 +8 +t D1 +i17 C +f OA5 +^_ T1 +$# O62 +*61 *21 +-5 *68 +z3 o12 +u o7% +si\ *12 o1N -^1$" +^1 $" sdP -$*sln -$%t +$* sln +$% t i3v -+7-6 ++7 -6 *72 -+At -T6*65 -t$> ++A t +T6 *65 +t $> O75 -o14Z4 +o14 Z4 o4( -$@@i -o5m-6 -{c -l^{ -*42T0 -o2v -p2^T -$@L4 -o2cD0 -+4[ -O12$ -i4ho2r -*65[ -li58 -$2*78 -ki7g --2d -o85O62 -o93+8 -*01i11 -s20$! -T5o0S -{i8* -$nO82 -$D*57 -$7OB3 +$@ @i +o5m -6 +{ c +l ^{ +*42 T0 +p2 ^T +$@ L4 +o2c D0 ++4 [ +O12 $ +i4h o2r +*65 [ +l i58 +$2 *78 +k i7g +-2 d +o85 O62 +o93 +8 +*01 i11 +s20 $! +T5 o0S +{ i8* +$n O82 +$D *57 +$7 OB3 sx^ -o7bZ1 -p4[ -*74k -i4,-5 -$d$w -*78Z1 +o7b Z1 +p4 [ +*74 k +i4, -5 +$d $w +*78 Z1 sl! -fo68 -l$j -$b$u -o2nO32 -$lO62 -o01p1 -'Ai9 -*57o7, -[o0W -*06T6 -+1^b -O63$. -*76i5 -o7#*76 -Z2s7@ -O02^x +f o68 +l $j +$b $u +o2n O32 +$l O62 +o01 p1 +'A i9 +*57 o7, +[ o0W +*06 T6 ++1 ^b +O63 $. +*76 i5 +o7# *76 +Z2 s7@ +O02 ^x s _ i7v -u*68 -T2T6 -O04i6 -O04u +u *68 +T2 T6 +O04 i6 +O04 u o1g -@0Z1 -+A*9A -Z5s3+ -'3p1 -$%se1 +@0 Z1 ++A *9A +Z5 s3+ +'3 p1 +$% se1 i6& -o89+9 -^kz1 -$b+6 -i4gr -$m$x -$ao7f -^hc -slMT2 -'8Z5 -*74*85 --4+3 --3-4 -z2*96 -*40O41 -$_-0 --6O05 +o89 +9 +^k z1 +$b +6 +i4g r +$m $x +$a o7f +^h c +slM T2 +'8 Z5 +*74 *85 +-4 +3 +-3 -4 +z2 *96 +*40 O41 +$_ -0 +-6 O05 i3; -Z2-6 -sb1z1 -^8r +Z2 -6 +sb1 z1 +^8 r o4w -D5$i -O03*34 -^6O12 -$3Z2 -o6P*75 -$7Z4 -s1.*57 -*72O03 -^s} -o0gq -*13i4y -^?z3 -tT9 -tZ4 -}o71 -$$+7 -Cr -$2i6R -*10z2 -^i} -o34t -o5e$2 -*83O59 -^f*21 -*50R5 -^0r +D5 $i +O03 *34 +^6 O12 +$3 Z2 +o6P *75 +$7 Z4 +s1. *57 +*72 O03 +^s } +o0g q +*13 i4y +^? z3 +t T9 +t Z4 +} o71 +$$ +7 +C r +$2 i6R +k z2 +^i } +o34 t +o5e $2 +*83 O59 +^f *21 +*50 R5 +^0 r i1, sm+ iAo -$!^y -$K$! -dO63 --0i1r -sgll -*A4O05 -O07d -*05c +$! ^y +$K $! +-0 i1r +sgl l +*A4 O05 +O07 d +*05 c o8[ -O24^m -O52O31 -Z1+6 -'6$2 -r^a -$2$k -Z2*64 -$ { -D0Z1 -k^m --7*87 -dO38 -$&u -$qLA -*67-7 -$8-5 -D0 +O24 ^m +O52 O31 +Z1 +6 +'6 $2 +r ^a +$2 $k +Z2 *64 +$ { +D0 Z1 +k ^m +-7 *87 +d O38 +$& u +$q LA +*67 -7 +$8 -5 siO -*21-3 -i3/'8 -D1L0 -*4BO63 -o9'^s -O35l -*58l -z3-3 -$8$+ --5$* -ui6 -i6hr +*21 -3 +i3/ '8 +D1 L0 +*4B O63 +o9' ^s +O35 l +*58 l +z3 -3 +$8 $+ +-5 $* +u i6 +i6h r o6D -^Hi5` -$#$7 -do0L +^H i5` +$# $7 +d o0L su0 o3% -q'B -'Aq -^J^J +q 'B +'A q +^J ^J s95 -$a*38 +$a *38 sf2 --0o6p -i6,t -O42^d -p2O09 -z5O35 -[o0n -^j$s -+0$i -p5i0; -o3uD2 -^/$/ -R1C -*31$r -[z4 -i4_O54 -}i0z -ko3- -^h^m -T0^F +-0 o6p +i6, t +O42 ^d +p2 O09 +z5 O35 +[ o0n +^j $s ++0 $i +p5 i0; +o3u D2 +^/ $/ +R1 C +*31 $r +[ z4 +i4_ O54 +} i0z +k o3- +^h ^m +T0 ^F sF1 -@ki19 -fO48 -ci7u +@k i19 +f O48 +c i7u $H R6 -+8z1 ++8 z1 sa- -Z1i7n +Z1 i7n o8, ^q -o6 Z1 -si_p1 -to6 -p2O85 -i60c --6d -Z1i7% +o6 Z1 +si_ p1 +t o6 +p2 O85 +i60 c +-6 d +Z1 i7% i8@ O46 -^+z1 -O02C -+1$j -Z3o30 -uo4Z -i7o*35 -^o@o -o0eT6 -+1i4X -$/$) -ti1S +^+ z1 +O02 C ++1 $j +Z3 o30 +u o4Z +i7o *35 +@o +o0e T6 ++1 i4X +$/ $) +t i1S o0. -^)z1 -@1l -lo2o --0+2 -*45*35 -s5qZ3 -^w^t --0+3 -'AD7 -*BAD9 +^) z1 +@1 l +l o2o +-0 +2 +*45 *35 +s5q Z3 +^w ^t +-0 +3 +'A D7 +*BA D9 sc5 -i06z5 -^c$z -*56*85 -O02o3y -s42Z1 -T0o4r -$6+7 -$3t -cO02 +i06 z5 +^c $z +*56 *85 +O02 o3y +s42 Z1 +T0 o4r +$6 +7 +$3 t +c O02 s32 o6) -Z1*35 -o5a[ -p1o0s +Z1 *35 +o5a [ +p1 o0s i7+ -tr -*89+8 +*89 +8 stj o7Y -i9dT0 -*30O01 -+7r -i9 O52 -f$m +i9d T0 +*30 [ ++7 r +i9 O52 +f $m sO= -^!z2 +^! z2 se0 -o8bZ1 -O32u +o8b Z1 +O32 u i91 -R4D0 -p4O3A +R4 D0 +p4 O3A i9_ -T1'8 -+5s36 -O02*23 -o6 D1 -Z1$0 -do0H -li6/ -'8o7a +T1 '8 ++5 s36 +O02 *23 +o6 D1 +Z1 $0 +d o0H +l i6/ +'8 o7a o8T -$rZ1 -@z$8 -+BO02 +$r Z1 +@z $8 ++B O02 sgb -DAD5 -'9q -T0T7 -o0ri0p +DA D5 +'9 q +T0 T7 +o0r i0p s5_ i9f -^_z2 -{Z5 -+5O01 -+1Z4 -o05t +^_ z2 +{ Z5 +[ +4 ++1 Z4 +o05 t o4L -O43$! -i3xd -so.*40 -DAoAa -R0Z1 -^go78 -o2Nl -o3p -*42z1 -Z1T1 -R6O06 -*84O23 -O41} +O43 $! +i3x d +so. *40 +DA oAa +R0 Z1 +^g o78 +o2N l +*42 z1 +Z1 T1 +R6 O06 +*84 O23 +O41 } o4H -O91+9 -z2*14 +O91 +9 +z2 *14 s72 -*12o2y +*12 o2y @4 -o2[L2 -$!D3 -+3$1 -o0n^n -D1k -sbm^S -R1$5 +o2[ L2 +$! D3 ++3 $1 +o0n ^n +D1 k +sbm ^S +R1 $5 o5q -^;c -T1T3 -d-5 -o2p+3 -'8u -co4N -o0wq -c$! -p2z3 -O32i3: -i6 c -$;Z2 -^Cu +^; c +T1 T3 +d -5 +o2p +3 +'8 u +c o4N +o0w q +c $! +p2 z3 +O32 i3: +i6 c +$; Z2 +^C u o9y -'A*84 +'A *84 ssb -R5Z4 -i3_*46 +R5 Z4 +i3_ *46 sq o9v -R7$x -s0rL1 -o1bo0r -O04^l -*25R5 -$9$4 -p1*80 --2$) -$Uo7# -T3'9 +R7 $x +s0r L1 +o1b o0r +O04 ^l +*25 R5 +$9 $4 +p1 *80 +-2 $) +$U o7# +T3 '9 oBz -*01^R -$3Z4 -+0O42 -li2p -c$0 +*01 ^R +$3 Z4 ++0 O42 +l i2p s42 -+5*87 -p1*63 +p1 *63 i2^ -$kO13 -$to6w -o1aD2 +$k O13 +$t o6w +o1a D2 o6M -o7u*67 -o6c'A +o7u *67 +o6c 'A o0! *06 -D3$b +D3 $b sdo -co06 -Z3OB5 -$M$W -$zo3 +c o06 +Z3 OB5 +$M $W +$z o3 o7( -i0H -^ri1t -*56*76 -o5-*40 +^r i1t +o5- *40 swk sh7 -O61$1 -L1*15 -^AD3 -O02-7 -p1'6 -Z1o9_ +O61 $1 +L1 *15 +^A D3 +O02 -7 +p1 '6 +Z1 o9_ o9b -T2^` -[o3j -sxy*40 -Z2$! -o5H$i -o3Ec -D7+A +T2 ^` +[ o3j +sxy *40 +Z2 $! +o5H $i +o3E c +D7 +A o3? -i3%C -T6o1C -O09l -$2$% -q$3 -R1-3 -$"Z2 -^bsrz -$3O61 -z1$i -$d*21 -^.z1 -i9r-A -$3d -D3^p -+6$; -i0o^N -di7u -o55+6 -ki1h -^Dz2 -D0o3n -o94l -^ O24 +i3% C +T6 o1C +O09 l +$2 $% +q $3 +R1 -3 +$" Z2 +^b srz +$3 O61 +z1 $i +$d *21 +^. z1 +i9r -A +$3 d +D3 ^p ++6 $; +i0o ^N +d i7u +o55 +6 +k i1h +^D z2 +D0 o3n +o94 l +^ O24 s9. --3$1 -ri3t -^qL0 -Z1i58 -$P$s -$j*07 -^&$2 -i0?$! -z2o1H -^ID4 +-3 $1 +r i3t +^q L0 +Z1 i58 +$P $s +$j *07 +^& $2 +i0? $! +z2 o1H +^I D4 i1v -O07k -o0Oi3B -Z2^$ -$(Z3 -Z4O42 -*40O34 -*53o15 -$o+8 -O02+8 -o11z3 -l*83 -$iO92 -^f^a -dO36 -p2*B1 +O07 k +o0O i3B +Z2 ^$ +$( Z3 +Z4 O42 +*40 O34 +*53 o15 +$o +8 +O02 +8 +o11 z3 +l *83 +$i O92 +^f ^a +p2 *B1 i1. o3A -p1O17 -o3!-2 -$*D7 -$ O41 -O21*68 -$ai02 -lo6 +p1 O17 +o3! -2 +$* D7 +$ O41 +O21 *68 +$a i02 +l o6 oAd -^b^2 -$u-6 -^1-1 -uD8 -z2i1a -^=$0 +^b ^2 +$u -6 +^1 -1 +u D8 +z2 i1a +^= $0 o5I iB_ sir -i48l -Z1+8 -o7!-5 -s1Rq -o5to3u -^2i42 -*48z1 -}^j -^5l +i48 l +Z1 +8 +o7! -5 +s1R q +o5t o3u +^2 i42 +*48 z1 +} ^j +^5 l i45 -o7)l -c$D -D3^8 +o7) l +c $D +D3 ^8 slt -^9i1b +^9 i1b spk -'8o7; -*30+3 -*67-5 -stw} -co3c -p2O6B -^zz2 -*08$* --0*21 -O91D6 -@r*62 +'8 o7; +*30 +3 +*67 -5 +stw } +c o3c +p2 O6B +^z z2 +*08 $* +-0 *21 +O91 D6 +@r *62 $Q -O41Z4 -p5Z2 -$z+5 -i3l^z -$zD4 +O41 Z4 +p5 Z2 +$z +5 +i3l ^z +$z D4 i8m -o7o'A -^c*16 -+0Z1 -c$v -p1seh -T2d +o7o 'A +^c *16 ++0 Z1 +c $v +p1 seh +T2 d i2< -$9Z2 -i66'7 -lO75 -^>o2 -O52$$ -Z3sr& -+1o25 --0O12 -$9i7. --8-6 -^qz2 -Z2o70 -$D$r -p1O25 -o5+*67 -+6u -$c-B +$9 Z2 +i66 '7 +l O75 +^> o2 +O52 $$ +Z3 sr& ++1 o25 +-0 O12 +$9 i7. +^q z2 +Z2 o70 +$D $r +o5+ *67 ++6 u +$c -B o8q -L5*21 --8z3 -i51k -Z1RA -s9lZ2 -i1uZ3 -oA3Z1 -+1l -z1o0M -p1o0l -+4+0 -RBO0B -r-A -sn6c -$1o6c -*20O32 +L5 *21 +-8 z3 +i51 k +Z1 RA +s9l Z2 +i1u Z3 +oA3 Z1 ++1 l +^M +p1 o0l ++4 +0 +RB O0B +r -A +sn6 c +$1 o6c +*20 O32 o1n ^; o8x -o0Di6r -O32c -O84c -^SO12 +o0D i6r +O32 c +O84 c +^S O12 sw, ^^ -o7zl -O32^6 -o4x+2 -Z1$! -$0O72 --3+4 -o1sz1 -lZ5 -}o4d -$fk +o7z l +O32 ^6 +o4x +2 +Z1 $! +$0 O72 +-3 +4 +o1s z1 +l Z5 +} o4d +$f k skl -p1z3 +p1 z3 o2[ -'9Z2 -*42^k -o3ul -O91R9 +'9 Z2 +*42 ^k +o3u l +O91 R9 o3K -o6mp1 -'2p2 +o6m p1 +'2 p2 srh i21 o0; -lO78 -k^w -k^n -ci5/ -tD8 -$sO83 -$Z*76 +l O78 +k ^n +c i5/ +t D8 +$s O83 +$Z *76 o5A -O51o3s -O12^o -^ai15 --9} +O51 o3s +O12 ^o +^a i15 +-9 } s9^ -+5*65 -*51{ -o77Z1 -@0s3_ --2T4 -*30*02 ++5 *65 +*51 { +o77 Z1 +@0 s3_ +-2 T4 +*30 *02 o9t -^pz1 -O13i0M -*02o3e -qO82 -^1o63 -*76o6. -'7Z1 -s1wr -p2z5 -@sl +^p z1 +O13 i0M +*02 o3e +q O82 +^1 o63 +*76 o6. +'7 Z1 +s1w r +p2 z5 +@s l s5, -$5O51 -$no2- -$aOB4 -$z*23 -{$- -O26} -i3nZ1 -^S^N -*05O35 -o8 O02 -O02q -O14+0 -Z2si9 -+0*20 -T9[ -o5 Z1 -+7o6x -Z1ss -o87Z3 -i98s18 -$aZ2 -O85l -s2*r -Z1$- -r^/ -i1Ro1J -^1$0 -Z2+8 -o0,@2 -'7o3 -T6o53 -p1o5z -p1'8 +$5 O51 +$n o2- +$a OB4 +$z *23 +{ $- +O26 } +i3n Z1 +^S ^N +*05 O35 +o8 O02 +O02 q +O14 +0 +Z2 si9 ++0 *20 +T9 [ +o5 Z1 ++7 o6x +Z1 ss +o87 Z3 +i98 s18 +$a Z2 +O85 l +s2* r +Z1 $- +r ^/ +i1J +^1 $0 +Z2 +8 +o0, @2 +'7 o3 +T6 o53 +p1 o5z +p1 '8 oAu -Z2T0 -i32*81 -i5Vi22 -o7L} -$Z*80 +Z2 T0 +i32 *81 +i5V i22 +o7L } +$Z *80 i1T -O81-9 -^q^n -*14Z2 -^s$b -^#i1k +O81 -9 +^q ^n +*14 Z2 +^s $b +^# i1k i3& -z1i00 -i4f[ -[$k -Z1+B -O05s6 -z3o8h -c^@ -Z1i81 -oB2se6 -^O^M +z1 i00 +i4f [ +[ $k +Z1 +B +O05 s6 +z3 o8h +c ^@ +Z1 i81 +oB2 se6 +^O ^M i8/ -+3^d -+4i44 -sckO21 -o79t -dO31 -[R1 -*25o0B -$z$x --0+7 -o3f*72 -o3Ic -i10i39 -$.*45 -O05'A -i4/[ -Z4O53 ++3 ^d ++4 i44 +sck O21 +o79 t +d O31 +[ R1 +*25 o0B +$z $x +-0 +7 +o3f *72 +i10 i39 +$. *45 +O05 'A +i4/ [ +Z4 O53 saf -[i1d -$g$n -di7 -^h^r -+5$- -^-^j --4$* -lO24 -^>o1j -$4k -'AO61 +[ i1d +$g $n +d i7 ++5 $- +^- ^j +-4 $* +l O24 +^> o1j +$4 k +'A O61 s._ -o88+9 -L7O52 +o88 +9 +L7 O52 ss_ so, s.+ -^iO23 -u$" -O21*30 -[*12 -R3T7 -+5*53 -cslt -ss\l +O21 *30 +R3 T7 +c slt +ss\ l o0J iA2 -Z1o5- -z1+1 -i7u-8 -s1Kc -z1$ -$Cr +Z1 o5- +z1 +1 +i7u -8 +s1K c +z1 $ +$C r i93 -$)R0 -lO12 -^f*18 --5O05 -T5} -*68-6 +$) R0 +l O12 +^f *18 +-5 O05 +T5 } +*68 -6 spl -^SO14 -D5$, -+6-7 +^S O14 +D5 $, ++6 -7 '2 -T6Z1 -+0^/ -$ti4C -*34l -uO21 -*27 -*65+3 +T6 Z1 ++0 ^/ +$t i4C +u O21 +*65 +3 siR -}o0, -C$1 -O02$k -i63Z1 -o4r*10 -*64O72 --6o5t +} o0, +C $1 +O02 $k +i63 Z1 +o4r *10 +*64 O72 +-6 o5t svb -o7g*98 -i0at -*05l -L7o6. -o4tZ3 -R4D1 +o7g *98 +i0a t +*05 l +L7 o6. +o4t Z3 +R4 D1 o6Q -$h$k -o3hp1 -{o7k -co56 -*83*47 -*67o7r -z2p1 -O24z5 -o7$s$b -$s$u -lo0c -+0O92 -p1o5f -sskp1 --2*05 +$h $k +o3h p1 +{ o7k +c o56 +*83 *47 +*67 o7r +z2 p1 +O24 z5 +o7$ s$b +$s $u +l o0c ++0 O92 +p1 o5f +ssk p1 +-2 *05 $L -$cT0 -i3c'6 -[O21 +$c T0 +i3c '6 o6T -'9i8e -+1*06 -$k+0 -$?Z1 -$7@i --0D7 -O06Z1 +'9 i8e ++1 *06 +$k +0 +$? Z1 +$7 @i +-0 D7 +O06 Z1 $R -k'6 -R1o0e -o8Ml -z3o2- -ti7l +k '6 +R1 o0e +o8M l +z3 o2- +t i7l sjl -$7D2 --2L3 -$+$5 -o0MD3 -D7$5 -O01^o +$7 D2 +-2 L3 +$+ $5 +o0M D3 +D7 $5 +O01 ^o s4@ s3c -i5xO32 +i5x O32 $| -$ ^8 -z3'A -$1*21 -*20o2. -^qp1 -Z1i8v -*63D3 -$5+5 -T4sau -}s0- -O24o2r -Z5O49 -T3o71 -D8o7t -i09^e +$ ^8 +z3 'A +$1 *21 +*20 o2. +^q p1 +Z1 i8v +*63 D3 +$5 +5 +T4 sau +} s0- +O24 o2r +Z5 O49 +T3 o71 +D8 o7t +i09 ^e i58 -p3O34 -O35$ -z1sf* -*54l -$2Z2 -Z1srz +p3 O34 +O35 $ +z1 sf* +*54 l +$2 Z2 +Z1 srz sBk o5J -$ @1 -st@*41 -i0a^K -o64l -o12L0 -^,$, -^kO13 -$.+0 -^g'6 -i17$+ -o0P*23 -$d$4 -li1: -$/c -D6$g -^mO31 -i6Ec -*74+4 -o1l*13 -^7'9 -$+*56 -+4$a -i6-*78 +$ @1 +st@ *41 +i0a ^K +o64 l +o12 L0 +^, $, +^k O13 +$. +0 +^g '6 +i17 $+ +o0P *23 +$d $4 +l i1: +$/ c +D6 $g +^m O31 +i6E c +*74 +4 +o1l *13 +^7 '9 +$+ *56 ++4 $a +i6- *78 s80 -r^I -o1B*10 +r ^I +o1B *10 i48 -o8rO71 -^G^M -*79-9 +o8r O71 +^G ^M +*79 -9 scp -^<$ +^< $ ss% -^p^m -*50O32 -$v-5 -o4 O54 -o2lO31 -^Rz1 -l-4 -O02^% -i6w$y --1C -i4l'8 +^p ^m +*50 O32 +$v -5 +o4 O54 +o2l O31 +^R z1 +l -4 +O02 ^% +i6w $y +-1 C +i4l '8 ^$ -+7i7f -{i6W ++7 i7f +{ i6W o8U -o5_*24 --7o6- -i0k$o -p1OB2 -'A+3 +o5_ *24 +-7 o6- +i0k $o +p1 OB2 +'A +3 o8L -^yL0 -T0sM -^di8d -'9o4h -Z4O84 -s2*Z2 -$0*85 -O92sA1 -+6O02 -O71$v -$1@s -sdxz2 -p4z5 -o0Lp1 -$e$n --4O12 -O32i1e -lo2t -c$[ +^y L0 +T0 sM +^d i8d +'9 o4h +Z4 O84 +s2* Z2 +$0 *85 +O92 sA1 ++6 O02 +O71 $v +$1 @s +sdx z2 +p4 z5 +o0L p1 +$e $n +-4 O12 +O32 i1e +l o2t +c $[ s03 -o3g-5 -O28q -^iz1 -O12^3 -o4_o7s +o3g -5 +O28 q +^i z1 +O12 ^3 +o4_ o7s ^/ s91 -o0R+4 -^gO31 -i4hD0 -o79c -c$N -$(Z1 -$&C +o0R +4 +^g O31 +i4h D0 +o79 c +c $N +$( Z1 +$& C slj -^lc -z1O54 -i4&O03 -i0h^e +^l c +z1 O54 +i4& O03 +i0h ^e i6/ -s1#'8 -T2Z1 -D3-6 -*18o5g -o1s+0 -^i^m -O81-6 +s1# '8 +T2 Z1 +D3 -6 +*18 o5g +o1s +0 +^i ^m +O81 -6 oB+ -D3-1 -p2O93 -sdLu +D3 -1 +p2 O93 +sdL u oBu -i8MO53 -o3/f -+6Z2 -sA O53 -O12$. -$0Z4 -+7o6_ -^zL1 -i4eZ3 -o6a@9 -$e$l -O45[ -p2O82 +i8M O53 +o3/ f ++6 Z2 +sA O53 +O12 $. +$0 Z4 ++7 o6_ +i4e Z3 +o6a @9 +$e $l +O45 [ +p2 O82 s7c -cTA -$mt -D6o60 -D1^s -o0Md -L3} -^h$m -do5n -$+$# -D4D7 -o3w*32 +c TA +$m t +D6 o60 +D1 ^s +o0M d +L3 } +^h $m +d o5n +$+ $# +D4 D7 +o3w *32 s, -^6t -uR0 -^1'9 -$P$E -{'9 -O32+2 +^6 t +u R0 +^1 '9 +$P $E +{ '9 +O32 +2 i56 -Z3-8 -^Wz1 -z3@k -^;^s -p1sbp -i2hl -*05-1 -^PO31 -^zi4_ -'8$Q -$,c -$ O0B -i40^k -'7Z3 -z2u -^Iu +Z3 -8 +^W z1 +z3 @k +^; ^s +p1 sbp +i2h l +*05 -1 +^P O31 +^z i4_ +'8 $Q +$, c +$ O0B +i40 ^k +'7 Z3 +z2 u +^I u s*< -c$3 -s0aRA -$ki8o -i64 +s0a RA +$k i8o o1S --7o14 -ko4 -i0,r -$-f -^{R0 -z2l -o5_@p -}$o -o13k +-7 o14 +k o4 +r $, +$- f +^= +z2 l +o5_ @p +} $o +o13 k $( R7 -$,O02 -*10c -Z3O96 -Z1{ -p1*98 -r[ -O42slL +$, O02 +Z3 O96 +Z1 { +p1 *98 +r [ +O42 slL s3q -'9-2 -o1Oc -i42sky -L7o07 +'9 -2 +o1O c +i42 sky +L7 o07 ssa -i77$3 +i77 $3 sek -^6z2 +^6 z2 o35 -s8M*02 -$7C -$a$p -o2 ^= -O41-0 -D2R1 -[$A -*23o3y +s8M *02 +$7 C +$a $p +o2 ^= +O41 -0 +D2 R1 +[ $A +*23 o3y sbr -*87c +*87 c o3! -*89-7 +*98 -7 i3x -s4x^E -cR6 +s4x ^E +c R6 o2; i9b -$!C +$! C i1m -i1c{ -$S$V -O02o2 -s9 k +i1c { +$S $V +O02 o2 +s9 k s0| -o8k$e +o8k $e se* --6o7r -+0+0 -*76i7u -R4O04 -$!Z4 -i2:t -*05O02 -do0T -dO41 -L0o1. -D4p1 -o5iD4 -^t'7 -D3+0 -L0+1 -$u$8 --1$; -Z1T5 -z2+6 -*98-7 -'7$s --1-1 -*76+8 -T1T7 -oA3'B -^3^b --6Z1 -'8^t -o68D8 -Z1D5 -^CT4 -*16o27 -t[ -o0N +-6 o7r ++0 +0 +*76 i7u +R4 O04 +$! Z4 +i2: t +*05 O02 +d o0T +d O41 +L0 o1. +D4 p1 +o5i D4 +^t '7 +L0 +1 +$u $8 +-1 $; +Z1 T5 +z2 +6 +'7 $s +-1 -1 +*76 +8 +T1 T7 +oA3 'B +^3 ^b +-6 Z1 +'8 ^t +o68 D8 +Z1 D5 +^C T4 +*16 o27 +t [ i2@ -z3-2 -[Z5 -cs1, -*1A'A -{Z2 +z3 -2 +[ Z5 +c s1, +*1A 'A +{ Z2 o7U -^7} -+4Z1 -@aoB9 -D9-7 +^7 } ++4 Z1 +@a oB9 +D9 -7 shy --8c -R1o07 --0{ --6i7d +-8 c +R1 o07 +-0 { +-6 i7d ${ -^1*50 +^1 *50 so# -$s^1 -D6LB -ci2/ -$_@0 -$r-8 -k^j -+1{ -Z4$4 -[D1 +$s ^1 +D6 LB +c i2/ +$_ @0 +$r -8 +k ^j ++1 { +Z4 $4 +[ D1 ssf -i4n^k -OB2LB -OB2iBb -^ti5t -i8z'9 -O21^3 -O31$y -^di1s -O31r -*43$a -o1@-8 +i4n ^k +OB2 LB +OB2 iBb +^t i5t +i8z '9 +O21 ^3 +O31 $y +^d i1s +O31 r +*43 $a +o1@ -8 s71 -O62^3 -i37c -$ *03 -O32*30 -i1a*40 -o8a+5 +O62 ^3 +i37 c +$ *03 +O32 *30 +i1a *40 +o8a +5 sBF -o0^z1 -O21^L -^c} -*89} +o0^ z1 +O21 ^L +^c } +*89 } iAt --0i0c -p1o0w --4'6 +p1 o0w +-4 '6 i6A -*23*05 +*23 *05 ^T --7i4x -+4i4z -O12s2z -O17*20 -O51*75 -o62l -^Yo5d -cD7 -O51$6 -O17l -{scs +-7 i4x ++4 i4z +O12 s2z +O17 *20 +o62 l +^Y o5d +c D7 +O51 $6 +O17 l +{ scs sB3 -'4Z5 -z1i14 -^Lz1 -^-z4 -$9Z5 +'4 Z5 +z1 i14 +^L z1 +^- z4 +$9 Z5 sb- -*61^ -*36c -O41$G +*61 ^ +*36 c +O41 $G skh -$#$g +$# $g s@. -^Sz1 -^@*13 -dD6 -Z1@a -sr *65 -'9o6m -$9t -Z1-5 -csd1 -*35*54 +^S z1 +^@ *13 +Z1 @a +sr *65 +'9 o6m +$9 t +Z1 -5 +c sd1 +*35 *54 o2P -^a^n -O32k -D5o1a -i35q -O13$1 -[i31 -*46O05 -*47D4 -su[D3 -o6Oc -^7o2n -d-A -}^4 -$iq -z5z4 -$hl -i21^L +^a ^n +O32 k +D5 o1a +i35 q +O13 $1 +[ i31 +*46 O05 +*47 D4 +su[ D3 +o6O c +^7 o2n +d -A +} ^4 +$i q +z5 z4 +$h l +i21 ^L scw -+1i2g -se1D5 -^YT2 -$3Z3 -Z3i1o -lo63 -$2*52 -i1P{ -^,c -^s'A -$d$ -$eo9l -us94 -p1O13 ++1 i2g +se1 D5 +^Y T2 +$3 Z3 +Z3 i1o +l o63 +$2 *52 +i1P { +^, c +^s 'A +$d $ +$e o9l +u s94 +p1 O13 i7D -O82'A -$-C -$ s9a -D6i66 -$#r +O82 'A +$- C +$ s9a +D6 i66 +$# r ss, -O61o6 -^O+6 -Z1o6 -sa!r -i6mZ1 --0^9 -$M$L -do5w -'4sc -z5O63 -*42R6 +O61 o6 +^O +6 +Z1 o6 +sa! r +i6m Z1 +-0 ^9 +$M $L +d o5w +'4 sc +z5 O63 +*42 R6 i15 -$ ^: --8l -R8R8 -+0z3 -$x{ +$ ^: +-8 l +R8 R8 ++0 z3 +$x { o32 -i2y*62 -[i5 -OB2$7 -*A6O26 -^j+1 --2R1 -O06l -o0fD1 -p1O96 -p1o5d -si l -c'5 -R0l -$,$0 -p3O7B -$!O53 +i2y *62 +[ i5 +OB2 $7 +*A6 O26 +^j +1 +-2 R1 +O06 l +o0f D1 +p1 O96 +p1 o5d +si l +c '5 +R0 l +$, $0 +p3 O7B +$! O53 sPN -o5eO61 -ci0M -i3_+5 -O14L0 -t-0 +o5e O61 +i3_ +5 +O14 L0 +t -0 i4F oBo --5$S -*67i65 -di6x -$nZ3 -rO51 -'7o6! -p1$i -'6z4 -Z3o14 -o77*A7 -lo7e -D7Z2 --3i33 -o4io6! -i3aO02 -O03$6 -p1*67 -$*T5 -{+7 -i01'B -lo68 -*51+1 -i4aO52 -L0O51 -Z1oB0 -R7o6 -*14o1X -$x*31 -$wc -^_$6 -{o46 -o1zq -O0Bl -$$-7 -Z2o9m -to1y --6O84 -i3ei2s +-5 $S +*67 i65 +d i6x +$n Z3 +r O51 +'7 o6! +p1 $i +'6 z4 +Z3 o14 +o77 *A7 +l o7e +D7 Z2 +-3 i33 +o4i o6! +i3a O02 +O03 $6 +p1 *67 +$* T5 +{ +7 +i01 'B +l o68 +*51 +1 +i4a O52 +L0 O51 +Z1 oB0 +R7 o6 +*14 o1X +$x *31 +$w c +^_ $6 +{ o46 +o1z q +O0B l +$$ -7 +Z2 o9m +t o1y +-6 O84 +i3e i2s i83 -$s$ -o0Ik -O51i44 -^-D3 -*15$p -siB$V -$/t -*52o5B -so@O05 -O41^i -i0v*07 -D5o2_ -*71O01 -o85*75 -lO58 -o3_D4 +$s $ +o0I k +O51 i44 +^- D3 +*15 $p +siB $V +$/ t +*52 o5B +so@ O05 +O41 ^i +i0v *07 +D5 o2_ +o85 *75 +l O58 +o3_ D4 ssn -^b-3 -O43*05 -ci6R -'5*13 -o04L1 -^4sb1 -i5u*68 -$c$b -p1O8B -p1o5c -ci6$ -*20*03 -^:s( -*26^f -+5T4 -*9A@5 -ti11 -R5i5, -i0_l -^zO24 -+6$L -u+4 -*B8*A9 -i1uOA1 -dsrw -'9i8K -$7Z5 -lOA3 -*21^j -${L4 -$Fo1g -$dOA6 -p3DA -i7.*79 -do8o -O05$0 -s7W*74 -L0O31 -}o1a -$DZ1 -*53smb -ti62 -o8|Z2 -o9r$i -T2O02 +^b -3 +O43 *05 +c i6R +'5 *13 +o04 L1 +^4 sb1 +i5u *68 +$c $b +p1 O8B +p1 o5c +c i6$ +*20 *03 +^: s( +*26 ^f ++5 T4 +*9A @5 +t i11 +R5 i5, +i0_ l +^z O24 ++6 $L +u +4 +*B8 *A9 +i1u OA1 +d srw +'9 i8K +$7 Z5 +l OA3 +*21 ^j +${ L4 +$F o1g +$d OA6 +p3 DA +i7. *79 +d o8o +O05 $0 +s7W *74 +L0 O31 +} o1a +$D Z1 +*53 smb +t i62 +o8| Z2 +o9r $i +T2 O02 st# -shD^F -i60Z1 -z1o2N -$0i5k -i5_o9o -@a-3 -^d$ -kD2 -sc$+2 -'6$0 --8o3b -D2o0l -O01O93 -z5*21 -z1^R -O83Z1 -o34l -slho10 -o3az5 -o6jD8 -*10oA9 -*20c -s16l -L2i3l -i0k+4 +shD ^F +i60 Z1 +z1 o2N +$0 i5k +i5_ o9o +@a -3 +^d $ +k D2 +sc$ +2 +'6 $0 +-8 o3b +D2 o0l +O01 O93 +z5 *21 +z1 ^R +O83 Z1 +o34 l +slh o10 +o3a z5 +o6j D8 +*10 oA9 +*20 c +s16 l +L2 i3l +^k +4 sb, -*12o1j -Z2o4- -Z3o9r +*12 o1j +Z2 o4- +Z3 o9r i1/ -$iO12 -z1^p --8*8A -qoA2 -[o2q -o6-Z2 -+0s@y -$mi7g -kL2 -'B$e +$i O12 +z1 ^p +-8 *8A +q oA2 +[ o2q +o6- Z2 ++0 s@y +$m i7g +k L2 +'B $e shr -$ $2 -$hL8 -$f$j -^psx- -'5o0d -^1-9 -O04*78 -sIEc -^m-7 -*82O06 -o0g+6 -^2D4 -i59*02 -o7&-3 -*62i0z -Z4O46 -i5*$* -p2D1 -$ -0 -*34o3r -R4Z3 -$oO15 -T0o2S -$5sk1 -{+9 --5$3 --2o3x --1$8 -*56-6 -*7AO64 -^t*34 -}*91 -'A$] -*57*93 -^[O15 -r^k -Z5@a -li4; -^6*07 --9*98 +$ $2 +$h L8 +$f $j +^p sx- +'5 o0d +^1 -9 +O04 *78 +sIE c +^m -7 +*82 O06 +o0g +6 +^2 D4 +i59 *02 +o7& -3 +*62 i0z +Z4 O46 +i5* $* +p2 D1 +$ -0 +*34 o3r +R4 Z3 +$o O15 +T0 o2S +$5 sk1 +{ +9 +-5 $3 +-2 o3x +-1 $8 +*56 -6 +*7A O64 +^t *34 +} *91 +'A $] +*57 *93 +^[ O15 +r ^k +Z5 @a +l i4; +^6 *07 +-9 *98 i16 -o4xp1 -$y^i -$$+6 -D4sg -*06s7A -li2% -$aO73 -*10o8# -i2f$# -[$9 -O64z3 -'9i45 -$5D8 --9$% -^bo8* -^tO24 -i4Pc -o7,c -o7`L7 -sS/c -$0o0G -*09'6 -o91*18 -sPa^k -$^@j -sdf+8 +o4x p1 +$y ^i +$$ +6 +D4 sg +*06 s7A +l i2% +$a O73 +k o8# +i2f $# +[ $9 +O64 z3 +'9 i45 +$5 D8 +-9 $% +^b o8* +^t O24 +i4P c +o7, c +o7` L7 +sS/ c +$0 o0G +*09 '6 +o91 *18 +sPa ^k +$^ @j +sdf +8 s+7 -i0e*21 +i0e *21 s58 sjB -sfa'A -T7$0 -s7Qq -o59Z2 -T7$7 -o4t*45 -+4o0m -i21i6q -i6h'A --3@8 -i8t-1 -'4$o -O28^z -Z1o54 -+5O04 -+9D3 -o7il --4^j -sbs^j -ci4- -o6:@9 -L7i6d -to77 -'6D2 -^h} -+8*9A -*63+1 -ko65 -o72$e -qi0y -O14i1G -D2^f -z4O5A -o6sd -O65$/ -^P^4 -d*57 -O82+1 -sCs^! -'9i1t --2O52 -ds2q -+6o77 -O57$ -*B3*B9 -i6p*28 +sfa 'A +T7 $0 +s7Q q +o59 Z2 +T7 $7 +o4t *45 ++4 o0m +i21 i6q +i6h 'A +-3 @8 +i8t -1 +'4 $o +O28 ^z +Z1 o54 ++5 O04 ++9 D3 +o7i l +-4 ^j +sbs ^j +c i4- +o6: @9 +L7 i6d +t o77 +'6 D2 +^h } ++8 *9A +*63 +1 +k o65 +o72 $e +q i0y +O14 i1G +D2 ^f +z4 O5A +o6s d +O65 $/ +^P ^4 +p1 *57 +O82 +1 +sCs ^! +'9 i1t +-2 O52 +d s2q ++6 o77 +O57 $ +*B3 *B9 +i6p *28 iBi -^,z1 -O14Z4 -'7+6 -D5*87 -^*$- -{*34 -i8Zc -Z2-3 -i85O53 -D7o7. -*60$3 -T3$" -i8uu -i4.t -sf6^c -iBrRA -$mO43 -k^8 -i1xz1 -+7o54 +^, z1 +O14 Z4 +'7 +6 +D5 *87 +^* $- +{ *34 +i8Z c +Z2 -3 +i85 O53 +D7 o7. +*60 $3 +T3 $" +i8u u +i4. t +sf6 ^c +iBr RA +$m O43 +k ^8 +i1x z1 ++7 o54 spc -s- DA --8-2 +s- DA +-8 -2 s8z -slyO41 +sly O41 sC o9B -*04+4 -[i45 -*64o66 -i4ei52 -z1c -+4+1 -i7eR9 -O64$9 -$%$! -$0Z5 -D4o83 -$ p1 -ci61 -{i4J -lo0z -D2o6y -s2k$h -p1O23 -i05^! -O62p1 -D1*31 -^N$L -O01o4i +*04 +4 +[ i45 +*64 o66 +i4e i52 +z1 c ++4 +1 +i7e R9 +O64 $9 +$% $! +$0 Z5 +D4 o83 +$ p1 +c i61 +{ i4J +l o0z +D2 o6y +s2k $h +p1 O23 +i05 ^! +O62 p1 +D1 *31 +^N $L +O01 o4i svt -$9Z3 -o4Fz3 -o1mo0e -+5O61 -O41f +$9 Z3 +o4F z3 +o1m o0e ++5 O61 +O41 f ssw sr$ -se ^Z -D4-B -Z4$9 -i0^z2 -*87sti -o2"u -+8$@ -O81$m +se ^Z +D4 -B +Z4 $9 +i0^ z2 +*87 sti +o2" u ++8 $@ +O81 $m sjx -+6@d -R1+0 -O42i4e ++6 @d +R1 +0 +O42 i4e s1! -o8Z*67 -o3d^z -O91Z1 -r*30 -z1'B -co90 -o7sshe -+8o7b -shRZ1 -^rD5 -Z2i7u +o8Z *67 +o3d ^z +O91 Z1 +r *30 +z1 'B +c o90 +o7s she ++8 o7b +shR Z1 +^r D5 +Z2 i7u si2 -snyp1 -*71O03 -$3L0 -^dL1 -O56O01 -sph*91 -sDIO52 -z2+8 -i48L2 -co7+ -^g^h -^1s8x -$nk -'A$7 -*79'A -i3^^x -lp3 -ri7u -r^5 -o2j*60 -f$8 -*30-4 -*51O35 -O62^l --7o6b --8*76 -^,r -O05o1 +sny p1 +*71 O03 +$3 L0 +^d L1 +O56 O01 +sph *91 +sDI O52 +z2 +8 +i48 L2 +c o7+ +^g ^h +^1 s8x +$n k +'A $7 +*79 'A +i3^ ^x +l p3 +r i7u +r ^5 +o2j *60 +f $8 +*30 -4 +*51 O35 +O62 ^l +-7 o6b +-8 *76 +O05 o1 i8* -$b$. -s12oA0 -*97siu +$b $. +s12 oA0 +*97 siu i9r -$MZ2 -oAcO07 -^LO19 -i5fO13 -$1i9 -}i0A -o15O24 -O82*86 -soIc -z3@j -o2n-4 -o0eo3l -*25+2 -o5 +6 -O36D1 -o3iO02 -O31Z3 -T0$D -^AoAa -D0i2j -O89l -i3gO43 -$f^f -D8^\ -$0O15 +$M Z2 +oAc O07 +^L O19 +i5f O13 +$1 i9 +} i0A +o15 O24 +O82 *86 +soI c +z3 @j +o2n -4 +o0e o3l +*25 +2 +o5 +6 +O36 D1 +o3i O02 +O31 Z3 +T0 $D +^A oAa +D0 i2j +O89 l +i3g O43 +$f ^f +D8 ^\ +$0 O15 s8g -+8$m ++8 $m o1q -T8O02 -*20o5X -^"R6 -z4$e -o8zD7 -+1O28 -l*40 -'8i1. +T8 O02 +*20 o5X +^" R6 +z4 $e +o8z D7 ++1 O28 +l *40 +'8 i1. sgl -O41'B -sbku -L1i27 -'5o3k -i6d-5 -^gO23 +O41 'B +sbk u +L1 i27 +'5 o3k +i6d -5 +^g O23 o8- -$c$t -cO23 -+3^2 -Z2o73 +$c $t +c O23 ++3 ^2 +Z2 o73 sDL -i5ri3= +i5r i3= i4w -T0$6 -srYu -O81sz -o7k*63 -o9eO72 -dseg -z2$k -i55r -*53O13 -i4i*64 +T0 $6 +srY u +O81 sz +o7k *63 +o9e O72 +d seg +z2 $k +i55 r +*53 O13 +i4i *64 s0g -k$p -o5fZ3 -o4jO31 -oAp'B -*62o2s -Z4o93 -o5rz4 -*36'6 -$vD3 -*74sds -^1Z3 -Z3^3 -$a*16 -to7S -$_$? -*13s73 -T2i0I -Z3o5E -$M$* -o1s*84 -z1o6w -*69O92 -i6fl -sdj*29 -$b*34 -o5bi62 -i0u^c -s- D5 -o6SZ2 -*60-8 +k $p +o5f Z3 +o4j O31 +oAp 'B +*62 o2s +Z4 o93 +o5r z4 +*36 '6 +$v D3 +*74 sds +^1 Z3 +Z3 ^3 +$a *16 +t o7S +$_ $? +*13 s73 +T2 i0I +Z3 o5E +$M $* +o1s *84 +z1 o6w +*69 O92 +i6f l +sdj *29 +$b *34 +o5b i62 +i0u ^c +s- D5 +o6S Z2 +*60 -8 o47 -$qz2 -OB2s24 -z1i5/ -o6pT1 -o7_T0 -@iZ5 -p2Z1 -$7*98 -$mO32 -s#,} -li3a -z2z4 +$q z2 +OB2 s24 +z1 i5/ +o6p T1 +o7_ T0 +@i Z5 +p2 Z1 +$7 *98 +$m O32 +s#, } +l i3a +z2 z4 iAb -*80'6 -*98*85 --8o9l -O34^p -z3sT7 -l@9 -O81$f -*A9O52 -$k^D -p1*57 +*80 '6 +*98 *85 +-8 o9l +O34 ^p +z3 sT7 +l @9 +O81 $f +*A9 O52 +$k ^D i3R -*78o4! -O52*78 -D3$X -to4T -s18*85 -*12$! -O6B[ -i4 [ -sa7o0b -p5z1 -$ *84 -*20o0l -o05z1 -z4*58 -OB2iB9 -$)o64 -o0M*13 -D2-6 -o51l -O7A[ -$n$b +*78 o4! +D3 $X +t o4T +s18 *85 +*12 $! +O6B [ +i4 [ +sa7 o0b +p5 z1 +$ *84 +*20 o0l +o05 z1 +z4 *58 +OB2 iB9 +$) o64 +o0M *13 +D2 -6 +o51 l +O7A [ +$n $b sZs -*97o93 -^XO31 -sbpi7t -^Ql -$r$F -t-8 -O36$ -OBA^4 -o6p+9 -*98@9 -o5aD6 -O71*56 -^_O13 -Cs4b -p1O53 -*56r -Z2o0_ -i7fc +*97 o93 +^X O31 +sbp i7t +^Q l +$r $F +t -8 +O36 $ +OBA ^4 +o6p +9 +*98 @9 +o5a D6 +O71 *56 +^_ O13 +C s4b +*56 r +Z2 o0_ +i7f c sDF -o56o8s -L5T4 -i1h^d -O15$t -iAeO72 -D7$0 -$b^a -*04i4t -p1o7h -{^k +o56 o8s +L5 T4 +i1h ^d +O15 $t +iAe O72 +D7 $0 +$b ^a +*04 i4t +p1 o7h +{ ^k sph -o8_*87 +o8_ *87 sa9 -O64$0 -T3} -$4t -$3*74 -O42l -O93O41 -+0Z2 -O64l -$L*16 -^c*46 -i2g'B -O42'B -s05+8 -L7t -*35O12 -TBTA -O09L0 -*41O34 -*81o3@ -$o@1 -O42i4= -kO23 -*86o8s -c^( -k-3 -'4^8 -{o4_ +O64 $0 +T3 } +$4 t +$3 *74 +O93 O41 ++0 Z2 +O64 l +$L *16 +^c *46 +i2g 'B +O42 'B +s05 +8 +L7 t +*35 O12 +TB TA +O09 L0 +*41 O34 +*81 o3@ +$o @1 +O42 i4= +k O23 +*86 o8s +c ^( +'4 ^8 +{ o4_ s0B -o3i*53 -*35^# -'B+0 -{-0 +o3i *53 +*35 ^# +'B +0 +{ -0 syo -{R3 -i4]l -Z1o59 -^Fi0B +{ R3 +i4] l +Z1 o59 +^F i0B snh -ds5- -OB3O04 -*32^A --4$! -o6n$y -^Po5d -s* '3 -O16r -Z3^J -^W*14 -Z2i7d +d s5- +OB3 O04 +*32 ^A +-4 $! +o6n $y +^P o5d +s* '3 +O16 r +Z3 ^J +^W *14 +Z2 i7d o2) -Z1^B +Z1 ^B ^: -k$; -@y{ -i6Si7h -o6n+3 -p3O01 -o3lD0 -^hO71 -*86i6; -smZ$e -O62+5 -p1*72 -}O14 -^.$? -$KZ1 -O34*13 -T5i0p -O05*41 -O71'B -DA$1 -co1V -*98+0 -L8s5s -L8O17 -@0l -ti2F -O93-7 -O23i2i +k $; +@y { +i6S i7h +o6n +3 +p3 D0 +o3l D0 +^h O71 +*86 i6; +smZ $e +O62 +5 +p1 *72 +} O14 +^. $? +$K Z1 +O34 *13 +T5 i0p +O05 *41 +O71 'B +DA $1 +c o1V +*98 +0 +L8 s5s +L8 O17 +@0 l +t i2F +O93 -7 +O23 i2i i8U -*23O03 -$oz4 -o0tq -o4D*78 -z3sis -*32*45 -O13R2 +*23 O03 +$o z4 +o0t q +o4D *78 +z3 sis +*32 *45 +O13 R2 smo -L7O07 -^7-3 -d$g -$6s19 -{i6L -i4&o7b -^si1j -@4{ -*68o6r -s8c*01 -O53o2e -o2Wc -$xO64 -Z1$c +L7 O07 +^7 -3 +d $g +$6 s19 +{ i6L +i4& o7b +^s i1j +@4 { +*68 o6r +s8c *01 +O53 o2e +o2W c +$x O64 +Z1 $c o2A -O15*15 -O81$1 +O15 *15 +O81 $1 i4N -i1&r -z2o1s --1l -O04'3 -*56o5j -ksgd -Co1a -o7UR3 -D3R3 +i1& r +z2 o1s +-1 l +O04 '3 +*56 o5j +k sgd +C o1a +o7U R3 +D3 R3 s2M -o90*96 -O85O43 +o90 *96 +O85 O43 sd5 -f*87 -*A1[ -*31o32 -o5eZ1 -'5f -l} +f *87 +*A1 [ +*31 o32 +o5e Z1 +'5 f +l } i2I -'8+0 -i1hp1 +'8 +0 +i1h p1 o4> -tR1 -@oi1s -o0M*43 --2i3l -$fo1e -o6u-5 +t R1 +@o i1s +o0M *43 +-2 i3l +$f o1e +o6u -5 s0\ -i9u[ -}soi +i9u [ +} soi o5G -lOBA -Z2o1n -fO18 -'7Z5 -o4Od -o36 -[$^ -@6*53 -o0Wskt +l OBA +Z2 o1n +f O18 +'7 Z5 +o4O d +[ $^ +@6 *53 +o0W skt svz -rz2 +r z2 s79 -$KD3 -o0zO13 --7o8! -$)^. -*34O51 -$2o62 --1*91 -}$? +$K D3 +o0z O13 +-7 o8! +$) ^. +*34 O51 +$2 o62 +-1 *91 +} $? s-/ -$3$% +$3 $% sAT -Z2$e -z2s4x -fO03 -'7O51 -OB2$0 -s3qp1 -*02*7A -z1o3_ -o9oOA3 -p1i7o -O24^g -TAs09 +Z2 $e +z2 s4x +f O03 +'7 O51 +OB2 $0 +s3q p1 +*02 *7A +z1 o3_ +o9o OA3 +p1 i7o +O24 ^g +TA s09 s0^ -L8O35 -^['8 -*35+1 -sdc-0 -ts0e -$%$j -*35R4 -$3@o -o0Q$w -o4 $5 -'3p2 -'2o0- -z1^L -*03i3e +L8 O35 +^[ '8 +*35 +1 +sdc -0 +t s0e +$% $j +*35 R4 +$3 @o +o0Q $w +o4 $5 +'3 p2 +'2 o0- +z1 ^L +*03 i3e o4) -*45z1 -p1i49 -$vL5 -sGtO41 -$ -o3Yc -ki12 +i0R ^W +u sX> +o3Y c +k i12 s.z -$1OB2 -$Kc -p1i4m -p1s1+ -s8qZ1 -*21i50 -Z1sua -Z2s85 --B$3 --1$3 -+2o0z -LB@5 +$1 OB2 +p1 i4m +p1 s1+ +s8q Z1 +*21 i50 +Z1 sua +Z2 s85 +-B $3 +-1 $3 ++2 o0z +LB @5 o7T -o66$/ +o66 $/ *73 -o7#u -i68Z2 -T9*41 -$=T8 -uo95 -O51i6r +o7# u +i68 Z2 +T9 *41 +$= T8 +u o95 +O51 i6r i6" -'8i6P -*46o54 -$HD3 -i4%u -$sOA1 -$8-7 -*05i1y -uO74 -$C-1 +'8 i6P +*46 o54 +$H D3 +i4% u +$s OA1 +$8 -7 +*05 i1y +u O74 +$C -1 o1_ -+B*9A -^r*67 -s,E$B -i4p*57 -i6(l -O61i2@ -$siAi -O25i3z -'6$l -$xO93 -$c^t -'Bo8f -o3xO42 -+5*60 -R3k -$o$x -i50$9 -*01o6! -o9uc -OB3LB -uo78 -i2h$3 -$t*13 -$/Z1 -o4 i4o -D2O45 -O96l -*32D7 -o1fp2 --3+1 -Z1i93 -*20^1 -^w$w -i0MO71 -O03^@ -*50O23 -O36z3 -^L$8 --5o62 -D3l -'B$I -*63ssN -O72+1 -z1+3 --1*12 -*14i2- -o2 sy? ++B *9A +^r *67 +s,E $B +i4p *57 +i6( l +O61 i2@ +$s iAi +O25 i3z +'6 $l +$x O93 +$c ^t +'B o8f +o3x O42 ++5 *60 +R3 k +$o $x +i50 $9 +o6! k +o9u c +OB3 LB +u o78 +i2h $3 +$t *13 +$/ Z1 +o4 i4o +D2 O45 +O96 l +*32 D7 +o1f p2 +-3 +1 +Z1 i93 +*20 ^1 +^w $w +i0M O71 +O03 ^@ +*50 O23 +O36 z3 +^L $8 +-5 o62 +D3 l +'B $I +*63 ssN +O72 +1 +z1 +3 +-1 *12 +*14 i2- +o2 sy? o4S -^6$, -sx8*70 -+2*30 -@wd -i7r*8A -o2cO41 -^CO32 -+9@s -O35+0 +^6 $, +sx8 *70 ++2 *30 +@w d +i7r *8A +o2c O41 +^C O32 ++9 @s +O35 +0 oAv -^#^@ +^# ^@ sp= --8o4b -$8O42 -D9+7 -L0^f +-8 o4b +$8 O42 +D9 +7 +L0 ^f sij -o9dO63 -O35$n -^gu -O03-0 -^7$+ -iA--B --6$z -*24R3 -p1O5A -*21i61 +o9d O63 +O35 $n +^g u +O03 -0 +^7 $+ +iA- -B +-6 $z +*24 R3 +p1 O5A +*21 i61 o4/ -csL, -$gi0r -{i65 -t+4 -O29d -^!T4 +c sL, +$g i0r +{ i65 +t +4 +O29 d sx_ -+0O12 -^,^- -o51O13 -O31i67 -O42$% -siaOA1 -i65R5 ++0 O12 +^, ^- +o51 O13 +O31 i67 +O42 $% +sia OA1 +i65 R5 s%$ -cstC -+1o2b -o2ek -L2Z2 -O56Z1 +c stC ++1 o2b +o2e k +L2 Z2 +O56 Z1 i5I -D5i4B -^+^a +D5 i4B +^+ ^a se- -+5*54 -O21$g -+7i4/ -^Ki71 -*36*17 -$xD5 -Z3+5 -o4.Z3 -O63^2 -li0S -O62O02 -z1i1s -ksej ++5 *54 +O21 $g ++7 i4/ +^K i71 +*36 *17 +$x D5 +Z3 +5 +o4. Z3 +O63 ^2 +l i0S +O62 O02 +k sej s-K -$S{ -o1L[ +$S { +o1L [ sx, -o2Ju -*32i6_ -o2b*32 -ri6, -R0O24 -*30sdD -*62o6. -^mO24 -$uZ1 -s1^Z1 -o4 *B0 -$e+B -'9$' -$!$, -O04'8 +o2J u +*32 i6_ +o2b *32 +r i6, +R0 O24 +*30 sdD +*62 o6. +^m O24 +$u Z1 +s1^ Z1 +o4 *B0 +$e +B +'9 $' +$! $, +O04 '8 o3H -$RO23 -OA2*97 -o32i3k -o9 Z1 -spck -cDA -f*9B -{T0 -+B@7 -Z2sQv -^Bs52 -Z2o8_ -o6/$5 -z1$, -o2tZ3 -i99*86 -'8d -ssuz2 -*52$3 +$R O23 +OA2 *97 +o32 i3k +o9 Z1 +spc k +c DA +f *9B +{ T0 ++B @7 +Z2 sQv +^B s52 +Z2 o8_ +o6/ $5 +z1 $, +o2t Z3 +i99 *86 +'8 d +ssu z2 +*52 $3 o2E -O02z5 -D2-4 -*15*23 -^*R1 -s6Wc -D9L7 +O02 z5 +*15 *23 +^* R1 +s6W c +D9 L7 sai -^nstk -'3d +^n stk R8 -^i^g --1z3 -Z5O05 -@1o8! -D1Z4 -Z4O02 -$st -o1ai2s -oAuLA -$_$t --1s9s -fO74 -s0^Z1 -Z1$7 -*46^P -O51i3q -o4oc -$?L8 -+2*02 -+A*8A -o70$9 -$E+4 -*04l -'7^@ -i5wO72 -$5[ -*27o2n -$f$1 -*90O26 -oAsO42 --6L6 -o6^Z1 -to8% --8o66 -}$P -*76o6a +^i ^g +-1 z3 +Z5 O05 +@1 o8! +D1 Z4 +Z4 O02 +$s t +o1a i2s +oAu LA +$_ $t +-1 s9s +f O74 +s0^ Z1 +Z1 $7 +*46 ^P +O51 i3q +o4o c +$? L8 ++2 *02 ++A *8A +o70 $9 +$E +4 +'7 ^@ +i5w O72 +$5 [ +*27 o2n +$f $1 +*90 O26 +oAs O42 +-6 L6 +o6^ Z1 +t o8% +-8 o66 +} $P +*76 o6a s1l --9-4 +-9 -4 i7j -*84o84 -c} -swbZ1 -@Do7} -$gO52 -^e+3 -$?O45 -^_k -$O*86 -*02+9 -rO15 +*84 o84 +c } +swb Z1 +@D o7} +$g O52 +^e +3 +$? O45 +$O *86 +*02 +9 +r O15 svp -i4r*49 -iALoBP -O04^q +i4r *49 +iAL oBP +O04 ^q i3H -i3!*93 -o77*10 +i3! *93 +o77 k sd` sjH -o0gp2 -$A$Y -o81scw -Z4o6a -u*56 -^2o42 -ssbk -^r+A -o3/O45 -i58O23 -'5z4 -O32o2x -oAOc -O43*43 -p1sl7 -i97$5 -^dO13 -c^8 -*78O53 -*03o0h -o2m^d -^M$D -lo4b -$8*A5 -o81*63 -o3oi3k -$1-7 +o0g p2 +$A $Y +o81 scw +Z4 o6a +u *56 +^2 o42 +ssb k +^r +A +o3/ O45 +i58 O23 +'5 z4 +O32 o2x +oAO c +O43 *43 +p1 sl7 +i97 $5 +^d O13 +c ^8 +*78 O53 +*03 o0h +o2m ^d +^M $D +l o4b +$8 *A5 +o81 *63 +o3o i3k +$1 -7 sa^ -*32$k -O41[ -'B*52 -di4* -i2isJp -OA3l --1o7m -fO3A -O59$H -O53sln +*32 $k +'B *52 +d i4* +i2i sJp +-1 o7m +f O3A +O59 $H +O53 sln o9u -^pZ2 -z1Z4 -o58'7 +^p Z2 +z1 Z4 +o58 '7 svy -'7$t -O0AR0 +'7 $t +O0A R0 o4< -o6t-5 -$,O93 -o47d -z2@a -}s7. -o6oC -o1wz1 -O34z4 +o6t -5 +$, O93 +o47 d +z2 @a +} s7. +o6o C +o1w z1 +O34 z4 i6\ -Z1i2c -*30f -Co3d -*24o31 +Z1 i2c +*30 f +C o3d +*24 o31 o23 i2O -^%z2 -*31*74 -^io4_ -i7p*70 -i4%+6 -+0o4o --8R7 -$eo0d -c*21 -O72-5 -*47T4 -*30O32 -*B9O65 -^#^+ -li7k -Z1*31 -[i4l -O24$r -sn.{ -$k$4 -o7.-2 +^% z2 +*31 *74 +^i o4_ +i7p *70 +i4% +6 ++0 o4o +-8 R7 +$e o0d +c *21 +O72 -5 +*47 T4 +*30 O32 +*B9 O65 +^# ^+ +l i7k +Z1 *31 +[ i4l +O24 $r +sn. { +$k $4 +o7. -2 slT -$2-9 -*30o82 -OB3[ -D1$1 -*28O05 +$2 -9 +*30 o82 +OB3 [ +D1 $1 +*28 O05 s.b -Z1$b -iBaO74 -O51^2 -i7X'B -$+Z2 -co50 +Z1 $b +iBa O74 +O51 ^2 +i7X 'B +$+ Z2 +c o50 sbJ -*BAO02 -o1oO25 -ks2c -D1'7 -o4c*67 -D3R2 -O64-6 -i9i'A -O81o5+ -ssFT3 -o0s+6 -^?$, -o8vD7 -*64*57 -[sLe +*BA O02 +o1o O25 +k s2c +D1 '7 +o4c *67 +D3 R2 +O64 -6 +i9i 'A +O81 o5+ +ssF T3 +o0s +6 +^? $, +o8v D7 +*64 *57 +[ sLe sm` -O64O32 -R6[ -o65O81 -$LO12 -i5 +6 -o24$# -lo0C +O64 O32 +R6 [ +o65 O81 +$L O12 +i5 +6 +o24 $# +l o0C i2: -Z4$_ -[i5: -T0L3 -ti8u -o2k*01 -t$V -tsUR -Z1R1 -^zi8" -o5wsct -^dO31 -$5O21 -i4@@7 -o3e'B -^1z4 -i1-d -o3t+6 -L5-5 -@3o8, -^cD3 -O17q -to2T -*97*21 -$ld -$B$e -*54o3l -*72o7r -^7^3 +Z4 $_ +[ i5: +T0 L3 +t i8u +o2k *01 +t $V +t sUR +Z1 R1 +^z i8" +o5w sct +^d O31 +$5 O21 +i4@ @7 +o3e 'B +^1 z4 +i1- d +o3t +6 +L5 -5 +@3 o8, +^c D3 +O17 q +t o2T +*97 *21 +$l d +$B $e +*54 o3l +*72 o7r +^7 ^3 sn8 -+5D1 -[-A -s9d*13 -Z1i4] ++5 D1 +[ -A +s9d *13 +Z1 i4] stL -i7wl --1L8 -^<-1 -o6BO32 -c+A -^[i1v -^"^\ -O32L4 -o0*z5 -kssy -ss=u -o19[ -i47D7 -s23d -o4K[ -i4li8h -$1OA5 -i5el -i7cc -DBO64 --7i4; +i7w l +-1 L8 +o6B O32 +c +A +^[ i1v +^" ^\ +O32 L4 +o0* z5 +k ssy +ss= u +o19 [ +i47 D7 +s23 d +o4K [ +i4l i8h +$1 OA5 +i5e l +i7c c +DB O64 +-7 i4; s; -^7-2 -l*5B -o0ai93 -f$f -$l^b -O27$i -D2i7i +^7 -2 +l *5B +o0a i93 +f $f +$l ^b +O27 $i +D2 i7i s., -O04i6_ -o0i+1 --6T2 -i5i+7 +O04 i6_ +o0i +1 +-6 T2 +i5i +7 o6q --6*70 -o5-'8 -Z1i2v -i3zi5& -o0_'2 -o7QZ1 -T4sIs -^@O71 -rk -'B*35 -skgo4 -loAf -o67l -'8$N -s13Z1 -O62$n -'A$ +-6 *70 +o5- '8 +Z1 i2v +i3z i5& +o0_ '2 +o7Q Z1 +T4 sIs +^@ O71 +r k +'B *35 +skg o4 +l oAf +o67 l +'8 $N +s13 Z1 +O62 $n +'A $ o3R -$!$3 -O81$9 -t} -T6'9 +$! $3 +O81 $9 +t } +T6 '9 s1k -O48p1 -cO24 +O48 p1 +c O24 oAr -*39o58 -i5s*10 -o8jD7 -*86O14 -$&o67 --Ao93 -T4o0H --8oB3 -o80+7 -o5Wt -O12sx. -li6: -O42$ -z1i8t -'9$M -$lZ2 +*39 o58 +i5s *10 +o8j D7 +*86 O14 +$& o67 +-A o93 +T4 o0H +-8 oB3 +o80 +7 +o5W t +O12 sx. +l i6: +O42 $ +z1 i8t +'9 $M +$l Z2 i8x -Cs04 -*30[ -^e'8 -soa[ -o1-o0B -{O03 -$6L1 -uo5L -$;$; --2o7* -*17+7 -o79Z1 -o0Zz2 -*36^- -*57$% -^ip1 -o1sd -+2oAs -$tsbL -$$O61 -D5*12 -*15+3 -$&c -sm7z4 -^t*65 +C s04 +^e '8 +soa [ +o1- o0B +{ O03 +$6 L1 +u o5L +$; $; +-2 o7* +*17 +7 +o79 Z1 +o0Z z2 +*36 ^- +*57 $% +^i p1 +o1s d ++2 oAs +$t sbL +$$ O61 +D5 *12 +*15 +3 +$& c +sm7 z4 +^t *65 *41 --0^= -[i5- -*41D1 -O51o3L -csb1 -@r$g -*A6O42 -*A6i2m -p3'9 -o5 D3 -L1$d -i0_s87 -o0/z1 -i69{ -i34+8 +-0 ^= +[ i5- +*41 D1 +O51 o3L +c sb1 +@r $g +*A6 O42 +*A6 i2m +p3 '9 +o5 D3 +L1 $d +i0_ s87 +o0/ z1 +i69 { se2 -$&i0@ -Z2sg. -o8#D9 -Z5i5f -*85*63 -R9^G -o6c[ -^@T6 -i5#l -$Tz1 -o1Iu -C+6 -$`o0h -^mi3- -i2vO01 -+0*31 +$& i0@ +Z2 sg. +o8# D9 +Z5 i5f +*85 *63 +R9 ^G +o6c [ +^@ T6 +i5# l +$T z1 +o1I u +C +6 +$` o0h +^m i3- +i2v O01 ++0 *31 o4F -i18r -c*75 -R6i74 -sBtf +i18 r +R6 i74 +sBt f o5+ -i2D-4 -O02'4 -$2o9 -^t^u -T5O13 -p2O79 -sztd -^kO46 -'9-4 -+5-4 -^6'8 -T9i9_ -$a$3 -*65@5 -sjfO37 -$@*68 -$e[ -^8^i -o0z} -^-O92 -$%O81 -Z1o7e -O42^I -*16$R +i2D -4 +O02 '4 +$2 o9 +^t ^u +T5 O13 +p2 O79 +szt d +^k O46 +'9 -4 ++5 -4 +^6 '8 +T9 i9_ +$a $3 +*65 @5 +sjf O37 +$@ *68 +$e [ +^8 ^i +o0z } +^- O92 +$% O81 +Z1 o7e +O42 ^I +*16 $R s5w -p3$9 -ui4C -$vL6 -^kz4 -O2Al -}$O -O98Z1 -cO52 -ti9, -$7k -i6Xt -Z2*45 +p3 $9 +u i4C +$v L6 +^k z4 +O2A l +} $O +O98 Z1 +c O52 +t i9, +$7 k +i6X t +Z2 *45 slM sdF sjV -o2z$ -^"$" +o2z $ +^" $" s60 -}@D -$5T6 --AO01 -z5'8 -$6*9B -^a'B -^Y*32 +} @D +$5 T6 +-A O01 +z5 '8 +$6 *9B +^a 'B +^Y *32 ^D -D6s2; -^H^C -$I$! +D6 s2; +^H ^C +$I $! *08 -O86O52 -i12i0f -p1snd -L1O35 --8Z2 -@n} -^P*42 -i4@o3n +O86 O52 +i12 i0f +p1 snd +L1 O35 +-8 Z2 +@n } +^P *42 +i4@ o3n s2z -to5 -$-@j -*12*68 -+6$& -z5O18 -O71c -*18l -uO31 -T4T5 -*56se2 -'9$2 -i4+*47 -O12q -$oT0 +t o5 +$- @j +*12 *68 ++6 $& +z5 O18 +O71 c +*18 l +u O31 +T4 T5 +*56 se2 +'9 $2 +i4+ *47 +O12 q +$o T0 sv? -[i1y -*79-8 -d$p -sv3c -+0'B -D6o3@ -*0A-0 -'8$@ -i5MT4 -ci69 -o39*71 -sn2Z3 -*73O21 -$4DA +[ i1y +*79 -8 +d $p +sv3 c +D6 o3@ +*0A -0 +'8 $@ +i5M T4 +c i69 +o39 *71 +sn2 Z3 +*73 O21 +$4 DA i5| -skm-5 -o1nl -O35-1 -to0Y -q$e -o2u$# -i3t^r -^ho5. +skm -5 +o1n l +O35 -1 +t o0Y +q $e +o2u $# +i3t ^r +^h o5. o7E -o2o^@ -o0t*91 -'8R2 --0z1 -p3O06 -o58p1 -cs0I -{$0 -O12L1 -r+8 -o9!O61 -sp z2 -i80sdz -*12^k -o9d$6 -ds0f -L6O06 --7-3 -*8At -$r^p -$#O42 -$UT4 --1R0 +o2o ^@ +o0t *91 +'8 R2 +-0 z1 +p3 O06 +o58 p1 +c s0I +{ $0 +O12 L1 +r +8 +o9! O61 +sp z2 +i80 sdz +*12 ^k +o9d $6 +d s0f +L6 O06 +-7 -3 +*8A t +$r ^p +$# O42 +$U T4 +-1 R0 o6N sz7 -^M -O42[ i3I --8$% -o3@D4 -*54+0 -kss[ -o4K@h -p1sMw +-8 $% +o3@ D4 +*54 +0 +k ss[ +o4K @h +p1 sMw i8= -{^C +{ ^C i6M -O06$1 -*49O53 -*63slp +O06 $1 +*49 O53 +*63 slp o5= -O24$7 -o6w+7 -p3i4, -^mO15 -o70$k -^!O71 +O24 $7 +o6w +7 +p3 i4, +^m O15 +o70 $k +^! O71 i3q -^t-2 -o0=r -O15o0j -o10p1 -D2o0D -$q*02 -i4Yu -T2*03 +^t -2 +o0= r +O15 o0j +o10 p1 +D2 o0D +$q *02 +i4Y u +T2 *03 i3* -[o3c -i3Si4& -*34sm_ -uo7I -^b*24 -$7o0Z -i9Tl -i70t -o6Fo8s -saQc +[ o3c +i3S i4& +*34 sm_ +u o7I +$7 o0Z +i9T l +i70 t +o6F o8s +saQ c o2{ -$7O54 +$7 O54 st8 -$1*41 -p1z1 -*27*76 -O78l -*53OB2 -o3WO5A -$8*68 +$1 *41 +p1 z1 +*27 *76 +*53 OB2 +o3W O5A +$8 *68 O1B -D4^p -D1o2c -c-3 -z4o6= -sqdo1l -Z2i88 +D4 ^p +D1 o2c +c -3 +z4 o6= +sqd o1l +Z2 i88 s3^ -[szp +[ szp slv sgq -*14c -'5o2k -lo3_ -O53*96 -p1i4` -o2_*06 +*14 c +'5 o2k +l o3_ +O53 *96 +p1 i4` +o2_ *06 o2` -O91oBz -i31O91 -$_O75 -si2Z1 -[o2d -s2ao1f -o0ML1 -{o0q -$6T3 -*56'7 -{i1d -fO36 -$3i6@ -sg o3l -i4 D6 +O91 oBz +i31 O91 +$_ O75 +si2 Z1 +[ o2d +s2a o1f +o0M L1 +{ o0q +$6 T3 +*56 '7 +{ i1d +f O36 +$3 i6@ +sg o3l +i4 D6 smg -o62*56 -O61*64 -i3p^a -p3O28 -O07$1 -o3pc -o8cC -qO29 -^dD4 -+8D4 -o82O21 -O03p3 -^e$7 -lss& --2o3j +o62 *56 +O61 *64 +i3p ^a +p3 O28 +O07 $1 +o3p c +o8c C +q O29 +^d D4 ++8 D4 +o82 O21 +O03 p3 +^e $7 +l ss& +-2 o3j o7A -*63T2 -^8$9 -z1^x -o4@$! -@,^v -$msh= -*43O53 -O04z2 -o1p^c --0*31 -$4O23 -o4lo1k -li51 -sfy$o -rp2 -*61^R -RBZ1 -*36o3g -z1$3 -o2pO35 -*56s40 -Z2+4 -O72Z5 -R5Z2 -i5xl -T4+4 +^8 $9 +z1 ^x +o4@ $! +@, ^v +$m sh= +*43 O53 +O04 z2 +o1p ^c +-0 *31 +$4 O23 +o4l o1k +l i51 +sfy $o +r p2 +*61 ^R +RB Z1 +*36 o3g +z1 $3 +o2p O35 +*56 s40 +Z2 +4 +O72 Z5 +R5 Z2 +i5x l +T4 +4 o9E --0^& -*16i5a -suo+5 -o52l -O53Z2 -iBTk -+6$p -o7eO43 -O26^t -O37l -OB1Z2 --5O02 -'Ac -o1si0g -o5}s}$ -s4+Z3 -sAjd -O73O84 -dsCf -$(c -+1@a -O82$: -*35o7A -o5l+3 -o0ro2k -Z2RA -s8,o33 -O56l -i2/i5/ -*05o00 -$x*71 -o62T5 -i56i55 -o7?*75 -fO85 -O53t -$@o58 -i7iO34 -'B+1 -o3i*B3 -*32+5 -o1k$! -*64O61 -'B$6 -rz3 -seAd -^n^t +-0 ^& +*16 i5a +suo +5 +o52 l +O53 Z2 +iBT k ++6 $p +o7e O43 +O26 ^t +O37 l +OB1 Z2 +-5 O02 +'A c +o1s i0g +o5} s}$ +s4+ Z3 +sAj d +O73 O84 +d sCf +$( c ++1 @a +O82 $: +*35 o7A +o5l +3 +o0r o2k +Z2 RA +s8, o33 +O56 l +i2/ i5/ +*05 o00 +$x *71 +o62 T5 +i56 i55 +o7? *75 +f O85 +O53 t +$@ o58 +i7i O34 +'B +1 +o3i *B3 +*32 +5 +o1k $! +*64 O61 +'B $6 +r z3 +seA d +^n ^t s7+ -o09*13 --5T0 -i40c -$@Z2 -fO37 -$Du -sngi3t -R7O41 -*98o7 -i4@r -ti3p -o6lz4 +o09 *13 +-5 T0 +i40 c +$@ Z2 +f O37 +$D u +sng i3t +R7 O41 +*98 o7 +i4@ r +t i3p +o6l z4 i2` -O83sa1 -$^@m -i3/+4 -{^R -^%D2 -o05$ -i3to7n +O83 sa1 +$^ @m +i3/ +4 +{ ^R +^% D2 +o05 $ +i3t o7n si& -^po1k -*07*18 -o0r^b -*56$3 -z2@A -O16^D -s2_^g -^K^T -Z2o3 -o5d'9 -'2o0< -i47o1g -*40O24 +^p o1k +*07 *18 +o0r ^b +*56 $3 +z2 @A +O16 ^D +s2_ ^g +^K ^T +Z2 o3 +o5d '9 +'2 o0< +i47 o1g +*40 O24 sI? -O45R0 -*65-5 -Z3} -O28O0B -o4m+0 -@r'5 -Z4$e +O45 R0 +*65 -5 +Z3 } +O28 O0B +o4m +0 +@r '5 +Z4 $e sps -Z2s1t -uo83 -qD1 -i4hsfK --9L9 +Z2 s1t +u o83 +q D1 +i4h sfK +-9 L9 s70 -o2yk -T4-6 -ks3H -t^d -'3R2 -D3o1h -o2gD3 -i8ol -o6iO12 -s83o1f -{o7= -'4s0 -Z1$9 -s6$[ +o2y k +T4 -6 +k s3H +t ^d +'3 R2 +D3 o1h +o2g D3 +i8o l +o6i O12 +s83 o1f +{ o7= +'4 s0 +Z1 $9 +s6$ [ i3@ -$KsbC -c*14 --7oAD -${L5 -*52^p -o5tZ1 -Z2i78 -O07R4 -$mOA4 -+2o1b -^8i4d -r^s -$Bo3z -O52d -o5uO61 -T7R7 -@2oB9 -O24R0 -$m+4 -@np1 -O19r -i8a*18 -^o*58 -o3k^z -R5st3 -T0se4 -fDB +$K sbC +-7 oAD +${ L5 +*52 ^p +o5t Z1 +Z2 i78 +O07 R4 +$m OA4 ++2 o1b +^8 i4d +r ^s +$B o3z +O52 d +o5u O61 +T7 R7 +@2 oB9 +$m +4 +@n p1 +O19 r +i8a *18 +^o *58 +o3k ^z +R5 st3 +T0 se4 +f DB she -^bO35 -*75o87 -T8T4 -svYT2 -$>@n -i3%r -^kO32 -O61+5 -ls/, -@a*03 -TAZ1 -'Bo6? -o11$/ -shVo6m -ss0Z2 -Z4'8 -R9[ -T6$9 +^b O35 +*75 o87 +T8 T4 +svY T2 +$> @n +i3% r +^k O32 +l s/, +@a *03 +TA Z1 +'B o6? +o11 $/ +shV o6m +ss0 Z2 +Z4 '8 +R9 [ +T6 $9 saU -d+A -i9jOA3 -O01@k -Z4OA5 -O85o1g -O05sL +d +A +i9j OA3 +O01 @k +Z4 OA5 +O85 o1g +O05 sL sct -o9s+3 -o4ed -O02i2l -$3$2 -^oL0 -Cs8M --0i2n -o41O02 -O82-1 -*03o3w -o5*^o -+4D3 -^zO23 -O36+3 -CZ2 +o9s +3 +o4e d +O02 i2l +$3 $2 +^o L0 +C s8M +-0 i2n +o41 O02 +O82 -1 +*03 o3w +o5* ^o ++4 D3 +^z O23 +O36 +3 +C Z2 i79 -*68o0k -smsD5 -$GD5 -{*37 --7^3 -o6yl -us1c +*68 o0k +sms D5 +$G D5 +{ *37 +-7 ^3 +o6y l +u s1c i43 -^sO52 -z3O01 -^#O75 -O52$G --3*45 -${L8 -^:c -T8$1 -*03$ -*40*73 -L7D9 -$B$G -['6 +^s O52 +^# O75 +O52 $G +-3 *45 +${ L8 +^: c +T8 $1 +*03 $ +*40 *73 +$B $G +[ '6 slS -o1m*65 -OA1i2k -i9#+0 -O21o0y -o5kz4 +o1m *65 +OA1 i2k +i9# +0 +O21 o0y +o5k z4 sdb -^v*31 -i3s-1 -z4-3 -$)O0A -O51T3 -Z1i1l -$&^$ -suz$s -ki2n -O41p2 -R4i45 -'9O61 -lo1i -o6S@c -+0$$ -lshj -o4cc --B-9 -o1-'8 -ci7. -$d@p -c$R -$AT2 -^Sz3 +^v *31 +i3s -1 +z4 -3 +$) O0A +O51 T3 +Z1 i1l +$& ^$ +suz $s +O41 p2 +R4 i45 +'9 O61 +o6S @c ++0 $$ +l shj +o4c c +-B -9 +o1- '8 +c i7. +$d @p +c $R +$A T2 +^S z3 O25 -O52^O -R1'4 -^6-1 -r$! -O03$5 -i3;'8 -'B$m +O52 ^O +R1 '4 +^6 -1 +r $! +O03 $5 +i3; '8 +'B $m i17 -cz2 -O24Z5 -o1-*74 --0i7s -*78'9 -*91o1a +c z2 +O24 Z5 +o1- *74 +-0 i7s +*78 '9 +*91 o1a si! -i8@+A -R3*72 -slnO43 -o0LL1 -o2vd -{O12 -$nOB4 +i8@ +A +R3 *72 +sln O43 +o2v d +{ O12 +$n OB4 sk@ -i41*04 -*9Ao9J --5+4 -$it -o6@'8 -^KT2 -Z3o0 -O04$v -*40$s -D5D7 -^Ti0P -o6b$m -ls6- -^eO31 -'4o0> -^DiA! +i41 *04 +*9A o9J +-5 +4 +$i t +o6@ '8 +^K T2 +Z3 o0 +O04 $v +*40 $s +D5 D7 +^T i0P +o6b $m +l s6- +^e O31 +'4 o0> +^D iA! sb1 -dsP -+7-1 -R0o1r -o1do3? -Z3i7x -*0Bl -ssop1 -lo2a -oBlD8 -$@o5# -O31o0Y -Z5*27 -^b-2 -O31o8r -*64O53 -@Rz1 -+6i7u +d sP ++7 -1 +R0 o1r +o1d o3? +Z3 i7x +*0B l +sso p1 +l o2a +oBl D8 +$@ o5# +O31 o0Y +Z5 *27 +^b -2 +O31 o8r +*64 O53 +@R z1 ++6 i7u ^x -T4st5 -p1O49 +T4 st5 +p1 O49 iB0 -$,$5 -i5-D2 -p1oB2 -$D^S -O03^L -*06*67 -D0s30 -c$f -i20{ -o6*Z1 -O91[ -O34Z1 -$6*05 -D6*23 -Z5i4i -d*64 -[s07 -$k[ -D1sds -i9x-A -i0k^g -Z3k +$, $5 +i5- D2 +p1 oB2 +$D ^S +O03 ^L +*06 *67 +D0 s30 +i20 { +o6* Z1 +O91 [ +O34 Z1 +$6 *05 +D6 *23 +Z5 i4i +d *64 +[ s07 +D1 sds +i9x -A +i0k ^g +Z3 k *B7 -i38*49 -$!*74 -D4Z1 -oB2D9 -i4:c -D2$` -o2fi45 -lL0 -^Wz2 -o6_sfx --5o8* --0T7 -R4Z4 -*32D6 -*94'8 -^CscK --1@2 -$nZ2 -*13o2- -^u*31 +$! *74 +D4 Z1 +oB2 D9 +i4: c +D2 $` +o2f i45 +l L0 +^W z2 +o6_ sfx +-5 o8* +T7 -0 +R4 Z4 +*94 '8 +^C scK +-1 @2 +$n Z2 +*13 o2- +^u *31 shs -$XL8 -$$i21 -O53R1 -do2U -o4at -+Ai81 -^P*92 +$X L8 +$$ i21 +O53 R1 +d o2U +o4a t ++A i81 +^P *92 swx ss* -+0@z -^Z$" -$kR7 -*8AoB3 -O62o3t -$!*25 -lo1b ++0 @z +^Z $" +$k R7 +*8A oB3 +O62 o3t +$! *25 +l o1b i8$ -*12R3 -i3Dc -T7-0 -i3bk -o0r^E -r$r -'6^a -O72*13 -o7s*A5 -$p$0 -$sO64 -o63d -$_$0 -i4o+8 -O52$9 -*01*83 -o1wq -o14-9 -@h[ -*48O43 -$,*74 -p1R9 -Z4o2h -D2s3- -^7*27 -*02o3a +*12 R3 +i3D c +i3b k +o0r ^E +r $r +'6 ^a +O72 *13 +o7s *A5 +$p $0 +$s O64 +o63 d +$_ $0 +i4o +8 +O52 $9 +k *38 +o1w q +o14 -9 +@h [ +*48 O43 +$, *74 +p1 R9 +Z4 o2h +D2 s3- +^7 *27 +*02 o3a s0. -O56$/ +O56 $/ ^R -Z5*20 -i8v*68 -o34^M -i2T[ -^Nz1 -o0ko1. -s* *A0 -s38c -ci8r +Z5 *20 +i8v *68 +o34 ^M +i2T [ +^N z1 +o0k o1. +s* *A0 +s38 c +c i8r sHl -$mo2r -O12sna -$MZ1 -R0i1e -*63o4h -R7o0K -to3" -sthD0 -^y} -C@6 -$AD6 -O24+2 -*80O47 -O63scH -O83o6h -^(D1 -l*39 +$m o2r +O12 sna +$M Z1 +R0 i1e +*63 o4h +R7 o0K +t o3" +sth D0 +^y } +C @6 +$A D6 +O24 +2 +O63 scH +O83 o6h +^( D1 +l *39 seu s56 -*06R7 -cspv -$6Z3 -o7si6t -+9O71 +*06 R7 +c spv +$6 Z3 +o7s i6t ++9 O71 o3, -^p*B5 -tO93 -o2Mo85 -f{ -$#*97 -L1[ --Bsae -o0WD2 -s5 Z5 -@1c -D5O04 -D3i4k +^p *B5 +t O93 +o2M o85 +f { +$# *97 +L1 [ +-B sae +o0W D2 +s5 Z5 +@1 c +D5 O04 +D3 i4k sku -D1Z1 -*06R0 -co77 -O07-1 +D1 Z1 +*06 R0 +c o77 +O07 -1 sy! -t$* -skC*98 -^$*02 +t $* +skC *98 +^$ *02 ss3 -$"i7" -D9O32 -f*24 -L2^b -i4di2N -+BDB -i1r$ -L9[ -Z2o8s -$x-6 -sac*18 -D5i2! -ss]sy -Z4o1i -^g$t -$eo5% +$" i7" +D9 O32 +f *24 +L2 ^b +i4d i2N ++B DB +i1r $ +L9 [ +Z2 o8s +$x -6 +sac *18 +D5 i2! +ss] sy +Z4 o1i +^g $t +$e o5% o2C oBm -s9az2 -o2 T0 -*7A'A -T3O43 -i16o21 -O21o2? -O2A$_ -csaw -i1Hc -$1i7? -^4} -O12c -sckz1 -k^s -O12^E -$]i6: -sa=$5 -f*31 -T0i85 +s9a z2 +o2 T0 +*7A 'A +T3 O43 +i16 o21 +O21 o2? +O2A $_ +c saw +i1H c +$1 i7? +^4 } +O12 c +sck z1 +k ^s +O12 ^E +$] i6: +sa= $5 +f *31 +T0 i85 i3\ -Z1*68 -*40i8j -z3i5} -i5:+5 -Z3o5i -$bZ3 -*31'A +*40 i8j +z3 i5} +i5; +Z3 o5i +$b Z3 +*31 'A sw7 -$0-B -+3$4 -O06{ --3o4. -*06'6 -dsbh -i1y*25 -*89D5 -i3ii0Y +$0 -B ++3 $4 +O06 { +-3 o4. +*06 '6 +d sbh +i1y *25 +i3i i0Y iAh -*91oA7 -$jr -^M-1 -^x^= -z5*8A -$sZ2 -o0bl -to8J -@2$ -*76$o -z1'A -o48*78 -u^M --3T6 -C$5 -z3r -$0O12 -i0m*02 -D5u -^= -OA1o1a -O32Z5 -o0vO41 -T1r --2R6 -O02$g -R8Z4 -o7s+2 -$3+2 -k^J -o3l^, -D2-5 -+9o8i -uOA3 -O42o3D +*91 oA7 +$j r +^M -1 +^x ^= +z5 *8A +$s Z2 +o0b l +t o8J +@2 $ +*76 $o +z1 'A +o48 *78 +u ^M +-3 T6 +C $5 +$0 O12 +i0m *02 +D5 u +OA1 o1a +O32 Z5 +o0v O41 +T1 r +-2 R6 +O02 $g +R8 Z4 +o7s +2 +$3 +2 +k ^J +o3l ^, +D2 -5 ++9 o8i +u OA3 +O42 o3D st) -o2l-8 -sCL-6 +o2l -8 +sCL -6 s@c -o84+6 -o2gi4k -iAmO02 -$yi20 -$d*19 +o84 +6 +o2g i4k +iAm O02 +$y i20 +$d *19 s9, -^ci3t -L5$n -o2 sh\ +^c i3t +L5 $n +o2 sh\ spM -*34o3h +*34 o3h oA/ -i1`*91 -cso* +i1` *91 +c so* s8^ -*96sdr +*96 sdr i3S -Z2C -$dD6 -i5cd -O62$w -i7.o99 -dO16 -*50O16 -*73o0d -$s-8 -@6i9! -@5-B -sDw$e -R3t -@0+9 -T0s.% -$OZ1 -i76+9 +$d D6 +i5c d +O62 $w +i7. o99 +*50 O16 +*73 o0d +$s -8 +@6 i9! +@5 -B +sDw $e +R3 t +@0 +9 +T0 s.% +$O Z1 +i76 +9 o6X -$9z1 -o6#O51 -*8Ao0W -$ *35 -D7O12 --3sTB -O01o4x --6^k -O04O49 -s0+c -D7$1 -$D$E -*83O81 +$9 z1 +o6# O51 +*8A o0W +$ *35 +D7 O12 +-3 sTB +O01 o4x +-6 ^k +O04 O49 +s0+ c +D7 $1 +$D $E +*83 O81 O35 -O41*78 -[o7i -Z1*57 -D0i4o --3-B -lD9 -o0d$z -'7q -^Gz1 -*12$ --0O13 -o5io6n -*A6l -$p*73 -^Ho6O --1$q +O41 *78 +[ o7i +Z1 *57 +D0 i4o +-3 -B +o0d $z +'7 q +^G z1 +*12 $ +-0 O13 +o5i o6n +*A6 l +$p *73 +^H o6O +-1 $q sWC -Z4-2 +Z4 -2 sxk -^2^0 -o7tO32 -i4_O53 -+4O54 -$t*86 -^x*20 -*58D7 -p1svg -i8zO52 -i5p^; -qOB3 -O24o21 -*01^0 -$?Z4 -$P$# -O07$n -*97O07 -$4sr1 -^zi8z -$=O02 -*67i6; +^2 ^0 +o7t O32 +i4_ O53 ++4 O54 +$t *86 +^x *20 +*58 D7 +p1 svg +i8z O52 +i5p ^; +q OB3 +O24 o21 +*01 ^0 +$? Z4 +$P $# +O07 $n +*97 O07 +$4 sr1 +^z i8z +$= O02 +*67 i6; stE -o5vT0 -i6-Z1 -o60*98 +o5v T0 +i6- Z1 +o60 *98 si: sBO -^`^k -i55u -o91*74 +^` ^k +i55 u +o91 *74 $W -ci3H -o5aZ1 -@2+9 +c i3H +o5a Z1 +@2 +9 i4v -o0ei1s -$vZ3 -i57D8 -oB_O26 --3+6 -^1Z4 -D0o4e -Z1i3| -$aDA -u^$ -p1suk -o8Sc -c*86 -+7i8, --2o0d -*87Z1 -}+9 -^ r --1o08 -^u*71 -s3gO32 -$?-7 -i3nc -t+6 -*98o1d --9-8 +o0e i1s +$v Z3 +i57 D8 +oB_ O26 +-3 +6 +^1 Z4 +D0 o4e +Z1 i3| +$a DA +u ^$ +p1 suk +o8S c +c *86 ++7 i8, +-2 o0d +} +9 +-1 o08 +^u *71 +s3g O32 +$? -7 +i3n c +t +6 +*98 o1d +-9 -8 s1a -dskz -OA3$f -o2e*89 -'6$p -$9*04 -*43*47 -o8<*78 -O82R7 -'8i2d -sor{ -OB7Z2 -o0sl +d skz +OA3 $f +o2e *89 +'6 $p +$9 *04 +o8< *78 +O82 R7 +'8 i2d +sor { +OB7 Z2 +o0s l ^P -*A1i2+ -*57o7a -O51$; -*65$n -O14i4+ --6-9 -OA1oA6 -i7Lc -[*72 -'BO51 +*A1 i2+ +*57 o7a +O51 $; +*65 $n +O14 i4+ +-6 -9 +OA1 oA6 +i7L c +[ *72 +'B O51 s0b -*89Z1 -}'9 -z1o2_ +*89 Z1 +} '9 +z1 o2_ i7/ -^a^h -'7} -koA7 -s6o$7 -$!$) -R8$1 -*97-8 -ui54 -i2no1+ -*01soi +^a ^h +'7 } +k oA7 +s6o $7 +$! $) +R8 $1 +u i54 +i2n o1+ +*01 soi sSF -*32i1u +*32 i1u ^Y -o1Jt -O39$ -o4v'6 -p4z2 -saqZ2 -o6i[ -C^X +o1J t +O39 $ +o4v '6 +p4 z2 +saq Z2 +o6i [ +C ^X o5? -i4u+2 -+1'2 -$1DA -*83+3 -'9i8, -o0M'9 -o4x-9 -O26z5 -DA*BA -^Ez2 -o1;O32 -$ri7t -o0p*59 -*32o3h -sIiT7 -'2o0, -i95oA@ -*6BO84 -$(R8 -i5pO12 -*3AO24 +i4u +2 ++1 '2 +$1 DA +*83 +3 +'9 i8, +o0M '9 +o4x -9 +O26 z5 +DA *BA +^E z2 +o1; O32 +$r i7t +o0p *59 +*32 o3h +sIi T7 +'2 o0, +i95 oA@ +*6B O84 +$( R8 +i5p O12 +*3A O24 o8v -}^P -DA$+ -$n@0 -'5+4 -o9xsmt -O83$# -+6*60 -+1$t -D7o8z -O63i4s -DBo9y -D6o5_ +} ^P +DA $+ +$n @0 +'5 +4 +o9x smt +O83 $# ++6 *60 ++1 $t +D7 o8z +O63 i4s +DB o9y +D6 o5_ i6V -f^9 -o5Zc -i0:O32 -i0h*67 -oByO38 -'8i4_ -[st -o5q*40 -$TO03 -i3KT0 -s4oZ2 -c*68 -*52+1 -$+O94 -^FT7 -[$v -'7$e -^gD4 -i6 +8 -^w^M -o7.[ -sW7z5 -O93c -'6^G -o4pk -*69o67 -C$X -'5^b -*31@3 -i71O25 -o44+1 -o0p+3 -p4O03 +f ^9 +o5Z c +i0: O32 +i0h *67 +oBy O38 +'8 i4_ +[ st +o5q *40 +$T O03 +i3K T0 +s4o Z2 +*52 +1 +$+ O94 +^F T7 +[ $v +'7 $e +^g D4 +i6 +8 +^w ^M +sW7 z5 +O93 c +'6 ^G +o4p k +*69 o67 +C $X +'5 ^b +*31 @3 +i71 O25 +o44 +1 +o0p +3 +p4 O03 s34 -^gO52 -p2DB -o0EC -$-*17 -Co6& -i04 +^g O52 +p2 DB +o0E C +$- *17 +C o6& sAo -^.^: -Z2s1z -^$$1 -i3z*56 -T6D1 -$3D2 +^. ^: +Z2 s1z +^$ $1 +i3z *56 +T6 D1 +$3 D2 oAD -u@A -o1.'9 +u @A +o1. '9 sBr -o6eu -D0i1h -$4q -i1#$h -i65-8 +o6e u +D0 i1h +$4 q +i1# $h +i65 -8 iAy -T7*06 -^/z4 -*02Z2 -o72Z2 -o2TO74 -$uO34 -Z2$4 -*67*85 -t$X -*07R7 -lOB9 -Z1iA^ -'6i4g -o5_u -L8*08 +^/ z4 +*02 Z2 +o72 Z2 +o2T O74 +$u O34 +Z2 $4 +*67 *85 +t $X +*07 R7 +l OB9 +Z1 iA^ +'6 i4g +o5_ u +L8 *08 iBu -}L0 -^zO42 -+2z1 +} L0 +^z O42 i2p su_ -O91O06 -O04Z2 +O91 O06 +O04 Z2 i39 -^jO21 -rsJ! +^j O21 +r sJ! o9$ -D4o4/ -*53^& -O62Z2 -i8mD0 -kR9 -cst` -p1i5y -o8d} -^ d +D4 o4/ +*53 ^& +O62 Z2 +i8m D0 +c st` +p1 i5y +o8d } +^ d saz -p1*03 -k$e -i4id -Z4$r -o4Kl +k $e +i4i d +Z4 $r +o4K l *4A -O63R6 -O71*53 -k*07 -O92*98 -Z1o8j +O63 R6 +O71 *53 +k *07 +O92 *98 +Z1 o8j O38 -$G$A -$pO92 -'7$n -o52c -o3sc -$3$k -O52L4 -c^G -*B0'8 +$G $A +$p O92 +'7 $n +o52 c +o3s c +$3 $k +O52 L4 +c ^G +*B0 '8 s - -$cO73 -r$] -D7skt -T8o5l -t^q +$c O73 +r $] +D7 skt +T8 o5l +t ^q sIR -O51z1 -*01^v +O51 z1 +*01 ^v i1Z -Z2o8n -s6_T0 -D3sVF -}O37 -^ho23 -+7$g -'5o4d -*A9oAy -i2 ^k -L0Z1 -o28z1 +Z2 o8n +s6_ T0 +D3 sVF +} O37 +^h o23 ++7 $g +'5 o4d +*A9 oAy +i2 ^k +L0 Z1 +o28 z1 i2D -*34} -O53$H -@ML4 -$xOA7 -*43*48 -i52-2 -s8Wl -O87O21 -*09*91 -+8O08 -*18O75 -o28*12 --0z4 -o1md -O64i6< +*34 } +O53 $H +@M L4 +$x OA7 +*43 *48 +i52 -2 +s8W l +O87 O21 +*09 *91 ++8 O08 +*18 O75 +o28 *12 +-0 z4 +o1m d +O64 i6< sra -*83D5 -$6i8t +*83 D5 +$6 i8t s1_ -Z1i6/ -$1^z -R3s1j -R5s1n -i9Ec -cs2* -*03*41 -^s-3 +Z1 i6/ +$1 ^z +R3 s1j +R5 s1n +i9E c +c s2* +*03 *41 +^s -3 o5V -doBt --6-2 -o0D$ -*17O42 -$%+8 +d oBt +o0D $ +*17 O42 +$% +8 i5D -sj-{ -T8D2 -D0$t -sB } -i5/T6 -O01$p -T6$ -z2i1o -O51*68 -p1LB -O63Z3 -ci4b +sj- { +T8 D2 +$t [ +sB } +i5/ T6 +O01 $p +T6 $ +z2 i1o +O51 *68 +p1 LB +O63 Z3 +c i4b s2 -}OA3 -p2O73 -^m^W +} OA3 +p2 O73 +^m ^W str sze -p3O04 +p3 O04 sb6 -C*9A -Z3{ +C *9A +Z3 { i6( -i3Ll -+AD4 -o87+0 -i41$2 -$t+9 -@io4e -^mO32 -T0d -+4*23 -i0w*30 +i3L l +o87 +0 +i41 $2 +$t +9 +@i o4e +^m O32 +T0 d ++4 *23 +i0w *30 sl2 -Z4sj! -Z4i4, -D5i72 -*74O31 +Z4 sj! +Z4 i4, +D5 i72 +*74 O31 s5* -D3o0S -^3O14 -L7*13 -}$r -$1*28 -tR9 -i3wp1 -o45Z3 -o1xu -$8^b -'Ao7l -$x@c -$/O75 -$1^I -z3o0f -}@b -D8$b -o3j*62 -*70s+' -$[L5 -i54-8 -O05$/ +D3 o0S +^3 O14 +L7 *13 +} $r +$1 *28 +t R9 +i3w p1 +o45 Z3 +o1x u +$8 ^b +'A o7l +$x @c +$/ O75 +$1 ^I +z3 o0f +} @b +D8 $b +o3j *62 +*70 s+' +$[ L5 +i54 -8 +O05 $/ so; -O62i6a -LBiB3 -i0OD3 -*05Z1 -p1*91 -^c*30 -O75Z2 -[i1P -i5; -Z2o2y -O41O61 -OB7Z5 -L5d -o5yu -}-0 -Z4Z2 -o2l*42 -o97[ -o4s-0 -o4f*04 -o1.p1 -O21i81 -$t$ -O54T5 -c+4 -O62*01 -i3i$x +O62 i6a +LB iB3 +i0O D3 +*05 Z1 +p1 *91 +^c *30 +O75 Z2 +[ i1P +Z2 o2y +O41 O61 +OB7 Z5 +L5 d +o5y u +} -0 +o2l *42 +o97 [ +o4s -0 +o4f *04 +o1. p1 +O21 i81 +$t $ +O54 T5 +c +4 +i3i $x syV -sa.O41 -ci0- -^1z2 +sa. O41 +c ^- +^1 z2 o29 -'7^< -$s-1 -^Oz2 -do3h -$m+6 -[i2a +'7 ^< +$s -1 +^O z2 +d o3h +$m +6 +[ i2a se_ -ds1h -R8o7x -sfjz5 --1*90 -$t*57 -s4 +3 +d s1h +R8 o7x +sfj z5 +-1 *90 +$t *57 +s4 +3 i1K -z1o2% --1i82 -L6D5 -*41o82 -z5*60 -R3L4 -to7! -*76O41 --B*B0 -tO71 -$3$* -*58D4 -i2a-9 -i3hZ3 -doBm -o0A^Q -s +[ -i3w*54 -O52$n -Z1i5! -$to6k --3$4 -*A9s05 -Z3*54 -o71r -Z1*59 -*B4'7 -z4-7 +z1 o2% +-1 i82 +L6 D5 +*41 o82 +z5 *60 +R3 L4 +t o7! +-B *B0 +t O71 +$3 $* +*58 D4 +i2a -9 +i3h Z3 +d oBm +o0A ^Q +s + [ +i3w *54 +O52 $n +Z1 i5! +$t o6k +-3 $4 +*A9 s05 +Z3 *54 +o71 r +Z1 *59 +*B4 '7 +z4 -7 ssk -Co1i -$Ko5B -^l^r -D6i6= -i2eC -o8a+9 -R3+6 -$mO72 -i3jk -tD3 -O57$0 -o5ri2 -o1z^j -^8t -*04*73 +C o1i +$K o5B +^l ^r +D6 i6= +i2e C +o8a +9 +R3 +6 +$m O72 +i3j k +t D3 +O57 $0 +o5r i2 +o1z ^j +^8 t sul -$*@5 --1*43 -C^0 -o8-Z1 -o77k -T0s. -+4o3g -o8z} +$* @5 +-1 *43 +C ^0 +o8- Z1 +T0 s. ++4 o3g +o8z } i3? -^aO61 -ci1i -O52Z1 -*9A$3 -^H^R -CT9 --3o97 -Z5OB7 +^a O61 +c i1i +O52 Z1 +*9A $3 +^H ^R +C T9 +-3 o97 +Z5 OB7 sef -z3o8 -*94O06 -s19Z1 -*53$L -{$9 -p1*17 -i40D6 --2f -'5$2 -O45{ -p1o1a -i2t'9 -O93i9e -swfO94 -s09O81 -[o0F -D2^N -o03-1 -^k*78 -o6&$2 -o5k*42 +z3 o8 +*94 O06 +s19 Z1 +*53 $L +{ $9 +p1 *17 +i40 D6 +-2 f +'5 $2 +O45 { +p1 o1a +i2t '9 +O93 i9e +swf O94 +s09 O81 +[ o0F +D2 ^N +o03 -1 +^k *78 +o6& $2 +o5k *42 sGj -CssN -O13p2 -i4z*64 -oB5*AB -i5oO23 -O51i2T -i5r@4 -sd7d -*84$# -^1l -oB[O12 -i27i0H -p3D0 -$%^g -i80[ -o5W[ -sa@c -sauO43 -DBsbl +C ssN +O13 p2 +i4z *64 +oB5 *AB +i5o O23 +O51 i2T +i5r @4 +sd7 d +*84 $# +oB[ O12 +i27 i0H +$% ^g +o5W [ +sa@ c +sau O43 +DB sbl o5F -'AT9 -ti03 -^$o1p -D4+3 -*46{ -z3'8 -D4T1 -i59O02 --7*76 -^3^7 -+2i2d -'7$J -O81s21 -{^9 -ti3L -f$9 -O38^s -@o -i5g{ -d*68 -*5AO06 -T0*43 --2$4 +'A T9 +t i03 +^$ o1p +D4 +3 +*46 { +z3 '8 +D4 T1 +i59 O02 +-7 *76 +^3 ^7 ++2 i2d +'7 $J +O81 s21 +{ ^9 +t i3L +f $9 +O38 ^s +i5g { +d *68 +*5A O06 +T0 *43 +-2 $4 sHa -*76o6g -O62@U -i4g$# -*06T4 -'3$L -^o-3 -o7ft -$kC +*76 o6g +O62 @U +i4g $# +*06 T4 +'3 $L +^o -3 +o7f t +$k C sof -stBscl -D6*05 -ki7d -O54^[ -Z1o3n -*08'5 -i0PO83 --6sS -@8^3 -O42'6 -R2r -+B$f -D7o1h -*54i6t -qi01 -do0t -*60o3R -'9^k -O12l -o3dsmF -$.Z3 -r*57 -Z1i6f -O05z2 -O71s2x -o6ci6P +stB scl +D6 *05 +k i7d +O54 ^[ +Z1 o3n +*08 '5 +i0P O83 +-6 sS +@8 ^3 +O42 '6 +R2 r ++B $f +D7 o1h +*54 i6t +q i01 +d o0t +*60 o3R +'9 ^k +o3d smF +$. Z3 +r *57 +Z1 i6f +O05 z2 +O71 s2x +o6c i6P s06 -^a*20 -$XO62 -z1} -L3R3 -t$. -d$n -$@L6 -'9o2l -^L-1 -o6#Z1 -^B$. +^a *20 +$X O62 +z1 } +L3 R3 +t $. +d $n +$@ L6 +'9 o2l +^L -1 +o6# Z1 +^B $. o5; -+7^o -L7@v -$4*85 -T3i6m -}+5 -*04*17 -Z1*75 -O14sa? -O02O35 -+0@t -O05^_ -o85o7y -$r+6 -^Bu -'9O06 -sl4Z5 -k*54 -o2D} -iA7o95 -^i^s -^1o3w ++7 ^o +L7 @v +$4 *85 +T3 i6m +} +5 +*04 *17 +O14 sa? +O02 O35 ++0 @t +O05 ^_ +o85 o7y +$r +6 +^B u +'9 O06 +sl4 Z5 +k *54 +o2D } +iA7 o95 +^i ^s +^1 o3w s41 -O62-8 -'A$e -@d*96 -u'B -kr -*97c -l*B9 -lssi -s39DB -*81d --1*21 -Co2( -^g@a +O62 -8 +'A $e +@d *96 +u 'B +k r +*97 c +l *B9 +l ssi +s39 DB +*81 d +C o2( +^g @a o7L -*41O21 +*41 O21 s7^ -'8i02 +'8 i02 i3# -$h*37 +$h *37 s9w *7A -^M+1 -$aoB8 -*42^w -^a^V --7o5g -'7sat -i4i+5 +^M +1 +$a oB8 +*42 ^w +^a ^V +-7 o5g +'7 sat +i4i +5 o1E -Z2oB5 -s5=O42 -o73*36 -Z2sxn -$-Z1 -sdt^v -p1o7i -*76O52 -o5r'8 -}o0b +Z2 oB5 +s5= O42 +o73 *36 +Z2 sxn +$- Z1 +sdt ^v +p1 o7i +*76 O52 +o5r '8 +} o0b sn+ -i5y^C +i5y ^C i5W s3F -+9sif -o6WO83 -$nl -p2O8A -T0+0 -Z2R1 -lO63 -*37*87 -i0yz1 -o4lu -*06i2, -z3o1c -sid*91 -O94*31 -@p$* -i2oZ2 -+2^8 ++9 sif +o6W O83 +$n l +p2 O8A +T0 +0 +Z2 R1 +l O63 +*37 *87 +o4l u +*06 i2, +z3 o1c +sid *91 +O94 *31 +@p $* +i2o Z2 ++2 ^8 su -ssyO32 -dO74 -ko0k -*46D4 -*B7o3a -D9r -o0?^! -z5$; -O02i2^ -oAn-1 -Z2O13 -s31o77 -$6$m -$.^= -smO'5 -D5*65 -$p*86 -*84 -$g$N -$G*75 -^@O15 -*03sjx -i80k -^li9n -O72^2 +ssy O32 +k o0k +*46 D4 +*B7 o3a +D9 r +o0? ^! +z5 $; +O02 i2^ +oAn -1 +Z2 O13 +s31 o77 +$6 $m +$. ^= +smO '5 +D5 *65 +$p *86 +$g $N +$G *75 +^@ O15 +*03 sjx +i80 k +^l i9n +O72 ^2 skB -p1O08 +p1 O08 oBk -D2o6B -i2El -o6%O83 -i32$% -+3o4i -i2sO02 -[o2t +D2 o6B +i2E l +o6% O83 +i32 $% ++3 o4i +i2s O02 +[ o2t skp -$>Z3 -$9OA2 -o5.*45 -O61$p -$uD9 -O41sku -^mo3n -^f^0 +$> Z3 +$9 OA2 +o5. *45 +O61 $p +$u D9 +O41 sku +^m o3n +^f ^0 o6R -p2i60 -Z1i21 -D4o13 -'9o4j -o6 O72 -*02$i -^&$; -*ABoAz -o5CT6 -O01L3 +p2 i60 +Z1 i21 +D4 o13 +'9 o4j +o6 O72 +*02 $i +^& $; +*AB oAz +o5C T6 +O01 L3 s3u -O67+7 -sm3*24 -*3A'8 -[*09 -s1w-9 -^7*09 -O85*67 -^t+1 -OB3$6 -O64$! -T4$3 -rstk --5o6= -'5o0m -o3_Z1 -^7q -$b$l -^2o1Z -$%$f -li15 -{T3 -^Tz1 -slt*50 -+8iB9 -'7*30 -O92i20 -*61-4 -$1@y -i5-D0 --3-0 -O17u -^7z5 --Ai82 -O02z2 -*57$n -i0n'A -s5.O23 -i3a[ +O67 +7 +sm3 *24 +*3A '8 +s1w -9 +^7 *09 +O85 *67 +^t +1 +OB3 $6 +O64 $! +T4 $3 +r stk +-5 o6= +'5 o0m +o3_ Z1 +^7 q +$b $l +^2 o1Z +$% $f +l i15 +{ T3 +^T z1 +slt *50 ++8 iB9 +'7 *30 +O92 i20 +*61 -4 +$1 @y +i5- D0 +-3 -0 +O17 u +^7 z5 +-A i82 +O02 z2 +*57 $n +i0n 'A +s5. O23 ssW -T8i4 -Z3o6@ -sgwp1 -O72sa1 -*45*01 -{O92 --Bs21 -^1o1f -$*^k -i7sR8 -D6$7 -o7MD8 -$ko78 +T8 i4 +Z3 o6@ +sgw p1 +O72 sa1 +{ O92 +-B s21 +^1 o1f +$* ^k +i7s R8 +D6 $7 +o7M D8 +$k o78 @v -o69^n -D6O31 -^Wi5j -o7@*97 -O15z3 --6*85 -^A+1 +o69 ^n +D6 O31 +^W i5j +o7@ *97 +O15 z3 +-6 *85 +^A +1 svd -O43+2 -o09*54 -skL-6 -ti5y -^FD3 -[*02 -O91o8_ +O43 +2 +o09 *54 +skL -6 +t i5y +^F D3 +O91 o8_ i4\ -[$a -+Bs7a -$s+4 -i3f-4 -$gO73 -z2i3p -^m-4 -sC6t -+4*86 -^g^w +[ $a ++B s7a +$s +4 +i3f -4 +$g O73 +z2 i3p +^m -4 +sC6 t ++4 *86 +^g ^w i7K -i9Sl +i9S l @e -p1o6d -*20s9! -o4Ct -*90L0 --4O82 -O27d -o9y-5 -sysZ3 -}*63 +p1 o6d +*20 s9! +o4C t +*90 L0 +-4 O82 +O27 d +o9y -5 +sys Z3 +} *63 oBs sx[ -^Md -i6zo5s +^M d +i6z o5s sle -Z2o1- -f+6 -sa2k -z4L5 -o4Lu -R1$7 -O81*78 -*32p1 -o3ct -T5*31 --5*97 -z1@b -uR5 -i4/O12 +Z2 o1- +f +6 +sa2 k +z4 L5 +R1 $7 +O81 *78 +o3c t +T5 *31 +z1 @b +u R5 +i4/ O12 o3S -o7ho8i -o7j{ -$w[ -^@*62 -Z5O52 -O71*86 -*54$ -$7*87 -i5ei8i -^{O06 +o7h o8i +o7j { +$w [ +^@ *62 +Z5 O52 +O71 *86 +*54 $ +$7 *87 +i5e i8i +^{ O06 L9 -D3d sHn -$h$z -sakD6 --1^0 -o0Y$r -O03R1 -qO83 +$h $z +sak D6 +-1 ^0 +o0Y $r +O03 R1 +q O83 snm -@-$a -*25*54 -O59*16 -i93-1 -[i1Z -i7uO84 -+8+7 -[sez -$x^! -$j*A4 -*5AO73 -*A1O07 -'7u -^p@m -oB8Z1 -D4-7 -o48Z4 -o71o1t -'4c -D6$m -+5o79 -sS^l -+5o9y -*03i1r -sCM*68 -kd -Z1sb+ -O13$. -*79i9n -i0g@C -*14z5 +@- $a +*25 *54 +O59 *16 +i93 -1 +[ i1Z +i7u O84 +[ sez +$x ^! +$j *A4 +*5A O73 +*A1 O07 +'7 u +^p @m +oB8 Z1 +D4 -7 +o48 Z4 +o71 o1t +'4 c +D6 $m ++5 o79 +sS^ l ++5 o9y +*03 i1r +sCM *68 +Z1 sb+ +O13 $. +*79 i9n +i0g @C +*14 z5 s9! -@j[ -z1f -o2;*31 -$aswc -*07O58 -Z4s93 -o1@*21 -$ O26 -$Kt -'9T4 +@j [ +z1 f +o2; *31 +$a swc +*07 O58 +Z4 s93 +o1@ *21 +$ O26 +$K t +'9 T4 s @ -s97*67 +s97 *67 i3Q -i5w*57 -shvO46 -*41^v -o9ko8d -$vp1 -O84l -sv0$! -*A2O76 -$W$8 -o0['2 -O06*20 -o8c[ -@nsC8 -$0o87 -*89o7p -Z2o0K -^Io4m -*73O31 -o2t$e -o6n$4 -OB1-B -snz'7 -o7?-8 -'7+5 -$J*80 -O32o3@ -T2r -L7O82 -{$` -$,o0H -D3o9c +i5w *57 +shv O46 +*41 ^v +o9k o8d +$v p1 +O84 l +sv0 $! +*A2 O76 +$W $8 +o0[ '2 +O06 *20 +o8c [ +@n sC8 +$0 o87 +*89 o7p +Z2 o0K +^I o4m +*73 O31 +o2t $e +o6n $4 +OB1 -B +snz '7 +o7? -8 +'7 +5 +$J *80 +O32 o3@ +T2 r +L7 O82 +{ $` +$, o0H +D3 o9c sfs --7$v -l*74 -C*61 -uOA1 -^pu -dsgr --0D1 -$no9e -o4q[ -i7_D2 -^7Z3 -O51'9 -O42$o -$ O19 -^%z5 -$3r -@g$ -o0a^f -R6ss8 -i1t-0 -D0O56 -+0o4i -O89i1g -T5[ -qi24 -o2rc -$zOA2 -[$s -i2LC -z2@2 -$5O91 --0O56 -$7Z2 -oBoD6 -kZ3 -i1i*13 -o0ZZ1 +-7 $v +l *74 +C *61 +u OA1 +^p u +d sgr +-0 D1 +$n o9e +o4q [ +i7_ D2 +^7 Z3 +O51 '9 +O42 $o +$ O19 +^% z5 +$3 r +@g $ +o0a ^f +R6 ss8 +i1t -0 +D0 O56 ++0 o4i +O89 i1g +T5 [ +q i24 +o2r c +$z OA2 +[ $s +i2L C +z2 @2 +$5 O91 +-0 O56 +$7 Z2 +oBo D6 +k Z3 +i1i *13 +o0Z Z1 sl$ --5Z4 -dsh@ -^!i78 -o0gZ2 -L0} -z2o10 -o6#Z2 -i4cd -^7$h -lL7 -^1o4C -sCyc -o4Xp1 -^a^8 -@dD8 -i8WC -$ @f -skyc -$gi9u -o1eZ5 --8D7 -sej+7 -*54D7 -R7T4 -o0Mo2N -$aO31 --9O25 -TAT0 -*20O41 -O94O81 -i71+8 -to06 -^|l -T1[ -^.^, -dl -o6aO42 -O61$| -L5Z3 -Z2DB -i2k[ -+0i2j -o4p} -i31p1 -kz3 -i5eO23 -'2$ +-5 Z4 +d sh@ +^! i78 +o0g Z2 +L0 } +z2 o10 +o6# Z2 +i4c d +^7 $h +l L7 +^1 o4C +sCy c +o4X p1 +^a ^8 +@d D8 +i8W C +$ @f +sky c +$g i9u +o1e Z5 +-8 D7 +sej +7 +*54 D7 +R7 T4 +o0M o2N +$a O31 +-9 O25 +TA T0 +*20 O41 +O94 O81 +i71 +8 +t o06 +^| l +T1 [ +^. ^, +o6a O42 +O61 $| +L5 Z3 +Z2 DB +i2k [ ++0 i2j +o4p } +i31 p1 +k z3 +i5e O23 +'2 $ s7} -L7o6h +L7 o6h sa/ -p2o0l -o5TO72 -O06O32 -i6Yt +p2 o0l +o5T O72 +O06 O32 +i6Y t s@+ -*37$A -o0f$1 -$U*37 -'6^j -$;O02 +*37 $A +o0f $1 +$U *37 +'6 ^j +$; O02 s2L -R0^9 -$qL7 -T4o8o -L1o2n -@9*A9 -i90c +R0 ^9 +$q L7 +T4 o8o +L1 o2n +@9 *A9 +i90 c i2! -s1!Z2 -+1i1u -*A8O35 -tO91 -p4O94 +s1! Z2 ++1 i1u +*A8 O35 +t O91 +p4 O94 s#+ i2/ -O27*A9 -o1tp1 -LB@2 -D0i1V -*13sc2 -D5*46 -DBO05 -R9Z5 -*63$j -u$o --8o6b -+6s57 -i6Psf6 +O27 *A9 +o1t p1 +LB @2 +D0 i1V +*13 sc2 +DB O05 +R9 Z5 +*63 $j +u $o +-8 o6b ++6 s57 +i6P sf6 s8 -^T^Q --1^i -i8c*57 -o8e'9 -O61o68 -s58+8 -*35*24 -^!*40 -T3Z2 -*18O62 -+4O62 +^T ^Q +-1 ^i +i8c *57 +o8e '9 +O61 o68 +s58 +8 +*35 *24 +^! *40 +T3 Z2 +*18 O62 ++4 O62 sa+ -o5u[ -$;*01 -sdc^B -$2z4 --3sCg -i7_c -$3^d +o5u [ +$; *01 +sdc ^B +$2 z4 +-3 sCg +i7_ c +$3 ^d o6= -*28c -*52 -*65'9 +*28 c +*65 '9 i9P -o13Z1 -*B9o2o -$.O05 -s28T0 -p2D3 -D2'A -o1ai4- -L3-5 -*B2O89 -i3m+2 -o2rZ3 -o7kr -$m^+ -z1^ -s4n^M -o71$7 -^3o2x -+7OA2 -^Iz2 -sdbO31 -i1,i2. -*49$2 -z1iA1 -p2O95 -k$q -co32 -'3s.` -[o0q -i47*47 -sdXr -$#+7 -+1'A -p1o5y +o13 Z1 +*B9 o2o +$. O05 +s28 T0 +p2 D3 +D2 'A +o1a i4- +L3 -5 +*B2 O89 +i3m +2 +o2r Z3 +o7k r +$m ^+ +z1 ^ +s4n ^M +o71 $7 +^3 o2x ++7 OA2 +^I z2 +sdb O31 +i1, i2. +*49 $2 +z1 iA1 +p2 O95 +k $q +c o32 +'3 s.` +[ o0q +i47 *47 +sdX r +$# +7 ++1 'A +p1 o5y s54 -o3h[ -o5-1 -^w*53 -+1Z2 -O04$3 +o0> -1 ++1 Z2 +O04 $3 i5# o0_ -O14{ +O14 { sb^ -'BT7 -i0sp1 +'B T7 +^s p1 o9; -$5*57 -*03*36 -$!+4 -*43*12 -$j[ -ci6C -$,D8 -D0oB2 -$9r +$5 *57 +*03 *36 +$! +4 +*43 *12 +$j [ +c i6C +$, D8 +D0 oB2 +$9 r s27 sim -$f*96 -T4T3 -'6^w -*58$. -^hZ1 +$f *96 +T4 T3 +'6 ^w +*58 $. +^h Z1 s1q -ko29 -O24o4 --5*46 -$D$I -i3q{ -i5eZ1 -R0^s -i1:} -sgjL5 -*12p1 -o3t^s +k o29 +O24 o4 +-5 *46 +$D $I +i3q { +i5e Z1 +R0 ^s +i1: } +sgj L5 +o3t ^s sxa -o3Cl -i53*81 -o64i3r -O03O94 -i5f*03 -D1i5+ +o3C l +i53 *81 +o64 i3r +O03 O94 +i5f *03 +D1 i5+ o5{ -^1c -o2r$. +o2r $. i4T -o55Z5 -i6nc -$6^6 -$8O63 -oA1+9 -R1$0 -O83c -Co4b +o55 Z5 +i6n c +$6 ^6 +$8 O63 +oA1 +9 +R1 $0 +O83 c +C o4b o2R -i2d-1 -^k+4 -[$b -O42^D --9$! -*63o1l -o0rO24 -O05c +i2d -1 +[ $b +O42 ^D +-9 $! +*63 o1l +o0r O24 +O05 c s2t -s9 D4 -*54O12 -f@6 +s9 D4 +*54 O12 +f @6 sfd -i76D5 -i4cl -o97^! -s5bL0 -i5-$3 +i76 D5 +i4c l +o97 ^! +s5b L0 +i5- $3 i2G -i7]} -[i1# -i1q{ -@m*AB -i83-7 -Z4*A8 -^s-1 -*BAc --1*27 -O73o8! -RA$0 -$6*B9 -@uo53 -z1$T -i1d*65 -@l'9 -p1OA7 -$f*91 -O31$8 +i7] } +[ i1# +i1q { +@m *AB +i83 -7 +Z4 *A8 +^s -1 +*BA c +-1 *27 +O73 o8! +RA $0 +@u o53 +i1d *65 +@l '9 +$f *91 +O31 $8 si+ -+3o0d -ser*26 -z2*65 -o2 ^? --8^1 -sui*23 -oAak -O91s92 ++3 o0d +ser *26 +z2 *65 +o2 ^? +sui *23 +oAa k +O91 s92 se. -*36*28 -r@e -O02o1. -D2Z4 +*36 *28 +O02 o1. +D2 Z4 o5& -$eL8 -$OO53 -$+@3 -*3Bl -ksd3 -*A0T2 -o0$*54 -+1+2 -$A$a -O62se< -O23o36 -to1B -T0+1 -i9/D8 -i60*62 +$e L8 +$O O53 +$+ @3 +*3B l +k sd3 +*A0 T2 +o0$ *54 ++1 +2 +$A $a +O62 se< +O23 o36 +t o1B +T0 +1 +i9/ D8 +i60 *62 o4X -+8*70 -T5o4} -u*63 -i4fp1 ++8 *70 +T5 o4} +u *63 +i4f p1 se9 -i0/i1) +i0/ i1) o5X -o8%O31 -D1$$ -O47c -Z1^n +o8% O31 +D1 $$ +O47 c +Z1 ^n o1* sFl -k*38 -csiu -D5i1j +c siu +D5 i1j s.l -i6no7j -T5'B -+4q -$ @# -dsxZ -^wi1r -$.*76 -T0st5 -o1M{ -T7i0R +i6n o7j +T5 'B ++4 q +$ @# +d sxZ +^w i1r +$. *76 +T0 st5 +o1M { +T7 i0R s5e -$0s9a +$0 s9a s7a -*63o3q -T5$v -^!o3/ -^ ^x -co42 -o69*71 -$F+7 -$@O12 -O56O74 -scZu -D3$? -^ri4y -i7h$2 -T4r -*67s1/ -^sp1 -@c*24 +*63 o3q +T5 $v +^! o3/ +^ ^x +c o42 +o69 *71 +$F +7 +$@ O12 +O56 O74 +scZ u +D3 $? +^r i4y +i7h $2 +T4 r +*67 s1/ +@c *24 sw9 -iA_O46 -i2_l -o2g$# -Z5$8 -DBi01 -i9k*A6 -i0Md -o3nD2 -O54$. -O43+4 -OB3RB -qO19 -i2rO01 -ui4O -$8q -i4w'9 -O81o8- -*0AO7A -*02o1a -O32Z3 -*70Z1 -$<$1 --7i68 -oAl'B -$Ft -o0fRA -O72o6u -oA2$! -$_d -o7Uc -tO62 -$P^^ +iA_ O46 +i2_ l +o2g $# +Z5 $8 +DB i01 +i9k *A6 +o3n D2 +O54 $. +O43 +4 +OB3 RB +q O19 +i2r O01 +$8 q +i4w '9 +O81 o8- +*0A O7A +*02 o1a +O32 Z3 +*70 Z1 +$< $1 +-7 i68 +oAl 'B +$F t +o0f RA +O72 o6u +oA2 $! +$_ d +o7U c +t O62 +$P ^^ shM -$3-8 -$9{ -+6c -i21^2 -s54-1 -o4wf -O12i5 +$3 -8 +$9 { ++6 c +i21 ^2 +s54 -1 +o4w f +O12 i5 s!2 -p2D6 -{sue -D2D2 +p2 D6 +{ sue +D2 D2 sa2 -*95*5A -sls^a -i6d*60 +*95 *5A +sls ^a +i6d *60 i4A -'6i3m -i8zO05 -+8o7_ +'6 i3m +i8z O05 ++8 o7_ o2G -*7BO64 -i56+6 -o5t+2 -+3o6e -i0zz1 -T5*45 -o28l -Z1i7N -+7R5 -o4 L5 -*67$0 -sreD5 +*7B O64 +i56 +6 +o5t +2 ++3 o6e +i0z z1 +T5 *45 +o28 l +Z1 i7N ++7 R5 +o4 L5 +*67 $0 +sre D5 ^u -i4 *81 -*59o90 -O43f -slm$w -RAOB3 -}O21 -@u*82 -+AO62 -s 5$8 -O21-0 -*57@9 -sjf*7A -$aO02 -^%z1 -$o^C -ks8k -i3gT6 -o0Z$Z -z2i14 -^aD9 -^,-1 -z1@2 -Z4+0 +i4 *81 +*59 o90 +O43 f +slm $w +RA OB3 +} O21 +@u *82 ++A O62 +s 5 $8 +O21 -0 +*57 @9 +sjf *7A +$a O02 +^% z1 +$o ^C +k s8k +i3g T6 +o0Z $Z +z2 i14 +^a D9 +^, -1 +z1 @2 +Z4 +0 *39 -o5j*50 -+0^g -^oi1' -s76c -+8Z2 -+0*58 -oA_O05 +o5j *50 ++0 ^g +^o i1' +s76 c ++8 Z2 ++0 *58 +oA_ O05 sLF s6, -$"p1 -O13L0 -D8$f -Z2O26 -^L$i -+9$. -^.-1 -$6+8 -*01z2 -^lO36 -i6aO05 -T6i0N -$-O12 -+6$! -ko6f -o7W'9 -D6^t -p1sGb -$sO43 -i4k[ -O01o6, -$YL7 -s38O52 -iAnO64 -i4M+0 -*53o8o +$" p1 +O13 L0 +D8 $f +Z2 O26 +^L $i ++9 $. +^. -1 +$6 +8 +^l O36 +i6a O05 +T6 i0N +$- O12 ++6 $! +k o6f +o7W '9 +D6 ^t +p1 sGb +$s O43 +i4k [ +O01 o6, +$Y L7 +s38 O52 +iAn O64 +i4M +0 +*53 o8o iAe -^c$m -*50u -Z2-A -li1Q -{$x -co0r -i6y-8 -o91Z2 +^c $m +*50 u +Z2 -A +l i1Q +{ $x +c o0r +i6y -8 +o91 Z2 s8j -l$7 -O73t -[o41 -*83i54 -to66 -o7or -o88o9! -*94O73 -o6o*61 -'9i6* -O42sa -i5.T2 -Z1$% -co2$ -$tO02 -O15O41 +l $7 +O73 t +[ o41 +*83 i54 +t o66 +o7o r +o88 o9! +*94 O73 +o6o *61 +'9 i6* +O42 sa +i5. T2 +Z1 $% +c o2$ +$t O02 +O15 O41 o9% --5O03 -o3sC +-5 O03 +o3s C sfJ -$2+4 -}^6 -saoZ4 -i5_*97 -O56*28 -^jc -^lD2 -*36T9 -^.^f -Z3sdz --5*74 +$2 +4 +} ^6 +sao Z4 +i5_ *97 +O56 *28 +^j c +^l D2 +*36 T9 +^. ^f +Z3 sdz +-5 *74 skf -O74$# -o5w*75 -o0mz1 -Z1O52 -*97D1 +O74 $# +o5w *75 +o0m z1 +Z1 O52 +*97 D1 o7W -T9*29 +T9 *29 s8* -$4sdr +$4 sdr siG -+1O24 --2o4y -k^h -t-3 -$dO02 -R4D6 ++1 O24 +-2 o4y +k ^h +t -3 +$d O02 +R4 D6 i3N -p1D9 -i52$A -i1b+9 -o2*z1 -p1O57 -o5GD6 --0+6 -t*37 +p1 D9 +i52 $A +i1b +9 +o2* z1 +p1 O57 +o5G D6 +-0 +6 +t *37 srZ -co3- -s29$e +c o3- +s29 $e sqw -sf+z1 -o70^i -uo3s -Z1i9s -o0({ -l$% -o73$+ -^1O73 -i8hR7 -*68^? -T5o7h -dsS -i9.+B -+1$f -*54O23 -o18^M -@2o94 -O13^e +sf+ z1 +o70 ^i +u o3s +Z1 i9s +o0( { +l $% +o73 $+ +^1 O73 +i8h R7 +*68 ^? +T5 o7h +d sS +i9. +B ++1 $f +*54 O23 +o18 ^M +@2 o94 +O13 ^e o3h i8! --8q -$m-0 -o5,Z2 -O05q -}i7g +-8 q +$m -0 +o5, Z2 +O05 q +} i7g s7! -i67Z1 -Z1O83 -lO76 -o8gk +i67 Z1 +Z1 O83 +l O76 +o8g k s3j -$liAx -}o0v -^Eu -O02$" -oB O0A -O32o2 -i33i40 -*86D3 --9*01 -sfc^k -$7$j -o58Z4 -p2z2 -o0YZ4 -d^s -i8aO53 -*76*34 -O04o51 +$l iAx +} o0v +^E u +O02 $" +oB O0A +O32 o2 +i33 i40 +*86 D3 +-9 *01 +sfc ^k +$7 $j +o58 Z4 +p2 z2 +o0Y Z4 +d ^s +i8a O53 +*76 *34 +O04 o51 ssl -O64$@ -O03Z4 +O64 $@ +O03 Z4 i6[ -@5^9 -o0vl -O63@f +@5 ^9 +o0v l +O63 @f s* -l*79 -$+Z3 -*59D2 -$b$, +l *79 +$+ Z3 +*59 D2 +$b $, s0! -DA$b -+9i8 -fO5A -^7*35 -D6sng -^m*08 -o3+D6 -i0}^{ -i7aZ2 -+8*76 -*40D4 -D9D4 -O71o6j -ts52 -D7$8 -p1o7d -T8o04 -'B+5 -DA-A --7} -$b^h -O08i1a -L1R0 -$\l -o13$_ -Co4F -l*7B -^0z2 -i49p2 -o55*78 -o3Ql -$ $m -R0$8 +DA $b ++9 i8 +f O5A +^7 *35 +D6 sng +^m *08 +o3+ D6 +i0} ^{ +i7a Z2 +*40 D4 +D9 D4 +O71 o6j +t s52 +D7 $8 +p1 o7d +T8 o04 +'B +5 +DA -A +-7 } +$b ^h +O08 i1a +L1 R0 +$\ l +o13 $_ +C o4F +l *7B +^0 z2 +i49 p2 +o55 *78 +o3Q l +$ $m +R0 $8 oA+ -+7*98 -@v[ -$ED8 -$fZ2 -kZ1 -'5o1g -RBO02 -$o+4 -o8.$1 -$/s1. -i4s@b -o50^b -$]i3[ -i1to4e -p3Z2 -o82*79 -^[L0 -Z3su- -$Uc -i6l*83 -O02O13 -$7sgc ++7 *98 +@v [ +$E D8 +$f Z2 +k Z1 +'5 o1g +RB O02 +$o +4 +o8. $1 +$/ s1. +i4s @b +o50 ^b +$] i3[ +i1t o4e +p3 Z2 +o82 *79 +^[ L0 +Z3 su- +$U c +i6l *83 +O02 O13 +$7 sgc sog -o4m*07 -o59d -ciA2 -cs2I -ti7P -tO26 -$3O92 -z5O61 -c*58 -$I^R -O21o9x -$ki5f -$ sMP +o4m *07 +o59 d +c iA2 +c s2I +t i7P +t O26 +$3 O92 +z5 O61 +c *58 +$I ^R +O21 o9x +$k i5f +$ sMP o3F -$+O53 +$+ O53 slc -i1C{ -O32D1 --0-5 -o4-*54 -$A+7 -z1o2y -*86o5 -o5f-4 -^RD3 -[o04 -D3-8 -D6o7: -p1$v -$1+B -sjrT4 -+4D5 -D1*13 -^.z4 -^At -*94o0t -lo42 -co8o -$9O72 -T5T7 -^8z4 -^d*0A +O32 D1 +-0 -5 +o4- *54 +$A +7 +z1 o2y +*86 o5 +o5f -4 +^R D3 +[ o04 +D3 -8 +D6 o7: +p1 $v +$1 +B +sjr T4 ++4 D5 +^. z4 +^A t +*94 o0t +l o42 +c o8o +$9 O72 +T5 T7 +^8 z4 +^d *0A i18 -$++7 -Z1o4! +$+ +7 +Z1 o4! o5) -O81D1 -o4Yc -o4qD5 -R4*30 +O81 D1 +o4Y c +o4q D5 +R4 *30 i6N -*17-8 +*17 -8 smd -o0g*34 -O24*36 -i5c*24 -$2O32 +o0g *34 +O24 *36 +i5c *24 +$2 O32 s!^ -D6+7 -'Bi5n -*73$_ +D6 +7 +'B i5n +*73 $_ s1L -Z1i3: -i3go98 -*58O91 -[$3 -+4'5 -D7i1q -$2D4 -Z4o8 -*56o2l -*89^q -ci9G +Z1 i3: +i3g o98 +*58 O91 +[ $3 +D7 i1q +$2 D4 +Z4 o8 +*56 o2l +*89 ^q +c i9G @i -T0s8 -i8_Z1 -lo8d -O23$l -+3T5 -o5u$3 -$8O41 -'4^d -$di0t -^mT5 -*63o5t -*56Z2 -i4/ -*84u -O32@= -+8$g -^v'6 --8+4 -+1D7 +T0 s8 +i8_ Z1 +l o8d +O23 $l ++3 T5 +o5u $3 +$8 O41 +'4 ^d +$d i0t +^m T5 +*63 o5t +*56 Z2 +*84 u +O32 @= ++8 $g +^v '6 +-8 +4 ++1 D7 sgr -+8^a -O03o66 -o5hi5C -R9+4 -s8t[ -^eO46 -O16o3 -s9_r -d*45 -o4^l -+5l --1^3 -o80i0* -*82T5 ++8 ^a +O03 o66 +o5h i5C +R9 +4 +s8t [ +^e O46 +O16 o3 +s9_ r +d *45 +o4^ l ++5 l +-1 ^3 +o80 i0* +*82 T5 smr -*74*94 -OA1DB -O84*78 -i5k*28 -o3Fi3B -DAD4 -D3o55 -o4*Z3 -R0p5 -L0^w -szef -i8-T0 -i0 *05 -[i6= -sr&u -o9Esa@ -*20s29 -co4V -i65Z3 -z1$k -src-1 -Cs49 -'2k -^nO31 -*48i5K -O31O43 -csgV -o7y^j +*74 *94 +OA1 DB +O84 *78 +i5k *28 +o3F i3B +DA D4 +D3 o55 +o4* Z3 +R0 p5 +L0 ^w +sze f +i8- T0 +i0 *05 +[ i6= +sr& u +o9E sa@ +*20 s29 +c o4V +i65 Z3 +z1 $k +src -1 +C s49 +'2 k +^n O31 +*48 i5K +O31 O43 +c sgV +o7y ^j *5A -o0hu +o0h u o7- sh^ i3| -ro0" -i3Wl -$fT0 -*09O03 -Z3$1 -Z3O54 -o6a*36 -T6O12 --7s., -$r*A9 -suoo4! -*20o4 --5+8 -i42c -'B*97 -^a$v -+2sui -i7,O25 -*31O24 -$1s7_ -'8o0E +r o0" +i3W l +$f T0 +*09 O03 +Z3 $1 +Z3 O54 +o6a *36 +T6 O12 +-7 s., +$r *A9 +suo o4! +*20 o4 +-5 +8 +i42 c +'B *97 +^a $v ++2 sui +i7, O25 +*31 O24 +$1 s7_ +'8 o0E sa; -$$i0* -$_O25 -o4.D6 -O01i8i -i7D^1 -*30*43 -o02Z1 -o6t} -o4loB2 -$Jo1o +$$ i0* +$_ O25 +o4. D6 +O01 i8i +i7D ^1 +*30 *43 +o02 Z1 +o6t } +o4l oB2 +$J o1o shb -o8rZ2 -$]o4[ +o8r Z2 +$] o4[ sgi -^c^a -sa7Z2 -O52^$ -s52o71 -$5@w -p2O56 -{Z3 -^@$ -^fi10 -O93O07 -*08O45 -z1$h -i4tD0 -D3T3 +^c ^a +sa7 Z2 +O52 ^$ +s52 o71 +$5 @w +p2 O56 +{ Z3 +^@ $ +^f i10 +O93 O07 +*08 O45 +z1 $h +i4t D0 +D3 T3 o8: -p2O02 -*26o3G -D5l -D7$ -^9O31 +p2 O02 +*26 o3G +D7 $ +^9 O31 O27 -o7 @6 --2'A -@1o64 -o3lo0H -s30*65 -$+^N +o7 @6 +-2 'A +@1 o64 +o3l o0H +s30 *65 +$+ ^N so^ -to75 -O41^K -O82*48 -o94Z1 --6o5z -i4o-3 -*74L5 -O14R3 +O41 ^K +O82 *48 +o94 Z1 +-6 o5z +i4o -3 +*74 L5 +O14 R3 sly -D5$w -p2i4 -O17{ -s0 q -O68Z1 -D5o7D -o0w*05 -*73$m -@5$7 -o5n{ +D5 $w +p2 i4 +O17 { +s0 q +O68 Z1 +D5 o7D +o0w *05 +*73 $m +@5 $7 +o5n { sBZ -o6 $k +o6 $k i5T -O89$i -^Bo7X -O0B$' -O72^m +O89 $i +^B o7X +O0B $' +O72 ^m sa? -T5-3 -o5/@g +T5 -3 +o5/ @g s3@ s1& -^9$G -'A$? -p4Z4 -O12s81 +^9 $G +'A $? +p4 Z4 +O12 s81 sf6 -sb c -+9D7 -ti5N -T9Z1 -sbyl -$$D2 -*45o6` -qo0s -s7OD8 -co1A -L5*34 -*78O62 -$*i2e -$r$! -$k{ -i3h[ -i5x+2 +sb c ++9 D7 +t i5N +T9 Z1 +sby l +$$ D2 +*45 o6` +q o0s +s7O D8 +c o1A +L5 *34 +*78 O62 +$* i2e +$r $! +$k { +i3h [ +i5x +2 sAF -*01O61 -'Ao43 -i1r -ti9N +*01 O61 +'A o43 +t i9N oA6 -$p*64 -O01*38 -R6^! -o0bC -[L0 -^2i5d -i7Ml -^n^n -*57i3s -o4pD1 -L0O16 -i84+7 --4*03 -CsO= -i3@k -Ci21 -*75$m -}^$ -fi41 -'6o3t -OB3s7f -i0oz1 -si z5 -$+sla -z2o4Z -+9D0 -ci6b -O81O12 -z4c +$p *64 +O01 *38 +R6 ^! +o0b C +^2 i5d +i7M l +*57 i3s +o4p D1 +L0 O16 +i84 +7 +C sO= +i3@ k +C i21 +*75 $m +} ^$ +f i41 +'6 o3t +OB3 s7f +i0o z1 +si z5 +$+ sla +z2 o4Z ++9 D0 +c i6b +O81 O12 +z4 c i4< snq -i37O03 -i4!{ -*46i5g -srXo3k -ui6\ -D2z2 -i69+7 -qO26 -o99*19 -o0yr -D6sGM -O23L5 -O73R8 -OB1o1s -O05$+ -o5a+9 -i3l[ -$$i01 -$@O02 -O14-1 -*76scv -o5mk -@eO12 -d+0 -$u$w -L7*17 -*27^2 -Z2o9! -D9o8d -rR0 -O71T7 -@1^a -*15$u -i2w*03 -o1rt -i4Nu -i6=c -p1*7A -Z3RA -$;u -z2c -O52'A -Z1sa? +i37 O03 +i4! { +*46 i5g +srX o3k +u i6\ +D2 z2 +i69 +7 +q O26 +o99 *19 +o0y r +D6 sGM +O23 L5 +O73 R8 +OB1 o1s +O05 $+ +o5a +9 +i3l [ +$$ i01 +$@ O02 +O14 -1 +*76 scv +o5m k +@e O12 +$u $w +L7 *17 +*27 ^2 +Z2 o9! +D9 o8d +r R0 +O71 T7 +@1 ^a +*15 $u +i2w *03 +o1r t +i4N u +i6= c +p1 *7A +Z3 RA +$; u +z2 c +O52 'A +Z1 sa? i9. -+8T2 -^b*30 -^Di0O ++8 T2 +^b *30 +^D i0O szL -'7C -$.*54 -$LT9 -'B$4 -i7gc -i2*-1 +'7 C +$L T9 +'B $4 +i7g c +i2* -1 sr+ -Z1s6) -$ $t +Z1 s6) +$ $t o7C -*74Z2 -'9snP -o2f} -^ni1d -co9$ -$][ -tOA2 -$2l -srHO21 --3^$ -^.i1/ +*74 Z2 +'9 snP +o2f } +^n i1d +c o9$ +$] [ +t OA2 +$2 l +srH O21 +-3 ^$ +^. i1/ i5` -[i11 -O09T5 -T4o5i -+6+4 +[ i11 +O09 T5 +T4 o5i ++6 +4 s7v -OB3O17 -o83*65 -D7^n -fO83 -D2$o -O94O26 -o2zT4 -O62^a +OB3 O17 +o83 *65 +D7 ^n +f O83 +D2 $o +O94 O26 +o2z T4 +O62 ^a s5. -slz'6 -O06'B -$1*89 -sws$9 --3*75 -li8t -+9i8d -svjO52 -rsb9 --6$x -^Co1a -*15o1u -$boB2 -$5R0 +slz '6 +O06 'B +$1 *89 +sws $9 +l i8t ++9 i8d +svj O52 +r sb9 +-6 $x +^C o1a +*15 o1u +$b oB2 +$5 R0 sGm -lsuy -*39+5 -*76'B -o65$M -$+Z5 -c$y --4L4 -'2o0> -+1smd -$s-5 -'5i2l -o79l +l suy +*39 +5 +*76 'B +o65 $M +$+ Z5 +c $y +-4 L4 +'2 o0> ++1 smd +$s -5 +'5 i2l +o79 l smb -Z1+2 -ro41 -O23siL -c^ -O23Z2 +Z1 +2 +r o41 +O23 siL +c ^ +O23 Z2 o7: -*32*25 -*53[ -{^0 -o69s74 -$k*A8 -*40O27 -$;-7 -$3^N -i02^l +*32 *25 +{ ^0 +o69 s74 +$k *A8 +*40 O27 +$; -7 +$3 ^N +i02 ^l s2? -Z1o07 +Z1 o07 scj -*57*06 -i52R2 -*87i88 -fO75 -^n*03 -$p*61 -sw-r -*9A@0 -$s*68 -{$s -tO42 -^fO61 -z3@d -+4+3 -[o0S -*54-8 -sgw$7 -*43suo -p1o2r -z1*32 -i5zO14 -D6i01 -Z2i5r -o61O76 -O23^m --2-1 -sH@Z2 -o7m+8 -*46o7E -O03z5 -*06*15 -R7O43 -O56L5 -p1s19 -co6T -*65Z3 -swV$! -}i14 -rL7 -*25i5a -^1*36 -o8ul -*A9RB -i50$s -}sAu -z1Z3 --0i3j -i2gse -i1ai7o -o0n*61 -^H*63 -i61R1 -{iA0 --3z3 -Z3o0d -Z1o3t -R4O51 -sc7Z1 -s;Hu -*87$7 +*57 *06 +i52 R2 +*87 i88 +f O75 +^n *03 +$p *61 +sw- r +*9A @0 +$s *68 +{ $s +t O42 +^f O61 +z3 @d ++4 +3 +[ o0S +*54 -8 +sgw $7 +*43 suo +p1 o2r +z1 *32 +i5z O14 +D6 i01 +Z2 i5r +o61 O76 +O23 ^m +-2 -1 +sH@ Z2 +o7m +8 +*46 o7E +O03 z5 +*06 *15 +R7 O43 +O56 L5 +p1 s19 +c o6T +*65 Z3 +swV $! +r L7 +*25 i5a +^1 *36 +o8u l +*A9 RB +i50 $s +} sAu +z1 Z3 +-0 i3j +i2g se +i1a i7o +o0n *61 +^H *63 +i61 R1 +{ iA0 +-3 z3 +Z3 o0d +Z1 o3t +R4 O51 +sc7 Z1 +s;H u +*87 $7 o2w -$rL5 -O43d -z1sf_ -i8=O53 -*24i6^ -@1+8 -}o2# -O72T2 -DBsab -+3o8a +$r L5 +O43 d +z1 sf_ +i8= O53 +*24 i6^ +@1 +8 +} o2# +O72 T2 +DB sab ++3 o8a sAZ -O09o2 -Z2i5x +O09 o2 +Z2 i5x OB8 -oByO26 -$fO91 -$8*23 -*76-9 -L3{ -$dR0 -o1D*21 +oBy O26 +$f O91 +$8 *23 +L3 { +$d R0 +o1D *21 suw -*19$2 -z4-2 +*19 $2 +z4 -2 O48 -'B@z -^p'A -*72'6 -{^E -$4*86 -*14i0m +'B @z +^p 'A +*72 '6 +{ ^E +$4 *86 +*14 i0m O16 -$!^% -i3uc -+8} -o3rO42 -z4z4 -o0v'5 -D6o2w -Z1o5c -Z2i7Y -$6O73 +$! ^% +i3u c ++8 } +o3r O42 +o0v '5 +D6 o2w +Z1 o5c +Z2 i7Y +$6 O73 o7H -^Mi6i -O54i6i -$5@6 -$7z2 +^M i6i +O54 i6i +$5 @6 +$7 z2 o8# --0O25 -Z1$n +Z1 $n sp< -{^8 -Z3-A -r*14 -o4xc -z4l -$t$g -^Bz1 -+5D4 -i5oL4 -OB3l -o8Kr -^yO41 -rO05 -s!(D5 -$.$$ -o2B-9 -O16^a -$yO04 -{*65 +{ ^8 +Z3 -A +o4x c +z4 l +$t $g ++5 D4 +i5o L4 +OB3 l +o8K r +^y O41 +r O05 +s!( D5 +$. $$ +o2B -9 +O16 ^a +$y O04 +{ *65 o3P -z1+2 -i0Dz3 -$*^+ -Z2o5F -$i-9 +i0D z3 +$* ^+ +Z2 o5F +$i -9 sO8 -^pz3 -L6O4B -O07-0 -$pl -O25l +^p z3 +L6 O4B +O07 -0 +$p l +O25 l o0U s2_ -+5+4 -Z4i0r ++5 +4 +Z4 i0r sxp -*67k -*76z1 -*36^m -$2Z4 -Z2$z -T7i3? -'9$c -si^l -^`r -*A8[ -'8i5e -^M+4 +*67 k +*76 z1 +*36 ^m +$2 Z4 +Z2 $z +T7 i3? +'9 $c +si^ l +*A8 [ +'8 i5e +^M +4 sCK -*78i6k -^6$2 -o6!i58 -lL5 -o4x*46 -D1*68 -i1uo3i -*14*34 -z2scl -O8Ap1 -$:T6 -s-@-8 -*56o6q -[*76 -o1up1 +*78 i6k +^6 $2 +o6! i58 +l L5 +o4x *46 +i1u o3i +*14 *34 +z2 scl +O8A p1 +$: T6 +s-@ -8 +*56 o6q +o1u p1 s46 -C'5 -i8t$0 -T8O31 -z1^G -i4cc +C '5 +i8t $0 +T8 O31 +z1 ^G +i4c c O58 -O61s8m -T2i0y -o8=s_g -p2OB9 -li5e --9Z1 -Z3p3 -^3^< -*78$6 -z5O24 -R0R2 -p1^a -^4$s +O61 s8m +T2 i0y +o8= s_g +p2 OB9 +-9 Z1 +Z3 p3 +^3 ^< +*78 $6 +z5 O24 +R0 R2 +p1 ^a +^4 $s se7 -O41Z3 --8@6 +O41 Z3 +-8 @6 i9m -Z2O28 --0-7 -T2$! -s[iT0 -O62i6m -OB2C -i7es17 -Z1^h -o67$A -*75o1h -o9bi9/ -u@E -$+-A -s53T0 -L7$4 -Z2O21 -T5*67 -+4o0t -O05D3 -*0At --1'7 -$8O92 -'9i2l --2Z1 +Z2 O28 +-0 -7 +T2 $! +s[i T0 +O62 i6m +OB2 C +i7e s17 +o67 $A +*75 o1h +o9b i9/ +u @E +$+ -A +s53 T0 +L7 $4 +Z2 O21 +T5 *67 ++4 o0t +O05 D3 +*0A t +-1 '7 +$8 O92 +'9 i2l +-2 Z1 sl_ -+8R2 ++8 R2 i1" -$_$s -O71$E --7Z3 -+5O62 -Z3o0m -o8l-7 -Z1*97 -^vR1 +$_ $s +O71 $E +-7 Z3 +Z3 o0m +o8l -7 +Z1 *97 +^v R1 O4B -T4O8B -*A1O16 -ro6U -o6!k --2o0g -sZ+O01 -+9p1 -sL3'9 -co64 -o3Yl -i4rO91 -i3!c -*01o6. -O23i1b +T4 O8B +*A1 O16 +r o6U +-2 o0g +sZ+ O01 ++9 p1 +sL3 '9 +c o64 +o3Y l +i4r O91 +i3! c +*01 o6. +O23 i1b i35 -R0@o -D2p1 -'5z5 -'9u -o91*A9 --4o7e -^sk -fZ5 -$a$6 -*A9o9J -$G$E +R0 @o +'5 z5 +o91 *A9 +-4 o7e +f Z5 +$a $6 +$G $E i1V -o27+8 -^l'9 -z2@i -O13^S -z2@q -'8$h -[i1w -ri1k -'9$1 -$F*23 -p1*69 -$AZ3 -sn7d -^az2 -li1\ -Z3O63 -*14 -R4*64 -o1%z1 -'Bsoa -*09O34 -p1-3 --5sb- -i4,c -sdc-3 -sf7Z1 -O72z1 -$r$n +o27 +8 +^l '9 +z2 @i +O13 ^S +z2 @q +'8 $h +[ i1w +r i1k +'9 $1 +$F *23 +p1 *69 +$A Z3 +sn7 d +^a z2 +l i1\ +Z3 O63 +R4 *64 +'B soa +*09 O34 +p1 -3 +-5 sb- +i4, c +sdc -3 +sf7 Z1 +O72 z1 +$r $n i3$ -o93D8 --5o1_ -{$2 +o93 D8 +-5 o1_ +{ $2 s.7 -sndO02 -$E[ -R3O73 -z2o1l -O34O52 -^di31 -o1ii04 -D8@7 -T3si1 -o4$Z1 -'9R8 -z1t -o6 @a -$ro6 -*07+0 -Z2o2d -+4$N -o87O52 -$m*28 -sy5i31 +snd O02 +$E [ +R3 O73 +z2 o1l +O34 O52 +^d i31 +o1i i04 +D8 @7 +T3 si1 +o4$ Z1 +'9 R8 +z1 t +o6 @a +$r o6 +*07 +0 +Z2 o2d ++4 $N +o87 O52 +$m *28 +sy5 i31 sO% -$g$s -C-7 --8O61 -i4=*86 -Ci9v -qt -i74^3 +$g $s +C -7 +-8 O61 +i4= *86 +C i9v +q t +i74 ^3 i0" -O83$M +O83 $M sm- -*A8s0x +*A8 s0x o2# -@Sz1 -^4C -o4dO71 -[-6 -^r'B -$TL6 -o4,*06 -ui6r -^iO12 -'9*83 -z2*74 -*53q --4-2 -o2Vt +@S z1 +^4 C +o4d O71 +[ -6 +^r 'B +$T L6 +o4, *06 +u i6r +^i O12 +'9 *83 +-4 -2 +o2V t o9! sA9 -O54$y -Z4O13 +O54 $y +Z4 O13 ^O -+7oAo -$#o69 -$4Z3 -+3^b -fOA8 -+7u -+0*37 ++7 oAo +$# o69 +$4 Z3 ++3 ^b +f OA8 ++7 u sfm -z1o1* +z1 o1* i5H -*41-0 -T0i3m -O02^b --2*26 -$9@O -O19p2 -O04'5 -p4O1B -T4O02 -d+B -se,$5 -$od -i7mT4 -*21i4t -i62Z2 -T4sc$ -O93l -Z1o5C +*41 -0 +T0 i3m +O02 ^b +-2 *26 +$9 @O +O19 p2 +O04 '5 +p4 O1B +T4 O02 +se, $5 +$o d +i7m T4 +*21 i4t +i62 Z2 +T4 sc$ +O93 l +Z1 o5C s7x -*41$z -*B6*89 +*41 $z +*B6 *89 sOK -[T1 -O14O32 -o0kc -o6.^m --6i62 -O09O54 -Z4D1 -i5oc -O18R0 +[ T1 +O14 O32 +o0k c +o6. ^m +-6 i62 +O09 O54 +Z4 D1 +i5o c +O18 R0 $' -O13$y -i0vd -p2O45 -^kR3 -p2Z3 -*75o6e -se [ +O13 $y +p2 O45 +^k R3 +p2 Z3 +*75 o6e +se [ i1G -*86o30 --8*53 -o7zo8o -i4K$4 -$x$t -z5@a -O08*63 -R7+9 -smlk -o8dD9 -o0D'9 -o7$'8 +*86 o30 +-8 *53 +o7z o8o +i4K $4 +$x $t +z5 @a +O08 *63 +R7 +9 +sml k +o0D '9 +o7$ '8 o49 -s1cR0 +s1c R0 o9` s8d -o8kO23 -^1O56 -^ *20 -o1eZ1 -R0$} -*67s- -*15f -^m*40 -usLH -Z4i0= --5*16 -+0R6 +o8k O23 +^1 O56 +^ *20 +o1e Z1 +R0 $} +*67 s- +*15 f +u sLH +Z4 i0= +-5 *16 ++0 R6 $N -+7O41 -o54p2 -*85+5 -$Gr -z2o1- -*49O24 -i5nZ1 ++7 O41 +o54 p2 +*85 +5 +$G r +z2 o1- +*49 O24 +i5n Z1 scF oBE -o0p-1 -uO83 -*87o7z +o0p -1 +u O83 +*87 o7z s,G --B@r -*43$3 -$!*04 -$5o7o -*01scx -T7@E --5l -+8*78 -$9o84 -O52o4g -*45s2_ +-B @r +*43 $3 +$! *04 +$5 o7o +*01 scx +T7 @E +-5 l ++8 *78 +$9 o84 +O52 o4g +*45 s2_ sau -'3sd: +'3 sd: si[ -$9$O -*23*86 -^s+2 -*35o2m +$9 $O +*23 *86 +^s +2 +*35 o2m sZb -T7o22 -^8p1 -@%+6 -o0fO32 -[$: -+7sfb -[o4t -$s[ +T7 o22 +^8 p1 +@% +6 +o0f O32 +[ $: ++7 sfb +[ o4t s9@ -cs2m +c s2m stw -T9L9 -o4jo80 -D3o0N -i2k+4 -li67 +T9 L9 +o4j o80 +D3 o0N +i2k +4 +l i67 iA7 -$/D3 -spyp1 +$/ D3 +spy p1 $< s1$ -$0*67 -Z4O15 -@5R3 -D3i7D -i3o*20 -$#O61 -^p'5 +Z4 O15 +@5 R3 +D3 i7D +i3o *20 +$# O61 +^p '5 sDm -O12i2k -+5L0 -o9A[ -^Ui10 -Z3^# -s5V'A -z2*51 +O12 i2k ++5 L0 +o9A [ +^U i10 +Z3 ^# +s5V 'A +z2 *51 $U -tO03 -i7 ^O $M $W ^m ^r @@ -1476,11 +1331,9 @@ $M $O $M $A ^M ^7 $, $m -l oB. l o5j l $L $L $A -l ,5 ^l *05 K Y2 $k $1 @@ -1493,26 +1346,19 @@ i3k k i2C Z3 i1( o2) i1n t -i0h ^s +^h ^s ^F ^W ^f ^d E T8 T4 -E T4 T8 ^e ^d -d Z2 t -d y4 t -dO65t -dO64u -duO64 -d t Z2 -d t y4 -dtO65 -d t ^R -d t +7 -d i7X -d i7b -d +7 t -$* D5 t +p1 t Z2 +d t O65 +d u O64 +p1 t ^R +p1 t +7 +p1 i7X +p1 i7b +p1 +7 t D2 $* ^d ^0 ^C ^X @@ -1530,18 +1376,13 @@ $7 -5 ^6 ^V $6 $b $* .6 -.5 ,3 *50 $q *40 ,3 ^U -+3 T4 $2 i31 -$1O71 --1 ^X +$1 O71 $1 $W $1 $D -,1 .2 -+0 $X *02 y4 y4 $* ^+ $. $- @@ -1554,12 +1395,12 @@ $| ^| ^Z ^A ^* z4 z3 o2Q -Z2O32 +Z2 O32 Z2 o3d [ Z2 k Z2 i6- -Z1 $h -$< Z1 +Y1 $h +$< Y1 y5 o4a Y4 o8 Y4 o7. @@ -1573,32 +1414,28 @@ Y1 $? $_ Y1 ^X ^A O72 -$*O05 -O04y2 -O04$6 -O03-0 -$*O01 +$* O05 +O04 y2 +O04 $6 +O03 -0 ^w ^q ^w i0e $& ^W $v +1 -udOB1 +u d OB1 ^t ^z t Y5 t o2K t o0$ ^T ^D -T4 L7 T4 $1 T3 t T2 -T3 T2 t -$SO13 +$S O13 $S $W $s $e s=+ r Z3 -^r y1 -$RO54 +$R O54 $r $t r o1_ ^r l @@ -1608,9 +1445,8 @@ $q Z3 ^q $. ^P ^A p3 D5 -p2O75u -p2uO75 -p1O08 +p2 O75 u +p1 O08 [ ^p $1 ^o ^R o9# @@ -1636,7 +1472,6 @@ $* ^m $. $m $` L6 l $' -l ^$ [ k Z2 K ^s $K $R @@ -1662,29 +1497,25 @@ i2z i1q y4 i0R ^M $! ^I -^h ^s $H ^R $H .7 ^g ^m ^G ^D $g ,7 -fO49 +f O49 ^e $# -dOA3u -dO53t +p1 u OA3 +p1 O53 t $D $W -duOA3 -d u +0 -dtO53 -d t ,6 -d oBL -d o4- -d i8, +p1 u +0 +p1 t ,6 +p1 oBL +p1 o4- +p1 i8, ^D ^C -d 'B +p1 'B D9 $1 -d ,6 t -d +0 u +p1 +0 u $D c T5 $9 ^C ^S @@ -1692,45 +1523,38 @@ c T5 $9 ^C ^L C i5X ^C ^B -c $9 T5 c $3 c $. -^bO52 'A Y2 +A $\ $! ^a ^9 $4 $9 $% -$8O73 +$8 O73 $! .8 -^/ -8 -^7 y1 *63 T2 +6 $# $6 $= .6 $* ,6 $! -6 ^_ -,5O03 +,5 O03 +5 $+ .5 ,5 $* ,5 ,4 *53 --4 ^1 ^. ^4 -,3 ^l $ +3 +2 $R ^2 ^a $2 $5 .2 *07 --1 Z1 +-1 Y1 $1 $S $1 $7 $1 ^! $@ $1 --0 T5 $0 ^c $* $- $( $. @@ -1738,15 +1562,12 @@ $, $. $- [ { ^& $% -^- { Z5 o9U Z4 o0D Z4 i9U z3 o1g z3 o1) -z3 $! Z2 i5v -z2 i1g $ Z1 i22 $@ Z1 ^Y ^N @@ -1761,23 +1582,20 @@ Y3 -2 y2 y2 E Y2 oB4 y2 -y1 Y2 Y2 -Y1 $h -$\ Y1 +z1 Y2 Y2 ^x z2 $x $O $X $D -O61] -O42^| -O23*02 -O12f -$*O12 -O06z2 -$,O05 -O04^Y -O03,2 -O02^4 -$WO42 +O61 ] +O23 *02 +O12 f +$* O12 +O06 z2 +$, O05 +O04 ^Y +O03 ,2 +O02 ^4 +$W O42 $W ^j $w i7q $w $h @@ -1785,19 +1603,14 @@ $w $h $W $V +7 $V $2 -u z5 y1 -u y1 z5 u $! Y1 $U $T t y5 y5 $t T1 -t o2o $T $K T6 T7 T6 $+ T5 $1 -T1 $% -T0 $! } t [ t ] sy* @@ -1805,7 +1618,6 @@ ssz sR* t ^S ^L ^s K -^S i0A ^s ^g s30 $@ ^S @@ -1818,28 +1630,15 @@ q s0 $p $t ^p ^R $p $b -p2O76t -p2tO76 -p1O53t -p1O06 -p1tO53 -p1 t D7 +p2 O76 t p1 t ^D -p1 oBZ -p1 oBL p1 o7c -p1 o0r -p1 i7X p1 E $3 -p1 D7 t -p1 $3 E $o $s o8x -o7Y E $1 o7Y $1 E o73 o6Y y5 -o64 l o5W Z5 o5v o5- u @@ -1855,18 +1654,14 @@ o3f y3 o2a o0Y o0* t r -o0* r t o0g } o01 z2 -$m *73 ^m $& -l y1 +l z1 l o44 l i7! -l i5@ ^L ^H L4 $0 -$' l ^k ^l ^k $k K i6- @@ -1880,33 +1675,26 @@ $ i22 Z1 i1n C $i ^H ^B -f y1 u +f u z1 $f ^W -f u y1 ^F ^K ^e z1 E ^E $2 E $$ ^@ ^E -d Z1 t -d z1 t +p1 Y1 t +p1 z1 t d u i62 d u i61 -d t Z1 -d t z1 d o60 -d o2M -d i62 u -d i61 u -d '9 +p1 o2M +p1 '9 ^d ^7 $D $! ^c z1 $! c T8 ^* c r -^c +8 ^c ^4 -$b Y1 $b $w ^B ^M $b ^A @@ -1918,14 +1706,11 @@ $# -8 '7 R6 R6 +7 $@ +7 $. -^_ -7 -$6O04 +$6 O04 .5 $r --5 ^b $5 $A -5 $7 ^4 '8 -*46 *45 Y4 Y4 *42 $_ *41 @@ -1943,7 +1728,6 @@ $1 o0B ,1 K $1 $g $1 *84 -+0 $9 ^0 ^2 $# ^@ $$ $& @@ -1951,54 +1735,44 @@ $! ^* $, $` ^` $z ^a -z5 oAI -} Z4 z4 } z4 Z4 Z2 T5 Z2 o1@ -z2 i2@ -$* Z1 +z3 o2@ y3 i3x y3 i2l [ Y3 -y1 Z4 -y1 ^K +z1 Z4 ^x $s ^X o7X -O71c$2 -O71$2c -O52$t -O41$a -O37t +O71 c $2 +O52 $t +O41 $a +O37 t O1A -O14C -O05y2 +O14 C +O05 y2 ^W $L $v ^c u y5 Y2 u Y2 y5 -up1O06 -u d +7 -^U ,4 +u p1 O06 ^! ^U ] u ^t z2 -tp1O82 +t p1 O82 t i1l ^T ^G p3 ^T ^G t ^a -T6 $\ -$+ T6 $* T3 -$# T1 $s ^Y ^S ^W sP* t so* $s ^i $s ^a -s1*O42 +s1* O42 s>. $r $a $p Z2 @@ -2008,11 +1782,9 @@ $p Z2 p5 ^J $j p4 o3z p4 '9 -]p1O06 +] p1 O06 p1 o4v -p1 o0v p1 ^A -p1 '9 ^o ^S ^o ^B ] o73 @@ -2020,12 +1792,9 @@ o6/ Z2 o6S Z4 o6b o5z -o5j l $o $5 $) o5( o4I l -o4i l -o4b k o42 o2v o2[ K @@ -2039,14 +1808,13 @@ o03 ^N ^V $m Y1 $M $N -l i86 $L $D $' $L $L ^L $! ^$ ^L $k Z2 -KO07 +K O07 $k T1 k i32 k i1S @@ -2054,10 +1822,7 @@ k ^e ^K ^- $j ^w $! ^j c -^J +7 i8s } -i7_ t -i7! l i7B Z2 i6= [ ^i ^6 @@ -2070,31 +1835,21 @@ i48 Y4 i41 y5 i4_ ] } i4 -i3t [ } i3i i3a -i2m l i1l Y5 $h ^b ^G i1g ^G $* -f z1 u -f u z1 ^F ^U -^f .1 $F E $$ Y1 E $* i8* ^e ^C E $6 -$DO52 -dO49 -d u ,6 -d t +B -d o7c +$D O52 +p1 O49 d o63 -d +B t -d ,6 u d .6 D5 $A ^- ^D @@ -2118,7 +1873,7 @@ $@ $A ^/ ^8 $7 E $7 $A -*76O13 +*76 O13 ^7 *65 *75 L5 ^7 $! @@ -2128,10 +1883,10 @@ $% *58 $5 -7 .5 $. *45 -*41 +*14 *40 E ^@ $4 --3 Z1 +-3 Y1 $3 $A *30 c } $. ^3 @@ -2142,13 +1897,11 @@ $2 s 1 $1 T8 $1 ^M $1 ^B -*14 *12 ^H ^1 ^2 .1 $1 $1 $0 ^1 ^0 -.1 ^@ -1 ^0 ^X ^0 ^l @@ -2158,7 +1911,6 @@ $1 $0 ^_ ^@ $Z $X Z4 f k -z3 o2@ Z3 i2C z2 o1o Z2 i56 @@ -2166,8 +1918,6 @@ Z2 i5, z1 ^W } z1 y5 T9 -y5 oBY -y5 oAD Y5 o5d y5 i5 Y5 ] @@ -2178,7 +1928,6 @@ y4 i6v y4 i4_ Y4 C { y3 y3 -y3 i7 y2 o1e Y2 o0j Y2 i7e @@ -2187,27 +1936,23 @@ y2 i2n Y2 $A y2 *47 y2 { { -} y1 ^x ^X -O61Y3Y3 -O61$* -O51$C -O28t +O61 Y3 Y3 +O61 $* +O51 $C +O28 t O24 -O15z2t -O15tz2 -O08z3 -O07K -O04t$* -O04$*t +O15 z2 t +O08 z3 +O07 K +O04 t $* $x $\ $w $s ^W $J ^v z1 ^V $z ^V -u z4 z4 -u Z3 r +u r z3 u y4 Y1 u Y1 y4 ^u K @@ -2215,15 +1960,14 @@ u $D $A t Y2 Y2 t R6 R6 t ^Q z5 -tp1O74 +t p1 O74 t $h Z5 -t d D4 +p1 t D4 $t ^b t ^9 z5 T3 o05 T2 T0 -T1 *71 -T0dO06 +T0 d O06 ^s ^Z ^S y5 ssS @@ -2237,22 +1981,16 @@ s31 ^& ^S $. ^s ^R ^T -^R i0J ^R ^I ^R $B $r ^B $( R4 R4 R2 *62 $R +2 -r ^* -^= r ^q $w q '5 ] p2 [ -p1 Z2 u -p1O12{ -p1 u Z2 -p1 o5A +p1 O12 { p1 o1v $= p1 $O $o @@ -2263,10 +2001,8 @@ o8i o7! o6s l o5y -o5( o8) +6 o5( +6 o8) o2] y3 -[ o2v o26 } o2; o1r Z2 @@ -2287,10 +2023,7 @@ $m $l $M $1 $l $d l +A -^l *50 -k o4n K o3u -k i3k $k $g ^k ^b K ,1 @@ -2299,72 +2032,56 @@ $K ^$ ^j ^M $J $F ^J ^B -^J -9 iB $I .9 i8 E -i7K u -i6j l i5- i4' f -i4c u i4a $1 i4_ i3e ,5 i2z i3x i1a i0n ^N -i0l i0g ^a -i0* ^I $G $M ^g $g $. ^g -f z1 t -f t z1 f t -6 { f K ^F $f f -6 t E T5 -d Z4 } -d Y1 u -dO32u -dO05 -d u Y1 -duO32 -d t +p1 Z4 } +d O32 u +d O05 +p1 t d $A -d ^A D9 D5 ^x D4 $a D1 $4 -D0 t d ] [ c $@ Z2 $c ^s C i5T ^C ^I -cdO05 +c d O05 $c ^b c ] ] -$b Z1 z1 $b z1 Z1 $B *A9 $A y2 y2 +A l -$A i01 ^A ^B $a $b $a -6 $9 Y1 C -$9 C Y1 ^9 $a $9 +8 +9 $# -,8p1O06 +,8 p1 O06 $8 $d *85 L8 -8 ,5 @@ -2373,7 +2090,6 @@ $8 $d .6 ^5 z4 u -5 Y3 Y3 -^5 u z4 *53 i3C $! *53 $! i3C ,5 $! @@ -2383,27 +2099,20 @@ $3 $9 *35 Y3 *31 ^3 -,2 ^S $2 o0H -+2 ^I -*2BO14 -.2 ^2 -$1 Z1 -$1O93E +$1 Y1 +$1 E O93 +1 $v ^1 $S -$1EO93 ^- $1 ^0 ^c $# ^# $. $* $/ $* ^? ^/ -^Z $z ^z ^A Z5 o5W z2 o1J -z2 i1) } z2 c z2 *25 $. z2 $. *25 @@ -2419,31 +2128,26 @@ Y5 o0h y5 $A y4 i4, Y4 $@ -y3O63 -y3O62 -y3 o6f +y3 O63 +y3 O62 Y3 o0d -y2 o4; y2 o1c Y2 $a -} y1 l Y1 $. -^/ y1 $x ^z -O82l -O43$1 -O41$* -O41$. +O43 $1 +O41 $* +O41 $. O3B -O27y2 -}O27 -O26y2 -O21^y -O12C -O06z3 -O06y1 -O05c -O02$0 +O27 y2 +} O27 +O26 y2 +O21 ^y +O12 C +O06 z3 +O06 z1 +O05 c +O02 $0 $w Z3 $w $u $w ^n @@ -2455,14 +2159,12 @@ t y5 Y2 t Y2 y5 t o3. t +A -T8 $8 T7 T6 T5 T6 T0 T5 T6 -$! T5 T2 +0 T1 $t -T0p1O07 +T0 p1 O07 $! ^T sZ* t ^s ^t @@ -2475,22 +2177,20 @@ s21 ^S $! s>< ^r ^I -[ r d -R3O43 +[ r p1 +R3 O43 $Q Z2 ^P ^V p4 -p3O51 p3 'A -3 -p3 -3 'A -p1O06c +p1 O06 c p1 i7. p1 i7 $o Z2 $O u $o $P $o ^I -oB3O24 +oB3 O24 oB1 c o8h o8c @@ -2499,7 +2199,6 @@ o7c o75 Z3 o75 Y2 o6 Z3 -o6K y2 o6i o66 o64 $! @@ -2510,7 +2209,6 @@ o5F o56 $* o5 o4p Z2 -o3w [ o3w o2m l o0s $0 @@ -2523,15 +2221,9 @@ o0f K $M $P $M $a $m ^@ -} l z1 -} l y1 l T8 $l T5 -l o4i -l o2m -l o11 $l *64 -$l *46 ^L *15 k p2 'A K o5B @@ -2540,25 +2232,20 @@ K $A Z2 K $1 ^j ^t ^j ^l -^J *07 ^i ^l iAu iAD E -i89 l i7@ t i7s i7h T0 i5v Z2 -i5s l i4' y5 } i44 i43 i4< i4_ $3 i4 -i3U y2 i3s i3 E i36 ^a -i32 k i2W i2$ p2 i0l ^A @@ -2573,25 +2260,20 @@ E T4 E i6l $1 $e ^a E $1 i6l -d u D7 d t D1 -[ d r d ^q z1 ^D ^J -d D7 u -d D1 t D3 t D1 o2x ^D $d [ } c z2 -$C Z1 +$C Y1 ^c ^w c T9 c T4 $4 C T1 C p5 -c $4 T4 C $2 $1 c ^1 c $$ @@ -2604,12 +2286,10 @@ $\ +A ^a $@ { $9 $2 $# +9 -^* -9 -'8p1O05 +'8 p1 O05 $8 E .7 i6X -7 E $! --7 $! E .7 +9 ^7 ^6 *75 $o @@ -2617,19 +2297,15 @@ $6 i2e *67 *65 $. $6 $1 -$5 *82 $@ *57 -*52 y2 .5 .2 *50 o5* *50 *23 *14 -*50 *14 *23 ^3 ^R +3 o1m .3 $8 +3 $7 *32 k -+3 ^, $% -3 -2 i2e *20 ^T @@ -2650,8 +2326,7 @@ $! ^# } $. ^@ $Z Z2 -^zO31 -Z5 z2 Y5 +^z O31 Z5 Y5 z2 z4 K z3 { Z2 @@ -2660,72 +2335,58 @@ Z2 o4d $. Z2 E $* Z2 c z1 o4* -Z1 $? ^Z -1 -^yO31 -^YO14 y5 Z3 -y5O73 +y5 O73 Y5 o7Y y5 i5o u y5 i5, -Y5 d +Y5 p1 y4 y4 E y4 K -y3 Z2 t +y3 t Z2 y3 y3 t [ Y3 Y3 -y3 t Z2 -y3 t y3 Y3 *53 -Y2 Y4 t Y2 y2 -Y2 t Y4 -[ y2 t +[ t y2 Y2 o59 Y2 o3e y2 K Y3 Y2 i7_ -y1 i1# +z2 o1# Y1 *96 -Y1 $7 Y1 $- $- ^X z2 -O73$8 -O71$; -O61^J -O54R5R5 -O52R5R5 -O52$D -O51ud -O51du -O51$3 -O16C -O15u -O14c -O0Az3 +O73 $8 +O71 $; +O61 ^J +O54 R5 R5 +O52 R5 R5 +O52 $D +O51 u d +O51 $3 +O16 C +O15 u +O14 c +O0A z3 $w [ ^v $v $v .7 ^v ^u $s ^U ^C -t z5 y1 -[ t y2 -t y1 z5 -t y1 +t z1 t T8 -tp2O65 +t p2 O65 t o8# t o6) t i9L T8 ^1 T7 T8 T5 o0A -T3 $2 $* T1 ] t $* -] $* t ^t sz* sym @@ -2740,10 +2401,9 @@ sAI y2 s1R s1 k } s0% -^R l -} r l +r l { r i6c -^r i0e +^r ^e ^r ^A R2 z2 [ r @@ -2751,24 +2411,17 @@ q C -5 q -5 C $p $l p3 r -p2O5Bu -p2uO5B -p1 Z2 t -p1 y4 u -}p1O06 -p1 u y4 +p2 O5B u +} p1 O06 p1 u $8 p1 u $3 -p1 t Z2 p1 E p1 D3 -p1 $8 u -p1 $3 u $p ^o ^M $O $K oA5 -o9)O25 +o9) O25 o98 o97 o8# C @@ -2779,17 +2432,17 @@ o6U o5D o6u o6o o6e -o62O51 +o62 O51 $) o6( o5q o5 E o57 z1 o51 .4 o4@ $1 -o3l y1 +z1 o4l o3g o33 -o1yO21 +o1y O21 o1y o1k K } o1d @@ -2797,21 +2450,15 @@ o0@ T1 o0* t o0m Y3 o0h ^s -o0g p1 o0e o01 ^N E $n ^M -l z1 -lO54 -l t d +l O54 l R6 R6 -} l r -l o6s ^L $m ^l ^m -l d t L9 $) L6 $` K Y4 Y4 @@ -2822,13 +2469,12 @@ $k u ^k ^s ^k ^M ^j z1 -^JO35 ^J ^T ^J ^A $J ^* i7( E i7/ D1 -i6kO12 +i6k O12 i6@ k i5, Z2 i5g ] @@ -2841,65 +2487,50 @@ i31 ,4 i3 i2z ] i2r -i2pO42 +i2p O42 i2f $4 i2f i2a +0 i1S c i1q Y4 -i0s ^f i0o ^b i0n ^A -$* i0* +^* $* ^i ^H $Z ^H $f $k $f $b -$. E Z2 ^e y2 ^e ^m E iA E -4 $1 E $1 -4 -E $1 -$$ E ^e $^ -d y1 t -dO62u -dO31 +u p1 O62 +p1 O31 ^D $v -duO62 -d u *76 -d t y1 +p1 u *76 d t ^T -d t $2 -d i7H +p1 t $2 } d E [ d c -d *76 u D6 $1 -D5 t s0* D5 s0* t D3 t ] -D3 ^r D2 y3 D2 y2 D2 t -d $2 t -D0 p2 ^d -$* c Z2 -$C Y1 $c Y1 -$CO32 +$C O32 ^C ^M ^c ^f c *65 Y4 C ^1 $B ^B -$aO63 +$a O63 ^a ^S ^A ^M ^a D3 @@ -2913,37 +2544,31 @@ $A $b ^9 ^0 *86 $) *86 -$8 *58 -$% *85 $8 $1 ^8 .7 o64 $7 *A5 $7 ^5 -7 ,5 -*70 .2 ^, $7 -$6 Y1 .6 i63 $6 i4s ^6 $6 *64 $l --6 *34 +*43 -6 $5 Z1 *54 $. *53 -0 -*43 -6 $. *43 *40 c +4 --3O03 +-3 O03 .3 o13 *35 .4 -*30 $b $2 Z1 ,2 Y3 y3 ,2 y3 Y3 -$2dO04 +$2 d O04 $2 C .2 -5 *21 *54 @@ -2951,24 +2576,18 @@ $2 C *20 $! $! *20 ^2 $& -$1O52 +$1 O52 $1 ^S -^1 l $1 iAs $1 i4& $1 i3- -$1 *48 ,1 *41 -*13 -2 ] ^1 ^1 $- -^# -1 --0 t d +-0 t p1 .0 i1t --0 d t $0 $9 -*05O51 -*04 E +*05 O51 *03 .3 $+ $. $& $* @@ -2980,9 +2599,8 @@ $= ^@ $@ ^Z z1 c $z Z1 -z4O0B -z3O08 -z3 $S +z4 O0B +z3 O08 Z3 o7B Z3 o6- z3 ^M @@ -2992,54 +2610,42 @@ $# Z2 $. Z2 $/ Z2 $- Z2 ] -Z1 i6M -Z1 *96 +Y1 i6M $z ^# $Y u $y $t ^y ^t y5 E $1 -y5 $1 E y4 y3 -y4O09 +y4 O09 Y4 i21 y3 Y3 Y3 u Y3 $. Y2 z1 Y2 -Y2 Y2 z1 Y2 i6- -y1 ^t $* Y1 k Y1 i6S $. Y1 +1 -$< Y1 -y1 $X Z2 $x Z1 $x $y -O73^# -O71$. +O71 $. ^X $7 -O51p2O0B -$*O46 -O42R3 -O31^r -O2At -^\O24 +O51 p2 O0B +$* O46 +O42 R3 +O31 ^r +O2A t +^\ O24 O19 -O14f -O13*43 -O12^\ -O07y2 +O14 f +O12 ^\ +O07 y2 ^w ^h $! ^W -^v y1 -^V ^s l ^V l ^s $$ ^v -u Z1 y4 -u y4 Z1 $u ^t $U $E $t $i @@ -3047,7 +2653,6 @@ TA ^1 T7 i6. T6 o1) T4 T1 -$* T4 ^s z1 sX* $s $w @@ -3057,29 +2662,22 @@ ssg $S $s $s o6f $S $J -^S i0E si* -^S d +^S p1 $s $d sbB s5# } ^s ^5 s45 s3N -$S *32 -s2P $S *23 +s2P $S $1 ^( s _ -r Z4 z4 -r z4 Z4 -[ r p1 -r o5x o3z +z4 r z4 r o3z o5x ^r ^J -^r ^e R5 t '6 -R5 '6 t $r .5 R2 y2 ^R @@ -3087,47 +2685,29 @@ R2 y2 ^p ^l $p k ^p ^J -p4O53 +p4 O53 $p *42 -p3 Z1 { -p3 r d -p3 d r +p3 Y1 { +p3 p1 r p3 $8 $! p3 -p2O6Au -p2uO6A -p2 r l +p2 O6A u p2 l r p2 '9 -p1 Z1 u -p1 Y1 u -p1O84t -p1 u Z1 -p1 u Y1 -p1 u i71 -p1 u 'A -p1tO84 -p1 t D6 -p1 t $7 -p1 t $1 -[ p1 r -p1 oB7 -p1 o2M -p1 i7b +p1 O84 t p1 i71 u +p1 'A u +p1 t D6 +p1 $7 t p1 i7+ p1 E T1 -p1 D6 t -p1 'A u -p1 $7 t p1 ] $2 -p1 $1 t ^o ^n ^o ^g oAA l oA2 o9y u -o8! Z1 +o8! Y1 o8. o7o T5 o7f @@ -3145,9 +2725,8 @@ o5l o5( $) o5- $. o5. -o4-O51 +o4- O51 o4i -o44 l o4, o3_ R2 o3k @@ -3157,16 +2736,15 @@ o2S T4 o2s o2q *70 o2M } -o2k t o2d o29 -o2! ,3 +o3! o2! o23 o21 o1Y Z4 o1o o1a -0 -o14 d +o14 p1 o0V $1 o0T $1 o0q @@ -3181,11 +2759,10 @@ o04 ^n ^m i1w $M ^F -lZ2O24 +l Z2 O24 l Z2 -lO24Z2 +l O24 Z2 l o7c -l ^n $) L9 $L $1 k $+ Z1 @@ -3198,7 +2775,6 @@ k K k D2 ^k K $@ ,7 K ,7 $@ -k *23 $K $1 [ k ^J ^C @@ -3210,11 +2786,10 @@ i82 l i81 i8 i7_ Y2 -i6xO03 +i6x O03 i6S Y1 i6s c i6. o5, -i6M Z1 i6M Y1 i67 Y2 i6# .5 @@ -3238,15 +2813,11 @@ i20 .1 i2 i1x ^t i1d ] -i0A $! ^H ^R $G o0g ^g ^f -fOA2K -^f ^n o0b -fKOA2 +f K OA2 f C .6 -f .6 C ^f f $e Z2 @@ -3258,55 +2829,45 @@ E ss8 ^e *54 ] ^e ^d z1 -dO94t -dO14 -d u D5 -d u $0 -dtO94 -d t *57 +d t O94 +p1 O14 +d D5 u +p1 u $0 +p1 t *57 ^d ^s d i7q -d i60 +p1 i60 $d i4s -d D5 u ^d ^C -DA i4 c +DA i4 c ^d ^A D7 $; D6 ^J D6 $5 D5 i2y -d *57 t ^d ^2 $D $1 -d $0 u D0 t d -D0 d t -$= d -cO31$9 +c O31 $9 C sI& c oA0 C o11 ^C ^F ^c ^e -c$9O31 -$$ c +c $9 O31 [ c $! -[ $! c $b q $b i3f -^b i0s +^b ^s 'B $b $# $a ^w ^A $U $a D4 -*A6 $O ^A $2 $9 i33 $. $9 $. i33 *9A $B -+9 .7 $9 $4 $' ^9 -8 i8@ @@ -3315,10 +2876,8 @@ $8 $6 $- *86 ^8 ^0 ^7 i1e -$7 *5A $! +7 ^6 z2 --6 R5 '6 p1 E *68 l *63 .2 @@ -3331,11 +2890,8 @@ $! ,6 .5 o0T ,5 i2& ^5 ^b -+5 *46 --5 .2 +5 $! '4 Y2 y2 -'4 y2 Y2 .4 i75 ^4 -8 *46 *35 @@ -3343,23 +2899,17 @@ $! ,6 *43 +0 $3 Y1 ^3 u $! -^3 $! u *36 ,2 -*34 -6 .3 *45 *32 i5s *32 *24 -*31 -2 *30 i4g .3 $2 $s *16 ,2 i3C *27 i4w -*24 -^+ *23 *21 ^P $2 *16 $s -^2 *04 $. +1 Y1 ^1 o1H $1 ^d @@ -3367,13 +2917,10 @@ $1 ^d $1 $4 $1 -2 $- $1 -$0O02 --0 u d --0 d u -*05O23 --0 *53 +$0 O02 +-0 u p1 +*05 O23 $0 *43 --0 *35 .0 +2 $+ $& @@ -3388,98 +2935,75 @@ $z $j ^z ^a $. Z4 $ Z4 [ -$ [ Z4 z4 { { Z3 { Z2 -z2 Z5 Z5 -Z2 u p1 -Z2 p1 u } z2 l Z2 $a ^ z2 *43 -Z1 y4 u -Z1O61 -Z1 u y4 -z1 o4l -z1 i1D -z1 i1# +Y1 O61 +z2 o1D Z1 $a -Z1 -3 +Y1 -3 Z1 $! $Z $1 $. Z1 } z1 $* -} $* z1 $Z ^Z -Y5O74 -Y5O23 +Y5 O74 +Y5 O23 y5 t ] -Y5 p1 y5 o7c y5 ^A $= Y5 y5 [ y4 y4 C -y4O64 +y4 O64 y4 o4v y4 o0K Y4 o0+ y4 i4r y4 i4 Y4 $1 -Y3 Y3 y1 +Y3 Y3 z1 ] Y3 Y3 -Y3 y1 Y3 +Y3 z1 Y3 Y3 i7- -Y3 *35 -y2O42 -Y2p1O07 +y2 O42 +Y2 p1 O07 Y2 o4d Y2 ^L -y1 Y3 Y3 Y1 p1 'B -y1 o67 Y1 o5c Y1 i6X $. Y1 D1 -$x Y1 t -^X $x $x t Y1 +^X $x ^x sxl $m -^x $m sxl $x $d $x $c O84 -^#O62 -$.O61 -O51y5t -O51ty5 -O43R3 -O41$1 -O31k -O25z1 -O24o73 -O16z2t -O16tz2 -O14t -O12dO04 -O08p2 -O05z3 -O03Y3Y3 -O02+5 -$w Z2 [ +D6 $. +O51 y5 t +O41 $1 +O31 k +O25 z1 +O16 t z2 +O14 t +O12 d O04 +O08 p2 +O05 z3 +O03 Y3 Y3 +O02 +5 $w [ Z2 $w Y1 $w i3s ^W $v $V ^v svM $M -^v $M svM $u Z4 Z4 u Y1 -uO34t -utO34 +u O34 t ^u ^s u o1R [ u ^K @@ -3489,16 +3013,13 @@ t y4 ^t ^w t sD4 ^t ^S -tp2OB5 +t p2 OB5 t o3X $t ^l ^T ^B T8 T2 -T5 o7o T5 i7! T4 i1& -T4 i0/ -^T *31 $. T3 T2 $1 T0 o4D @@ -3518,25 +3039,19 @@ sCf sA- s6V { s6O -^s *65 s51 s25 s2% ^s ] -r z5 Z3 -r Z3 z5 -r Z3 y5 -r y5 Z3 +z3 r z5 +z3 Y5 r +Y5 z3 r ^R $r ^r ^M -r l { -r { l ^r ^j r i26 -r c $! r $! c [ R8 R8 -^r +3 R0 i4$ r -0 $R @@ -3546,29 +3061,19 @@ $. $q ^p ^t ^p ^j p3 '9 -^P *32 p2 ] Y3 -p2O5Au -p2O38 -p2uO5A -p2 t r +p2 O5A u +p2 O38 p2 r t p2 $3 -p1 y2 t p1 t y2 -p1 t *67 -p1 t *57 +p1 *67 t p1 o6@ ] -p1 ] o6@ p1 i6a -p1 D6 c p1 c D6 p1 c -5 p1 'A *54 -p1 *67 t p1 -5 c -p1 *57 t -p1 *54 'A p1 ^2 ^. ^p $O Z2 @@ -3576,16 +3081,15 @@ $O oA* ^o ^I oB8 D8 oA3 c -$ oA* +$ oA* o9n -o9I Z1 +o9I Y1 o9h o98 Y2 o90 o8k o8A o7v -o7$ *03 o6 Z1 Z1 o6_ Y3 o6r @@ -3617,7 +3121,7 @@ o2g t o27 $! o21 o1Z .3 -o1) Z1 +o1) Y1 o1y C o0p o0m +2 @@ -3625,7 +3129,6 @@ o0j *64 o0d Y3 $! o0d o0* c -o0* { o0- { ^m z2 ^m z1 @@ -3635,36 +3138,29 @@ $M $m ^m $h $M ^1 $l Z2 -} l z2 l srR l sab -l o7? l o3. ^L i1u l .A -L7 *75 L7 *57 L4 i1d L4 ] L1 K Y2 C -KO81 -[ ^K u -K t d +K O81 +K t p1 $K ^k k i48 K i2k K i1j -K d t K C Y2 ^K ^5 -k *32 $- $k ^k ^j ^s $j $r ^j ^n -^J D7 $! ^j $I $T iAs ^S K @@ -3681,19 +3177,16 @@ i79 $. i7. i6- Z2 i6y -i6X Z1 -i6S Z1 +i6X Y1 i6d i6 -i5v [ i5r -i5JO13 +i5J O13 i5F $. i55 i5@ i5, i5 ] -[ i5= i4, Y5 $. i4x } i4i @@ -3702,7 +3195,6 @@ i4 .3 i3F '8 i3- i2n ,9 -i2M l i2k K i23 ^a t i21 @@ -3716,10 +3208,8 @@ i11 $3 $. i0q ^w i0j ^m i0H z1 E -i0c i0a ^l $1 $h $b -^H *32 ^g ^r $g i2j ^g i1t @@ -3727,41 +3217,32 @@ $g i2j $F p5 $B ^f ^l $f $b *10 -$f *10 $b $f ^e ^w E T3 -E q Z1 +E q Y1 E o6Q -E iA# ^e $E E D4 $7 ^e ^9 E $7 D4 -d y1 u -dO73] -d]O73 -d u y1 -d u $s -d u i67 -d u +8 -d u *57 -d t $A -d t .5 -d o0h -d i8; -d i7@ +d O73 ] +p1 u $s d i67 u -d i50 +p1 u +8 +p1 u *57 +d t $A +d .5 t +p1 o0h +p1 i8; +d i7@ +p1 i50 ^d ^h -d c $5 -d +8 u +d $5 c +p1 +8 u $; D7 D6 $? -d .5 t D5 $r -d $5 c -d *57 u D4 o2h D4 o0D $! D4 @@ -3769,14 +3250,12 @@ D2 ^y D2 $= $. D1 Y1 D1 t -D1 ^9 $d $1 c $? Z1 c Y2 Y4 -c T7 ] c ] T7 C sI1 -cp1O03 +c p1 O03 c o6Q c o5M ^C i0T @@ -3791,10 +3270,9 @@ c $1 ,9 c $% ] ^c ^c $@ -^B Z1 +Y1 ^B ^B ^A ^b ^a -$B *9A ^A z2 +A t ^a o1z @@ -3815,38 +3293,26 @@ $. -9 ,8 o3a *89 $. $8 $9 -*86 l -8 $* ,7 i7u $7 $8 $% *78 --7 ^4 $. $7 { -7 $6 $x -*68 $) -*64 +5 *62 R6 ,6 -5 o6i $5 i42 -*58 L8 *57 o3e -*57 L5 -*54 ^7 -$. *54 -*53 Y3 *53 o5z -*50 D5 $5 [ ,4 u p1 -,4 p1 u ,4 o6t +4 o0M ,4 i4x $4 E *42 $p -*40 ^L [ $4 -4 $. ^. -4 { @@ -3855,16 +3321,11 @@ $3 Y4 Y4 ,3 d 'A .3 D2 ^3 ^8 -*34 ^e *32 $S -^+ *32 $. $3 $2 Y3 Y3 $2 o0k $2 $M -,2 *63 -*25 y2 -*23 k $2 $3 *21 o5l ^1 ^r @@ -3872,63 +3333,43 @@ $1 ^O ^1 i1e $1 $E ^1 ^d -$@ *1B ^1 ^A $1 $8 -*16 $! $1 .1 ,1 -0 $1 $. ,1 ^* $1 --0 ^Z --0 t p1 -+0 T2 --0 p1 t +0 o3z +0 o3w $0 i7_ -*07 .2 -*06 ^c +0 *54 -*04 c -*03 o7$ -*01O17 +*01 O17 +0 *12 *01 $. $. $# $$ -$* [ $- $+ ^( $) ^! $* ^! $! $z $Z ^z ^l -Z5 Z5 z2 } z5 Z3 -Z5 z2 Z5 -Z4 Z2 -Z4 r Z4 +Z3 Y3 Z4 f K -} Z3 z5 -} Z3 z3 } z3 Z3 Z3 } z2 Z3 Y4 -z3O47 +z3 O47 Z3 o5, Z3 o4& $? Z3 z2 Z2 p2 Z2 o68 -z2 o1D -z2 i2Q $? Z2 ] Z2 -Z1 o38 -z1 i1o -z1 i1J -z1 i1j +Y1 o38 +z2 o1j Z1 E T1 z1 $a $# Z1 @@ -3940,100 +3381,76 @@ $y $u ^y ^f Y5 Y3 [ Y5 [ Y3 -y5 y1 u -y5O75 -y5O74p3 -Y5O23u -y5O03 -y5 u y1 -Y5uO23 +y5 z1 u +y5 O75 +y5 O74 p3 +Y5 O23 u +y5 O03 y5 u } -y5 } u -Y5 r Z3 -Y5*08O53 +Y5 *08 O53 $= y5 Y4 Y4 c Y4 Y4 ] Y4 ] Y4 -y4O02 +y4 O02 Y4 i4r y4 i4- Y4 c Y4 y4 *A3 y4 $? y3 Z2 l -Y3 z1 Y3 -Y3 Y3 z1 y3 { Y3 y3 o0q -y3 l Z2 Y3 i4v Y3 $A y3 -Y2 Y2 c +Y2 c Y2 Y2 } r Y2 o4H y2 o1j -Y2 c Y2 y2 *52 $. y2 $. *52 y2 $. .2 -y2 .2 $. -y1 ^W -Y1 u d -Y1 o38 -Y1 d u -Y1 ^B -Y1 *69 +Y1 u p1 $= Y1 -$xO31 -OB2i7i -O91$U +$x O31 +OB2 i7i +O91 $U O82 -$.O81 -O62u -O62i36 -O61$? -O51o0p -O34u -O32$C +$. O81 +O62 u +O62 i36 +O61 $? +O51 o0p +O34 u +O32 $C O32 -O28y2 -}O25 -O21$= -O17Cz2 -O14^\ -O13i1R -O09z2 -O06Y4 -O04K -O02$1 +O28 y2 +} O25 +O21 $= +O17 C z2 +O13 i1R +O09 z2 +O06 Y4 +O04 K +O02 $1 $X $W Z2 -^w i0p ^w $. $v Z2 -u z5 y3 -u z3 y3 -uO52t -utO52 +u O52 t u T1 -u p1 +7 ^u ^h u 'A t Y2 y2 -t y2 Y2 -t T5 T4 t T4 T5 ^t $T t sL* t t $S t p5 -$t oB1 C -^t ^J o1R +$t C oB1 ^t i0k ^t $h -$t C oB1 T9 T2 t ,9 T6 o0$ @@ -4046,19 +3463,17 @@ T3 i8W T3 i2H [ T3 i0N T2 o5a -T2 *36 $. T2 $! T1 t $1 T0 ,1 ^s ^z syi -^sO51 +^s O51 sS* t ] $S ^s -$S R9 o7( -soe $S o7( R9 +soe smM sK* sdt @@ -4073,59 +3488,41 @@ s-1 p2 $. s19 ^S s-. -^rO41 r p1 E RA K R6 R6 D7 -R6 D7 R6 -R3O42 R3 o2e R3 i3$ R1 t K R1 R1 -R1 K t ^r -q sqa q *65 *12 -q *12 *65 $q *05 $p $k p5 'A -p4 Z1 p4 ^u -^,p3O86 -p3 l } +^, p3 O86 p3 } l -p2O84u -p2O64u -p2O57t -p2O12{ -p2uO84 -p2uO64 -p2tO57 -p2 p4 +p2 O84 u +p2 u O64 +p2 t O57 +p2 O12 { p2 *74 p2 ] p1 y3 u -p1O72q -p1O34t -p1 u y3 -p1tO34 +p1 O72 q +p1 O34 t p1 t ^A -p1 o0K p1 i7- $P ^P $! $o Z1 u -$o u Z1 -oAa l oA5 T0 oA4 ] oA4 o9q o9O u o9a $A -o8! Y1 o8p o8% -0 o7y t @@ -4135,20 +3532,17 @@ o7% T5 o7p [ o7d o75 $! -o73 ] -o6) t o6s o6m o6@ k o6. *41 -o5+ Z1 +o5+ Y1 o5r L5 o5l K o5K *51 o5B K o5A c o59 ,4 -$o *57 o55 +7 ] o5! o4y L6 @@ -4157,7 +3551,7 @@ o4/ T5 o3Y C o3w *30 o3v -o3RO12 +o3R O12 o3r +2 o3h o3d Z2 @@ -4172,8 +3566,6 @@ o2k o2F +0 o2c o24 -o1Y C -o1s ] ] o1s o1R R5 o1k +4 @@ -4208,7 +3600,6 @@ $N $Z ^n $N $n $m ^n ^m -^N l $! ^N ^m y1 C $M ^m @@ -4216,44 +3607,33 @@ $m $g $+ ^m $l Z3 $L Z2 -l i82 $l $i L7 o2z L6 o0t -l *68 -L5 *85 L5 *58 ^l $. $k Z2 k K Y2 t -K t Y2 -K t p1 K q z5 -K p1 t K o75 K o6i -K l d +K p1 l k l .3 $k k Z2 $K $k K i3k k ^h $K E $b -K d l ^K $d -$K $b E K $4 -k .3 l K $3 k .1 ^K $! k { $J ^j -^j i0w ^j $d } ^. ^j -$iO51 -^I l +D5 $i ^i i0V iA# c $! i9! E @@ -4268,7 +3648,6 @@ $@ i7i .7 i79 -3 i73 i6. z1 -i6X Y1 i6l *13 i6j i6 i1 @@ -4276,7 +3655,7 @@ i6A u i66 i64 -7 i6% $1 -i6% [ +[ i5% i5s -7 i5n $A i5j -4 @@ -4285,7 +3664,6 @@ i5h i5c *25 i51 ,6 $! i5# -[ i5% i4t i4@ ,5 i4t -2 i4r T6 @@ -4299,113 +3677,82 @@ i3x i5z i3% T2 i3s ^f i3N -5 -i3LO53 +i3L O53 i3b +5 i39 $. -i38O71 +i38 O71 i37 ] i2z i2t T3 i2K o2w -7 -i2K -7 o2w -i2iO63 -i1N C +i2i O63 i1c ^a i1A y2 *30 i12 *7A i0y $y -i0l i1s -i0h +^s ^l i0f i08 i0e i2c -i0C ^L -i06O03 +i06 O03 ^H ^N ^h ^C $H $1 ^H $1 ^g z1 ^G ^S -f Z2 .3 +f .3 Z2 ^f $z f Y3 k -fO82u -fuO82 +f u O82 f k Y3 ^f i16 $F i0S $f $g ^f $g -f .3 Z2 $f $1 E Y4 ^e p4 ^J -Ep2O0B +E p2 O0B E o6{ E o5S E o2y -$! E i9! -E i7( -^e i0C E *87 $1 -^e *45 ^e $4 E $1 *87 $E $1 ] E ^1 $E -d y2 t -d Y1 t -dO45u -dO23u -dO12t -duO45 -duO23 +d O45 u +u p1 O23 +p1 t O12 $D u i59 -d u +7 -d u $2 -d t y2 -d t Y1 -dtO12 +p1 u $2 d t o11 d t ^1 -d t [ -d o11 t +p1 t [ d i7; -$D i59 u -di0eO04 +d i0e O04 $D $d -d c 'A -DB d 'A c +DB $D $a -D8O51 +D8 O51 ] D8 -d +7 u D7 T0 ^1 d +7 r $@ D5 d -5 D4 i2@ D3 y3 c -d $2 u D2 t $* -D2 $* t D2 $1 -d ^2 -d ^1 t -D1 i6/ D1 E -} D0 $c ^u C t o6* c q Y1 -C o6* t c o3x -C o0G -C i9L +o0G u c i7( -^C i1B $C D5 c D3 $7 $c $d @@ -4414,7 +3761,6 @@ c $2 Y1 $. ^c $c $b Z2 -^B Y1 ^b ^u ^b c ^H ^B ^a ^1 @@ -4424,11 +3770,10 @@ $B *40 $b *30 $B $1 $a Z5 Z3 -$a Z3 Z5 $a $z $a Y2 ] $a Y1 -$aO93 +$a O93 $a $q $a $n $a ^j } @@ -4448,70 +3793,50 @@ $9 ^A $9 [ $8 D0 $_ *8A -*87O02 -*87 $% -$% *87 +*87 O02 +*78 $% $. -8 -7 o65 -7 o6 +7 +9 -*78 $% *78 $. $7 ^6 -^7 *56 *75 $@ *73 $. *71 { +7 +6 p1 'A +6 o82 -,6 i7o +6 i4H +6 d [ $) *68 -*67O13 --6 *43 *63 *14 -*61 ^6 ^0 +6 $. ^! .6 -,5 p1 { ,5 { p1 ,5 o41 .5 o3D $5 i6s ^5 i0d $5 ^e -*57 $o -*56 -*54 ^s $5 $4 $5 ^4 *52 o5v *52 -5 *52 -*50O23 +5 ^! .5 $@ --4O51*34 -^4O12 +-4 O51 *34 ,4 o1G +4 o10 -4 $c $e -*46 *53 -*45 ^7 -*45 $. .4 *43 -,4 *35 --4*34O51 *43 $0 $4 ^1 -*40 $B *40 $. $4 $! $^ ^4 --3 Y1 ,3 o0v .3 o02 -3 i3 @@ -4520,22 +3845,17 @@ $3 $D *30 i7# $3 $! ^@ $3 -$2O51E +$2 O51 E +2 o0M -2 i2S .2 i2a -$2EO51 $2 ^e $2 [ c -.2 *70 -*26 R6 *25 *60 *23 y3 -*20 $. -2 $1 Z3 $1 Y2 --1 Y1 $1 $X ^1 $X $1 $S t @@ -4548,8 +3868,6 @@ $1 i7_ .1 i2o $! *16 *14 o4- -*12 -,1 *14 $1 $* ] $1 ^1 $# @@ -4562,10 +3880,7 @@ $1 $* +0 i6T +0 i67 $0 ^d -*05 $q -*04 ^L $@ *02 -$! *02 .0 +1 $0 $+ $0 $! @@ -4577,21 +3892,13 @@ $z $p *70 $z L7 $z i0y *80 ^z $h -Z5 Z2 Z5 Z1 u -Z5 u Z1 $* Z4 ^z +4 -Z3 Z4 -Z3 Y3 -z3O0B -Z3 u r +z3 O0B Z3 s15 -z3 r y5 -Z3 r u Z3 o7- Z3 o56 -Z2 Z4 z2 Z2 $ Z2 k Z2 i7B @@ -4602,34 +3909,27 @@ Z2 $@ $` Z2 ^# z2 z1 y4 y4 -Z1 u d -$$ Z1 T1 -z1 o67 -Z1 o3N +$$ Y1 T1 +Y1 o3N Z1 i9@ -z1 i7B -Z1 d u Z1 $b -Z1 *69 Z1 $1 -Z1 -1 -$ Z1 +Y1 -1 $z [ ^y ^w -y5 z1 t -y5O42 -Y5O32K -y5O12 y5 t z1 +y5 O42 +Y5 O32 K +y5 O12 Y5 s83 y5 o5p y5 o1v -Y5KO32 +Y5 K O32 y5 +5 } } Y5 Y4 y2 -Y4O72 -y4O52 +Y4 O72 +y4 O52 Y4 o8g y4 i4E y4 i4b @@ -4638,80 +3938,66 @@ Y4 C Y4 { { y4 $. Y3 Y3 t -Y3 Y3 E +Y3 E Y3 $+ Y3 Y3 -y3O62u -Y3O61 -y3O53o0s -y3uO62 -Y3 t Y3 -y3o0sO53 +y3 O62 u +Y3 O61 +y3 O53 o0s y3 i3y y3 i3, -Y3 E Y3 y2 Z1 E -y2 y4 u -Y2O71$. -Y2$.O71 y2 u y4 +Y2 O71 $. +Y2 $. O71 Y2 s1? Y2 o8. y2 o1o y2 o1D -y2 E Z1 -y2 '6 Y2 Y2 *25 y2 *04 ^* Y1 y1 -^* y1 Y1 -y1 o27 +o17 z1 Y1 i8. -y1 i1J -Y1 -3 Y1 $* O92 -O62E -O62$@ -O61o3p -O61i38 -O53o3M -O52o6k -O51o2@ -$.O51i5y -O45i4i -O43o3f -O42i5p -O42i3j -O42i2f -O42$1 -$*O42 -[O42 -O41$ -O32t -O31^x +O62 E +O62 $@ +O61 o3p +O53 o3M +O52 o6k +O51 o2@ +$. O51 i5y +O45 i4i +O43 o3f +O42 i5p +O42 i3j +O42 i2f +O42 $1 +$* O42 +[ O42 +O41 $ +O32 t +O31 ^x O28 -O26u -O24Y2y2 -O24y2Y2 -O24p4l -O24lp4 -O23y2 -O21y5y5 +O26 u +O24 y2 Y2 +O24 p4 l +O23 y2 +O21 y5 y5 $x $2 -O19Y2C -O19CY2 -O18C -$!O13c -O13*34 -O12i6X -O12$C -O09z1 -O03y4y4 -O03i1Y -O03i1t -O02f -O02$. -$.O01i0b +O19 Y2 C +O19 C Y2 +O18 C +$! O13 c +O12 i6X +O12 $C +O09 z1 +O03 y4 y4 +O03 i1Y +O03 i1t +O02 f +O02 $. +$. O01 i0b $! ^x ^w ^W $W o6W @@ -4723,23 +4009,20 @@ $w $l u TB u sE* t u R6 t -up2O86 -up1O42 +u p2 O86 +u p1 O42 u p1 ,8 -u p1 +6 u o5D u $M u K d u i79 ,7 -udO53 -u d ,7 +u p1 O53 +u p1 ,7 $U $u ^u $# -t z3 y3 -t z1 -ty4O62 -tO82 +t y4 O62 +t O82 t ss3 t sa1 ^T ^S @@ -4755,7 +4038,6 @@ t D8 ] t ] D8 t D8 t D6 -t .A T9 ^U o01 T9 T5 T8 o70 @@ -4765,7 +4047,6 @@ T5 i4@ T5 $7 T4 Z4 y5 T4 y5 Z4 -T4 o0T T4 o0L T4 $5 T4 $$ @@ -4774,19 +4055,16 @@ T3 o59 T3 i7K T2 o4f T2 o1M -T2 *63 $@ T2 -$$ T1 Z1 T1 o6M T1 o0$ T1 i7$ T1 i4h -^T *13 T0 q T0 $* ^! $T sy" -$sO31 +$s O31 $s ^X sua stR l @@ -4796,7 +4074,6 @@ ss8 E sS3 l ^s ^p p4 spP -^S p1 ^s ^] o0G so0 sMg } @@ -4832,19 +4109,14 @@ s0- $* ^S ^S $. ^r y1 E -rO0Ar -rp2O0A +r O0A r +r p2 O0A ^R ^L -R5 R5 '6 -R5 o1R -R5 '6 R5 R4 R2 o6h -R2 *26 R1 t $. ^r -qO21t -qtO21 +q t D2 q t -5 $q r $Q $Q @@ -4852,7 +4124,6 @@ q q $q i5w q E $1 q -5 t -q $1 E $P Z4 Z4 $P ^p ^p ^n @@ -4864,54 +4135,30 @@ p5 Y3 $! p5 ] ] p4 i4i p4 $d $f -p3 i0T p3 f p3 '8 -p2Z1O68 -p2O79u -p2O68Z1 -p2O3Au -p2O05q -p2O03 -p2uO79 -p2uO3A +p2 O68 Z1 +p2 O79 u +p2 O3A u +p2 O05 q +p2 O03 p2 T0 '9 $- p2 'B p2 'A .3 -p2 '9 T0 -p2 *47 -$p *24 -p2 .3 'A -p1 Z4 } -p1O83t -p1O43u -p1O31u -p1uO43 -p1uO31 +p1 O83 t +p1 O31 u p1 u o0M p1 u i82 -p1tO83 p1 t o63 -p1 t K p1 t i82 p1 t +A -p1 t *81 -p1 t *75 +p1 *81 t p1 ^t -p1 oAA 'B -p1 o63 t -p1 o0M u -p1 K t -p1 i82 u -p1 i82 t +p1 'B oAA p1 i7A p1 i6v p1 i6k -p1 i50 -p1 'B oAA p1 +A t -p1 *81 t -p1 *75 t ^o ^N oB1 oAi @@ -4923,8 +4170,7 @@ o9k o93 o8u o8t -o88O93 -o81 sa4 p3 +o88 O93 o81 p3 sa4 o81 $* o7% Z2 @@ -4932,8 +4178,8 @@ o7x .6 o7l o7j o2y o7j -o7I Z1 -o7H Z1 +o7I Y1 +o7H Y1 o7g +8 o7e o7b @@ -4942,22 +4188,19 @@ o6z o6x .7 o6* t D0 o6s $1 -[ o6p o6p o6L *70 o6L *64 o6E ,4 -o6* D0 t o6d o6a o69 $! -o5WO23 +o5W O23 o5s +3 o5- o2- o5L +9 o5g o5f -o57 y1 o5$ *75 o5; +6 o51 R6 @@ -4965,7 +4208,7 @@ o5+ o4y o4t +6 o4I y5 E -o4iO54 +o4i O54 o4f o4c o4b @@ -4973,28 +4216,23 @@ o4a $s o4& ,3 o4@ ,2 o4- +2 -o3zO42 -o3* z1 +o3z O42 o3y o3x E -o3X c o3m *03 o3K *74 o3a $1 o2y c o2@ Y4 E -o2w -0 o2u E o2t o2o o2n *02 -o2M l o2k *75 o2@ E Y4 o2C *31 o2b L5 o25 -o2, .0 $. o1y o1w *53 o1v @@ -5002,19 +4240,14 @@ o1u D3 o1U c $. o1u o1p *23 -o1o ] ] o1o o1n *36 -o1M T2 o1L sLe [ -o1L [ sLe o1i c -o17 z1 o14 Y5 -o13 .3 -o11O42 +o11 O42 o1- -o0) Z1 +o0) Y1 o0w z2 o0w $W o0v -5 @@ -5027,14 +4260,13 @@ o0M $3 o0l $. o0k o0j -9 -o0G u o0g t o0C i0F o09 ^0 $O ^n o1s { { $n -$MO41 +$M O41 $m $u ^M o6f $m $k @@ -5043,20 +4275,15 @@ $m *32 ^m $1 } ^m l Y2 y2 -l y2 Y2 $l u l sa1 -l oAa l ^N -l ^i -$L *A5 $L *5A -^L *51 l *45 L2 L1 o5v L0 -0 -[ $. ^l +$. o0l $ k Z2 k y4 y4 K t ] @@ -5064,8 +4291,6 @@ K t ] k t K srb K smk -k s1 -k o6@ K o3c K o1k K o0f @@ -5078,13 +4303,12 @@ $k $j ^K i0P ^k ^f k D0 $a -k $a D0 K -3 K *21 k *21 ] K -1 K ] -^jO14 +^j O14 $j i3- $j $g ^j ^g @@ -5097,20 +4321,17 @@ i9L t i91 i9. i9- -i7#O23 -i7-O14 +i7# O23 +i7- O14 i7c l -i7( c i7. .6 i6n *12 i6- K i6k ] i6. i9. i6f -i6B z1 i6* $* i6* -i5T C i5S u i5s i5 D1 @@ -5124,10 +4345,10 @@ i51 $! i5_ $# i5@ $@ i5@ -i4yO62 +i4y O62 i4y $1 i4v $x -i4tO03 +i4t O03 i4s T6 i4p Z2 i4g $s @@ -5142,7 +4363,7 @@ i4- ,5 i44 i4@ i4, -i3yO61 +i3y O61 i3y o4- i3y D6 i3x $f @@ -5150,9 +4371,7 @@ i3U R7 i3* t D4 i3q $b i3q ] -i3jO52 i3i -i3* D4 t [ i3d i3A -0 i3= .2 @@ -5161,7 +4380,7 @@ i3@ i2x i6s i2s i05 i2p *43 -i2hO52 +i2h O52 i2g i2f *03 i2d ^6 @@ -5174,20 +4393,14 @@ i11 $s i11 i1, +0 i1? ^? -} i1@ i0X s0X i0r ^w -i0R ^J i0h i4s i0A Y2 p3 i0A $d i0a $0 i08 ^e i02 i13 ^% -i01 ^A -i0} +0 -i0# -i0$ $h Z2 ^h y1 ^h ^J @@ -5198,7 +4411,6 @@ $g t $G o6g $g $k $g $b -^g $0 y1 $@ ^G f u -6 f t -7 @@ -5211,9 +4423,8 @@ $f ^f $f ^C f -7 t f -6 u -f *13 *04 -^f -1 f *04 *13 +^f -1 ] ^f E y5 y5 ^e ^T @@ -5231,87 +4442,63 @@ E $1 *24 E } } E ] ] [ E -$d Z1 t -d y3 t -dO71u -dO63 -dO07O81 -duO71 -d u o72 -d u +9 -d u +5 $d t Z1 -d t y3 +p1 t y3 +d O63 +d O07 O81 +p1 o72 u +p1 u +9 +d u +5 d t i81 -d t i01 -d t ^D -d t *75 -d t -6 -d t $5 -d t $0 +p1 t $5 +p1 t $0 ^D ^T d o7m -d o72 u d o62 -d i81 t d i8@ d i7m -d i6 -d i4E -^d i1r -d i01 t +p1 i4E ^d ^E d 'A +5 DA d ^a -d +9 u +p1 +9 u D8 R8 R8 D8 $1 D8 $0 -d *75 t -d -6 t D5 y5 E d +5 u -d $5 t D5 i3r D5 $C -d +5 'A D5 $1 D4 o6s D4 o1V D3 o5@ D3 o0' -D3 k d +k D3 p1 D3 $@ ^D ^3 D2 ^z D2 ^g $= D2 ^D $1 -d $0 t D0 -2 -2 c $+ Z1 c Z1 c y4 y4 C Y2 Y4 C Y1 T1 -$!cO13 C T1 Y1 c ss8 -c q Z1 ^C ^P c oA2 -c o2u -c o0! +o0! l ^c ^k -c iA# -C i7@ c i6, ^C ^H C $6 Y1 ^c -3 -3 -^c *17 -c [ +l [ $b r $9 ^b ^M ^b ^m @@ -5323,14 +4510,11 @@ $b ^7 'B $1 ^b $! $A Z5 -$aO41 $A u $A $s +A i7 ^a i1k $a ^e p4 -*A9 $B -$_ *A8 $A ^7 $a ^4 $@ -A @@ -5339,18 +4523,15 @@ $9 Z3 $9 i0E $9 ^8 *97 -9 -+9 +7 $9 $6 $9 ^@ .8 i6W ,8 $9 -$) *86 +7 o6n +7 o4# +7 i6D ^7 ^f *15 $7 ^3 -*72 i4w $. -7 *05 $@ .7 $@ -7 @@ -5362,10 +4543,8 @@ $6 ^P -6 i4k *68 *97 *65 k -*63 ,2 *62 *04 *61 o0# -^! +6 ^5 z4 ^5 y4 y4 ^5 $s @@ -5375,16 +4554,10 @@ $6 ^P ,5 o0L -5 i2N ^5 $d *23 -,5 -8 -+5 *64 *54 i6 +5 *42 -*53 *64 -*53 .4 ^5 *23 $d -*52 *06 +5 +1 -.5 ^! ^5 $! ^5 ] ] ^, ^5 @@ -5394,7 +4567,6 @@ $4 Z3 +4 i61 +4 i4a $4 ^8 -*45 l *42 *13 $4 $2 $4 ^2 @@ -5404,9 +4576,6 @@ $4 ^2 .3 o0p -3 i4J $3 ^7 -*36 T2 -*35 -0 -*34 $0 *31 i1` *30 o0p $2 T7 @@ -5417,11 +4586,9 @@ $2 $8 *27 o0z *27 $. *26 o5R -*24 $p +2 *46 *23 o4$ *21 i2d -*21 ^H ^2 $1 +2 *05 $2 $0 @@ -5429,15 +4596,11 @@ $2 $0 $@ +2 ^2 $@ $1 Z3 t -$1 Y1 -$1O82 -$1O64 -$1O62t -$1 t Z3 -$1tO62 +$1 O82 +$1 O64 +$1 O62 t +1 t p3 ^1 $Q -+1 p3 t $1 oAi .1 o4# $1 o2v @@ -5448,29 +4611,18 @@ $1 i0. +1 D0 $1 $9 *17 $A -*17 *14 +4 -*14 *36 *12 o0t -*12 *45 -*12 ^+ -*10 *12 -+0 z1 $f ++0 $f z1 +0 y2 y2 -0 o9^ +0 o3, -0 o2p -0 i2n -+0 $f z1 -*06 *52 -$. *05 -7 -+0 *43 *03 *12 *02 o1X *02 *64 +0 *23 -*02 $! -.0 ,2 $@ +0 $. +0 $- $0 @@ -5488,29 +4640,21 @@ $z p4 o1u ^z $c $z *70 $p z5 z3 -z5O48 +z5 O48 Z5 u o58 -Z5 o58 u Z5 o0G ] z4 K Z4 *61 $+ Z4 -z3O3Bt -z3tO3B -z3 s8 Z3 -Z3 s10 +z3 t O3B +z3 s8 Z3 Z3 k +5 $. Z3 k -Z3 +5 k -z2 y5 y2 -z2O39t -z2tO39 -z2 s.V +z2 y5 z2 +z2 O39 t z2 ^R Z2 o8. Z2 o7% -z2 o1j -Z2 l Z2 [ k z2 ^H z2 E ^1 @@ -5519,52 +4663,38 @@ Z2 $@ -8 Z2 -8 $@ z2 *40 +1 $. Z2 -4 -z2 +1 *40 $$ Z2 $= Z2 ^. z2 { -z1 Z4 Z1 u $3 Z1 ^Q y1 -Z1p2O86 -Z1 o5c -z1 o27 -Z1 o0) -Z1 i6X -Z1 i6S -z1 i0t +Z1 p2 O86 +Y1 o0) z1 ^B y1 -Z1 ^B Z1 $9 Z1 $5 -Z1 $3 u -$_ Z1 ^! z1 $Y ^y ^Y $y $y ^l -y5 y1 t -y5O92 -Y5O46 -y5 t y1 +y5 O92 +Y5 O46 y5 o5s y5 o5b y5 i5; y5 i5- -Y5*69O76 -y4O65 -y4O41 -y4O09C +Y5 *69 O76 +y4 O65 +y4 O09 C y4 i4y y4 i4i Y3 Y2 +B Y3 sMd y3 scf -y3rO41 +y3 r O41 y3 o3f Y3 i8g Y3 *75 -Y3 *57 Y3 *40 [ ] Y3 *34 y3 +2 @@ -5573,15 +4703,10 @@ Y2 $z y2 y5 y2 y2 y4 E Y2 Y4 -Y2 Y2 y1 -Y2 y2 t Y2 Y2 D2 -Y2 y1 Y2 [ y2 u -Y2 t y2 -y2 s9s y2 s63 -y2p1O06 +y2 p1 O06 y2 o2x Y2 o1c y2 ^k @@ -5590,7 +4715,6 @@ y2 i2q Y2 i0a y2 E Y2 D2 Y2 -y2 *74 Y2 +6 y2 *34 y2 +0 @@ -5599,15 +4723,9 @@ $. Y2 $* y2 $ y2 y1 u { -y1 { u Y1 t p4 -Y1 p4 t y1 p2 -8 -y1 o4l -Y1 o3N Y1 o1) -Y1 o0) -Y1 i6M Y1 i4d $) Y1 E $@ Y1 c @@ -5624,65 +4742,57 @@ $x $z ^x ^s ^x p1 c $x $l -OB2i8i -OB2$1 -OA1$1 -O91o0D +OB2 i8i +OB2 $1 +OA1 $1 +O91 o0D O83 -O82O53 -O73o5H -O72$2 -O63$ Z3 -O63i2, -O61Z1 -O61Y1 -O53i3S -O53[ -O51Y3 -O51O24 -O51$r -O51i3y -]O51 -O43y4c -O43i44 -O43C$1 -O43$1C -O42O42 -O42o3. -O42o1u -O42i2M -O42-2 -O32i6 -[O32 -O31^at -$!O31 -O25y2 -O25y1 -O24i1x -O23y4 -O23*20 -O21y3 -O21o6n -O21dO04 -$!O21 -O17z2t -O17tz2 -O17C -O16z2 -O15C -O13p2'9 -O12Ki2j -O12i2jK -O09y1 -O08-2 -O06p5 -O03Y1 -O03i3x -O02^K -O02*56 -O01o1u$2 -O01i0ai1r -O01$2o1u +O82 O53 +O73 o5H +O72 $2 +O63 $ Z3 +O63 i2, +O61 Y1 +O53 i3S +O53 [ +O51 Y3 +O51 O24 +O51 $r +] O51 +O43 y4 c +O43 i44 +O43 C $1 +O42 O42 +O42 o3. +O42 o1u +O42 i2M +O42 -2 +O32 i6 +[ O32 +O31 ^a t +$! O31 +O25 y2 +O24 i1x +O23 y4 +O21 y3 +O21 o6n +O21 d O04 +$! O21 +O17 t z2 +O17 C +O16 z2 +O15 C +O13 p2 '9 +O12 K i2j +O12 i2j K +O08 -2 +O06 p5 +O03 Y1 +O03 i3x +O02 ^K +O01 o1u $2 +O01 i0a i1r +O01 $2 o1u ^x $. ^w z3 $W ^w @@ -5698,18 +4808,15 @@ $v $g ^V ^D u Y4 u Y2 Y4 -[ u y2 ^U ^Y $u ^u -u sO0 p3 +u p3 sO0 u sB* t u sA& -u r z3 u R3 t ^u ^q -u p3 sO0 -up1O93 -up1O67 +u p1 O93 +u p1 O67 ^U o1b u o11 u i6M @@ -5729,14 +4836,11 @@ t TA t T3 t s A t s5i -tp2OA6 -t o0G -t i7@ +t p2 OA6 ^t i6s t i5T -^T i0S t ^F $C -tdO75 +t d O75 TB ^1 $t $b TA T9 @@ -5746,11 +4850,8 @@ $@ T7 T6 $6 $* T6 ^! T6 -T5 o4/ T5 i3@ T5 $. -T4 T5 $3 -T4 i4B T4 $3 T5 T4 $! T3 T4 @@ -5766,7 +4867,7 @@ T1 i2Y ^T ^1 T0 i2m T0 'A -$sy5O54 +$s y5 O54 ^s ^u stT ssz $2 @@ -5777,7 +4878,7 @@ sM[ y2 smw sM* skK -siyO61 +siy O61 siy $7 siy ^S i1. @@ -5791,7 +4892,6 @@ sAZ .3 sas sab l ^S ^a -s9_ f s9b K s9# $! s8F @@ -5806,16 +4906,12 @@ s1D s18 $. s16 ^s +1 -s0 q s0o -^s *03 -s0) ] $* s0* $r Z2 ^r $y -^.rO31 +^. r O31 r t -r p4 r o7. r o5s ^R l ^a @@ -5824,10 +4920,8 @@ $r i4W c ^R i1S ^r i0y $r D5 -^R ^a l R7 o6# R7 i6_ -R6 o51 R5 i66 R4 o38 R4 i7p @@ -5839,16 +4933,14 @@ $@ r ^q z4 $q Z3 R7 { $q Z1 -^q y1 t +^q t i1Q ^q y1 i39 -^q t y1 q stb ^Q $s $q ^s ^q $s ^q ^h $q $9 -$q *50 $Q $1 ^q $+ ^q $* @@ -5858,68 +4950,41 @@ $P $M $p i2y p5 y3 t p5 y3 l -p5 t y3 p5 r p5 oA6 -p5 l y3 p5 +A p4 $Z ^z p4 sao p4 l -p3O8Bt -p3tO8B +p3 t O8B p3 ^b ^j -p2O98u -p2O79t -p2O75t -p2O6AC -p2O5A*23 -p2O0BO61 -p2O05C -p2uO98 -p2tO79 -p2tO75 -p2CO6A -p2CO05 +p2 O98 u +p2 t O79 +p2 O75 t +p2 O6A C +p2 *23 O5A +p2 O0B O61 +p2 O05 C +p2 C O05 p2 'B $m p2 $a $. p2 +9 -^P *23 -p2*23O5A p2 $2 $- p2 ] -p1 Z1 t -p1 y3 t -p1 Y2 u -p1OB5u -p1O81u -p1O71E -p1O63E -p1O62c -p1O56t -p1O51t -p1O49 -p1O03t -p1 u Y2 -p1uOB5 -p1uO81 -p1 t Z1 -p1 t y3 -p1tO56 -p1tO51 -p1tO03 +p1 OB5 u +p1 E O71 +p1 E O63 +p1 O62 c +p1 t O56 +p1 t O51 +p1 t O03 p1 t o51 -p1 t p1 o7a p1 o65 p1 o61 -p1 o51 t p1 o0m p1 i4b p1 ^h -p1EO71 -p1EO63 -p1cO62 p1 'A r p1 $a p1 ^8 @@ -5927,20 +4992,18 @@ p1 *08 r ^P $@ ^p $@ ^o ^Y -^oO12 +^o O12 ^o ^t T0 ^o ^t ^o $o ^o ^m -^o i0B ^O ^G oB9 -oB4O03 +oB4 O03 oB3 +9 oAt oAA u $O *A6 -o9I Y1 o9A u o9a o94 $. @@ -5970,13 +5033,11 @@ o7+ +0 o7? $! o6w i2f $! o6s -o6n +7 o6k u -o6i -5 o6h o6d -0 o6c -o6BO41 +o6B O41 o6% +9 o69 o6* ,7 @@ -5984,20 +5045,17 @@ o65 K o6. $4 o6, $1 o6[ $] -o5+ Y1 -o5*O32t +o5* t O32 o5x $1 o5u -o5*tO32 o5= T1 o5s -3 o5r o5p o6e o5p +4 o5p -o5HO13 -o5c Z1 -o5a T2 +o5H O13 +o5c Y1 o5A E o5a D6 o5A $! @@ -6006,16 +5064,12 @@ o56 i6. o56 ,6 o56 o5@ ^2 -o5% ] -o5! ] o4z -5 o4 y5 o4S sSz o4o o4, i44 ^. o4i { -o4f T2 -o4D T0 o4c L1 o4a $3 o49 '8 @@ -6024,32 +5078,28 @@ o45 o44 *74 $! o43 o4; ,2 -o4# .1 o3y t o3- y4 o3. Y3 -o3* y1 o3w $q o3T +5 o3p o3o o3N Y1 o3m -o3. l o3c o3* ,4 o2v -0 o2r Z1 o2P ,5 o2G l $1 -o2G $1 l o2e o2b o2a u o1y t [ o1x o1w -o1SO53 +o1S O53 o1r *12 o1P +0 o1m D6 @@ -6066,7 +5116,6 @@ o1C D7 o1c o1b D3 o1a $@ -o17 y1 o15 o14 $= $. o14 @@ -6079,7 +5128,7 @@ o0y o0w u o0V o0T D5 -o0t { +$t [ o0S T4 o0r +3 o0q *46 @@ -6089,7 +5138,6 @@ o0m y3 $. o0L o0K ^U o0k *35 -[ o0K o0h $1 Z1 o0h o0f $@ @@ -6101,15 +5149,11 @@ o0A L4 o0A o08 o07 -o02 .3 -o0# *16 o00 T2 o0! -^n E -^n c $n $a $m Z2 -^mO41 +^m O41 $m $t stM ^m oAh $m $n @@ -6120,21 +5164,17 @@ $M ^h } ^m ^A ^m *02 $l Z2 *01 -$l Z1 t -^l ^z -lY5O13 -lO13Y5 -^l ^w $l t Z1 +^l ^z +l Y5 O13 +l O13 Y5 +^l ^w l T1 K l se@ -l ^r l K T1 ^l i1a ^L ^e E L8 i20 -l *86 -L4 o0A L4 { l +4 L3 i6g @@ -6143,10 +5183,9 @@ $l *01 Z2 K z4 ] K z4 $. k Z3 -kY3O43 +k Y3 O43 k Y2 y2 -k y2 Y2 -KO92 +K O92 K R9 ^K ^R k ^q @@ -6160,7 +5199,6 @@ K i5@ $k i3t k d i6q [ k c -k *56 K *03 K $* [ K @@ -6175,16 +5213,14 @@ $J $1 ^I p3 i1D ^i ^M $I ^I E -^i i0y $I E ^I iA+ T8 iA- iA i9s -i9aO63 +i9a O63 i9 $6 i92 -i91 u 'A i91 'A u i8y i8s .6 @@ -6200,22 +5236,17 @@ i7r i7N *73 i7n i7m -i7K T3 i7/ E -i7# *30 i71 *04 i7@ $@ -i6yO12 +i6y O12 i6y -0 -i6_ R8 i6r i6; o64 $. -i6; $. o64 -i6g L3 i6E ^e i6b i6% +8 -i62p2O42 +i62 p2 O42 i6@ $2 i6_ $2 i62 @@ -6226,7 +5257,6 @@ i5x i3s i5v $x i5^ ^u i5+ T1 -i5s *32 i5r i3q i5q *05 i5P .6 @@ -6241,21 +5271,18 @@ i5- .4 i5 *30 i51 $@ i50 ,6 -i5 *03 i5 $0 i5( i4' Y5 i4. Y3 i4w $s i4* t -i4$ R0 i4p $P i4O ^I i4n t i4M *67 i4L .5 i4k o5l -i4k -7 i4J .2 i4i $x i4h @@ -6272,14 +5299,11 @@ i3z [ i3y .6 i3x $c i3w -i3SO63 i3S +7 -i3r D6 i3r $5 i3P *41 i3 $m i3l k +3 -i3l +3 k i3k .1 i3j i3i c @@ -6295,7 +5319,6 @@ i2y i2W .1 i2v ^j i2t ^z -i2- T3 i2t i2s ^r i2q $y @@ -6321,50 +5344,39 @@ i17 .2 i15 i10 ,2 $- i1_ -i0z L0 i0v ^m -i0t ^z i0t ^s } i0S $a -i0P ^T -i0e ^6 -i0a ^L +^a ^L i0a $9 -} i08 i04 i17 i02 $D -0 -i02 -0 $D -i01 l i0_ *04 -^hO61 +^h O61 ^h ^S ^h i1m ^o $g $m $G $f c -$G c $f ^G $1 $g ^@ -^f Z1 z1 ^f z1 Z1 -fO98K -fO74 +f O98 K +f O74 f u ^F o2G -fKO98 +f K O98 f k $f i66 ^F i11 $f i0t ^f ^e -f c $1 +f $1 c $f $c ^f ^4 -f $1 c } E z2 ^e y1 r -$) E Y1 -EO71 -EO32$9 +E O71 +E O32 $9 ] E T5 $* E T1 ^e p4 y1 @@ -6374,7 +5386,7 @@ $e i6c u E i4t ^E i1r E $A $1 -E$9O32 +E $9 O32 E $7 Y4 $e *61 ^t E ,5 $2 @@ -6384,37 +5396,28 @@ E $2 ,5 $e $1 E $0 $d Z5 -dOA1] -d]OA1 -dO91t -dO02u +p1 DA ] +p1 ] OA1 +d O91 t d $W -duO02 -d u ^S +p1 u ^S d u o91 -d u ,B -dtO91 +p1 u ,B d t i7O d t -8 -d t *4B -d ^S u +d *4B t d ^r ^R -d oBA -d o91 u +p1 oBA ^D ^N ^d ^M d i7z d i6; -d i4r -^D i0J +p1 i4r ^D ^G -d DA ] -d ] DA -d D3 ] -d ] D3 +p1 D3 ] +p1 ] D3 ^d D3 ^d ^c -d ,B u } [ DB $d $b d -8 t @@ -6430,23 +5433,21 @@ D5 *24 D4 o31 D4 o1J D4 ^f -d *4B t D4 $3 D4 $@ D3 y3 D2 +0 y2 D1 $9 $* D1 -D0 $3 +[ $3 $= $D ^. ^d ^c ^z [ c y3 C Y2 [ -C [ Y2 -$@ c Y1 -cOA3$1 -$CO12 +u [ Y2 +c OA3 $1 +$C O12 $c u $0 C T9 C T6 @@ -6454,7 +5455,6 @@ C T6 C T4 c s03 C o92 -C o8# c o2P ^c ^l c K ] @@ -6467,8 +5467,7 @@ c +B $! c $! +B C ^9 $! c ,9 -c$1OA3 -$c $0 u +c $1 OA3 $c +0 { C ^# ^C @@ -6478,7 +5477,6 @@ c ] $b u $B o0T ^B ^J -^B i1J ^B ^F $B ^A $B ^1 RB @@ -6486,12 +5484,11 @@ $A Z2 ^a ^Z ^a Y3 } $a Y1 -$AO81 +$A O81 $a $v $a ^R ^a r $A o3s -.A l $A K ^a ^K $A iBa @@ -6500,7 +5497,6 @@ $a i9A ,A i5, ^A i2C $A i1h -} $a i0S $A i0k $A $G ^A ^F @@ -6517,15 +5513,12 @@ $a $. [ $a ^@ $a ^! $a -$9 Z1 E +$9 E Z1 $9 Z1 $9 o0P -^9 i34 C -$9 i0u o09 -$9 E Z1 ^9 C i34 +$9 i0u o09 $9 $c -$! ,9 c ^9 $a ^5 *98 o8B +9 -8 @@ -6546,64 +5539,48 @@ $7 Z2 '7 ^s +7 o3q -7 o3# -,7 o2w +7 o2f -+7 o0z +7 i8e ,7 i8e -.7 ] -7 .7 -7 ] *76 E $! -*76 $! E *75 i0a -*75 -$@ *75 { *73 *B3 -7 *32 $7 $3 ^7 ^2 *71 o6b ^7 -+6 Y2 u -$6O01E +6 u Y2 +$6 O01 E ,6 u $6 r f '6 $r -+6 o4t ,6 o1x +6 i7. ,6 i6d .6 i5W ^6 i1s p3 +6 E $* -+6 $* E +6 ^d -$- *68 *64 i5f *62 i2r *62 i21 $5 Z5 t $5 Z4 +5 Y4 E -$5 t Z5 --5 o7x +5 o6O +5 o3t -5 o1h $5 o0R $5 i97 $5 i5a -,5 i42 +5 E Y4 -,5 -7 *56 y5 K *56 K y5 -*56 i2c $5 $6 -5 *50 *54 ^u -*53 $@ *53 -5 *23 -5 -2 @@ -6611,15 +5588,11 @@ $@ *53 *50 $@ +5 $. -4 Z2 -,4 o6E ,4 o6. -+4 o1k -^" $4 o0c ^4 K $4 i5s +4 i47 *47 o5w -*46 $l *45 o2t -4 *54 *43 o21 @@ -6627,8 +5600,6 @@ $4 i5s *42 i3z $. *42 *41 t -*41 o6. -*41 +4 .4 ^4 ] -3 o0z @@ -6642,14 +5613,11 @@ $3 i3g $3 D8 ^3 D6 $3 ^b -*35 *64 $3 $5 ] *34 Y3 *34 i4a .3 +4 -*32O03t -*32tO03 -*32 o0u +*32 O03 t *32 $m +3 -2 $3 $1 @@ -6662,35 +5630,27 @@ $2 T9 -2 o5c .2 o55 $2 o4r -,2 o4@ +2 o0l $2 ^M -.2 i4J $2 i2e -*27O07 +*27 O07 *27 o1f +2 +7 $2 +7 *25 $. *24 o1@ -*23 $S -*23 o4u o2x *23 o2x o4u -*23 o0u -*23 i2p $2 ,3 ,2 -3 --2 *13 *20 ^s -*20 o6n -*20 o1X +*02 o6n $! ^2 $ $2 [ $2 ^2 ^^ ^@ ^2 ^! $2 -$1O93 +$1 O93 $1 $U ^1 T9 r $1 saA @@ -6703,13 +5663,10 @@ $1 o6a $1 i4g $1 i2r .1 i2m -.1 i0@ +1 f $1 $C -$_ *14 *13 o2b *12 o3c -*12 i2d *12 -2 $1 $+ $1 $- @@ -6724,22 +5681,16 @@ $0 Y1 +0 $W $0 T3 $8 .0 o3v --0 i5c -0 i5B $0 i50 .0 i1z -+0 i1, -.0 d Y3 -$0 $8 T3 +.0 p1 Y3 *07 o6H *07 o3! +0 +5 *03 o3x *03 o3e -$0 *34 -*02O12 -*02 ^T -*02 o6n +*02 O12 $0 $1 $@ ^0 [ $. -0 @@ -6759,23 +5710,16 @@ $z L6 ^z $l ^z d ^Z ^a -Z5 Z5 -1 +Z5 Y5 -1 $ Z5 Z5 -Z5 Z3 Y4 -Z5 Y4 Z3 -Z5 Y1 +Z4 Y5 Y3 z5 t ,6 -z5 scf Z5 s8 z5 s8@ -z5i0rO18 -z5 ,6 t -^z*53O23 -Z5 -1 Z5 +z5 i0r O18 +^z *53 O23 z4 z5 { -z4 { z5 Z4 } z3 -z4 y4 Z4 o7. z3 Z2 *04 } z3 Z2 @@ -6787,26 +5731,19 @@ Z3 $. $* Z3 $@ Z3 Z2 z5 t -} Z2 z3 Z2 y3 t Z2 y3 l Z2 y2 .2 -Z2OB3D8 -$!Z2O42 +Z2 OB3 D8 +$! Z2 O42 z2 u -Z2 t z5 -Z2 t y3 z2 sm1 z2 ^Q z2 p1 z1 -Z2 l y3 z2 l -0 z2 i2@ E -z2 E i2@ z2 E ] -z2 ] E -z2 d z1 -Z2dO07 +Z2 d O07 z2 ^B o2b z2 *30 ^H z2 +1 y2 @@ -6815,54 +5752,43 @@ Z2 $& Z2 $! $\ Z2 ^. z2 -z1 Y2 Y2 -z1O34 -Z1O03 -Z1 u p1 -Z1 p1 u -Z1 p1 -6 -Z1 o1) +z1 O34 +Y1 O03 +Y1 d -6 z1 i6b Z1 i4, Z1 i1e *62 Z1 ^d -Z1 d -Z1 $c +Y1 p1 +Y1 $c z1 ^c ^. Z1 ^a Z1 $2 $* Z1 -0 $_ Z1 [ -$_ [ Z1 z1 } } $z $! -[ $z $y $Y -$Y ^x l -^y ^m $Y l ^x +^y ^m $y ^h -^y D3 ^y ^A -Y5Z5O63 -Y5 z3 r +Y5 Z5 O63 [ Y5 Y3 -y5OA3y5 -y5O93E -Y5O83t -y5O82K -y5O68 -$*Y5O64 -Y5O63Z5 -y5O63,5 -y5O63[ -Y5O34 -Y5tO83 +y5 OA3 y5 +y5 O93 E +Y5 t O83 +y5 O82 K +y5 O68 +$* Y5 O64 +Y5 O63 Z5 +y5 ,5 O63 +y5 O63 [ +Y5 O34 y5 t T5 -y5 T5 t } Y5 t y5 { R4 -y5p1O0A +y5 p1 O0A y5 o5m y5 o5g y5 o4o @@ -6870,94 +5796,71 @@ y5 o0V y5 o0r y5 o0M y5 o0D -y5KO82 -y5EO93 +y5 K O82 y5 ^D Y5 +A Y5 ^A -y5,5O63 -Y4Y4O08 -y4OB4k -y4O82y4 -y4O64O02 -Y4O08Y4 -y4 u $6 +Y4 Y4 O08 +y4 OB4 k +y4 O82 y4 +y4 O64 O02 +Y4 O08 Y4 +y4 $6 u Y4 u ] Y4 sbB -y4 s4v Y4 s4+ -y4 r +r Y4 y4 o2i Y4 o0T Y4 o0p y4 o0P -y4kOB4 y4 i4. y4 i4= -Y4 i0r y4 E -0 Y4 E $! -Y4 $! E y4 *A0 Y4 '8 -y4 $6 u -y4 *64 *31 -y4 *3A y4 *31 *64 y4 -0 E -y4 *0A Y4 $! Y4 $, Y4 ] ] Y4 [ -Y3 $z y2 -Y3 y3 u Y3 y2 $z -y3 y2 l -y3O01 -Y3 u y3 +Y3 y3 u +y3 l y2 +y3 [ y3 s9] -y3 ] ^p y3 ^p ] y3 o0j y3 o0e y3 $m -y3 l y2 Y3 i7+ Y3 i6. -y3 i1E -0 -y3 E $9 -y3 D5 $A +y3 -0 i1E +y3 $9 E y3 $A D5 Y3 $a -y3 $9 E Y3 +8 y3 *53 -y3 -0 i1E y3 $. $* y3 -Y2y5O65 -Y2 y5 u +Y2 y5 O65 Y2 y5 Y2 Y4 Y2 Y2 Y2 Y4 Y2 Y2 C y2 y2 ] y2 y2 -y2O43y5 -Y2O24y2 +y2 O43 y5 +Y2 O24 y2 Y2 $x -Y2 u y5 Y2 u p1 Y2 $u Y2 t p1 -Y2 t d y2 sNG -y2 sM[ Y2 s15 y2 q q -Y2 p1 u -Y2 p1 t Y2 o5y Y2 o56 Y2 o4@ @@ -6968,18 +5871,12 @@ Y2 K C Y2 i5. y2 i2y y2 i0a -Y2 d t -Y2 C Y2 -Y2 C K -y2 c $1 +y2 $1 c y2 C Y2 +5 y2 +3 +2 { Y2 *31 -y2 +2 +3 y2 +2 -y2 $1 c -{ Y2 *13 y2 $1 Y2 $@ $! $@ Y2 @@ -6990,37 +5887,25 @@ $! y2 Y1 $z Z1 y1 $* Z2 y1 Y5 C -Y1 Y4 t -y1 $x Z2 -y1O34 Y1 t Y4 +y1 $x Z2 y1 ^s y1 $q ^q -y1 o4* -y1 l Y1 ^j y1 Y1 i4@ -y1 i1o -y1 i1j -y1 i1D Y1 ^e Y1 $d r Y1 D6 y1 C Y5 Y1 C $4 -Y1 C ,3 +Y1 ,3 C Y1 ^b $. Y1 *63 -Y1 $4 C -Y1 ,3 C -Y1 -1 $! Y1 [ -$! [ Y1 y1 $@ $. ^y $x Z5 t ^x $w -$x t Z5 ^X ^M ^x ^l ^x i5q @@ -7031,128 +5916,114 @@ $x i2s ^x $g $x E $2 $x D4 -OA1o9k -O91o0V -O91$2 +OA1 o9k +O91 o0V +O91 $2 O91 -O83o88 +O83 o88 O81 -O73t +O73 t $x *70 -O62i6z -O61$s -O61^s -O61o0$ -O61$8 -$,O61 -O52y5y5 -O52i4y -O51^r -O51i3r +O62 i6z +O61 $s +O61 ^s +O61 o0$ +O61 $8 +D6 $, +O52 y5 y5 +O51 ^r +O51 i3r O4A -O43y3Y2 -O43Y2y3 -O43o1u -O43i3L -O43i1W -$!O42Z2 -O42y4 -O42o0M -O42i2h -O42{E -O42[ -O41y4t -O41ty4 -O41i5s -O41i3s -$ O41 -$*O36 -O35y1y5 -O35O21 -O35dO03 -O34y3y3 -O34}q -O32$.Z2 -O32y2y2 -O32o0u -O32i3. -O32i2p -O31o0c -O31i4M -$@O31E -$x $2 E -O28u -O27z2 -}O26 -O25up4 -O25p4u -O25o4) -[O25 -$ O24 -O23y3 -O23p1'9 -O23i3i -O21o4@ -O21o2zi3q -O21i3qo2z -O21*31 -O21+0 -O21$* -O21$@ -$=O21 -O1Bu -O16z3 -O16Cz2 -O15t -O14y3} -O14}y3 -O14i4* -O14i3- -O13Z5Z5 -O13^z -{O13$s -O13o2H -O13f -O12i2e -O0Bz5 -$*O0B -O07z2 -O07u -O07*21 -O06C$* -O06$*C -O06+0 -O05z1 -O05o4* -O05D1 -O04Z5Z5 -O04Y2y2 -O04y2Y2 -O04r -O04ql -O04p1TB -O04lq -O04i5$ -O03z3 -O03Z1 -O03^e -O02Z2y5 -O02y5Z2 -O02Y4y2 -O02y2Y4 -O02y2 -O02^t -O02i3b -O02i1h -O01p2 -O01^JT4 +O43 y3 Y2 +O43 Y2 y3 +O43 o1u +O43 i1W +$! O42 Z2 +O42 y4 +O42 o0M +O42 { E +O41 y4 t +O41 i5s +O41 i3s +D4 $ +$* O36 +z1 O45 y5 +O35 O21 +O35 d O03 +O34 y3 y3 +O34 } q +O32 $. Z2 +O32 y2 y2 +O32 o0u +O32 i3. +O31 o0c +O31 i4M +$@ O31 E +O28 u +O27 z2 +} O26 +O25 u p4 +O25 o4) +[ O25 +$ O24 +O23 y3 +O23 p1 '9 +O23 i3i +O21 o4@ +O21 i3q o2z +O21 *31 +O21 +0 +O21 $* +O21 $@ +O1B u +O16 z3 +O16 C z2 +O15 t +O14 y3 } +O14 } y3 +O14 i4* +O14 i3- +O13 Z5 Z5 +O13 ^z +{ O13 $s +O13 o2H +O13 f +O12 i2e +O0B z5 +$* O0B +O07 z2 +O07 u +O07 *21 +O06 $* C +O06 +0 +O05 z1 +O05 o4* +O05 D1 +O04 Z5 Y5 +O04 y2 Y2 +O04 r +O04 q l +O04 p1 TB +O04 i5$ +O03 z3 +O03 ^e +O02 Z2 y5 +O02 y5 Z2 +O02 Y4 y2 +O02 y2 Y4 +O02 y2 +O02 ^t +O02 i3b +O02 i1h +O01 p2 +O01 ^J T4 $x [ ] ^x ^- ^x ^x ^w ^z ^W y4 y4 -^wO21 +^w O21 ^w $x $W ^W $w ^t @@ -7163,7 +6034,6 @@ $W o5J $w $j $w i7. ^W i2U -^w i1s ^w i0c ^w D5 ^w ^A @@ -7172,45 +6042,36 @@ $! ^w ^v z2 ^v i3d ^v i1s -^V i0W ^v ^h ^V ^C $V $1 $! ^V $v -u z5 z1 -u z1 z5 -uY5O32 -uY2OA5 -$UO91 -uO51p5 -uO42*03 +u Y5 O32 +u Y2 OA5 +D9 $U +u O51 p5 +u O42 *03 u T4 ^u ^t u sIY u R4 t -up2O5B -up2O04 -up1OA4 -up1O52 +u p2 O04 +u p1 OA4 +u p1 O52 ^u ^p u o8I u o76 u o3S ] ^u o3_ ^u ^l -udO05 u *79 -u*03O42 -t Z5 Z3 t Z3 Z5 -tz2O63 +t z2 O63 t Z1 ^3 -} t Y5 -tO61] -t]O61 -tO43z2 -^tO21 +t O61 ] +t ] O61 +^t O21 $t ^w *53 $t $w $T ^U @@ -7220,24 +6081,21 @@ $t ^t t s*+ { t R6 ^T ^R -tp2OA5 +t p2 OA5 t p2 +2 -t p1 +B t o8L t o7A t o0W $t ^L -t K Y2 -tdO08 +t d O08 t d o74 -t d ^M +p1 t ^M t d -B t D4 ^t ^d t $A $B t -A T8 Y1 t -T8 t Y1 T8 $2 T7 $8 ^T $7 @@ -7256,20 +6114,15 @@ T4 i5# T4 $8 T4 $4 T4 $. -t ^3 Z1 T3 s1! -T3 o7@ T3 o04 T3 i2Y -T2 o49 T1 $! Y1 T1 o8% -T1 o5= T1 o3e T1 o0( T1 o0! [ t *14 -T1 $! $T ^1 ^T ,1 T0 o5T @@ -7284,8 +6137,7 @@ $s $z ^S Y2 Y2 $S Y1 sY* -{$sO13 -stb q +{ $s O13 ssz E ss8 c srz @@ -7299,15 +6151,14 @@ sLt slL $! slL ^s ^K -s)j s8 Z5 +s)j s8 Z5 sj( R5 R5 sjN Y1 $s $j ^s i4s $S i43 $S i3s -^s i0p -^s i0j +^s ^j sg, y3 sG* sfF @@ -7321,11 +6172,9 @@ sd4 l sCt scm l sc8 z3 -^S c sc( $) sBF saf -saB l s98 s7% Z5 s7# @@ -7333,9 +6182,7 @@ s69 s67 s65 s5i C -^s *56 s5( $) -} s5# s49 s46 ^s *35 @@ -7350,12 +6197,11 @@ s13 s12 s1! s0. *86 -s0% } $@ ^s [ $s r Z5 $. r z1 -r y4 y4 +Y4 Y4 r } r Y1 $r $t $y r ^s @@ -7365,20 +6211,16 @@ r ^s r o2w r o2j ^r l } -^r } l -r ^K +$K r ^R i1t -^R i1J -rfO43 +r f O43 $R $c $r $b r $a *13 r $A R9 ] { R6 t -R6 R6 '7 ] R6 R6 -R6 '7 R6 ] R5 t R5 R3 R4 t [ @@ -7407,119 +6249,63 @@ $P $p ^P $k ^p ^k ^P i8@ -^P i1J ^p ^a -p5O09$a -p5O02 +p5 O09 $a +p5 O02 p5 i6i p5 'B $z -p5$aO09 -p4O0A +p4 O0A p4 o0S $3 p4 $. $k p4 i5p *20 p4 ^a p4 *42 r -p4 $3 o0S -p4 *20 i5p -p3Z1O09 -p3O8Bu -p3O09Z1 -p3{O08 -{p3O08 -p3uO8B -p3 r p1 -p3 p1 r +p3 O09 Y1 +p3 O8B u p3 o6M p3 o05 -p3 $m [ p3 [ $m -p3 k *35 +p3 *35 k p3 C } p3 $A $1 p3 $a [ -p3 [ $a -p3 *35 k { p2 Y1 -p2OA8t -p2O9Au -p2O87t -p2O86t -p2O85u -p2O72c -p2O6A -p2O64t -p2O5Bt -p2O3At -p2{O02 -p2uO9A -p2uO85 -p2tOA8 -p2tO87 -p2tO86 -p2tO64 -p2tO5B -p2tO3A +p2 OA8 t +p2 O9A u +p2 O87 t +p2 O86 t +p2 O85 u +p2 O72 c +p2 O6A +p2 O64 t +p2 t O5B +p2 t O3A +p2 { O02 p2 s6c p2 $q p2 o2e o0b -p2 o0b o2e ] p2 ^m -p2cO72 p2 c $0 -p2 $0 c -p1 z1 u -p1 z1 t -p1 y1 u -p1 Y1 t -p1O62t -p1O62l -p1O57l -p1O31 -p1O25$e -p1O08r -p1 u z1 -p1 u y1 +p1 O62 l +p1 O57 l +p1 O25 $e +p1 O08 r p1 u ^R p1 u K -p1 u D8 -p1 u *57 p1 u *54 p1 u ^1 -p1 t z1 -p1 t Y1 -p1tO62 p1 t +9 p1 t $8 -p1 t +7 -p1 t *45 -p1 t [ -p1s8 O07 -p1 ^R u -p1 o0h -p1lO62 -p1lO57 -p1 K u -p1 iA; -p1 i60 -p1$eO25 -p1 D8 u -p1 D3 'B -p1 D3 ] -p1 ] D3 -p1 'B $. -p1 ^a y1 -p1 +9 t -p1 $8 t -p1 +7 t -p1 *57 u -p1 *54 u p1 *45 t -p1 ^1 u +p1 s8 O07 +p1 iA; +p1 D3 'B +p1 'B $. +p1 ^a z1 +p1 +9 t p1 [ +0 ^o ^P ^o ^p -^O o1/ ^o ^O ^O ^J ^o ^i @@ -7532,12 +6318,12 @@ oB2 oAy oAi u oAB +7 -oAAO21 +oAA O21 oAa $! oA6 oA1 ,B ^( oA) -o9pO62 +o9p O62 o9l o9B *89 o98 -3 @@ -7547,19 +6333,16 @@ o94 $. o93 o91 o90 C -o9^ -0 ^^ o9^ o8z o8Y u -o8uO61 -o8# t +o8u O61 o8R *85 o8o ] ] o8M u o8j o8e -6 o8e -o8b o0q D7 o8b D7 o0q o8% +9 o89 @@ -7569,9 +6352,9 @@ o8% o8# o8. { o7. Z3 -o7yo4xO02 +o7y o4x O02 o7y -o7WO12 +o7W O12 o7v -2 o7u +6 o7T C @@ -7579,7 +6362,6 @@ o7^ T2 o7S c o7O $1 o7o -o7nO21 o7L $+ o7i o7h @@ -7596,40 +6378,35 @@ o6x ,7 o6V ,7 o6u R0 o6Q E -o6M T1 o6m $1 o6_ ^m -o6h R2 -o6H *70 o6f L0 o6e $A o6@ E $0 o6c Y2 Y2 -o6cO12 +o6c O12 o6B D4 o6b .5 o6B $$ o67 ,5 -o6. ,7 +o7. o6. o65 o6) *46 o6, $3 o62 .5 ] o61 -o6@ $0 E o60 ^a o6. -0 o6- $. o6< $> ^, o6, -o5zO32 +o5z O32 o5z i6i $$ o5z o5y $! o5x *53 o5t $1 o5t -o5R *26 o5q y2 y2 o5P o5l $a p3 @@ -7639,11 +6416,9 @@ o5h o5F D3 o5f *67 o5% E -o5a c o5! ^A o58 +4 o56 $L -o5$ *57 $. o55 o53 $4 o5@ *12 @@ -7654,40 +6429,33 @@ o5_ ^' $. o5- ^ o5@ o4X .5 -o4x ] o4v ,2 -o4uO51 +o4u O51 o4u o4T +5 o4S *34 o4N T2 o4L ,5 -o4kO52 +o4k O52 o4K o4i *02 $@ o4i o4h o4e o3p -o49 *20 o48 $. o4_ $7 -o44 *47 o44 o4? *36 o42 *54 o4@ o3z *23 -o3z -1 -o3y C o3 y4 -o3.y3O72 +o3. y3 O72 o3X ^d o3x -5 -o3w *03 o3u -8 -o3u +2 o3u -o3T Z1 +o3T Y1 o3s +4 $? o3S $! o3s @@ -7696,34 +6464,26 @@ o3q o0z o3p i3_ o3n +2 o3n -o3MO53 -o3l z1 o3l y5 E -o3HO65 -o3FO71 -o3D .5 +o3H O65 +o3F O71 o3d .5 -o3bO52 +o3b O52 o3b o3- ^a $! o3a -o38 Z1 -o3# -7 +o38 Y1 o3# ,4 o3- ,4 o3! *30 $. o33 o32 o3- +1 -o3, +0 o2z D3 o2Y E -o2U E -o2u c -o2SO42 +o2S O42 o2s ^k o2q -o2p -0 o2p o2o *21 o2m ,A @@ -7734,8 +6494,6 @@ o2K -7 o2 i5 o2e .3 o2e .1 -o2d +0 -o2A u o2a o0t o2( -6 o23 o17 @@ -7743,13 +6501,9 @@ o23 .5 o21 [ [ $$ o2( $! o1z -o1) Y1 -o1x ,6 -o1-O25 -o1X *02 +o1- O25 o1x o1u y3 -o1uO42 o1u o5h o1u ,3 o1t i2r @@ -7757,41 +6511,31 @@ $/ o1t o1t o1s k o1s D3 -o1r u -o1R T2 o1O l o1@ K ^G -o1J D4 -o1I *43 o1I *34 o1i o1h o1@ ^G K -o1G ,4 -o1g *12 o1E +2 o1e $+ o1e $% o1e -o1CO71 +o1C O71 o1a k o1a ,2 $! o1A o14 $. o14 [ o13 c -o1- +3 o1+ o0y p4 *72 -o0W u o0w o2w o0w o2f o0w D2 o0w ,1 -o0W ] o0u o0t t d -o0t d t o0T D6 $! o0s o0r i2v @@ -7801,13 +6545,10 @@ o0o i0d o0n i1i o0N $! o0n -o0M +4 $@ o0m +0 o0m $= o0l ^a -o0l *31 o0l *13 -o0! l o0k ^s o0J D5 o0h ^Y @@ -7816,17 +6557,12 @@ o0f o3v o0f *31 o0e ^f ^E o0D D9 -o0D D4 o0D $8 -o0' D3 o0c ^s o0B +3 o0a p4 o0A $8 o05 *67 -o05 { -o0$ ,4 -[ o04 o02 +1 o01 i1S o0$ $1 @@ -7840,9 +6576,7 @@ $N ^g } $n $g ^n *31 ^M Z1 y1 -^M y1 Z1 $m $v -$m u $m $r ^M ^L ^M ^K @@ -7854,21 +6588,19 @@ $M $E } ^@ ^M ^M $@ $@ $m -lY2O32 +l Y2 O32 $l Y1 -lO32Y2 +l O32 Y2 ^L ^W -l t p1 $L T0 ^l ^t l R9 R9 l r -l p1 t l o52 l o13 $L o0E ^L ^M -l K +7 +K l +7 ^L ^J $L i4o $? L9 @@ -7878,7 +6610,6 @@ L6 p1 -6 L6 i6K L3 Y3 l ,2 y2 -L1 o4c L1 o0I L1 i1C l *13 k @@ -7889,22 +6620,17 @@ k y5 E K Y3 K Y2 Y2 ^k ^y -kO1A -^KO12 -K s9b +k O1A ^K ^S ^k ^S k q z5 -KqO13 +K q O13 k o09 -K l +7 K i8% -k i6@ k i58 K i46 $a ^k i1- -^k i0l -kdO04 +k d O04 K D7 K c T4 K $a i46 @@ -7920,7 +6646,6 @@ k +0 K { $. k ^k $. -^JO71 ^J o4d $J $o $j $l @@ -7934,34 +6659,32 @@ $I o0f $i i3u ^i i3a ^i C $1 -iBoO92 +iBo O92 iB. iB- iA@ iA/ -i9%O04 -i9iO45 +i9% O04 +i9i O45 i90 i9@ i9[ $] i9- $- $, i9. -i8*O14 -i8mO24 -i8BOA1 +i8* O14 +i8m O24 +i8B OA1 i8a t i8 +A i8 ,9 i8* -i7@Z5O25 -i7@O25Z5 +i7@ Z5 O25 +i7@ O25 Z5 i7W $k i7! T0 i7n $R -i7M *35 -i7eO41 +i7e O41 i7 C -i7 +B i77 i7/ .6 i71 ,8 @@ -7970,16 +6693,13 @@ i7* *07 i70 $! i7( $) i7/ -i6zO21 -i6.O72o6o +i6z O21 +i6. o6o O72 i6X .5 $! i6x -i6W .9 -i6T +0 i6s D0 i6q -9 i6o o3x -i6.o6oO72 i6o $1 i6N ^J i6n $@ @@ -7987,7 +6707,6 @@ i6h i6G -8 i6c L7 i6c -i6B y1 i6b .5 i6a ^A i69 @@ -8013,7 +6732,6 @@ i5S '7 i5s .7 i5s $! i5q $r -i5p *43 i5k o6l i5K *51 i5K ^1 @@ -8024,12 +6742,10 @@ i5\ i6' $% i5i i5G *70 i5g -i5eO03 +i5e O03 i5C $! i5b r $d -i5B -0 i5b -i58 k i53 i1c i53 i52 $2 @@ -8060,13 +6776,12 @@ i4J ,5 i4i $A i4h ,5 i4h $! -i4eO12 +i4e O12 i4e ^c i4e -i4DO52 +i4D O52 } i4b i4a -i46 *57 i44 $4 i43 $4 $. i43 @@ -8081,16 +6796,13 @@ i3x i3v D6 i3v [ i3t i1r -i3sO61 +i3s O61 i3s i5s i3s i06 i3S .7 -i3rO61 -i3$ R4 i3r [ i3q $h i3q *73 -i3P *14 i3p i3o [ $ i3l @@ -8105,7 +6817,6 @@ i3f ^2 K i3e *71 i3e i3c $a -i3C ,2 i3B $L i3b .7 i3b ,7 @@ -8122,7 +6833,6 @@ i33 *67 i32 ,6 i31 t i32 i31 i51 -i31 i32 t i31 $d i30 $s i30 ,4 @@ -8133,11 +6843,8 @@ i3_ .0 $. i30 i3* ^# $/ i2z -i2Y T4 -i2Y T1 -i2y D6 i2@ y2 -i2xO41 +i2x O41 i2x +3 i2w $x i2w $t @@ -8147,50 +6854,40 @@ i2u *54 i2t $r i2s $g [ i2s -i2p *34 i2n c i2n ^A i2n -i2MO62 +i2M O62 i2m [ i2l i2K y3 y3 i2j *13 -i2i $y +2 i2i +2 $y i2i *27 i2i i2f *53 i2e .4 -i2@ D5 i26 *25 i25 i23 *76 -i23 *67 i2@ ,3 i2= ,3 i22 $4 i21 i3s -i20 L9 i20 i2e i2+ .0 i1z i1- y1 t -i1-O71 +i1- O71 i1v y4 y4 -i1- t y1 -i1T *56 -i1S *02 i1r o0c i1r +0 i1r $! -i1r [ i1l $@ [ i1j i1i ^M i1g i4s i1e i69 -^i $1 C i1a .2 i19 p3 i1 -7 @@ -8200,46 +6897,32 @@ i11 D5 $! i11 $I $1 i1- -} i1 ^@ i1$ -^= i1 -i0 z4 D4 i0@ z2 -i0/ z1 i0y $s i0y i0z i0x ^E -i0w $l i0U T0 $i -i0U $i T0 i0t y3 -i0T ^N i0t $k i0r ^x i0q ^z -} i0M i0l t i0l $l i0l ^j i0j $j i0J i1M -i0H ^N i0H i11 $@ i0g $. i0f i0d i2x i0D ^H i0c $C -i0A ^P i0a i0J ^. i0A -i0a $@ i07 $S i06 $f u i03 ^A -i0- ^+ -i0 } -$! i0# $I $. ^i ^i ] ] @@ -8255,7 +6938,6 @@ $g $s $g o6k ^g ^l ^G ^J -^G i0F ^G $G ^g $f ^g ^D @@ -8265,37 +6947,29 @@ $G $. ^G $! ^. ^g ^g -fOA1] -f]OA1 -fO96*20 -fO8Ay4 -fO56*02 +f DA ] +f ] OA1 +f O96 *20 +f O8A y4 +f O56 *02 ^f ^x f u *12 ^f t ^9 -f t *21 +f *21 t ^f ^p $f o5h -^F i1G ^f D3 ^F ^A -^f ^9 t -f +4 [ f [ +3 -f *21 t -f*20O96 -f *12 u -f*02O56 $f $) $f { { ^f ^f } E Y4 T1 E Y1 o1@ -EO42i4L -EO41D7 -EO41$4 -$@EO31 +E O42 i4L +E O41 D7 +E O41 $4 $E u E T6 E T1 Y4 @@ -8313,106 +6987,74 @@ E o1@ Y1 E o0! E i2s ,3 ^E i2b -^e i0F ^e ^F ^e ^B ^e $8 -E.7O41 +E .7 O41 E *74 Y4 ^e ,7 E *68 $1 -E$4O41 +E $4 O41 E $1 *68 E $ E ^/ $D Z1 d Z1 [ -d [ Z1 -d y3 u -dO85u -dO81t -dO64 -dO53u -dO31] -d]O31 -dO24u -dO04snr -dO03c -dO02t -dO02 +d O85 u +d D8 t +d O64 +d O24 u +d snr O04 +d O03 c +d O02 t +d O02 $d ^x -d u y3 -duO85 -duO53 -duO24 d u o0T d u i8X -d u i7H -d u i6R -d u i6H +d i7H u +p1 i6R u +d i6H u d u i52 d u D1 -d u ^C -d u -5 -d u $3 -d u *04 -dtO81 -dtO02 +p1 u ^C +p1 u -5 +p1 u *40 d t i0J -d t $8 -d t *76 -d t +6 -d t $4 -dsnrO04 -d r c +p1 t +6 +p1 $4 t +r p1 c ^d ^r ^d o2r -d o1v -d o0T u d o0k $D $m d L7 [ d l $5 -d l $4 -d l $3 -d l *12 +p1 l $4 +p1 l $3 +p1 l *21 $d $k ^d ^k $d $j -d i8X u d i7w -d i7H u -d i6R u -d i6H u $d i5g -d i52 u ^D i1M $d ^h ^D $f -d D3 -d D1 u ^D ^d -d ^C u -d C -0 -d +B { +p1 C -0 +p1 +B { d 'A Y2 -D9 u $A D9 $A u D9 -6 -d $8 t D8 i5@ $d $8 D7 Y1 t -D7 t Y1 D7 o8. E D7 o13 -D7 E o8. -d *76 t D6 Y1 -d +6 t +p1 +6 t D6 p2 D6 o3D -D6 o1m D6 o12 D6 o0$ D6 k @@ -8420,89 +7062,64 @@ D6 -2 d *61 *3A D6 $@ $d ^6 -d -5 u +p1 -5 u D5 T5 $1 D5 so0 D5 o7. -d $5 l -D5 i3y D5 i3q D5 ^c -D5 $1 T5 D5 ^1 d .5 -d $4 t D4 p2 'A D4 o4D D4 o0W -d $4 l -D4 i11 D4 -3 D4 ,2 -D4 $ $ D4 D3 Y4 -d $3 u D3 r p2 -D3 p2 r D3 o1w -D3 o1s D3 l d -d $3 l -D3 d l -d *3A *61 D3 ^6 D3 $2 $@ D3 *01 -D2 o6n D2 o3d -D2 o0w D2 ^1 ^d +2 D1 i03 *21 D1 D6 -D1 c $4 D1 $4 c -d *12 l D1 *04 -D1 [ D0 R9 R9 -D0p1O04 -D0 C -d -0 C -d *04 u +D0 p1 O04 +p1 -0 C $d *04 ^f $. ^D ^D $@ $@ ^d C z5 r C { Z5 -c Z3 ^K +c ^K Z3 $c Z2 C Z1 T8 -cO81so0 -cO21 -cO04q +c O81 so0 +c O21 +c O04 q $c ^w c $u $s c TA T9 -c T9 TA C T8 Z1 ] c T4 ^c $t -cso0O81 C R8 t C R5 t $c $r C p2 +2 c o6{ -C o3Y C o2o -c o13 c $o ^1 $c $m $c $l -c ^K Z3 ^c ^j c i77 Y4 c i7! .7 @@ -8518,14 +7135,12 @@ $C $c C $9 p3 c $8 D6 ^c ^6 -$c $1 C $c $1 C } } ^C $. ^- ^C -^c ] ^b z2 E -^BO12 +^B O12 ^b t ^6 ^b ^t $b ^R @@ -8541,9 +7156,6 @@ $b i0t ^B ^a ^b $a $! *B9 -^b ^6 t -$B *04 -$b *03 $b ^` +0 ,B ^@ 'B @@ -8551,7 +7163,6 @@ $a Z5 $a Z3 ^a Z2 *90 $A Z1 -^. ^a Z1 ^A $z ^a ^z $A y5 @@ -8562,10 +7173,9 @@ $a $t ^a ^s $a ^Q $a p4 $1 -'Ap1OA4 +'A p1 OA4 $A o3a $a o34 -,A o2m $A o2d $A $l $A i6a @@ -8573,7 +7183,7 @@ $a i5c *36 ^A i36 $a ^f o0C $A +7 -*A6 *79 +*97 *A6 $A +6 $a ^6 ^a $6 @@ -8587,23 +7197,18 @@ $+ $a ^a $/ ^a ] ^+ $a -$9O71 -$9O01^K +$9 O71 +$9 O01 ^K $9 ^c ^9 ^b *26 -*9A u DB *9A DB u $9 $A +9 +8 -*97 *A6 -*96 i12 *93 -[ $9 .9 '8 Y2 $8 $W $8 T1 -'8 o49 $8 o3e -8 i6W $8 i6 @@ -8615,20 +7220,17 @@ $. *8A [ +8 +8 $8 $7 $8 $4 -'8 -2 -0 --8 $2 '8 -0 -2 +-8 $2 $. $8 ] $8 ] ^8 -+7 Y3 u -'7 Y2 --7O05 +7 u Y3 +'7 Y2 +-7 O05 -7 se3 $7 $S ^7 r Z2 -+7 oAB +7 o90 .7 o6L -7 o55 @@ -8638,7 +7240,6 @@ $7 o3u ,7 o3q -7 o2x .7 o0H -+7 i6% .7 i5D $7 i53 $7 i45 @@ -8655,35 +7256,30 @@ $! -7 ] +7 '6 y2 y2 +6 Y2 -^6O61 +^6 O61 $6 T5 -6 r --6 o79 +6 o77 -6 o58 -+6 o5; .6 o2b ^6 L0 ^a -6 i76 ,6 i6s -.6 i5s $6 i2r ,6 $A -6 $a $6 ^9 $. *68 -*67O52 +*67 O52 *67 o5D ,6 *76 $. *67 *54 *65 o04 *65 $A *65 *74 -*64 u d -*64 t d +*46 p1 u +*46 t p1 *64 i7M -*64 d u -*64 d t *64 ^c ,6 *45 +6 *43 @@ -8693,10 +7289,8 @@ $6 $3 $6 ^3 *62 snd *62 d 'A -$! *61 *60 i2- o5- *60 *71 K -*60 *52 $6 $0 $@ ^6 $! -6 @@ -8710,7 +7304,6 @@ $5 Z3 -5 Y4 Y4 $5 Y4 [ $5 [ Y4 -$5O61 $5 ^w ,5 u d $5 T5 @@ -8718,35 +7311,25 @@ $5 T5 ,5 o9* $5 o78 $5 o6u -.5 o6o +i7o O51 $5 o5@ --5 o4z -.5 o23 --5 o0T -5 o0r $5 o0M +5 o0A -5 K -5 i6% ^5 i4s -,5 d u -,5 d { -,5 { d -5 $A *57 o7$ -$. *56 k *56 -6 -5 *62 ^5 $6 *54 ^s *02 -$. *54 *67 *53 o5x -*52 o1u +2 *52 +2 o1u $5 ^2 *51 slC +5 $1 -*50O51 *50 i5e $. .5 $. ^5 @@ -8754,29 +7337,20 @@ $. ^5 -5 } } ^4 z5 t ,4 Z1 -^4O61 +^4 O61 -4 ^x $4 $U -^4 t z5 .4 p2 'A +4 o82 -+4 o5p $4 o54 --4 i5j ^4 i3d -+4 i3B $4 ^B ,4 $a $. *48 $. *47 -4 $7 -*46 u p1 -*46 u d -*46 p1 u -*46 d u *46 $. *46 $! -*45 i1T *45 *31 $@ *45 .4 +5 @@ -8784,66 +7358,53 @@ $@ *45 *43 ^a *43 -5 $4 ^3 -*41 *36 *41 +0 ^4 $1 -] ^4 .4 $. -4 $@ -4 $/ -.3 Z5 Z5 +Z5 Y5 .3 ,3 Z5 Z5 -+3Y5O53 -$3OB1 -+3O21 --3 u p1 --3 t d -$3 $S ++3 Y5 O53 +$3 OB1 ++3 O21 -3 p1 u +-3 p1 t +$3 $S .3 o5i -,3 o4& -3 o1v +3 o0t $3 iA3 $3 i3a ^3 i0f --3 d t $3 $d ,3 $A $3 ^a $. *38 *37 '4 $3 $6 -*35O31 +*35 O31 *35 o1u -,3 *52 +,3 *25 +3 $. .5 +3 .5 $. *34 o5j *34 o42 -*34 o21 *34 i5v -*34 +0 -*32 Z1 E -*32 E Z1 -,3 *25 +E *23 Y1 $3 $2 { *31 Y2 -*31O42+3 -*31 o2b -*31+3O42 +*31 +3 O42 $3 ^1 *30 ^s +3 $! $3 $* -[ $3 '3 ,3 ^3 $@ ^3 $! ^* $3 +2 y2 y2 -$2O31 +2 $x *30 ,2 T0 $2 t @@ -8851,18 +7412,15 @@ $2 $S +2 ^s +2 o4o .2 o4$ -.2 o3% +i4% O21 $2 o0W p2 .2 o0S +2 o0H $2 iA_ -+2 i8! $2 i7_ $2 i6y $2 i5* $2 i5@ -,2 i4e --2 i4+ $2 $c t $2 ^C $2 $6 @@ -8870,19 +7428,14 @@ $2 $6 *25 o7r *25 o3x *25 o0q -*25 *06 *25 *03 -.2 .5 *23 o7w -*23 $m +2 *30 $x +2 ,3 *21 $. Z1 *21 R1 R1 -*21 o5@ *21 o2w *21 i6 -*21 i2j *20 o5x *20 o2s *20 o0v @@ -8896,8 +7449,8 @@ $. $2 ^2 } $1 Z4 $1 Z3 c -$1O23 -$1O05 +$1 O23 +$1 O05 .1 ^w $1 ^U $1 t D8 @@ -8921,64 +7474,43 @@ $1 i7s $1 i7@ $1 i7- $1 i5< L5 -+1 i4D -,1 i3a $1 i2i -1 i28 $1 i0z $1 ^e -$1 D8 t -$1 c Z3 $1 c $1 $B *15 o1K *15 i5Y -[ *14 t *14 i3l -*14 *63 *14 *30 +1 *41 -{ *13 Y2 -^1 ^3 t *13 d c -*13 *54 -*13 $1 $3 -*12 ^P -*12dO04 +*12 d O04 *12 +2 $1 +2 $1 ^1 -*10 ^s +k ^s *10 o5z *10 o2h } ^1 -^1 ] ^- ^1 $0 Z5 -$* -0 Z1 ^0 z1 } +0 y5 E -0 y2 y2 $0 Y2 -$0O51c -+0O23y2 +$0 c O51 ++0 O23 y2 $0 T9 .0 R0 $0 oA1 --0 o8% +0 o2v -+0 o2F +0 o1u --0 i6y -.0 i3_ $0 i1e -^0 i1d -^0 i16 ^0 i1. -$0 E $0 D5 -$0cO51 $0 $a *07 o0q *05 o5x @@ -8986,17 +7518,14 @@ $0 $a *05 o1z *04 i5s ^z *04 $c -*04 $a [ *04 [ $a *04 $1 -*03 i7# *03 $h *02 y2 y2 -*02p2O0A +*02 p2 O0A *02 o0s *02 $A ,3 *02 ,3 $A -$@ *01 D3 +0 } $0 $ -0 { @@ -9019,10 +7548,9 @@ $` ^< $z Z4 $z Z2 y1 -$z y1 Z2 -$zO63 -^zO61 -$zO21 +$z O63 +^z O61 +$z O21 $z ^x ^z ^t $z $p @@ -9030,59 +7558,39 @@ $z o2w $z o0j ^z K $z i3d -^Z i1s ^z i0e ^z ^h $z $d -Z5 Z5 .3 -Z5Y4O73 -Z5O73Y4 -$*Z5O65 -z5O49 +Z5 Y4 O73 +Z5 O73 Y4 +$* Z5 O65 +z5 O49 z5 sCA -Z5 s7% -Z5 r Z3 -Z5dO6B +Z5 d O6B Z5 $A -Z5 .3 Z5 $\ Z5 $! Z5 $, Z5 $z -5 $z ^5 } z5 ^* -Z4 Z5 Z3 -Z4 Z5 T3 -z4 z4 u -Z4 z4 r -z4 Z4 r +Z5 Y4 T3 Z4 Z4 i26 -Z4 Z3 Z5 -Z4Z2O23 -Z4 Y5 Y3 -Z4 Y3 Y5 -{z4O72 -z4O47t -Z4O23Z2 -Z4O23d -z4 u z4 -z4tO47 -Z4 T3 Z5 +Y1 Z5 O23 +{ z4 O72 +z4 O47 t +Z4 O23 Z2 +Z4 O23 p1 } z4 t Z4 sWS Z4 s17 -z4 r z4 Z4 oAa z4 ] K -Z4 i26 Z4 z4 ^1 z4 -z3O46 Z3 $W Z3 T8 -z3 sc8 Z3 s.` -z3 r z5 -z3p2O78 +z3 p2 O78 Z3 oA Z3 o84 $ Z3 k @@ -9092,42 +7600,33 @@ Z3 $. -6 Z3 -6 $. ^z $3 z2 Z4 -z2 y5 z2 -Z2O23{ +Z2 O23 { Z2 u +0 -Z2 t d +Z2 t p1 z2 T5 z2 s0M Z2 s0g -Z2p1O21 -Z2 o7- +2 -Z2 o6b +7 +Z2 p1 O21 +Z2 +2 o7- +Z2 +7 o6b Z2 o6@ Z2 o4p -z2 o1# -z2 o0t -Z2 l $f +Z2 $f l z2 l ] z2 K p2 Z2 i5 Z2 i4p -Z2 $f l z2 ^E -Z2 d t ^@ z2 D9 -z2 D6 *14 +z2 *14 D6 Z2 $A $@ Z2 *96 -Z2 +7 o6b z2 *60 ] z2 ] *60 Z2 +6 Z2 ,4 y4 -z2 .4 .2 -Z2 +2 o7- z2 .2 .4 z2 ^1 z5 -z2 *14 D6 [ Z2 *12 Z2 $1 Z2 +0 u @@ -9136,36 +7635,30 @@ $^ Z2 } z2 ^, z2 $* Z1 y2 -z1 u $0 -z1 t i29 +z1 $0 u +z1 i29 t z1 r $c -z1p3O08 +z1 p3 O08 z1 o6k .1 -Z1 o3T +Y1 o3T Z1 o0s Z1 } i6a -z1 i29 t z1 i1z Z1 $F -$) Z1 E z1 ^e -Z1 d *B9 +Y1 p1 *9B z1 ^A z1 ^a Z1 -8 -[ Z1 ,5 +Y1 ,6 [ z1 ^5 Z1 *46 $+ Z1 $+ *46 Z1 $4 $5 Z1 ,4 { -z1 .1 o6k -z1 $0 u $* Z1 +0 $) Z1 -$/ Z1 $^ Z1 -^Z .1 ^z .1 $@ ^Z $/ ^z @@ -9189,27 +7682,24 @@ $y $b y5 Y3 [ y5 [ Y3 [ y5 Y3 -y5OA3 -y5O96t -Y5O84O02 -y5O84E -y5O83c -y5O82,7 -Y5O73t -y5O72 -Y5O63*40 -y5O54C -y5O32+0 -Y5O15 +y5 OA3 +y5 O96 t +Y5 O84 O02 +y5 O84 E +y5 O83 c +y5 O82 ,7 +Y5 t O73 +y5 O72 +Y5 O63 *40 +y5 C O54 +y5 O32 +0 +Y5 O15 y5 u T5 -Y5 u '8 +Y5 '8 u } Y5 u -y5tO96 -Y5tO73 y5 t } -y5 } t y5 sRD -y5 r E +r Y5 E y5 o6o y5 o5r Y5 o4- @@ -9217,38 +7707,27 @@ y5 o1i y5 o0s y5 o0g [ y5 $j -y5EO84 y5 D2 -y5 D1 c -y5cO83 -y5CO54 y5 c D1 -y5 c 'A -y5 ^B y5 'A c -Y5 '8 u +y5 ^B Y5 *82 -y5,7O82 -Y5*40O63 -y5+0O32 $y +5 y4 Z3 *56 -Y4Y4O04 +Y4 Y4 O04 y4 Y4 u y4 y2 c y4 Y1 -y4O84 -y4O63 -Y4O42 -Y4O34$@ -Y4$@O34 -Y4O32c -y4O32$a -Y4O04Y4 -y4 u Y4 -Y4 t k +y4 O84 +y4 O63 +Y4 O42 +Y4 O34 $@ +Y4 O32 c +y4 O32 $a +Y4 O04 Y4 +Y4 k t Y4 t D0 -y4 t ,4 +y4 ,4 t Y4 o4v y4 o3o y4 o2k @@ -9257,64 +7736,45 @@ y4 o1e y4 o0t y4 o0s y4 l *36 -Y4 k t Y4 ^J y4 i4@ -y4 E D8 -y4 E $4 y4 D8 E -Y4 D0 t +y4 E $4 y4 D0 -Y4cO32 -y4$aO32 y4 *71 *06 y4 *63 *50 -y4 *56 Z3 -y4 *50 *63 -y4 ,4 t -y4 $4 E y4 *42 -y4*38O23 -y4 *36 l +y4 *38 O23 [ y4 +3 y4 [ -1 -y4 *06 *71 -y4 *01 Y4 ] -y3Z4O51 +y3 Z4 O51 y3 Z1 y3 [ ^z [ Y3 y5 Y3 Y3 D3 y3 y2 t -}y3O64 -y3O53 -y3O51Z4 -y3O21o0b -y3 t y2 -Y3 t D3 +} y3 O64 +y3 O53 +y3 O51 Z4 +y3 O21 o0b +Y3 D3 t y3 T3 y3 t [ Y3 o9. Y3 o7. y3 o3x y3 o0g -y3o0bO21 y3 i3 -y3 i0v -y3 D8 +3 -Y3 D5 $* +y3 +3 D8 Y3 $* D5 y3 D4 Y3 D3 Y3 -Y3 D3 t Y3 D3 p4 y3 ,8 Y3 -y3 '8 .2 +y3 .2 '8 y3 +5 Y3 +4 -y3 +3 D8 -y3 .2 '8 Y3 *26 D5 Y3 *20 *32 y3 +1 y3 @@ -9322,31 +7782,22 @@ y3 +1 y3 y3 $ $! y3 [ y3 -$* y2 Z1 -Y2 y5 t -y2y2O83 -Y2 y2 l +y2 y2 O83 Y2 Y1 $a -Y2O42 -Y2O32l -Y2O32 -Y2O17C -y2O08 -y2 u o32 +Y2 O42 +Y2 O32 +Y2 O17 C +y2 O08 +y2 o32 u Y2 u -6 -y2 u } y2 } u y2 ^u [ y2 $u -Y2 t y5 Y2 T9 T8 -Y2 T8 T9 y2 t { -y2 { t Y2 sDj y2 sBv -Y2 s20 -y2p1O04 +y2 p1 O04 y2 o7t Y2 o7g Y2 o6l @@ -9354,7 +7805,6 @@ Y2 o6* Y2 o5x y2 o4j y2 o4i -y2 o32 u y2 o2v y2 o2m Y2 o2@ @@ -9363,25 +7813,20 @@ y2 o1# y2 o0p y2 o0h y2 o0d -Y2 l y2 -Y2lO32 -Y2 l ,B +Y2 ,B l y2 i4d y2 i4 Y2 i2v -y2 i0b y2 ^E [ y2 E y2 ^d D4 -Y2CO17 Y2 ^C -Y2 ,B l Y2 *BA Y2 +B Y2 $a -5 y2 $A *42 Y2 -6 u -Y2 +6 d +Y2 +6 p1 Y2 -5 $a y2 *51 Y2 *47 ^a @@ -9394,29 +7839,25 @@ Y2 *35 y2 *35 y2 -3 y2 *26 -y2 +2 *40 y2 *14 y2 -1 y2 *04 ^a y2 *01 $. -y2 $. *01 Y2 $+ Y2 $* Y2 $_ y2 { $ $@ y2 Y1 $z Z2 -Y1Z5O23 Y1 $@ Z1 Y1 z1 -Y1O23Z5 -y1O14t -Y1O0A +Y1 O23 Z5 +y1 O14 t +Y1 O0A Y1 $x -Y1 u $E +Y1 $E u $! y1 u -y1tO14 -y1 p2 ] +z1 p2 ] Y1 o4b Y1 o0L y1 ^L o1K @@ -9424,24 +7865,19 @@ y1 i6s Y1 i64 Y1 i5r y1 i5h -y1 i0W y1 i0@ y1 ^G *32 -Y1 $E u Y1 ^d z1 -Y1 d +A +Y1 p1 +A Y1 c $# -Y1 $# c Y1 ^c y1 ^b Y1 $6 [ Y1 .4 $@ Y1 [ -$@ [ Y1 } $ Y1 ^Y $1 ^@ y1 ] -^@ ] y1 ^, y1 $@ ^y $x ^y @@ -9451,174 +7887,154 @@ $x iAe OA2 ^x ^A O93 -O92o83 -O92+8 -O92$1 -O91$A -O82i9et -O82$. -O81oA8 -O81D1o2e -O81$2 -O74u -O72c$! -O72$!c +O92 o83 +O92 +8 +O92 $1 +O91 $A +O82 i9e t +O82 $. +O81 oA8 +O81 D1 o2e +O81 $2 +O74 u +O72 c $! ^x *64 -O63$A -O62$7 -O62$. -O61$z -O61O81 -O61O05 -O61$w$j -O61to9R -O61o6- -O61o1m -O61^c -O61^At -O61*73 -O61*52 -O61$5 -$*O58 -O56i4b -O54$1 -O54[ -O53o1S -O53$3 -O53$1 -O53$. -[O53 -O52rp5 -O52p5r -O52o30 -O52i5w -O51^z -O51o0l -O51o0J -O51i3* -O51$i -O51$d -O51^6 +O63 $A +O62 $7 +O62 $. +O61 $z +O61 O81 +O61 O05 +O61 $w $j +O61 t o9R +O61 o6- +O61 o1m +O61 ^c +O61 ^A t +O61 *73 +O61 *52 +O61 $5 +$* O58 +O56 i4b +O54 $1 +O54 [ +O53 $3 +O53 $1 +O53 $. +[ O53 +O52 r p5 +O52 o30 +O52 i5w +O51 o0l +O51 o0J +O51 i3* +O51 $i +O51 $d ^x ^5 -O46[ -O43y5D9 -O43Y4c -O43p2O04 -O43o4. -O43cY4 -O43$A -O42o11 -O42i62 -O42$@ -O41Y5] -O41up1 -O41p1u -O41o2x -O41o0D -O41^I -O41$.-2 -O41-2$. -[O41-2 +O46 [ +O43 y5 D9 +O43 Y4 c +O43 p2 O04 +O43 o4. +O43 c Y4 +O43 $A +O42 i62 +O42 $@ +O41 Y5 ] +O41 u p1 +O41 o2x +O41 o0D +O41 ^I +O41 $. -2 +O41 -2 $. +[ O41 -2 O3A -O35Y1 -[O35 -O34Cf -O32o3f -O32i3y -O32i0n -O32D1$1 -O32$1D1 -O32$@ -$*O32 -O31Y4t -O31$w -O31tY4 -O31^t -O31o3u -O31o2z$@ -O31$@o2z -O31o1w -O31o1s -O31D1 -O31$0 -O25Y2f -O24z1 -O24p2 -O23y3Y2 -O23Y2y3 -O23tK -O23sbW -O23^o -O23Kt -O23f+3 -O23^2{ -O21o0w -O21o0T -O21o0G -O21l*30 -O21i54 -O21^e -O21^d -O21$8 -O21^8 -O21*30l -$*O21 -$.O21 +O35 Y1 +[ O35 +O34 C f +O32 o3f +O32 i3y +O32 i0n +O32 D1 $1 +O32 $1 D1 +O32 $@ +$* O32 +O31 Y4 t +O31 $w +O31 ^t +O31 o3u +O31 o2z $@ +O31 $@ o2z +O31 o1w +O31 o1s +O31 D1 +O31 $0 +O25 Y2 f +O24 p2 +O23 y3 Y2 +O23 Y2 y3 +O23 t K +O23 sbW +O23 ^o +O23 f +3 +O23 ^2 { +O21 o0w +O21 o0T +O21 o0G +O21 *30 l +O21 i54 +O21 ^e +O21 ^d +O21 $8 +O21 ^8 +$. O21 $x .2 -O1B[ -O19u -O18O13C -O18CO13 -^*O18 -O17Cz4 -O15k -O15f*02 -O15*10 -}O14 -O13p5 -O13i2J -O13$@ -O12y5O52 -O12^t -O12o4g -O12^j -O12$5 -O12$.{ +O1B [ +O19 u +O18 C O13 +^* O18 +O17 C z4 +O15 k +O15 f *02 +} O14 +O13 p5 +O13 i2J +O13 $@ +O12 y5 O52 +O12 ^t +O12 o4g +O12 ^j +O12 $5 +O12 $. { $X $1 -O0Az2 -O0AZ1 -O08O04 -O07z3 -O07p5 -O06u -O06,1 -O06-0 -O05u -O05K -O05c$2 -O05$2c -O04^j -O04$2 -O03y3 -O03^wu -O03o84 -O03^m -O03i7. -O03i0I -O02O71 -O02^v -O02o1j -O02^o -O02$2 -O01Y3 -O01$^Y1 -O01i5x -O01$5 -O01-0 +O0A z2 +O0A Y1 +O08 O04 +O07 z3 +O07 p5 +O06 u +O06 ,1 +O06 -0 +O05 u +O05 K +O05 c $2 +O04 $2 +O03 y3 +O03 ^w u +O03 ^m +O03 i7. +O03 i0I +O02 O71 +O02 ^v +O02 o1j +O02 $2 +O01 Y3 +O01 $^ Y1 +[ i5x +O01 $5 +O01 -0 } ^x -[ $x ^x } -^x ] $w ^z ^w $y ^w $q @@ -9627,11 +8043,9 @@ $w ^z ^W o1S ^w o1h ^w ^M -^W i6L ^w i5z $w i3g ^w i2j -^W i1Y ^w i0d ^w ^h p3 ^w $f @@ -9644,69 +8058,53 @@ $w $. $- $w ^w ] ^v ^z -^vO13 +^v O13 $V i7B ^v i3j -^V i1P ^v i1g ^v i1c $v i0@ $v D1 $v $a ^v *46 -$v [ $! ^v -u z4 y4 u z4 D7 -} u Y5 u Y4 Z1 u Y4 D5 u Y2 [ $u y2 -$! u y1 -uO43 -u t D4 +u O43 +l D4 u T2 ^U $t u $s Y1 $u $s ^u ^R -u p1 -7 -u p1 ,6 $u o4! ^U o3- ^u o2K -u o2G u o2C -u o2A u iAE u i6H -^u i6^ u ^F $E ^u ^f ^u ^E -u d y1 ^u D5 } -u d +5 -u D4 t u D1 p1 -u D0 +[ u u *87 u +6 $U } $! ^* u -} t z4 t Z2 D6 t Y4 T1 t Y3 R3 t Y3 D6 t y2 *42 -tO31O41 -^TO13u -tO04d +t O31 O41 +^T O13 u +t O04 d ^T ^W -^TuO13 -t TA T9 t T9 TA t T1 Y4 t $S $E @@ -9738,33 +8136,25 @@ t D7 ] t ] D7 t D6 Z2 t D6 Y3 -t d +6 TA TB ^t $a T9 ^2 -T8 iA+ T8 $0 $! T8 T7 T1 -t $7 i1A ^T +7 T6 Y2 T0 T6 T0 Y2 T6 $0 Z1 $# T6 ] T6 $* -] $* T6 T5 T0 ^6 -T5 o7% T5 o0! -T5 i0z T5 ^4 T5 $@ ^T $5 T4 i4 T4 $6 -t *41 -[ t *41 T3 p3 'A T3 o76 T3 i3' @@ -9774,17 +8164,15 @@ T3 .2 ] T3 $1 T3 $# ^t -3 -T2 o7^ T2 $$ T2 ^@ T2 ^! ^T .2 -T1 o7* T1 o04 T1 i3i T1 ^1 t ^1 -T0O82 +T0 O82 T0 oB1 T0 o5P T0 o5j @@ -9794,7 +8182,6 @@ T0 i4B $! T0 D2 T0 $, $@ T0 $. -$@ $. T0 ^t $@ ^t ] ^S z2 @@ -9810,10 +8197,8 @@ ssZ T5 $s so0 ssc ] ss- -sR*O23t -sR*tO23 +sR* O23 t srs $. -srp [ sr8 Y1 ^s ^R sqD Z4 @@ -9828,10 +8213,8 @@ sn smp ,2 smp smk t -smk K smk smj -sMd Y3 ^S $m sls slr Z2 @@ -9852,7 +8235,7 @@ $s i54 si1 TA si1 l $$ si1 -sH-O35 +sH- O35 shw sH* t shK [ @@ -9867,7 +8250,6 @@ sdg sdf z5 scz p1 T0 sck -scf y3 ^s ^C sc* saO t @@ -9875,7 +8257,6 @@ sa) o0( sai $S ^A $s $a -s9] y3 s9a $. s97 s93 @@ -9889,7 +8270,6 @@ s74 s6 Y1 s6* t D5 s6f -s6* D5 t s5U i7D s5i t s5B K @@ -9911,7 +8291,6 @@ s1U i8D s1| T5 s1? l s1f ^8 -s15 Z3 s13 c $s ^1 } s1$ @@ -9920,7 +8299,6 @@ s0O c s08 Y2 s04 $# s03 l -s03 c s?0 $# ^S s.- @@ -9928,38 +8306,29 @@ $) s-( $- ^s r z5 ^. r $y -rO34z1 -rO27t +r O34 z1 +r t O27 $r ^w ^r ^u -rtO27 r ^t $R $r ^r $R -r ] p1 r o3q { r L0 $r $j ^r i4s ^r i2z r i2v -rfO5B -rfO4B -r d c -r ] d +r f O5B +r f O4B RA } { R7 -R6O03t -R6tO03 -R6 i3U -r ^6 f +R6 O03 t R6 R5 t D4 -R5 D4 t r -4 [ R3 R3 R3 o46 -R2 o3_ r *24 r '2 R0 z1 C @@ -9969,18 +8338,14 @@ $! ^R r ^\ $q Z4 ^q z2 -$Q Y1 -}qO46 -qO1Ap1 -q t D2 +} q O46 +q O1A p1 ^q o8q ^q o5h q l -5 -q l ^q i4z { ^q i2w $ q f -q D2 t $q $a ^q $a ^q ^a @@ -9992,8 +8357,7 @@ $q -5 ^Q ^! $q $P Z2 -^p y1 -{ ^P sp1 +^p z1 ^P ^S $p ^s $p ^p @@ -10005,90 +8369,53 @@ $p L7 $p i2v ^p i2_ ^p *76 -p5 Z1 { +p5 Y1 { p5 y5 -p5O86 +p5 O86 p5 t 'B p5 o8 $5 $. p5 i7q p5 i4s ] -p5 ] i4s -p5 'B t p5 -A -p5 $5 o8 -p4O05K -p4 t 'B -p4 o7l o6a +p4 K O05 +p4 'B t p4 o6a o7l p4 o0B -p4KO05 -p4 'B t ] p4 ^a -]p3O0B -p3 k *53 -p3 i0a +] p3 O0B p3 ^A z5 ] p3 '9 -p3 *53 k -p2O9B -p2O95t -p2O85,7 -p2O6Al -p2O38O78 -{p2O02 -p2tO95 -p2 s3c -p2 p1 -p2lO6A +p2 O9B +p2 O95 t +p2 O85 ,7 +p2 O6A l +p2 O38 O78 p2 l [ p2 ^j p2 c p2 $A $a p2 'A *32 p2 -8 y2 -p2,7O85 -p2 *32 'A $p *23 p2 $0 Z1 -p1OB4t -p1OA1] -p1]OA1 -p1O76t -p1O73O03 -p1O53] -p1]O53 -p1O07D7 -p1 u i6R -p1tOB4 -p1tO76 -p1 t i72 -p1 t $5 +p1 OB4 t +p1 t O76 +p1 O73 O03 +p1 O53 ] +p1 O07 D7 +p1 i72 t p1 t +4 -p1 t $4 p1 t *36 -p1 t $3 p1 t +0 p1 sa4 p1 o75 p1 o6v p1 o6A R6 -p1 l *21 p1 $J -p1 i72 t -p1 i6R u p1 i6q p1 i6A -p1 i4r p1 D8 'B -p1 +B { -p1 'B -p1 'A -p1 $5 t p1 +4 t -p1 $4 t -p1 $3 t -p1 *36 t -p1 *21 l p1 +0 t $p -0 ^o u $o @@ -10097,7 +8424,6 @@ $o $p ^O o4> ^o ^L ^o i1p -^o i0I $o ^H oBi oB7 @@ -10106,9 +8432,7 @@ oAq oAM oA9 oA6 .8 -] oA4 oA1 T0 ] -oA1 ] T0 $! oA0 o9. Z1 o9y @@ -10116,7 +8440,7 @@ o9J o9c o99 o97 $& -o94O45 +o94 O45 o93 T4 $' o9. ,2 o92 @@ -10131,13 +8455,12 @@ o8c D1 o8C o8a $1 $- o89 -o88O51$A -o88$AO51 +o88 O51 $A +o88 $A O51 o86 ^T o86 o8 $4 o84 -o82 +6 o8! .2 o8@ *16 ^@ o81 @@ -10150,11 +8473,9 @@ o7 Z4 o7z *30 o7x o7w -3 p3 -o7v Z1 $. o7u ] o7u o7u -o7@ T6 o7t +2 o7R u o7Q .6 @@ -10169,36 +8490,28 @@ o7I ,8 o7i $. o7G u o7d t ] -o7c l o7C E o7% *86 $@ o78 -o77 +6 o7# $7 o76 o62 o7% .5 o74 -o70 T8 o7# $- o7- ^$ o7/ o6. Z2 o6. Y2 o6_ Y1 -o6*O42 +o6* O42 o6v ] -o6t ,4 o6t o6s $h o6s $! o6R $F -o6# R7 ] o6r o6Q c o6n *53 -o6n *20 -o6n *02 -o6L *07 o6K o6j Y2 ] o6j @@ -10206,19 +8519,13 @@ o6j o6i $! o6G +0 o6f -o6{ E -o6@ D3 $@ o6d -o6{ c o6b D4 -o6b *71 o6b *43 o6a ^7 -$O *6A o68 $c o68 o6@ ,7 -o6 -7 o66 $* o65 { o6# .5 @@ -10237,7 +8544,7 @@ $( } o6) o5z ,6 o5z $! o5y $1 -o5/O62 +o5/ O62 o5X o5w *52 o5w *23 @@ -10245,8 +8552,7 @@ o5T u o5T *02 o5s Z2 o5s *21 -o5rO02 -o5q -7 *61 +o5r O02 o5q *61 -7 o5P T3 o5o ^g @@ -10257,38 +8563,28 @@ o5m o5L ^a ^q o5l ,7 o5L .4 -o5l *21 o5l +0 $! o5L $. o5l o5K o5j t o5j +0 -o5i .3 -o5FO31 +o5F O31 o5f *30 o5f } o5d i6r -o5D D4 o5d *67 -o5c Y1 o5c i5u o5b $z -o5a E -o59 T3 o59 o58 $0 o58 o5# ,6 o5, ,6 -o55 -7 o54 +6 o5. .4 o53 o33 -o53 ^E o52 o21 -o5@ *21 -o51 *35 o5$ ^$ o5. $! o5_ @@ -10310,13 +8606,11 @@ o4n +9 o4l o5i o4l *51 o4; L4 -o4l *15 o4j o4H +7 -o4h .5 o4g $! o4F $G -o4BO52 +o4B O52 o4b $x o4b $W o4B $! @@ -10332,32 +8626,24 @@ $. o41 o41 o4# $# o4< -o3zO41 +o3z O41 o3z t o3Y L3 o3_ y3 -o3x D1 -o3x c o3x *20 o3w ^j o3w +2 o3u +4 *31 -o3u *31 +4 $! o3u -o3TO12 +o3T O12 o3t -^\ o3. s\k o3R -6 o3r o3Q o7H l -o3q +7 o3q *64 o3q +5 o3p ^s o3o t d -o3o d t -o3! o2! -o3N Z1 o3m o2u o3M *43 o3j -5 @@ -10366,29 +8652,22 @@ o3i [ o3i o3@ $G o3F .4 -o3e T1 o3e D4 o3e $8 o3e *45 -o3DO51 +o3D O51 o3d +5 o3b $r -o38 Y1 o38 -o3! *70 o36 +0 o34 +4 o34 ] o3_ +4 o3% *30 -o3! *03 o3. $0 o3, ^, -o2z L7 o2z +3 -o2y E o2x K D7 -o2@O51 o2x -3 o2x *14 $! o2X @@ -10411,7 +8690,6 @@ o2p -5 o2p +0 o2{ L2 o2k ^x -o2* k t o2k o1u o2k +3 o2j *41 @@ -10419,7 +8697,6 @@ o2j o2i t o2i o2h $k -o2g u o2g $f o2G +3 $@ o2g @@ -10427,7 +8704,6 @@ o2F *20 o2e k [ o2c *03 o2B $8 -o2b *13 o25 *24 o23 $1 $. o22 @@ -10439,22 +8715,13 @@ $. o2, o1y $| s|@ o1@ y2 o1X $. [ -o1X [ $. -o1wO31 -o1w D3 o1w *21 } o1w o1v i0y -o1V D4 o1u .0 *60 -o1) T6 -o1R u o1P y3 l -o1P l y3 -o1p *32 o1o *43 *35 o1. ^k -o1I *35 o1i +0 o1i $@ o1h ^q @@ -10472,10 +8739,7 @@ o16 K o14 ^n o1- *41 ] o14 -o13 l -o13 E o12 $L -o12 D6 o11 T0 o11 K o11 D5 @@ -10487,14 +8751,10 @@ o0Z $5 o0. z2 o0Z $. o0Z $! -o0z { o0y .6 o0y *32 -o0y *23 o0x d -o0WO41 -o0wO21 -o0w t +o0W O41 ^; o0w $d o0w .5 o0w +2 @@ -10502,15 +8762,11 @@ o0W *18 o0v *27 o0t p3 'A o0! T7 -o0T .5 o0* t *30 o0$ T1 $% -o0$ $% T1 -o0( T1 $# o0T -o0sO61 +o0s O61 o0S T2 -o0s $p o0s o2t $* o0S o0S @@ -10521,14 +8777,12 @@ o0R -7 o0q ] r o0q ^m [ o0q -o0P i0U +^U o1P o0P ^5 -o0p .3 o0P $* o0p $! [ o0o o0m y2 -o0MO42 o0M T4 o0M $. o0M @@ -10542,11 +8796,9 @@ o0j Z1 o0j +5 o0J $* o0j $- -$- o0j o0i ^P o0i ^c o0h i0j -o0g u o0g i1u o0g -2 o0f z1 @@ -10561,7 +8813,6 @@ o0d y2 o0D u o0D $6 o0d *32 -o0! c o0B y2 o0b y2 o0A z2 @@ -10570,13 +8821,11 @@ o0a ^z o0A ^B o0A $4 o0a *0A -o06O61 +o06 O61 o06 $u o06 D6 -o0# *61 } o06 $. o05 -o0* *30 t [ o02 o01 ^L o01 ^k @@ -10597,15 +8846,14 @@ $m Z3 ^M z2 $m y2 $m Y1 o7w -$m Y1 c +$m c Y1 ^m $y -$MO21 +$M O21 $m ^v ^M ^P ^M o2A ^m o1g ^M o0p $* -^M $* o0p ^M $n ^m ^j ^M i8m @@ -10614,11 +8862,9 @@ $M i3m ^m i2- ^m i1c $m i0l -$m c Y1 ^m ^C ^m $a p3 $m ^4 o8. -$m *23 ^M *13 ^m $0 Z1 ^m $. @@ -10633,26 +8879,19 @@ l T4 { l str l ss3 l siD -l s1? $l $s -l r { -l } r $l o6V ^l o2s -l o0! ^l ^N $L $l -l k .3 $l $j -l i7c $l i7_ $l i6d ^l i5x ^l i1q ^l i1D { -$l i0w $l $e t -l d -6 +l p1 -6 $l ^d ^l ^d $l ^A @@ -10661,13 +8900,11 @@ L9 ^L $8 L8 L7 i4t -l ,7 *52 +l *52 ,7 L6 $r { L6 r L6 i2w -l *52 ,7 L4 i4p -l .3 k l *25 y4 L1 { L0 z1 *71 @@ -10676,7 +8913,6 @@ L0 ^v $. ^L ^L $* ^@ ^L -l [ $* ^l $. $l } ^l @@ -10686,12 +8922,12 @@ K Z2 ^k z2 k y2 *51 k y2 -4 -KO31 +K O31 k ^x K $w k R0 -Kp2O0B -kp2O0A +K p2 O0B +k p2 O0A k ^p K o7z k o7f @@ -10702,13 +8938,12 @@ K o3z $k o3x k o33 K o3* -K o2f *41 +K *41 o2f k o1r $@ k $@ o1r K o0w -k o0m *12 +k *12 o0m k ^o -K l T1 ^k ^L k K *13 } K k @@ -10734,16 +8969,12 @@ k c ^K ^B K .8 K $7 -k *65 } K *50 -K *41 o2f K ^3 ^F k *20 [ k .2 ^k $2 k *13 K -k *12 o0m -k *12 ^K $# ^k $j Z3 @@ -10755,7 +8986,6 @@ $j Z3 ^J i1i ^J i1c ^J i0M -$j i0l $j *63 [ $j $. ^_ ^j @@ -10772,11 +9002,10 @@ iA1 -5 iA_ ^i $A ^i ^A -i9.O52 -i9 O31 +i9. O52 +i9 O31 i9u L8 -i9qO15 -i9m oB1 c +i9q O15 i9m c oB1 i9e $1 i9 +B @@ -10784,7 +9013,7 @@ i9 +B i93 oAA $] i9[ ] i9 -i8-O34 +i8- O34 i8. s=+ i8s ] i8h $1 @@ -10793,7 +9022,7 @@ $@ i8a i8a i89 $. i83 o9. -i82O42 +i82 O42 i81 $1 i8@ $# i8@ @@ -10801,14 +9030,12 @@ i8/ $. i7z i7Y $* ] i7u -i7tO52 +o6t O51 $! i7r $= i7q -i7pO42 -i7p R4 +i7p O42 i7p -6 i7o $1 -i7M *64 i7l *67 i7^ ^k ] i7h t @@ -10817,10 +9044,9 @@ i7E u i7e ,8 i7a ] $* i77 -i76 -6 i75 D3 i75 $8 -i74O53i6g +i74 O53 i6g i74 $A i72 $D i7. +2 @@ -10832,16 +9058,13 @@ i6z } ^t i6z o7o i6/ Y3 i6x $A -i6=O01 i6x -i6W -9 [ i6w i6t i6s $! -i6qO02 +i6q O02 i6n i6/ ^L -i6K L7 i6k i6j u i6I c @@ -10849,26 +9072,22 @@ i6* i4* i6h -0 i6g i6e i6g [ -i6eO21 +i6e O21 i6e ,8 i6e *02 -i6D +8 i6a o5r -i68 T3 i68 $( i6@ $8 i6! $7 i6 ,7 i64 *75 -i63 .7 [ i63 -i6 *21 i62 $! i62 [ i6- $2 i6 .2 -i61O01 -i61 .5 +i61 [ +i61 o51 i61 $! i6. ^1 i6= $1 @@ -10879,17 +9098,13 @@ i6& ^% i6/ ^$ i6_ i6 ^_ -^* i6? i5z ,3 -i5ydO06 -i5Y *16 +i5y d O06 i5x *76 -[ i5x i5w *04 i5@ T4 i5t .3 i5t $. -i5s T6 i5o o2n i5N ^4 i5K u @@ -10897,17 +9112,14 @@ i5h i0k i5h .4 i5g r i5g DB -i5G *07 -i5f *47 i5f i5d o6e i5d $A i5D $2 $! i5D i5d -i5cO62 +i5c O62 i5C l $2 -i5C $2 l i5 C i5c i5b t @@ -10922,7 +9134,7 @@ i57 ^C i5# ,6 i55 i7. i55 ^8 -i54O62 +i54 O62 i5( .4 i53 $9 i52 $@ @@ -10939,12 +9151,8 @@ i4y y1 i4 y4 i4w $q i4w D6 -i4w -1 -i4vO45c -i4vcO45 -i4u *52 +i4v c O45 i4t *63 -i4@ T6 i4* T3 i4t $3 i4s ^z @@ -10952,17 +9160,15 @@ i4r ^s i4r $I i4r *54 o4e i4q $r -i4PO14t -i4PtO14 +i4P O14 t i4o i0@ i4m l i4m i4g i4( $m -i4l -1 i4k $+ i4k $/ i4k $! -i4jO03 +i4j O03 i4j r i4i o5c i4i o3z @@ -10971,14 +9177,12 @@ i4/ i5* i4i *16 $. i4i i4i -i4h T1 i4f T2 i4f $A -i4bO02 +i4b O02 i4a i5s i4a i2v i4a *13 *04 -i4a *04 *13 i49 ,5 ^? i49 i48 o53 @@ -10996,10 +9200,8 @@ i4. .3 i42 i4# i42 .3 i4. *20 -i41 t i55 i41 i55 t i41 .3 -i41 ^$ i40 $A i40 ^a i40 -7 @@ -11011,18 +9213,16 @@ i4$ $* i4- $@ $] i4[ $> i4< -^# i4* ^$ i4. ^` i4- i3y o2q i3y *70 i3x i22 i3x $g -i3)O16 +i3) O16 i3w ^Q i3w ^p i3v -i3@ T6 i3S D5 i3r i2w i3r ^g @@ -11040,16 +9240,15 @@ i3m +0 i3K o2* ,3 i3j L3 i3i } -i3hO32^h +i3h O32 ^h i3h o2c -i3fO12 +i3f O12 i3e C i3* D6 i3d ,2 i3- $D i3d $* i3C u ^D -i3C ^D u i3A C i3 $A i39 ^c @@ -11058,26 +9257,22 @@ i37 $, ^# i37 i36 i58 i35 $. -i3_ *40 -i3 ,4 +i3 o4 i34 i33 *A8 i33 ,4 $. i33 i32 $d -i32 *01 i31 i30 -i3. ^$ -i2zO42 +i2z O42 i2z *32 p4 i2Y +1 i2x Y1 -i2@O51 +i2@ O51 i2w { L0 i2W '9 i2v ^b i2u y3 -i2u *45 i2s $v i2r u i2q ^w @@ -11093,17 +9288,14 @@ i2h .0 i2e L5 ^A i2d i2c D8 -i2a .3 $! i2a i2a i27 -i2& ,6 i23 $2 -i21 *37 [ i21 i2@ $. i2_ -i1yO43 +i1y O43 i1x ^r i1x $5 i1x $. @@ -11111,11 +9303,9 @@ i1x $. i1w ^7 i1w *03 i1v -3 -i1uO41+2 +i1u +2 O41 i1u ^s -i1u+2O41 i1S $@ [ -i1S [ $@ i1r *73 i1q p2 'A i1P $6 @@ -11129,14 +9319,10 @@ i1l $! i1_ i7_ i1i i1g i1a -i1g ,4 i1f D7 i1e i2l -i1d L5 i1d ^b i1- D7 -] i1d -i1C L2 i1A $a i1a *20 i19 -0 @@ -11145,7 +9331,7 @@ i18 T2 i18 i04 i15 i7. i14 ^d -i11O51 +i11 O51 i1- *13 i10 L9 i10 ^c @@ -11154,15 +9340,10 @@ i10 *17 i0z Z2 i0z $m i0z i2. -i0@ z5 -i0* z3 -i0- y1 +^* z3 +^- i1- i0x ^f -i0X i0w $V -0 -i0w -0 $V -i0W -i0U i0t ^j i0T ,9 i0s $w @@ -11171,44 +9352,26 @@ i0P i0O i0n $d i0m o3v i0M ,5 -i0L z2 i0l ^R -i0L i1i -i0? L0 -} i0L +^i ^L i0K ^O c -i0k ^b -i0j ^w i0j ^R [ i0j i0h ^l i0g i1h -i0e -i0c ^u i0c o0v i4s -i0c i4s o0v i0b $2 i0* $b i0A o2@ i0A i6b -i0A $A -0 +$A ^@ i0a ,5 -i0A -0 $A i09 i31 p4 i08 y1 -5 i08 i39 -i08 ^0 i06 $* -i03 -i02 ^f -i0@ .2 -i01 -5 i00 ^D -} i00 -i0% $% -i0@ } i0- $_ -$# i0+ ^i $@ $h Z5 ^h z2 @@ -11219,10 +9382,8 @@ $h $p ^h ^o $h $l ^h i0P -^H i0B ^h ^A $h $a -^H *23 $h *21 $H ^g z2 @@ -11236,10 +9397,7 @@ $G o1W ^G ^L $g ^l ^g i2p -^G i1T ^G i1r -^G i1K -$g i0G $g $h ^g ^h $G $B @@ -11250,28 +9408,24 @@ $G ^g $! $f Z5 'A $f ^z -fO81 -fO78 -fO76K -fO6Ak -}fO69 -fO63] -f]O63 -fO32 -}fO2A -fO24K +f O81 +f O78 +f O76 K +f O6A k +} f O69 +f O63 ] +f ] O63 +f O32 +} f O2A +f O24 K f u -7 -f u *21 -^F $S } +^F ^S ^f $s -$ f q ^f o46 ^F o1G ^F ^M $F ^L -fKO76 -fkO6A -fKO24 +f K O76 f K -6 $f i5x ^f i0y @@ -11281,32 +9435,26 @@ $f d ] f *B8 *21 f -7 u f -6 K -f *21 u -f *21 *B8 f *02 r $! ^f [ $f E z2 ] E ] z2 -$) E Z1 E Y4 T2 E Y1 i0@ -EO31T2 -$eO21 +E T2 O31 +D2 $e ^E u i3E -ET6O41 +E T6 O41 E T2 Y4 -ET2O31 $e ^t E so@ $E ^S ^e ^s -E q Y1 E p4 '9 E p2 'B E o6N ] -E ] o6N -E o5L D6 +E D6 o5L E o4L E o2u E i8* $* @@ -11316,11 +9464,7 @@ E i5# $! E $! i5# $e i4r $e i4b -^E i3E u E i2B -^e i1r -E i0@ Y1 -E D6 o5L ^e ^c E *78 *98 ^E $7 @@ -11332,102 +9476,63 @@ $. ^E ^e } $d Z5 u ^d z2 E -d Z2 *76 +p1 Z2 *76 d y5 u -d Y2 u -d y2 u -d Y2 t -d Y1 ,6 -dOB1O04 -dOA3] -d]OA3 -dOA1O03 -dO83t -dO67l -dO62l -dO56 -dO51t -dO05O92 +p1 y2 u +p1 Y2 t +p1 Y1 ,6 +d OB1 O04 +d OA3 ] +d ] OA3 +d OA1 O03 +p1 O67 l +d O56 +d O05 O92 d ^v -$d u Z5 -d u y5 -d u Y2 -d u y2 -d u K d u i72 -d u D2 -d u *54 -d t Y2 -dtO83 -dtO51 -d t i73 -d t i72 +p1 u O21 +d i73 t d TA d t -9 d T8 d t *68 -d t *67 d T5 -d t *45 $d $t d oB4 d o74 d o50 -d o4v ^d o1i -^; $d o0w -dlO67 -dlO62 ^d ^L -d K u d ^k d i9@ d i9, $D i81 d i7s t -d i73 t -d i72 u -d i72 t d i6w $D i6L ^d i5g -d i4b $d i2g -^d i1z ^D i0x -^D i0S -d $h Z1 +p1 $h $h ^d D4 -d D2 u } ^D d d C TB d C r d $b Y1 d *A0 $! D9 Z2 -D9 $U -] D9 t d -9 t -D9 o0D -D8 oA8 D8 i5 D8 ,8 +8 D8 ^( D7 i5D D7 'B D7 $a -d ,6 Y1 D6 o42 D6 o3q -D6 o0T D6 o0g -D6 o06 -D6 i1- D6 ^A -d *68 t -d *67 t D6 $4 -D6 $, D5 $s D5 ^s D5 ^. r @@ -11438,28 +9543,21 @@ D5 ^e D5 ^A D5 ^7 [ d *56 -d *54 u $. D5 ^d ^5 [ D4 Z3 -D4 o5B -D4 o0G D4 ^O D4 i6j D4 i68 D4 DA -d *45 t D4 -0 D3 ^q -D3 o4F -D3 l f D3 f l D3 D5 D3 +2 $d $3 D2 y4 c D2 ^x -$! D2 T0 D2 o0T D2 o0N D2 ^n @@ -11468,42 +9566,33 @@ D2 *26 i3b $D $2 D1 y5 D1 y2 -D1 t p1 -D1 t d -D1 ^s D1 p1 t +D1 p1 t +D1 ^s D1 k -D1 i61 -D1 d t D1 $A D1 $2 D1 $= -D0 T1 k +T2 [ k D0 t *01 D0 i3g -D0 *01 t d ] $+ -} ] ^d } ^d ] } ^d ^d $- ^d ] $c Z4 Z3 -$c Z3 Z4 c $! Z3 C Z2 T1 c z2 ] c ] z2 c Z1 z1 -c z1 Z1 ^c z1 Y1 C [ y5 c Y4 D5 -^c Y1 z1 C y1 i48 c $# Y1 -cO91$6 -$CO51 +c O91 $6 $c $v $C t $j C T5 @@ -11517,10 +9606,8 @@ $c r c p4 i5s c oB4 $c o6u -C o6) c o5H c o3w -C o0W ^c L1 C K Y2 ^C ^K @@ -11535,13 +9622,12 @@ C i1A ^c i0h ^c ^g C $F $E -c D6 R5 C D1 p1 ^c ^d ^C $c ^c ^B $C $A -c$6O91 +c $6 O91 c $3 Y5 ^C ^3 $c $3 @@ -11559,7 +9645,6 @@ $b p4 $h 'B o9u ^b o2o $b o0x -^b ^k *01 ^b ^J $b i6a 'B i6 @@ -11573,21 +9658,18 @@ $b ^e $b $c $b $B ^b $B -*BA $b $3 ^b ^1 -'B $0 c $! ,B } ^b $a Z5 u ^a Z1 ^A $Z 'A Y3 -$AOA3 -^aO92p5 -$AO71 -^aO13 -$a u Z5 +$A OA3 +^a O92 p5 +$A O71 +^a O13 'A t $A [ $A t $A sa4 @@ -11595,11 +9677,9 @@ $a $S $a $s 'A $p t $A o7d -^A o6! ^A o42 $a o41 ^a o3v -^a ^, o0H ^a ^k u ^a ^j $a i8b @@ -11609,11 +9689,10 @@ $A i42 $A i4. $A i3l ^a i2d -$a i0w $a ^G $a E ^a ^E -$AdO62 +$A d O62 $A $d $A ^d ^a ^a @@ -11634,22 +9713,18 @@ $A ^! $. $A $? ^A $! $A -'A $. [ -'A $! 'A [ $. +'A $! $a $@ $a $/ } $a ^a ^@ ^, $a -$9O41T0 +$9 O41 T0 $9 T4 -$9T0O41 $9 ^T $9 $Q '9 o8p Y1 -+9 o8% -+9 o5L $9 iB0 $9 i68 $9 i5e @@ -11659,7 +9734,6 @@ $9 $H ^9 $e '9 $A *98 t -*97 *6A *96 o6% '9 $3 +9 $2 @@ -11669,24 +9743,20 @@ $9 ^# ,9 ^9 $) $8 Z3 -'8 Y2 t -^8 y1 -.8O62 '8 t Y2 +^8 y1 +.8 O62 $8 sc$ -8 ^S +8 $Q -.8 oA6 $8 o6. $8 o5o -8 o1T ^8 o1L $8 o1i -+8 o1e +8 o0G $8 o0F ,8 i8k -,8 i2n $& +8 D4 *8B 'B -8 -A @@ -11706,7 +9776,7 @@ $! -8 $7 Z5 $7 Z4 $7 Z1 c -$7 Z1 +$7 $7 +7 y2 -7 ^w +7 u @@ -11715,36 +9785,27 @@ $7 T9 $7 p2 o0M $7 o84 -7 o63 -,7 o5l -7 o4j -+7 o4H -7 o2a -+7 o0f $7 $M $? $7 K $7 i7s $7 i7? -7 i7/ -,7 i6e $7 i3$ $7 i0C -7 $i +7 D6 -$7 c Z1 -+7 c $1 ++7 $1 c *7A *79 $! *79 +7 +8 K -7 ,8 -$7 $7 +7 *64 ,7 *61 -*76 '7 ^6 -*75 o7$ *75 o5L -*75 o3e *75 o2n -7 *50 +7 -5 @@ -11754,12 +9815,9 @@ $! *75 *73 -5 +7 -2 ^7 $2 -+7 $1 c -7 *14 $. *71 -7 $1 -*70 o4u -*70 o3! *70 *64 -7 +0 $7 $* @@ -11767,102 +9825,73 @@ $* -7 $. .7 ,7 } $6 Z3 -,6 Z1 [ ,6 [ Z1 $6 Y5 -6 Y3 u +6 Y2 t .6 Y1 $@ --6O06 +-6 O06 -6 ^v ^6 ^v --6 u Y3 -+6 t Y2 -+6 t K ++6 K t +6 sl; -+6 o7u +6 o74 -.6 o74 +i84 O61 .6 o4p -.6 o1c -6 o0t ,6 o0q -+6 K t -.6 i8s -6 i7. -.6 i3S +6 i33 $6 i27 +6 D5 '6 d ^6 ^d $6 ^C -*6A *97 *6A $. *6A -*69 i12 *69 *87 -*67O42 +*67 O42 *67 K *67 i1c -6 ,7 +6 *68 +8 *65 l d -*65 d l *65 $4 $0 *65 *34 *65 $* -*64 o0j -*64 l *57 -*64 i46 -*64 i2y *64 *57 l +*64 i2y *64 *57 -*64 *35 *63 *45 -*63 *41 -*62O06u -*62uO06 +*62 O06 u *62 u d -*62 d u *62 +6 *62 *05 -*61 o8@ *61 i7b *61 D0 *61 *25 -6 -1 [ *60 i2v -*60 i0c -*60 *25 *60 *14 *60 $. $6 +0 $! ^6 ^5 z2 -[ ,5 Z1 -5 Y2 y2 --5 y2 Y2 -5 Y2 -5 sdT ,5 $s +5 R5 t $5 ^p E -.5 o7% -+5 o4T -+5 o3T -5 o3G $5 ^l -5 i55 +5 i5@ -^5 i1K -5 $a -*58Y3O12 -*58O12Y3 +*58 Y3 O12 +*58 O12 Y3 *57 -2 *56 o33 -*56 k -*56 i4M +5 *69 *56 .7 *56 +6 @@ -11870,18 +9899,13 @@ $5 ^l ,5 *56 -5 *53 *54 K +3 -*54 i1V *54 i1j -*54 *63 .5 *45 *54 ,4 *54 +3 K -*54 +0 *53 $q *53 o7z -*53 o6n *53 o31 -*53 o1w *53 +6 *53 -5 +5 *34 p4 @@ -11890,13 +9914,11 @@ $5 *32 *52 o3r .5 $2 ,5 -2 -*51 i5Y -5 *14 *51 *36 *51 $5 -1 ^5 ^1 -*50 o52 } *50 K +5 *05 *50 *24 @@ -11914,20 +9936,17 @@ $@ -5 +4 Y3 c $4 Y2 -4 y2 -[ .4 Y1 -{ +4 y1 -$4O73 -^4O41 +{ z1 +5 +$4 O73 +^4 O41 $4 T2 .4 t -4 sa@ c $4 $P .4 o68 -,4 o59 -,4 o3y +*34 o3y ,4 o3w .4 o3M -.4 o3F .4 o3- .4 ^m ,4 K @@ -11935,8 +9954,6 @@ $4 i7@ $4 i7. +4 i4L ,4 i4a -.4 i42 -+4 i3b ^4 $f +4 D3 .4 c Y4 @@ -11947,38 +9964,29 @@ $4 $a p4 $4 .7 -4 +7 *46 o4) -*46 o3a *46 ^@ -*45 i6 -*45 *63 +4 *54 *45 *34 *45 *23 ,4 +5 -4 .5 $* ^4 *41 -+4 +4 +0 ++4 +0 +4 $4 ^4 *43 y1 *13 *43 o2h *43 o1o *43 i5q -*43 i5p -*43 i4a -*43 ^e ,4 *37 *43 *07 *42 d E -4 +2 *41 Y3 y2 *41 y2 Y3 -[ *41 t *41 i2l *41 $! -*41 $_ -*40O02 +*40 O02 *40 o4i -+4 +0 +4 *40 *25 $. *40 $. *25 $@ *40 @@ -11986,81 +9994,65 @@ $@ ,4 $3 Z2 .3 Y2 r ,3 $. Y1 --3O51 -+3O43 -$3O42c -^3O13 +-3 O51 ++3 O43 +$3 O42 c +^3 O13 $3 ^x $3 ^w $3 T5 $3 se3 -$3 s3M $k +$3 $k s3M +3 $s ^3 r ^k $3 o85 -3 o7p --3 o6( -+3 o5s --3 o5s -3 o57 -3 o4u +3 o4T -.3 o4- +i5- O31 ,3 o2k -.3 o2e $3 o0G $3 $M $3 ^m -3 $m -$3 $k s3M .3 i4x ,3 i4n ,3 i4k ,3 i3g -.3 i2e $3 D2 -3 D2 -$3cO42 $3 C ^3 ^b *37 p2 'A -*36 o1n *36 $1 ,3 $5 p4 *35 o5q -*35 o1I -*35i4iO52 -*35 *46 +*35 i4i O52 *35 *27 *35 *24 $. *35 -3 +5 ^3 $5 -*34 o6b -*34 o1I *34 i7p -*34 i2u $3 -4 $3 *32 *32 o2r *32 K *32 C +3 *27 -*32 +0 $. *32 -3 .2 *31 o0L *31 $1 [ $3 +1 ^3 ^1 -*30O61 +*30 O61 *30 s1- *30 o0b *30 o0! *30 K k -*30 k K -*30 i3_ -*30 d Y4 +*03 p1 Y4 *30 *54 *30 -2 *30 +0 @@ -12070,56 +10062,41 @@ $2 Y5 ] ,2 Y5 +2 Y2 *52 ,2 Y1 -$2O52 -[-2O41 +$2 O52 $2 $T ^2 $T $2 ^S ^2 r -$' ,2 o9. $2 o6e -2 o5w -,2 o4v -,2 o4; -+2 o3R --2 o1- -+2 o0w +2 o0r -2 o0n +2 o0g -2 o0D -[ .2 k $2 i5y ,2 i53 +2 i3j -2 i3f $2 i37 ,2 i2z -.2 i2C +2 i1A $2 i1A -^2 i0a +2 *73 *25 y4 c *25 c y4 $2 *56 .2 *52 +2 -5 -*24O21u -*24uO21 +*24 O21 u *24 o45 -*24 i3z +2 *41 *24 *02 *23 o3q -*23 o1p -,2 *36 *23 -2 *25 *23 +2 *23 ] *21 *23 *21 +1 -*21 *03 *20 p2 'B *20 i5A *20 i4c @@ -12133,7 +10110,6 @@ $2 *56 .2 +0 -2 +0 +2 [ -$2 [ $@ $2 $! .2 ] ^2 @@ -12143,13 +10119,8 @@ $! .2 +1 z1 t $1 $z ^1 y1 $@ -^1 $@ y1 -$1O51 -$1O31D3 -$1O01 +$1 O31 D3 $1 u T3 -+1 t z1 -] $1 T3 +1 ^t $1 syY -1 sea @@ -12159,8 +10130,7 @@ $1 $Q $1 o8- +1 o4f $1 o3k -.1 o2w -.1 o2g +*21 o2g $1 o21 +1 o2. ^1 o1P @@ -12172,13 +10142,9 @@ $1 i8A $1 i7L l $1 i6z $1 i5= --1 i45 $1 i3r -.1 i3k -+1 i2Y $1 i2d +1 i1i -^1 i14 .1 i11 $1 i0I ^1 i0c @@ -12186,20 +10152,17 @@ $1 i0I $1 ^g $1 ^f ^1 D4 -$1D3O31 +$1 D3 O31 ^1 ^a *18 o7M *16 o5b -*16 i3e $1 +6 *15 o0Z *14 o2b *14 o0z +1 *45 *13 y5 c -*13 i6l *13 i40 -*13 *45 *13 *23 $! *13 $! *23 [ +1 *31 @@ -12207,9 +10170,6 @@ $1 +6 ,1 ,3 [ *12 Z2 *12 u -*12 o2w -*12 i6 -*10 i1S +1 .0 +1 $@ $1 ^& @@ -12222,59 +10182,42 @@ $1 ^_ ^, $1 $0 $z Z1 $0 Z4 Y2 -$* +0 Z1 +0 y4 u -+0 y2 u ++0 u y2 +0 Y2 *73 -0 Y2 --0O45 --0O31$g -+0 u y4 -+0 u y2 +-0 O45 +-0 O31 $g -0 u $0 T5 -0 ^T +0 o8. +0 o7! --0 o6. -+0 o5l -0 o3d -+0 o36 +0 o2k -+0 o1P -0 o17 $0 ^N -0 ^k ^0 k $. -^0 $. k ^0 ^k $0 i6b -.0 i5B +0 i59 $0 i57 $0 i5_ -0 i4@ --0 i3A -.0 i2h +0 i1v -+0 i1r .0 i1k --0 i19 +0 i17 --0$gO31 +-0 $g O31 ^0 ^a +0 $8 -*07 o6L *06 o0A -*06 i0c *05 o5z *05 i2s *05 *52 *04 Y1 i6b *04 o32 *24 *04 i2x -*04 *24 o32 -*04 $0 $4 *03 y1 ^b *03 $q @@ -12282,19 +10225,13 @@ $0 $4 *03 -5 *03 *32 +3 ^@ *03 -*02p3O08 +*02 p3 O08 *02 o2f -*02 k -*02 i5A *02 i4u -+0 *21 .0 *20 -0 -2 *01 o3@ -*01 i3k -*01 ^e -0 *12 -*01 { .0 *04 -0 *03 +0 { @@ -12312,7 +10249,6 @@ $] $" $. $+ $! $* -$! $! $! [ $! ^. $- $_ @@ -12336,7 +10272,7 @@ $* ^z Z1 $Z y4 y4 $z $y $z $v -^z t d +^z d t $z $r $z ^q ^z ^p @@ -12357,82 +10293,52 @@ $Z i4y $z i3r ^z i2k $Z i1o -^Z ^f l -^z d t ^z ^D ^z $A -Z5Z5O13 +Z5 Y5 O13 $ Z5 z5 -$ z5 Z5 -Z5 Z4 Z3 -Z5Z4O19 -Z5 Z3 Z4 -Z5 z3 r -Z5 Z1 +Z5 Y4 O19 Z5 Y5 oAq -Z5 Y5 -1 -Z5Y4O42 -z5 y4 { -z5 { y4 -z5 y3 +Z5 Y4 O42 Z5 Y2 *43 Z5 $/ Y1 -Z5O59.1 -z5O48t -Z5O42Y4 -Z5O19Z4 -Z5O13Z5 -z5O0B -z5^wO35 -z5tO48 +Z5 .1 O59 +z5 O48 t +Z5 O42 Y4 +Z5 O19 Z4 +z5 O0B +z5 ^w O35 Z5 t D1 Z5 t Z5 q $r z5 oAk C -Z5 D1 t Z5 *B5 -Z5 *5B -Z5 *43 Y2 -$z *52 i6c Z5 -1 Y5 -Z5.1O59 Z5 $@ ^. z5 -Z4 Z5 z3 -Z4 Z5 Y3 +z3 Z5 Y4 Z4 Z5 *05 Z4 Z5 -Z4 Z4 Z4 -$! Z4 Z4 -Z4 z3 Z5 -Z4 Z3 u +$! Z5 Y3 +Z4 u Z3 $% Z4 Z3 $ Z4 Y4 -Z4 Y3 Z5 Z4 y3 D5 -Z4O54} -Z4 u Z3 +Z4 O54 } Z4 u s4a -z4 u *96 +z4 *96 u } z4 u $| Z4 t -z4 *96 u ^z *45 -z4 *36 *18 z4 *18 *36 Z4 ,1 Z4 *05 Z5 Z4 $. $& Z4 -z3 Z5 r -$% Z3 Z4 -Z3 Z3 -z3 Z2 *40 $/ Z3 Z1 -Z3y5O85 -Z3Y3O23 -Z3O23Y3 -z3O07 +Z3 y5 O85 +Z3 O23 Y3 +z3 O07 [ z3 t Z3 se& Z3 p1 +6 @@ -12447,20 +10353,16 @@ Z3 *81 *36 Z3 *61 $! Z3 $! *61 Z3 +6 -z3 *40 Z2 -Z3 *36 *81 ^z *30 -1 $/ Z3 { Z3 ^@ z3 -Z2 z2 p2 Z2 z2 *13 -Z2 y4 ,8 ^- z2 Y3 -Z2OA1] -Z2]OA1 -Z2O63 -Z2O37 +Z2 OA1 ] +Z2 ] OA1 +Z2 O63 +Z2 O37 Z2 u o5C Z2 u +9 Z2 T5 +B @@ -12471,28 +10373,24 @@ z2 s4 Z2 ^s Z2 ^q Z2 o9 -Z2 o8@ i9@ +Z2 i9@ o8@ Z2 o5s Z2 o5f -Z2 o5C u z2 o1u Z2 o1o z2 o1F Z2 l +A z2 ^L Z2 $J -Z2 i9@ o8@ Z2 i8. Z2 i8_ z2 i0P $# Z2 E -z2 d y1 -Z2dO13 +Z2 p1 O13 z2 ^D z2 C z1 $/ Z2 c z2 c ] -Z2 +B T5 z2 $A Z2 Z2 +A l z2 $a *52 @@ -12507,14 +10405,9 @@ z2 *52 $a Z2 *48 $a z2 { -3 Z2 -2 -1 -Z2 *17 t z2 *15 Z2 *14 Z2 [ *12 -Z2 -1 -2 -z2 *06 ] -z2 *06 -z2 ] *06 Z2 $0 $. Z2 .0 { Z2 @@ -12522,83 +10415,56 @@ $. Z2 .0 ^+ z2 ^& z2 ^- z2 -Z1 Z5 -$/ Z1 Z3 -$* Z1 ^z Z1 Y4 Z1 Y3 t -Z1 Y3 -$!Z1O82 -Z1O62u -Z1O51i1r -z1O45y5 -Z1uO62 +Y1 Y3 +$! Z1 O82 +Z1 u O62 +Z1 O51 i1r z1 u i1I -Z1 u D6 +Z1 D6 u Z1 u +6 -z1 u ^5 -Z1 u $! +z1 ^5 u Z1 $! u Z1 t $Z -Z1 t Y3 z1 ^t $6 -$! Z1 T1 -Z1 s5v -Z1 p4 l -Z1 p4 E +Y1 s5v +Y1 l p4 +Y1 p4 E z1 $p } Z1 o2p -Z1 l p4 Z1 i67 $A z1 i5@ -Z1 i4d Z1 i3i Z1 i2p o7b -z1 i1I u -Z1 i0! y1 +^! z1 Y1 Z1 $i -Z1 E p4 +Y1 E p4 Z1 E $5 -Z1 D6 u -Z1 D6 $+ Z1 D6 -Z1 C $9 -Z1 c *32 -Z1 C ,3 -Z1 c $% +Z1 $9 C +Y1 c *23 Z1 $% c z1 c $@ -z1 $@ c } z1 c Z1 $A i67 [ Z1 $A -Z1 $9 C $$ Z1 +8 Z1 +7 Z1 +6 u Z1 .6 -z1 ^5 u -Z1 $5 E Z1 *56 -Z1 .5 [ z1 *43 *02 -Z1 ,3 C -Z1 *32 c -^z -1 *30 ^ z1 $2 Z1 ^1 z2 -Z1 *17 q +Y1 *17 q Z1 *06 ^5 z1 *06 $/ Z1 *03 -z1 *02 *43 -$% Z1 } $' Z1 $- Z1 $. $` Z1 [ Z1 $% -[ $@ Z1 -[ Z1 $+ z1 ^_ ^Z { $z @@ -12611,13 +10477,11 @@ $y Z2 t ^y z2 $Y Y3 [ $Y [ Y3 -[ $Y Y3 $y Y1 ^Y $Y $Y ^X *76 ^Y ^X ^y ^V -$y t Z2 $y $t *62 ^Y ^T $y $r @@ -12626,7 +10490,6 @@ $y o6z $y o63 ^Y o4B $y o2h -^Y o2C $y $j ^y i6t $y i4A @@ -12641,46 +10504,40 @@ $y *62 $t y5 z3 *A3 y5 Z1 E y5 ^z -y5Y4O53 -Y5Y4O38 -y5OA6E -y5OA2y5 -y5O93 -y5O85 -y5O82c -y5O74-5 -y5O73.4 -Y5{O73 -y5O72O41 -y5O72[ -Y5O64.4 -Y5O64$0 -y5O56u -y5O52t -y5O38E -y5O27^m -Y5O25 -Y5O24-5 -Y5O23[ -Y5O21 -Y5O14$@ -Y5$@O14 -y5O13 -Y5O02E -y5O02 -y5uO56 -Y5 u ^S -y5tO52 +y5 Y4 O53 +Y5 Y4 O38 +y5 OA6 E +y5 O93 +y5 O85 +y5 O82 c +y5 O74 -5 +y5 O73 .4 +Y5 { O73 +y5 O72 O41 +y5 O72 [ +Y5 O64 .4 +Y5 O64 $0 +y5 O56 u +y5 O52 t +y5 E O38 +y5 O27 ^m +Y5 O25 +Y5 O24 -5 +Y5 O23 [ +Y5 O21 +Y5 O14 $@ +y5 O13 +Y5 O02 E +y5 O02 +Y5 ^S u y5 t i58 Y5 T0 ^1 -Y5 ^S u y5 s2Y y5 RA c y5 RA $A -y5 R5 { -y5p1O47 +y5 p1 O47 y5 o9i -Y5o8MO12 +Y5 o8M O12 Y5 o7f Y5 o7c Y5 o7b @@ -12691,42 +10548,32 @@ y5 o4& y5 o0T y5 o0N y5 o0K -y5 K C +y5 C K y5 $k -y5 i58 t y5 i5_ Y5 i0F y5 [ ^G y5 ^F -y5 E Z1 -y5EOA6 -y5EO38 -Y5EO02 -y5dO0A +Y5 E O02 y5 D8 Y5 ^D -y5cO82 y5 c RA y5 C $l -y5 C K y5 C *05 -y5^AO92 +y5 ^A O92 y5 $A RA -y5*A8O53 -y5-5O74 +y5 *A8 O53 y5 *59 -y5.4O73 -Y5.4O64 y5 -4 Y5 $2 -Y5$0O64 +Y5 $0 O64 y5 $0 y5 -0 $. Y5 ] y5 y4 Z2 ,8 Y4 Y5 *02 -Y4Y4O02 +Y4 Y4 O02 y4 y4 u y4 y4 K Y4 Y4 D2 @@ -12734,120 +10581,98 @@ y4 y4 c Y4 Y4 ^_ Y4 ^_ Y4 { y4 y4 -Y4 y2 u -Y4Y1O62 -y4O82E -y4O76R3 -y4O72o4k -y4O71c -Y4O62Y1 -Y4O62T0 -Y4O52t -y4O43i4n -Y4O42[ -Y4O32E -Y4O13C -y4O12K -Y4O02Y4 -y4O02o6r -y4 u y4 Y4 u y2 +Y4 Y1 O62 +y4 O82 E +y4 O76 R3 +y4 O72 o4k +y4 O71 c +Y4 O62 Y1 +Y4 T0 O62 +Y4 O52 t +y4 O43 i4n +Y4 O42 [ +Y4 O32 E +Y4 O13 C +y4 O12 K +Y4 O02 Y4 +y4 O02 o6r y4 u .4 -Y4tO52 Y4 t '8 y4 t *63 -Y4T0O62 -y4R3O76 Y4 o9. y4 o7. y4 o5u Y4 o5_ y4 o4z y4 o4l E -y4o4kO72 y4 o4d y4 o3i -y4 o3a l +y4 l o3a y4 o0y Y4 o0W y4 o0r Y4 o0j Y4 o0C y4 o0a -y4 l o3a Y4 l *36 y4 K y4 -y4KO12 +y4 K O12 Y4 K -y4iB)O57 +y4 iB) O57 Y4 i8b Y4 i8- y4 i4r L4 Y4 i4, Y4 ^H -Y4fO3B -y4EO82 -Y4EO32 +Y4 f O3B Y4 E T5 y4 E o4l -y4 E $? y4 $? E Y4 D6 Y4 D2 Y4 y4 D1 $@ -y4 $@ D1 -y4cO71 -Y4CO13 Y4 c T2 -y4 C '9 +y4 '9 C y4 c -0 Y4 +B Y4 +A Y4 ^A [ y4 $A -y4 '9 C Y4 $9 y4 $. -9 y4 -9 $. y4 ,8 Z2 -Y4 '8 t -y4*68O82 -y4 *63 t +y4 *68 O82 Y4 -5 -4 -y4 .4 u y4 *48 -Y4 -4 -5 Y4 +4 +4 Y4 +4 *21 -Y4 *36 l y4 +3 Y4 *27 ] Y4 ] *27 -Y4 *21 +4 y4 $1 y4 -0 c Y4 *02 Y5 ^- Y3 z2 Y3 ^z -Y3 Y3 y3 Y3 y3 Y3 Y3 Y3 ^T Y3 Y3 D1 y3 y3 +9 y3 Y2 Y2 Y3 Y1 -Y3 $Y [ Y3 [ $Y [ Y3 $Y -y3O81+6 -Y3O58 -y3O52c -y3O52 -y3O51 -y3O45 -Y3O43k -Y3O37y3 -Y3O31E +y3 O81 +6 +Y3 O58 +y3 O52 c +y3 O52 +y3 O51 +y3 O45 +Y3 k O43 +Y3 O37 y3 +Y3 O31 E Y3 $W Y3 u D4 ] Y3 u @@ -12870,34 +10695,27 @@ y3 o0f y3 o0D y3 o0C y3 o0b -Y3kO43 Y3 K Y3 i6- y3 i6- y3 i31 y3 i3- Y3 $H -Y3EO31 Y3 E -5 y3 E y3 D8 ,7 Y3 D6 $4 -Y3 D4 u Y3 D1 Y3 -Y3D1O43 -y3cO52 +Y3 D1 O43 Y3 c -5 y3 C Y3 $a Z2 -y3 ,7 D8 y3 -7 -y3+6O81 Y3 -5 E Y3 -5 c y3 *54 Y3 $5 Y3 $4 D6 -Y3 *43 o2v y3 *36 Y3 +2 y3 Y3 $2 @@ -12915,63 +10733,51 @@ y3 $@ y3 $/ y3 $ [ y3 } } -y3 [ $ y2 Z5 Z5 -y2 z2 ] y2 ] z2 Y2 Z1 y2 Y4 Y4 y2 y4 -y2Y3O43 +y2 Y3 O43 y2 Y3 u y2 Y2 Y2 y2 y2 u -y2 Y2 t Y2 Y2 +4 y2 Y2 -4 Y2 Y2 ,3 y2 Y1 t Y2 $y -y2O72$. -y2$.O72 -y2O54i4_ -y2O53t +y2 O72 $. +y2 $. O72 +y2 O54 i4_ +y2 O53 t Y2 ^x *53 -Y2O51y5 -y2O51i4- -y2O43Y3 -y2O42$@ -y2$@O42 -y2O41c -y2O39q -{y2O34 -y2O15t -Y2O09 -Y2O08 +Y2 O51 y5 +y2 O51 i4- +y2 O43 Y3 +y2 O42 $@ +y2 $@ O42 +y2 O41 c +y2 O39 q +{ y2 O34 +y2 t O15 +Y2 O09 +Y2 O08 Y2 $w -y2 u Y3 -y2 u y2 Y2 u -5 y2 ^U -y2 t Y2 -y2 t Y1 -y2tO53 -y2tO15 Y2 t o7D y2 t *71 Y2 T2 y2 T2 -y2 sXA -y2 smv [ y2 [ smv y2 sdK -Y2 s20 $! Y2 $! s20 Y2 $s y2 ^S y2 ^s Y2 $Q -Y2p2O02 +Y2 p2 O02 Y2 o91 r ] Y2 o79 Y2 o77 *61 @@ -13007,28 +10813,19 @@ y2 ^G y2 E $2 Y2 $e y2 E $! -y2 $! E -y2dO68 +y2 d O68 Y2 $d -y2cO41 -Y2 C o6D -Y2 C i49 Y2 C $# -Y2 $# C Y2 ^B -8 y2 $A r -Y2 *AB ] Y2 ^A y2 ^A Y2 +9 Y2 ,8 y2 $8 [ -y2 [ $8 -y2 *71 t Y2 *71 Y2 $7 y2 *65 -Y2 *61 o77 Y2 -5 u Y2 *50 y2 +5 @@ -13040,8 +10837,6 @@ Y2 ,3 Y2 y2 *36 y2 *32 Y2 } +3 -y2 $2 E -y2 *24 k y2 *23 ^O y2 *12 y2 +0 ^u @@ -13056,70 +10851,54 @@ y2 { Y1 z1 C Y1 Z1 $9 Y1 Y4 c -Y1 Y3 -Y1O74$@ -Y1$@O74 -Y1O51E -y1O51*02 -$^Y1O45 -Y1O43y5 -y1O43 -Y1O03 -Y1 u i43 -y1 u i0C -y1 u ^7 -Y1 u ,3 +Y1 O74 $@ +Y1 $@ O74 +Y1 O51 E +y1 O51 *02 +$^ Y1 O45 +Y1 O43 y5 +z1 O43 +Y1 i43 u +y1 i0C u +y1 ^7 u +Y1 ,3 u Y1 t T6 -Y1 T6 t Y1 T3 Y1 sa2 -y1 s2s +s2s z1 Y1 r i0f Y1 $R Y1 $q -Y1p1O09 -Y1 p1 +A -Y1 p1 +Y1 p1 O09 { Y1 ^P Y1 o6@ Y1 o0S Y1 ^M Y1 i90 -8 Y1 i6w -Y1 i43 u y1 i34 Y1 i19 y1 i0 z2 -y1 i0K -y1 i0C u y1 ^F $3 y1 ^F y1 ^f -Y1EO51 y1 E ^W Y1 $e C $$ Y1 D0 -Y1 d Y1 c Y4 $- Y1 c -Y1 -8 i90 y1 *87 ,7 -y1 ^7 u Y1 $7 r -Y1 *72 *36 +Y1 *36 *72 Y1 $+ -7 Y1 -7 $+ Y1 ^5 z2 Y1 -4 *74 Y1 $4 -Y1 ,3 u -Y1 *36 *72 ^Y *13 [ y1 ^3 -Y1 *17 q Y1 *03 $* Y1 $* *03 -y1*02O51 Y1 $+ Y1 $@ ] Y1 @@ -13128,9 +10907,8 @@ $Y $x Z5 u $x Z2 $x } z1 -$xY5O06 +$x Y5 O06 $x ^v k -$x u Z5 ^x $u ^X ^T ] ^x ^R @@ -13146,390 +10924,341 @@ $x i6d ^x i5f $x i4t $x i3l -^X i2z -^X i1C -$X i0X ^_ ^X i0E -^x i0a +^x ^a ^x ^g ^x ^e $x ^c -OB4]] -OB1O91 -OB1u +OB4 ] ] +OB1 O91 +OB1 u OA3 -OA1O19 -OA1t,9 -OA1i7NO63 -OA1,9t -OA1$. -^x ^a -O93t -O93o88 -O92u -O91c +OA1 O19 +OA1 t ,9 +OA1 i7N O63 +OA1 $. +O93 t +O92 u +O91 c ^x '8 +5 -O84t -O84$a -O83Z1 -$!O82Z1 -O82OA1 -O82R8R8 -O82$5 -O82$@ -$!O82 -O81s28 -O81$o -O81*89 -O81$6 +O84 t +O84 $a +O83 Z1 +$! O82 Z1 +O82 OA1 +O82 R8 R8 +O82 $5 +O82 $@ +$! O82 +O81 s28 +O81 $o +O81 *89 +O81 $6 $X ^8 -O74$1 +O74 $1 O74 -O72o2x -O72i7f -O72$! -O71Y3 -O71o0z -O71^e^L -O71DA -O71D5$! -O71$!D5 -O71$d -]O71 +O72 o2x +O72 i7f +O72 $! +O71 Y3 +O71 o0z +O71 ^e ^L +O71 DA +O71 D5 $! +O71 $! D5 +O71 $d +] O71 $x -7 -O65O81 -O64i6b -O64$a -O64$4 -O64$2 -O63ud -O63t -O63du -O63-2 -O63$1 -O62O31 -O62r -O62o5. -O62i86 -O62'B -O62^1o1J -O62$1 -O62$! -O62]] -O61^v -O61up1 -O61p2O0B -O61p1u -O61o12 -O61o06 -O61i1- -O61D0i0C -O61.8 -O61*25 -O61$2 -O61$, -^x +5 '8 -O56i3@ -O54D5 -O53y5y5 -O53i2i -O52Z1 -O52Y5'A -O52s80 -O52o5q -O52o4& -O52o2w -O52KY4 -O52$j -O52+1 -$-O52 -$_O52 -]O52 -^$O52{ -O51Y5 -O51O81 -O51O72] -O51]O72 -O51^x -O51o5b -O51o56 -O51o4o -O51o2b -O51o0T -O51o0s -O51$j*50 -O51i6@ -O51i3c -O51i0a -O51*50$j -O51-2 -O51$!-0 -O51-0$! -O47$0 -O46Y4Y4 -O45y5T9 -$^O45Y1 -O45o7C -O45i2M -O45$1 -O43Z1y5 -O43y5Z1 -O43y4 -O43o7> -O43o4@ -O43o3_ -O43i4B -O43i3t -O43.4 -O43$. -$*O43 -O42y5c -O42y2y2 -O42tR4 -O42sa1 -O42R4t -O42o3_ -O42o2S -O42i5* -O42i4c+0 -O42*25$! -O42$!*25 -O42+0i4c -O42^@ -$!O42 -O41Y4t -O41Y2$A -O41tY4 -O41^S -O41^q -O41o6f -O41o5B -O41o4& -O41o2h -O41o1@ -O41o0G -O41lf -O41i5 -O41i11 -O41fl -O41D6$2 -O41^a -O41$6 -O41*42 -O41-4 -O41^4 -O41$2D6 -O41.1 -O35Z1+5 -O35R3R3 -O35+5Z1 -O35+0 -O34p4 -O34i3f -O34^e -O34$c*03 -O34^4 -O34*03$c -O34[ -O32y5D9 -O32y2k -O32OA2 -O32O37 -O32^p -O32o5v -O32o5d -O32i4z -O32i2M -O32i2h -{O32c -O32+A -O32.5 -O32$2 -O32[ -O32^! -$.O32 -O31y5i5_ -O31y2[ -O31^W -O31u -O31p1c -O31o4F -O31o0G -O31o0f -O31kd -O31i4- -O31i2e -O31D6 -O31-2 -O29p4] -O27i2h -O26qZ1 -O26qY1 -O26q^o -O26i2b -O26CT1 -O25z5t -O25z4 -O25y2u -O25uy2 -O25tz5 -O25qZ1 -O25p4T0 -O25i3s -O24Z2l -O24y3} -O24}y3 -O24y2t -O24y1 -O24ty2 -O24lZ2 -O24i4m -O24i4* -O24i2h -O23Z5Z1 -O23Z1Z5 -O23Y3y2 -O23y3o42 -O23y3} -O23}y3 -O23y2Y3 -O23r$h -O23Ey2 -O23dE -O23^6z2 -O23$+ -[O23 -O21^z -O21Y1s1+ -O21^u -O21t[ -O21s^A -O21s1+Y1 -O21p3'9 -O21o2h -O21o0c -O21$k$l -O21^k -O21i65 -O21i4- -O21i3q*20 -O21$a -O21$5 -O21*20i3q +O65 O81 +O64 i6b +O64 $a +O64 $4 +O64 $2 +O63 p1 u +O63 t +O63 -2 +O63 $1 +O62 O31 +O62 r +O62 o5. +O62 i86 +O62 'B +O62 ^1 o1J +O62 $1 +O62 $! +O62 ] ] +O61 ^v +O61 p1 u +O61 p2 O0B +O61 o12 +O61 D0 i0C +O61 .8 +O61 $2 +O61 $, +O56 i3@ +O54 D5 +O52 Z1 +O52 Y5 'A +O52 s80 +O52 o5q +O52 o4& +O52 o2w +O52 K Y4 +O52 $j +O52 +1 +$- O52 +$_ O52 +] O52 +^$ O52 { +O51 Y5 +O51 O81 +O51 O72 ] +O51 ] O72 +O51 ^x +O51 o5b +O51 o56 +O51 o4o +O51 o2b +O51 o0T +O51 o0s +O51 $j *50 +O51 i6@ +O51 i3c +O51 i0a +O51 *50 $j +O51 -2 +O51 -0 $! +O47 $0 +O46 Y4 Y4 +O45 y5 T9 +$^ O45 Y1 +O45 o7C +O45 i2M +O45 $1 +O43 Y1 y5 +O43 y5 Y1 +O43 y4 +O43 o7> +O43 o4@ +O43 o3_ +O43 i4B +O43 i3t +O43 .4 +O43 $. +$* O43 +O42 y5 c +O42 y2 y2 +O42 t R4 +O42 sa1 +O42 R4 t +O42 o3_ +O42 i5* +O42 i4c +0 +O42 *25 $! +O42 $! *25 +O42 ^@ +$! O42 +O41 Y4 t +O41 Y2 $A +O41 ^S +O41 ^q +O41 o6f +O41 o4& +O41 o2h +O41 o1@ +O41 o0G +O41 l f +O41 i5 +O41 D6 $2 +O41 ^a +O41 $6 +O41 *42 +O41 -4 +O41 ^4 +O41 $2 D6 +O41 .1 +O35 Z1 +5 +O35 R3 R3 +O35 +5 Z1 +O35 +0 +O34 p4 +O34 i3f +O34 ^e +O34 $c *03 +O34 ^4 +O34 *03 $c +O34 [ +O32 y5 D9 +O32 y2 k +O32 OA2 +O32 O37 +O32 ^p +O32 o5v +O32 o5d +O32 i4z +O32 i2M +O32 i2h +{ O32 c +O32 +A +O32 .5 +O32 $2 +O32 [ +O32 ^! +$. O32 +O31 y5 i5_ +O31 y2 [ +O31 ^W +O31 u +O31 p1 c +O31 o0G +O31 o0f +k O31 p1 +O31 i4- +O31 i2e +O31 D6 +O31 -2 +O29 p4 ] +O27 i2h +O26 q Y1 +O26 q ^o +O26 i2b +O26 C T1 +O25 z5 t +O25 z4 +O25 y2 u +O25 q Z1 +O25 p4 T0 +O25 i3s +O24 y3 } +O24 } y3 +O24 t y2 +O24 i4m +O24 i4* +O24 i2h +O23 Z4 Y2 +O23 Y3 y2 +O23 y3 o42 +O23 y3 } +O23 } y3 +O23 r $h +O23 E y2 +O23 d E +O23 ^6 z2 +O23 $+ +[ O23 +O21 Y1 s1+ +O21 ^u +O21 t [ +O21 s^A +O21 p3 '9 +O21 o2h +O21 o0c +O21 $k $l +O21 ^k +O21 i65 +O21 i4- +O21 i3q *20 +O21 $a +O21 $5 ^x *20 -O1AC -O16z5 -O16t -O16p2+0 -O15y2u -O15O05 -O15uy2 -O15] -O14z5z1 -O14z3z3 -O14z1z5 -O14Y4 -O14y2 -O14p2 -O14K+4 -O14i3C -O14+4K -O13y2t -O13^x^t -O13ty2 -O13R3t -O13o0Y -O13kq -O12y3y3 -O12Y3^A -O12Y1^B -O12$@^T -O12p3O0A -O12p2'9 -O12o2x -O12o1T -O12o1R -O12^o -$*O12^l -O12k^D -O12i0g -O12i0\ -O12^BY1 -O12^AY3 -O12*14 +O1A C +O16 z5 +O16 t +O16 p2 +0 +O15 u y2 +O15 O05 +O15 ] +O14 z3 z3 +O14 Y4 +O14 y2 +O14 p2 +O14 K +4 +O14 i3C +O14 +4 K +O13 y2 t +O13 ^x ^t +O13 R3 t +O13 o0Y +O13 k q +O12 y3 y3 +O12 Y3 ^A +O12 ^B Y1 +O12 $@ ^T +O12 p3 O0A +O12 p2 '9 +O12 o2x +O12 o1T +O12 o1R +O12 ^o +$* O12 ^l +O12 k ^D +O12 i0g +O12 ^A Y3 +O12 *14 ^x +1 -O0Ap1 -O09Y2 -O09y2 -O09u -O08y4 -O08p5 -O08d -O07Y2y2 -O07y2Y2 -O07p4] -$x *07 -O06y3y3 -O06r -O06p2 -O06f -O06$1 -O06} -O05z2 -O05i4v -O05+3 -O04Z5Y5 -O04Y4Y4 -O04R4R4 -O04p1O05 -O04o1w -O04'A -$ O04 -O03y4 -O03y2u -O03O21 -O03uy2 -O03s14 -O03^p -O03o3, -O03i4m -O03i2n -O03$7 -O03$! +O0A p1 +O09 Y2 +O09 y2 +O09 u +O08 y4 +O08 p5 +O08 p1 +O07 Y2 y2 +O07 p4 ] +O06 y3 y3 +O06 r +O06 p2 +O06 f +O06 $1 +O06 } +O05 z2 +O05 i4v +O05 +3 +O04 Y4 Y4 +O04 R4 R4 +O04 p1 O05 +O04 o1w +O04 'A +$ O04 +O03 y4 +O03 y2 u +O03 O21 +O03 s14 +O03 ^p +O03 o3, +O03 i4m +O03 i2n +O03 $7 +O03 $! $x *03 -O02z1$. -O02$.z1 -O02y5 -O02y4E -O02y4 -O02y3 -O02r -O02o7t -O02o3r -O02o0h*46 -O02i2@ -O02i1e -O02c^M -O02^c -O02*65 -O02*46o0h -O02,4 -O02*12 -O01$YZ1 -O01Y4^R -O01y2y2 -O01$w -O01^RY4 -O01o5b -O01i5= +O02 $. z1 +O02 y5 +O02 y4 E +O02 y4 +O02 y3 +O02 r +O02 o7t +O02 o0h *46 +O02 i2@ +O02 i1e +O02 c ^M +O02 ^c +O02 ,4 +O02 *12 +O01 $Y Z1 +O01 Y4 ^R +O01 y2 y2 +O01 $w +O01 ^R Y4 +O01 o5b $x $! $@ ^x $. $x $w Z2 -4 ^w y2 -^wO61 -$wO41 -^wO16 +^w O61 +$w O41 +^w O16 ^w ^x ^W ^T $w sdm @@ -13547,7 +11276,6 @@ $w iAq $W i3H $W i3F $w i1s -^w i1j ^w i0k ^w ^f $w E $a @@ -13555,7 +11283,6 @@ $w E $a $w ^d $@ ^W C $w $b -$w $a E $w $a $W .7 ^w +5 @@ -13568,7 +11295,6 @@ $v Z5 t $v Z5 $v $z $v $x -$v t Z5 $v $t ^v $p $v $n @@ -13587,7 +11313,7 @@ $v i0r ^v ^d ^V ^A ^v $8 -$v*71O31 +$v *71 O31 ^v $6 $v $4 ^v +2 @@ -13598,27 +11324,23 @@ $- $v u Z5 Y4 u Z5 +0 u [ z5 -uz4O71 -} u z4 +u z4 O71 u Z1 y1 u Z1 iAA ^u ^Z u Y5 DA -] u Y3 u [ y3 u Y2 Z1 u Y2 T1 u Y2 o0S -u y1 Z1 u Y1 $4 u $x Z5 -uO83 -uO73t -uO72 -uO52d -uO51 -^uO32 -utO73 +u O83 +u t O73 +u O72 +u O52 d +u O51 +^u O32 u t o4* $u t $A u T9 @@ -13626,7 +11348,7 @@ u T3 K u T2 sEa u T1 Y2 ^u ^T -u^SO23 +u ^S O23 u sOE u sEa T2 u sC* t @@ -13635,24 +11357,19 @@ u R7 t } u R0 u ^R ^u } r -up2O02 +u p2 O02 ^u p2 ^j -u p1 y4 -up1OB3 -up1O53 -up1O13 +u p1 OB3 +u p1 O13 u p1 $K -u p1 ,7 u ^O ^D u o7V u o6A u o69 -u o4* t $U o4| ^u o3@ $u o2T u o1Z -u o0W u o0S Y2 u o0a ^u ^o @@ -13660,26 +11377,19 @@ u o0a ^u ^m $u L7 $U l $$ -$U $$ l u k y2 u K T3 ^u ^j u i7W u i7A u i3A -$u i0t -u i0a +u ^a u f ^G u ^F -udOB5 -udOB3 -udO62 -udO46 -udO42 -u d +B +u d O46 u DA +A $U D9 -u d -8 +u p1 -8 u D4 ^u ^c u *B9 @@ -13687,54 +11397,41 @@ u *B9 u $a Y1 ^U ^A u .9 -u +8 +0 +u +0 +8 $u $8 -u-7O51 -u +7 ,3 +u -7 O51 +u ,3 +7 ^u $7 ^u ^6 { u $5 Z1 u .5 Y4 ^u +5 -u ,3 +7 u +3 $U $1 u +0 Z5 u $0 Y4 -u +0 +8 ^. ^U $* u -[ u -t z5 z1 -t Z5 -$| t Z4 t Z3 oAa -[ t z3 t Z2 ^o $t Z2 -$$ t Z2 -t z1 z5 -t Z1 T8 +Y1 T8 t t $Z -tY5OA1 +t Y5 OA1 ^t Y4 -tY2O01 t y2 t Y1 $s t Y1 *A8 ^T y1 ^t y1 ^t ^Y -tO52$3 -tO01Y2 +t O52 $3 +t O01 Y2 ^T t ^a -t T8 Z1 t T6 o7o ^T T2 $t st! t sOA -t sMK -t sAb t sAa t sa$ $t $s -2 @@ -13743,27 +11440,21 @@ t R4 t t R3 t ^t $r t q -tp2O84 -tp1O78 +t p2 O84 +t p1 O78 t p1 o61 t p1 .6 { $t ^p -t ^o Z2 t oAD ] -t ] oAD t o8T t o8F t o8C t o7S -t o7o T6 t o7I $T o6Q t o6B $t o5w -t o3Y t o2I d -t o2G -t o1Y $t o0u t o0M -1 $T o01 @@ -13793,22 +11484,19 @@ $t i3s $t i34 ^T i1h t i1D i61 -^T i0D { ^T $H $t ^h ^t ^h ^t $g t ^F $0 ^T $F -tdO62 -t d $J t $D D8 t d *9B t D8 $D t d *79 $t } D5 [ t D5 -t d -5 +p1 t -5 t D3 *02 t d -0 t $D @@ -13826,7 +11514,6 @@ T9 i41 T9 $3 t '9 t +8 $N -T8 i04 t ] .8 t .8 ] t .8 @@ -13839,7 +11526,7 @@ T6 o01 T6 i62 T5 $z T5 Y2 -t+5O21 +t +5 O21 T5 T4 K $+ T5 T0 T5 o21 @@ -13847,80 +11534,61 @@ T5 K T4 T5 i6- T5 i5@ T5 ,6 -t -5 -4 +t -4 -5 T5 ^3 $# T5 ^t ^5 T4 y4 D5 T4 T6 -T4 T5 ,9 +T4 ,9 T5 T4 o8@ T4 o3Y -T4 o2S T4 o1! T4 o03 -T4 i50 -T4 i5@ T4 i4_ -T4 ,9 T5 -t -4 -5 T4 ,3 T4 { { -T3 Z5 Z4 T3 Z5 Y4 -T3 Z4 Z5 -T3 z2 +T3 Z5 Y4 T3 y3 -t$3O52 +t $3 O52 T3 T7 T3 T6 -T3 o5P T3 o0F -t .3 k -T3 i4* T3 $1 T3 $@ T3 $! ^# T3 -^. $ T3 +^. $ T3 T2 Y1 T3 T2 T6 T2 T4 T2 T3 Y1 -T2 T1 $9 +T2 $9 T1 T2 seR T2 sB0 T2 s1< T2 ^S $t -2 $s -T2 o4N T2 o1& -T2 o00 T2 i6@ T2 i2Y -T2 i2t -T2 $9 T1 T2 $+ [ ^! T2 ^T $2 } T1 z2 -$! T1 Z1 T1 Y1 T1 oA! T1 o2@ -t -1 o0M T1 o07 -T1 i8% T1 i62 T1 i3! -T1 i18 T1 $4 T1 $2 T1 ^2 T0 z1 i1A t $0 Z1 -T0O14i1A -$+ T0 T5 +T0 O14 i1A T0 T1 $D $* T0 o5b T0 o44 @@ -13928,14 +11596,11 @@ T0 i5@ T0 $D T1 ] T0 D7 T0 *45 -t *02 D3 $' T0 -t { $t { { $- $t ] t ] -$s Z5 Z4 -$s Z4 Z5 +$s Z4 Y5 $s Z2 $r ^S z1 Y1 ^S $z @@ -13943,17 +11608,15 @@ syI u $s y5 sy4 $s Y2 -^S Y1 z1 $s Y1 sy- -$sO52 -^SO42 +$s O52 +^S O42 $S $X $s $x swt +6 swS Z2 swS Y2 -suo ] sui p3 ^S ^U ^s ^U @@ -13961,13 +11624,12 @@ su* $s $u stY C stw i3v -str l stn o7p stl ssz o3v ssz $! ssy -ss#O52 +ss# O52 ssX ssP T3 ssj @@ -13978,7 +11640,6 @@ sr; y2 sru i3G srt +0 srg u -sRD y5 sr1 $A $s $r $[ s[. $r @@ -13988,7 +11649,7 @@ sqf spx spr ^S ^P -sO) Z1 +Y1 sO) sou r so@ o1@ sol ] @@ -14000,13 +11661,11 @@ sol ] ^s o10 so0 C snH R5 -sNG y2 snc *53 smt t smt smn sml +0 -} sMg smg sm, +1 $s $m @@ -14024,29 +11683,23 @@ skg +0 skc sk- sJw +2 -sjN Z1 sIY Z4 siv [ siu sib D3 -sia E $s i8G ^s i50 ^S i5* ^s i4i $s i4f o4d ^S i2d -^S i1T ^s i1S ^S i1r -^S i1M +^M ^S $s i1g -^S i1B -^S i1b -^S i0L $s i07 sh* -sgl y1 +z1 sgl sgG sg4 set @@ -14054,12 +11707,11 @@ ser +2 seJ $, seG -5 seE -seCO71 +seC O71 sea se1 c se1 ] s?! E -^s E se@ sd- t sDS -7 @@ -14068,18 +11720,15 @@ sdq ^S ^D $S $d scg k -scFO71 +scF O71 sCe *50 -sCA z5 ^S $C ^S ^C ^s ^c -sBv y2 sbv -sBTO12 +sBT O12 sbg sbd -sbB Y4 sB* ^s ^b sau *57 @@ -14114,7 +11763,6 @@ s6# s56 s5 *06 s4I Y1 -s4C Z2 ^s *46 $s $4 s3B $F @@ -14124,7 +11772,7 @@ s3. s28 D8 [ s2- ^s ,2 -s1*O35 +s1* O35 s1o Z5 s1* o41 s1! i0! @@ -14147,7 +11795,7 @@ s1 s-1 [ s1! s0 Z1 -s0@O43 +s0@ O43 s0. R4 s0 K s0B i0A p5 @@ -14167,7 +11815,6 @@ s., s-+ s-_ $s $/ -$s [ $* ^s $_ $s ^s $/ @@ -14175,18 +11822,17 @@ $_ $s ^_ ^s r Y4 i1g r $x i0c -rO21i0w -rO05 -rO03 +r O21 i0w +r O05 +r O03 $r $w r T2 ^r $t ^R ^s -$[ $r s[. r R6 *50 $r ^q -rp3O09 -rp2O04 +r p3 O09 +r p2 O04 r p2 ^A $r o5s r o3z @@ -14198,7 +11844,7 @@ $r $m r L4 Z2 r k y3 r k ^v -r K ^0 +k r ^0 r i6t r i6e r i67 @@ -14209,17 +11855,13 @@ r i3f $R i2K r i2k r i2j -^R i1Y r i1u -^R i1H r i1g Y4 $r i1g r i0! z1 -^r i0d -r i0c $x $r $h ^r $g -rfO04 +r f O04 ^R ^F $r ^E o0W ^R ^E @@ -14234,11 +11876,9 @@ r c $! r c ^r ^c ] RA RA -R8 R8 '9 R8 '9 R8 { R8 -R7O04u -R7uO04 +R7 u O04 R7 sr# [ R7 R7 $R ,7 @@ -14246,18 +11886,15 @@ $R ,7 R6 R6 c R6 c R6 R5 R2 l -R5 o4X R5 o11 R5 l R2 r *56 R5 +5 -r *50 R6 R5 { { R5 ] R4 R4 R4 o53 R4 ,5 -r +3 o1u R3 d E R3 C R3 ,4 @@ -14271,19 +11908,17 @@ R2 i22 ^r .2 R1 } ^r .1 -R0O21 +R0 O21 R0 R4 -R0 o6u R0 L1 R0 K +4 -r ^0 K R0 i1N r +0 f R0 d c R0 c d R0 +4 K r *02 ^W -r ^$ +$$ r $* ^r { r $. ] ^r @@ -14291,29 +11926,23 @@ $* ^r ^_ ^r $q Z4 Z3 ^q z4 z3 -$q Z3 Z4 -^q z3 z4 q z2 $. -q $. z2 -^q z1 Y2 +^q Y2 z1 $q Z1 r q Y5 '9 -^q Y2 z1 -qy1O58 +q y1 O58 ^Q y1 K $q y1 -qOA5$8 -qO92OB2 -qO62$e -$qO41 -qO28$@ -q$@O28 -qO03 +q OA5 $8 +q O92 OB2 +q O62 $e +$q O41 +q O28 $@ +q $@ O28 +q O03 q $w $q ^v ^Q t D7 -q t D3 -q t q R5 R5 $q ^r $q L6 @@ -14322,44 +11951,34 @@ $q L6 ^q ^j $q i2s ^Q i1C -q$eO62 +q $e O62 q d $Q -^Q D7 t -q D3 t q D3 C -q D2 C -q C D3 -q C D2 q C { q c -q+9O16 +q +9 O16 $Q -9 -q$8OA5 ] $q -5 ^q -5 -q -4 -0 +q -0 -4 $q +4 $q *32 $q +3 -q*15O32 +q *15 O32 ^Q $1 -q -0 -4 $! $Q $Q q $! -$q [ +[ $q $! $q } ^q -[ $q ^q $/ ^q ^+ ^. ^q $p Z1 -^p z1 ^P y3 *53 ^p y2 -{ ^P Y1 -^pO12 +^p O12 $p ^w ^P r $p ^p o3q @@ -14370,183 +11989,107 @@ $P $L $p ^J $P i6M $p i4P -^P i1A $p i0u -^P i0T ^p i0G $P $G ^p ^d ^P ^B ^p ,9 -p5 Y1 { { p5 *7A p5 } ^p $5 p4 Y2 ] -p4O23'A +p4 O23 'A p4 o3i p4 ^j $1 p4 $i [ -p4 [ $i p4 'A ^ p4 ^a p4 *80 *51 -p4 *51 *80 p4 *04 o0r p4 $| } p4 ] -p3 Y1 { -p3O6Bt -p3O6Au -p3O54O7A +p3 O6B t +p3 O6A u +p3 O54 O7A p3 $X .3 -p3O14$1 -p3O03O6B -p3uO6A -p3tO6B +p3 O14 $1 +p3 O03 O6B ] p3 o7 -p3 o5y ] p3 ] o5y p3 ] $f p3 'B i82 p3 'B i60 p3 $A [ -p3 [ $A p3 $7 [ -p3 [ $7 p3 .3 $X -p3$1O14 ^P .3 -{ p2 Z1 -p2 { Y1 -p2O9A] -p2]O9A -p2O96u -p2O94u -p2O76u -]p2O71 -p2O6A$A -p2O65] -p2]O65 -p2O58i51 -^.p2O37 -p2O21'A -p2O0Bu -p2O08+0 -]p2O01 -p2uO96 -p2uO94 -p2uO76 -p2uO0B +p2 O9A ] +p2 O96 u +p2 u O94 +p2 O76 u +] p2 O71 +p2 O6A $A +p2 O65 ] +p2 ] O65 +p2 O58 i51 +^. p2 O37 +p2 O21 'A +p2 O0B u +p2 O08 +0 p2 $r Y1 p2 { $q p2 o0j $1 p2 o0f *21 p2 ^N $n -p2 i0d p2 $h p2 $D $a p2 ,B +3 ^. p2 'B -p2$AO6A p2 'A -p2 +3 ,B -p2 *21 o0f -p2 $1 o0j -p1Z3O61 -p1 Z2 *76 +p1 Z3 O61 p1 y3 ,4 -p1 y1 t p1 ^X u -p1OA4 -p1OA3u -p1O96u -p1O93E -p1O82] -p1]O82 -p1O6A -p1O64C -p1O61Z3 -p1O52t -p1O31] -p1]O31 -p1O15E -p1O09 -p1O04$_ -p1$_O04 -p1O02y4 -p1O02u -p1O02] -p1]O02 -p1uOA3 -p1uO96 -p1uO02 -p1 u ^X -p1 u ^S +p1 OA4 +p1 O96 u +p1 E O93 +p1 ] O82 +p1 O6A +p1 O64 C +p1 O61 Z3 +p1 O52 t +p1 O15 E +p1 O09 +p1 O04 $_ +p1 $_ O04 +p1 O02 y4 +p1 O02 ] p1 u ^E p1 u D9 p1 u D4 p1 u ^D -p1 u +8 -p1 u *76 -p1 u *75 -p1 u -6 -p1 u *40 -p1 u +0 -p1 t y1 -p1tO52 p1 t ^S -p1 t ^M p1 t i4G p1 t D5 p1 t ,B p1 T7 -p1 t -5 p1 t -4 -p1 t $0 -p1 ^S u -p1 oBA p1 oB5 p1 o64 -p1 o4- -p1 l $4 -p1 l *12 p1 i8 p1 i7f ] -p1 ] i7f p1 i7_ p1 i6W t p1 i6$ -p1 i4E p1 i0k i0k -p1EO93 -p1EO15 -p1 ^E u -p1 ^D u -p1 D9 u -p1 D5 t -p1 D4 u -p1CO64 p1 $C -p1 ,B t -p1 *97 *86 -p1 +8 u p1 *86 *97 -p1 *76 u -p1 *75 u -p1 -6 u p1 +6 p1 -5 t p1 -4 t -p1 $4 l -p1 *40 u p1 -4 p1 -3 -p1 *12 l -p1 $1 [ p1 [ $1 -p1 +0 u -p1 $0 t ^P ^1 p1 ] $p { @@ -14555,20 +12098,19 @@ $. ^p ^p ] ^o z3 $o Z2 } -^oy5O13 +^o y5 O13 ^O y5 u $o Y4 Y4 $o Y2 -^oO21 +^o O21 ^O ^W -^O u y5 $O $R ^o o4- ^O i71 $o i4_ ^o i2d ^o i1m -^o i0x +^o ^x $o $d oBs oBo u @@ -14583,7 +12125,7 @@ oB1 $3 oB0 ^O ^B oAy t -oA!O71 +oA! O71 oAv oAo -9 oAm @@ -14606,12 +12148,10 @@ o9i u o9@ i01 o9g o98 C $2 -o98 $2 C o98 $. o95 u o95 C +8 o95 +8 C -o9* ,5 o95 o94 $? o9 $4 @@ -14622,24 +12162,20 @@ o92 i91 o92 ^1 $* o92 o91 Y1 c -o91 c Y1 o9 $0 o9@ o9. ] o8z u o8# ^Z o8y -o8W T3 o8w o8v o8u t -o8u *83 o8u *38 o8s Z1 o8s o7u -o8R *58 o8r -o8pO91 +o8p O91 o8o o3o o8o o8m @@ -14663,7 +12199,6 @@ o87 $$ o8^ .7 $* o87 o87 -o8% *58 o84 o79 o84 $! o82 $a @@ -14685,33 +12220,26 @@ o7Y $O o7x *53 o7x *30 } o7x -o7W T6 o7V .6 o7T o7s *67 -o7r *52 o7q o2s o7p -5 o7. p1 ] o7o -6 o7! o1@ o7N $* -o7M *18 ] o7m $1 -o7L *57 -o7KO43sK4 -o7KsK4O43 +o7K O43 sK4 o7k *97 p2 o7k -3 -o7I Y1 o7h -5 o7e Y2 -o7eO31 +o7e O31 o7e T4 o7d $b o7d *02 -o7C l -o7bO25 +o7b O25 o7a $A o79 o0m o79 i73 @@ -14719,14 +12247,11 @@ o7@ *97 o7. ,8 i80 o78 $4 o78 $! -o77 +7 -o7@ $6 [ o7@ [ $6 o7@ .6 o7- .6 o75 $# $. o75 -o7& *46 o73 k o73 *57 } o73 @@ -14750,23 +12275,20 @@ $; o6x ^s o6w o6v u o6u Y2 -o6uO13 +o6u O13 o6u o9. o6U c o6u *14 o6t i3q o6t C -o6_ T5 ^* o6T o6s i5K o6S i2s o6- $s o6r *04 -o6r ] o6q i6e p3 o6p o7R E o6P C -o6O +5 o6, o5. o6o ] o6n @@ -14780,11 +12302,10 @@ o6 i7k o6H $r o6G T1 o6g -o6f ^x o6e +2 $@ o6e -o6dO92 -o6dO14 +o6d O92 +o6d O14 o6d *35 o6c ^s o6C .5 @@ -14795,18 +12316,13 @@ o6a Y2 o6a t $A o6a $j $! o69 -o68 .4 o67 +5 -o65 -7 o65 +1 -o64 .7 -o63O42 -o63 -7 +o63 O42 o63 $? o63 o62 $1 o61 $9 -o61 ] o6( $) o6( ^? o6. @@ -14819,18 +12335,15 @@ o5. y5 o5y $4 o5x o0k o5x *50 -o5=O32 +o5= O32 o5x ] -o5wOA2 -o5w *74 +o5w OA2 o5w o5u u p1 -o5u p1 u o5u -4 o5t K o5t D6 o5t *50 -o5T *20 o5s t o5S ^5 $@ o5r @@ -14841,7 +12354,6 @@ o5q +2 o5p $q *43 o5p *43 $q o5p *20 *16 -o5p *16 *20 o5p $. o5o ^L o5o $_ @@ -14863,33 +12375,26 @@ $! o5J o5i t o5i -8 o5@ $i -o5HO73 o5g $@ o5f o7o -o5f *03 o5F $& o5F ] -o5e u d +o5e d u o5e K o5e i4_ -o5e d u $. o5e ] o5e o5e -o5c -2 o5C $! -$* o5b T0 o5b o4o o5B ^( o5a C o5A *25 -o5a -1 o59 o41 o59 -4 o59 $3 o5% $9 -o58O31 -o58 -6 +o58 O31 o58 -4 o5% '8 $! o58 @@ -14921,13 +12426,10 @@ $] o5[ $. o5+ $! o5. ^[ o5] -o4Z T5 -o4z T5 [ o4z K o4x '8 -o4,O31 -o4wO63 -o4w o6r -0 +o4, O31 +o4w O63 o4w -0 o6r o4W } } o4v *25 @@ -14939,7 +12441,6 @@ o4T T0 o4t o0v o4t o4s ^M -o4S *43 o4s $1 o4/ s1. o4s @@ -14954,15 +12455,13 @@ o4n $0 $? o4N o4k +5 o4k -o4jO61-4 +o4j O61 -4 o4j ,8 -o4j -7 -o4j-4O61 o4j *45 o4j -0 o4J } } o4i y3 y3 -o4iO31 +o4i O31 o4I c o4* i7* o4i *30 @@ -14975,7 +12474,6 @@ o4e o3q o4E $! o4c -6 o4c *51 -o4b Z1 o4b Y1 $* o4A T4 o4a p2 'B @@ -14985,7 +12483,6 @@ o4a +0 o49 $- o47 *30 o47 +2 -o4# +7 o46 -6 o45 i53 o45 ^A @@ -14997,9 +12494,7 @@ o4- *30 o43 o42 i59 o42 -0 -o4$ .2 o4 $2 -o4@ .1 $! o40 o4* ] o4$ $$ @@ -15009,8 +12504,7 @@ o4- [ o4 $! o4@ } o4. -^, o4, -o3yO02 +o3y O02 o3y [ k o3y ^j +2 o3y D5 @@ -15018,14 +12512,11 @@ o3- y3 o3y *20 o3y $! o3x $x -o3X E o3x *37 ] o3w $z -o3wO01 [ o3w o3v o5g o3v *37 -o3v .0 o3V o3U u o3u i2w @@ -15038,14 +12529,12 @@ o3s i3d [ o3s D2 o3q $y o3q D0 -o3q ,7 -o3p +5 o3. p3 $% o3P -o3mO02 +o3m O02 o3M u o3l -o3- k +2 +o3- +2 k o3k +0 o3k $! o3j ^l @@ -15054,31 +12543,22 @@ o3j *32 K o3j o3i *31 o3h *12 -o3G -5 o3f $w o3f ^w o3f $v o3f +0 o3f -0 -o3e *57 o3e [ -o3d ^J -o3D D6 o3d *76 o3@ D7 o3d ,4 o3D $0 o3c sc3 i40 -o3c i40 sc3 o3c -6 -o3c *21 -o3c *12 o3c $0 -o3B ^Y o3b $A o3b *78 o3a t -o3a ,8 o3a *40 o3a *31 o3/ ^a @@ -15087,17 +12567,14 @@ o38 $s o38 *13 o3/ $7 o3. +6 -o35O01 -o34O51*43 +o35 O01 +o34 *43 O51 $. o34 p4 o34 o15 -o34*43O51 -] o34 o33 o52 o33 ^l o33 k D0 o3@ *34 -o3- +2 k o32 i3S $. o32 ^o *32 @@ -15118,10 +12595,7 @@ o2z $0 [ o2z o2z o2y $q +0 -] o2y o5q -o2Y c o2y *32 -o2y +0 $q $@ o2y o2x $@ o2w ^k @@ -15131,12 +12605,10 @@ o2v i3k ] o2v ] i3k o2v -3 o2u +3 -o2- ^U o2t t o2t o3w o2t *57 -o2t *54 -o2sy5O38 +o2s y5 O38 o2s ^x o2S E o2s $! @@ -15153,29 +12625,25 @@ o2) o0) o2n .5 o2n -0 o2m y3 -o2MO31 +o2M O31 o2m i2f o2L y2 y2 o2L l $7 -o2L $7 l o2l o2k $v o2K E o2j r o2j o3x o2j *34 -o2hO41 -o2h o5j +0 -o2h *53 o2h +0 o5j -o2gO62 +o2h *53 +o2g O62 o2g +7 o2g +0 [ o2g o2g o2f i4t o2f *42 -o2e R3 o2e K o2e *46 *65 o2d o7s @@ -15183,9 +12651,7 @@ o2d o5D o2@ D5 o2d *05 o2C E -o2C c $5 o2C $5 c -o2b +6 +3 o2b +3 +6 o2b *03 $! o2B @@ -15194,7 +12660,6 @@ o29 ^a o2. $9 o26 .0 o25 Y1 *02 -o25 *42 o25 *02 Y1 o23 o34 o23 i32 @@ -15203,33 +12668,27 @@ o22 T4 o22 C o2@ *23 o21 T1 -o21 *43 -o21 $1 o20 $x o20 -o1yO23 +o1y O23 o1y *54 o1. y2 o1Y o1x ^w o1X c .0 o1W l d -o1W d l o1W ^D -o1w *35 o1w .3 -o1w *12 o1W o1v [ i0e ^# o1V -o1uO61 -o1uO43 -o1uO21 +o1u O61 +o1u O21 o1u -0 $! o1U o1u $! o1t +3 -o1SO34 +o1S O34 o1s ,2 o1s $! o1r y5 @@ -15245,34 +12704,27 @@ o1O *17 o1O $& $& o1O $! o1O -o1n *63 -o1kO21 +o1k O21 o1k *42 o1k *30 [ o1j o1i o2n o1i i0S o1I E D2 -o1I D2 E o1i ^A -o1) i1( o1. i0R o1H i2F -o1h -5 o1h ^0 o1G ^5 -o1f *72 o1f $! } o1f o1e r o1E *42 -o1E *24 o1e $2 o1d *72 *12 [ o1c ^l o1c k +2 o1C i6A -o1c +2 k o1# ^C o1C o1b o3b @@ -15288,27 +12740,21 @@ o16 y5 y5 o16 d $. o15 -0 o14 y5 -o13O71 +o13 O71 o13 o01 -o13 D7 o13 -4 o13 $@ .2 o13 .2 $@ -o12O61 o12 o21 o12 .0 o11 y3 o11 p4 ,5 o10 $S o10 E ] -o10 ] E -o10 +4 o1) o0Z y1 o0z k ^y o0Z D2 -o0z ^a -o0Z *15 o0Z $# o0y y2 o0y ^d @@ -15316,16 +12762,12 @@ o0Y $C o0y +7 o0y +2 o0@ Y1 -o0) Y1 -o0x $b -o0'O31 -o0W D4 +o0' O31 o0w +8 o0W $4 o0w *35 o0w $3 $# o0W -o0VO91 o0V T4 o0v $j o0V D9 @@ -15333,22 +12775,16 @@ o0v *37 o0v $1 o0v $. o0t Z2 -o0TO62 -o0tO52 -o0tO23 +o0T O62 +o0t O52 +o0t O23 o0T o5o o0t -8 -o0$ T6 -o0t -6 o0$ T4 T3 -o0$ T3 T4 -o0$ T1 -o0T $# o0T o0s y3 o0s t d o0@ so0 -o0s d t o0S $D o0S ^B $$ o0S @@ -15361,7 +12797,7 @@ o0Q $! o0` q o0p Z1 o0p Y2 -o0PO32 +o0P O32 o0P ^V o0P si1 o0P ^S @@ -15371,10 +12807,9 @@ o0p ,2 o0o D2 o0* o7+ o0, o2j -o0N y2 l -o0nO32 -o0NO31 o0N l y2 +o0n O32 +o0N O31 o0n .2 o0m i4z o0m i1o @@ -15383,12 +12818,9 @@ o0m *54 o0l Z1 o0l y5 t o0l y3 -o0l t y5 o0L o36 o0L o2C o0l k -o0L ,5 -o0l +2 o0l -2 o0L ^1 o0k z1 @@ -15404,33 +12836,28 @@ o0K *34 o0K -3 o0k ,3 o0K $0 -o0JO41 +o0J O41 o0j ^p o0j o2b o0J i3P o0j ^E o0J D4 -o0j *46 o0j -2 o0j *03 $? o0J -o0I L1 o0I $3 o0I o0h ^f o0h D5 -o0H .7 o0g Y2 o0g y2 -o0GO93 +o0G O93 o0g r -o0fO31 o0f i4a o0f i3k o0F '8 o0F +7 o0F -4 -o0f *02 o0f $+ o0f ] o0E ^T @@ -15440,7 +12867,6 @@ o0e $4 $! o0E o0E o0d Z3 -o0DO91 o0D ^J o0D $d o0d *64 @@ -15457,20 +12883,16 @@ o0B $* o0B $. $, o0B o0b -o0a ] ^v o0a ^v ] o0a i1h o0a -9 o0a *60 o0A .6 -o0a *06 o0@ +8 o07 z5 u -o07 u z5 { o05 o04 R1 r o03 ^# -o02 $k o02 $a o02 *05 $@ o02 @@ -15503,7 +12925,6 @@ $N $n $n ^n $n ^J ^N i3d -^N i1H ^N i1B ^n ^i ^n ^H @@ -15511,7 +12932,6 @@ $n $h ^N ^G $n ^g ^n ^D -^N c ^n ^B ^n *32 ^n -3 @@ -15525,17 +12945,14 @@ $. ^n $m Z1 D3 $m Y3 ^m ^y -^@^MO24 +^@ ^M O24 $m $w -^m u z5 ^M ^T ^m ^T $m ^t -^M ^S ^m ^S $m r p3 ^m r -$m p3 r ^m ^P ^m o4c ^m o2j K @@ -15552,10 +12969,8 @@ $m L6 ^m i2x ^m i2g ^M i1z -^M i1Y ^M i1n ^M i1l -^m i0r $m D3 Z1 $M $D ^m ^D @@ -15584,13 +12999,11 @@ $L t ^l ^s l r -5 ^L $r -l ^r } l p2 +2 $l $p $L o7x $l o6K $L o56 -l o51 $l o5_ $l o40 ^l o1y @@ -15601,21 +13014,17 @@ $l $L l K i18 ^l ^J $L i91 -l i3m $L i25 ^L i1s ^L i1F K l i18 K $L i0J { $l $f -l D5 -3 +l -3 D5 $l D3 -l D2 ^L $A l LA iAS -l *87 T1 L7 ^X spX -L7 spX ^X ^l +7 L6 Z3 *03 L6 ^m @@ -15627,75 +13036,63 @@ L6 -5 L6 *03 Z3 ^L $6 L6 -L5 o2b L5 L2 L5 -5 ^l *52 L3 y3 y3 -l -3 D5 L1 .0 { -L0 z4 $D +L0 $D z4 L0 $w -L0 r } -L0 { r L0 i4x L0 $f $s -L0 $D z4 L0 +0 $@ ^L $( $L $@ $l $- $l ^* $l -k z5 t -KZ2O03 -$k Z2 u +k t z5 +K Z2 O03 +$k u Z2 $K Z2 c ^k z1 k y5 -KY4O82 +K Y4 O82 K Y4 u $k y4 u K Y4 ^R K Y4 D4 K Y4 c k Y4 -kY3O71 -KY3O51 -ky3O51 +k Y3 O71 +K Y3 O51 +k y3 O51 k y3 +2 k y2 ,3 k Y1 i0s -KO41Y4 -kO2A -kO21i0j -KO03Z2 +K O41 Y4 +k O2A +k O21 i0j +K O03 Z2 k ^w $k $v -$k u Z2 -K u Y4 -$k u y4 -K u T3 -k t z5 $k ^t k K t +5 k t *21 $k ^T k ^t -K s7I k s3. i12 K ^R Y4 k $q ^a k ^$ q k p5 *7A $K p4 $H -Kp3O65 -Kp2O09 -kp1O06 +K p3 O65 +K p2 O09 +k p1 O06 $k o7f k o7d k o74 -} k o6j k o6d K o6b k o51 @@ -15708,7 +13105,7 @@ K o2y k o2y K o2k K o1v -k o1v +[ i1v K o0s k o0c k o01 @@ -15731,23 +13128,16 @@ K i31 k i3_ $k i2p $k i1q -k i12 s3. K i12 -k i0s Y1 -K i0s -k i0K ^k i0e -$K i01 K ^h $k $h ^k ^g K $e +3 K E $$ -K $$ E -K d +B +K p1 +B K D4 Y4 K $D -$K c Z2 K c Y4 ^K ^C $k $c @@ -15768,14 +13158,12 @@ k *45 K +3 $e k ,3 ^k *26 ^v -k *21 t K $2 k ,2 [ k -2 ^k -2 k *13 K *12 ^y -^K *12 K $1 $_ ^K $1 K $@ @@ -15792,19 +13180,16 @@ $j $y $j ^t ^J ssd ^J ^S -^J o7. L1 -^j $m ^J L1 o7. +^j $m $j ^J -^ji5 OA5 +^j i5 OA5 $j i5a ^j i5 ^j i4z $j i2w $j i1v ^j i1@ -^J i0P -$J i0* $J $h ^j ^h ^J ^G @@ -15820,7 +13205,6 @@ $j *73 *02 ^J $3 ^J ,3 ^J -3 -$j *02 *73 $$ ^J ^J $* ^$ ^J @@ -15839,7 +13223,6 @@ $I $s ^i ^k { ^i ^j ^I i7$ -^I i1r ^I i0T ^i i0H y2 ^i ^h @@ -15849,15 +13232,13 @@ iBi iB E iBA u iB@ -iA+O73 +iA+ O73 iAu -iAS LB iAi t iA2 $d iA0 iA# i9z -i9$O04 i9S ^M } i9s i9 oB5 @@ -15867,30 +13248,27 @@ i9 E i9D oAU i9. -A i9 $9 -i98O0B +i98 O0B i90 $_ i9# i9) ^( i8X i9X -i8 O32 i8w ] i8t u -i8sO25 +i8s O25 i8r +6 i8R *07 i8R i8r -i8kO61 +i8k O61 i8k o4m i8_ i9- i8f i8_ *9A i89 *58 -i8@ -9 i8 -9 i88 i64 i88 $0 -i84O61 i84 ^B i82 oA2 i82 @@ -15902,21 +13280,18 @@ i7Z c i7% Z2 i7. Y4 i7 Y3 -i7@O51 +i7@ O51 i7v i8s i7V $? -i7uO42*15 -i7! T5 -i7$ T1 +i7u O42 *15 i7S i7R *80 i7Q .6 i7p -i7oO82 +i7o O82 i7^ o5^ -i7N *37 $$ i7l -i7iO12 +i7i O12 i7- i4- i7i i7h Y1 o7- @@ -15930,7 +13305,7 @@ i7d o6a i7d c i7@ D1 i7D [ -i7CO14 +i7C O14 i7% c i7, c i7c @@ -15939,7 +13314,6 @@ i7a $A i7a ^( i78 $! i7 ,8 -i7* *70 i7+ .7 [ i7} +7 i76 D3 @@ -15949,12 +13323,10 @@ i74 i73 D1 i7. *31 i7_ $3 -i72O21c -i72cO21 +i72 O21 c i72 $4 i72 .1 i71 $* -i7# *03 i7? i7` $@ i7, @@ -15964,14 +13336,13 @@ $/ i7? i6@ Z1 i6y i7 i6. Y2 -i6 O73 +i6 O73 i6w t } i6v -i6uO31 +i6u O31 i6u o7x i6u o0f i6u -i6- T5 i6s Y1 i6s i6f i6s $7 @@ -15981,11 +13352,10 @@ i6P ^X i6. o3. i6n o7d $! i6m -i6LO34t -i6LtO34 -i6kO73 -i6iO72 -i6iO23 +i6L O34 t +i6k O73 +i6i O72 +i6i O23 i6# i7$ i6. i3, i6h i7e @@ -15993,12 +13363,10 @@ i6h c i6h 'A i6h ,7 i6G u -i6e +7 ,4 i6e ,4 +7 ] i6e -i6DO42 +o5D O41 i6d $l -i6= D0 i6/ c i6A .5 i6@ $A @@ -16008,7 +13376,7 @@ i68 -4 i6@ -8 $( i68 i68 -i67y2O43 +i67 y2 O43 i67 $) i6+ ,7 i6, ,7 @@ -16016,16 +13384,14 @@ i67 i65 $9 i65 *35 i6. *46 -i64 *57 i64 $1 i64 -i62O74 -i62O41o45 +i62 O74 +i62 O41 o45 i62 ] i61 s2- i61 o70 i6. -1 -i60 *BA i6* $* i6/ i6! @@ -16035,7 +13401,7 @@ $/ i6, $! i6- ] i6@ ] i6 -i5yO62 +i5y O62 i5y i2r i5_ Y4 i5_ Y3 p4 @@ -16046,14 +13412,13 @@ i5x $w i5x r i5X ,6 i5x *07 -i5W .7 i5V $v i5v ^v i5v i2s -i5uO21 +i5u O21 i5u $! -i5tO62 -i5TO03 +i5t O62 +i5T O03 i5t $b i5 t i5s $w @@ -16068,13 +13433,12 @@ i5o i5n c i5n $5 { i5m $x -i5M l ,6 -i5m $i i5M ,6 l +i5m $i i5m ^2 i5m $@ i5m -i5lOB1 +i5l OB1 i5L i3* i5l DB i5l +B @@ -16082,7 +13446,6 @@ i5k Z1 i5k ^s i5K i5k i5k +6 -i5K *15 i5j t i5J $# $# i5J @@ -16097,7 +13460,7 @@ i5g $d i5g ,6 i5f K i5E y5 -i5E*07O53 +i5E *07 O53 i5E i5d t $* i5D @@ -16106,42 +13469,35 @@ i5d [ i5C L7 i5c $1 i5% c -i5bO02 -i5, ,B i5a o2r i5a $k i5a c $. -i5a $. c i5a $A i5a +7 -i5A *02 i5& 'A i5- ^A $. i5a } i58 i57 $9 i57 ,6 -i5( *68 i56 $4 i5@ -6 i55 D2 i55 $* i54 Y1 -i54O03 +i54 O03 $= i54 i53 $8 i53 $3 -i53 ,2 i53 $! [ i53 i52 Y1 -i52O12 +i52 O12 i52 i67 i52 C i52 *5A i52 } i5. $2 -[ i52 i51 ^O i5- $1 ] i51 @@ -16153,12 +13509,10 @@ i5@ [ i4Z $, $, i4Z i4z -i4y $q [ i4y [ $q i4. y5 i4- y4 i4_ y4 -i4%O21 i4x *10 i4X ^1 i4w i26 @@ -16167,10 +13521,9 @@ i4v $e i4v } } i4v i4u D0 -i4TO13 i4t o5h i4t ] -i4sO02 +i4s O02 i4s k i4s i6z i4s *02 @@ -16193,7 +13546,6 @@ i4m $* i4L o0K i4L $l i4l D7 -i4L +5 i4k $M i4j i2q i4j ^h @@ -16202,15 +13554,13 @@ i4i .5 i4H $h i4H D7 i4H '7 -i4g *30 i4g -i4F*67O25 +i4F *67 O25 i4F .3 i4f *21 i4E E ^8 -i4d u ^1 -i4d i2S i4d ^1 u +i4d i2S i4_ D1 p3 i4d i4C $l @@ -16221,10 +13571,8 @@ $! i4C i4B ^e i4b .5 i4a K -i4a *35 i4_ '9 i48 o3@ -i48 k i48 $a i48 ,5 i48 +2 @@ -16238,7 +13586,6 @@ i45 ${ } i45 i43 $s i43 i4r -i4- *30 i4_ +3 i4 -3 i4@ -2 @@ -16250,12 +13597,10 @@ i4, $1 i4= $1 i40 o31 i40 ^e -i40 *31 ] i40 $1 i4_ -0 i4$ i4@ ^! -i4! ^$ i4- $- i4_ $@ i4_ ^' @@ -16265,10 +13610,9 @@ i4^ ^% $# i4* $@ i4- ^ i4. -i3zz1O03 +i3z z1 O03 i3z ^s i3z $A -i3z *52 i3z -2 i3y u i3y -7 @@ -16277,10 +13621,9 @@ i3, y4 i3. y2 i3 y1 [ i3y -i3x ^x -i3@O61 -i3-O52 -i3@O51 +i3@ O61 +i3- O52 +i3@ O51 i3w $q i3w i3e i3w D1 @@ -16293,12 +13636,11 @@ $. i3u i3t y5 i3t o2w i3T ,4 -i3SO51 +i3S O51 i3S l $5 i3s i3x i3s $A i3s $8 -i3S $5 l i3s $4 i3s *30 i3s ] @@ -16310,23 +13652,21 @@ i3@ p4 $@ i3; o0l i3- ^) o0d i3n C -i3mO65 +i3m O65 i3m $p i3m i3k K i3k $g -i3k *01 i3j o5l i3j i5x [ i3j -i3iO53 -i3i T1 +i3i O53 i3i -4 i3. i26 i3h $f i3h D1 i3h -0 -i3gO42 +i3g O42 i3g ^v i3g i04 i3g ^6 @@ -16341,10 +13681,9 @@ i3e -2 i3E $! i3= E i3d ^s -i3di3zO21 +i3d i3z O21 i3d ^e i3d *40 -i3d +4 i3d .2 i3c $w i3c $! @@ -16353,22 +13692,18 @@ i3@ c [ i3c i3B o4C i3b -7 -i3B .4 i3b +1 -i3aO63 +i3a O63 i3A i3a -1 i3a $A -i3A -1 i3a $! i3a i39 $D C -i39 C $D -i3! *83 +i3! *38 i3* '8 i3? +8 i37 o6n i37 -9 } i3, $7 -i36O72 i36 i69 i36 C i3, *63 @@ -16377,13 +13712,9 @@ i35 i24 i35 d T0 i35 $! $@ i3@ +5 -i3# *40 i3* ,4 i33 i38 -i3! *38 -i33 +7 i33 $6 -i3, *36 i33 $0 i33 $* i3- ^3 @@ -16397,7 +13728,6 @@ i31 *72 $# i31 i3$ $^ i3@ $# -i3. ^ i3- $. i3- ] i3_ @@ -16408,22 +13738,21 @@ $? i3? ] i3, ^[ i3] i2z D6 -[ i2z i2y $v i2y ^k i2_ Y4 i2 Y1 [ i2y -i2xO32 +i2x O32 i2x ^q i2x -5 i2x -3 -i2WO34 +i2W O34 i2w ^s i2v K i2v *53 } i2U -i2ty4O82 +i2t y4 O82 i2t i0e o0r i2t $_ .2 i2t .2 $_ @@ -16432,14 +13761,12 @@ i2s $S i2S E i2s $A i2S $4 -i2s *06 $. i2s i2r L6 i2R E i2r D8 -i2r *37 i2r ] -i2qO52 +i2q O52 i2q $r i2q $- i2p $j @@ -16448,7 +13775,6 @@ i2p *31 i2p ] ] $@ i2o i2n o0F -i2n -0 i2m o7Q i2m *73 i2m [ @@ -16463,14 +13789,11 @@ i2g $q i2g $m i2g i4t [ i2g -i2fO52 i2e o93 i2d i43 i2d i2w -i2d *31 i2c K i2c -i2bO36 i2b i2a C ^E i28 i21 @@ -16482,10 +13805,8 @@ i24 ] [ i24 i23 ,6 i23 -i22O32 -i22 R3 +i22 O32 i22 p3 -[ i22 i21 Y2 i20 r ^7 i20 $f @@ -16497,26 +13818,23 @@ $; i2& ] i2 i1Z E i1@ z1 -i1Y $3 [ -i1Y [ $3 +^Y D1 $3 i1y $. -i1xO34 i1x $a -i1x { -i1wO23 +i1w O23 i1w i4t i1w i17 i1w ^b i1W .0 c $! i1w i1w -i1VO63 +i1V O63 i1v p1 i1v i1i i1U ^z o2f i1u y4 y4 i1u C -i1TO23 +i1T O23 [ i1t ^s i1t +9 i1t ^7 @@ -16527,12 +13845,10 @@ i1s i01 i1s $9 i1s ^5 i1s -i1RO23 $. i1r ] i1. r -i1pY3O02 -i1P ^Y -i1pO02Y3 +i1p Y3 O02 +i1p O02 Y3 i1p ^o i1o o0C i1o i2l @@ -16549,11 +13865,9 @@ i1i $4 i1- i1v i1h u i1h $2 -i1g ^m i1g ^j } i1g i1F i19 C -i1F C i19 i1f *9A i1e y2 i1e i4n @@ -16561,7 +13875,6 @@ i1e $d i1E $9 i1e -4 i1_ E -i1d ^S i1C z1 i1b z1 i1b ^v @@ -16569,57 +13882,37 @@ i1a ^s i1a i3e i1a i1w i1a ^7 -i1A +3 i19 ^b i17 +2 -i17 +0 -} i17 i15 Y3 Y3 i15 ] i1& ,4 i14 i13 -i12 *A7 i12 ^7 i12 *25 i0H i1@ $2 i1! ,2 -i11O61 -i11 $! +i11 O61 i10 i1! i10 $H -i10 *71 -i1_ $- i0z $t i0z ^o i0z i3s -i0z ^c -i0* z2 -i0$ z2 -i0{ z2 i0* z1 *64 -i0Z .1 -i0Y ^M i0y i5s -i0X z5 i0X ^Z i0x D1 o3- -i0X ^A -$. i0x i0w i2q i0w i0T -i0W $f i0v $f i0u ^3 -i0u $, i0t ^s ^L i0T ^j k i0! T1 R8 [ i0s y2 -i0s ^w i0- s-w -i0s t -i0s $k +^s $k i0s i2v i0S $h i0S $B @@ -16627,35 +13920,28 @@ i0S $B i0r $w *24 i0r ^o i0R i5j -i0! R8 T1 i0r *24 $w -i0qO13z1 +i0q O13 z1 $- i0q i0p ^T i0p ^S i0p *50 -i0P i0o i0y i0N $N i0M y2 E i0M i6] R6 i0m i2_ -i0m ^a -i0M ^7 -i0L Y2 +^m ^a i0l ^P i0l ^n i0L $3 i0K z2 i0. ^K ^_ i0k -i0JO35 i0j i3x -i0j i0w i0j $f i0j *02 i0i z2 -i0i ^y i0. i0l i0< ^I i0h $q @@ -16664,29 +13950,20 @@ i0H i1Y $@ i0H i0g ^z i0g i0s -i0G ^F i0G +3 -i0f z1 i0f ^R i0f i0w -i0F i0e ^Z i0e $w i0E ^e i0d ^S -i0D ^C i0d $b -i0d ^5 i0c i3a i0c i1q i0c ^i i0c ^a -i0B Y1 -i0B ^U -i0B $r -i0b i1} o1j +^j ^b i0b $7 -i0A z4 i0a smz i0A $r i0A $p @@ -16694,37 +13971,28 @@ i0A o1u i0A i0K i0a $g i0a $= -i09 ^s i0. ^8 i04 $k *16 i04 i3e t i04 $7 i04 *16 $k i04 $! -i04 $^ -i0, +4 i03 { $E i0^ $1 -i00 ^X -i00 ^l i00 ^1 -i0- -$! i0* ^H z2 ^H ^y k -^HO21D1 +^H O21 D1 $h u $h t $J $h $t ^H ^S ^H p3 $h -^H o5@ ^h o2n *02 ^h ^m ^h $l ^h k i5y $h K -^h i5y k $H ^H $H $h $h $g @@ -16735,14 +14003,12 @@ $h $g $h ^@ $@ $h $_ $h -^g z5 u +^g u z5 ^g Z1 y2 $g ^z -^g y2 Z1 -^gO71 -$gO41 -^gO16 -^g u z5 +^g O71 +D4 $g +^g O16 ^g seo ^g ^S $G $P @@ -16755,7 +14021,6 @@ $g i4s $g i4q $g i4G $g i2q -$G i0S ^g i0M ^G ^H ^G ^G @@ -16766,7 +14031,7 @@ $G ^g $g $a $g $9 ^g +7 ^o -$g*08O43 +$g *08 O43 ^G $$ ^G $. ^@ ^G @@ -16778,16 +14043,13 @@ $F Z4 $f Z3 $F Z2 $F Y1 -fO96 -fO93u -fO91 -fO7Au -}fO76 -fO69u -fO24 -fuO93 -fuO7A -fuO69 +f O96 +f O93 u +f O91 +f u O7A +} f O76 +f O69 u +f O24 f t ^z $f $s ^M f q @@ -16805,48 +14067,42 @@ $F i34 $f i2s $f i2m ^f i28 -^F i1T ^F i1l ^f i1h $f i1D ^f i15 $f $h -ffO05 +f f O05 $F $f } -f DA ] -f ] DA -^f D5 -3 +^f -3 D5 $f d f C { ^f ^c $F $a ^F ^a f ^a -f *75 *01 +f *01 *75 ^f *51 -^f -3 D5 $f *34 ^F $3 ^f *21 ^F $1 ^F -1 -f *01 *75 ^F $* E z2 ^H $E Z2 -$# E Z2 E Z1 T4 E Z1 $@ E ^/ z1 -$e Z1 +$e Y1 E Y3 $7 E Y3 -5 E Y2 T3 -EO63$8 -EO45 -$eO41 -^e u ^S -^e t i55 +E O63 $8 +E O45 +D4 $e +^e ^S u +^e i55 t E $t $h E TA $2 E TA @@ -16855,7 +14111,6 @@ E T4 Z1 E T4 { E T3 Y2 E svd $1 -^e ^S u E se3 E s1Q E s0O @@ -16875,7 +14130,6 @@ $e i8q ^e i6! E i5V E i5T -^e i55 t E i51 E i5. E i5? @@ -16900,23 +14154,17 @@ $e D4 E +B DA $e ^b $e ^A $9 -E$8O63 +E $8 O63 E $- *84 -E $8 -$e $7 t E +7 $2 -E ,6 -4 +E -4 ,6 E $5 o8t E .5 K $E ^4 C -E -4 ,6 E $4 *23 E $3 o2c -E $2 TA E $2 +7 E *23 $4 -^e *21 -E $1 svd E ^1 i7y E } ^# E { { @@ -16924,8 +14172,6 @@ E [ E ^^ [ E $. [ E $? -[ $. E -[ $? E ^E $@ ^E ^. ^e @@ -16933,83 +14179,50 @@ E ^^ d Z2 D6 $D Z2 d Z2 } -dZ1O71 -d Z1 ,6 +d Z1 O71 d $* Z1 -d y3 .4 -[ d Y3 +p1 y3 .4 +[ p1 Y3 ^D Y2 d $Y -dOA3t -dO87t -dO81u -dO72r -dO71Z1 -dO71[ -$DO62u -d[O61 -dO52t -dO46 -dO41t -dO15 -dO12u -dO04u -dO04i8- -dO04E -d}O04 -dO03K +p1 OA3 t +d O87 t +d O72 r +d O71 Z1 +d O71 [ +$D O62 u +d O46 +d O15 +p1 u O12 +p1 O04 u +d O04 i8- +d O04 E +d } O04 +d O03 K ^D ^X ^d ^w -duO81 -$DuO62 -duO12 -duO04 d u ^T d u o7E d u o69 -d u ^K +p1 u ^K d u i75 d u i73 d u i66 -d u i0S d u *89 -d u *75 d u *72 d u .7 -d u *67 -d u ^1 d u } -d u { -d } u d { u -dtOA3 -dtO87 -dtO52 -dtO41 -d ^T u -d t ^S d t ^K -d t i77 +d i77 t d t i6O -d t i0D -d t D5 -d t D4 -d t D0 -d t $7 -d t *54 -d t -5 -d t *04 -d t +0 -] d t -d sKg +p1 t *40 +sKg p1 $d ^r p3 -d r E d r 'B $d ^q d oB3 d oB1 -d o7E u -d o69 u } d o69 d o59 d o58 .6 @@ -17019,62 +14232,46 @@ $D o3_ ^d o2c ^d o1i p5 d o0m ] -d ] o0m $d o0f $D o0D $d $o ^D ^M $d ^M $d $m -d l ^1 +p1 l i01 ^D $L -^d l } ^d } l -dKO03 -d ^K u -d K +7 -d K .7 +d K O03 +p1 K +7 +p1 K .7 d K ,5 d $K ^d ^J d i7s d i7k d i7a -d i77 t -d i75 u -d i73 u -d i66 u ^d i52 ^d i2j ^D i2c ^d i1i -^D i1C ^d i0V -d i0S u ^d i0R -d i0r $d $F $D $e $d ^E -dD8O05 +d D8 O05 d D6 Z2 -d D5 t -d D4 t d D4 'B -d D0 t $d $D -d d -dCO03 -d 'B y3 -d*BAO04 -DA i5l +p1 'B y3 +d *BA O04 DA D5 DA ] $D ^A -d'9O01 +d '9 O01 D9 T9 D9 slL -D9p1O08 +D9 p1 O08 D9 o3i $+ D9 d { '9 @@ -17082,113 +14279,88 @@ D8 o9g D8 o8t D8 o3q D8 i4_ -$* D8 E D8 c $6 D8 $. ^a -d *89 u D8 +8 -D8 $6 c D8 +3 D8 ^2 D8 ^1 D8 $? ^d ^8 D7 $y -D7O21 -D7O02^h -d .7 u -] D7 T0 -d $7 t +D7 O21 +D7 O02 ^h D7 sbp D7 o4I sIu D7 o3y D7 o3j -d +7 K -d .7 K +p1 +7 K +p1 .7 K D7 i5i D7 i3f D7 +7 -d *75 u -d *72 u ^D ^7 d +7 $+ D6 Z1 -d ,6 Z1 D6 ^t D6 snl -d .6 o58 D6 o3- D6 ^l o0d D6 i74 -D6 i38 D6 i2z D6 i2r -D6 i02 -D6dO04 +D6 ^2 +D6 d O04 D6 DB -d *67 u D6 -4 -D6 $. $, D6 ^d -6 D5 $z -D5O61$A -D5 t p1 -[ D5 t -d -5 t -D5 sa *93 +D5 O61 $A +D5 p1 t +D5 sa *93 D5 sa d +5 r -D5 p1 t D5 o5t D5 o57 D5 o49 D5 o34 D5 o3. D5 o2p -D5 o2@ d ,5 K D5 i6@ D5 i2p -D5 $i D5 E i03 -D5$AO61 +D5 $A O61 D5 $9 *43 -d *54 t D5 *43 $9 D5 .4 D5 $! D4 t $- -D4 $- t D4 [ p1 D4 o3J D4 o2g -D4 o0p ] D4 ] o0p D4 i6d D4 -2 *13 D4 $2 -D4 *13 -2 D4 $1 $@ [ D4 D3 y4 y4 D3 $y -D3O81 +D3 O81 D3 ^w -6 D3 r ^z D3 o52 D3 o3J D3 o2M -D3 o0G -D3 i51 +4 -D3 $6 D3 +4 i51 +D3 $6 D3 $3 ^d ^3 D2 $Y D2 ^v -d .2 p1 -D2 o9A +p1 .2 p1 D2 o2y D2 i3% D2 $f @@ -17196,20 +14368,16 @@ D2 ^e D2 $d d $2 $B $. D2 *32 -D1O81 -d ^1 u +D1 O81 D1 $S D1 R4 R4 -D1 o7c D1 o3 D1 ^o -d ^1 l D1 i52 D1 i5- -D1 i4 D1 i33 D1 i0l -d*1BO74 +d *1B O74 D1 $a D1 ^1 D1 $. @@ -17217,19 +14385,12 @@ $! D1 ^d -1 d $0 Z1 D0 y3 *35 -D0 y2 y2 D0 Y2 .0 -$$ D0 Y1 -D0O62 -D0O41$. -D0$.O41 -d +0 t -D0 $q +D0 O62 +D0 O41 $. +D0 $. O41 D0 o3k -D0 k -D0 i5= -d*08O01 -d *04 t +d *08 O01 D0 .1 k D0 .0 Y2 ] d +0 @@ -17240,38 +14401,33 @@ $. ^d ^d $! ^_ ^d C z5 -Cz4O71 +C z4 O71 [ C z3 c ^$ z3 c z2 D7 C $! Z2 ^C z2 -$/ c Z2 ^c z2 { C z1 -cY4O32 +c Y4 O32 C Y4 ] c Y2 Y2 ^c y2 *29 $C Y1 u ^C y1 -$- c Y1 $c $y -cO91T9 -cO84$1 -cO52 -$cO41 -cO32Y4 -{cO32 -cO13$7 +c O91 T9 +c O84 $1 +c O52 +$c O41 +c O32 Y4 +c O13 $7 $c $x ^c ^x -$C u Y1 $C $t l c TB T5 c TB c t $6 -c T5 TB c T4 .7 C T2 c T1 @@ -17289,18 +14445,15 @@ c o6R c o5u c o5b c o4K -c o2y c o2r c o2p ^c o2k c o2^ -C o1Y C o1u ^C ^O $C $N $c ^M ^c ^M -$C l $t ^c ^L ^c ^k *48 c K $@ @@ -17325,10 +14478,7 @@ C i2Y C i2R ^c i2h c i1t -$c i0u $c i0f -^C i0D -C i0a c $i $C $G $c $g @@ -17338,31 +14488,25 @@ c DA c D4 $. c $. D4 c D3 -C D1 d ^c ^D ^C C $7 $C $B c ^a ^a c *98 ,8 c *97 -c$7O13 -c .7 T4 -^C $7 C +c $7 O13 c *78 $* c $* *78 c *75 $$ c $$ *75 -^c *71 -c $6 t $c *60 i3t c +6 -C *32 ^c $3 c *24 C *23 ] C ] *23 ^. ^c -2 -c$1O84 +c $1 O84 C $@ C ] ] C ^@ @@ -17402,12 +14546,11 @@ $B i01 $b $f 'B DA $3 $b ^D *37 -'B c $7 +'B $7 c +B c -B $A } ^b ^A $b $9 -'B $7 c *B7 'B *B6 'B 'B $3 DA @@ -17427,24 +14570,21 @@ $. ,B $a Z4 $a Z2 -5 ^a z1 Y5 -^a z1 $a ^z ^a Y5 z1 -^a Y5 y1 [ $A y4 'A Y3 Y3 ^A y2 K ] ^A Y2 $A y2 -^a y1 Y5 ^a ^y -$AO83 -,AO64 -$AO53 -$AO31 +$A O83 +,A O64 +$A O53 +$A O31 $A ^v +A u ] -^a^sO43 +^a ^s O43 $A s61 ^a s1b +A s%! @@ -17471,8 +14611,6 @@ $a $o ^A $n $A ^m ^a ^m -$A l r -^a ^L ^A K y2 ^a ^k y2 $a $k @@ -17489,26 +14627,22 @@ $a i5a $A i53 $a i5/ ^a i5, -$Ai4 O43 +$A i4 O43 $A i4i $a i3o ^A i2B ^a i2a ^a i26 ^a i1y -^A i1X -^A i1L ^A i1k ^a i0q -^A i0P -^a i0H ^a ^f $A E T1 -A E $5 +A E $A $E ^a DA -^a D6 *10 +^a *10 D6 ^a ^c $a ^B $A +9 @@ -17518,24 +14652,19 @@ $a $9 *A8 o67 $. -A -8 $ *A8 -$A -7 o2p *A7 D6 ^a *78 ^a ,7 *48 $a +7 *A6 E $1 *A6 'A -*A6 $1 E -*A6 ^a +6 ^a -6 $a -5 Z2 --A $5 E ^A *53 ^A -5 ^a -5 -*A4O0A -^a *48 ,7 +*A4 O0A $a *46 $A *43 { $a ,4 @@ -17545,12 +14674,10 @@ $A $2 $A -2 ^A ,2 ^a *13 -^a *10 D6 'A $1 ^a $0 i69 $A -0 $A $* -$A ^@ $@ +A } ^A ,A @@ -17567,23 +14694,19 @@ $` ^a $9 Z4 $9 Z2 '9 Z2 -$9Z1O03 +$9 Z1 O03 ^9 z1 u -+9Y5O06 ++9 Y5 O06 $9 Y2 ^9 Y2 +9 Y1 T1 -+9O06Y5 -$9O03Z1 ++9 O06 Y5 +$9 O03 Z1 $9 $X -9 $V $L -^9 u z1 $9 T7 -$9 T2 T1 +9 T1 Y1 -$9 T1 T2 +9 t -+9 oB3 ,9 oA1 p3 -9 o8e +9 o62 @@ -17607,19 +14730,17 @@ $9 $E C ^9 ^e ,9 D4 $9 ^d -$9 C $E *9B *9A i9_ -9 $A *98 ,1 +9 .8 $9 ,8 -*97O53 -*97 i33 -*97^aO71 +*97 O53 +*97 ^a O71 *95 *A6 -*92Y5O15 -*92O15Y5 +*92 Y5 O15 +*92 O15 Y5 *91 *37 +9 $1 ^9 ^1 @@ -17628,23 +14749,22 @@ $9 ,8 +9 $@ $. $9 ^8 z3 -$8Z1O42 +$8 Z1 O42 $8 Z1 k -8 Z1 ,7 -$8 Z1 +$8 Y1 $$ +8 Z1 $8 Y3 '8 Y3 +8 Y2 $8 y1 $m $8 Y1 D0 -$8 Y1 -8 y1 -^8O43 -$8O42Z1 -$8O42 -$8O14 -$8O03 +^8 O43 +$8 O42 Z1 +$8 O42 +$8 O14 +$8 O03 ^8 u ^B $8 T6 -8 t @@ -17653,11 +14773,8 @@ $8 T6 .8 s26 ^@ $8 p3 .8 oA0 -+8 o7g +8 o5R --8 o3u '8 o0x -$8 $m y1 -8 ^m $8 k Z1 $8 ^K @@ -17671,28 +14788,22 @@ $8 i3r $8 i3h +8 i3_ -8 i2a -^8 i00 -8 D7 -$8 D5 C -^8 D3 -$8 D0 Y1 $8 C D5 -^8 ^B u +^8 D3 *8A u -*8A o6 K +*8A o6 K *8A $@ -$. -8 -A $8 ^a -*89Y4O32 -*89O32Y4 +*89 Y4 O32 +*89 O32 Y4 +8 ,9 -8 ,7 Z1 +8 -7 -8 +7 -8 .7 -*86Y3O02 -*86O02Y3 -*86 o7% +*86 Y3 O02 +*86 O02 Y3 *86 o0Q *86 c *86 $A @@ -17719,17 +14830,16 @@ $@ +8 ^* ^8 $7 Z3 $7 Z2 c -+7 Z1 k ++7 Y1 k ^7 z1 +0 .7 } z1 $7 Y4 l +7 Y4 +7 Y3 Y3 -,7 y1 p2 +,7 z1 p2 +7 Y1 *67 -$7O91 -^7{O51 -+7O02 +$7 O91 +D5 $7 '7 ^v +7 u D6 $7 T6 @@ -17737,15 +14847,11 @@ $7 T6 -7 ^S +7 R6 -7 o8u -+7 o55 $7 o3a -,7 o2W ,7 o0w +7 o07 -$7 l Y4 +7 l K -+7 k Z1 -+7 K l ++7 k Y1 -7 K $7 ^i ^R $7 i98 @@ -17756,29 +14862,22 @@ $7 i76 $7 i67 $7 i5n '7 i3@ -^7 i1d $7 ^H $7 ^F $7 ^f -7 E $5 -$7dO07 +$7 d O07 +7 D8 -+7 D6 u $7 $D ^7 ^d -$7 c Z2 +7 c T1 '7 ^c --7 c $* -7 $* c -*7BO71 +*7B O71 ^7 $B -*79 *6A -*78O02 *78 r *76 Y1 *54 *76 o71 -*76 o5D *76 o4- *76 o1l *76 k $. @@ -17786,18 +14885,16 @@ $7 c Z2 *76 i74 *76 i7/ *76 .7 *56 -*76 *56 .7 *76 *54 Y1 +7 .6 $ *76 ,7 +6 -7 .6 -*75O71 +*75 O71 *75 $u *75 o7f *75 o3w --7 $5 E -*75dO05 +*75 d O05 *75 +7 *75 *26 +7 +5 @@ -17808,18 +14905,15 @@ $ *76 ,7 -4 ^7 +4 *73 o2f -,7*37O21 +,7 *37 O21 *73 *50 +7 ,3 -*72 sst o5q --7 +2 r *72 o5q sst --7 *23 +-7 +2 r +7 +1 $7 $1 '7 ^1 *70 o3f -*70 i8R *70 *73 ,7 *06 *70 -0 @@ -17841,17 +14935,16 @@ $ +7 ,6 Z1 ^6 Z1 '6 $. Y2 -$6O71 -$6O45E -^6O21 -,6O03 +$6 O71 +$6 O45 E +^6 O21 +,6 O03 $6 ^w '6 u d .6 u -'6 t D4 +'6 D4 t $6 $t -6 soi -^6 s6m $. ^6 $. s6m .6 s0x $6 ^S @@ -17860,64 +14953,42 @@ $6 ^s +6 p4 $6 '6 p2 -6 p1 Y4 --6 o8e .6 o7. i52 -6 o7e +6 o73 $6 o61 $5 --6 o3R -+6 o3. -6 o2h ^6 o1T -'6 o1g -6 o11 -.6 o0y -6 o0F +6 l K -6 l K -$6 l D4 +$6 D4 l ,6 l d ^6 K z2 -+6 K l --6 K l +6 K +4 $6 $J --6 i7p -6 i7o +6 i7l -6 i74 .6 i7/ ,6 i7_ -'6 i5S .6 i5r -,6 i4- ^6 i4- -+6 i3S $6 i3k --6 i3b +6 i3. -6 i2v -$6 i1P -.6 i1a -^6 i00 -6 $i +6 $f -5 -$6EO45 -'6 d u -,6 d l ,6 D7 i4T -'6 D4 t -$6 D4 l -^6 C z2 ,6 C *45 $6 ^b +6 $! ^A -6 $A -*69O32 -*69 o6% +*69 O32 *69 $. -6 -9 -*68O08 +*68 O08 *68 o2K *68 o0d *68 *95 @@ -17926,11 +14997,9 @@ $6 ^b ,6 $8 *67 Y4 t *67 Y2 C -*67 t Y4 *67 o5* *67 o0G *67 o0f -*67 o05 *67 [ i3q *67 C Y2 *67 *85 @@ -17942,8 +15011,6 @@ $6 ^b $6 $5 o61 *65 o1u *65 K -*65 i33 -*65 i23 +6 -5 $f *65 *87 .6 *56 +2 @@ -17951,21 +15018,14 @@ $6 $5 o61 +6 +5 *65 { { $! *65 -*64 u p1 -*64 p1 u -*64 o4) *64 o0n +6 +4 K -*64 i2k *64 *79 -,6 *45 C -*64 *53 *64 .3 *31 *64 $0 ] ,6 ,4 .6 +4 *63 t -*63 o4? *63 o0x *63 l +6 *63 +6 l @@ -17974,7 +15034,6 @@ $! *65 *62 $w Z5 *62 o61 *62 -9 -9 -.6 +2 *56 *62 *53 ,6 -2 .1 .6 $2 @@ -17986,7 +15045,6 @@ $! *65 *61 ,3 ^6 $1 *60 z2 Y1 -*60 Y1 z2 *60 o8p *60 o3a *60 i7. @@ -18002,18 +15060,15 @@ $= .6 .5 } z4 $5 Z2 ,5 z1 Y2 -.5 Z1 [ -.5 [ Z1 $5 $Z +5 Y4 -7 ,5 Y3 y3 -,5 y3 Y3 ,5 Y3 ] ,5 Y2 z1 $5 Y1 Y4 -$5O71 -.5O32 -$5O12 +$5 O71 +.5 O32 +$5 O12 $5 ^X $5 $x $5 ^x @@ -18037,67 +15092,51 @@ $5 $s } $5 o7 .5 o6s $5 o6e -,5 o67 +5 o61 -5 o60 -,5 o6_ $5 o5 -.5 o4X +5 o4p -5 o3q $5 o2x +5 o2q -,5 o2P $5 o0F $5 o0C $5 o0A .5 ^n i2 .5 l K -5 K o8z -.5 K l .5 K E ,5 K $a ,5 k --5 iA1 -5 i6a -5 i61 ^5 i5w ,5 i5s +5 i5H l .5 i5e --5 i5@ -5 i4_ -.5 i3y -5 i3g $5 ^I -^5 $F C -.5 E K +^5 C $F $5 ^E $5 D6 ^5 D6 -^5 C $F $5 c $2 ,5 ^a z2 ^5 ^9 -*58O61o7b +*58 O61 o7b *58 *86 -*57 k +3 -*57 i5( +*57 +3 k *57 *46 $. *57 $. *46 -*57 +3 k *57 .2 *57 +0 -*56O62u -*56O02o7j -*56uO62 +*56 O62 u +*56 O02 o7j *56 ^s -*56p2O14 -*56 o73 -*56 o6@ +*56 p2 O14 *56 o46 *56 i2q -*56 i23 *56 i0x ] *56 ] i0x *56 ^A @@ -18106,14 +15145,9 @@ $5 c $2 *54 T0 *65 *54 s6N *54 o4z -*54 l -*54 i1T -*54 *65 T0 *54 -5 +2 *54 $@ ,4 *54 ,4 $@ --5 *42 t -*54 +2 -5 $! *54 [ } *54 *53 Z5 Z5 @@ -18121,67 +15155,56 @@ $! *54 *53 y3 Y4 *53 o7y *53 o47 -*53 o1I *53 k *53 i5t *53 i5g *53 -8 *53 -5 [ -*53 *24 +5 -3 +2 *53 +2 *53 $! -*52O51 -^5^2O41 +*52 O51 +^5 ^2 O41 *52 o4a -$5 $2 c -+5 +2 -3 *52 .2 +5 -2 *51 p5 -*51 o1K ^5 +1 ^5 $1 *50 o7w *50 o7g -*50 i2s *50 ,2 -*50 +0 $! *50 $! +0 $. *50 +5 $. +5 $ $5 $* -[ ^5 { .5 $$ ,5 $@ ,5 $. ^5 ] ^* ^5 .4 Z1 *57 -,4y5OA1 +,4 y5 OA1 $4 Y4 Y4 $4 Y3 $4 Y1 -$4O83 --4O52+3 -$4O51C -^4O43 --4O31 -$4 u p1 -+4 u d -,4 u d +$4 O83 +-4 O52 +3 +$4 O51 C +^4 O43 +-4 O31 +$4 p1 u ++4 d u $4 T8 $4 ^t ^4 ^t +4 so0 ,4 sE- -$4 p1 u -4 $p .4 o7@ -4 o5a $4 o57 --4 o2s $4 o2R +4 o0K $4 o0K @@ -18193,11 +15216,9 @@ $4 o0K ,4 ^k ^4 i7Z .4 i7. -,4 i6. -4 i5; ,4 i4Z c ,4 i4p -.4 i4L -4 i4i $4 i44 -4 i3d ] @@ -18206,14 +15227,10 @@ $4 i44 +4 i25 $4 i1u ^4 i1r -^4 i1c ,4 i0m ^4 i0L -^4fO06 -+4 d u -,4 d u +^4 f O06 $4 DA -$4CO51 $4 $c ,4 $A { ,4 $a @@ -18221,53 +15238,35 @@ $4 $c *48 +4 $4 -8 .4 $8 -*47Y3O41 -*47O41Y3 -*47qO17 +*47 Y3 O41 +*47 O41 Y3 +*47 q O17 *47 $1 *47 --4 ,7 -*46 t p1 -*46 t d -*46 p1 t -*46 o7& *46 o4y *46 o4. -*46 o0j -*46 d t -.4 *68 *57 +.4 *57 *68 *46 *76 +4 *65 -4 *63 ,5 } *46 -] ,4 ,6 ^4 ^6 -*45 i1V -.4 *57 *68 ] $4 *57 -4 *57 --4 ,5 *63 -*45 *12 +4 -5 ] *45 [ *45 -4 *41 ^j +4 *40 $4 .4 --4+3O52 *43 s47 *43 o7w -*43 o5j *43 o4M -*43 o4- -*43 o1I *43 K ,4 *36 *43 *21 ^4 $3 *42 ^y -*42 o45 -*42 o1E *42 k ^3 *42 *34 +4 *20 @@ -18278,7 +15277,7 @@ $4 +2 *41 -3 *41 *25 D5 ] *41 -*40O31 +*40 O31 *40 k y2 *40 $A ^4 *06 @@ -18298,18 +15297,14 @@ $! ,4 ^3 z2 $3 Y5 +3 y5 --3y4O75 +-3 y4 O75 $3 y4 c -+3 y3 y3 -3 y3 y3 -^3y1O42 -$3OA1 -$3O93t +^3 y1 O42 +$3 OA1 +$3 t O93 $3 $w $a -3 u f --3 u d -$3tO93 --3 t p1 -3 t i2- $3 T6 $3 T3 @@ -18322,9 +15317,7 @@ $3 T3 -3 r l -3 $q '3 p2 E --3 p1 t .3 p1 +6 --3 o98 $3 o9% -3 o9% $3 o8= @@ -18337,7 +15330,6 @@ $3 o5k -3 o5a $3 o59 -3 o4l -+3 o2G -3 o2c $3 o21 ^3 o1R l @@ -18345,30 +15337,22 @@ $3 o21 -3 o12 ,3 o0n ,3 o0L -,3 o0k -.3 o0c -3 o0A $3 o0$ --3 l r -$3iA8O43 +$3 iA8 O43 ^3 i60 -,3 i5z -3 i4l ^3 i42 $3 i3s $3 i3p --3 i3, --3 i2- t .3 i2s $3 i2n $3 i0S ,3 i0b $3 ^I -3 $h --3 f u '3 E p2 -3 E i0@ --3 d u +3 d c $3 D7 .3 D6 @@ -18392,18 +15376,13 @@ $3 c T7 *37 } *36 K *36 *74 -*36 *41 -3 *63 -*36 *14 -*36 *35 $w *35 $v *35 t *35 r -*35 o6n *35 o5u E *35 o2z -*35 i7M *35 i6a *35 E o5u +3 *57 @@ -18414,11 +15393,9 @@ $3 c T7 .3 -5 *34 sty *34 r $. -*34 o5n *34 o3S *34 o3- *34 o2f -*34 i5p .3 *47 *34 ^3 *34 *25 ^a @@ -18428,31 +15405,22 @@ $3 c T7 +3 +3 *10 +3 *31 *32 Z2 [ -*32 [ Z2 -*32 y3 *32 y2 -*32O61 -*32O03 -*32 o4$ +*32 O61 +*32 O03 *32 o3x *32 o3p *32 o0y $f -*32 $f o0y ,3 *26 $5 .3 *26 -*32 *45 *32 *14 .3 .2 -*31 Y1 ^d -*31O31i0a +*31 ^d Y1 +*31 O31 i0a *31 p5 ^g -*31 o2C *31 o1v *31 o0r *31 i3v -*31 ^d Y1 -*31 *54 -+3 *10 +3 +3 ,1 *31 $_ -3 +1 @@ -18461,9 +15429,7 @@ $3 c T7 ^@ *31 *30 y5 y5 *30 ^S -*30 o5f *30 i5h -*30 i5 *30 i24 *30 C [ *30 *20 @@ -18479,18 +15445,17 @@ $? -3 ^@ ^3 $2 Z2 $2 Z1 ,7 -^ $2 z1 -2 y5 y5 -2 y4 $2 Y2 Y2 ,2 y2 *45 ^2 y1 r -+2O72,3 -^2O32 -$2O13 -^2O13 -$2O12-0 -$2O12 ++2 O72 ,3 +^2 O32 +$2 O13 +^2 O13 +$2 O12 -0 +$2 O12 -2 $x -2 $w .2 u +0 @@ -18504,27 +15469,22 @@ $2 $Q +2 $q ^2 ^q -2 $p -.2 o8! -2 o7w $2 o6z E $2 o6b -2 o5y -2 o55 .2 o4u -.2 o4f $2 o4, -2 o3J ^2 o1j .2 o1i -2 o1e --2 o1d +2 o0x *14 .2 o0f --2 k y2 .2 K -5 $2 $K $2 k -[ -2 k $2 i88 -2 i7. $2 i5z c @@ -18536,12 +15496,9 @@ $2 i3m -2 i3a $2 i3_ -2 i3@ --2 i2x $2 i1r -.2 i1- $2 i0X $2 i0I -^2 i01 ^2 ^h $2 ^G -2 ^f @@ -18552,22 +15509,17 @@ $2 E o6z +2 D4 y5 ^2 D3 +2 D1 -$2 c i5z .2 ^c $2 $B ^2 'A -2 ^a -*28O62 +*28 O62 ^2 $8 p2 $2 +8 $2 ,7 Z1 *27 o7b +2 *73 *54 ,2 *71 -*26 i31 -*26 i2r -*26 i1r -*26 D5 *26 D3 *26 *76 *26 @@ -18577,7 +15529,6 @@ $2 +6 *25 Y4 r *25 Y4 +9 *25 o5a -*25 o4v *25 o2z r *25 o2k *25 o1a @@ -18585,9 +15536,7 @@ $2 +6 *25 D6 *25 -7 *23 *25 *64 -+2 *54 *73 *25 *43 -*25 *23 -7 .2 -5 *20 *25 +2 +2 -5 *07 @@ -18598,7 +15547,6 @@ $2 +6 *24 r *24 o4k *24 i5o -+2 $4 E *24 *A8 *24 *52 *24 *35 p1 @@ -18608,32 +15556,22 @@ $2 +6 -2 *41 *24 $@ *24 { -+2,3O72 -*23 o0y *23 [ k *23 *70 -*23 *45 *23 -4 -*23 *24 +2 +3 $ *23 -2 ,3 -.2 *20 -5 *21 y5 c *21 r -*21 o2g *21 o0w *21 l +2 -*21 C '2 -*21 $A -+2 *14 o0x -*21 +2 l *21 '2 C --2 *12 +0 -*21 *01 +*21 $A +*21 +2 l +-2 +0 *12 -2 -1 *20 y3 -$2-0O12 *20 ^V .2 +0 u *20 ^R @@ -18646,22 +15584,18 @@ $2-0O12 *20 i4+ *20 i3i ^_ *20 c -+2 *07 -5 *20 -7 *20 *65 $@ *20 $@ *65 -*20 *46 *23 -*20 *31 *20 *23 *46 +*20 *31 *20 +2 --2 +0 *12 [ *20 $1 ,2 *01 *20 *03 *20 +0 +2 +0 [ *20 -+2 $. [ +2 [ $. $2 $* $2 ^$ @@ -18676,7 +15610,7 @@ $! $2 ^# $2 ^* +2 ^1 Z5 Y2 -+1 z5 u ++1 u z5 $1 Z2 C $1 Z1 D6 +1 y5 E @@ -18685,20 +15619,16 @@ $1 Z1 D6 +1 Y3 ] +1 Y3 $1 y3 -$1Y1O71 -,1 y1 $. +$1 Y1 O71 ,1 $. y1 -$1OB3 -$1OA2c -$1OA2 -$1O71Y1 -$1O53$1 -$1O04 +$1 OB3 +$1 OA2 +$1 O71 Y1 +$1 O53 $1 +$1 O04 +1 $w Z2 $1 ^w -+1 u z5 +1 u [ -+1 t y4 ,1 T2 -1 T0 +1 t @@ -18724,10 +15654,8 @@ $1 o1y .1 o0w -1 o0p ,4 $1 o0g -+1 o02 ^1 ^N ^1 ^M -,1 l y4 ^1 ^L -1 K $1 iAQ @@ -18749,39 +15677,27 @@ $1 i4m +1 i2p .1 i2E -1 i1u -+1 i17 ^1 i0S -1 [ i0j -1 i0j -$1 i0` -^1 i0# +^` $1 $1 E +1 ,1 d Z1 -$1 D7 C +$1 C D7 $1 D6 Z1 $1 D6 *45 $1 D5 -^1 D3 +1 $d -$1 C Z2 -$1cOA2 -$1 C D7 $1 C *12 [ -1 $B $1 .A ^1 'A +1 $a -*19 r } $1 .9 $1 ,9 -*18 o0W *18 *09 $1 ,8 [ $1 $8 -*16 y2 y2 -*16 Y2 [ -*16 [ Y2 -*16 i7b *16 -7 *73 $1 -6 .1 *57 @@ -18791,12 +15707,8 @@ $1 -6 [ *15 ^1 ^5 *14 y2 } -*14 t *14 o5k --1 ,4 o0p *14 ^k -*14 i2l -$1 *45 D6 *14 *56 *14 ,3 ^1 *41 ^x @@ -18806,8 +15718,6 @@ $. *14 *13 o14 { *13 o0j *13 o0E ^$ -*13 l k -*13 k l *13 ^j *13 i70 *13 i2v @@ -18816,37 +15726,27 @@ $. *14 *13 +7 .1 *32 -1 *31 -*13 *02 -.1 *30 ,1 -3 *12 Y1 k -*12 o5@ *12 o0v *12 k Y1 *12 K $1 *21 -[ $1 *20 $1 .2 .1 +2 ^1 +2 -$1$1O53 +$1 $1 O53 $1 +1 E -+1 *14 -$1 *12 C -[ *10 y2 -*10 ^K +[ k y2 *10 d 'B *10 D0 $* -*10 $* D0 *10 *25 [ +1 *02 .1 .0 +0 -*10 ^# ^$ *10 +1 $! $1 $$ $1 $_ -$1 [ $1 ^ $+ -1 $< ^1 @@ -18855,32 +15755,24 @@ $< ^1 ^1 ^@ $0 Z3 C $0 Z2 -$. .0 Z2 --0 y5 u +-0 u y5 -0 y4 c -0 y3 y3 +0 y2 ^0 $y $0 ^w --0 u y5 --0 u p1 +0 t p1 ^0 T9 -0 s*# +0 ^R +0 p5 $* -0 p2 -.0 p1 Y3 --0 p1 u -+0 p1 t +0 o7D -+0 o6G -0 o49 +0 o4# -0 o3x $0 o30 -0 o2V -$. -0 o15 +0 $o $0 ^M +0 ^L @@ -18888,7 +15780,6 @@ $0 ^M -0 k $0 iA1 -0 i7@ --0 i6h +0 i4a -0 i4- -0 i4 @@ -18896,16 +15787,13 @@ $0 iA1 $0 i3d +0 i37 $0 i33 -+0 i2a .0 i1w +0 i1e +0 i16 $0 i0m -^0 i0c $0 $G $0 D5 $3 -$0 C Z3 -+0 c $5 ++0 $5 c ^0 C ^3 $0 [ C +0 ^c @@ -18913,14 +15801,12 @@ $0 [ C $0 ^a ^S +0 ^A *07 o0x -*07 i7R *07 -3 .0 *70 +0 +7 -0 $7 *06 o0v *06 o0c -*06 i5G $0 *65 o67 +0 *61 *05 Y2 Y2 @@ -18928,40 +15814,32 @@ $0 *65 o67 *05 o5n *05 o5e *05 o4u -+0 $5 c *05 ^b y2 +0 *56 *05 -3 -*04O41 -*04O12 +*04 O41 +*04 O12 *04 i51 *04 D6 *42 *04 D5 D3 -*04 *42 D6 -0 *40 -0 $. -4 -0 -4 $. $/ *03 Z1 *03 y5 t -*03 t y5 *03 o40 -*03 o4- *03 o27 *03 i5w -*03 i3# $0 $3 D5 *03 D1 -^0 ^3 C -0 *34 *03 *32 *13 *03 *21 r +0 ^3 *03 $. -*03 ^0 ^3 *02 sAf *02 o65 -*02 o0v *02 o0M *02 i5b *02 i2n @@ -18970,17 +15848,14 @@ $0 $3 D5 *02 *61 *02 *53 *02 +5 -[ *02 +1 $0 -2 -*01O51] -*01]O51 -*01O31^w +*01 O51 ] +*01 ] O51 +*01 O31 ^w -0 +1 r -*01 i58 *01 ^d i3y .0 *13 -0 -0 sei -.0 *07 +0 $0 +0 ] $0 ^@ @@ -19010,13 +15885,12 @@ $= $- ^$ } } ^' ^. $ -^/ ^/ ^` ^z ^Z Y3 -$z Z4 t +$z t Z4 ^z z3 ^! $z z3 -$zZ2O41 +$z Z2 O41 $z Z2 o9x $z Z2 *41 ^Z z2 @@ -19025,15 +15899,14 @@ $Z z1 ^z Y3 ^Z ^z Y2 $z y1 -$zO93 -^zO63 -$zO41Z2 -^ZO32 -$zO03 +$z O93 +^z O63 +$z O41 Z2 +^Z O32 +$z O03 $Z ^X $Z ^w T8 ^z ^u -$z t Z4 $z $t $Z $S ^z ^r @@ -19043,7 +15916,6 @@ $Z o81 ] $z o4o ^z o40 $Z o2s -^Z o1T ^z ^O $z $l $z iBc @@ -19067,7 +15939,6 @@ $z i2d $z $i $z E Z1 ^z d 'A -^z D3 $Z D1 ^z ^C $Z $a @@ -19076,129 +15947,79 @@ $Z ^a ^z -8 K $z +7 $z $7 -Z5Z5O43 -Z5Z5O04 -Z5 Z5 *45 +Z5 Z5 O43 +Z5 Y5 O04 +Z5 Y5 *54 Z5 Z5 ,3 -Z5 Z5 $1 +Z5 Y5 $1 z5 z5 -Z5 Z4 [ Z5 [ Z4 ^+ z5 z4 ^ z5 z4 -$% Z5 Z2 -z5Z1O36 -Z5Z1O23 +z5 Z1 O36 z5 z1 $* -z5 $* z1 -Z5 Y5 Y2 -Z5Y5O13 -Z5Y5O04 z5 y5 u -Z5 Y5 *54 -Z5 Y5 *45 -Z5 Y5 $1 Z5 Y4 ,4 -Z5 Y3 ,2 -Z5 Y2 Y5 -z5Y2O46 -Z5 Y2 -Z5Y1O23 -Z5O64t -z5O57t -Z5O52t -Z5O51$9 -z5O49t -z5O46Y2 -Z5O43Z5 -z5O39t -z5O36Z1 -Z5O23Z1 -Z5O23Y1 -Z5O13Y5 -Z5O04Z5 -Z5O04Y5 -z5 u y5 +Z5 ,2 Y3 +z5 Y2 O46 +Z5 O64 t +z5 O57 t +Z5 O52 t +Z5 O51 $9 +z5 O49 t +z5 O46 Y2 +Z5 O43 Z5 +z5 O39 t +z5 O36 Z1 +Z5 O13 Y5 +Z5 O04 Y5 Z5 u ^D Z5 u *45 -Z5tO64 -z5tO57 -Z5tO52 -z5tO49 -z5tO39 Z5 t o1R z5 t K Z5 t *98 Z5 t -0 Z5 sJG -z5 sdf Z5 s6l -z5 o6F .7 -z5 K t +z5 .7 o6F Z5 $K Z5 i8. z5 i6a t -Z5 ^D u Z5 -A Z3 z5 *A4 Z3 -Z5$9O51 -Z5 *98 t +Z5 $9 O51 Z5 -9 -7 -z5*91O46 -z5 .7 o6F -Z5 -7 -9 +z5 *91 O46 z5 *61 *27 -Z5 *54 Y5 -Z5 ,4 Y4 -z5 *4A Z3 -Z5 *45 Z5 -Z5 *45 Y5 -Z5 *45 u $z *54 -Z5 ,3 Z5 ^z *53 -Z5 ,2 Y3 -z5 *27 *61 Z5 -0 t Z5 $+ $$ Z5 $- Z5 ] $? Z5 ^z -5 -z4z5OA3 -^+ z4 z5 -^ z4 z5 +z4 z5 OA3 Z4 z4 C -z4 z4 -Z4 Z3 Y5 -Z4 Z3 $. Z4 Z3 -$; Z4 Z3 +$; Z5 Y2 z4 { Z3 -Z4 Y5 Z3 z4 Y5 *85 z4 Y5 *27 -z4 y5 { -Z4 Y3 $_ Z4 Y3 ^/ z4 Y2 -z4Y1O35 -Z4O63C -z4O39t -z4O35Y1 -z4O34-1 -z4O27t -Z4O23p1 -Z4O21u -Z4O06i2= +z4 Y1 O35 +Z4 C O63 +z4 O39 t +z4 O35 Y1 +z4 -1 O34 +z4 O27 t +Z4 O21 u +Z4 O06 i2= z4 ^W z5 -Z4uO21 Z4 u -z4tO39 -z4tO27 $ Z4 t z4 $s t -Z4 sIY Z4 oAM Z4 o8A p3 Z4 o7k @@ -19207,19 +16028,14 @@ Z4 o7_ z4 o3. z4 ^L K $' Z4 l -z4 K ^L z4 i11 Z4 $g -Z4 f *10 $$ Z4 E $. Z4 E -Z4dOA2 +Z4 d OA2 Z4 C z4 -Z4CO63 $ Z4 +4 $z *41 Z2 -z4-1O34 -Z4 *16 Z4 $! $$ Z4 $- Z4 @@ -19227,31 +16043,20 @@ $= Z4 { z4 } ^@ z4 z4 -Z3 Z5 Z4 -Z3 Z4 Z5 -Z3 Z4 *34 -$. Z3 Z4 -$; Z3 Z4 -^! z3 $z -z3 Y5 r -Z3 Y4 Y5 Z3 y4 *56 -z3O45t -Z3[O41 -z3O3A -Z3O35 -Z3 ^V +z3 t O45 +Z3 [ O41 +z3 O3A +Z3 O35 Z3 u T8 -z3tO45 z3 T3 T2 -z3 T2 T3 Z3 $q Z3 p4 'A Z3 p1 Z3 oB. Z3 oA_ Z3 o9+ -Z3 o8, l +Z3 l o8, Z3 o6@ z3 o3@ z3 o2p @@ -19259,7 +16064,6 @@ z3 o1a Z3 o0y z3 o0h z3 o0b .6 -Z3 l o8, $` Z3 l Z3 iB_ Z3 i9. @@ -19269,25 +16073,20 @@ Z3 f i5a z3 E -1 Z3 ^e Z3 $d Z1 -Z3dO05 +Z3 d O05 Z3 d *20 z3 c r Z3 c +7 Z3 $A *37 -Z3 $A -2 +Z3 -2 $A Z3 +7 c Z3 *74 ^P z3 { *71 -z3 .6 o0b -z3 *51 +2 -Z3 *37 $A -Z3 *34 Z4 -Z3 -2 $A z3 +2 *51 +Z3 *37 $A Z3 $2 z3 -1 E Z3 $1 $A -z3 *18 z3 -1 z3 *07 i7- ^z *30 *26 @@ -19296,11 +16095,8 @@ $\ Z3 } Z3 ] $` Z3 } z3 { -Z2 Z5 -$% Z2 Z5 z2 Z3 Z2 $/ Z2 -} Z2 z2 } z2 Z2 Z2 Y5 Z2 y5 @@ -19312,59 +16108,51 @@ $ z2 Y2 $! Z2 y1 { Z2 y1 Z2 $x y4 -$ Z2O83 -z2O61*53 -$>Z2O52 -Z2O42c -z2O42] -z2]O42 -Z2O23[ -Z2O21O61 -z2O21E -Z2O13y3 -Z2[O13 -[Z2O13 -Z2 t p1 +$ Z2 O83 +z2 O61 *53 +$> Z2 O52 +Z2 O42 c +z2 O42 ] +z2 ] O42 +Z2 O23 [ +Z2 O21 O61 +z2 O21 E +Z2 O13 y3 +[ Z2 O13 Z2 t o49 Z2 T3 p2 $. Z2 T1 -z2 ^S Y2 Z2 saE E Z2 R5 { $. Z2 R4 z2 ^r Z2 $q z2 ^q -Z2p2O03 +Z2 p2 O03 Z2 p2 -Z2 p1 t Z2 p1 -7 Z2 oBi u Z2 oB_ -Z2 oA! E +Z2 E oA! Z2 oA9 Z2 oA7 -Z2 o9_ l +Z2 l o9_ Z2 o7. Z2 o6- z1 Z2 o6z } Z2 o6r Z2 o6? -Z2 o5 sSB +Z2 o5 sSB Z2 o5 -Z2 o49 t Z2 o2h z2 o2. z2 o1s +9 z2 o17 { z2 o0r z2 o0p y3 -z2 o0K Z2 } $O -Z2 l o9_ Z2 L7 Z2 l $_ -Z2 $_ l z2 K +0 ^` z2 K z2 ^j @@ -19379,11 +16167,8 @@ Z2 i3@ Z2 i2@ z2 i1p z2 i0q -1 -z2 ] ^g z2 ^g ] -z2fO3A -z2EO21 -Z2 E oA! +z2 f O3A ] z2 E $* Z2 D6 $? Z2 D4 @@ -19391,21 +16176,17 @@ Z2 $D Z2 $d } Z2 ^d Z2 C z2 -Z2cO42 z2 C o0B $= Z2 C ] z2 c z2 ^B Z2 ^a } z2 { ^A -z2 +9 o1s Z2 -7 i4_ Z2 *71 } Z2 ,7 -^z *26 *30 ] z2 *60 $. Z2 ,6 -z2*53O61 $$ Z2 -5 z2 '5 $- Z2 *43 @@ -19413,18 +16194,14 @@ Z2 *37 $. Z2 $. *37 Z2 $3 ^* z2 -3 -Z2*27O51 -Z2 [ *21 -[ Z2 *21 +Z2 *27 O51 z2 -1 Y2 Z2 *16 -Z2 [ *10 z2 +1 [ z2 +1 z2 -0 y1 z2 ^0 y1 z2 +0 s3. -z2 +0 K Z2 *07 Z2 $% Z2 $* ^# @@ -19434,7 +16211,6 @@ Z2 $- Z2 $_ $) Z2 $( Z2 -$. Z2 [ $. [ Z2 $, Z2 $< Z2 @@ -19444,56 +16220,44 @@ $< Z2 z2 $. ^z $2 ^! z2 -^ z2 ] ^ ] z2 z1 Z5 ^B -z1 z5 $* -z1 $* z5 z1 Z1 $D Z1 z1 *1A -z1y5O03 +z1 y5 O03 z1 Y5 ^q -Z1 Y4 ^R -Z1Y3O03 +Y1 Y4 i0R +Y1 Y3 O03 z1 Y2 $. -z1 Y1 ^m +z1 ^m Y1 $- z1 Y1 -^! z1 Y1 -^$z1O92 -Z1O72 -Z1O52$* -Z1$*O52 -Z1O43y5 -z1O42y4 -$@Z1O14 -{Z1O05 -Z1O03Y3 +^$ z1 O92 +Z1 O72 +Z1 O52 $* +Z1 $* O52 +z1 O42 y4 +$@ Z1 O14 +{ Y1 O05 +Y1 O03 Y3 z1 u $9 -Z1 u ,3 -Z1 t p4 Z1 t -6 z1 t +5 -Z1 t ,3 -Z1 t $2 +Y1 t ,3 +Z1 $2 t Z1 T1 ,B Z1 ssD -Z1 sO) -z1 sgl Z1 sa@ c Z1 s9 $& Z1 s03 Z1 ^S -Z1 ^R Y4 +Y1 i0R Y4 z1 R0 z2 z1 ^q Y5 -Z1 q -7 +Y1 q -7 Z1 $Q -Z1 p4 t -z1 p2 Z1 +y1 p2 Y1 Z1 p2 $a z1 p2 $9 -z1 p2 ] -Z1 p1 +A Z1 $P Z1 o6y Z1 o6R c @@ -19504,17 +16268,14 @@ Z1 o29 ,5 Z1 o1u z1 o0a } Z1 $o -z1 ^m Y1 Z1 ^m p3 z1 ^m z1 L1 ^f $! z1 L0 -z1 l Z1 ^K { z1 ^j Z1 i8y Z1 i8v -Z1 i8. Z1 i79 Z1 i76 Z1 i63 @@ -19525,85 +16286,63 @@ Z1 i3A Z1 i2o $0 z1 i2- E z1 i2c -z1 i2A +z2 o2A Z1 i27 Z1 i1t z1 i1o ^i z1 i1C z1 i11 C -z1 i0K z1 ^i z1 ^h u z1 $h ^2 Z1 ^g y1 Z1 $f -z1 E i2- -Z1 E *23 -Z1dO03 +E Y1 *23 +Z1 d O03 Z1 D6 $@ Z1 $@ D6 z1 D5 *13 z1 d ] Z1 c sa@ -z1 C i11 $. Z1 C -$* Z1 c -z1 ^B Z5 -Z1 ,B T1 z1 ^B } z1 $B Z1 ^a z1 z1 $A Z1 $9 Z1 -z1 $9 u -z1 *97 Z1 +*86 Y1 y1 } z1 .9 Z1 *86 Y2 z1 ^8 *01 Z1 ,8 Z1 *75 i7- -Z1 +7 .2 +.2 Y1 +7 $ Z1 ^7 [ Z1 -7 Z1 -6 t -Z1 *60 { +Y1 *60 { $* Z1 ,6 z1 +5 t -Z1 ,5 o29 z1 *54 -2 $* Z1 ,5 -{ z1 +5 -Z1 *46 *12 +Z1 *12 *46 Z1 .4 -Z1 ,3 u -Z1 ,3 t $z *13 i2z z1 +3 *12 z1 *31 z1 ] ^3 -z1 ^3 ] -Z1 $2 t -Z1 .2 +7 -z1 -2 *54 -Z1 *23 E z1 $1 s1@ z1 *16 ] z1 *16 z1 ] *16 -z1 *13 D5 -Z1 *12 *46 -z1 *12 +3 $z *10 ^q -Z1 $0 i2o -Z1 *06 { Z1 *03 $ Z1 -0 Z1 $% Z1 $/ Z1 } Z1 ^* -$$ Z1 -$, Z1 +$$ Y1 { $* Z1 ^@ Z1 ^! Z1 @@ -19615,7 +16354,6 @@ $$ ^Z $. ^Z $z $* $z $@ -$z } $z { $@ ^z $_ ^z @@ -19628,27 +16366,22 @@ $Y Z3 q ^Y y2 l $Y { Y1 ^Y ^y -$YOA4u -^y$ O98 -$yO52t -$yO14+4 -$YuOA4 -^Y { ^U -$ytO52 +$Y OA4 u +^y $ O98 +$y O52 t +$y O14 +4 ^y ^s y2 ^y s1- ^y ^Q ^y $p +0 -$y oB7 -7 +$y -7 oB7 ^y o8y $y $; o8t $y o5t ^Y o57 ^Y o1t -^Y o1h $y o0x $y $o -^Y l y2 ^y L0 z2 $Y ^L ^Y ^K @@ -19659,12 +16392,8 @@ $y i7o $y i52 ^y i3m ^y i2q -^y i1u -0 ^y i1A $y i0z -$y i0Y -^Y i0N -^Y i0M ^y i0c ^y i0b $y ^f @@ -19673,87 +16402,80 @@ $Y c $y ^c ^Y $A ^y $9 -$y -7 oB7 $y ,7 ^Y *64 $! ^Y $! *64 -y5 z1 u Y5 ^z y5 Y5 *0B -y5y4O63 -y5Y3O76 +y5 y4 O63 +y5 Y3 O76 [ y5 Y2 -y5OA5u -Y5OA4O52 -y5O94E -y5O94 -y5O92D7 -y5O92} -[y5O91 -Y5O84$0 -y5O83 -Y5O82E -y5O82 -y5O76 -$!y5O76 -y5O75O02 -y5O75+7 -y5O75.3 -Y5O74,8 -y5O74+6 -Y5O73D3 -y5O68$! -y5$!O68 -y5O67 -y5O64C -Y5O63l -Y5O63-5 -y5O63*30 -Y5O63 -Y5O62+4 -Y5O61 -Y5O58 -Y5O57i3i -y5O54i7 -Y5O53o5. -y5O53l -y5O53E -Y5O53D8 -Y5O53.4 -Y5O52i6e -y5O43u -y5O34$L -Y5[O34 -Y5O2B -y5O2B -Y5O28 -Y5O27 -Y5O24 -Y5O23i5k -y5O21o2a -Y5O18 -Y5O17 -Y5O13l -Y5O13 -Y5{O12 -Y5O06$f -Y5O06C -y5}O04 -Y5O03+0 -y5O02O71 -y5 u z1 -y5uOA5 -y5uO43 +y5 OA5 u +Y5 OA4 O52 +y5 O94 E +y5 O94 +y5 O92 D7 +y5 O92 } +[ y5 O91 +Y5 O84 $0 +y5 O83 +Y5 O82 E +y5 O82 +y5 O76 +$! y5 O76 +y5 O75 O02 +y5 O75 +7 +y5 O75 .3 +Y5 O74 ,8 +y5 O74 +6 +Y5 O73 D3 +y5 O68 $! +y5 $! O68 +y5 O67 +y5 O64 C +Y5 O63 l +Y5 O63 -5 +y5 O63 *30 +Y5 O63 +Y5 O62 +4 +Y5 O61 +Y5 O58 +Y5 O57 i3i +y5 O54 i7 +Y5 O53 o5. +y5 O53 l +y5 O53 E +Y5 O53 D8 +Y5 O53 .4 +Y5 O52 i6e +y5 u O43 +y5 O34 $L +Y5 [ O34 +Y5 O2B +y5 O2B +Y5 O28 +Y5 O27 +Y5 O24 +Y5 O23 i5k +y5 O21 o2a +Y5 O18 +Y5 O17 +Y5 O13 +Y5 { O12 +Y5 O06 $f +Y5 O06 C +y5 } O04 +Y5 O03 +0 +y5 O02 O71 Y5 u D4 Y5 u $0 [ Y5 u y5 t T0 y5 T1 -y5 T0 t -y5 T0 '9 +y5 '9 T0 y5 t $0 $* y5 t -Y5rO93 +Y5 r O93 y5 r DA Y5 r c Y5 oBd @@ -19782,140 +16504,104 @@ y5 o0d y5 o0B Y5 ^M y5 ^M -Y5lO63 -y5lO53 -y5$LO34 -Y5lO13 -Y5 k ] Y5 ] k y5 K y5 $j y5 iAt y5 iAD -y5i5yO74 +y5 i5y O74 y5 i5o y5 i5m y5 i51 Y5 i50 ] -Y5 ] i50 Y5 [ i4; -Y5$fO06 -y5EO94 -Y5EO82 -y5EO53 +Y5 $f O06 y5 E D6 -y5 E *13 +y5 *13 E y5 E ] -y5 ] E y5 ^E -Y5DAO34 -y5 DA o5s +Y5 DA O34 Y5 DA -y5 D6 E -Y5 D4 u -Y5 D3 +2 +Y5 +2 D3 Y5 D2 o9. -y5CO64 -Y5CO06 +Y5 C O06 Y5 C ] -y5 *BA K -y5 *AB K Y5 'A *52 Y5 $A -y5 '9 T0 -y5*8AO64 +y5 *8A O64 y5 ,8 *48 Y5 ] ,8 Y5 '8 -Y5 ,8 ] -Y5+7O25 -y5+6O74 -Y5*62O05 +Y5 +7 O25 +Y5 *62 O05 y5 *60 -Y5-5O63 -y5*5AO92 -Y5 *52 'A +y5 *5A O92 Y5 -5 -Y5+4O62 y5 [ ,4 -y5.3O75 -y5*30O63 y5 ,2 k -Y5 +2 D3 y5 *21 y5 ^1 C -Y5*19O04 -Y5*13O25 -y5 *13 E +Y5 *19 O04 +Y5 *13 O25 Y5 $1 y5 $1 -Y5$0O84 -Y5 $0 u -y5 $0 t +Y5 $0 O84 $* Y5 ] Y5 -y5 $! [ -y5 $! y5 [ $! -y4 Z3 *65 +y5 $! Y4 Z2 *67 y4 Z2 -Y4Y4O12 -Y4Y4O06 +Y4 Y4 O12 +Y4 Y4 O06 Y4 Y4 ^G Y4 Y4 $9 Y4 y4 ] Y4 ] y4 [ Y4 y4 [ y4 Y4 -Y4y3O59 +Y4 y3 O59 y4 y3 '8 y4 Y3 y4 Y2 ^A y4 Y1 o4t -y4O85-6 -y4O81D5 -y4O72-4 -y4O67E -Y4O64 -Y4O62u -Y4O62 -y4O62] -y4]O62 -y4O58$8 -^*y4O56 -Y4O53$2 -Y4O43t -Y4O38K -y4O37K -Y4O35T2 -y4O32] -y4]O32 -Y4O31K -y4O23*15 -Y4O12Y4 -y4O12 -Y4O0B -Y4O06Y4 -y4O02saN -Y4^wO52 -Y4uO62 +y4 O85 -6 +y4 O81 D5 +y4 O72 -4 +y4 O67 E +Y4 O64 +Y4 O62 u +Y4 O62 +y4 O62 ] +y4 ] O62 +y4 O58 $8 +^* y4 O56 +Y4 O53 $2 +Y4 t O43 +Y4 O38 K +y4 O37 K +Y4 O35 T2 +y4 O32 ] +y4 ] O32 +Y4 O31 K +y4 O23 *15 +Y4 O12 Y4 +y4 O12 +Y4 O0B +Y4 O06 Y4 +y4 O02 saN +Y4 ^w O52 Y4 u T1 Y4 u D6 Y4 u +4 Y4 u ,4 y4 u +4 -Y4tO43 -Y4 t T1 y4 t iAA Y4 t ^D Y4 t +4 Y4 t *36 -Y4T2O35 -Y4 T1 t Y4 t ^1 y4 } T1 -y4saNO02 y4 ^S Y4 $q ^! Y4 oB1 @@ -19967,9 +16653,8 @@ y4 o0A Y4 ^M Y4 $L y4 ^L -Y4KO38 -y4KO37 -Y4KO31 +Y4 K O38 +y4 K O37 y4 K E Y4 ] K y4 $j Y1 @@ -19987,64 +16672,49 @@ Y4 i2l Y4 i2d Y4 i2- *72 Y4 i1u -y4i0qO62 +y4 i0q O62 Y4 ^G Y4 -Y4fO28 +Y4 f O28 y4 f o8c y4 ^f -y4EO67 -y4 E K Y4 E i4s y4 E +6 -y4 E $. y4 $. E y4 $d Z3 y4 D7 DA Y4 D7 -Y4 D6 u -y4 D2 +0 +y4 +0 D2 y4 D1 Y4 $d y4 c T1 -y4 c o9i y4 c +B y4 c y4 +B y4 y4 +B c y4 +B $. y4 $. +B -y4 ^A Y2 -y4^AO12 -Y4 'A o9s +y4 ^A O12 y4 $A $b Y4 $A Y4 $a -y4*95O06 +y4 *95 O06 Y4 .9 -y4$8O58 +y4 $8 O58 y4 '7 K -Y4 *72 ] -Y4 ] *72 [ Y4 -7 y4 +7 -y4-6O85 y4 +6 E -y4 *65 Z3 y4 *65 Y4 ,6 -4 y4 +6 y4 *59 Y4 $5 y4 -5 -y4-4O72 Y4 +4 u -Y4 ,4 u y4 +4 u Y4 +4 t Y4 *4A 'A -Y4 -4 ,6 -Y4 *36 t -Y4$2O53 +Y4 $2 O53 y4 .2 p1 Y4 *29 y2 y4 *20 T0 @@ -20052,10 +16722,7 @@ Y4 +2 y4 +2 y4 $2 y4 ^2 -Y4 ^1 t -y4 *10 y4 ^1 -y4 +0 D2 Y4 $+ Y4 $* Y4 $ @@ -20064,29 +16731,26 @@ $. Y4 $ Y4 { Y4 } y4 $. [ -y4 [ $. ] y4 [ y4 $? [ $? y4 Y3 ^Z Z4 -Y3 Z4 ^Z y3 Z2 o1l y3 Z1 D5 Y3 $z Y3 ^y y1 -y3y5O5A -Y3Y5O27 +y3 y5 O5A +Y3 Y5 O27 Y3 y5 t Y3 ] Y5 y3 Y5 y3 y3 Y1 -y3y3O58 -Y3Y3O45 +y3 y3 O58 +Y3 Y3 O45 y3 Y3 u y3 y3 si1 Y3 Y3 D4 Y3 Y3 C -y3 y3 -9 y3 y3 [ y3 [ y3 y3 y2 T0 @@ -20094,38 +16758,31 @@ y3 y2 ^f y3 y2 C y3 Y1 y3 Y3 $+ Y1 -y3 y1 $. -y3 $. y1 -y3OA4c -y3O81] -y3]O81 -Y3O76 -y3O73c -y3O65 -}y3O63 -Y3O62[ -y3O54 -y3O53T1 -y3O53C -Y3O53 -Y3O45Y3 -Y3O41T1 -^.y3O41 -Y3O32 -Y3O31l -Y3O02t -y3 u Y3 +y3 $. z1 +y3 OA4 c +y3 O81 ] +y3 ] O81 +Y3 O76 +y3 O73 c +y3 O65 +} y3 O63 +Y3 O62 [ +y3 O54 +y3 O53 T1 +y3 O53 C +Y3 O53 +Y3 O45 Y3 +Y3 O41 T1 +^. y3 O41 +Y3 O32 +Y3 O31 l +Y3 O02 t Y3 $u -Y3 t y5 -Y3tO02 Y3 t o4Y y3 t $2 -y3T1O53 -Y3T1O41 Y3 T0 -5 y3 s*q y3 sk# +9 -y3 si1 y3 Y3 sCm y3 s4 Y3 s2* @@ -20137,10 +16794,9 @@ Y3 r -0 y3 p3 *47 Y3 oB. Y3 oA% -y3o9tO53 -Y3 o9 *86 +y3 o9t O53 +Y3 o9 *86 Y3 o94 ] -Y3 ] o94 Y3 o9/ Y3 o9! y3 o7. @@ -20172,7 +16828,6 @@ y3 o0m y3 o0L y3 o0A Y3 $+ $n -Y3lO31 y3 l $2 y3 ^L y3 K Y2 @@ -20192,24 +16847,18 @@ Y3 i43 y3 i2k Y3 i2g Y3 i0w -y3i0KO32 +y3 i0K O32 Y3 $i Y3 E -6 -y3dO63 +y3 d O63 Y3 D6 $A y3 D5 Z1 Y3 D4 y4 Y3 D4 Y3 Y3 $d -Y3 C Y3 -y3cOA4 -y3cO73 -y3CO53 -Y3 c o34 y3 c ,3 Y3 c ^1 Y3 c $! -Y3 $! c y3 c } y3 c ] y3 ^B @@ -20224,50 +16873,36 @@ Y3 *97 Y3 *96 ,7 Y3 $9 Y3 -9 -Y3 -8 +9 -Y3 *81 +3 +Y3 +3 *81 } Y3 +8 Y3 *78 ,3 -Y3*75O02 +Y3 *75 O02 y3 *73 Y3 *72 ] Y3 ] *72 Y3 .7 Y3 -7 -y3 +6 y3 Y3 -6 E -Y3 *68 ,3 +Y3 ,3 *68 y3 *64 -Y3 -5 T0 -Y3*58O12 +Y3 *58 O12 y3 .5 *04 Y3 *48 D6 -] Y3 *43 -Y3 -4 +0 -y3 ,3 c -Y3 +3 *81 -Y3 ,3 *78 -Y3 ,3 *68 +Y3 +0 -4 y3 *36 *20 y3 *35 f Y3 $3 y3 -3 -y3 $2 t Y3 -2 p4 -y3 $2 l -y3*27O76 +y3 *27 O76 Y3 *27 Y3 -2 *24 -y3 +2 ,1 -y3 *20 *36 +y3 ,1 +2 y3 *16 ] y3 ] *16 Y3 *13 Y3 *12 z5 -y3 ,1 +2 y3 -1 [ -y3 *04 .5 -Y3 +0 -4 y3 *02 Y3 $& Y3 $* @@ -20277,15 +16912,12 @@ Y3 } [ [ Y3 ] ^. Y3 $. y3 } -y3 [ $, y3 -y2 z5 $W +y2 $W z5 y2 z5 D9 Y2 z4 $n y2 z4 *17 -^/ Y2 z4 Y2 Z2 -$ Y2 z2 ] y2 z2 Y2 $Z Y2 y5 ^r @@ -20295,77 +16927,68 @@ Y2 Y4 k Y2 Y4 *76 y2 Y4 { y2 y3 -5 -y2Y2O63 -Y2y2O43 +y2 Y2 O63 +Y2 y2 O43 Y2 Y2 $x y2 y2 K Y2 Y2 ^E Y2 y2 c y2 y2 'B y2 Y2 $A -] Y2 y2 -y2 Y2 ] y2 Y2 -Y2O84$0 -y2O82 -Y2O75 -y2O71y2 -y2O71i1a -y2O71*04 -y2O63Y2 -y2O62*06 -y2O42T6 -Y2O42*87 -Y2O32-1 -y2O1AC -y2O1A -Y2O15t -y2O15$! -y2$!O15 -Y2O13y3 -y2O04^w -Y2O04 -y2O04 -Y2O02 +Y2 O84 $0 +y2 O82 +Y2 O75 +y2 O71 y2 +y2 O71 i1a +y2 O71 *04 +y2 O63 Y2 +y2 O62 *06 +y2 O42 T6 +Y2 O42 *87 +Y2 O32 -1 +y2 O1A C +y2 O1A +Y2 O15 t +y2 O15 $! +y2 $! O15 +Y2 O13 y3 +y2 O04 ^w +Y2 O04 +y2 O04 +Y2 O02 Y2 ^x y2 $X -y2 $W z5 y2 $v k Y2 $V Y2 ^v -Y2 u oBE -y2 u o2B +Y2 oBE u +y2 o2B u Y2 u D2 Y2 u *89 Y2 u *53 Y2 u $# -Y2 $# u -Y2tO15 y2 t $S Y2 T4 -8 y2 T4 y2 t ,4 -Y2 T1 *8B -Y2 t [ -Y2 swS +Y2 *8B T1 Y2 sLm Y2 ^s Y2 r o3y Y2 r +3 Y2 R0 ^& Y2 ^q Y5 -Y2qO12 -Y2p3O08 -Y2p2O84 -Y2p1O06 +Y2 q O12 +Y2 p3 O08 +Y2 p2 O84 y2 p1 y2 ^p -Y2 oBE u Y2 oA6 Y2 oA. Y2 o9. Y2 o8p Y1 -Y2o8eO61 +Y2 o8e O61 Y2 o8a y2 o7z c y2 o7q @@ -20389,7 +17012,7 @@ Y2 o5- Y2 o4x Y2 o4t y2 o4t -y2 o4 sx9 +y2 o4 sx9 Y2 o4l Y2 o4k *12 y2 o4k @@ -20406,11 +17029,8 @@ Y2 o36 y2 o3@ Y2 o2z y2 o2v o1p -y2 o2B u Y2 o1u y2 o1r $@ -y2 $@ o1r -y2 o1p o2v y2 o1p Y2 o1o y2 o1J @@ -20425,34 +17045,27 @@ y2 o0M y2 o0F *43 y2 o0B y2 ^o -Y2 $n z4 Y2 $m -y2 l ,4 Y2 $L Y2 $l Y2 K Y5 Y2 k Y4 -y2 K y2 y2 k ^w -y2 k $v -y2 k i7a +y2 i7a k y2 k $h Y2 K D5 y2 k D4 -y2 k *42 y2 ^K Y2 ^J Y2 ^j -y2 ] ^j y2 ^j ] y2 ^j Y2 i9. Y2 i7w *89 -y2 i7a k Y2 i7@ Y2 i7- Y2 i6v -Y2i5tO61 +Y2 i5t O61 y2 i5i y2 i5a Y2 i5 @@ -20474,24 +17087,15 @@ y2 i1C o1f Y2 i0E y2 i0! Y2 $h Y3 -y2 $h k y2 ^h Y2 ^G ^W Y2 $f -Y2 ^E Y2 y2 E T4 y2 E *15 -Y2 E $! Y2 $! E Y2 D5 K -y2 D4 k -Y2 D2 u -y2CO1A y2 c T1 -y2 c o7z -Y2 c o4i -Y2 c o4@ -Y2 c *AB +Y2 *AB c Y2 C +9 y2 c $9 Y2 c $5 @@ -20499,17 +17103,12 @@ $. Y2 C ] Y2 C y2 ^B z1 Y2 $b -Y2 *AB c Y2 +9 C -y2 $9 c Y2 *96 Y2 +9 *58 Y2 $9 y2 $9 -Y2 -8 T4 -Y2 *8B T1 -Y2 *89 u -Y2 *89 +6 +Y2 +6 *89 Y2 *80 y2 ,8 y2 ^8 @@ -20517,51 +17116,35 @@ y2 $7 Z1 Y2 *7A -3 Y2 *76 Y2 $7 [ -Y2 [ $7 { Y2 -7 y2 +7 $@ y2 $@ +7 -Y2 +6 *89 -y2*64O62 +y2 *64 O62 Y2 -6 -Y2 $5 c Y2 *5A ] Y2 ] *5A -Y2 *58 +9 -Y2 *53 u y2 *52 Y2 *51 y2 *50 $+ y2 $+ *50 Y2 $5 -y2 ,4 t -y2 ,4 l -Y2*49O24 -y2 *43 o0x -y2 *43 o0F -y2 *42 k +Y2 *49 O24 Y2 $4 -Y2 -3 *7A y2 *37 -Y2 *30 *21 +Y2 *21 *30 y2 .3 y2 { *28 -Y2*27O42 +Y2 *27 O42 y2 *24 ^s -Y2 *21 *30 Y2 +2 y2 ,2 y2 -2 y2 ^2 -Y2-1O32 Y2 $1 p3 -y2 *15 E -Y2 *12 o4k y2 +1 $y *21 -Y2$0O84 +Y2 $0 O84 y2 *06 -y2*04O71 Y2 } *01 Y2 $% Y2 $? @@ -20575,68 +17158,46 @@ $/ y2 } } y2 { y2 Y1 z5 t -Y1 Z5 -Y1 Z2 -$! y1 Z2 -{ y1 Z2 y1 z1 ^F y1 Z1 ^C -Y1 Z1 -$- Y1 z1 -^! Y1 z1 Y1 Y5 ^q y1 Y5 E -Y1 y4 u Y1 Y4 +4 Y1 y3 E Y1 ^y *30 y1 Y1 ,4 -$\ Y1 y1 +z1 $\ $\ y1 Y1 $* -$\ y1 Y1 y1 ^y -Y1O61 -$!Y1O53 -y1O52+3 -$&Y1O42 -{y1O37 -Y1O34r -Y1O31D6 -Y1O21 -$$Y1O21 -Y1O03^N +$! Y1 O53 +y1 O52 +3 +$& Y1 O42 +{ y1 O37 +Y1 O34 r +Y1 O31 D6 +Y1 O21 +$$ Y1 O21 +Y1 O03 ^N Y1 $w -Y1 u y4 -Y1 u p1 Y1 u $D y1 u ,7 y1 u $3 y1 ^u -Y1 t z5 Y1 t i2S y1 t i1M Y1 T9 $! -Y1 $! T9 Y1 t ^6 -Y1 t ,3 y1 t ^3 -Y1 T0 i5R +Y1 i5R T0 Y1 $t Y1 slz u Y1 sKT -Y1 sjN -y1 sF7 -Y1 s5v +sF7 z1 Y1 s1* Y1 s1- y1 r i5b Y1 ^q Y5 -Y1 p4 l Y1 p4 c -y1 p2 Z1 -y1 p2 Y1 -Y1 p1 u -Y1 p1 *9B y1 $p +0 y1 o83 y1 o8. @@ -20651,7 +17212,6 @@ Y1 o0a y1 ^O y1 $m L5 Y1 ^m $7 -Y1 l p4 y1 L5 $m y1 K Z1 $ Y1 k @@ -20660,7 +17220,6 @@ Y1 iA Y1 i8@ Y1 i6y Y1 i6n -Y1 i5R T0 Y1 i5* o51 Y1 i5n i80 y1 i44 @@ -20669,34 +17228,27 @@ Y1 i28 y1 i1i y1 i0* z2 y1 i0U $1 -y1 i0t y1 i0M -Y1 i0B y1 ^I Y1 $h $q -y1fO76 +y1 f O76 Y1 ^F y1 E Y5 Y1 E ^G y1 ^E -Y1 $D u Y1 d TB y1 d D0 -Y1 d -6 -$; Y1 d +$; Y1 p1 y1 $D Y1 C z1 -y1 ^C Z1 y1 c ^X Y1 $c $w Y1 c p4 -Y1 c iA4 y1 C i00 y1 C ^9 -Y1 c *67 -Y1 C .6 +Y1 *67 c +Y1 .6 C $^ Y1 C -Y1 $c $) Y1 c y1 ^C y1 ^a t @@ -20706,20 +17258,15 @@ Y1 $@ ^9 Y1 ^9 y1 ^9 Y1 *8A -y1 ,7 u Y1 *75 *03 Y1 -7 $3 y1 $. *73 y1 '7 ^1 Y1 $. .7 Y1 .7 $. -Y1 ^6 t y1 $6 d -Y1 .6 C -Y1 *67 c Y1 *65 $* Y1 $* *65 -Y1 ,6 [ Y1 *52 ^N y1 $5 *14 Y1 -5 @@ -20729,10 +17276,6 @@ y1 ,4 ^p y1 *45 ^J y1 +4 $. y1 $. +4 -y1+3O52 -y1 $3 u -Y1 ,3 t -y1 ^3 t Y1 $3 -7 y1 *35 *20 y1 *30 $2 @@ -20740,29 +17283,22 @@ Y1 $3 $ Y1 +3 Y1 ,2 y2 y1 $2 *30 -y1 *20 *35 Y1 ^2 } Y1 ,1 o01 -y1 $1 i0U y1 *14 $5 -Y1 *12 o0w -y1 ^1 -y1 +0 $p +z1 ^1 y1 *07 y1 *04 z1 -Y1 *03 *75 $- Y1 { [ Y1 $. $ y1 { y1 ^^ y1 -^y +0 $p -^y -0 i1u $y $. } ^y ^y $ $x Z5 -$XZ2O43 +$X Z2 O43 $x Z2 ^c ^X Z2 } $x Z2 @@ -20774,14 +17310,11 @@ $x Y2 $X Y1 t $x Y1 *03 ^x y1 { -^xO61 -$xO52 -$XO43Z2 -^xO25-3 -^XO24u -$xO02 -^XuO24 -$X t Y1 +$x O52 +$X O43 Z2 +^x O25 -3 +^X O24 u +$x O02 $x srm $x srb $x $s @@ -20803,7 +17336,6 @@ $x $J c ^x ^j $X i91 -9 $x i8z -^X i7P ^x i6r ^x i5w $X i5 @@ -20811,821 +17343,721 @@ $X i5 ^x i30 $x i2f ^x i1d -$x i08 $x $f ^x D6 i1_ ^x D1 $8 $x D1 $X $d $x $D -$x ^c Z2 $X c -OB5iBi -OB4oBt -OB3+B -OB3,B +OB5 iBi +OB4 oBt +OB3 +B +OB3 ,B OB3 -OB2K -OB2iA -OB2$9 -OB1*67O72 -OA9kD4 -OA9D4k -OA8c$1 -OA8$1c -OA3oA1 -]OA3] -]]OA3 -OA2Y2 -OA2O42 -OA2oBu -OA2o5w -OA2K-8 -OA2dO0A -OA2-8K -OA1u -OA1tD4 -OA1o9c -OA1i5l -OA1D4t +OB2 K +OB2 iA +OB2 $9 +OB1 *67 O72 +OA9 k D4 +OA8 $1 c +OA3 oA1 +] OA3 ] +] ] OA3 +OA2 Y2 +OA2 O42 +OA2 oBu +OA2 K -8 +OA2 d O0A +OA2 -8 K +OA1 u +OA1 t D4 +OA1 o9c O96 O94 -O93O19C -O93o05 -O93CO19 -O93c$9 -O93$9c -O93$! -$.O93 -O92Y2 -O92sey -O92-A -^@O92 -O91O41K -O91uDB -O91o99 -O91KO41 -O91i61 -O91i6. -O91DBu -$@O91 -]O91] -]]O91 -^x $8 D1 -O87o2 c +O93 C O19 +O93 o05 +O93 $9 c +O93 $! +$. O93 +O92 Y2 +O92 sey +O92 -A +^@ O92 +O91 O41 K +O91 DB u +O91 o99 +O91 K O41 +O91 i61 +O91 i6. +$@ O91 +] O91 ] +] ] O91 +O87 o2 c O85 -O84i88 -O83o05 -$!O83c -O83+5 -O82Y4 -O82$w -O82p4$a -O82o9u -O82o4y -O82'Bi8a -O81$r -O81o7i -O81o7b -O81o42 -O81E -O81^e -O81DB -O81*AB -O81*42 -O81$1 -$@O81 -O76+5 -O74^1 -O73i7c -O73i5D -O72Y3D3 -O72Y3 -O72o5@ -O72lL8 -O72$li7b -O72L8l -O72i7g -O72i7b$l -O72i6p -O72D4 -O72D3Y3 -O72cT4 -O72-A -O72*23*24 -O72$1 -O72] -$.O72 -[O71O31 -O71uD4 -O71u*78 -O71o7z -O71o66 -O71o62 -O71o3F -O71o1C -O71i5D -O71D4u -O71^d -O71d -{O71*80 -O71*78u -O71*73] -O71]*73 -$/O71 -$;O71 +O84 i88 +O83 o05 +$! O83 c +O83 +5 +O82 Y4 +O82 $w +O82 p4 $a +O82 o9u +O82 o4y +O82 'B i8a +O81 $r +O81 o7i +O81 o7b +O81 o42 +O81 E +O81 ^e +O81 DB +O81 *AB +O81 *42 +O81 $1 +$@ O81 +O76 +5 +O74 ^1 +O73 i7c +O73 i5D +O72 Y3 D3 +O72 Y3 +O72 o5@ +O72 l L8 +O72 $l i7b +O72 L8 l +O72 i7g +O72 i7b $l +O72 i6p +O72 D4 +O72 D3 Y3 +O72 c T4 +O72 -A +O72 *23 *24 +O72 $1 +O72 ] +$. O72 +[ O71 O31 +O71 u D4 +O71 u *78 +O71 o7z +O71 o66 +O71 o62 +O71 i5D +O71 ^d +O71 d +{ O71 *80 +O71 *73 ] +O71 ] *73 +$/ O71 ^x -7 O6B -O67Z1 -O65o52 -O65o3H -O65$b -O64Z1 -O64u -O63y5u -O63uy5 -O63i6i -O63i5k -O63$8 -O63*76p3 -O63*45+1 -O63+1*45 -O63$? -O63[ -O62Z1soe -O62Y3[ -O62[Y3 -O62$W -O62^w -O62^T^U -O62T0] -O62]T0 -O62soeZ1 -O62$s -O62o3c -O62o0T -O62o0R -O62$o -O62$K -O62+A -O62$A -O62,7 -O62*67-0 -O62-5 -O62$3 -O62*20 -O62-0*67 -O62$_ -$$O62 -O61^zo66 -O61Y3+6 -O61O92 -O61^x -O61$r -O61^Q -O61o9n -O61o81 -O61o4w -O61o3D -O61^l -O61K -O61i5e -O61i4h -O61i1m -O61Eo6W -O61^B -O61+6i2z -O61-6 -O61*34 -O61$/ -$-O61 +O67 Z1 +O65 o52 +O65 $b +O64 Z1 +O64 u +O63 y5 u +O63 i6i +O63 i5k +O63 $8 +O63 *76 p3 +O63 +1 *45 +O63 $? +O62 Z1 soe +O62 Y3 [ +O62 [ Y3 +O62 $W +O62 ^w +O62 ^T ^U +O62 ] T0 +O62 $s +O62 o3c +O62 o0R +O62 $o +O62 $K +O62 +A +O62 $A +O62 ,7 +O62 *67 -0 +O62 -5 +O62 $3 +O62 *20 +O62 $_ +$$ O62 +O61 ^z o66 +O61 Y3 +6 +O61 O92 +O61 ^x +O61 $r +O61 ^Q +O61 o9n +O61 o81 +O61 o4w +O61 o3D +O61 ^l +O61 K +O61 i5e +O61 i4h +O61 i1m +O61 E o6W +O61 ^B +O61 +6 i2z +O61 -6 +O61 *34 +O61 $/ +$- O61 O59 -O57o2v -O57$1 -O54O41 -O54sai -O54p1E -O54E -O54c -O54^5 -O54+3 -]O54 -O53$^Z1 -O53Y2$A -O53Y2 -$!O53Y1 -O53o0R -O53l -O53K -O53i7_ -$*O53i58 -O53i5@ -O53i1V -O53$h -O53*56 -O53*20 -$>O52Z2 -O52$z -O52y5$! -O52$!y5 -O52y4O01 -O52Y4] -O52Y4 -O52O62 -O52$st -O52seB -O52sbf -O52r^d -O52rd -O52o3l -O52i7. -O52i3x -O52i2v -O52i2k -O52i1oy2 -O52$e -O52dr -O52*75$. -O52$.*75 -$.O52*43 -O52*35] -O52]*35 -O52,3 -O52*24y5 -O52$. -O52$, -O52^! -O51Z3[ -O51[Z3 -O51Z1^6 -O51O13 -O51O03 -O51$w -O51^U -O51tR5 -{O51t -O51R5t -O51R5*47 -O51^PD3 -O51p4.2 -O51o5= -O51o4S -O51o4_ -O51o2q -O51o0r -O51o03 -O51K$y -O51k^r -O51k$f -O51i68 -O51i4o -O51i3, -O51i2y -O51i2/ -O51$fk -O51^6Z1 -O51$$-6 -O51$6 -O51-6$$ -O51$5 -O51^5 -O51*47R5 -O51*25 -}O51 -O48o5d -O46] -O45Z5Z4 -O45Z4Z5 -O45tp1 -O45T0$5 -O45p1t -O45o5d -O45$5T0 -O43O62 -O43o3@ -O43i3k -O43i2m -O43^f -O43D1 -O43$?$1 -O43$+ -O43$ -O42Z4u -O42Z2 -O42$Z -O42y5 -O42y3Y2 -O42Y3 -O42y2y5 -O42Y2y3 -O42Y2 -$&O42Y1 -O42uZ4 -$*O42u -O42td -O42stk -O42$rc -O42$Q -O42p2D6 -O42o6j -O42o4 -O42o0v -O42^j -O42i7 -O42i6. -O42i5e -O42i48 -O42i1h -O42dt -O42c$r -O42^bO41 -O42*21+0 -O42+0*21 -O42$+ -O42$@[ -O42] -O42[$@ -]O42$* -]$*O42 -O41Y5O34 -O41Y4] -O41y2 -O41O81 -O41O52 -O41T5 -O41soi -O41seJ -O41se3 -O41sBG -O41o5-*56 -O41o4y -O41o4b -O41o40 -O41o3t -O41o2q -O41o1lk -O41o0z -O41o0m -O41ky4 -O41i6u -O41i6m -O41i5c -O41i3S -O41i2r -O41i2h -O41dE -O41DB -O41^By1 -O41-6 -O41-3D1 -O41^! -O38o3vo2p -O38o2po3v -$*O37 -O35Z2y4 -O35y5T9 -O35y5c -O35y4Z2 -O35^uy5 -O35i2x -O35i1l -O35D4 -O35*43*07 -O35*12 -O35*07*43 -}O34y3 -O34[y2 -O34$wi2v -O34^w -O34u[ -O34tp1 -O34^s -}O34q -O34p1t -O34o1S -O34i2v$w -O34dc -O34^8{ -O34^2o23 -O32y5O91 -O32Y4c -O32Y4*12 -O32Y2$v -O32Y2l -O32$y -O32O81 -O32tK -O32]r -O32^P -O32o4s -O32o2ry4 -O32o24 -O32o0g -O32lY2 -O32Kt -O32^K -O32^k} -O32k -O32i3@ -O32i0g*41 -O32cY4 -O32c -O32$a -$ O32*84 -O32*75o5y -$+O32.6 -O32-4p4 -O32*20 -O32*12Y4 -O32$0Y1 -$.O32*01 -O32$, -O32$ -O31Z5u -O31}Y4 -O31y2^t -O31$wo3x -O31uZ5 -O31td -O31t -O31stJ -O31sa@ -O31^s -O31R5 -O31o52 -O31o5@ -O31o3x$w -O31o21-1 -O31o1b -O31o0j -O31lf -O31ld -O31K-9 -O31i9. -O31i86 -O31i52 -O31i4; -O31i2s -O31fl -O31E-7 -O31E$4 -O31dt -O31dl -O31$A-2 -O31^a -O31^9y1 -O31$8 -O31-7E -O31^6z2 -O31$5 -O31$4E -O31-2$A -O31^2 -O31-1o21 -O31$1 -O31+0 -O31$. -$*O31 -O28p3'A -O27y2u -O27y1 -O27uy2 -O27p3l -O27lp3 -O26y2u -O26uy2 -O26T0 -O26s*0 -O26cT2 -O26[ -O25z2 -O25uR5 -O25u -O25R5u -O25p4l -O25p4k -[O25p2 -O25lp4 -O25fk -O25fD6 -O24y3 -O24Y2f -O24y2 -O24qy1 -O24p2l -O24p2E -O24o1- -O24o0Fl -O24lp2 -O24K-3 -O24i2. -O24^g -O24Ep2 -O24d*54 -O24$d -{O24$7 -O24-3y4 -O24-3K -O24$1 -$@O24 -[O24 -O23z2Y2 -O23Y2z2 -O23y2[ -O23R2 -O23$Q -O23p2$2 -O23i4. -O23i2p -O23i1o -O23$A -O23*73 -O23$5 -O23-3Y4 -O23$! +O57 o2v +O57 $1 +O54 O41 +O54 sai +O54 p1 E +O54 E +O54 c +O54 ^5 +O54 +3 +] O54 +O53 $^ Z1 +O53 Y2 $A +O53 Y2 +$! O53 Y1 +O53 o0R +O53 l +O53 K +O53 i7_ +$* O53 i58 +O53 i5@ +O53 $h +O53 *56 +O53 *20 +$> O52 Z2 +O52 $z +O52 y5 $! +O52 $! y5 +O52 y4 O01 +O52 Y4 ] +O52 Y4 +O52 O62 +O52 $s t +O52 seB +O52 sbf +O52 r ^d +O52 r p1 +O52 o3l +O52 i7. +O52 i3x +O52 i2v +O52 i2k +O52 i1o y2 +O52 $e +O52 *75 $. +O52 $. *75 +$. O52 *43 +O52 *35 ] +O52 ] *35 +O52 ,3 +O52 *24 y5 +O52 $. +O52 $, +O52 ^! +O51 Z3 [ +O51 [ Z3 +O51 ^6 Z1 +O51 O13 +O51 $w +O51 ^U +O51 t R5 +{ O51 t +O51 R5 t +O51 *47 R5 +O51 ^P D3 +O51 p4 .2 +O51 o5= +O51 o4S +O51 o4_ +O51 o2q +O51 o0r +O51 o03 +O51 K $y +O51 k ^r +O51 k $f +O51 i68 +O51 i4o +O51 i3, +O51 i2y +O51 i2/ +O51 $f k +O51 $$ -6 +O51 $6 +O51 -6 $$ +O51 $5 +O51 ^5 +O51 *25 +} O51 +O48 o5d +O46 ] +O45 Z5 Z4 +O45 t p1 +O45 T0 $5 +O45 o5d +O43 O62 +O43 o3@ +O43 i3k +O43 i2m +O43 ^f +O43 D1 +O43 $? $1 +O43 $+ +O43 $ +O42 Z4 u +O42 Z2 +O42 $Z +O42 y5 +O42 y3 Y2 +O42 Y3 +O42 y2 y5 +O42 Y2 y3 +O42 Y2 +$& O42 Y1 +$* O42 u +O42 d t +O42 stk +O42 c $r +O42 $Q +O42 p2 D6 +O42 o6j +O42 o4 +O42 o0v +O42 ^j +O42 i7 +O42 i6. +O42 i5e +O42 i48 +O42 i1h +O42 ^b O41 +O42 +0 *21 +O42 $+ +O42 [ $@ +O42 ] +] O42 $* +] $* O42 +O41 Y5 O34 +O41 Y4 ] +O41 y2 +O41 O81 +O41 O52 +O41 T5 +O41 soi +O41 seJ +O41 se3 +O41 sBG +O41 o5- *56 +O41 o4y +O41 o4b +O41 o40 +O41 o3t +O41 o2q +O41 o1l k +O41 o0z +O41 o0m +O41 k y4 +O41 i6u +O41 i6m +O41 i5c +O41 i2r +O41 i2h +O41 d E +O41 DB +O41 ^B y1 +O41 -6 +O41 -3 D1 +O41 ^! +O38 o3v o2p +$* O37 +O35 Z2 y4 +O35 y5 T9 +O35 y5 c +O35 y4 Z2 +O35 ^u y5 +O35 i2x +O35 i1l +O35 D4 +O35 *07 *43 +O35 *12 +O34 [ y2 +O34 $w i2v +O34 ^w +O34 u [ +O34 t p1 +O34 ^s +} O34 q +O34 i2v $w +O34 d c +O34 ^8 { +O34 ^2 o23 +O32 y5 O91 +O32 Y4 c +O32 Y4 *12 +O32 Y2 $v +O32 $y +O32 O81 +O32 K t +O32 ] r +O32 ^P +O32 o4s +O32 o2r y4 +O32 o24 +O32 o0g +O32 ^K +O32 ^k } +O32 k +O32 i3@ +O32 i0g *41 +O32 c +O32 $a +$ O32 *84 +O32 *75 o5y +$+ O32 .6 +O32 -4 p4 +O32 *20 +O32 *12 Y4 +O32 $0 Y1 +$. O32 *01 +O32 $, +O32 $ +O31 Z5 u +O31 } Y4 +O31 y2 ^t +O31 $w o3x +O31 t d +O31 t +O31 stJ +O31 sa@ +O31 ^s +O31 R5 +O31 o52 +O31 o5@ +O31 o3x $w +O31 o21 -1 +O31 o1b +O31 o0j +O31 l f +O31 l p1 +O31 K -9 +O31 i9. +O31 i86 +O31 i52 +O31 i4; +O31 i2s +O31 E -7 +O31 $4 E +O31 $A -2 +O31 ^a +O31 ^9 y1 +O31 $8 +O31 -7 E +O31 ^6 z2 +O31 $5 +O31 -2 $A +O31 ^2 +O31 $1 +O31 +0 +O31 $. +$* O31 +O28 p3 'A +O27 y2 u +O27 y1 +O27 l p3 +O26 y2 u +O26 T0 +O26 s*0 +O26 c T2 +O26 [ +O25 z2 +O25 u R5 +O25 u +O25 R5 u +O25 l p4 +O25 p4 k +[ O25 p2 +O25 f k +O25 f D6 +O24 y3 +O24 Y2 f +O24 y2 +O24 l p2 +O24 p2 E +O24 o1- +O24 o0F l +O24 K -3 +O24 i2. +O24 ^g +O24 E p2 +O24 d *54 +O24 $d +{ O24 $7 +O24 -3 y4 +O24 -3 K +O24 $1 +$@ O24 +O23 z2 Y2 +O23 Y2 z2 +O23 y2 [ +O23 R2 +O23 $Q +O23 p2 $2 +O23 i4. +O23 i2p +O23 i1o +O23 $A +O23 *73 +O23 $5 +O23 -3 Y4 +O23 $! O23 -$$O21Y1 -O21^w -O21ud -O21$s -O21qE -O21p1l -O21oA1 -O21o0v -O21lp1 -O21ld -O21l*31 -O21i46 -O21i3% -O21i1d -O21i01 -O21^h -O21du -O21dl -O21D2$8 -O21d -O21C -O21^c -$!O21c -O21$8D2 -O21-7 -O21^6 -O21*31l -O21*04 -O21$% -^#O21$# -^#$#O21 +$$ O21 Y1 +O21 ^w +O21 u d +O21 $s +O21 q E +O21 p1 l +O21 oA1 +O21 o0v +O21 l *31 +O21 i46 +O21 i3% +O21 i1d +O21 i01 +O21 ^h +O21 D2 $8 +O21 d +O21 C +O21 ^c +$! O21 c +O21 $8 D2 +O21 -7 +O21 ^6 +O21 *04 +O21 $% +^# O21 $# +^# $# O21 $x *20 -O1Bz4 -O1Bz3 -O19Z5Z4 -O19Z4Z5 -O19y4,4 -O19p2'A -O18O13 -O18t -O17z2 -O17p3l -O17lp3 -O17i2h -O16z4t -O16z3Y5 -O16z3t -O16Y2 -O16tz4 -O16tz3 -O16R0 -O16p3l -O16lp3 -O16$* -O15z3t -O15z3 -O15^z -O15y1t -O15y1 -O15tz3 -O15ty1 -O15tR0 -O15p5 -O15i4q -O15i3w -O15Cz3 -O15Cy1 -O15{ -$*O15 -O14z3y3 -$@O14Z1 -O14y4E -O14Y4c -O14y4*48 -O14y4 -O14y3 -O14y2^- -[O14u -O14tq -O14to3* -O14qt -O14p4$h -O14p3l -O14o4@q -O14o3*t -O14o2v -O14lp3 -O14^k -O14i1i -O14i0\ -O14dC -O14cY4 -O14^c -O14*04d -[O13Z2 -O13Y5l -O13Y5$a -O13y4 -O13Y3k -O13Y2y5 -O13y2,6 -O13y2 -O13u -O13tp2 -O13t$* -O13$*t -O13p2t -O13lY5 -O13kY3 -O13i41 -O13i2. -O13f-3 -O13}^F -O13^f -O13^.^c -O13$8 -O13,4y2 -O12^@^Z -O12Y4o0F -O12Y4^b -O12y4 -O12Y2u -O12y2 -O12^#y1 -O12uY2 -O12p2 -O12o7q -O12o5W -O12o4c -O12o0FY4 -O12$K -O12i4y -O12i3 -O12i2h -O12i21 -O12Eo1B -O12^e -O12^c -O12^bY4 -O12^b -O12$9 -O12}$6 -O12-5 -O12-2 -O12*12 +O1B z4 +O1B z3 +O19 Z4 Y5 +O19 y4 ,4 +O19 p2 'A +O18 O13 +O18 t +O17 z2 +O17 l p3 +O17 i2h +O16 t z4 +O16 z3 Y5 +O16 t z3 +O16 Y2 +O16 R0 +O16 l p3 +O16 $* +O15 z3 +O15 ^z +O15 t y1 +O15 y1 +O15 t R0 +O15 p5 +O15 i4q +O15 i3w +O15 C z3 +O15 C z1 +O15 { +$* O15 +$@ O14 Z1 +O14 y4 E +O14 Y4 c +O14 y4 *48 +O14 y4 +O14 y3 +O14 y2 ^- +[ O14 u +O14 t q +O14 t o3* +O14 p4 $h +O14 p3 l +O14 o4@ q +O14 o2v +O14 ^k +O14 i1i +O14 d C +O14 c Y4 +O14 ^c +O14 *04 d +[ O13 Z2 +O13 Y5 $a +O13 y4 +O13 Y3 k +O13 Y2 y5 +O13 ,4 y2 +O13 y2 +O13 u +O13 t p2 +O13 t $* +O13 k Y3 +O13 i41 +O13 i2. +O13 f -3 +O13 } ^F +O13 ^f +O13 ^. ^c +O13 $8 +O12 ^@ ^Z +O12 Y4 o0F +O12 Y4 ^b +O12 y4 +O12 Y2 u +O12 y2 +O12 ^# y1 +O12 p2 +O12 o7q +O12 o0F Y4 +O12 $K +O12 i3 +O12 i2h +O12 i21 +O12 E o1B +O12 ^e +O12 ^c +O12 ^b Y4 +O12 ^b +O12 $9 +O12 } $6 +O12 -5 +O12 -2 +O12 *12 $x *12 ^x .1 -O0Bz3 -O0Az5 -O0Ay2 -O0AY1 -O09p2 -O09p1 -O09d -O09.1 -O09^0 -$ O09 -O08z3u -O08uz3 -O08p2*75 -O08$* -O07Y3y3 -O07y3Y3 -O07p2 -O07p1 -O07d -O07+1 -O06z5 -O06y3 -O06^9 -O06^4 -O06^3 -O06] -}O06 -]O06 -[O06 -{O05Z1 -O05R0 -O05^%q -O05k -O05D0 -O05$9 -O05+0 -{O05 -O04Z1y5 -O04y5Z1 -O04Y2f -O04O71 -O04o3v -O04o09z2 -O04i5% -O04d+7 -O04C -{O04$c -O04.2 -O04,2 -O04+1 -O04} -O04] -[O04$@ -[$@O04 -O03^zZ1 -O03Z1^z -O03Z1y5 -O03Z1Y3 -O03y5Z1 -O03Y2$5 +O0B z3 +O0A z5 +O0A y2 +O09 p2 +O09 p1 +O09 .1 +O09 ^0 +$ O09 +O08 u z3 +O08 p2 *75 +O08 $* +O07 Y3 y3 +O07 y3 Y3 +O07 p2 +O07 p1 +O07 +1 +O06 z5 +O06 y3 +O06 ^9 +O06 ^4 +O06 ^3 +O06 ] +} O06 +] O06 +[ O06 +{ O05 Y1 +O05 R0 +O05 ^% q +O05 k +O05 [ +O05 $9 +O05 +0 +{ O05 +O04 Z1 y5 +O04 y5 Z1 +O04 Y2 f +O04 O71 +O04 o3v +O04 o09 z2 +O04 d +7 +O04 C +{ O04 $c +O04 .2 +O04 ,2 +O04 +1 +O04 } +O04 ] +[ O04 $@ +[ $@ O04 +O03 ^z Z1 +O03 Y1 y5 +O03 Z1 Y3 +O03 y5 Y1 +O03 Y2 $5 $x *03 Y1 -O03$y -O03OA2 -O03$*^X -O03^T -O03smk -O03$Qp3 -O03p2 -O03p1c -O03o3l -O03^jy2 -O03i64 -O03i6* -O03i31 -O03i2T -O03i2e -O03i24 -O03i2?} -O03f -O03D4 -O03^D -O03C -O03{ -$ O03 -^?O03 -O02Z1y2 -O02Y3 -O02y2Z1 -O02$V -O02TA -O02^T -O02sar -O02^Qy1 -O02o5g -O02o2j -O02i6l -O02i59 -O02i3f -O02i34 -O02i2f -O02i24 -O02i1w -O02i1o -O02^H^A -O02dC -O02c$8 -O02C -O02$A -O02$8c -O02*87 -O02*71 -O02-5 -O02*21p2 -O02+0 -O02$* -O02{ -$!O02 -O01}^v -O01t] -O01$q -O01p1O36 -O01o5 -O01o4t -O01o2w -O01o2m -O01o1g -O01kD5 -O01i3M -O01i2t -O01D5k -O01$d*46 -O01cT1 -O01*46$d -O01[ -}O01 +O03 $y +O03 OA2 +O03 $* ^X +O03 ^T +O03 smk +O03 $Q p3 +O03 p2 +O03 p1 c +O03 o3l +O03 ^j y2 +O03 i64 +O03 i6* +O03 i31 +O03 i2T +O03 i2e +O03 i24 +O03 i2? } +O03 f +O03 D4 +O03 ^D +O03 C +O03 { +$ O03 +^? O03 +O02 Z1 y2 +O02 Y3 +O02 y2 Z1 +O02 $V +O02 TA +O02 ^T +O02 sar +O02 ^Q y1 +O02 o5g +O02 o2j +O02 i6l +O02 i59 +O02 i3f +O02 i34 +O02 i2f +O02 i24 +O02 i1w +O02 i1o +O02 ^H ^A +O02 d C +O02 c $8 +O02 C +O02 $A +O02 *87 +O02 *71 +O02 -5 +O02 *21 p2 +O02 +0 +O02 $* +O02 { +$! O02 +O01 } ^v +O01 $q +O01 p1 O36 +O01 o5 +O01 o4t +O01 o2m +O01 o1g +O01 D5 k +O01 i3M +O01 $d *46 +O01 c T1 +O01 *46 $d $X $! $x ^@ $* $x @@ -21640,8 +18072,8 @@ $w $y ^3 ^W y2 $w $y $w ^y -$WO31 -$WO12 +$W O31 +$W O12 ^w ^v -9 ^W ^V $w $v @@ -21650,7 +18082,6 @@ $w ^t t $w $t $w srY ^w ^P -$w } ^p $w ^p ^w o4i ^w o3w @@ -21673,21 +18104,17 @@ $w i5s $w i3t $W i39 ^w i26 -^W i1V ^w i1n ^w i1m -^w i0r -$w i0n -^w i0a $w ^f p4 ^W ^F -$wdO02 +$w d O02 ^w d ^w ^C ^w *87 ^W ,8 $w ^7 -^w*67O41 +^w *67 O41 ^w +6 ^w -6 $w .4 $j @@ -21695,7 +18122,6 @@ $w .4 $j ^W ,2 ^W -2 $W +1 -$W +0 Z2 $W *02 ^w *01 ^f $w { @@ -21707,11 +18133,8 @@ $V Z4 $v Z2 -6 $v ^z $v Y2 -^v y1 Z2 -^vO71 -$vO31 -$vO01 -^v $v k +$v O31 +^v k $v ^V $V ] $v ^v ^V s9v @@ -21728,12 +18151,9 @@ $v o3w ^v o2c ^v o1u $v o1i -^v o11 $v $m -^v k $v ^V ^k { $v $k -^V ^J Z3 ^v i5k $V i45 ^v i44 @@ -21747,7 +18167,7 @@ $v i2f $V $I ^v $b $V $a -^v*61O13 +^v *61 O13 $v ^5 ^v +5 ^v ,2 p3 @@ -21755,7 +18175,6 @@ $V { $v ] $v ^v $, -^v ] ^. ^v u [ z4 $u z3 Y4 @@ -21764,27 +18183,22 @@ u Z2 *06 u Z1 ^D u y5 $i u Y5 ,8 -[ u Y5 $u Y4 z3 -uy4O52 +u y4 O52 u y4 ] u ] y4 u y2 D4 u Y2 [ -u [ Y2 $u ^y -uOB1oAA -uO91+8 -uO53 -uO51$O -uO51'B -uO43z2 -$*uO42 -uO41$5 -}^uO41 -^uO31 -uO21i1N -[uO14 +u OB1 oAA +u O91 +8 +u O53 +u O51 $O +u O51 'B +u O43 z2 +u O41 $5 +} ^u O41 +u O21 i1N $U $V ^U $u $u u @@ -21798,20 +18212,13 @@ u sE3 u sDT u R5 t ^u ^r -up2O6A -up1OB5 -up1O62 -up1O43 -u p1 -8 u $o Z1 -u$OO51 -$u oB@ o92 +u $O O51 +$u o92 oB@ u oB3 ] u oAU -uoAAOB1 ^u o9y u o9N -$u o92 oB@ u o8S u o7J u o6G @@ -21827,16 +18234,12 @@ u o2B ^u o1_ u o0Z u o0p -$u o06 $u $n [ u $M -u L4 T3 u k +0 ^u ^K u $k [ -u [ $k $u ^k -u $J u $i y5 u iBZ u iBN @@ -21855,25 +18258,17 @@ u i3N ] u i3K ^u i21 u i1W -^u i1p u i1J u i1f -^U i1! ] $u i0w -^U i0R ^u i0H -u i0* ^U $I -ufO69 u f D7 u $F ^U ^E -u ^D Z1 -udOA1 -udO86 -udO03 +u d O86 u d $O -u d ^L +u p1 ^L u d *A5 u D4 +5 ^u D3 @@ -21883,18 +18278,16 @@ u $d u ^B y5 ^u ^B u '9 Y3 -u+8O91 u +8 d u '7 Z5 u *7A -u +7 *45 +u *45 +7 u ,6 Z5 u ^6 z1 u ^6 i57 -u*63O41 -u$5O41 -u *45 +7 -u +4 *02 +u *63 O41 +u $5 O41 +u *02 +4 u -4 u $3 Y4 u +3 *30 @@ -21904,40 +18297,30 @@ u ^2 z1 u ,2 Y5 u [ *20 $u $1 -u *02 +4 $U $* $! ^u } u } } } ^u -} } u { u { -{ { u ] u $* -] $* u [ u ] ^< u -tZ5O64 -$ t Z4 $t Z3 -$T Z2 z1 +$T z1 Z2 t z2 *15 $T Z2 t ] Z2 t z2 } t } z2 -$T z1 Z2 ^T Z1 z1 -^T z1 Z1 -tZ1O72 +t Z1 O72 t Z1 ^B ^T $z -t $Z [ t [ $Z t Y5 o67 t y5 o44 t y5 *09 -$* t y5 -ty4O82 +t y4 O82 t Y4 o8N t Y4 $1 t y3 $1 @@ -21954,23 +18337,20 @@ t y1 $2 $t Y1 t $x Z5 t ^X i5X -tO72Z1 -tO62Y3 -tO51d -{tO51 -^TO43 -$tO31 -tO25d -tO21o0T -tO15 -^tO13D3 -tO12^h +t O72 Z1 +t O62 Y3 +t O51 d +^T O43 +$t O31 +t O25 d +t O21 o0T +^t O13 D3 +t O12 ^h } ^T ^X $t ^x t $W ^t ^V $t $u -t T3 T1 t T1 T3 t sU1 t $S ^S @@ -21985,18 +18365,15 @@ t r $r [ t R5 [ t R4 t ] ^R -t ^R ] t $q Y1 ^t ^q -tp2O52 -tp2O4A -tp2O2A +t p2 O52 +t p2 O4A +t p2 O2A t oBZ t oBI t oAS t o9M ] -t ] o9M -^T o96 t o8Y D7 ^t o8t t o72 @@ -22009,9 +18386,8 @@ t o2R t o1r t o1J t o0X -to0TO21 t o0N -^t o05 i5s +^t i5s o05 $t $o t ^N -2 ^t $n @@ -22019,7 +18395,6 @@ t ^N -2 ^T $m *53 $T $M ^T $m -^t l ^m $t $l +9 ^T $l ^t ^l @@ -22040,7 +18415,6 @@ t i7- t i6Y $t i6y t i6P -^t i5s o05 t i5R ^T i5P t i5G @@ -22059,34 +18433,29 @@ t i1v t i1G ^t i1d t i0V d -t i0P z4 -^t i0b +t ^P z4 t i07 z2 ^t $g D7 $t $g ^t $e *52 ^T ^E t d Y3 -t d y3 -tdOA8 -tdO45 +t d OA8 +t d O45 $T ^D r t d o4U t d $O t DB K ^t D7 $g t d $6 -t D5 p1 t D5 K t D2 $5 -t D2 $t D2 $T D1 [ t D1 ^t $d ^T ^C t ^C -t ^B Z1 TB Y1 TA TB TA Y1 TB i61 @@ -22109,7 +18478,7 @@ t $9 -7 t *96 *78 T9 $6 T9 $@ -T8z4O07 +T8 z4 O07 T8 z1 t $8 y2 T8 TA @@ -22122,20 +18491,18 @@ T8 $1 Z1 t $7 Z4 T7 y3 T7 Y2 Y4 -T7 y1 y3 +T7 z1 y3 T7 o6& T7 i01 -t *79 *68 +t *68 *79 t -7 $9 -t *78 *96 $$ T7 ^. T7 { ^! T7 T6 Y1 -T6O71 -T6O01^W +T6 O71 +T6 O01 ^W T6 T5 $7 -T6 T4 ] T6 ] T4 T6 s17 T6 o7+ @@ -22144,9 +18511,6 @@ T6 o10 T6 o04 T6 i7@ T6 i66 -t +6 'B -t *68 *79 -T6 $7 T5 t .6 +5 T6 ^3 T6 $$ @@ -22155,10 +18519,10 @@ $@ T6 ^T -6 $t $6 T5 $@ Z1 -T5Y4O63 +T5 Y4 O63 T5 Y1 { -T5O63Y4 -T5O13} +T5 O63 Y4 +T5 O13 } T5 ss_ $$ T5 p5 T5 o0Z @@ -22166,13 +18530,11 @@ T5 o0T T5 i7% T5 i6! T5 i5$ D4 -T5 i4r T5 ^F T5 D9 t $5 D2 T5 'A T5 $9 -t +5 .6 T5 $4 t -5 .4 ^T *53 $m @@ -22180,17 +18542,13 @@ $t *53 ^t *52 $e ^# T5 T4 T1 $$ -T4 $$ T1 T4 t { -T4 { t T4 sNT T4 sBp T4 sa4 -T4 o93 T4 o7* T4 o5@ T4 o2y K -T4 o0p T4 o0# T4 o0$ T4 L6 K @@ -22208,8 +18566,7 @@ T4 ^! t ,4 t -4 T3 T4 s57 -T3 T4 *78 -T3 s57 T4 +T3 *78 T4 T3 o5M T3 o4F T3 o03 @@ -22219,7 +18576,6 @@ T3 $e T3 ^B T3 +9 T3 $9 -T3 *78 T4 ^t *34 .2 t *34 -0 t +3 ,2 @@ -22229,12 +18585,10 @@ $? T3 t ,3 $t ,3 T2 Y1 -t $2 y1 -T2 T5 -6 +T2 -6 T5 T2 smM T2 s1! p3 T2 s1N -T2 p3 s1! T2 ^P T2 o63 T2 o5A @@ -22247,20 +18601,16 @@ T2 } ^H T2 'A T2 ^A T2 $9 -T2 -6 T5 -t ,2 +3 t *20 y5 T2 $! T2 $- T2 $_ ] T2 t -2 -T1 $. Z2 -$. T1 Z2 T1 y4 t $1 y3 T1 $@ Y1 -t +1 y1 +t z1 +2 T1 sa4 T1 s38 T1 q Y1 @@ -22270,41 +18620,34 @@ T1 o5! T1 o3B T1 o3a k T1 o0) -T1 k o3a -T1 i7& T1 i60 -T1 i5+ T1 $9 ^T *16 T1 *43 T1 $3 T1 $1 T1 ^@ -T1 ^. { $T $1 $/ T1 $? T1 $t ^1 t ^0 z4 -T0Z2O24 -T0Y4O32 -T0O51$6 -T0O51^4 -T0O32Y4 -T0O24Z2 -T0 t d +T0 Z2 O24 +T0 Y4 O32 +T0 O51 $6 +T0 O51 ^4 +T0 O32 Y4 +T0 O24 Z2 +T0 t p1 T0 T1 K T0 s 6 $6 T0 r *82 -T0 } r +T0 r { T0 oB. T0 oAa -T0 oA5 T0 o9L T0 o6Q T0 o2y -T0 o11 -T0 $L T0 K T1 T0 ^J ^C T0 i82 @@ -22313,29 +18656,21 @@ T0 i4S T0 i42 T0 i3k T0 i2t -T0 d t T0 ^7 -T0$6O51 -T0 $6 s 6 +T0 $6 O51 T0 *58 *56 T0 *45 ^1 -t -0 *34 ^t *03 T0 ^1 -T0 $' $* ^T ^T $$ ^@ ^T ^T $t $* -$t [ $- t [ $- t $ t } $t -[ t $- -[ $- t -[ ^t ^t ] } ^* $t ^. ^t @@ -22346,7 +18681,6 @@ $s Z4 ^s Z2 ^a ^s z1 $s ^s ^Y u -syR u syr u sym C syd $* @@ -22356,18 +18690,17 @@ $s y2 $s Y1 +4 ^S ^Y sxz -$sO73 -^sO52 -$SO43 -^sO32 -^sO31 +$s O73 +^s O52 +$S O43 +^s O32 +^s O31 ^s $x swq swh $@ $/ s/w svb t svb -^s u ^Y suw r -5 sU- t suk +4 @@ -22377,11 +18710,9 @@ $S u $4 $s ^u *01 ^s $u stz $! -sty C -$s ^t Y2 sty stw u -sTsO31 +sTs O31 sTL ,5 stl +0 stg $$ @@ -22389,8 +18720,7 @@ std sta i8n ^S t .3 ssz $f -^s $s z1 -ss,y4O81 +ss, y4 O81 ssu +3 ssS T3 sSr -5 @@ -22403,18 +18733,16 @@ ssG y2 p4 sSf Y3 sSC T3 ssb *71 -ss8O92$9 -ss8$9O92 +ss8 O92 $9 +ss8 $9 O92 ss5 $n ss5 ^S $S sr, Y1 l -sR*O42t -sR*tO42 +sR* O42 t $s r ^q srm +3 $$ srM -sr, l Y1 srg i1r srg *12 sR* E @@ -22425,7 +18753,6 @@ srb sra ,8 sQD $s $P Z1 -[ spZ { [ { spZ spP ^1 $% sPL @@ -22439,7 +18766,6 @@ so. o5x soO $1 so@ o0W soj { -soe u $S soe $S u soe r soe E @@ -22460,30 +18786,26 @@ so0 o63 $s o00 ^S $o sny r p5 -sny p5 r snw -0 -snu Y3 sns $A snl $6 snk i6s -snI Z1 -snHO65 +snI Y1 +snH O65 snh -2 snf $1 sna -$S ^N } $* sn+ smz smx *73 -smW C $1 smW $1 C -smVO41 +smV O41 sMt -6 sMp $^ smL sMJ '6 smJ -s_m iA Y1 +s_m iA Y1 $! smg smF u smf @@ -22491,7 +18813,6 @@ smb z2 ] smb smb sma -sm1 z2 sm? .1 ^S ^M sM- @@ -22501,7 +18822,6 @@ sl| T5 sls K slr t slr -slq .A slp +7 slm o6t slL T0 @@ -22517,24 +18837,23 @@ skp +5 $! sko sk; $s $k -sJw i5 Y2 +sJw i5 Y2 sJW sjc sja *60 sJ1 ^v -sizO42 +siz O42 siy t siy o42 siy C siy $5 siy +2 sig -sie $ +B +sie $ +B sie $ sic -7 sia ^s i6g -^S i5O ^s i5n ^s i5h ^s i5g @@ -22551,22 +18870,16 @@ $S i3a ^s i2- ^S i1U si1 TB -^S i1o ^s i1o ^S i1i si1 c -^s i1c -^s i19 si1 +7 si1 $# $S i0W -^S i0W -^S i0T -$s i0S ^s ^i -sHTO61 +sHT O61 shp $k *73 -shMO42 +shM O42 shk u sHf .2 $S $H @@ -22582,16 +18895,15 @@ sgl sgj sgc u sg. -0 -sfHO13 +sfH O13 sfc sfa u -sF7 z1 sF* sf* sf@ s- f $s $f -sexO52 +sex O52 seu *02 sET p2 ses *20 @@ -22599,15 +18911,14 @@ seR T2 seq sep ,5 sel $1 -seiO82 +sei O82 s/e i6l se@ D0 -sec Z1 +Y1 sec se( c sec se4 +1 -se3O61c -se3cO61 +se3 O61 c se3 C $s E ,2 se1 *34 @@ -22618,13 +18929,11 @@ se sdz E $S $D Z2 sdz -sd_ Y3 sd- u $@ sdt sds +3 -s.d s0 *54 +s.d s0 *54 sdr ] -sdK y2 sdj -8 sdj sdh *20 @@ -22634,11 +18943,10 @@ $S $D sd* { scv y5 E scv -$S ^C u scN Y4 c scN c Y4 sck u -sCJO51 +sCJ O51 scC sc( s?! c @@ -22651,11 +18959,10 @@ sbh $S $B c sbB L4 sb2 *86 -^s ^a Z2 say } -sa^O31 +sa^ O31 sav *47 -sauO32 +sau O32 sau $3 saq *74 sap @@ -22665,7 +18972,6 @@ sAK sah D5 saf Y2 sab -sa4 p1 sa4 C sa4 ] sa2 @@ -22673,7 +18979,6 @@ sa^ -0 $S $A sa+ [ sa, ] -[ ] sa, s9- ^n s9b *45 s96 $L @@ -22682,7 +18987,7 @@ s90 $! s9* $! s9. $/ [ s9! -s8+O02p4 +s8+ O02 p4 s8h p1 T0 s7? Z4 s7r $@ @@ -22690,7 +18995,6 @@ s7P i3p s7j l s7f *52 s7! $9 -^s *76 s76 s75 u ^s *75 @@ -22700,7 +19004,7 @@ s7_ s6w i3s s6. o3, s6O -2 -s6HO73 +s6H O73 s6C $A ^s *6A *58 s6% +9 @@ -22709,15 +19013,12 @@ $. s63 s6. -2 s61 s6` -s5v Y1 s5f p1 c s5D D6 s5a '8 s59 -^s *58 *6A s/% *58 s57 $! -s56 Y1 ^a s56 ^a Y1 $- s53 s53 @@ -22729,7 +19030,6 @@ $s +5 [ s5! $s +4 Y1 s4. ^w -$S $4 u s4f s4A y2 s4@ +6 @@ -22739,8 +19039,7 @@ s42 *32 s4. ^, s3z s3. ^v -^S .3 t -s3H Z1 +Y1 s3H s3. d s38 { ^s *37 @@ -22753,11 +19052,8 @@ $- s-3 ^% s3% s2@ Y3 s2. Y2 p3 -s2* t { s2* { t -s2s z1 s2f } -$s ,2 E s2! C s2A ] $! s29 @@ -22771,12 +19067,10 @@ s23 p3 'A s2$ $3 ^S -2 s2% $% -s2! } s.2 $$ s2) s1 z1 s1- y4 -s1? Y2 s1/ } y1 s1W T3 s1% T1 @@ -22791,7 +19085,6 @@ s1A *54 s18 *40 s1) -8 s1; $8 -s17 Z4 s15 s14 -7 s14 $4 @@ -22807,16 +19100,13 @@ s0q ,1 s0l o5K s0l K s0h $b -s0g Z2 s0f *31 s0- D8 Y2 s0c r Y1 s0a p4 s0% *68 s05 -$& s03 Z1 s03 T3 -s03 E s03 s0 s0= @@ -22842,19 +19132,17 @@ s=- $+ ^s $@ s . $> ^s -] ^s ^s $? ^$ ^s ^@ ^s ^_ $s r $Z p3 $r Z3 -rz2O51 +r z2 O51 ^r z1 l $r Z1 -r$yO74 +r $y O74 r y5 iAB -r Y5 E r y5 E r Y5 c $r y5 @@ -22866,30 +19154,25 @@ $r Y3 p3 r Y3 ^c r y3 r y2 ,9 -r y2 ,4 $r Y2 -^R y1 l r Y1 ^G r Y1 *91 -^RO82 -r$!O82 -^rO72 -[rO51 -$rO41 -rO32$j -rO31p2 -rO28t -rO27u -rO12d -^rO12 +^R O82 +r $! O82 +^r O72 +[ r O51 +$r O41 +r O32 $j +r O31 p2 +r t O28 +r u O27 +r O12 p1 +^r O12 r ^x ] r ^w -ruO27 ^R ^U $R u r u ] -r t y3 -rtO28 r { T8 ^r s1. r R5 *34 @@ -22899,13 +19182,11 @@ r $q -3 $? r q $ r q ^r ^q -rp2O09 +r p2 O09 $r p2 $t r p2 $q -r p1 c r p1 ,9 -r ] ^p -r ^p ] +$p r ] r o9i ^r o8y $r o8b @@ -22927,21 +19208,13 @@ r o0K r ^n Y4 ^r ^n L2 ^r $m -^r l z1 -^R l y1 -r } L0 -^R l } -^R } l -r l ^! -r ^! l r $k y4 -r ^k y1 +r ^k z1 $r k i43 r K *14 r ] ^k -r ^k ] ^r $k -r$jO32 +r $j O32 r $_ $j r ^j $r ^j @@ -22953,20 +19226,16 @@ $r i5m $r i5h $r i5G } ^r i4q -$r i43 k r i3n r i3g ^R i3B r i2i r ^r i2i r i2f -^R i1U r i1r $r i1f -^R i0T $r i0S -ri0rO12 -^R i0I +r i0r O12 ^R i0B $r i06 $- $r i04 @@ -22974,11 +19243,10 @@ $r i0@ $r $i ^r ^H $r ^h -r ^G Y1 ^r ^g -rfO36 +r f O36 ^R $f -rdO05 +r d O05 r d T2 r D7 r ^c Y3 @@ -22989,49 +19257,36 @@ RA .9 R9 'A R9 $3 R8 R8 ] -R8 ] R8 $[ R8 $q r '8 f R8 $! ^r +8 R7 Z3 R7 Y1 C -R7O43t -R7tO43 -R7 T0 R7 -R7 se3 +R7 O43 t R7 R7 T0 +R7 se3 R7 o6@ R7 E $2 -R7 C Y1 -r -7 +6 -R7 $2 E -R6O23t -R6tO23 +r +6 -7 +R6 t O23 R6 sa1 -R6 R6 ] -R6 ] R6 R6 K Y2 R6 ,7 -r +6 -7 R6 $5 r *64 R6 +3 [ R6 r $6 -R5 y3 t -r ,5 y1 R5 t y3 +r ,5 y1 R5 t D6 -R5 t ] [ R5 t R5 R5 D4 R5 i60 R5 D7 .4 -R5 D6 t r *57 i4b r *57 -R5 .4 D7 R5 .4 r *53 *42 r *53 @@ -23041,28 +19296,22 @@ r $5 ^r ^5 $. R4 Z2 R4 Y2 E -r.4O52 +r .4 O52 R4 u R4 t { R4 t [ R4 t -R4 R4 ] -R4 ] R4 -R4 R3 *20 +R4 *20 R3 R4 $n R4 i6i -R4 i5x .3 +R4 .3 i5x R4 i45 R4 E Y2 r *47 R4 $5 -R4 '5 R4 *42 -R4 .3 i5x R4 +3 [ r *43 -r *42 *53 -R4 *20 R3 r *40 R4 $. R4 $! @@ -23076,17 +19325,15 @@ r -3 $q R3 i42 R3 i32 R3 i3@ -R3dO62 +R3 d O62 r *37 ^r *35 -r *34 R5 r *34 [ R3 .2 R3 -1 t R3 +0 *05 R2 y2 t R2 $x *35 -R2 t y2 r *26 ,7 R2 *35 $x $R *23 @@ -23094,85 +19341,65 @@ r *21 *05 ^r *20 R1 z3 t R1 u -R1 t z3 -R1 o35 E -R1 i2f R1 E o35 r *14 K R1 *41 $R $1 r $1 R0 Y2 { -R0 y1 C -R0O32*15 -R0O1B +R0 O32 *15 +R0 O1B R0 o45 R0 { ^k -R0 i03 R0 ^i -R0 C y1 -r *05 *21 R0 ^0 i2m } r +0 $@ $R r ] { -r ] ^\ -r ] ^$ -r ^\ ] -r ^$ ] +$\ [ r +$$ [ r $r $* $r $. $@ ^r } r { ^r $+ $Q Z5 y1 -^qz5O18 +^q z5 O18 $q Z5 $q Z4 t ^q z1 Y1 $q Z1 i04 $Q Z1 *34 -qY4O12 -qy3O67 -qy3O57 -$Q y1 Z5 -^q Y1 z1 +q y3 O67 +q y3 O57 q Y1 y1 -q y1 Y1 $Q Y1 [ -$Q [ Y1 -qO87c -qO87$1 -qO83o8. -qO72 -qO6A*40 -qO52 -qO38$v -qO35y3 -^qO34 -qO26z5 -qO26C -qO23-1 -qO21l -qO1Ad -qO16+3 -qO15 -]qO15 -qO12Y4 -qO12 -$qO12 -qO01k +q c O87 +q O87 $1 +q O83 o8. +q O72 +q *40 O6A +q O52 +q O38 $v +q O35 y3 +^q O34 +q O26 z5 +q C O26 +q -1 O23 +q l D3 +q O16 +3 +q O15 +] q O15 +q O12 Y4 +q O12 +$q O12 +q O01 k ^q ^x ^q $W -q$vO38 q u -$q t Z4 -^q t i1Q q TB $[ $q R8 -$? q r -$ q r -$qqO14 +$q q O14 ^Q ^q i68 ^Q q ] { q $Q @@ -23186,7 +19413,6 @@ $q o0d i0q $q $m ^q $m ^q ^m -qlO21 ^q L0 $q $j $q i5b @@ -23196,20 +19422,13 @@ $q i3r ^Q i1S ^q i13 ^Q i0Z -$Q i0Q -^Q i0K -^Q i0E ^q i0A -$q i04 Z1 $q ^f ^q D5 r $q D4 -5 ^Q D4 ^q D3 $q D1 -$q D0 -qcO87 -qCO26 $Q c ^A q C } q *B0 @@ -23219,7 +19438,6 @@ q '8 z5 ^q +7 $q +6 $q *47 -q*40O6A $Q *34 Z1 ^q *34 y3 $q *34 *32 @@ -23228,9 +19446,6 @@ q ] $3 $q ^3 q *24 *13 q *20 -q$1O87 -q-1O23 -q *13 *24 $@ $q *06 ^q $0 $@ $Q @@ -23250,15 +19465,14 @@ $p Y3 $p Y1 D1 ^p Y1 $p ^y -$PO23 -^pO14 -^PO13 +$P O23 +^p O14 +^P O13 $P u ^p ^U ^P T4 $P ^S ^p R1 ] -^p ] R1 ^p R1 $p $r ^P $P @@ -23266,22 +19480,17 @@ $p $r $p o2x ^P o1w ^p o1w -^p o1j -^P o1i ^P o1- ^P ^N ^P L1 ^p ^K $p ^j ^p i6t -^P i4q ^p i3l $p i3g $p i38 ^P i2o -^p i1w ^p i1P -^p i0R $P ^G $p $g $p $f @@ -23296,267 +19505,173 @@ $P c $p ^a ^p *71 $P +6 c -p5 Z1 o7/ -p5 Y4 o0H +p5 o7/ Z1 +p5 o0H Y4 p5 y2 o2r -p5OB9] -p5]OB9 -p5O85*12 -p5O5A,B +p5 OB9 ] +p5 O85 *12 +p5 O5A ,B p5 $S p5 ^Q z3 -p5 o7/ Z1 p5 o6b -7 p5 o29 *05 -p5 o0H Y4 -p5 i6f $@ p5 $@ i6f p5 i44 ] -p5 ] i44 p5 'B Y3 p5 'B y3 p5 'B p5 *96 ,8 -p5 ,8 *96 -p5 -7 o6b p5 *78 -8 -p5 *68 $0 -p5 *14 r -p5*12O85 p5 $0 *68 -p5 *05 o29 +p5 *14 r p5 +0 p4 z5 } p4 } z5 p4 z1 +A p4 y4 $m -{ p4 y1 -p4 T2 $7 -p4 o83 o1@ -p4 o5x *12 +p4 { z1 +p4 $7 T2 +p4 o1@ o83 +p4 *12 o5x [ p4 o3x p4 o36 -6 -p4 o2n o1a -p4 o2c i32 -p4 o1@ o83 p4 o1a o2n +p4 o2c i32 p4 o1- p4 o0@ D5 p4 $n -p4 $m y4 p4 $L ^l p4 $j $m p4 i5x *43 p4 i52 [ p4 i4m $. -p4 $. i4m -p4 i32 o2c -p4 D5 o0@ p4 ^c -2 p4 'B y3 p4 ^A o1T ^p +4 $A [ p4 ^a p4 ,8 ,7 -p4 $7 T2 -p4 -6 o36 p4 ^4 T4 p4 $4 $B -p4 *43 i5x p4 *20 ^T -p4 *12 o5x ^? $! p4 p3 $z [ -p3 [ $z p3 Y3 -p3Y2O9A -[p3OA7 -p3O9Bu -p3O9Bt -p3O9AY2 -p3O6Bu -p3O69O04 -p3O61-0 -p3O49u -p3O2A -p3}O08 -p3O01$a -p3 ] ^x +p3 O9A Y2 +[ p3 OA7 +p3 u O9B +p3 O9B t +p3 O6B u +p3 O69 O04 +p3 O61 -0 +p3 O49 u +p3 O2A +p3 } O08 p3 ^x ] -p3 $v [ p3 [ $v -p3uO9B -p3uO6B -p3uO49 -p3tO9B -p3 $q [ p3 [ $q -p3 o5e k -p3 o54 *17 -p3 o0M '9 -} p3 l p3 k o5e +p3 *17 o54 +p3 '9 o0M p3 K ^6 p3 ^j $0 p3 i6t $1 p3 i43 r p3 i0h $/ -p3 $/ i0h p3 $D $l p3 D3 i7t p3 'B Y3 p3 ^b ^R -p3$aO01 -p3 '9 o0M -p3 ^6 K p3 *53 *14 p3 ,1 r -p3 $1 i6t -p3 *17 o54 -p3 *14 *53 -p3-0O61 p3 *02 R0 p3 *02 r p3 { ^p $3 -p2Z3O06 -p2Y2OA4 -p2Y2O84 -p2Y1O05 -p2OB5u -p2OA8] -p2]OA8 -p2OA4Y2 -p2O9BC -p2O94t -p2O86u -p2O84Y2 -p2O7BC -p2O75] -p2]O75 -p2O65u -p2O5At -p2O59u -p2O4At -p2O46u -p2O3Bp2 -p2[O1B -p2O17o0d -p2O0Bt -p2O0Bd -p2O0B+4 -p2O06Z3 -p2O06u -p2O05Y1 -p2uOB5 -p2uO86 -p2uO65 -p2uO59 -p2uO46 -p2uO06 +p2 Z3 O06 +p2 Y2 OA4 +p2 Y2 O84 +p2 Y1 O05 +p2 OB5 u +p2 OA8 ] +p2 OA4 Y2 +p2 O9B C +p2 O94 t +p2 O84 Y2 +p2 O7B C +p2 O75 ] +p2 u O65 +p2 t O5A +p2 u O59 +p2 u O46 +p2 O3B p2 +p2 [ O1B +p2 O17 o0d +p2 O0B t +p2 O0B d +p2 O0B +4 +p2 O06 Z3 +p2 u O06 p2 u i6K -p2tO94 -p2tO5A -p2tO4A -p2tO0B -p2 t 'B -p2 T8 '9 +p2 'B t +p2 '9 T8 p2 t -p2 sET -p2 s-. ] p2 ] s-. -p2 $r Z1 -p2 ^q { -p2o0dO17 p2 $l Z2 } p2 $k p2 $j -p2i9gO53 -p2 i6K u +p2 i9g O53 p2 ^E o2o p2 $d -p2CO9B -p2CO7B -p2 'B t p2 'B p2 -B { p2 'B p2 'A *74 -p2 '9 T8 p2 *9A i8- p2 *89 $@ p2 $@ *89 -p2 *74 'A ] p2 $2 ^P *21 p2 $ $0 -$+ p2 { $+ { p2 $/ p2 ] $! p1 Z4 p1 Z2 $0 $) p1 Z1 p1 $y Z1 -p1y4O74 -p1y3O63 -p1 y2 u +p1 y4 O74 +p1 y3 O63 p1 Y2 p1 $X L8 -p1OB2o6a -p1OA4u -p1O93 -p1O79t -p1O69 -p1O68] -p1]O68 -p1O65] -p1]O65 -p1O65 -p1O62u -p1O56s29 -p1O51] -p1]O51 -p1O47 -p1O35t -p1O14 -p1O12t -p1O08*58 -p1O04p1 -p1O04d -p1O03O53 +p1 OB2 o6a +p1 O93 +p1 O79 t +p1 O69 +p1 O68 ] +p1 O65 ] +p1 ] O65 +p1 O65 +p1 O56 s29 +p1 ] O51 +p1 O47 +p1 t O35 +p1 O08 *58 +p1 O04 p1 +p1 O03 O53 p1 ] $X -p1 u y2 -p1uOA4 -p1uO62 -p1 u o72 p1 u i6F -p1 u +9 -p1 u *67 -p1 u -5 p1 u -4 -p1 u $2 p1 u *07 p1 u -0 -p1 u [ -p1tO79 -p1tO35 -p1tO12 -p1 t ^R p1 t i70 p1 t i58 p1 t i31 -p1 $T i0t -p1 t D4 +p1 i0t $T p1 t 'B -p1 t *76 [ p1 T6 -p1 t *40 -p1 t $2 -p1 t ^$ p1 ^$ t p1 $s u p1 se8 c -p1s29O56 p1 s1z p1 $S p1 oBs @@ -23564,20 +19679,16 @@ p1 oA9 p1 oA5 p1 o8a E p1 o8, -p1 o72 u p1 o7_ p1 o6n -p1 o6 c -p1o6aOB2 +p1 o6 c p1 o6@ [ -p1o5RO05 +p1 o5R O05 p1 o5= p1 o06 p1 $M p1 l *63 p1 l -p1 K +7 -p1 K .7 p1 K +6 p1 ^i ^M p1 iBK @@ -23585,67 +19696,34 @@ p1 iA, p1 i8p t p1 i7f p1 i7C -p1 i70 t -p1 i6F u p1 i6E l -p1 i58 t -p1 i31 t p1 i1j '9 -p1 i0t $T p1 i0b p1 E o8a -p1dO82 -p1 DA ] -p1 ] DA +p1 d O82 p1 D7 [ -p1 D4 t -p1CO0A +p1 C O0A p1 c se8 -p1 c 'B -p1 C $8 -p1 C -0 -p1 'B y3 -p1 'B t p1 'B c +p1 $8 C p1 *B8 *96 p1 *B4 p1 'A *75 p1 'A *72 -p1 { +A -p1 +9 u -p1 *96 *B8 p1 *94 p1 -9 -p1,8O62 -p1 $8 C -p1-7O03 -p1 +7 K -p1 .7 K -p1 *76 t -p1 *75 'A -p1*74O57 -p1 *72 'A +p1 ,8 O62 +p1 -7 O03 +p1 *74 O57 p1 +6 K -p1 *67 u -p1 .6 -5 -p1 *63 l -p1 -5 u p1 -5 .6 p1 -4 u -p1 *40 t -p1 $2 u -p1 $2 t ^p *12 ^e p1 *23 -p1 +1 [ p1 -0 u -p1 -0 C -p1 *07 u p1 -0 -$p *10 p1 $+ ^p $1 -$p *01 $p +0 $# ^P $$ ^P @@ -23658,18 +19736,16 @@ $? ^p ^_ ^p $o Z3 ^o Z1 ,3 -$o $y y2 -^O y3 $o y2 $y +^O y3 $o Y1 -^oO32 -^o ^x +^o O32 ^o T1 ^g $o t $0 ] $o t ^O ^s ssP $o s1h -^oqO3A +^o q O3A $o o4< ^O o3j ^o o1b @@ -23677,7 +19753,7 @@ $o o4< $O ^o $o k { ^o ^k -$oi8)O45 +$o i8) O45 $O i5x $o i3r ^o i3_ @@ -23687,7 +19763,6 @@ $o i3r $o $i ^o ^F ^O d E -^o D2 ^o ^d $O C ^O ^C @@ -23697,8 +19772,7 @@ oBu t oBi -A oB* E oBe -oB8O83 -oB8O81 +oB8 O83 $@ oB8 ^O ^B *67 oB5 E @@ -23709,26 +19783,25 @@ $- oB_ oAy p3 $1 oAw +8 oAW -] oAU u oAt t oAs Z1 oAs iAi oAS E oAS -9 p2 oAp +9 p2 -oA? o9 ,7 +oA? o9 ,7 oAo oAl E oAj oBb oAj oAh ] oAg -oAdO45 +oAd O45 oAd *A8 oA@ D9 oA! c } oAc -oAaO41 +oAa O41 oA9 DB oA9 -9 oA8 Z1 @@ -23740,12 +19813,11 @@ oA6 K oA6 +9 oA $6 oA4 Y1 -oA4O21 +oA4 O21 oA4 +3 oA4 $! ^% oA3 oA1 K C -oA1 E oA1 D5 oA1 C K oA_ $1 @@ -23760,20 +19832,18 @@ o9! Z1 o9z o9y o8y o9x ^X -o9.O71 -o9#O62 +o9. O71 +o9# O62 o9w -o9VO71l -o9VlO71 +o9V l O71 o9U u o9U o9t *96 o9t ] o9t o9( s2) -o9rO52 +o9r O52 o9r t -o9p -8 o9p o9o o0s o9o .8 @@ -23781,7 +19851,7 @@ o9. o0, } o9o o9o o9N t -o9mO72 +o9m O72 o9. k ] o9k o9I c @@ -23793,11 +19863,10 @@ o9% E o9 E o9. D5 o9@ D1 -o9cO61 +o9c O61 o9b o9a *85 o99 y2 -o9% *96 $! o99 o9- .8 $_ o98 @@ -23805,9 +19874,8 @@ $& o97 ^# o95 o94 i9_ o9. -4 -o93i9 O97 +o93 i9 O97 o93 i9 -o93 ^% o9% $3 o9. -3 o91 o60 @@ -23816,7 +19884,6 @@ o91 i8 o91 $D o9. *18 ^! o91 -o90 +7 $# o90 $! o90 o9& @@ -23825,23 +19892,20 @@ o9 } o9. o8. z1 o8X $D -o8*O43 -o8-O07 +o8* O43 +o8- O07 o8W Z2 E -o8W E Z2 o8u Y3 o8U i29 o8u $3 o8t 'B o8t +A p3 -o8% T1 o8s o5n o8s K o8s $b o8@ s@. ^2 o8q Z1 *67 -o8qO52R4 -o8qR4O52 +o8q O52 R4 o8q *67 Z1 o8| ^P o8P @@ -23852,21 +19916,20 @@ o8m $l o8m *68 o8m $@ ] o8l -o8kO52 -o8k t $1 +o8k O52 +o8k $1 t ] o8k t o8k D6 o8k 'B -o8k $1 t o8j [ $@ o8j o8i o6d o8I c o8! i1i -o8hO32 +o8h O32 o8H u o8g $o -o8fO94 +o8f O94 o8f K o8D ] o8d @@ -23886,19 +19949,14 @@ o87 ^s o87 i3P o8@ .7 $@ o87 -o8@ *61 -o8. ,6 o8. -6 o85 $w o85 *97 -o85 ^# $/ o85 o8@ $4 $! o84 o83 o7v o83 -o8@ ^2 s@. -o82 +4 o82 o81 T5 o81 i7x sx_ @@ -23919,14 +19977,12 @@ o8, o8_ o8= o8^ $& -o7z ^i o7z $7 o7z *32 o7 Z3 o7z +3 ] o7z o7y ^y *70 -o7y ^r o7Y c o7x o9. o7x o6- @@ -23950,10 +20006,9 @@ o7s o6b o7s *23 o7S $2 ] o7s -o7rO01 +o7r O01 ] o7r t o7q r -o7q ^q o7q *61 o7q *37 o7q *25 @@ -23962,14 +20017,12 @@ o7p u o7p $i o7p c o7O y4 t -o7O t y4 o7@ o1@ o7- o0- o7n 'B o7n +9 o7n *30 o7m Z1 u -o7m u Z1 o7m o8j o7m *64 o7l o0p @@ -23991,8 +20044,7 @@ o7* i4* o7i $1 D6 o7_ i0( ] o7i -o7H Y1 -o7-^hO14 +o7- ^h O14 o7h o4k o7h *75 o7g *14 @@ -24003,24 +20055,22 @@ o7f *27 o7F o7e $z o7e *61 -o7dY5O56 +o7d Y5 O56 o7, D6 o7d *14 -o7D +0 o7c Y2 $1 o7c o0C o7c *76 o7c *52 o7c -0 ] o7c -o7bO15 +o7b O15 o7b $a o7a Z3 -o7a R4 o7a K o7a $1 $4 o79 D6 -o78 $ ^z +o78 $ ^z $- o78 o77 o4F o77 o2h *12 @@ -24030,7 +20080,6 @@ o7. $7 -9 o77 -6 o7@ *75 o77 *20 -o76 u o76 E o7. *65 o76 $% @@ -24038,35 +20087,28 @@ o7/ .6 } o76 { o75 *65 o7* *56 -o75 $1 [ o75 [ $1 o74 o2m -o74 +6 o74 $+ o7. .4 [ o74 o73 T3 $! o73 p2 -o73 o68 *53 -o73 -6 -o73 *56 o73 *53 o68 +o73 -6 o72 o61 o72 d o72 $. o7, $2 -o71 t *76 -o71 i7+ o71 *76 t +o71 i7+ o7. *14 o71 ,3 o7@ ^1 o70 Z5 Z2 -o70 Z2 Z5 o70 ^t o7. *03 o7. $0 -o7! +0 o7% ^% o7$ $$ o7' ^' @@ -24076,7 +20118,6 @@ o7_ o7= ] $) o7( $) o7| -$? o7? ^' o7_ ^! o7" o6Z o5z @@ -24085,21 +20126,19 @@ o6z i2h o6< Z3 ] o6! Z1 c o6% Z1 -o6< Z1 +o6< Y1 o6y C o6y c o6@ Y3 o6- ] Y2 o6_ Y2 o6 Y1 $0 -o6< Y1 o6- y1 o6y ] o6x i72 o6x D3 o3z -o6]O71R6 +o6] O71 R6 o6w $z -o6W $W o6w p3 o6w } o6_ $w @@ -24109,10 +20148,8 @@ o6u $g o6u .7 o6u $1 o6u -0 -o6tO51 o6t t o6t $9 -o6& T7 o6# T5 o6S ^r o6S o0s @@ -24123,7 +20160,6 @@ o6s ] o6s ^@ o6R u o6R i9l -o6]R6O71 o6p i5z o6p i2q o6o $x @@ -24133,15 +20169,12 @@ o6@ o4m o6@ o3@ o6@ o2! o6, o2. -^* o6o o6n Z2 o6n i5w -o6n *35 o6n $1 o6m $t *05 o6m $k o6m *05 $t -o6L .7 $! o6k $8 o6k -7 o6k *64 @@ -24163,7 +20196,7 @@ o6g $k o6g $G o6g $3 o6g *26 -o6fO03 +o6f O03 o6f o0x o6f *52 o6f ,3 @@ -24176,20 +20209,15 @@ o6e *32 o6e $_ { o6e o6d o3c ] -o6d ] o3c o6d i2k o6D $! -o6! c Z1 -o6c ^S o6@ C o6b o8@ o6b D9 o6b ^A -o6b *17 o6b -0 o6a $G o69 -7 -o69 -6 ,4 o69 ,4 -6 o6. -9 o68 Y3 @@ -24199,7 +20227,6 @@ o67 c Y4 o6! $7 o6! ,7 $- o67 -o6) *64 o66 *24 o65 $D $? o65 $d @@ -24208,15 +20235,12 @@ o6. ,5 o6! .5 o64 Y3 o64 E -o64 *76 -o64 -5 o64 $0 o64 $# $# o64 o63 +9 o6- *35 o6. ^3 -o62O31 o62 o44 o62 o2c o62 K @@ -24230,23 +20254,20 @@ o61 u -2 o61 T4 o61 o9S c o61 C -o6. *14 o61 -2 u o61 $@ o60 o9a -o60dO05 +o60 d O05 o60 .5 -o6@ *01 ^o *60 o6% o6# $% -o6# $# +$# o6# o6& o6/ o6, o6 ] o6< ^> -$# o6# $# o6@ $] o6[ $` o6` @@ -24260,18 +20281,16 @@ o5z d E o5z +2 o5z *06 o5Z $$ -o5yO64 -o5y t *67 +o5y O64 +o5y *67 t o5y $n o5y c o5y *68 -o5y *67 t o5y *23 o5_ Y2 o5y *12 o5. Y1 o5_ y1 -o5y ^# $! o5y o5x p1 o5x *16 @@ -24296,7 +20315,6 @@ o5s ^f o5s *50 o5R u o5r ^S -o5R l *35 o5R *35 l o5q *12 o5q +0 @@ -24307,10 +20325,9 @@ o5p *23 o5p +2 o5p $! o5p ] -o5oO02 +o5o O02 o5o i5y o5o 'A -o5o *65 o5o *56 o5^ o4U o5# o4C @@ -24325,10 +20342,8 @@ o5m ^1 ] o5m o5L u o5l '8 -o5l *13 o5l { o5- $l [ -o5- [ $l $? o5l o5k ^h o5+ K @@ -24338,20 +20353,16 @@ o5i o3i o5I i4b o5i E o5i DB c -o5i c DB o5i c o5i $7 o5- i5l -o5! i0@ o5i $* o5h Z1 o5h $t -o5h ^n o5h *23 o5g $s o5g o3x o5G l *50 -o5G *50 l o5f o9l o5f L6 o5F K @@ -24363,9 +20374,8 @@ o5e o33 o5e o2g o5e ^K o5e i3K -o5DO41 -o5dO41 -o5dO01 +o5d O41 +o5d O01 o5D i64 o5; D6 o5_ D2 @@ -24380,7 +20390,7 @@ o5B *67 o5a T0 o5a $s o5a o3P -o5afO0B +o5a f O0B o5a D3 o5a *40 o5a -2 @@ -24390,7 +20400,7 @@ o59 k *15 o59 k o59 i57 o59 ^d -o59*24O12 +o59 *24 O12 o5. '9 o58 p1 c o58 k @@ -24402,7 +20412,6 @@ o55 u d o55 o3Z o55 ^j o55 i4@ -o55 d u o5- *54 o5- $5 o5_ $5 @@ -24423,9 +20432,7 @@ o52 *03 o52 $@ o5@ $2 o5 ,2 -o51 ^Y o51 R4 -o51 k o51 'A o51 .2 o51 ] @@ -24438,20 +20445,17 @@ o50 .4 o50 *34 ] o50 o5( -o5! ^" o5_ $! o5_ ^` o5= $$ o5@ ] o5. -^) { o5( ^, o5. o4z Y2 o4Z K c o4Z c K o4z *52 o4z ,3 *43 -o4y *43 o4y *34 o4y *32 o4y +2 @@ -24461,8 +20465,8 @@ o4x r o4X $P o4x o3z o4x o1l -o4.O72 -o4-O12 +o4. O72 +o4- O12 $- o4x o4w o2h o4w o0r d @@ -24484,16 +20488,13 @@ o4t o6b o4t o1d o4T D5 o4t *41 -o4T +3 o4* T1 o4S T6 o4s o6c p3 o4s c o4s +7 ] -o4s ] +7 o4s +5 o4s *12 -o4S -0 o4s [ $@ o4s ] o4s @@ -24501,11 +20502,9 @@ o4R ^0 o4r o4q D5 o4p r -o4p ^P o4p o91 o4p +0 ] o4o $z -o4O E ] o4O ] E o4o D2 o4! o8% @@ -24518,8 +20517,6 @@ o4n i6o o4N i6A o4n i4X o4n +5 -o4n *01 -o4M z4 z2 o4M z2 z4 o4M o79 o4m $A @@ -24535,7 +20532,7 @@ o4k $s o4k $3 o4k $0 o4# k -o4jO81 +o4j O81 o4j o7* o4j c o4i o90 @@ -24566,36 +20563,32 @@ o4d -5 o4D $. o4d } o4C u -o4c i4 sk +o4c i4 sk o4c i4 o4c +0 o4c } $@ o4c o4b *24 ] o4b -o4ap2O62 +o4a p2 O62 o4a o0$ o4A c o49 i4@ o49 ] -o48 T5 o48 r o48 o06 o48 D1 o48 *02 -o47 ^Y o47 $s o47 i42 o47 $a o47 $8 o4_ *75 -o46 *32 +1 o46 +1 *32 o4@ +6 o4$ *56 o45 +3 -o44O81 -o44 T0 +o44 O81 o44 t o44 *53 o44 *43 @@ -24620,8 +20613,7 @@ o4_ ^, o4| $+ o4+ $. o4* -^? o4! -o3zO43 +o3z O43 o3z o6c o3z i44 o3z *72 @@ -24647,27 +20639,22 @@ o3x +4 o3w y4 o3w R0 o3W o7! -o3w D0 o3w +5 o3w *46 o3w $. o3_ $w -o3v D0 o3v d -o3v *31 -o3v $3 o3v *13 +o3v $3 o3v +0 o3u y5 -o3uO41c -o3ucO41 +o3u c O41 o3u *90 o3u -7 o3u .1 o3* u [ o3u -o3T Y1 -o3tO71 +o3t O71 o3T u o3T o4G o3t ^N @@ -24700,29 +20687,25 @@ o3o o9$ o3o o4t o3o } k o3o i3b -o3o D6 *45 -o3@ o68 o3o *45 D6 +o3@ o68 o3_ o2g o3@ o1C o3( o19 $? o3o o3n Y1 -o3n^IO13 +o3n ^I O13 o3n *03 o3m o6u o3m o2k o3m +5 -o3M .4 -o3M *34 o3l o0R o3k o7d o3K o0D o3k C o3k *14 o3J y3 u -o3jO63 -o3J u y3 +o3j O63 o3j *28 o3J *24 o3J $@ @@ -24742,17 +20725,13 @@ o3g -5 [ o3g o3f o4v o3F D7 -o3F .6 o3f *53 o3f *03 o3e i2r -o3E ^I -o3e *75 o3e $4 o3e *30 [ o3e o3d Z1 -o3DO61 o3d o83 o3D D5 o3d ^A @@ -24761,7 +20740,7 @@ o3d *07 o3. $D o3D o3c y3 -o3cO21 +o3c O21 o3b o4o o3b i2R o3b +6 @@ -24780,7 +20759,6 @@ o3, ,7 o37 o36 R4 o36 k -o36 ^f o36 *35 p3 o36 +2 o36 ] @@ -24812,7 +20790,6 @@ o31 o2e o31 *45 o31 *25 o30 o78 -o3! *07 ] o3_ *02 o3# ^0 o3$ $% @@ -24842,10 +20819,9 @@ o2x K o2x $C o2x *70 o2x *64 -o2 O63 +o2 O63 o2x +3 o2x .1 -o2_ ^x o2w o1m o2w K o2w $8 @@ -24855,17 +20831,16 @@ o2w *27 o2w *02 o2V ^U o2v *03 -o2uO41E -o2uO41 +o2u O41 E +o2u O41 [ o2u t o2U o4A o2u o3J o2u K *43 o2u ^i -o2uEO41 o2u *43 K o2u [ *20 -o2tO42 +o2t O42 o2t T0 o2t ^S o2t } ^r @@ -24876,18 +20851,16 @@ o2T i4L o2t ^c o2t { +7 o2t ^5 -o2t *45 o2t *34 o2t ,1 o2T $? $# o2T o2T o2t ^< -o2sO32 +o2s O32 o2S c *35 o2s +9 o2s -6 -o2S *35 c o2s *30 o2r ^y o2r o0V @@ -24905,7 +20878,7 @@ o2p $$ o2p $? o2o o3s o2o 'A -o2 o6 i9= +o2 o6 i9= o2 o6 o2, o1q o2@ o1p @@ -24921,7 +20894,6 @@ o2n +3 o2n o2m i3i o2m i0A -o2M D3 o2. ^M *32 o2m o2L Y3 @@ -24930,7 +20902,6 @@ o2l ^i $! o2l o2k o7b o2. k c -o2K *68 o2k -5 o2j *31 o2j -0 @@ -24946,12 +20917,12 @@ o2= i1+ o2. i0h o2i { ] o2i -o2hO01 +o2h O01 o2H u o2h o2g Y2 o2g ^c -o2fY5O76 +o2f Y5 O76 o2f ^L o2f i0w o2f +5 @@ -24964,7 +20935,6 @@ o2e i05 o2e D8 o2E C o2e $1 -o2E +0 o2d y2 o2d t o2d o8t @@ -24974,15 +20944,12 @@ o2d K o2d *75 o2D ,3 o2c i2p -o2C *13 o2c $@ -o2b .6 o2b ,3 o2B o2a Y4 T0 o2a T0 Y4 o2a $9 -o2a -7 o28 *32 o2- *76 o27 *45 @@ -24992,11 +20959,10 @@ o25 Z2 o25 i61 o25 *65 *31 o25 *46 -o25 *31 *65 o24 T3 o24 o7y o24 $. -o23O41 +o23 O41 o23 R3 o2$ ,3 $# o23 @@ -25008,20 +20974,18 @@ o2, o2 $o $2 ^@ o2@ -^! o2@ o1z y4 o1z ^U o1z o2y o1z { 'A o1- z2 -o1z ^. { o1z [ o1z ^@ o1z o1z o1Y u o1y *30 -o1@O52 +o1@ O52 o1x *31 o1w ^q o1W i4u @@ -25032,7 +20996,6 @@ o1w +0 ^o -1 ^w o1v -5 o1v *34 -o1v -3 o1u o5/ o1u i2 o1t ^x @@ -25040,7 +21003,6 @@ o1t c o1@ T0 o1t .0 } o1t -o1sO31 o1s u [ o1s o2w ^. o1s @@ -25066,7 +21028,6 @@ o1@ o6! o1o $2 o1o -0 o1O -o1o [ o1n k o1n ^! o1n @@ -25082,7 +21043,7 @@ o1k i0m o1k *45 o1( k } o1k -o1JO41 +o1J O41 o1J o0C o1J ^M o1j ^M @@ -25093,21 +21054,18 @@ o1( i4. o1@ i2m o1* i1w o1i $1 -o1@ i0! $/ o1i o1[ ^H R2 o1h i2- -o1gO23 +o1g O23 o1G ^S o1G o0S o1G k { -o1G *73 o1G *37 o1F t ,2 o1f $t o1f i0b o1F E -o1F ,2 t o1f $@ o1f ] o1E u @@ -25124,7 +21082,6 @@ o1c i0t o1c $A [ o1b Y1 o1b y1 -o1bO31 o1b ^L o1b *01 o1. ^B @@ -25136,7 +21093,6 @@ o1a o0Y o1a $a o1a $% ^# o1a $# -^# $# o1a o19 o24 o1. ,9 o18 *31 @@ -25149,7 +21105,6 @@ o15 *54 o15 *13 o15 { $\ o15 -o14 p1 o14 o33 o14 K k o14 k K @@ -25165,36 +21120,30 @@ o12 ^W } o12 } o11 TA o11 T9 -o11 R5 o11 *67 o11 *41 ^J o1- *13 ] o11 ] -] ] o11 ] o11 o10 $_ p4 -o10 C +1 o1@ *02 -o10 +1 C o1) ^) o1. ] ^! o1@ o0z $x o0z o3p -o0zi6-O53 +o0z i6- O53 o0z *76 -o0Z *51 o0Z *14 o0Z $) { o0Z o0@ ^z o0- ^z -o0Y l *53 +o0Y *53 l o0y ^g +6 o0y $b o0y $A o0Y '6 -o0Y *53 l o0y *25 o0y -1 o0y $* @@ -25202,32 +21151,28 @@ o0x z1 o0X $x o0x i1p o0x *75 -o0$O61 o0w sei o0w o4s o0w o3g o0w o2h o0w i3g o0W ^E -o0W *81 o0W $5 o0W $- $. o0W o0w $- { o0w { -o0vrO34 +o0v r O34 o0v ^j o0v .5 o0v *25 o0v *20 -o0v *02 o0u ^t o0u ^G o0U *62 o0u ^0 { o0T Y2 o0t y2 -o0TO21 o0T T3 o0t o3q o0t o3n @@ -25235,17 +21180,14 @@ o0T ^L o0t i44 o0T D9 o0t D7 -o0T $B o0t ^7 -o0T ^6 o0t .6 o0t +5 o0T $3 $$ o0T o0t $$ o0t $! -$o $0 t -o0sO72 +o0s O72 o0s o6- o0s i1z o0s ^E @@ -25259,7 +21201,6 @@ o0S *12 o0s $1 o0S ] o0s $$ -} o0s o0r u o0R T5 o0R r @@ -25268,7 +21209,6 @@ o0R l i0M o0r D3 o0R $8 o0R *51 -o0r -5 o0R $@ o0R o0r $@ @@ -25276,9 +21216,7 @@ $/ o0r o0q z1 { o0q u o0q *68 -o0q *64 o0Q ,6 -o0q ,6 o0q *57 $/ o0q o0P y3 E @@ -25291,11 +21229,9 @@ o0p i1m o0p ^c o0p +7 *45 o0p $6 -o0p *45 +7 o0p *34 o0P +3 o0p .2 -o0p *12 o0p $0 o0P o0o i0z @@ -25309,24 +21245,18 @@ o0n ^v o0n o1i o0N i82 o0n i3h -o0N D2 o0n *65 -o0n *50 -o0n *23 -o0n -2 o0n *05 +o0n *23 [ o0m y2 -o0m u d -o0m t d +o0M u p1 +o0m d t o0m T2 -o0m T0 ] o0m ] T0 o0m t o0m ^S o0m $p [ o0m k -o0m d u -o0m d t o0m *76 o0m *71 o0m $4 @@ -25344,41 +21274,33 @@ o0L $m o0l ^l o0l i3. o0l $9 -o0l .4 u o0L *47 o0l ^2 o0l +1 o0l $+ o0l ^@ -$. o0l $! o0l -o0kO32 +o0k O32 o0k u p1 o0k ^u o0K T2 o0k sea -o0k p1 u o0k o1h o0K K o0K i0A o0k D3 $0 o0k $0 D3 o0! ^k -o0j $z o0j y4 -o0JO51 o0j ss1 o0j i1k o0j i0b o0J ^H o0J D2 -o0j $B o0j -7 o0j *50 o0J -4 o0j *32 -o0j *31 -o0j *13 o0j $1 o0i ^z *30 o0i i0v @@ -25391,24 +21313,19 @@ o0h shk o0h r o0H o5! o0H ^L -o0h d t o0h $6 o0H -5 o0h *20 -o0H +2 o0H ,1 -o0H ^1 $. o0H o0H o0h $! -o0GO31 o0g snf o0g o6. o0G o4m o0g o4m -o0G D8 ,5 -o0g ,6 o0G ,5 D8 +o0g ,6 o0g *05 { o0G $. o0g @@ -25420,7 +21337,6 @@ o0f ^a o0F $6 o0f ,6 o0F ,3 -o0f .2 $! o0F o0f $_ o0E o6i @@ -25429,27 +21345,24 @@ o0e i1n o0e $f o0e ^4 o0e *05 -o0! E o0e } -o0DO62 -o0dO42 +o0D O62 +o0d O42 o0D o4G o0d ^i o0d $f o0D +B o0d $A o0D $7 -o0$ D6 o0d *36 o0D +2 o0D *13 o0C y4 o0c y4 -o0cO91 -o0cO31C +o0c O91 +o0c O31 C o0c o3m o0C ^J -o0cCO31 o0C $a o0c ^A o0C .2 @@ -25457,7 +21370,6 @@ o0c ^2 o0c *15 $! o0C o0c $* -$= o0c o0b z1 Y5 o0b Y5 z1 o0b y4 @@ -25466,14 +21378,11 @@ o0b +3 o0B [ o0b o0A z2 r -o0A T5 -o0A T2 o0a $t } o0a p1 o0a i3e o0a i2d o0a i1- i0s -o0A *75 o0A *57 o0a *51 o0a -1 @@ -25488,24 +21397,18 @@ o07 D5 o06 *54 o06 -2 o05 z2 -o05 T3 o05 'A -o05 *76 o05 o04 } o0@ +4 -o03 T5 T2 o03 T2 T5 o03 ,1 -o02O71 -o02 p1 } +o02 O71 o02 } p1 o02 ,1 o01 T9 o01 *A0 -o01 *05 o0* +1 { -o00 ^s o00 $@ $O ^0 o0% @@ -25520,11 +21423,9 @@ $N Z3 ^n Z1 u $n Z1 ^n y2 -^nO23 -^nO13u +^n O23 +^n O13 u $n ^w *58 -^n u Z1 -^nuO13 ^n ^T ^n s4- ^n ^s @@ -25532,7 +21433,6 @@ $n ^w *58 ^n r ^n ^P ^n ^p -^N o4t $n o1y ,3 $N ^M ^N k c @@ -25548,9 +21448,6 @@ $N i3k ^N i1O ^n } i1o ^N i1@ -^N i0V -^N i0T -^n i0F $n i0B ^n i0a $N $I @@ -25563,7 +21460,6 @@ $n *97 ^N $9 ^n +8 ^n $5 -$n ,3 o1y $n *30 } ^n +2 ^N *16 @@ -25588,15 +21484,11 @@ $m y3 ^m y2 $M Y1 ^M y1 -^mO32t -^mO13y5 +^m O32 t +^m O13 y5 $m ^x +1 ^m $x -[ $M u -^m t z1 -^mtO32 $M T5 $, -$M $, T5 ^m t *31 $M $T ^M $t @@ -25604,7 +21496,6 @@ $M $T $m r ^a ^M ^R ^M o8@ -^m o6p $M o6G ^m o5h $M o2x @@ -25617,7 +21508,7 @@ $m o0A ^M $O $M $o ^M ^N -^M^LO52 +^M ^L O52 $m L3 ^m ^L ^m ^K @@ -25643,20 +21534,19 @@ $M i5a $m i4- *18 $m i4- ^m i3w -$mi3uO23 +$m i3u O23 $m i2t $M i2a $M i0B ^M ^I ^m ^i ^m ^H -^mfO34 +^m f O34 ^M ^F ^M D5 $m D5 $m D4 ^m ^d -^m ^c Z1 $m C ^R $m ^c $m $b @@ -25669,8 +21559,6 @@ $M -7 ^M $5 ^@ $M -5 ^m .4 *23 -^m *31 t -^m *23 .4 $M $2 ^M ^2 ^M ^1 @@ -25693,32 +21581,25 @@ $- $m ^m $= ^m ^* ^& ^m -^l z5 u -$' l Z4 -$` l Z3 +^l u z5 l Z2 ^o ^l z2 ^l Y5 k l Y4 -lY2O05 +l Y2 O05 l Y2 $l $y -lOA1o3i -$LO91 -$LO51 -lO41f -lO24p2 -lO21 -lO05Y2 +l OA1 o3i +$L O91 +$L O51 +l O21 +l O05 Y2 $l $x $l ^W ^l ^W -^l u z5 l T7 l T4 T3 -l T3 T4 l T1 $! -l $! T1 ^L ^T $l $t $l sy_ @@ -25726,41 +21607,24 @@ l soD k ^l so. $L smJ l s14 -l s!1 -l s0s l s0a -^l } r +^l r { $l p4 $e -} l p3 -l p2 -l p1 -6 ^L ^P -l ^o Z2 ^l oA* -^L o6o $l o6_ -^l o4j -^l o43 -lo3iOA1 ^L o2M ^l o1I c $l o0y D5 l $L Y1 $l l D4 -^l k Y5 -l k soD $l $K -^L i7/ ^L i5R ^L i5i -l i4m $l i40 $L i3B $l i2h ^L i2. -^L i1C -^l i10 -l i0s ^l i0i $L $I { ^l ^i @@ -25769,9 +21633,6 @@ $L $G ^L ^E $l ^e $l d 'A -$l D5 o0y -$l D4 l -l D4 $= l D4 l D3 *73 $L D2 @@ -25781,45 +21642,37 @@ $L D2 } l ^b ^L ^a l $A -L9Z5O25 -L9O25Z5 +L9 Z5 O25 +L9 O25 Z5 $L $9 l ,8 .6 L7 i7h ${ L7 $? L7 ] L7 -L6 o4y L6 o1@ l +6 K L6 ^J -L6 i7h L6 i6x L6 i6w L6 i6h -L6 i6c L6 i4+ L6 ^A -l .6 ,8 $L .6 *63 L6 +6 L6 ^@ +1 L5 d c L5 D3 l *59 K -l *56 Y2 -l *52 y4 L5 $! L5 ^! L4 y5 -L4O72o3z +L4 o3z O72 L4 sbB -L4 s7s ^g +L4 ^g s7s L4 r i5e L4 o5f -L4o3zO72 L4 i2w -L4 ^g s7s L4 ,3 L3 ^t L3 i5a @@ -25828,7 +21681,6 @@ L3 L2 Y5 { L2 { Y5 L2 p1 { -L2 { p1 $L +2 $L -2 $@ L2 @@ -25844,7 +21696,6 @@ L1 '8 l $1 l { -1 ^l -1 -L0 z2 t L0 t z2 L0 ^t L0 s2F @@ -25863,7 +21714,6 @@ $L $0 $L ^@ ^L $$ $/ l $! -$/ $! l $ l } ^l } ^@ ^l @@ -25873,27 +21723,24 @@ $k Z4 k ^, z4 K $* Z2 K z2 $. -K $. z2 ^` K z2 K Z1 $0 ^K ^Z -1 k $ Z1 K $Z ^k ^z -Ky5O63 -ky5O01 +K y5 O63 +k y5 O01 $K Y5 c [ k y5 K y4 Y2 $k Y4 Y1 -KY4O41 -Ky4O12 +K y4 O12 K Y4 k ] ^k y4 K Y3 o7_ k y3 *32 K Y2 y4 -K Y2 y2 K y2 Y2 K Y2 o87 K Y2 i6. @@ -25906,68 +21753,57 @@ K $@ Y1 $ k Y1 [ k y1 k ^y -KOB6 -KO83t -KO83 -KO72*56 -k{O71 -KO41t -$kO32 -kO25 -^kO23 -KO21^h -kO13$! -k$!O13 -kO12d -$kO04 +K OB6 +K O83 t +K O83 +K O72 *56 +K O41 t +$k O32 +k O25 +^k O23 +K O21 ^h +k O13 $! +k $! O13 +k O12 d +$k O04 K $x $k $x $k $w K $v ^k $v ^k ^U u -^k u ^U K ^U ^L K u D6 K u ,9 $k $u K $t Y1 -KtO83 -KtO41 K t R9 -K t o4_ +K o4_ t K ^t i0v k ^t D4 K t -8 ^k T5 $K t -[ K t K src *53 -k sau [ k [ sau k sad k sa- -K s5B k s3x $k s1t -K s0l k s0@ $K ^S k $+ ^s -k ^s k R3 K R2 t K $r k ^R -KqO23 +K q O23 $k ^Q $k q ^k p4 ^C k p4 'A k p3 o7. k p2 *35 -Kp1O04 -K p1 +B k p1 *54 ^k ^P K oBy @@ -25994,7 +21830,6 @@ k o50 k o4y K o4u $k o4u -K o4_ t $k o4i K o4e $k o49 @@ -26004,14 +21839,11 @@ k o3o K o3g K o3f k o39 -k o36 k o2- y2 -[ k o2x k o2j k o2b k o22 K $K o2# -^k o2. ^K o1R k o1d k ^@ o1c @@ -26019,7 +21851,6 @@ k o1a K o13 K o11 k o11 -^k o1! k o0o k o0n *31 k o0k -1 @@ -26035,7 +21866,6 @@ K $m i7f ^K $m ^k $m K l *58 -k l *30 ^| K L0 K $K Z1 K ^k ^z @@ -26044,7 +21874,6 @@ k ^K T3 k K o22 k K *54 K k *31 -K k *13 K k $! K k $_ K $! k @@ -26052,7 +21881,7 @@ K $_ k $k K ^k K k ^k -k^JO32 +k ^J O32 K $J r k ^j *05 K iB- @@ -26082,55 +21911,48 @@ $k i3s } K i3E ^k i2z k i2y -ki2?O23 +k i2? O23 K i2l k i2@ c K i2b $k i2b k i1s k i1r -^k i1m +^m ^k ^k i1j ^K i1! k i1& $k i1- -ki0@O51 +k i0@ O51 $. k i0v -K i0u ^K i0T -^K i0G ^k i0F ^K i0D k i0A ,6 -$K i0$ k $g Y1 K $g K ^g -k^fO32 +k ^f O32 k { ^f k E r ^k E o1H k E i6a -k E $9 +k $9 E k E $5 $+ k $e -KdO03 +K d O03 K ^d i3q -K D6 u K D6 *86 $K D5 y5 -k D3 d ^K D3 $k D3 K D2 $9 K D1 $7 K d -k c i2@ ^k ^c D6 -K C .7 +K .7 C K c -7 K c $# -K $# c k ^b p3 k ^b *13 $K ,B @@ -26139,8 +21961,6 @@ K ^a -7 $K ^A $K $a ^K $a -K ,9 u -k $9 E K $9 D2 K *97 $1 $K ^9 @@ -26149,14 +21969,12 @@ K -8 t k $8 o3s K *85 $! K $! *85 -K *82 *76 +K *76 *82 K ] $8 K -8 k } '8 K $7 D1 -K .7 C K -7 c -K *76 *82 K -7 *65 K .7 ,5 k *74 @@ -26167,22 +21985,16 @@ K -7 $. $K .7 k -7 k *67 -K *65 -7 k *64 K +6 $K +6 $K ^6 -k $5 E -K *58 l K *57 y5 -K ,5 .7 ^k *57 -K*56O72 k *56 -3 k *54 K K *54 *02 -K *53 src -^k*52O12 +^k *52 O12 k *52 -1 K -5 $1 K +5 *07 @@ -26197,16 +22009,13 @@ $k *37 $. k *37 K *36 $. K $. *36 -k -3 *56 $k *35 k *34 ] k *34 k ] *34 K ,3 *20 k -3 -2 -k *31 o0n K *31 -k *30 l ^k *30 K $$ ,3 K { -3 @@ -26216,32 +22025,22 @@ $k -3 k -2 Y3 k -2 y3 k *24 -k -2 -3 K ] ^2 -K ^2 ] ^K $2 k .2 k +1 y1 -k -1 o0k K $1 *97 -^k .1 ,7 -k -1 *52 K $1 -5 k *12 i03 -K *12 ^K +1 k -1 -K *07 +5 -K +0 ,7 -K *02 *54 K *02 -K *01 r +r k K K .0 *12 $$ K $0 ] K +0 k -0 K } -$* $& K $$ ^K $/ K $, K @@ -26261,11 +22060,11 @@ $- ^k ^ k ^J z1 +5 $j $z -$jY1O12 -^@^JO73 -$JO41 -^JO32 -$jO12Y1 +$j Y1 O12 +^@ ^J O73 +$J O41 +^J O32 +$j O12 Y1 ^j $x ^j $w ^j ^V @@ -26277,7 +22076,6 @@ $j $t $J ^S ^j r ^j $q -^j o65 ^J o5p $J o5$ ^j o4g @@ -26286,7 +22084,6 @@ $J o4 $j o21 ^J o2@ ^j o1l -^J o1D $j o0p ^J $o $j ^m u @@ -26304,14 +22101,9 @@ $j i5w ^J i3s $j i3k ^j i2z -^J i2m T0 ^J i2d -^J i1W ^j i1w -^J i1R ^J i1k -^j i0s -^J i0D ^j $G ^j ^G ^j E Y5 @@ -26346,14 +22138,12 @@ $I Z1 $i Y3 { $i Y2 $i y2 -$IO71u -^IO52$1 -^i}O52 -$IO03 +$I O71 u +^I O52 $1 +^i } O52 +$I O03 ^i ^W -$IuO71 ^i u ^D -$i t Z2 ^i t i6A ^I T3 $i ^t @@ -26367,11 +22157,9 @@ $i $k $i i7* $i i52 ^I i1L -^i i06 ^i ^G p4 ^i ^F $i E .9 -^i ^D u $i D6 Z2 $i D5 ^i d ] @@ -26388,22 +22176,22 @@ iB/ iB_ $) iB( ] iB -iA-O53D2 -iA O21 -iAwO82 +iA- O53 D2 +iA O21 +iAw O82 iAt oBr iAo *A8 iAm iAj iAi -iAhO63 -iAhO61 -iAeOB2 +iAh O63 +iAh O61 +iAe OB2 iAe iAd D8 iAc -iAbO24O51 -iAbi6uO74 +iAb O24 O51 +iAb i6u O74 iA -B ] iAa ] iA9 @@ -26412,7 +22200,7 @@ iA8 iA4 $A iA_ $4 iA4 -iA2O72 +iA2 O72 iA0 o8 $2 iA0 $2 o8 iA0 $! @@ -26421,24 +22209,21 @@ iA, iA= ^i ^a i9. Y2 -i9.O31 -i9*O03 -i9uO53 +i9. O31 +i9u O53 i9 t i9s E -] i9 sBn -i9pO65i0m +] i9 sBn +i9p O65 i0m i9o ,A i9o i9l $1 i9l i9h E +9 -i9h +9 E i9g E i9e t i9e D4 i9. E -$i .9 E ] i9e i9d i9B @@ -26465,29 +22250,25 @@ i9. ] i9_ $/ i9* i8z ] -8 -i8z -8 ] i8. Y3 i8- Y3 i8 Y2 -i8#O74i8p -i8 O42 -i8@O32 -i8*O24 +i8# O74 i8p +i8 O42 +i8@ O32 +i8* O24 i8W u -i8W T3 i8w i8v i8u L7 i8. T2 i8t -i8sO95 -i8sO52 +i8s O95 +i8s O52 i8S E i8s D6 -i8R *70 i8q $e -i8pO62 -i8p *34 +i8p O62 i8o o7d i8o *84 i8n t ] @@ -26498,12 +22279,12 @@ $* i8l i8k $s i8, K i8- $k -i8jO43 +i8j O43 i8J l i8J i8i u -i8.iAIO93 -i8.i8 O69 +i8. iAI O93 +i8. i8 O69 i8. i8 i8i *21 i8^ i2^ ] @@ -26514,23 +22295,19 @@ i8G $s i8g ] i8g i8e .7 -i8e ,7 i8# ^D i8d i8* C i8a o6_ i8a K i8A E $5 -i8A $5 E i8. $A i8@ $9 i8. +9 i8! ,9 i8 $9 -i88O94 i87 i98 i87 *46 -i8% -7 i8* .7 i8. +7 i86 c z1 @@ -26555,39 +22332,35 @@ $& i8^ $@ i8_ ] i8. ^! i8! -i7zO24 +i7z O24 i7Z C i7z ,8 *14 -i7z *14 ,8 $& i7z i7y $i i7. Y3 i7_ y2 i7y ] i7y -i7XY3O45 +i7X Y3 O45 i7x $x -i7@O13 -i7,O13 +i7@ O13 +i7, O13 i7x i7W $n -i7w [ i7v ,8 i7v i7U o6P i7t C -i7( T0 i7! ^T i7t ] ] i7s -i7rO24 +i7r O24 i7r T0 i7r t i7R i7B $! i7r c ] i7r i7q D9 +7 -i7q +7 D9 i7q *75 i7Q i7q @@ -26599,7 +22372,6 @@ $@ i7o i7o i7N i8E i7m o4E l -i7m ^M i7l *34 i7l $$ ] i7l @@ -26614,24 +22386,21 @@ i7* i2* i7h t i7_ $H i7h $! -i7gO41 -i7fO34 +i7g O41 +i7f O34 i7e o8f i7e k i7d .6 -i7@ D5 i7. D3 i7. D2 $! i7D i7c $d i7c $9 -i7AO52E -i7AEO52 +i7A O52 E i7` $A i7. ^a i7- -9 $* i79 -i78 D4 i7@ ,8 i77 o0m i77 C @@ -26642,13 +22411,11 @@ i7* .6 i7! .6 i75 i7. $. i75 E -i75 .4 i75 ,1 i75 [ $. i75 i74 o1A i74 D0 *75 -i74 *86 i7. *46 i73 o61 i73 i13 @@ -26666,8 +22433,6 @@ i71 -2 C i71 ] i7& $1 $! i7@ *05 -i70 *31 -i70 *13 i7. +0 i7! $0 i7* $# @@ -26684,21 +22449,19 @@ $- i7= ^` i7- i6z t i6z $8 -i6Z ^4 i6z +3 i6% Y3 i6. Y3 i6_ Y3 -i6xO72 +i6x O72 i6X o0w i6x i6z i6x i6- -i6 O91 +i6 O91 i6x +9 i6X ,7 -$.i6)O65 -i6.O12 -i6x [ +$. i6) O65 +i6. O12 i6W s5i c i6w D4 i6W c s5i @@ -26706,11 +22469,9 @@ i6w ^. i6v u i6v s0z *16 $/ i6v o7y -i6v *16 s0z i6v [ i6v -i6uO05 -i6U u +i6u O05 i6u o7s i6u *27 i6- t D7 @@ -26718,8 +22479,8 @@ i6T c i6 TA i6t +9 $@ i6t -i6sY1O73 -i6sO23 +i6s Y1 O73 +i6s O23 i6s L4 i6s *71 $! i6S @@ -26728,17 +22489,17 @@ $@ i6s { i6s ] i6s [ i6s -i6RO23 +i6R O23 i6r i8! i6R i6$ i6R $g i6r -8 i6- R4 -i6pO32 +i6p O32 i6p o0J i6p $F -i6P*63O21 -i6oO81 +i6P *63 O21 +i6o O81 i6o o5l i6- o5H i6) o4( @@ -26752,23 +22513,20 @@ i6n i3m i6n i2b i6n c i6n *40 *18 -i6n *21 -i6n *18 *40 $@ i6n -i6my4O07 +i6m y4 O07 i6m o5. i6M E $2 i6M E i6m .7 i6m *62 -i6M $2 E i6m $/ i6m i6l C i6l $8 Z1 i6L *06 $. i6l -i6kO42 +i6k O42 i6@ K $. i6k i6j E @@ -26785,9 +22543,9 @@ i6i $. i6i $! $% i6i i6i -i6hO24 +i6h O24 i6h o2z -i6gO41 +i6g O41 i6g L0 i6G i7C i6g D3 @@ -26798,14 +22556,12 @@ i6e Y1 i6e t i6e i6n i6E E DB -i6E DB E i6E [ i6e -i6dY5O13 -i6dO13 +i6d Y5 O13 +i6d O13 i6d u i6d E -i6- D7 t i6 D3 i6c +7 i6c [ @@ -26814,8 +22570,8 @@ i6B ^N i6b $4 i6B $$ i6, 'B -i6aO72 -i6aO31 +i6a O72 +i6a O31 i6a o4l i6a i6t i6a i5d @@ -26828,26 +22584,22 @@ i69 ] i6 -9 i68 o75 i68 i52 -i67O92C -i67CO92 +i67 C O92 i67 $A i67 *02 -i67 +0 i6 +7 -i66 R5 i66 D1 i66 *63 ] i66 ] *63 i66 $* i66 $@ i6+ ,6 [ -i6( .5 +6 +i6) o5( i6. *52 i6/ .5 i6_ -5 i64 ^e i64 'A -i6 *45 i6 *43 i64 ] [ i64 @@ -26868,8 +22620,6 @@ i61 $M i61 i5G i61 C i61 c -i6 *12 -i61 [ i6- +1 } i61 i60 y5 @@ -26877,7 +22627,6 @@ i60 o9@ i6! $0 $I .6 i6* $^ -i6* ^# i6$ $$ i6( i6, @@ -26890,7 +22639,6 @@ $^ i6* ] i6_ ] i6` i5z $p -} i5z L0 i5z k i5z ^g i5z *67 @@ -26911,16 +22659,14 @@ i5, Y2 ] i5 Y2 $. i5y i5x +6 *15 -i5x *15 +6 -i5!O12 +i5! O12 i5w Y1 -i5wO21 +i5w O21 i5w r i6x i5W [ o4. i5w $n i5w i4r i5w { -i5vO01 i5V o6o i5v o3x i5v i62 @@ -26928,7 +22674,6 @@ i5V c i5v *71 i5v ] i5u D4 +3 -i5u +3 D4 i5u { [ i5u i5u @@ -26942,13 +22687,10 @@ i5t } $. i5t i5s Y3 u i5S Y2 -i5s u Y3 i5s ^R i5S l i4e -i5S i4e l i5s D7 i5s *34 -i5s *23 i5S $! i5s ^( i5r ^M @@ -26956,22 +22698,19 @@ i5r i5c i5@ R4 i5r } i5q $s -i5q *50 i5. ^q -i5py4O17 -i5pO61i1s +i5p y4 O17 +i5p O61 i1s i5p r i5p i5m i5o r p1 i5o r [ -i5o p1 r i5o o6i i5o i5p i5o $7 i5@ o4l i5o $/ -i5o ^# -i5nO63 +i5n O63 i5N i86 i5n i3r i5n ^A @@ -26980,10 +22719,9 @@ i5n [ i5m o6. i5m ^a i5M .4 -i5lO32 -i5l +5 -3 -i5l *47 +i5l O32 i5l -3 +5 +i5l *47 i5. ^l i5l i5k s6Y @@ -26996,9 +22734,8 @@ i5k $= i5k [ i5j Y3 i5j Y1 -i5JO32 +o4J O31 i5J T5 $j -i5J $j T5 i5j ] i5i i4M i5i i1h @@ -27015,28 +22752,23 @@ i5h -4 i5- $h i5g i3n i5g C -[ i5g i5F s7E -i5f *74 i5e i2i i5e $e i5e +7 i5e *30 $} i5E i5e -i5DO83 -i5DO82 +i5D O82 i5_ D9 -i5d*60O61 +i5d *60 O61 i5D $* i5D -^% i5c s%p i5c o42 i5c l i5c K i5c i5E i5c 'B -i5c *52 i5c -4 i5- C [ i5= c @@ -27045,26 +22777,23 @@ i5b i2A i5b $f i5b ^5 +3 i5b $_ -i5aZ1O62 -i5aO62Z1 +i5a Z1 O62 +i5a O62 Z1 i5a s1! i5a o3a i5a D3 i5a *96 -i5A *20 i5, $a [ i5a i59 K i59 $. ] i59 -i58 o5k o3. i58 o3. o5k i58 C ^8 i5 *87 -i5( *86 i5* +8 i57 Y1 -i57O03 +i57 O03 i57 i0s i57 $8 i5@ *76 @@ -27083,7 +22812,7 @@ i55 o6t i55 i4x i55 ] $$ i55 -i54O32 +i54 O32 i54 T2 i54 p2 i54 K @@ -27102,15 +22831,14 @@ i52 +4 i52 $* ] i52 i52 -i51O12 +i51 O12 i51 k i51 i1T i51 -9 i5! $1 -i50 t 'A +i50 'A t i50 R4 i50 r -i50 'A t i50 *74 i50 +2 i50 ] @@ -27123,7 +22851,7 @@ $! i5- ] i5? ^[ i5] i4z Z1 -i4zO53 +i4z O53 i4z $v i4z r i4z .3 @@ -27138,15 +22866,14 @@ i4+ Y2 i4@ Y2 i4y .2 i4x i3c -i4.O61D2 +i4. O61 D2 i4x ,5 i4x -5 -i4*O23$A +i4* O23 $A i4w $z r i4w ^z -i4wO12 +i4w O12 i4W i4M -i4w *82 i4W *40 [ i4w i4w @@ -27164,14 +22891,12 @@ i4u ^l i4u $h i4u $9 i4u *32 ] -i4u ] *32 ] i4U i4t ^y i4t ^f i4t ^c i4t .7 i4$ T5 -i4t *36 i4& $t $, i4t i4t @@ -27182,11 +22907,9 @@ i4s i6f i4S c L5 i4s -5 i4s $2 -i4* ^S i4@ ^S i4 ^s $, i4s -i4RO13 i4- r p4 i4r ^P i4r o3c @@ -27195,13 +22918,10 @@ i4r -2 i4_ r i4q i4f i4q $0 -i4p L5 -i4- p4 r i4p *42 i4o Y1 c i4o } i6g i4o i3_ -i4o c Y1 i4# o3f i4- o38 i4o ^# @@ -27209,7 +22929,7 @@ i4n ^N i4n *12 i4n $@ i4n ] -i4MO14o2p +i4M O14 o2p i4M u i4m $t i4m i2s @@ -27222,8 +22942,8 @@ i4m ] i4l ^L i4l *32 i4@ ^# L0 -i4kO73 -i4kO21O53 +i4k O73 +i4k O21 O53 i4k ^R i4k $K i4k $5 @@ -27233,14 +22953,13 @@ i4k ^. i4_ $k $+ i4k $! i4k -i4jO21 -i4jO02 +i4j O21 +i4j O02 i4j i4z i4j $h -i4J -3 i4j { i4j -i4iO65 +i4i O65 i4I t i4i i6u i4i ,3 @@ -27251,7 +22970,6 @@ i4h $s i4h i21 i4h $g i4h $9 -i4H +7 i4h *13 i4G Z1 ,4 i4g ^j @@ -27283,26 +23001,22 @@ i4e +2 i4e $1 i4e $$ i4D ^C -i4_ D9 -i4% D2 i4@ D1 i4c *23 i4c -i4BO53 i4b u i4B i4a i4B ^F i4B c i4b $4 -i4aO57 -i4*$AO23 +i4a O57 +i4* $A O23 i4a ^v i4a sa i4a o3@ i4a o2p i4A $M .4 i4a i5m -i4a *53 i4a *52 i4A .4 $M i4a ,3 @@ -27313,7 +23027,6 @@ i49 k i48 Z1 i48 ^8 i48 ] -i47 T7 i47 *30 i46 *58 *54 i46 ,5 @@ -27325,21 +23038,19 @@ i46 $, i46 i45 Z1 c i45 Z1 -i45O12 +i45 O12 i45 T8 i45 o2d i45 ^m i45 i4y -i45 c Z1 i45 $* i4@ $5 $% i45 $* i45 ${ i45 -i44O62 -i44O27 +i44 O62 +i44 O27 i44 i51 -i4 *46 i44 [ ] i44 i43 R3 @@ -27360,9 +23071,8 @@ i42 ^A i42 *76 i42 *02 i42 $% -i4@ ^2 i4_ -2 -i41O01 +i41 [ i41 p3 i4. i41 i55 i41 ,5 @@ -27370,14 +23080,12 @@ i41 *31 i41 $3 i41 $ i41 } -i41 [ } i41 ] i41 [ i41 i40 y5 i40 i55 i4$ +0 -i4+ ^! i4( $) i4! $? i4= @@ -27389,18 +23097,16 @@ $! i4& ] i4= ^@ i4@ ^{ i4} -i3zO43 +i3z O43 i3z k i3z D5 i3z $8 i3z ,7 -i3z *25 i3z $! i3y ^z -i3yO61E +i3y E O61 i3y $p i3y i5h r -i3yEO61 i3y *63 { i3- Y5 i3 Y4 @@ -27411,13 +23117,13 @@ i3@ Y1 i3# y1 i3y { [ i3x Y2 -i3xO46 +i3x O46 i3x ^s i3x o5m -i3 O81 -i3@O72 +i3 O81 +i3@ O72 i3x *70 -i3"O13$d +i3" O13 $d i3x $1 i3w o7y i3w $k +2 @@ -27426,20 +23132,16 @@ i3w +2 $k i3- ^w i3v $v i3V C -i3uO52 +i3u O52 i3u i7y i3u i5i i3u i3t y2 -i3tO02D0 -i3tO01 +i3t D0 O02 i3t ^w i3t o6u i3t $k -i3tD0O02 -i3t D0 i3$ T6 -i3' T4 $@ i3t i3t i3s $z @@ -27453,13 +23155,12 @@ i3S .2 i3s +0 i3s $ i3s $` -i3s [ i3r r $4 i3_ R7 i3r $6 i3, $r $. i3r -i3qO71 +i3q O71 i3q $W i3q $w i3p $y @@ -27474,10 +23175,9 @@ i3p ^b i3o r i3O o0P c i3o i8s -i3O c o0P i3. o6K i3_ o6@ -] i3[ o3v +] i3v i3# o3_ $9 i3_ o2n i3- o0o @@ -27496,11 +23196,10 @@ i3l K i3l i3. i3l $2 i3l -i3kO04TB -] i3K u +i3k O04 TB i3k r i3k o2r -i3kKO71 +i3k K O71 i3k *53 i3k -5 i3k $3 @@ -27513,7 +23212,6 @@ i3_ i50 i3- i4s i3- i4C i3i ,4 -i3- i4- i3- i1y i3- i1a i3i $? @@ -27528,7 +23226,6 @@ i3g $8 i3g ,6 i3g *37 i3g *05 -i3g [ i3f Y1 i3F T0 i3f i6h @@ -27545,12 +23242,11 @@ i3e i2N E i3E -4 $! i3E i3E -i3"$dO13 +i3" $d O13 i3d t i3d $r i3d ^5 i3d } -i3C z1 u i3C u z1 i3c t i3c $b @@ -27576,13 +23272,12 @@ i3a ^I i3A $B i3a $- $* i3a -i3# $9 o3_ i39 o02 i39 i48 i38 i37 i37 i51 i37 i3A -i37fO65 +i37 f O65 i37 D1 i3# +7 $, i37 @@ -27605,22 +23300,18 @@ i3! ,4 i3- ,4 i3_ +4 i3 +4 -i3 -4 i33 ^T i33 ^s -i33 *76 i33 +2 $* i33 i32 *70 -i32 ^3 i32 ] $* i32 $! i32 i32 i31 y3 [ -i31O62k +i31 k O62 i31 ^S -i31kO62 i31 -6 i31 +1 i31 } @@ -27633,7 +23324,6 @@ i3& i3$ i3. $! i3! ^? -i3- ^` $@ i3. $! i3- $ i3_ @@ -27665,21 +23355,20 @@ i2x $s i2x $k i2x i0a i2x ^c -i2\O23$2 +i2\ O23 $2 i2x +0 i2w y1 -i2wO03 +i2w O03 i2w ^n i2w i3- i2w *52 -i2vO01 i2v K i3y i2v $k i2v i5C i2v i3y K i2v $h i2v ^3 -i2uO72 +i2u O72 i2u $x i2u $! ] i2u @@ -27691,8 +23380,6 @@ i2s sa@ i2s ^s i2s i0v i2s +8 -i2s *60 -i2S -3 i2s .1 i2s ] } } i2s @@ -27700,7 +23387,6 @@ i2r ^z i2r ^y i2r $K i2r $a -i2r *73 i2r $@ $@ i2r i2q $x @@ -27712,10 +23398,10 @@ i2q -0 i2_ ^q $- i2q [ i2q -i2py5O57 +i2p y5 O57 i2p Y4 i2p y2 -i2pO42-6 +i2p O42 -6 i2p o5p i2p k i2. p5 -6 @@ -27728,11 +23414,9 @@ i2n o0w i2n K i2n ^g i2n ,7 -i2N -6 i2n *40 i2n *37 i2m ^z -i2MO52 i2m sif i2m q +6 i2m i0a @@ -27741,15 +23425,12 @@ $! i2m i2l o0K i2L E i2_ L5 -^( i2. L0 i2l $. -0 -i2l -0 $. i2l $& i2l -i2kO71 +i2k O71 i2k u i2k i2j -i2k *57 i2k $5 i2 k [ i2k @@ -27757,12 +23438,11 @@ i2j $r i2j o0v i2j i0S i2j -8 -i2j *31 i2j *07 i2j -i2iY4O52 +i2i Y4 O52 i2i y2 -i2iO73 +i2i O73 i2i E +A i2i D5 i2I C @@ -27779,38 +23459,30 @@ i2h o6z i2h $f i2h D4 i2g y5 -i2gO53 -i2gO32 -i2GO02 -i2g s2r k -i2g o7@ +i2g O53 +i2g O32 +i2G O02 i2g k s2r +i2g o7@ i2G i5g i2g i34 i2g i2x i2G D4 C -i2G C D4 i2g $5 ^* i2g i2f o21 ] -i2f ] o21 i2f $6 i2f *31 i2f $! -[ i2f i2e K i2e $? i2e i2D y3 u -i2D u y3 -i2d ^N i2d i3@ i2d ^E i2d D5 *14 -i2d *14 D5 -i2d *13 -i2cO63 -i2cO42 +i2c O63 +i2c O42 i2c $w i2c o3k i2c K ^F @@ -27839,7 +23511,6 @@ $@ i29 i28 i0w i28 D3 i28 ^a -i28 -1 [ i28 +0 i27 $X i27 i5t @@ -27849,9 +23520,8 @@ i27 $A i27 .0 i26 i5z *56 i26 $a -i26 *52 i26 ] -i25O61 +i25 O61 i25 i3g i25 i0a i2_ *56 @@ -27864,13 +23534,13 @@ $. i24 i23 i53 i23 $a u i23 $! -i2\$2O23 +i2\ $2 O23 i22 ^1 i22 $- i22 i21 o0R i21 i31 -i21fO78 +i21 f O78 i2- +1 i20 $d i20 *03 @@ -27886,31 +23556,25 @@ i1y } ^v i1y ^s i1y o1b c i1y ^g -i1y c o1b i1y $2 i1y -0 i1x ^y -^I$1O52 +^I $1 O52 $@ i1x -i1WO53 -i1WO01^K +i1W O01 ^K i1w $m i1w i56 i1w i3 i1v ^M i1v ^h -i1V *56 -[ i1v i1u Z2 i1u y5 u -i1u u y5 i1U u i1u o65 i1U } [ i1u i1T ^w i1t s9w -i1t ^s i1t i0h i1t +0 $! i1t @@ -27920,8 +23584,7 @@ i1s $v i1s o32 i1s ^I i1{ s3P o1L -i1S *20 -i1rO27 +i1r O27 } i1r ^v i1R u i1r sts @@ -27934,24 +23597,16 @@ i1o o3j i1o $O i1o i0k i1. o44 .1 -i1{ o1L s3P -i1nO61 +i1n O61 i1n ^h -i1n *71 i1n *31 -i1n -2 -0 i1n -0 -2 -i1M Y5 t -i1mO71 i1M t Y5 i1M R0 i1m ^r i1m o2d i1m o12 o0! -i1m o0! o12 -i1m +A i1. ^m -[ i1m i1l ^P i1l $a i1l ,3 @@ -27967,7 +23622,6 @@ i1i C i1i *71 i1% i6& i1h y5 -i1h t i1h ^p t i1h o50 i1h ^j @@ -27983,7 +23637,6 @@ i1f $A [ i1f i1e o5m i1E E -i1E *72 *56 i1E *56 *72 i1e +5 [ i1e *13 @@ -27995,19 +23648,17 @@ i1C o0K i1c i2u i1C $c i1 c -i1bO52 +i1b O52 i1b t i1B o8@ i1a i2b -i1a +9 *78 i1a *78 +9 i1_ ^A i19 ^9 i19 +2 i18 Z1 t -i18y3O42 +i18 y3 O42 i18 ^v -i18 t Z1 i18 ^5 i18 $? i17 ^j @@ -28020,7 +23671,6 @@ i15 ^q i15 $a i14 *20 ] i14 ] *20 -i1` *42 i13 ^w i13 o30 i13 i4- @@ -28030,7 +23680,6 @@ i13 *04 i12 i32 i11 ^v i11 o62 -i1. .1 o44 i11 D7 i11 D6 i11 .4 @@ -28040,123 +23689,78 @@ i10 *24 i10 *14 ^I ^1 i1+ $- -$- i1+ -^/ i1? i0z y2 i0Z T6 i0z ^n i0z i4- i0z $b -i0 z2 -i0Z $$ i0z i0Y z1 i0Y ^Z i0! Y1 i1a -i0# y1 i0x i2q i0x i2h i0x $h -i0.O12 -i0x ] +i0. O12 ^_ i0x ] i0w $u -i0w ^r i0w o1t i0W ^N l -i0W ^J -i0w i0p i0w $e i0W ^A -i0w ^a i0w ,4 i0w -1 -$@ i0w $, i0w ^. i0w -i0v z1 i0v o5q i0v i0J i0u ^z i0U i0N i0u ^G -i0* u i0t y2 i0t ^O i0t ^o i0T i1W l i0! T8 i0t ^4 -i0T *31 ^. i0T i0s $W -i0S ^L i0s i52 i0S i1h D4 i0s i0x i0s .3 i0s $; -i0r z1 i0R sas i0r L1 -i0r l -i0R $J } i0r i2q i0r i27 -i0R i0b i0r *27 -i0Q ^K i0p y1 $6 -i0P ^V -i0p ^r i0p i6w -i0p i1w -i0p $f i0p ^e -i0p $6 y1 -i0P *32 -i0P *23 { i0p -i0N y2 -i0nO51 -i0N ^V -i0n l +i0n O51 i0n i2q i0n ^g i79 i0n ^8 i0m y4 -i0MO21 +i0M O21 i0M o2p i0M o1Y -i0M $L i0m i4r i0M *42 $! i0M $! *42 -i0M i0m $$ -$& i0m -i0l z2 -i0l *05 i0{ L0 i0` L0 -i0$ ^L i0k Z1 i0k spe -i0k ^l -i0k i0m -i0K $d -i0K ^5 -i0K ^- i0k $! ^- } i0k -i0J ^P i0j i5p i0J i0L -i0J ^B } i0J ^A -i0J -9 -i0J *70 -i0IO12T4 +i0I O12 T4 i0I $u i0i o4e i0i ^N @@ -28164,119 +23768,69 @@ i0I ^b i0u i0! { iB@ i0i +5 z2 i0i $4 -i0I +3 -i0! i1a Y1 i0. i0z -i0. i00 -i0I $! i0I ] -i0H $Z -i0HO04$4 +i0H O04 $4 i0H $i i0H $d -i0H$4O04 +i0H $4 O04 [ ^- i0h ^, i0h i0G u $S -i0G $S u i0g ^k i0g i35 -i0G ^D -i0g ^c -i0G ^A -i0g $! -i0F y1 i0F T4 i0f ^r i0F ^2 i0f .2 -} i0f +} ^f i0E Z1 i0e seu i0E p3 $e -i0@ ^E -i0e $^ -$^ i0e i0d $y [ i0d o5. i0d i3h i0d ^f -i0c $v i0C l $c i0C L3 -i0C $c l $+ i0C -i0c } -} i0c -i0bO52 i0b ^l -i0B ^K i0b ^d i0a ^v i0a r { -i0a p4 i0A o60 i0A o2. i0a i6a p4 -i0a ^H i0a ^g i0a ,8 y1 } i0a i09 i2y -i09 D2 -i09 ^0 i08 ^v [ i08 $7 -i08 } -i0% ^8 -i07 z1 -i07 ^2 -i07 } i07 ^@ -i0_ -7 i06 i6- i06 i58 -i06 ^0 i05 $Y i05 $e -i05 $7 i0 *50 Y4 -} i05 -$- i04 $r -i04 -8 [ i04 ^4 i04 *13 -i0. ^4 -i03 ^R i03 i81 i03 i4s i02 y1 -$. i02 i01 ^W -i01 u $4 -i01 $I i01 $4 u -i01 ^0 +i01 $I i01 $] -i01 $. ] i01 i00 z3 -i00O35^J -i0+ $# -i0+ -i0@ -i0. $. -i0? ^/ -i0_ ^@ -i0^ -$- i0. -^ i0= +i00 O35 ^J +^+ ^I $@ ] $i ^h z5 t $H Z3 y5 -{ ^h Z3 -$hZ2O32 +$h Z2 O32 $H Z2 ^H Z1 i2I $h Z1 +0 @@ -28288,12 +23842,11 @@ $H y5 Z3 ^H Y2 $h Y2 } ^h y2 -$hO52 -$hO32Z2 +$h O52 +$h O32 Z2 $h $v ^h ^v ^h u -^h t z5 $h t K $H $S $H $R @@ -28307,7 +23860,6 @@ $h o2z ^H o1S ^h o1k *12 ^h L1 -$h K t $h $k ^h ^j $H i81 @@ -28334,18 +23886,14 @@ $H $B ^h +7 ^h *67 ^h +6 -^h *52 -^h+4O31 +^h +4 O31 ^h *34 -[ ^H +2 ^H +2 ^h -2 ^H .1 -$h +0 Z1 $H +0 $* ^H $. ^H -[ ^H ^H $? $h $@ $h [ @@ -28355,13 +23903,11 @@ $h [ ^_ ^h $g Z3 Y4 $G Z2 -$G z1 Y1 -^g z1 ] -^g ] z1 -$g Y4 $G Y1 z1 +^g z1 ] +$g Y4 $G Y1 c -$gO61o3x +$g o3x O61 $g $x $g ^w $G $V p2 @@ -28378,10 +23924,8 @@ $g $r $G oB0 $g oAn ^G o8K -^g o6o ^g o54 ^g o5- -$go3xO61 $g o34 ^g o2k ^G ^O @@ -28411,7 +23955,6 @@ $g i11 $g i0M ^g i0K ^g i0I -^G i0A ^G $g *68 $G $g ^G ^g @@ -28421,7 +23964,6 @@ $g $f ^g D4 $G D3 ^g d [ -$G c Y1 ^g ^8 $G +6 u $g +6 @@ -28432,7 +23974,6 @@ $g $3 ^g .3 ^g ,3 $g +2 -^g +1 $q ^g *13 $G ^1 $g +1 @@ -28452,66 +23993,57 @@ $f Z4 ^F z3 $f Z1 $1 f Z1 ^* -f ^* Z1 ^F $z ^f ^z f y4 $1 -f Y3 *10 $f Y1 TB -fOA9t -fOA8 -fO98-7 -fO87 -fO85K -fO83] -f]O83 -fO82-6 -]fO7B -fO76 -fO72u -fO6B^1 -fO68*53 -fO67t -fO67 -{fO67 -}fO65 -fO64c -fO63$R -}fO5B -fO47E -$FO41 -fO37*20 -fO37+1 -$fO31 -^fO31 -fO23K -fO23$9 -fuO72 -f u i6G -ftOA9 -ftO67 +f OA9 t +f OA8 +f O98 -7 +f O87 +f O85 K +f O83 ] +f ] O83 +f O82 -6 +] f O7B +f O76 +f O72 u +f O6B ^1 +f O68 *53 +f O67 t +f O67 +{ f O67 +} f O65 +f O64 c +f $R O63 +} f O5B +f O47 E +$F O41 +f O37 *20 +f O37 +1 +$f O31 +^f O31 +f O23 K +f O23 $9 +f i6G u f t { -f { t f $s $S ^f s0q -^F ^S -f$RO63 f ^p f oB9 -f o8A '9 +f '9 o8A ^f o4s ^F o2o $f o0F $F $M $f L6 ^f ^L -fKO85 -fKO23 +f K O85 +f K O23 ^f K i2e f K +7 f K f iA. 'B -f i6G u ^f i6a y1 ^F i5g $f i4j @@ -28520,13 +24052,8 @@ $f i2p $f i2j ^f i2e K $f i27 -^f i1s -^f i0s $f i0p +7 -^F i0K ^F i0I -^f i0D -$f i0c ^f i05 $f $i ^f $h @@ -28534,51 +24061,35 @@ $f $i $F $G ^f ^G f f o0P -fEO47 f E D8 f E D6 -f E 'B +f 'B E ^f E -5 ^f d 'B -f D8 E -f D6 E -fcO64 -f^bO25 -f 'B E +f ^b O25 ^f ^B -f-AO72 +f -A O72 f ^a i1e f *A7 *02 ^f ^A ^f ^a -f$9O23 -f '9 o8A -f*96O34 +f *96 O34 f *8A -f-7O98 f +7 K $F ,7 -f-6O82 { f *67 -f *64 *20 +f *20 *64 ^f -5 E -f*53O68 f *53 -f *43 *20 +f *20 *43 $f *42 ^F $F $3 $f ^3 ^f $3 -f*20O37 -f *20 *64 -f *20 *43 ^f *20 ^F $2 $f -2 f $1 y4 -f+1O37 -f *10 Y3 -f *02 *A7 $$ ^F $@ ^F $. ^F @@ -28587,45 +24098,38 @@ $f $@ $f $= $* ^f $. $f -[ ^f ^f $+ -] ^E z5 ^E z5 ] -^E ] z5 ^E z5 -$$ E Z4 -$. E Z4 E Z3 ^K E z2 ^U E Z2 $* -] E z2 ^e z2 ^E Z1 k E z1 i1T ^e ^z -EY5O23 +E Y5 O23 E Y5 -EY4O32 +E Y4 O32 ^e y3 E y2 o0T $E Y2 D2 E y2 +6 E Y2 ^! E ^! Y2 -E Y1 *23 E y1 -EOA2 -EO71T7 -EO71T3 -EO61$$ -E$$O61 -$eO61 -EO51$6 -EO51 -EO42 -EO41 -EO32Y4 -EO21*21 +E OA2 +E O71 T7 +E T3 O71 +E O61 $$ +E $$ O61 +$e O61 +E O51 $6 +E O51 +E O42 +E O41 +E O32 Y4 +E O21 *21 ^e ^W ^e ^v k $E $U @@ -28637,12 +24141,9 @@ E T5 i46 E T5 -B E T4 ,7 E T4 *65 -ET3O71 E { T3 -E T2 $* E $* T2 E T1 *23 -E T1 ] E ] T1 E sr1 E sn1 @@ -28653,17 +24154,16 @@ E scI E sbB E s 7 E s3e $! -E $! s3e $E $s E ^R ^K $E $R E $r $E $r $e ^r -EqO48 +E q O48 $e ^q -Ep1O64 -$ep1O56 +E p1 O64 +$e p1 O56 ^e p1 c ^e ^P E ^O T2 @@ -28681,7 +24181,6 @@ $e o6p ^E o6* E o5Z K E o5Y ] -E ] o5Y ^e o55 E o4M E o4J @@ -28691,7 +24190,6 @@ E o49 E o3s E o3G ^E o2K -^E o1W E o1S z1 E o1S K E o1o +6 @@ -28706,20 +24204,16 @@ $E $M E $m ^e $m E $l $e -E ^K Z3 ^E k Z1 E K o5Z E K o1S E K $. -$+ $e k ^e ^J E iAb ^E i97 E i9@ E i9 E i7l -^e i7E -$. E i75 E i70 -6 E i7= ^E i68 @@ -28733,15 +24227,13 @@ E i4A E i4, ^e i3y E i3 -E i2 Z1 -Ei2rO91 +E i2 Z1 +E i2r O91 E i1y ,4 ^E i1g E i1! *81 ^e i10 -^E i1@ E i0e } -^e i06 E i05 z4 ^e ^g L2 ^e ^G @@ -28750,12 +24242,10 @@ E $D T6 E D8 ^e D5 E D4 +3 -^e D3 $E D2 Y2 E D2 $5 E d $" E d -E -B T5 E ^A o7# E ^A i1E E ] $A @@ -28765,43 +24255,30 @@ $e *96 E $. *94 E ^9 $4 $( E ^9 -E -8 T6 E } $8 E '8 E ^8 -E ,7 T4 -E *76 oB1 E $$ -7 E -7 $$ $} E +7 } E $7 $e $7 -E$6O51 -E +6 o1o -E -6 i70 -$e +6 *97 -E *65 T4 -E *64 *53 +E $6 O51 +E *53 *64 $@ $e *64 $e -6 -E .5 o7a E $5 D2 E *54 $@ E $@ *54 -E *53 *64 } $e *53 E +5 -E +3 D4 E $3 *32 E *32 $3 ^e *32 E +3 $$ E $$ +3 -E .2 T6 $e *26 ^e *25 -E *23 Y1 -E *23 T1 E $. ^2 E $2 E -2 @@ -28816,123 +24293,81 @@ $* [ E } ^E { E [ E $@ -[ $@ E $e [ ^e $* ^e $@ d $z L8 -$! d Z4 -d z3 *41 -dZ2O61 +p1 z3 *41 d Z2 .6 d $% Z2 -} ^d Z2 { $d Z2 ^d Z2 $d Z1 $d $z -dY3O04 -d y3 ,4 +d Y3 O04 d Y2 y2 -d y2 Y2 -d Y2 $d Y1 y1 -$d y1 Y1 -dY1O54 +d Y1 O54 ^d Y1 r $D Y1 } -^d y1 $d $y -d ^X u -dOB5 -dOB4O03 -dOB2,5 -dOA2-7 -dO92+1 -dO83*38 -^dO82 -dO67t -dO64o7B -dO64'A -dO61Z2 -dO61o65 -dO57t -dO57l -dO57 -dO54Y1 -dO53] -d]O53 -^DO52O03 -dO45O78 -dO43t -^dO31 -^dO24y2 -dO21t -dO14c -]dO14 -$ dO08 -$-dO05 -dO04Y3 -dO04p1 -dO04d -dO03-5 -dO02y4 -dO02i4k -dO01t +d OB5 +d OB4 O03 +d OB2 ,5 +d OA2 -7 +d O92 +1 +d O83 *38 +^d O82 +d O67 t +d O64 o7B +d O64 'A +d O61 o65 +d O57 t +d O57 +^D O52 O03 +d O45 O78 +d t O43 +^d O24 y2 +d O21 t +d O14 c +] d O14 +$ d O08 +$- d O05 +d O04 Y3 +d O03 -5 +d O02 i4k ^d $v -d u ^X -d u ^R d u o3O d u o11 d u i83 d u i6G d u i58 -d u D9 d u *AB d u ^A d u '9 d u *53 -d u *45 -d u *40 -d u -4 d u ^2 -d u -0 -dtO67 -dtO57 -dtO43 -dtO21 -dtO01 -d t $T +p1 $t t d t o77 d t o71 d t i85 d t i79 -d t i70 d t i6H d t i6G d t i51 -d t i5$ +d i5$ t d t ^G -d t D8 -d t 'B -d t ,B -d t ^A d t ^7 -d t *63 $D T5 T0 d T4 -d t -4 ^D T0 y5 -$D T0 T5 ^d ^T -d $s u -d $s t +p1 $s t $D s6. d s1! ^D s0C $d s0- -d^RO76 -d ^R u +d ^R O76 ^D R1 K ^d r +0 ^d r @@ -28943,191 +24378,136 @@ d $p ^F $d $p d oBo d oB. -doAfO06 -d o77 t -d o71 t +d oAf O06 d o6a $D o65 $? $d o65 -d o5s L4 +d L4 o5s d o5@ -d o3O u ^d o3a *13 d o2a d o1h [ -d o11 u $D o0p d o0O -d o0g +p1 o0g d $O d ] $O ] d $O d $n Y1 d $m u d ^M ^L -dlO57 -d l i71 +d i71 l d l 'B -d L7 ] -d ] L7 +p1 ] L7 ^d L7 -d l $7 -d l *63 -d L4 o5s -^D l } -^D } l -d l +p1 l $7 $d $l ^D K R1 d k ^d d K -B ^d $k +6 ^d k $0 -d [ ^K -d ] ^k d ^k ] -diB9O35 -d i9; +d iB9 O35 +p1 i9; d i9 -d i85 t -d i83 u d i7L d i7d -d i79 t -d i73 ] d ] i73 -d i71 l -d i70 t ^d i7@ -di6gO67 -d i6G u -d i5$ t +d i6g O67 d i5S ^D i5E $d i5D -d i58 u ^d i54 -d i51 t d i5- ^d i5- $D i4v -0 d i41 c ^d i3. -^d i1e ^D i1. -d i02 -^d i02 -d $h t +p1 $h t d $g Z1 $D $g ^d ^e -d D9 u -d D8 t -d D7 [ $d D5 -d D1 ] d ] D1 $d D1 d D0 i6o -dcO14 -d c i41 d $C ^c d c -6 $D $C d 'B y5 d $b u -d 'B t -d ,B t DB oA* DB o1s -d 'B l d -B K DB i6i DB D3 DB D1 -d*B9O06 +d *B9 O06 d +B +7 d *B6 +5 d $B ^d $B -DAY2O42 -DAO42Y2 -d ^A u -DA o9a ] +DA Y2 O42 +DA O42 Y2 DA ] o9a DA o5f -d *AB u -d*A2O61 +d *A2 O61 ^D ^A -d $a [ -d [ $a +p1 $a [ ^d ^a -d $9 Z1 -d '9 u -D9 s7I +p1 $9 Z1 D9 o9i D9 o9e D9 o7g -D9 o0V D9 i6 } D9 ^c D9 *72 $. D9 $. *72 D8 y2 D4 -D8OA1c -D8O6B -D8O61t -D8tO61 +D8 c OA1 +D8 O6B +D8 t O61 D8 R6 -D8 oAn D8 oA9 D8 o9* Y1 D8 o7k D8 o6u D8 o4@ D8 iBa -D8cOA1 D8 +6 *50 -D8 *50 +6 -d*84O06 +d *84 O06 D8 *40 $. D8 $. *40 $! D8 } D7 z4 D7 $z -d-7OA2 -D7O03$1 -d ^7 t +D7 O03 $1 D7 o9 D7 o6b D7 o3e D7 o0S D7 ^l +3 -d $7 l D7 i5j D7 i5 D7 i3y D7 $e u -D7 ^c -d +7 +B $d $/ *76 D7 *48 D1 D7 *40 $d *74 ^d *73 -D7$1O03 -d *71 *35 +D7 $1 O03 +p1 *53 *71 D7 $_ ^[ D7 d $7 -d ^6 z3 +p1 ^6 z3 $* D6 Z2 -d .6 Z2 -D6 Z1 -D6O94 +D6 O94 D6 ^v -D6 t [ -D6 t D6 scm D6 R5 D6 o7b @@ -29139,7 +24519,6 @@ D6 o0h D6 ^n D6 l $i ^d +6 $k -D6 $i l D6 i78 D6 i4q D6 i3s @@ -29155,16 +24534,11 @@ D6 ,6 D6 *54 d ,6 *54 D6 +5 -d *63 t -d *63 l D6 *35 -D6 ^2 D6 ] d ,6 -D5 Z5 t -d,5OB2 -D5O01+4 D5 t Z5 +D5 O01 +4 D5 saX u D5 r D5 p4 o5u @@ -29172,13 +24546,10 @@ D5 p2 [ D5 p1 '9 D5 o8k c D5 o7i p5 -D5 o6 +9 +D5 o6 +9 D5 o4x D5 o4f D5 o4D -D5 o3D -D5 o0T -D5 o0J D5 o0$ D5 K D5 $k @@ -29189,29 +24560,22 @@ D5 ^f D5 E z2 D5 d c D5 D7 ^i -D5 c z2 -D5 c o8k -d +5 *B6 D5 'A D5 $9 Z3 D5 $9 $4 D5 -8 y5 -D5 $7 D5 -6 D5 ^6 -d *53 u D5 ^$ $D -5 ^D ^5 d +5 D4 Z2 R4 $? D4 Z2 -D4y5O42 +D4 y5 O42 D4 y2 *60 D4 ^y -D4O21r -d -4 u -d -4 t +D4 O21 r D4 R4 Z2 { D4 r D4 p4 'A @@ -29219,33 +24583,23 @@ D4 p2 Y1 D4 o5e D4 o0U D4 ^m -D4 l f -$= D4 l +D4 f l D4 K Y4 D4 K } D4 i7s D4 i5. -D4 i3y -D4 i3S D4 i2i D1 -D4 $g -D4 f l -D4 $e -D4 ^e D4 ^c D4 ^A i0R D4 *71 D4 $? -7 D4 -7 $? -d *45 u D4 *42 *32 D4 +3 ^D *42 ^d *41 -d *40 u $? D4 ^d ^4 -D3 z4 u D3 Z2 -A D3 $? Z2 D3 ^y ^t @@ -29255,8 +24609,6 @@ D3 Y2 D3 y2 d -3 y2 D3 y1 *17 -D3 u z4 -D3 u y5 D3 sa@ D3 $R $1 D3 $Q @@ -29265,7 +24617,6 @@ D3 o4! D3 o2o D3 o2k $? D3 $? o2k -D3 o0f D3 $L D3 $k D3 i6c @@ -29275,10 +24626,8 @@ D3 i2d D3 ^f D3 $e D3 ^c -d *3A +p1 *3A D3 *74 -d *35 *71 -d *35 *17 D3 *26 $d *32 D3 *02 @@ -29293,9 +24642,7 @@ D2 y5 D2 y3 Y2 D2 Y2 y3 D2 y2 *24 -D2O73 -d ^2 u -D2 t [ +D2 O73 D2 sny D2 saj D2 [ p1 @@ -29314,22 +24661,15 @@ D2 i1r ^c D2 i12 D2 ^. i0, D2 $g -D2 ^f -D2 $e D2 D6 $1 -D2 ^d -D2 ^c $$ D2 c D2 } ^A -D2 ^8 D2 $7 D2 *53 D2 *20 D2 $1 D6 -D2 -0 i4p D2 $) [ D2 $/ -D2 [ $) $? D2 ^D -2 ^_ D2 @@ -29343,10 +24683,8 @@ D1 y4 c D1 y3 D1 y2 $& D1 $& y2 -d+1O92 -D1O32 +D1 O32 D1 $v -[ D1 t D1 p2 ] D1 o7p *35 D1 o5# Z1 @@ -29363,37 +24701,25 @@ D1 C D1 $c D1 $a Y1 D1 *90 -d *17 *35 ^# D1 +7 D1 $6 D1 *54 +5 -D1 *35 o7p D1 $+ ] D1 ^D -1 -d ] $1 +p1 ] $1 D0 y3 D9 -D0 y3 +4 -D0 Y3 -D0O92[ -d -0 u +[ y3 +4 +D0 O92 [ D0 ^s ,3 -D0 r p1 D0 r i5a -D0 p1 r D0 o9v D0 ^@ o43 D0 o4 -^d $0 k D0 i5r -$D -0 i4v -D0 i2t D0 E ^T D0 D3 *46 -D0 c $/ -D0 $/ c -d *01 ^d -D0 -0 +[ c $/ ^D $* $d { $. $d @@ -29401,17 +24727,13 @@ $- $d $_ $d $ d ] d $" -$cZ3O46 +$c Z3 O46 c $* Z3 c Z2 s5% C Z2 *47 C Z2 } -$= C Z2 C z1 ^e -c Z1 *32 -$. C Z1 -$* c Z1 -CY5O18 +C Y5 O18 ^C Y5 $C y5 ^c Y4 y1 @@ -29421,36 +24743,29 @@ $c y4 $H ^c Y3 c Y2 $z C Y2 $# -$. C Y2 ] C Y2 ^c y1 Y4 C Y1 $A -C Y1 .6 c y1 ,3 -$^ C Y1 ^C Y1 -$) c Y1 C $X Z2 c $x T5 -cOB1 -cOA4 -$!cO83 -$cO82 -cO73o5R -CO63^1 -cO63^@ -cO51z2 -cO51 -$cO46Z3 -cO41o33 -CO34f -cO34 -^cO32 -cO24p4 -$!cO21 -cO12o21 -CO04 -{$cO04 +c OB1 +c OA4 +$c O82 +c O73 o5R +C O63 ^1 +c O63 ^@ +c O51 z2 +c O51 +$c O46 Z3 +c O41 o33 +c O34 +^c O32 +c O24 p4 +c O12 o21 +C O04 +{ $c O04 $c ^x $c ^W R8 ^c ^W @@ -29462,9 +24777,8 @@ c } T8 ] C T7 c T5 $x C T5 $+ -C $+ T5 -c T4 R3 -c T4 o3A +c R3 T4 +c o3A T4 C T4 *50 C T4 *03 c T4 { @@ -29483,21 +24797,16 @@ c sio c sia C shW c sa@ +9 -$c s9A p3 -c s5% Z2 +$c p3 s9A ^C s2s C s1) c s1* ^c r i3n c RB ] -c ] RB c R5 R4 -c R4 R5 -c R3 T4 ^c r ^c $Q C $P $O -$c p3 s9A $* c ^P C oB2 $C oAJ @@ -29515,38 +24824,28 @@ $C o6W c o6k c o5Y c o5X -co5RO73 C o5R c o5R c o4P c o4F C o41 -^c o3t c o3r -c o3A T4 -C o3a k -co33O41 +C k o3a ^C o2x $c o2v c o2K c o2b -^C o2# c o2 -^C o1r -^c o1i C o1E ^C o1C *30 $c o1b C o14 -c o11 ] c ] o11 $c o0s $C o0A -$c o01 $c $n c $c ^n C ^l y2 -C k o3a $c k ^j c K i3r C K $@ @@ -29559,16 +24858,13 @@ c i9 c i8r $4 c i8n $C i8L -ci7_O31 +c i7_ O31 c i7r -$! c i7r $c i6y $c i6s c i6p c i6n +B -C i61 ^C i5y -] c i5h c i5E C i5# c i4v @@ -29583,22 +24879,18 @@ C [ i2B ^C i2- c i1y Y4 ^c i1k -^C i0I $c $H y4 -CfO64 +C f O64 $C $e ^C $e -CdO07 -CdO05 +C d O07 +C d O05 ^C d f c $d *74 -$. c D6 C D4 c D2 ] c ] D2 -$$ c D2 } c ^D -$c c $n C $B Z1 c ,B C ^A z2 @@ -29607,27 +24899,22 @@ C +A C 'A ^C $A C ] $a -$c ^9 t c +9 sa@ c $. -9 c -9 $. c +8 Z5 c *87 $? c $? *87 -c *86 T3 C *86 $1 $@ c *86 c *74 $d $C .7 -C .6 Y1 ^c *65 ^D c *65 $! c $! *65 c ^5 T5 c .5 K $- c *57 -c *52 ssv -C *50 T4 $. c ,5 ] c ^5 [ c ^5 @@ -29640,10 +24927,7 @@ c .4 $% c ^4 $- $c *36 c *32 Z1 -] C *32 -^C *30 o1C $$ c .3 -C *23 C ^2 $c $2 $c .2 @@ -29654,10 +24938,8 @@ C $1 *86 c .1 ^2 C ,1 ^C $1 -c $1 ^c ,1 c -0 ^A -C *03 T4 $c *03 *05 ^c ^0 $C $! @@ -29666,44 +24948,35 @@ $$ ^C ^_ ^C $* ^c $. $c -$. c $_ $c { $c ] ^c } -[ c $/ -[ $/ c ^c $- ^B z4 'B z1 E -B Z1 -} $B z1 ^b Y2 $b Y1 *05 -^B y1 ] ^B ] y1 ] ^b y1 ^B ^Y -,BO72$! -,B$!O72 -,BO64 -.BO62 -^bO62 -'BO41u -^BO13 -^BO08 +,B O72 $! +,B $! O72 +,B O64 +.B O62 +^b O62 +'B O41 u +^B O13 +^B O08 $b ^w ^b ^w ^B ^V -'BuO41 $B $U ^b ^U +B t -B t ] -^b ^S T1 -^b ^s $b r $b p5 { -$b { p5 +B p3 ^B p2 i1g ^b ^P @@ -29719,7 +24992,6 @@ $b o1w $b o0f ^B $o ^b ^L -} ^b l ^b ^K +B iB. 'B i9s @@ -29735,17 +25007,13 @@ $b i3j $B i2W l ^b i1w $b i1k -^b i1f $b i0S -^B i0K -^B i01 ] ^B ] i01 $b $i ^b $i ^B ^g ^b ^G $b $g [ -$b [ $g ^b ^g $B ^e ^b D5 @@ -29754,16 +25022,16 @@ $b D2 { ^b ^D $b $d ^b ^c -*BAO56 +*BA O56 'B ^A ^B +A $B $a -*B8O64 -$b*85O51 +*B8 O64 +$b *85 O51 $. *B8 $b -7 } ^B ^6 -*B5O64 +*B5 O64 $b ^3 ^A $b *20 ^B ^1 @@ -29806,18 +25074,17 @@ $A y3 -A Y2 $a Y1 E ^A y1 -^aO71 -^aO61K -.AO61 -^aO54 -^AO42 -^aO42 -^AO12 -$aO01 +^a O71 +^a O61 K +.A O61 +^a O54 +^A O42 +^a O42 +^A O12 $A $W ^A ^u k $a u i59 -$a u i1F +$a i1F u $a $u ,A t K ^a t i0m @@ -29867,19 +25134,15 @@ $A o3! $A o19 $A o12 'A o0z -$A o0c -$a o02 ^A $O ^a $M y3 $A l ^D ^a L7 -^aKO61 -,A K t +^a K O61 $a K $A iAM $a iAm $A i95 -'A i8 *0B 'A i8 $a i7V ,A i7_ @@ -29890,9 +25153,7 @@ $A i61 p2 $A i61 ^a i5t 'A i5" o5n -+A i5l $a i5i p2 -$a i59 u ^a i4o $A i4m $A i4g @@ -29904,17 +25165,15 @@ $a i3q $a i3n ^A i3. ^a i3/ -^Ai2oO61 +^A i2o O61 ^A i2f $A i1n ^a i1J E -$a i1F u ^A i1$ ^A i0p $a i0P ^a i0p $A i0M -^A i0B ^A i03 ^A i02 ^a i01 @@ -29922,7 +25181,6 @@ $A i0M $a E Y1 ^A ^E ^A $e -^A D8 o38 ^a D8 *31 $a D8 'A D6 @@ -29940,18 +25198,15 @@ $A *B7 ,A $b $A *A8 $A +A -*A9 i60 *A9 D6 D8 ^a .9 +9 *A9 $- *A9 ^( -*A9 $@ ,A ,9 ^A +9 ^a .9 *A8 oAc *A8 DA ,4 -*A8 ,4 DA $A .8 *A7 *89 $A *76 @@ -29961,37 +25216,28 @@ $A *76 ^a -7 *A6 D5 *A6 +A -*A6 *97 ] $a *64 $a ,6 -^a *57 o40 -^a *56 +4 +^a +4 *56 $A ,5 ,6 -$A -5 *14 +$A *14 -5 $a *50 $A ,5 *A4 t ^a *47 ^a *46 -^a +4 *56 *A4 ] $A +4 ^A +4 ^A -4 ^A ^4 ^a *37 i0p -^A *32 o1y -$a *31 t -^a *31 D8 -$A *31 D5 ^a ^2 D5 *A2 '8 *70 -*A2 *70 '8 [ $A *24 *A2 ] .1 *A2 .1 ] 'A ^2 -$A *14 -5 +A $1 $A -1 -A $1 @@ -30008,7 +25254,6 @@ $! -A $, $A $ $A } ] ^A -} ^A ] { $A 'A $ ,A $* @@ -30021,7 +25266,6 @@ $a $, $a $` $/ $a $? ^a -] ^a ^* $a ^. ^a ^ ^a @@ -30032,19 +25276,18 @@ $9 Z1 +7 ^9 z1 $9 $Z $9 y5 Z1 -'9 y4 t +'9 t y4 +9 Y4 E $9 y3 -+9Y2O83 ++9 Y2 O83 -9 Y2 $9 Y1 $x '9 Y1 $p -$9O92 -^9O54^d -$9O41 -$9O31 -$9O24c -'9 t y4 +$9 O92 +^9 O54 ^d +$9 O41 +$9 O31 +$9 O24 c $9 TB $9 T7 K $9 $T @@ -30082,21 +25325,16 @@ $9 i1- $9 ^G +9 E Y4 -9 E -5 -,9 E $@ ,9 $@ E -'9dO57 +'9 d O57 ^9 D5 -9 D4 $@ -9 $@ D4 $9 D2 $9 $D -$9cO24 -,9 C s92 -*9B 'B *79 *9B *79 'B +9 +A Z1 -*9AO82 -*9A i60 +*9A O82 +9 ^A -9 'A $9 $a @@ -30112,23 +25350,21 @@ $9 *95 *98 [ $9 $8 $9 +7 Z1 -*97 u K *97 K u *97 K *97 'A -9 *79 *97 *85 *69 -*97 *69 *85 +9 $7 $9 .7 $@ *97 $, *97 .9 +7 -9 $7 -*96O85 -*96O82 -*96O42 -*95O06$3 +*96 O85 +*96 O82 +*96 O42 +*95 O06 $3 *95 o99 *95 o92 *95 i93 @@ -30136,16 +25372,14 @@ $, *97 *95 *84 ^9 *56 d *95 +5 -*95$3O06 +*95 $3 O06 -9 -4 ^9 .3 *02 -*92O42+7 +*92 O42 +7 ,9 $2 -^9 ,1 o4& ^9 *14 ^9 ,1 ^9 ^@ *07 -^9 *02 .3 +9 $0 ^9 $0 +9 $+ @@ -30168,17 +25402,16 @@ $ $9 ^. { .9 $8 Z4 $8 Z3 +0 -^8 Z2 z1 -^8 z2 ^8 z1 Z2 -^8z1O45 +^8 z2 +^8 z1 O45 ^8 Z1 *27 ,8 ^z -+8Y5O32 ++8 Y5 O32 $8 Y5 -8 Y4 $8 Y3 y2 -,8 Y3 u +,8 u Y3 -8 Y3 $! +8 y3 $8 y2 Y3 @@ -30191,12 +25424,9 @@ $8 Y2 C -8 Y1 C $8 Y1 *43 +8 $y -+8O91 -^8O31 -$8O05 ++8 O91 +$8 O05 ^8 $v -,8 u Y3 -$8 t Y2 -8 t K $8 T9 .8 t *68 @@ -30219,7 +25449,6 @@ $8 o6* '8 o5v -8 o5o $8 o4y -,8 o4s +8 o4- ^8 o4_ '8 o34 @@ -30229,9 +25458,7 @@ $8 o23 $8 o0d -8 o0b $8 o0! -$8 l y2 ^8 ^l --8 K t $8 k $1 $8 $K ,8 K @@ -30239,7 +25466,7 @@ $8 k [ $8 i98 +8 i8e -8 i8A --8i7.O15 +-8 i7. O15 +8 i7/ '8 i6 Y2 ,8 i6s @@ -30249,13 +25476,10 @@ $8 i5t -8 i5 -8 i4m $8 i3x -'8 i2W '8 i2 -8 i2- $8 i1l ^8 i14 *34 -^8 i1/ -^8 i1! +8 i0K $8 i0a z1 ^8 ^I @@ -30269,17 +25493,14 @@ $8 ^E $8 D5 +8 D3 -8 D1 Y1 -$8 C Y2 --8 C Y1 $8 ^C -8 c $? --8 $? c *8B D8 +8 $b $8 $b $8 ^b -*8AO34$. -*8A$.O34 +*8A O34 $. +*8A $. O34 *8A E +8 $A *89 o1i @@ -30287,65 +25508,50 @@ $ .8 *96 +8 $8 $8 .8 *87 Y3 t -*87O71$4 -*87 t Y3 +*87 O71 $4 *87 o7i *87 o57 --8 *78 *69 -*87$4O71 +-8 *69 *78 +*87 $4 O71 *87 *46 ,8 *73 $. ,8 $. *73 -8 *71 $. -8 $. *71 $8 ^7 -*86 Z1 z1 -*86 z1 Z1 -*86Y4O23 +*86 Y4 O23 +8 +6 Y2 -*86 Y1 y1 -*86 y1 Y1 -*86O74i5a -*86O23Y4 +*86 O74 i5a +*86 O23 Y4 *86 ^m *86 ^k $% *86 i72 *86 c *97 -$@ *86 c *86 ^a -A -*86 *97 c --8 *69 *78 -.8 *68 t *86 *38 p4 -*86*34O01 +*86 *34 O01 +8 .6 $$ *86 ^@ *86 -*85O63*41 -*85O52 +*85 *41 O63 +*85 O52 *85 o5% -8 *56 *76 -*85*41O63 $! -8 ,5 $- *85 { ,8 ,5 -8 $! .5 -8 .5 $! $8 *43 Y1 -*83O24 +*83 O24 *83 o0S -8 *31 ,8 *30 -8 *30 -*82 E *41 *82 *41 E $8 ^2 -*81 o7M -*81 o0W -$8 $1 k +8 *12 $8 .1 -$8 +0 Z3 *80 '8 ^* *80 +8 [ @@ -30368,11 +25574,9 @@ $ .8 ^7 z3 y3 ^7 z2 ^7 z1 u -,7 z1 p2 $7 Z1 D2 -$ ^7 Z1 ^7 $z -.7y5O64 +.7 y5 O64 $7 Y5 '7 y5 $7 y4 @@ -30380,27 +25584,23 @@ $7 y4 ,7 } Y3 -7 Y2 +7 Y1 Y4 -+7 Y1 k +7 Y1 $9 } '7 y1 -.7 } y1 --7O81 -$7O72 -$7O63 -$7O52 -^7O51,1 -+7O51 -$7O46$7 --7O42 -{$7O24 -+7O21o0F -.7O05 -^7 u z1 +-7 O81 +$7 O72 +$7 O63 +$7 O52 +^7 O51 ,1 ++7 O51 +$7 O46 $7 +-7 O42 +{ $7 O24 ++7 O21 o0F +.7 O05 .7 u -7 $u $7 t T1 $7 T3 -$7 T1 t +7 srk .7 sh@ -7 sDS @@ -30412,14 +25612,13 @@ $7 $R $7 ^R $7 $q ,7 p5 o8r --7p1O06 +-7 p1 O06 .7 o9. .7 o9^ ,7 o9 -7 o84 ^7 o73 } $7 o7 -.7 o6x $7 o6l +7 o68 -7 o5N @@ -30433,24 +25632,19 @@ $7 o5_ $7 o3_ +7 o2z +7 o2w --7 o2K +7 o2h $7 o1@ +7 o0w $7 o0w ^7 o0u +2 --7 o0R +7 o0m +7 o0K -+7o0FO21 -7 o0d -+7 ^n $7 ^n ^7 $M $7 ^m $7 $L -7 $L -+7 k Y1 .7 K o4r $7 ^k ,7 k @@ -30466,7 +25660,6 @@ $7 i82 -7 i74 +7 i6t +7 i6I .6 --7 i6G ^7 i68 '7 i67 -7 i6. @@ -30484,8 +25677,6 @@ $7 i5- $7 i45 C -7 i4- $7 i3j *03 -'7 i3F -+7 i3? $7 i2r '7 i2q '7 i2f @@ -30494,19 +25685,14 @@ $7 i1w '7 i1i '7 i11 [ $7 i08 -^7 i06 --7 i0/ .7 ^F $7 E ,3 .7 E $3 ,7 E $3 $} +7 E -} $7 E ^7 d k +7 D4 +2 $7 D2 Z1 -.7 c i4b -$7 C i45 $7 c *14 $7 c -0 $7 C @@ -30518,37 +25704,31 @@ $7 ^A .7 $A -7 ^A -7 ^a -*79O52 -*79O43 -*79 *A6 +*79 O52 +*79 O43 *79 *98 $! *79 $! *98 .7 *97 *79 +6 *79 -4 *79 } [ -$$*78O42 -*78 o3b +$$ *78 O42 *78 o3a *78 o2i *78 i73 *59 *78 $c -*78 -$7$7O46 +$7 $7 O46 +7 *75 ,7 *75 -7 *74 +7 $7 -7 $7 -^7 ^7 *76 Y2 t *76 Y2 E ,7 +6 Y2 -*76O02-6 -*76 t Y2 +*76 O02 -6 *76 o7. *76 o4. *24 -*76 o05 *76 i6@ *76 E Y2 *76 DB @@ -30559,15 +25739,13 @@ $7$7O46 *76 *57 r *76 $. ,1 *76 ,1 $. -,7 *60 *76 $ -7 +6 -*75O72 +*75 O72 *75 o5g *75 o4@ *75 i5b *75 D9 -*75 $7 [ *75 [ $7 -7 *57 *75 +6 @@ -30576,20 +25754,15 @@ $7$7O46 $7 $5 -2 -7 *52 ^7 $5 -*74O43$_ -*74$_O43 +*74 O43 $_ +*74 $_ O43 *74 so -*74 o5w *74 i4_ *74 ,2 *74 $@ -*73O42 +*73 O42 *73 o5d -*73 o1G *73 $i -$7 ,3 E -.7 $3 E -,7 $3 E *73 ^a +A *73 $A *73 -7 @@ -30599,11 +25772,7 @@ $7 ,3 E ,7 *30 *07 $ *73 *72 o6e -*72 o1f -^7 +2 o0u *72 i5c c -+7 +2 D4 -*72 c i5c *72 *63 $7 -2 $5 { *72 *36 @@ -30613,21 +25782,16 @@ $7 -2 $5 $7 +2 $7 $2 $7 ^2 -^7,1O51 -*71O21] -*71]O21 +*71 O21 ] +*71 ] O21 *71 o1f *71 o0b -$7 *14 c -*71 *06 *71 } -*70}O41 -*70 o6H +*70 } O41 *70 o62 *70 o3p *70 L7 D4 -*70D9O32 -+7 *05 +2 +*70 D9 O32 ,7 .0 -0 ,7 $0 $7 $# @@ -30653,7 +25817,7 @@ $* ,6 Z1 ,6 y5 u +6 y5 t +6 [ y5 --6 Y4 t +-6 t Y4 $6 y4 t ,6 Y3 E ,6 Y3 c @@ -30670,20 +25834,15 @@ $6 Y1 $# +6 y1 .6 y1 ^6 y1 -.6O73$a -$6O43 --6O42 -+6O31 --6O03 -+6 u Z2 -,6 u y5 +.6 O73 $a +$6 O43 +-6 O42 ++6 O31 +-6 O03 +6 u +6 -+6 t y5 --6 t Y4 -$6 t y4 -6 t oBO ,6 t d -+6 t *78 ++6 *78 t .6 T5 +6 $t .6 s x @@ -30692,7 +25851,6 @@ $6 t y4 '6 r p1 +6 r f -6 p2 ] -'6 p1 r ^6 p1 +6 o8! $6 o8 @@ -30704,7 +25862,6 @@ $6 o8 $6 o5D $6 o5- -6 o4z -'6 o4V $6 o4u $6 o4i $6 o38 @@ -30712,7 +25869,6 @@ $6 o38 +6 o2w -6 o27 $* -6 $* o27 --6 o2( ^6 o1i ,6 o1- +6 o0x @@ -30722,7 +25878,6 @@ $6 o0w +6 o0L -6 ^N ,6 $m --6 l Z2 $6 $L +6 $l +6 k D4 @@ -30731,11 +25886,8 @@ $6 i8 $6 i6z $6 i6e Z2 ,6 i6e --6 i64 ,6 i62 ,6 i6. --6 i5s -+6 i5a +6 i4@ .6 i4? -6 i4 @@ -30761,12 +25913,9 @@ $6 $E .6 ^E -6 ^E -6 ^e -,6 d t -6 D7 $6 D6 -^6 D6 -6 D4 ^R -+6 D4 k $6 D4 .9 -6 D3 Y2 ,6 c Y3 @@ -30775,7 +25924,7 @@ $6 D4 .9 ,6 c -6 $c $6 ^B -.6$aO73 +.6 $a O73 *6A *04 ^6 ^A .6 $a @@ -30784,22 +25933,17 @@ $6 ^B *69 o91 *69 o6u E *69 E o6u -*69 D7 u *69 D7 $! *69 .6 +9 .6 $9 *68 Y1 o5@ *68 R4 -*68 o7% *68 o7. *68 o5@ Y1 -*68 o0q *68 ^N *68 ^g *86 -*68 c *79 *68 +8 -*68 *79 c ,6 *87 $. ,6 $. *87 +6 *86 @@ -30809,21 +25953,15 @@ $6 $8 $_ *68 *67 Z2 ^b *67 Y1 -*67O81-4 -*67 o5B +*67 O81 -4 *67 o2[ -*67 i74 -*67 ^b Z2 -+6 *78 t *67 *78 *67 .5 .6 *75 $. .6 $. *75 -*67-4O81 *67 *32 .6 *71 +6 -7 } -*67 $ .6 -7 -6 ] $7 ^6 ,7 @@ -30831,42 +25969,28 @@ $_ *68 $6 ^6 r .6 *63 *65 Y3 i4- -*65O41 +*65 O41 *65 u $S -*65 $S u -{ *65 o75 -*65 o6@ *65 o5- *65 o0q *65 o0N *65 o0f -*65 i64 *65 i5d *65 i4- Y3 *65 i4_ p2 -*65 i4M *65 i4e .6 .5 ^g *65 E $1 +6 *56 y3 -*65 *47 -+6 *53 } -6 *52 -*65 $1 E -6 *51 -*65 +0 +6 $5 $6 -5 { *65 } *64 Y5 -*64 t p1 -*64 p1 t -*64 o7f *64 o4L *64 o3c *64 o2w -*64 o0Q -*64 o0q *64 i7u *64 i7s *64 i4@ @@ -30874,11 +25998,9 @@ $@ *64 $e *64 $a *12 ] *64 $a *64 '8 -.6*47O71 -{ *64 *73 -*64 *57 *34 -*64 *45 +.6 *47 O71 *64 *34 *57 +*64 *45 [ *64 -2 *64 *12 $a *64 +1 @@ -30891,7 +26013,6 @@ $@ *64 $e *63 T4 *63 p5 +0 *63 o73 -*63 o1n *63 i0m $6 -3 E *63 ,8 @@ -30901,23 +26022,19 @@ $6 -3 E } ,6 -3 -6 $3 +6 .2 Y2 -*62O51 +*62 O51 *62 t p1 -*62 p1 t -*62 o5R *62 i2w *62 *57 +7 *62 *56 .6 *21 .6 *20 Y1 +6 +2 -*62 $6 $2 $6 ^2 $! -6 -2 .6 ^2 ^6 $2 -*61 Z5 Z4 *61 Z4 Z5 *61 Z1 *61 ^t @@ -30933,7 +26050,7 @@ $! -6 -2 +6 -1 ,6 +1 -6 +1 -*60O53 +*60 O53 *60 t [ *60 o0C *60 i4@ ] @@ -30942,8 +26059,7 @@ $! -6 -2 *60 i3j *60 i3h *60 i0z *15 -*60*80O61 -,6 *06 -1 +*60 *80 O61 +6 +0 +6 ^0 ^@ *60 @@ -30975,7 +26091,6 @@ $$ -5 Z2 +5 Z1 $* ,5 Z1 +5 y5 E -'5 y5 E ^5 y5 ,5 Y4 E +5 Y4 @@ -30984,17 +26099,16 @@ $* ,5 Z1 ] -5 Y2 $5 y2 -5 y2 -$5Y1O03 -$5OB2E -$5O72 -$5O62 -,5O61 -^5O61 -^5O31 -^5O21 -$5O03Y1 -+5O02*03 -$5O01E +$5 Y1 O03 +$5 OB2 E +$5 O72 +$5 O62 +,5 O61 +^5 O31 +^5 O21 +$5 O03 Y1 ++5 O02 *03 +$5 O01 E .5 ^w o1g ^5 $W C $5 $W @@ -31005,7 +26119,6 @@ $5 $W ,5 t *79 .5 t .6 -5 T3 T2 --5 T2 T3 $5 T2 *20 $5 T1 -5 T0 o22 @@ -31014,7 +26127,6 @@ $5 T1 ,5 srL -5 seG .5 se3 --5 s8. Y3 ^5 s6f $5 s-5 ^5 ^S @@ -31025,7 +26137,7 @@ $5 s-5 +5 $r +5 $Q .5 p1 Z2 -.5p1O03 +.5 p1 O03 +5 ^p { $5 oB2 ,5 o82 @@ -31035,16 +26147,12 @@ $5 oB2 ,5 o7a +5 o6k $5 o6h -$! -5 o6E -+5 o67 -^5 o64 $5 o5g $5 o53 +5 o47 +5 o3z $5 o3t ,5 o3s -.5 o3d +5 o37 .5 o33 +5 o3_ @@ -31052,7 +26160,6 @@ $5 o3t +5 o2v $5 o2s *46 $5 o2a --5 o22 T0 +5 o22 ^5 o1f $5 o1e @@ -31084,7 +26191,7 @@ $5 i57 ,5 i54 +5 i53 ^5 i5 --5i4zO24 +-5 i4z O24 $5 i4v $5 i3z $5 i3w @@ -31093,7 +26200,6 @@ $5 i3w .5 i3a -6 .5 i3. -9 -5 i3/ -^5 i3- '5 i2s p1 $5 i2i -5 i2d @@ -31101,25 +26207,19 @@ $5 i2i $5 $g '5 E y5 ,5 E Y4 -$5EOB2 +5 E i7n +5 ^e -.5 d Z2 -5 ^d z1 -$5dO02 +$5 d O02 +5 D3 +5 $D $5 $D -5 d -^5 C z2 -^5 C $W +5 C *75 +5 c *65 -+5 C .6 ++5 .6 C $5 C $2 -$. ,5 c .5 c $* -.5 $* c ^5 ^c +5 ^B $5 $B @@ -31127,12 +26227,10 @@ $5 ^b *5A D5 $5 $a *34 ,5 $a -*59O52 +*59 O52 *59 u *59 T0 K -*59 l K *59 K T0 -*59 K l $5 -9 *89 *59 -5 +5 ] $9 @@ -31141,20 +26239,16 @@ $5 -9 *89 $5 $8 p2 *58 ^p *58 o6s -*58 l *95 -*58 ^a *58 *95 l +*58 ^a +5 ^. *80 -$! ,5 -8 -{ ,5 ,8 ,5 +8 $@ ,5 $@ +8 *57 y5 o0h -*57O25'8 +*57 O25 '8 *57 ^U *57 t r *57 T4 [ -*57 r t *57 o64 *57 o5m *57 o5B @@ -31163,20 +26257,14 @@ $! ,5 -8 *57 o2l *57 o0p *57 o0g -+5 ,7 l *57 i8u *57 $h *57 $e *57 ^d -$- *57 c -,5 *79 t *57 $8 $4 -*57 *74 +3 -*57 +7 ] -*57 ] +7 -+5 *75 C --5*73O41 *57 +3 *74 +*57 ] +7 +-5 *73 O41 *57 $3 +5 { *72 *57 $2 @@ -31188,26 +26276,16 @@ $+ *57 -5 $* -7 -5 -7 $* *56 y5 -*56 Y2 l -*56O32 -.5 .6 t +*56 O32 *56 s08 -*56 o6o *56 o0w -*56 l Y2 *56 L0 *56 i7. *56 i6s -*56 i64 -*56 i5% -+5 .6 C --5 *68 l -+5 *65 c -*56 *47 $. *56 *41 *56 *28 $! *56 *23 -+5 *61 *42 ++5 *42 *61 $5 *60 c *56 *02 +5 *60 @@ -31221,25 +26299,18 @@ $5 *52 [ *54 z5 t *54 Y3 $3 *54 ] Y2 -$@*54O01 -*54 t z5 +$@ *54 O01 *54 o4i -*54 o2t *54 o2g -*54 o1k *54 o1g *54 i2- *54 -9 -5 *54 +7 -$5 *46 o2s *54 *67 -+5 *46 *50 *54 *64 ] *54 ] *64 -5 *46 -*54 -5 -9 *54 *41 -+5 *42 *61 *54 [ *24 *54 ,2 ,5 *42 @@ -31263,42 +26334,30 @@ $$ *54 *53 *59 $5 *34 Z2 $5 *34 $a -*53 *46 *53 +4 .5 *31 .3 +5 *31 *53 $* *53 [ $5 $3 -$. *53 $, *53 ,5 .3 *52 z1 -*52 y4 l -*52O51o4_ +*52 o4_ O51 *52 [ ^s *52 p3 'B -*52 o7r -*52o4_O51 *52 o4u *52 o2A *52 o0g p5 -*52 l y4 -$5 $2 C *52 +7 -} *52 -6 --5 ,2 *53 -*52 *51 -3 -*52 *40 .1 -*52 ,4 *52 -3 *51 -*52 ,1 *51 *52 .1 *40 +*52 ,4 +*52 ,1 *51 $5 [ *20 $+ *52 *51 $S r -*51 o1u ,3 -*51 o0Z +*51 ,3 o1u *51 o0C *51 i6k *51 i6# @@ -31307,32 +26366,24 @@ $+ *52 *51 -5 ,5 *15 *51 *42 --5 ,1 -4 -*51 ,3 o1u -*51 *37 +5 *51 *30 k *51 *23 $5 *12 $ *51 $1 $5 $1 -5 -0 Z2 -*50O31 -+5 .0 u +*50 O31 *50 ^t *50 t -*50 sao *32 +*50 *32 sao *50 s0c -*50 o5n *50 o51 *50 o2x r *50 o2q *50 ^j *50 *86 *50 *72 -+5 *05 o7x ,5 *05 -*50 *32 sao -*50 +2 $5 $0 ,5 +0 +5 $* @@ -31348,7 +26399,7 @@ $ $5 ^5 ^. } ^* -5 ^@ $5 -.4 z5 t +.4 t z5 $ +4 Z4 ^4 z4 +4 Z3 o5Q @@ -31357,10 +26408,9 @@ $ +4 Z4 ,4 Z2 y4 ^4 z2 -4 Z1 -6 -+4 Y5 u ++4 u Y5 +4 Y5 +4 y5 -,4 y4 Z2 $4 Y4 t -4 y4 [ +4 Y3 E @@ -31372,21 +26422,16 @@ $4 y3 +4 Y1 *54 ,4 Y1 { +4 y1 -$4O91 -$4O81t -+4O63 -$4O62 -^4O52y1 -$4O32 --4O02*07 --4O01p2 +$4 O91 +$4 O81 t ++4 O63 +$4 O62 +^4 O52 y1 +$4 O32 +-4 O02 *07 +-4 O01 p2 $4 ^w p5 -+4 u Y5 -4 u d -.4 t z5 -$4 t Y4 -+4 t Y2 -$4tO81 ^4 t ^0 $4 ss2 -4 skT @@ -31396,7 +26441,7 @@ $4 ss2 $4 p5 i6- $4 p4 $0 '4 p2 Z1 -$4 o8 c +$4 o8 c +4 o8a ^4 o7Z ,4 o7k @@ -31409,7 +26454,6 @@ $4 o5y +4 o56 +4 o54 +4 o5< -^4 o4@ +4 o3q -4 o3o ,4 o2r @@ -31421,7 +26465,6 @@ $4 o1y -4 o1@ D3 .4 o0S $4 o0p -$4 o0m -4 o0f +4 $n -4 $M *31 @@ -31440,7 +26483,7 @@ $4 iA3 $4 i9# $4 i79 ^4 i7- --4i6@O13 +-4 i6@ O13 ^4 i64 ,4 i5u ^4 i5s @@ -31458,7 +26501,6 @@ $4 i4s +4 i3v ^4 i3s -4 i3n -,4 i3e +4 i2s d $4 i2S -4 i2h @@ -31471,11 +26513,9 @@ $4 i0p +4 E Y3 $4 E o6L $4 E *76 -.4dO04 --4 d u +.4 d O04 +4 d E ,4 d c --4 D3 o1@ $4 D3 ,4 D2 y5 $4 D2 @@ -31488,48 +26528,42 @@ $4 -A +4 $a [ +4 ^a $4 *96 --4$8O71 -*48O21[ +-4 $8 O71 +*48 O21 [ *48 ^a *A8 -4 -8 -*47O51 -*47O42 +*47 O51 +*47 O42 *47 o4t +7 *47 o3b *02 *47 i7c *47 D6 -*47 +7 o4t *47 *76 -*47 ,7 -$4 *76 E +4 *75 *47 [ *25 *47 *14 *47 *03 } -*47 *02 o3b +4 +7 +4 ,7 +4 -7 .4 $7 *46 Z2 -4 -6 Z1 -*46O12 +*46 O12 *46 swL *46 slt *46 sAQ *46 o7d *46 o7a *46 o5q -*46 o4L *46 o1u -*46 i2k *46 ,6 i0R *46 *36 [ +4 ,6 *45 Y5 -*45Y3O01 +*45 Y3 O01 *45 [ y3 -*45O01Y3 +*45 O01 Y3 *45 o7d *45 o6a *45 o4s @@ -31537,53 +26571,38 @@ $4 *76 E *45 K +4 +5 i5s *45 i36 -*45 i1j *45 ^h .4 *57 Z1 *45 *53 $@ *45 .5 -+4 *54 Y1 ,4 *54 -*45 *32 +4 *52 -*45 *13 *45 } $4 $5 -{ ,4 -5 -[ } *45 .4 -5 ^/ *45 [ -4 *47 -4 *43 .2 +4 +4 $@ +4 $@ +4 -*43 Z4 Z3 *43 Z4 Y3 -*43 Z3 Z4 ,4 ,3 Z3 $- *43 Z2 *43 y5 c -] *43 Y3 *43 y2 *78 -$.*43O52 *43 $s [ *43 r *43 $q *43 ^o D4 *43 o7h -*43 o6b *43 o5b *43 o3R *43 o3k *43 o2o *43 o13 *43 o0y -.4 .3 k -*43 i7p -*43 i2u *43 i2a -*43 i0e -*43dO06 +*43 d O06 *43 -2 -4 *31 $M [ *43 +1 @@ -31596,18 +26615,13 @@ $+ *43 *42 o3w *42 o2g ^t *42 o1w -*42 o1@ -*42 o0J ,6 +*42 ,6 o0J *42 o0d c -$4 $2 l *42 ^J $f *42 ^J *42 D7 .2 -*42 ,6 o0J -*42 *43 $@ *42 *40 *42 +4 -*42 .2 D7 *42 *25 r *42 *06 *42 *03 @@ -31618,41 +26632,33 @@ $@ *42 *40 ,4 $2 -4 .2 -4 -2 -*41O12 +*41 O12 *41 u p1 -*41 p1 u *41 o6m K *41 o5 -*41 o4- +4 .1 o2y *41 o2@ *41 i6_ -*41 i3l *41 $h *41 ^g *41 ^a z2 -$. *41 *56 $@ *41 ] +4 $1 .4 $1 ,4 +1 ,4 ^1 ^4 +1 -*40 y5 u -*40O62D0 -*40O42 *40 u y5 -^4 ^0 t +*40 O62 D0 +*40 O42 *40 R0 -*40p1O02 +*40 p1 O02 *40 o6- *40 o4z *40 k $A *40 K *13 -*40 i71 *40 i36 *40 i2y -*40 i0L *40 $. ^d *40 ^c *40 $A k @@ -31684,15 +26690,15 @@ $, -4 ^@ -4 ^( $4 ^. $4 -+3Z4O54 ++3 Z4 O54 ,3 Z1 t ,3 Z1 C $3 ^Z -3 Y5 u .3 y5 u --3 y5 t +-3 t y5 .3 Y5 ,A -.3Y4O43 +.3 Y4 O43 -3 Y4 T0 +3 y4 -3 y4 @@ -31704,26 +26710,21 @@ $3 Y2 $ +3 Y1 $3 y1 ^3 y1 } -$3OA6 -$3O62 -+3O54Z4 -+3O51*04 -^3O51 -^3O26q -$3O25 -+3O02^p +$3 OA6 +$3 O62 ++3 O54 Z4 ++3 O51 *04 +^3 O51 +^3 O26 q +$3 O25 ++3 O02 ^p -3 $v --3 u Y5 -.3 u y5 ^3 u $5 -,3 t Z1 --3 t y5 ^3 T8 ^3 T5 -3 T0 Y4 -3 srj +3 seu -.3 sAZ +3 s6e .3 s3r +3 s39 @@ -31744,16 +26745,13 @@ $3 o5B -3 o45 +3 o40 ^3 o3n --3 o2x -3 o2r ,3 o2f -.3 o1Z +3 o1y +1 +3 o1e -3 o1b ,3 o1a +3 o0v -$3 o0T ,3 o0M p3 .3 o0M -3 o0F @@ -31763,13 +26761,11 @@ $3 ^M -3 l ,2 $3 L0 +3 ^k y1 -.3 k o4m .3 k *23 +3 k +3 ^j $3 i8% $3 i7a -6 --3 i79 $3 i7@ $3 i7. ,3 i7. @@ -31778,8 +26774,7 @@ $3 i5W .3 i48 +3 i46 ,3 i4* --3 i4 --3 i2i c +-3 c i2i -3 i22 ^3 i20 $3 i1x @@ -31787,18 +26782,14 @@ $3 i1x ^3 i1m $3 i1a +3 i15 -^3 i10 -3 i1. --3 i0s -,3 i0l +^s -4 ,3 i0i -+3 i0, $3 i0< --3 i0@ $3 ^i +3 ^h -3 ^g -,3fO68 +,3 f O68 $3 $F C -3 E D1 $3 E .2 @@ -31807,20 +26798,15 @@ $3 E .2 +3 D5 -3 D2 *89 ^3 D2 --3 D1 E ^3 d -,3 C Z1 .3 ^c u --3 c i2i -$3 C $F +3 C *42 ,3 c $4 -$$ .3 c -*3AO03 +*3A O03 $3 ^A .3 $A ,3 ^9 y5 -*38^wO52 +*38 ^w O52 .3 .8 p3 *38 ,4 $3 $8 @@ -31832,55 +26818,40 @@ $3 ^8 *37 o7@ *37 o6o *37 o2w -$. *37 k -3 $7 $e *37 ^a *37 *74 -*37 *62 t *37 *53 -3 *75 -3 -7 *41 ,3 *71 +3 +3 -7 $% *37 -*36 t *36 sAs -*36 o4? -{ *36 o4* *36 o2g *36 o0N *36 k -$3 -6 i7a *36 E *47 $- *36 $c -{ *36 *72 ,3 +6 ,7 *36 *64 *36 ,6 -*36 *54 *20 -*36 *54 -*36 *47 E *36 *20 *54 -*36*03O02 -} -3 ,6 +*36 *03 O02 ,3 ^6 -3 ,6 *35 Y2 *35 u -^3 $5 u -*35rO21 -*35 p1 { +*35 r O21 *35 { p1 *35 o4k -*35 o31 *35 o0A *35 i63 -*35 i5t *35 i4i *35 i2- $3 *56 $3 *54 -$3*53O23 +$3 *53 O23 ,3 *53 *35 *15 $0 *35 $0 *15 @@ -31890,38 +26861,29 @@ $3*53O23 *35 ] [ $3 .5 .3 +5 -*34 Z3 Y4 *34 Z3 *26 -*34Y5O12 -*34Y1O04 +*34 Y5 O12 +*34 Y1 O04 -3 $4 Y1 -*34O04Y1 +*34 O04 Y1 *34 ^w *34 stw *34 s3S *34 p1 -5 *34 o4V *34 o4u -*34 o3y *34 i4p *34 i4. *34 i2w -,3 $4 c *34 $A -+3 *47 +2 ++3 +2 *47 *34 } *71 -*34 ,6 *32 *34 *32 ,6 -+3 *42 C *34 *26 Z3 *34 *24 i4j *34 .2 --3 *41 -7 +3 *40 i44 -{ *34 -.3 -3 o5g .3 -3 D1 -,3 +3 *71 .3 *37 ,3 *30 k ^3 .3 @@ -31930,85 +26892,66 @@ $3 .5 *32 $. y4 *32 Y2 *32 $t -*32 o7s *32 o4x *32 o3s ] *32 o2h *32 o0l --3 ,2 l *32 k i0s *32 i12 -$3 .2 E -,3 $2 E -*32 C ] -] *32 C *32 $b *32 ^7 k -3 *27 ^3 *25 *13 -+3 +2 *47 *32 *47 *32 *46 ,3 *24 -.3 *23 k *32 -1 +3 .2 $3 +2 ,3 -2 -3 +2 ^* *32 -*31 y5 c -*31O21 -*31O02 +*31 O21 +*31 O02 *31 u o51 *31 smb *31 sit $+ *31 p5 -*31 o51 u *31 o3d { *31 o32 -*31 o2l D4 +*31 D4 o2l *31 o1u *31 o1e -*31 o0j -*31 i6l *31 i44 -*31 i3P *31 i1l *31 i1e *31 i0@ -*31 D4 o2l *31 $A *31 *86 *31 -7 *31 { *43 -^3 *13 *25 ,3 *12 +3 +1 *31 $! *30 ^Z y1 *30 z1 *30 y2 -*30O32y2 +*30 O32 y2 *30 o5t *30 o59 -*30 o4- *30 o2r *30 o2k *30 o0B *30 ^l *30 K *02 -*30 i4- *30 i4 *30 i3i *30 i03 *30 E i4S *30 D0 *30 $9 -+3*04O51 ,3 *04 *30 ,3 *52 -*30 .3 ] *30 *26 ,3 *02 *30 *02 K @@ -32023,19 +26966,18 @@ $- $3 $_ .3 $ ^3 } ^3 -] ^3 +^3 ] ,3 $* ,3 $. ,3 $! ^3 $. ^3 } ^% ^3 } -^3 ] ^! ^! -3 ^- ^3 $2 Z4 +2 ^ z4 -$2Z2O23 +$2 Z2 O23 ^2 Z2 $2 z1 *51 +2 Z1 .3 @@ -32045,24 +26987,21 @@ $2 ^Z ,2 Y5 t +2 Y3 y3 +2 y3 Y3 -+2y3O73 -+2 Y3 s8, ++2 y3 O73 ++2 s8, Y3 +2 y3 ,4 -2 Y2 f .2 Y2 *68 ,2 y2 ^2 y1 $n -.2 Y1 +7 ^2 Y1 $! -^2 Y1 } -^2O73y1 -^2O71 -$2O52y2 -$2O51 --2O32 -$2O23Z2 -,2O02o58 -$2O01 +^2 O73 y1 +^2 O71 +$2 O52 y2 +$2 O51 +-2 O32 +$2 O23 Z2 +,2 O02 o58 +2 ^v y1 $2 $V +2 $v @@ -32071,14 +27010,12 @@ $2 u i13 +2 u *51 ^2 u ^0 -2 ^u -,2 t Y5 -,2 t p4 +,2 p4 t .2 t d +2 T8 $2 T5 -2 smq -2 s9/ -+2 s8, Y3 -2 s8* .2 s5! $* -2 ^S @@ -32089,24 +27026,18 @@ $* -2 ^S ^2 ^r +2 ^q -2 $q -,2 ^P u -,2 p4 t $2 p2 Z1 -,2p2O0B +,2 p2 O0B $2 p2 o82 ,2 p1 c .2 $P ^2 o8Y $2 o8o -+2 o7t $2 o7B +2 o7b $2 o6v $2 o6_ -^2 o6@ -.2 o5l $2 o5e --2 o4v .2 o4c -2 o3w $2 o3k @@ -32122,12 +27053,10 @@ $2 o2@ ^2 o16 .2 o0z +2 o0v -,2 o0p +2 o0G $2 o0G .2 o0g +2 o0@ -^2 $n y1 $2 $N +2 l i98 .2 l D4 @@ -32137,40 +27066,30 @@ $2 $N $2 $J +2 $j $2 ^j -+2 i98 l +2 i92 ^2 i8d $2 i7i $2 i7b ,2 i72 --2 i72 -2 i62 ^2 i5- --2 i4t +2 i4p +2 i4@ -^2 i3z -2 i3w ^s ,2 i3_ ,2 i2w $2 i2t ,2 i2c $2 i2_ --2 i1v -2 i1j -$2 i13 u +2 i11 -^2 i11 ^2 i0M -2 i0k -$2 i0E +2 ^h $2 $h -+2fO26 ++2 f O26 +2 $f -.2 d t $2 D6 -.2 D4 l $2 D3 $2 D2 -2 D1 $2 @@ -32183,49 +27102,38 @@ $2 $9 *28 -5 [ $2 *85 .2 +7 Y1 -*27O62t -*27O53 -*27tO62 -*27 o5y *62 +*27 t O62 +*27 O53 +*27 *62 o5y *27 o4b *27 o2b *27 ^a *34 *27 $. .8 *27 .6 ^g -*27 *62 o5y +2 *76 *20 *27 *24 -2 *70 *27 { .2 -7 .2 ^7 -*26O13 -*26 u d +*26 O13 *26 i7. -*26 d u *26 C *26 +7 *26 +5 r -[ -2 *64 -] *26 *30 +2 -6 $2 -6 -$! -2 -6 *25 Z2 o0t *25 y5 -*25 y4 l -*25O41^n +*25 O41 ^n *25 r -*25 o6f *25 o5- *25 o4c *25 o0t Z2 -*25 l y4 *25 k ^a *25 i3w -*25i3fO62 +*25 i3f O62 *25 D0 } -*25 d { *25 { d *25 ^c *25 $a *23 @@ -32237,17 +27145,14 @@ $! -2 -6 *25 *23 $a +2 *52 ,2 *52 -+2 *51 u } *25 *05 -+2 *50 +2 +5 -*25 .2 ^5 -2 $@ ,5 -2 ,5 $@ *24 z2 Y5 *24 Y5 z2 -*24O42c +*24 c O42 *24 u [ *24 s7% *24 o4b @@ -32255,46 +27160,28 @@ $! -2 -6 *24 o0k *24 k i18 *24 i6r -*24 i4u *24 i0e o0u *24 ^G *24 d { -*24 { d -*24cO42 *24 c $* -*24 $* c [ *24 $A *24 ^a -[ *24 ] -[ ] *24 -*23 Z1 .3 -+2 .3 Z1 -*23 Y1 E -*23O42 +*23 .3 Z1 +*23 O42 *23 $v *23 p4 o5 -*23 o7s *23 o7q *23 o4a -*23 o3% *23 o1f *23 o0T *23 o0d ^k *23 i4u *23 i4n *23 i41 -*23 E Y1 -*23 C -] *23 C -*23 *75 -2 *36 -$! *23 *56 -*23 *54 *23 +5 -*23 *42 *23 *41 k ,2 *34 -*23 .3 Z1 *23 *30 i03 *23 -2 y4 *23 *21 @@ -32304,45 +27191,30 @@ $! *23 *56 +2 +3 .1 *23 .1 ,2 *31 -*23 *04 *15 *23 ^* .2 +3 --2 $3 [ -2 [ $3 -2 $2 D1 $2 *24 .2 *21 -+2 *20 *76 $2 ^2 -2 $? -2 -2 -2 $? -[ *21 Z2 *21 y2 u -*21 u y2 *21 t -6 *21 t -0 *21 $R -*21 o5y *21 o3p -*21 o3c *21 o22 -*21 o0v -*21 o0p *21 o0A *32 -*21 K *21 ^k *21 ^i ^q -*21 i4f *21 i3. -,2 *17 *21 -6 t +2 *16 -*21 *41 *23 -*21 *32 o0A -*21 $3 *02 -+2 .1 +3 -*21 *26 *21 *23 *41 +*21 $3 *02 +*21 *26 *21 -1 *21 -0 t *21 *02 $3 @@ -32357,13 +27229,11 @@ $2 ^2 *20 y2 Y3 *20 y2 $! *20 $! y2 -*20O43 -*20O35 +*20 O43 +*20 O35 *20 u -1 -^2 ^0 u *20 sAX *20 o5v *24 -*20 o5T *20 o44 *20 o4_ *20 o3s @@ -32380,11 +27250,8 @@ $2 ^2 *20 $7 *20 .7 .2 *05 -*20 ,3 c *20 -3 -*20 *24 o5v *20 -1 u -+2 .0 *20 $$ ^_ *20 +2 $/ @@ -32402,7 +27269,6 @@ $= +2 ^1 $ Z3 ^1 z3 -1 Z2 z2 --1 z2 Z2 $1 Z2 D3 $1 Z2 ^, +1 z2 @@ -32413,7 +27279,7 @@ $1 Y5 t ] ^1 y5 ,1 y4 t +1 y4 -$1y3O28 +$1 y3 O28 -1 y3 $B .1 y2 ^_ $1 Y1 @@ -32421,32 +27287,27 @@ $1 $Y +1 ^y -1 $y -1 ^y -$1OB2D8 -$1O8Ac -.1O82 -,1O51,3 -^1O51 -$1O46 -+1O42 -+1O32i3b -.1O25$1 -$1O21u -$1O03 +$1 OB2 D8 +$1 O8A c +.1 O82 +,1 O51 ,3 +^1 O51 +$1 O46 ++1 O42 ++1 O32 i3b +.1 O25 $1 +$1 u O21 +$1 O03 +1 $x +1 ^x -,1 ^W +1 ^w -1 ^v -$1uO21 +1 u p3 $1 u p1 +1 u *13 -$1 t Y5 -,1 t y4 -1 t p2 $1 T6 $5 ^1 T6 -^1 T2 $1 T0 $1 s Y .1 sna @@ -32458,14 +27319,11 @@ $1 s8/ ^1 R6 -1 ^R $5 ^1 p5 T4 -,1p3O19 -+1 p3 u -+1 p3 l --1 p2 t +,1 p3 O19 ++1 l p3 +1 p2 ] .1 p1 Y3 -+1p1O04 -$1 p1 u ++1 p1 O04 -1 p1 c ^1 $P ^1 ^P @@ -32480,7 +27338,6 @@ $1 o6x $1 o5x $1 o5l $1 o5e -^1 o5e -1 o4x $1 o4v $1 o4c @@ -32491,7 +27348,6 @@ $1 o3n +1 o3@ $1 o3& -1 o3- ] --1 ] o3- ^1 o3$ $1 o2u $1 o2l @@ -32506,11 +27362,9 @@ $1 o0R $1 $O -1 ^o +1 ^M -+1 l p3 +1 l ,4 +1 l *21 -1 ^l -^1 k s1- .1 k +1 $j Z1 $1 ^j ^b @@ -32521,14 +27375,12 @@ $1 i9* $1 i8f $1 i86 $1 i7Y l -.1 i72 $1 i7, -1 i7. $1 i6% -^1 i5X ^1 i5u $1 i5- -$1i4sO06 +$1 i4s O06 $1 i4f ^1 i4= ^1 i3r p5 @@ -32541,22 +27393,16 @@ $1 i1i ,1 i1i $1 i1D $1 i1a -.1 i17 -^1 i12 ,1 i1_ $1 i09 $1 i0+ ^1 ^G .1 ^f *60 ,1 E ] -,1 ] E ^1 ^E -.1 d Y3 -1 d Y3 $1 D3 Z2 $1 D0 ,3 -$1cO8A -+1 ^C s2E ,1 c .6 ^1 $C -1 $B y3 @@ -32564,38 +27410,28 @@ $1 $b +1 ^A -1 $A +1 ^a -[*19O63 +[ *19 O63 *19 *80 -,1 *98 $ $1 *96 -*18O24k -*18kO24 +*18 k O24 $1 *81 ^1 -8 -*17 o6b +1 -7 K *17 .6 ,1 -7 .6 $1 ,7 { *17 -*16 o8@ *16 o2q *16 o2j -+1 ,6 o2_ -*16 o0# -,1 .6 c *16 *07 +1 +6 .1 .6 -$1 $5 T6 *15 p1 -*15 o4l *15 o48 *15 i5j *15 i3x *15 *52 *41 *15 +4 d -*15 *41 *52 *15 .3 -1 *53 *15 ,2 @@ -32609,44 +27445,33 @@ $ $1 *51 { *15 ,1 ,5 *14 $Z -*14O51k +*14 k O51 *14 $v *14 s1. -*14 o6. *14 o0w *14 o0T -$1 +4 o0s -+1 ,4 l -*14kO51 *14 c *14 *75 +1 +4 *35 *14 *31 *12 -[ +1 *43 +1 $4 $1 +4 ] $1 +4 *13 $z *10 *13 y5 E *13 y4 -,1,3O51 *13 o3z -*13 o0l *13 i73 *13 i55 *13 i3x -*13 i3P *13 i2l *13 i1- *13 D7 $. *13 $. D7 *13 *97 *13 ^6 -+1 *35 +4 -*13 +4 *15 -$1 *34 $1 -*13 *21 *13 *15 +4 +$1 *34 $1 ,1 +3 *12 *13 *10 $z ^1 *30 @@ -32656,7 +27481,6 @@ $. *13 *12 y2 Z1 *12 Y2 *41 *12 ^u -4 -*12 srg *12 ^s *12 ^p *12 o7x @@ -32665,44 +27489,31 @@ $. *13 *12 o34 *12 o2y *12 o2u -*12 o2g *12 K d -*12 k *12 i5f -*12 i4f *12 i49 -*12 i2j *12 i1y u -*12 i0H *12 *86 *12 *56 *12 *41 Y2 $1 *24 *12 ,3 *12 ^2 -$1*21O02 -+1 *21 l +$1 *21 O02 *12 *15 +1 { *21 *12 $. -.1$1O25 -+1 *13 u -$1 $1 *34 +.1 $1 O25 .1 *13 -,1 *12 +3 *10 y3 ^5 *10 Y1 ^f *10 u o1S *10 $t ^q *10 o5b *10 o42 -*10 o1S u -*10 ^f Y1 $1 *05 c -,1 *05 ^1 *04 *30 +1 +0 -*10 { $1 +0 $! ^1 ^0 .1 +0 @@ -32720,18 +27531,15 @@ $, ^1 ^# $1 ^, ^1 ^ ^1 -^` $1 -0 Z5 Y5 ^0 z5 y1 } +0 z5 -+0Z4O63 ++0 Z4 O63 $0 Z3 D5 } -0 z2 ^0 z2 +0 z1 C -$ -0 Z1 +0 ^z -.0 ^z ^0 ^z $0 y5 Y1 $0 y5 t @@ -32740,33 +27548,29 @@ $0 y5 t -0 y4 t $0 Y4 +0 Y3 y2 -+0y3O01 ++0 y3 O01 +0 y3 +0 $0 y3 -0 y3 +0 y2 Y3 .0 Y2 E +0 Y2 -^0 y1 z5 $0 Y1 y5 -$0Y1O71 +$0 Y1 O71 $0 Y1 $_ .0 ^y -$0O71Y1 -+0O63Z4 -$0O54E -+0O34$A -$0O32y5 -+0O32 +$0 O71 Y1 ++0 O63 Z4 +$0 O54 E ++0 O34 $A +$0 O32 y5 ++0 O32 +0 ^w $0 $! ^w .0 ^w +0 $v -0 $v ^0 ^v -$0 t y5 --0 t y5 --0 t y4 -0 t .3 .0 ^t -0 ss1 @@ -32784,17 +27588,14 @@ $0 ^Q +0 ^p -0 o7D K +0 o77 -+0 o7+ +0 o6o u ^0 o6i +0 --0 o6d -0 o6_ .0 o4t +0 $0 o4O -0 o4b +0 o4= $0 o4@ -+0 o3v +0 o3s -0 o3p $0 o3D @@ -32839,74 +27640,58 @@ $0 i30 -0 i2o -0 i2l -0 i2g -[ +0 i28 +0 i1R C -^$ -0 i13 ^0 i0s -.0 i0f -0 ^i +0 ^H .0 E Y2 -$0EO54 +0 E $0 ^E -$& +0 $e -$0dO42 +$0 d O42 -0 ^D i0F $0 D5 Z3 +0 ^d -+0 C i1R -0 c $7 $0 ^B -0 ^B -*0AO75+2 -+0$AO34 +*0A O75 +2 ++0 $A O34 -0 ^a o4o -*0A+2O75 *09 o0c *09 -9 +0 *97 -+0*91O46 ++0 *91 O46 -0 ^9 *08 o2. *28 $0 ^8 *07 snv *61 *07 r *07 o6e -*07 o4u -*07 i8R -*07 c $1 --0 $7 c -*07 ,8 D3 -*07 *61 snv -*07 *52 *03 -$0*73O45 -*07 +2 *07 $1 c -*07 *12 } +*07 ,8 D3 *07 *03 *52 +$0 *73 O45 +*07 +2 +*07 *12 } +0 ,7 ^. *07 -*06 z2 Z1 -*06 Z1 z2 -*06O12 +*06 O12 $@ *06 $q -*06 o1p *65 +*06 *65 o1p *06 i6a *06 i41 *06 i0s *06 ^a -*06 *65 o1p *06 +6 *06 *54 *06 *50 $0 -6 *05 Z2 $! *05 z1 -*05Y5O23 -*05Y1O31 -*05O52 -*05O31Y1 +*05 Y5 O23 +*05 Y1 O31 +*05 O52 +*05 O31 Y1 *05 sSn *05 o7f *05 o78 @@ -32915,12 +27700,9 @@ $0 -6 *05 o2j *05 o2b *05 o0z -$! *05 i7@ *05 i3s *05 D6 -0 *56 -*05 -4 +2 -*05 *34 -2 *05 +2 -4 *05 -2 *34 +0 +5 $* @@ -32930,53 +27712,36 @@ $! *05 i7@ -0 $5 ^& *05 *04 y5 t -*04 t y5 *04 t *04 ^S *04 o5h *04 o4_ -*04 o3 scx +*04 o3 scx *04 o34 *04 o0k -*04 i71 *04 i3X *04 i2f -*04 E .3 -*04 ^6 -+0 *45 *04 .3 E +*04 ^6 ^0 $4 *03 Y5 ] -*03Y4O31 -*03O31Y4 +*03 Y4 O31 +*03 O31 Y4 *03 ^t --0 .3 t *03 s4$ -*03 s1- -*03 p1 Y4 *03 p1 ] -*03 o5f -*03 o0w *03 o0r -*03 o0! --0 .3 l *03 i7- -*03 i5 *03 i2y -*03 D3 C *03 C D3 *03 $c *03 ^c -*03 c *03 -A *03 $a -*03 *67 ,3 -*03 *54 *32 *03 ,3 *67 *03 *32 *54 *03 *27 *37 *03 -1 -.0 *31 +0 $3 $0 ,3 *02 $w ^f @@ -32987,7 +27752,6 @@ $0 ,3 *02 o4z *02 o3j *02 o3f -] *02 o3_ *02 o2v *02 o1o *02 ^l @@ -32997,7 +27761,6 @@ $0 ,3 *02 i4- [ *02 i3k *02 ^f -*02 D3 c *02 c D3 $0 ^2 C *02 *50 i10 @@ -33012,26 +27775,20 @@ $0 $2 $ *02 .0 ,2 { -0 ^2 -*01Y4O52 +*01 Y4 O52 *01 Y2 -4 -$.*01O32 -*01O21^S +*01 O21 ^S *01 ^p $A *01 o3T *01 o32 -*01 ^K *01 i1u *01 i1b *01 i0j *01 $h -$! *01 D3 *01 ^7 *01 -4 Y2 *01 } *04 -+0 +1 ^0 $1 -^0 +0 o6i -.0 +0 o4t -0 *01 ^k +0 +0 +0 $_ @@ -33041,7 +27798,6 @@ $@ $0 $) +0 } -0 { $0 -] ^0 .0 -0 $* ^0 $, @@ -33064,9 +27820,7 @@ $< $> ] [ ] ^_ } ^+ ^# -^+ ^# ^@ -^* $* ^$ $# ^. ^, ^! ^? @@ -33076,17 +27830,13 @@ $< $> ^> ^< ^< ] $> ^Z Z5 Y2 -$zZ5O16 +$z Z5 O16 $Z Z5 t -^Z Z4 Z3 $z Z4 Z2 ^z z4 Y4 -^Z Z4 Y3 -$z Z4 y1 +$z y1 Z4 ^z z4 -^Z Z3 Z4 $Z z3 $g -$z Z2 Z4 $z z2 *05 $z z2 ^0 ^z z1 Y3 @@ -33099,7 +27849,7 @@ $Z Z1 $. $Z Z1 $Z ^Y oB! ^z $y D1 -^zy5O64 +^z y5 O64 ^z Y4 z4 ^z Y4 $b ^Z Y4 @@ -33111,35 +27861,31 @@ $z Y3 ^z } y3 ^z y3 ^Z Y2 Z5 -$z y2 Z1 ^z y2 k $z y2 -$z y1 Z4 $Z Y1 o0j $Z Y1 i8G -$z y1 -8 $z Y1 *21 ^z y1 ^Z ^Y $Z $X Y2 -$ZOB3 -$ZOA1 +$Z OB3 +$Z OA1 $z $x $9 -$zO73 -^zO72 -^zO71 -^zO69 -$zO61 -^zO52sm` -^zO52 -$zO43 -$zO34 -$zO24 -$zO18y3 -$zO16Z5 -^zO13$/ -^z$/O13 -^_$zO02 +$z O73 +^z O72 +^z O71 +^z O69 +$z O61 +^z O52 sm` +^z O52 +$z O43 +$z O34 +$z O24 +$z O18 y3 +$z O16 Z5 +^z O13 $/ +^z $/ O13 $z ^X ^z ^X ^z ^x @@ -33149,25 +27895,21 @@ $z $w ^z u *8A $z u *64 $z u -0 -$Z t Z5 $z t ^a -$Z T4 o0A +$Z o0A T4 $Z ^T $z sPf *95 -^zsm`O52 -$Z sG& r +$Z r sG& [ $z sdy ^Z scz q ^Z saz $z s74 ^z s71 ^z ^s $7 -$z s38 i3w +$z i3w s38 ^z ^S -$Z r sG& $z ^r ^z r ^& -^Z q scz ^z $q ^z ^q $z o9Z @@ -33191,18 +27933,15 @@ $z o2q $z o0W ^z o0u i3! $z o0k -$Z o0j Y1 -$Z o0A T4 $z ^M $z $m -$z $l k +$z k $l $z L8 ^Z l $7 ^z L6 *05 ^Z l ^3 $z L1 ^z L1 -$z k $l ^z K -8 $Z $K $z K $! @@ -33223,165 +27962,128 @@ $z i5q ^z i5p $z i53 $Z i3z -$z i3w s38 -^z i3! o0u $z i3i ^Z i3B $Z i3a ^z i2z -4 ^Z i2u -^z i1u ] ^z ] i1u $z i1p -^Z i1M +^M ^Z ^Z i1L ^Z i1i ^Z i1b ^Z i0K $Z i0i -^z i0c $z ^i ^z $i -$Z $g z3 ^z ^g *31 ^Z ^F $z $f ^Z ^E T2 ^Z d E -$z D9 o6l $z D5 $z D2 -^z D1 $y ^Z ^D } $z ^D $Z $C $M ^Z ^C $z $c $z ^b -^Z*A1O23 +^Z *A1 O23 ^Z $a -[ ^z ^a ^z *98 $z *96 -$z *95 sPf $Z -9 $z $9 $z -9 ^z +9 -^z *8A u ^z *81 $z ,8 -^Z $7 l $Z *79 $! $Z $! *79 $z *76 ^z -7 *02 -^Z -6 i7_ ^z $6 *56 -$z *64 u $z *64 $z .6 -Z5 ^Z Z4 -Z5 Z5 Y2 +Z5 Z4 ^Z Z5 Z5 y2 z5 z5 r Z5 Z5 i51 -Z5 Z4 ^Z Z5 z4 Y5 -Z5 z4 Y3 -Z5z4O56 +Z5 Y3 z4 +Z5 z4 O56 Z5 Z4 s3 Z5 Z4 o2V z5 z4 +6 z5 Z4 ^5 -$ Z5 Z4 +$ Z4 Y5 $ Z5 z4 -z5 z4 ] z5 ] z4 z5 Z3 t z5 Z3 sCM -$% Z5 Z3 +$% Z4 Y4 ] Z5 Z3 z5 Z2 i3. Z5 Z2 *60 Z5 Z2 .6 -Z5 Z2 *43 z5 { Z2 } z5 z2 Z5 Z1 s6R -Z5 $/ Z1 ^* z5 z1 -Z5 Y5 z4 -Z5 Y5 Y4 -Z5 Y5 .3 -Z5 Y5 { -z5 y5 Z5 Y4 Y5 -z5Y4O35 -Z5Y4O19 -Z5 Y4 T3 +Z5 Y5 { +z5 Y4 O35 Z5 Y4 *56 -Z5 Y3 z4 -Z5y3O52 +Z5 y3 O52 Z5 Y3 ^6 Z5 Y3 *32 Z5 Y3 -$! Z5 Y3 -Z5 Y2 Z5 -Z5 y2 Z5 z5 Y2 Y2 -Z5 Y2 *34 -$; Z5 Y2 z5 Y1 -3 Z5 { Y1 $ Z5 Y1 -$* z5 y1 Z5 $x $D -z5OB1t -Z5O98$5 -Z5O97c -z5O92z5 -z5O91u -Z5O87 -Z5O84 -Z5O65$A -Z5O65 -z5O64z1 -Z5O63o99 -Z5O58i5f -$ Z5O52 -z5O46z3 -z5O46t -Z5O46o7A -z5O45o0B -Z5O42 -Z5O41+2 -Z5O39 -Z5O37 -z5O35Y4 -z5O29*51 -z5O26$* -z5$*O26 -z5O23T8 -z5O23$a -Z5O23 -Z5O19Y4 -z5O17$* -z5$*O17 -Z5O16i87 -z5O04 +z5 OB1 t +Z5 O98 $5 +Z5 O97 c +z5 O92 z5 +z5 O91 u +Z5 O87 +Z5 O84 +Z5 O65 $A +Z5 O65 +Z5 O63 o99 +Z5 O58 i5f +$ Z5 O52 +z5 O46 z3 +z5 O46 t +Z5 O46 o7A +z5 o0B O45 +Z5 O42 +Z5 O41 +2 +Z5 O39 +Z5 O37 +z5 O35 Y4 +z5 O29 *51 +z5 O26 $* +z5 $* O26 +z5 O23 T8 +z5 O23 $a +Z5 O23 +Z5 O19 Y4 +z5 O17 $* +z5 $* O17 +Z5 O16 i87 Z5 $x { -z5uO91 -Z5 u ^N -Z5 u ^J +Z5 ^N u +Z5 ^J u Z5 u i85 z5 u +7 z5 u *69 Z5 u *65 ] Z5 u -z5 t Z3 -z5tOB1 -z5tO46 Z5 t sOU Z5 t o77 Z5 t o5L @@ -33391,67 +28093,43 @@ Z5 t .2 Z5 $T z5 $S s5G z5 sp8 t -z5 sCM Z3 -Z5 s6R Z1 -z5 s5G $S -Z5 s3 Z4 -Z5 s1o Z5 r o8R Z5 $r o8J Z5 RB oAS Z5 r '9 Z5 R1 i4t z5 $p .5 -Z5p1O6A +Z5 p1 O6A z5 $o u -Z5 oAS RB Z5 oA. Z5 o9S Z5 o8J $r -Z5 o77 t -Z5 o63 -A +Z5 -A o63 Z5 o60 -Z5o5%O13 +Z5 o5% O13 Z5 o56 Z5 o4@ Z5 o3x *61 -Z5 o2V Z4 z5 o2v Z5 } o1R Z5 o0L z5 o0E D7 -z5o0BO45 z5 ^N z4 -Z5 ^N u Z5 $M z5 ^l z5 -z5 l i41 -Z5 L9 Y2 -Z5 ^J u -Z5 i95 ,A -Z5 i85 u -Z5 i51 Z5 -Z5 i4y u -Z5 i4t R1 -Z5i4HO65 z5 i41 l -z5 i3. Z2 -Z5 [ ^G -z5 D7 o0E -Z5D5O75 +Z5 L9 Y2 +Z5 i95 ,A +Z5 i4y u +Z5 i4H O65 +Z5 D5 O75 Z5 $D -Z5cO97 z5 c i7J -z5 C *A6 +z5 *A6 C $! Z5 c z5 -B t -Z5 *B4 .5 -z5 'A y5 -Z5$AO65 -z5$aO23 -Z5 -A o63 +Z5 $A O65 z5 *A7 *39 -z5 *A6 C Z5 *83 *16 Z5 *81 $@ Z5 $@ *81 @@ -33459,39 +28137,18 @@ z5 +7 u Z5 *74 *58 Z5 *73 *2A z5 ^6 z5 -Z5 .6 Z2 -Z5 ^6 Y3 -z5 *69 u ^z *56 $6 -Z5 *65 u -Z5 *61 o3x Z5 *60 Z2 ^z *56 -z5 ^5 Z4 -Z5$5O98 +Z5 $5 O98 z5 .5 $p Z5 .5 *B4 -Z5 *58 *74 -Z5 *56 Y4 -Z5 .5 *4B Z5 ,4 ^L -Z5 *4B .5 -z5*49O73 -Z5 *43 Z2 -Z5 .3 Y5 -z5 -3 Y1 -z5 *39 *A7 -Z5 *34 Y2 -Z5 *32 Y3 -Z5+2O41 -Z5 .2 t -Z5 *2A *73 +z5 *49 O73 z5 *28 *07 z5 -1 y1 -Z5 *16 *83 Z5 $1 $2 -$z*50O43 -z5 *07 *28 +$z *50 O43 Z5 ^< $% Z5 $* Z5 @@ -33501,109 +28158,73 @@ $z +5 ^z ^5 ^* z5 z5 -z4Z5O56 -Z4Z5O42 -Z4Z5O19 -$ Z4 Z5 -$ z4 Z5 -Z4 Z4 Z2 -Z4 Z4 Y4 -Z4Z4O34 +Z4 Z4 O34 Z4 Z4 .6 $= Z4 Z4 Z4 } z4 -$\ Z4 z4 $\ z4 Z4 -z4z3O75 +z4 z3 O75 z4 z3 t -Z4 Z3 *34 -Z4 Z2 Z4 z4 Z2 -0 -z4Z1O35 -Z4Y5O42 -Z4Y5O19 -Z4 Y5 T3 Z4 Y5 s91 Z4 Y5 $k -z4 Y5 *72 -z4 Y5 *58 Z4 Y5 *15 -$ Z4 Y5 -Z4 Y4 Z4 Z4 Y4 i57 Z4 Y4 *30 -$% Z4 Y4 -z4y3O75 Z4 Y3 i2m -Z4 Y3 *43 $? Z4 Y3 -Z4Y2O42 -Z4 Y2 +Z4 Y2 O42 $ Z4 y1 -^@ z4 y1 -Z4O83i7w -$!Z4O75 -Z4O73C -Z4O67y2 -z4O62t -z4O56t -Z4O54+3 -Z4O53 -z4O48 -z4O47 -Z4O42Z5 -Z4O42Y5 -Z4O42Y2 -z4O3At -z4O39p2 -^$z4O36 -z4O35Z1 -Z4O34Z4 -z4O34i1p -$@Z4O34 -z4O26 -z4O25u -Z4O24R1 -Z4O19Z5 -Z4O19Y5 -Z4O15z4 -Z4O04q -Z4O03$Q +Z4 O83 i7w +$! Z4 O75 +Z4 O73 C +Z4 O67 y2 +z4 O62 t +Z4 O54 +3 +Z4 O53 +z4 O48 +z4 O47 +Z4 O42 Z5 +Z4 O42 Y5 +Z4 O42 Y2 +z4 O3A t +z4 O39 p2 +^$ z4 O36 +Z4 O34 Z4 +z4 O34 i1p +$@ Z4 O34 +z4 O26 +z4 O25 u +Z4 O24 R1 +Z4 O19 Z5 +Z4 O19 Y5 +Z4 O15 z4 +Z4 O04 q +Z4 $Q O03 Z4 $W -z4uO25 Z4 u i37 -z4 t z3 -z4tO62 -z4tO56 -z4tO3A z4 t *9A Z4 T4 y5 Z4 T3 Y5 $_ Z4 t z4 t [ Z4 ^s u -Z4 sqD -Z4 s91 Y5 -Z4 s7? Z4 s2? Z4 s0& Z4 R8 ,9 -Z4R1O24 -Z4$QO03 Z4 $Q k -Z4 $O o2a +Z4 o2a $O Z4 oA$ .9 Z4 oA. Z4 o7z Z4 o78 Z4 o7@ Z4 o6k p3 -z4 o6A i7S +z4 i7S o6A Z4 o6@ Z4 o4T *16 Z4 o40 -Z4 o3y *67 -Z4 o2a $O +Z4 *67 o3y Z4 { o1y z4 o0q *15 Z4 o0K @@ -33612,70 +28233,50 @@ Z4 $M Z4 $L $A z4 ^L *69 $| Z4 l -Z4 k $Q Z4 k $8 Z4 iA1 Z4 i98 Z4 i92 Z4 i8s *71 -z4 i7S o6A z4 i6G o80 z4 i6A C -Z4i5$O23 +Z4 i5$ O23 Z4 i58 o7. Z4 i57 Y4 -Z4 i37 u z4 i34 -Z4 i2m Y3 Z4 i21 i4# $& Z4 i1x -z4fO54 -Z4 f *01 -z4^eO38 +z4 f O54 +z4 ^e O38 Z4 ^E i0D z4 ^D ^t Z4 d 'B z4 D2 i2- Z4 D1 $0 [ Z4 ^D -Z4CO73 -z4 C i6A Z4 C $1 z4 'A K -Z4 -A -7 -Z4 'A $@ -z4 *9A t -Z4 +9 -7 -z4 '9 *56 -z4 *92 -Z4 $8 k -z4 *80 *73 Z4 -7 -A +Z4 'A $@ Z4 -7 +9 -z4 *73 *80 +z4 *56 '9 +z4 *92 +z4 *80 *73 Z4 $7 *36 -Z4 *71 i8s $? Z4 .7 $z *47 -Z4 .6 Z4 z4 ,6 i5E -Z4 *67 o3y z4 .6 *62 -z4 ,6 *62 z4 ,6 *26 -z4 *56 '9 -z4*52O53 +z4 *52 O53 Z4 *50 Z4 $5 Z4 -5 -Z4*47O65 -Z4 *43 Y3 +Z4 *47 O65 Z4 { *43 $ Z4 .4 -Z4+3O54 Z4 *36 $7 z4 *36 -Z4 *34 Z3 Z4 -3 -1 Z4 *30 Y4 Z4 $3 @@ -33684,14 +28285,8 @@ Z4 $3 Z4 $2 Z3 z4 *27 z4 -2 -Z4 $1 C -Z4 *16 o4T Z4 *15 Y5 -z4 *15 o0q -Z4 -1 -3 $ Z4 *13 -z4 -0 Z2 -Z4 $0 D1 z4 *05 Z4 .0 Z4 } } @@ -33699,12 +28294,10 @@ Z4 { { $@ Z4 $) Z4 $? Z4 -$! Z4 ] $< Z4 $` Z4 } $ Z4 ^, Z4 ^. -^, ^. Z4 $z +4 [ z4 ^+ z4 @@ -33712,33 +28305,19 @@ $z +4 ^, z4 ^ z4 ^= z4 ] -^= ] z4 -z3 Z5 Y4 z3 Z5 Y2 Z3 Z5 ^d Z3 Z5 *50 Z3 Z5 ^3 -$% Z3 Z5 -] Z3 Z5 -z3 z5 -Z3 Z4 z3 -z3z4O75 Z3 z4 sjo Z3 Z4 o85 -Z3 z3 Z4 -z3z3O74 Z3 z3 t -z3 z3 $* -z3 $* z3 -$* z3 z3 $ Z3 z2 -z3Z1O34 +z3 Y1 O34 $$ Z3 z1 z3 $z -1 Z3 ^z z3 y4 r -Z3 y4 *65 -Z3 Y4 *43 Z3 Y4 -4 Z3 Y3 i5 Z3 y3 .5 @@ -33747,30 +28326,27 @@ z3 Y2 Z5 Z3 y2 y2 z3 Y2 *8B $ z3 Y2 -z3Y1O34 Z3 y1 ^A -Z3O85-9 -Z3O71*69 -Z3O69 -Z3O64 -Z3O53t -$#Z3O51 -z3O47t -z3O46t -Z3O43o9K -[Z3O41 -Z3O38 -z3O37t -z3O34Z1 -z3O34Y1 -z3O34o0_ -$$Z3O32 -z3O25p1 -z3O25{ -Z3O23o61 -Z3O21*85 -z3O14$Q -Z3O13o93 +Z3 O85 -9 +Z3 O71 *69 +Z3 O69 +Z3 O64 +Z3 t O53 +$# Z3 O51 +z3 O47 t +Z3 O43 o9K +[ Z3 O41 +Z3 O38 +z3 O37 t +z3 O34 Y1 +z3 O34 o0_ +$$ Z3 O32 +z3 O25 p1 +z3 O25 { +Z3 O23 o61 +Z3 O21 *85 +z3 O14 $Q +Z3 O13 o93 Z3 $W Z3 Z3 $w o97 Z3 $V o4D @@ -33778,22 +28354,15 @@ Z3 u $q Z3 u ^H Z3 u .7 Z3 u -7 -Z3 t z3 -Z3tO53 -z3tO47 -z3tO46 -z3tO37 Z3 T9 z3 t -3 z3 sR6 +2 -Z3 sjo z4 z3 s3* Z3 $R Z3 Z3 r ^L -Z3 r ^7 -z3$QO14 +Z3 $7 r +z3 $Q O14 z3 $q +2 -Z3 p3 'A Z3 p1 'A Z3 p1 *97 ^? z3 p1 @@ -33816,7 +28385,6 @@ Z3 o6h Z3 o5# +7 Z3 o4N *53 Z3 o4D $V -Z3 o3v $, Z3 $, o3v z3 o3f z3 o3- @@ -33827,26 +28395,21 @@ Z3 o2C z3 o2_ z3 o1G c z3 o18 o0Q -z3o0_O34 Z3 o0V Z3 o0v z3 o0t *24 z3 o0s -z3 o0Q o18 Z3 ^n Z3 ^m +A Z3 $m -Z3 L3 o85 -z3 L1 o7e Z3 $L $# Z3 l -^Z ^3 l Z3 $j Z4 Z3 $j i1f Z3 i9- Z3 i6b Z3 i5 Y3 -Z3i5_O63 +Z3 i5_ O63 Z3 i5i { Z3 i54 d Z3 i51 @@ -33855,27 +28418,20 @@ z3 i2x D3 z3 i2R +1 Z3 i1O +6 z3 i1k -Z3 i1f $j -z3i1bO54 +z3 i1b O54 z3 i0a Z3 ^i -Z3 ^H u Z3 ^g o59 -z3fO5B +z3 f O5B Z3 E T1 -Z3 E .5 +Z3 .5 E $. Z3 E -Z3 ^d Z5 -z3dO71 +z3 d O71 Z3 d i7s } z3 DB -Z3 d 'A -Z3 d +6 Z3 D5 [ -z3 D3 i2x -Z3D2O31 +Z3 D2 O31 Z3 D1 +6 -Z3 D0 D4 z3 ^d Z3 C $? Z3 c @@ -33893,66 +28449,38 @@ z3 ,9 y3 Z3 +8 *47 Z3 +8 *45 z3 *82 *51 -z3 *82 { Z3 -8 -^z*37O15 -Z3 .7 u +^z *37 O15 Z3 -7 u -Z3 $7 r -Z3 +7 o5# Z3 '7 i2g z3 *79 *42 Z3 *79 -Z3*72O04 -Z3 +6 o70 +Z3 *72 O04 z3 *68 Y4 -Z3 +6 *52 -Z3 *63 *18 -Z3 -6 } -Z3 .5 E -Z3 *53 o4N Z3 *52 +6 +Z3 -6 } z3 *52 .1 -z3 *51 *82 -Z3 +5 *10 Z3 *50 Z5 $+ Z3 *50 $z *35 Z3 -4 Y4 -Z3 *47 +8 -Z3 *45 +8 Z3 *43 Y4 -z3 *42 *79 z3 *41 Y3 $. z3 *41 -Z3 +4 ] Z3 ] +4 -Z3 ^3 Z5 z3 -3 t -z3 .3 -2 +z3 -2 .3 z3 ] -3 -z3 -3 ] -z3 +2 $q -z3 *28 { z3 *27 i64 z3 *25 -z3 *24 o0t -z3 -2 .3 -z3 -1 $z -z3 +1 i2R Z3 ,1 *91 z3 +1 ^9 -Z3 *18 *63 -Z3 *17 o9a z3 *17 z3 *15 -Z3 ,1 *19 -Z3 *10 +5 Z3 $1 Z3 ,1 $$ Z3 -1 Z3 +0 z5 -z3 +0 o2g z3 +0 ^A z3 *07 y1 $! z3 *04 @@ -33980,35 +28508,22 @@ $+ z3 ^z .3 ^z ,3 ^\ z3 -^* z3 ^? z3 ^< z3 -Z2 ^Z Z5 Z2 ^Z o1v -Z2 Z5 Z5 -Z2 Z5 z3 -Z2 Z5 ^Z z2 Z5 o3s Z2 ^z *58 -Z2 Z5 *43 -} z2 z5 -Z2Z4O04 -Z2 z3 Z5 +Z2 Z4 O04 z2 Z3 ^p Z2 $Z *35 -$ z2 Z3 z2 Z2 -6 Z2 z2 +3 Z2 z2 $1 Z2 $( Z2 -Z2 Z2 -Z2 z2 ^% Z2 z2 -^% z2 Z2 -z2Z1O42 -Z2 z1 $U +z2 Z1 O42 +Z2 $U z1 z2 Z1 *A0 -$% Z2 Z1 $$ Z2 z1 Z2 { $z z2 ^Z @@ -34023,67 +28538,55 @@ Z2 y3 *8A [ Z2 y3 z2 Y3 Z2 y2 y1 -z2Y2O43 +z2 Y2 O43 z2 Y1 s2* Z2 y1 -2 -Z2 Y1 Z2 y1 -z2O92.2 -z2O83+0 -z2O81*40 -$#Z2O72 -Z2O68 -Z2O63.2 -Z2O62*53 -z2O62+1 -Z2O61t -Z2O59 -Z2O53^w -z2O53i1o -z2O43Y2 -Z2O43o6? -Z2O43[ -Z2O43 -z2O42Z1 -]Z2O42 -z2O42 -z2O37t -z2O36t -Z2O36 -Z2O35y4 -Z2O34 -z2O32i0s -$-Z2O31 -Z2O24l -z2O15t -Z2O12$9 -$$Z2O12 -Z2O04Z4 -Z2O03z2 -Z2O03t -Z2O03shP -Z2O03o8! +z2 O92 .2 +z2 O83 +0 +z2 O81 *40 +$# Z2 O72 +Z2 O68 +Z2 O63 .2 +Z2 O62 *53 +z2 O62 +1 +Z2 O61 t +Z2 O59 +Z2 O53 ^w +z2 O53 i1o +Z2 O43 o6? +Z2 O43 [ +Z2 O43 +z2 O42 Z1 +] Z2 O42 +z2 O42 +Z2 O36 +Z2 O35 y4 +Z2 O34 +z2 O32 i0s +$- Z2 O31 +z2 O15 t +Z2 O12 $9 +$$ Z2 O12 +Z2 O04 Z4 +Z2 O03 z2 +Z2 O03 t +Z2 O03 shP +Z2 O03 o8! z2 $W E Z2 $W Z2 ^W Z2 $w z2 ^w Z2 $v D5 -Z2 $U z1 z2 u o15 Z2 u i8B Z2 u *52 z2 u *13 $# Z2 u -Z2 t y5 -Z2tO61 -z2tO37 -z2tO36 -z2tO15 -Z2tO03 -Z2 t s59 -Z2 t o8- -z2 t o24 +Z2 s59 t +Z2 o8- t +z2 o24 t Z2 t i0a Z2 t .6 Z2 T0 -7 @@ -34092,21 +28595,16 @@ Z2 sys $A [ Z2 sv_ Z2 sth D2 Z2 srl *34 -Z2 s.P Z2 soO z2 snT .2 -Z2shPO03 Z2 $S E -Z2sc O03 +Z2 sc O03 z2 s9H Z2 s9 -z2 s8 r +z2 s8 r z2 ^s $7 -Z2 s5O y3 -Z2 s59 t z2 s3. +0 Z2 $s .3 -z2 s2* Y1 z2 s24 Z2 s2. +1 Z2 s19 @@ -34120,31 +28618,25 @@ Z2 R6 u Z2 R5 $@ Z2 $@ R5 z2 R3 R2 -z2 R2 R3 z2 R2 r Z2 r *05 { Z2 $r Z2 ^Q ^W Z2 $Q -z2 ^p Z3 z2 ^P o3j Z2 p5 +7 z2 p2 $z -Z2p2O02 -z2 p2 { +Z2 p2 O02 z2 { p2 -z2 p1 y1 -Z2p1O23 -Z2p1O13 +Z2 p1 O23 Z2 p1 z2 oAS .2 Z2 oA2 E -Z2 o9$ iAO +Z2 iAO o9$ Z2 o9h -Z2 o9B iAV +Z2 iAV o9B Z2 o93 C Z2 o93 +1 -Z2 o8- t Z2 o8q Z2 o8- $4 Z2 o8/ @@ -34152,9 +28644,8 @@ Z2 o8/ Z2 o7x Z2 o7, D1 Z2 o7C Z1 -z2 o77 [ Z2 o72 -Z2o70O02 +Z2 o70 O02 Z2 o6o z2 o66 Z2 o5A C @@ -34173,21 +28664,17 @@ z2 o2x Z2 o2s Z2 o2p +7 z2 o2c *25 -z2 o2A z2 o2_ -8 -z2 o24 t z2 o1v $0 z2 o1m z2 o1l z2 o19 *53 z2 o16 -z2 o15 u Z2 o1; ,5 z2 o1. ^1 Z2 o0y *62 Z2 o0w ^q Z2 o0w -z2 o0W Z2 o0s +1 Z2 o0s Z2 o0f -8 @@ -34197,7 +28684,6 @@ $ Z2 o06 ] z2 o03 Z2 $n z2 $m -Z2lO24 Z2 l i8, Z2 L8 Z1 Z2 L6 y2 @@ -34211,15 +28697,11 @@ Z2 k +6 Z2 k *34 Z2 $k .0 Z2 $K -z2^jO39 +z2 ^j O39 Z2 $I $Q -Z2 iAV o9B -Z2 iAO o9$ Z2 iA. Z2 i8m -Z2 i8, l Z2 i8j -Z2 i8B u Z2 i82 Z2 i8$ Z2 i8- @@ -34227,7 +28709,6 @@ Z2 i8- $# Z2 i76 z2 i72 { Z2 i7 -$z -2 i6o Z2 i6e -0 $. Z2 i66 Z2 i5c @@ -34238,63 +28719,52 @@ Z2 i4l Z2 i4. Z2 i2s Z2 i2k -z2 i2F $! z2 $! i2F z2 i2c z2 i2A z2 i2. -z2 i2_ $& Z2 i1x z2 i1u -z2i1oO53 +z2 i1o O53 z2 i1& Z2 i0E z2 i0b Z2 i0# -Z2 i0$ $# Z2 $# i0$ z2 ] ^H -z2 ^H ] ] z2 ^H -z2fOA7 -z2fO5B +z2 f OA7 +z2 f O5B Z2 f i74 Z2 ^F *37 Z2 $f Z2 ^f -Z2 E oA2 z2 ^e i3o { Z2 E ^> z2 ^e -Z2dO21 -Z2dO09 -Z2dO03 -Z2 d D2 +Z2 d O09 +Z2 d O03 Z2 DB i4n z2 D9 Z2 ^d -7 -Z2D6O81 +Z2 D6 O81 Z2 D5 $v ^ z2 D5 z2 D4 L4 $. Z2 D4 Z2 D3 ,7 $ Z2 D3 -Z2 D2 sth Z2 D1 Y5 Z2 D1 C z2 $D *13 Z2 D0 *73 Z2 c Y4 -Z2 C o93 -Z2 C o5A z2 ^C o2c -Z2 C D1 Z2 c $a z2 C *97 -z2 c '9 +z2 '9 c Z2 C -7 -Z2 c *5A +Z2 *5A c Z2 C *02 Z2 ^c } z2 ^C @@ -34306,32 +28776,24 @@ Z2 ^B +7 Z2 +B ,3 Z2 $B Z2 $a Z3 -Z2 $A sys Z2 ^A i1* -Z2 $a c Z2 *A7 r Z2 *A7 *26 z2 $A ,6 Z2 *A3 z2 $a *18 z2 $A -Z2$9O12 -z2 '9 c -z2 *97 C +Z2 $9 O12 } Z2 *96 z2 -9 ,4 $! Z2 *90 Z2 -9 { Z2 $8 Z3 -z2 -8 o2_ -Z2 -8 o0f Z2 *8A D7 Z2 *85 i61 z2 -8 *40 z2 *83 ^J z2 +8 -0 -Z2 -7 T0 -Z2 +7 o2p Z2 -7 C Z2 *7A D3 Z2 +7 +5 @@ -34339,37 +28801,25 @@ Z2 *74 $6 Z2 $7 ^3 Z2 +7 z2 -6 Z2 -Z2 .6 t Z2 -6 q -Z2 +6 k z2 ,6 $A Z2 *69 z2 *68 { Z2 $6 *74 Z2 *67 -z2 *64 Y5 Z2 [ *64 -Z2 *63 o0f -Z2 *62 o0y z2 *62 $* z2 $* *62 Z2 *61 $* Z2 $* *61 z2 *60 D6 z2 ^5 z5 -Z2 ,5 o1; -Z2*5AO52 -Z2 *5A c -Z2*58O81 -Z2 +5 +7 +Z2 *5A O52 +Z2 *58 O81 [ Z2 *57 -Z2*53O62 -z2 *53 o19 z2 +5 *31 ^+ z2 *53 -Z2 *52 u -z2 *52 o0a -Z2 +5 .2 +Z2 .2 +5 z2 *52 z2 *51 D4 Z2 *51 ,4 @@ -34378,75 +28828,45 @@ Z2 -5 z2 ,5 [ z2 -5 Z2 $4 o8- -z2 ,4 -9 Z2 *47 $ Z2 *47 -Z2 ,4 *51 -Z2 *43 Z5 -Z2 *41 z2 *41 -z2*40O81 -z2 *40 -8 Z2 ^4 z2 ,4 z2 -4 { Z2 .3 $s -Z2 ,3 +B Z2 *37 Z2 *35 $Z -Z2 *34 srl -Z2 *34 k $< Z2 *34 -z2 *31 +5 ^> z2 *30 Z2 ,2 y1 -z2.2O92 -Z2.2O63 -z2 .2 snT -z2 .2 oAS Z2 } *28 Z2 *27 .2 -Z2 *26 *A7 -Z2 .2 +5 Z2 .2 *34 z2 *23 { $, Z2 +2 $ Z2 -2 z2 +2 -Z2 $1 z2 $z *21 Y1 -z2+1O62 Z2 +1 s2. z2 +1 q -Z2 +1 o93 -Z2 +1 o0s z2 *18 $a ] Z2 *17 z2 *15 } -z2 *13 u z2 *13 $D Z2 $1 [ Z2 } ,1 -Z2 [ $1 z2 $+ -1 -z2 -1 $+ ^- z2 +1 z2 +0 y4 -z2+0O83 -z2 $0 o1v -Z2 .0 $k -Z2 -0 i6e } z2 *09 z2 *08 ^W -z2 -0 +8 z2 *07 Z2 *06 E z2 *06 ^E Z2 $0 -5 -[ Z2 *01 { Z2 .0 z2 ] -0 -z2 -0 ] } z2 +0 Z2 $# Z2 $, @@ -34462,7 +28882,6 @@ $. { Z2 ^Z +2 ^% Z2 $+ ^# Z2 ^$ -^# ^$ Z2 z2 { $_ z2 { z2 ] @@ -34477,97 +28896,79 @@ $= z2 ^> z2 ^= z2 } z1 $z Z1 -Z1 $z y4 +Y1 $z y4 Z1 $z k Z1 ^z *60 -z1z5O74 z1 z5 $W z1 z5 -^* z1 z5 Z1 z4 t -$$ z1 Z3 z1 ^ z3 z1 Z2 s8+ -z1 z2 $S z1 Z2 ^n z1 Z2 ^M Z1 z2 -2 -Z1 Z2 -$% Z1 Z2 -$$ z1 Z2 Z1 z1 ^l z1 Z1 ^J -Z1 $* Z1 -$] Z1 Z1 -^Z ^1 Z1 -$\ Z1 z1 -^, Z1 z1 -z1 Z1 $@ -$\ z1 Z1 +Y1 $* $* ^, z1 Z1 +z1 Z1 $@ Z1 $z z1 ^z Z1 $y Z2 Z1 y5 y5 -Z1Y5O52 +Y1 Y5 O52 Z1 y5 sys -Z1 y4 $z +Y1 y4 $z Z1 Y4 Y4 -Z1y4O72 -Z1y4O63 +Z1 y4 O72 +Z1 y4 O63 Z1 Y4 ^b -Z1 Y4 +4 Z1 Y4 *31 z1 Y4 *21 Z1 y4 -Z1Y3O62 +Z1 Y3 O62 z1 Y1 i0i z1 Y1 ^H Z1 y1 ^g Z1 Y1 ,8 -Z1 y1 -$\ z1 Y1 $` z1 Y1 -Z1$XO51 -z1OA2i1R -}z1O93 -Z1O82*16 -Z1O74Y2 -Z1O72,6 -$ Z1O71 -Z1O67 -Z1O65$! -Z1$!O65 -Z1O62Y3 -Z1O54y5 -Z1O52t -z1O52*03 -Z1O51$X -z1O51R2 -z1O43 -Z1O42.3 -z1O41o0c -Z1O41$$ -Z1$$O41 -Z1O38$! -Z1$!O38 -Z1O36 -$/Z1O32 -Z1O31+6 -Z1O31 -Z1O24+4 -z1O23^! -z1O21o2@ -z1O14i4l -Z1O13z2 -Z1O0A -Z1O04y5 -Z1O03$7 -Z1O03$0 -Z1O02p1 -Z1O02$9 -Z1O01^M -z1 $W z5 +Z1 $X O51 +z1 OA2 i1R +} z1 O93 +Z1 O82 *16 +Z1 O74 Y2 +O62 Y1 ,6 +$ Z1 O71 +Z1 O67 +Z1 O65 $! +Z1 $! O65 +Z1 O62 Y3 +Z1 O54 y5 +Z1 O52 t +z1 O52 *03 +Z1 O51 $X +z1 O51 R2 +O32 Y1 .3 +O31 ^c +Z1 O41 $$ +Z1 $$ O41 +Z1 O38 $! +Z1 $! O38 +Z1 O36 +$/ Z1 O32 +Z1 O31 +6 +Z1 O31 +Z1 O24 +4 +z1 O23 ^! +z1 O21 o2@ +z1 O14 i4l +Z1 O13 z2 +Z1 O04 y5 +Z1 O03 $7 +Z1 O03 $0 +Z1 O02 p1 +Z1 O02 $9 +Z1 o0M Z1 $w *47 Z1 $! $w z1 ^w @@ -34577,13 +28978,9 @@ Z1 ^U i1M Z1 u D2 $& Z1 u { Z1 u -Z1 t z4 -Z1tO52 -Z1 t T8 Z1 T9 $m -Z1 T8 t z1 T7 +4 -Z1 T5 { +Y1 T5 { Z1 { T4 z1 ^t +3 Z1 T2 o0L @@ -34593,21 +28990,15 @@ Z1 T0 $9 Z1 $T Z1 t ^! z1 t -z1 $S z2 -Z1 sys y5 Z1 ssz Z1 sok Z1 $S o3w Z1 so0 -Z1 so) z1 sL, $5 Z1 sgG -Z1 sec -z1 s8+ Z2 Z1 s8. *58 Z1 s80 z1 s6d p2 -Z1 s3H Z1 s26 p5 Z1 s26 Z1 s2* @@ -34618,26 +29009,21 @@ z1 s14 i1B Z1 s12 z1 ^S } z1 $S -z1R2O51 -Z1 r +r z1 Z1 $q *27 z1 ^p y2 Z1 $p c -Z1 p5 s26 $. Z1 p5 z1 $p ,5 -Z1p4O07 +Z1 p4 O07 Z1 p4 T1 -Z1 p4 c -Z1p2O06 -z1p2O02 -z1 p2 s6d -Z1 p2 $j +Z1 p2 O06 +z1 p2 O02 +Y1 p2 $j Z1 p2 ^G -Z1p1O0B +Z1 p1 O0B z1 p1 T9 z1 p1 $A -Z1 p1 Z1 $o r Z1 o8p Z1 o8k @@ -34673,10 +29059,8 @@ Z1 o3w $S Z1 o3q +4 z1 o3p E z1 o3d *41 -Z1 o3a o4n Z1 o3a c z1 o2z c -z1 o2- u } z1 o2n Z1 o2f z1 o2c *14 @@ -34690,26 +29074,16 @@ Z1 o1w Z1 o1O Z1 o1n Z1 o1L ^K -Z1 o1b o0u +Z1 o0u o1b Z1 o17 Z1 o14 [ Z1 o1$ z1 o0W $6 -Z1 o0u o1b Z1 o0u } Z1 o0T C -Z1 o0M -Z1 o0L T2 Z1 o0J -Z1 o0H o7@ -z1o0cO41 Z1 o0C .2 -Z1 o0B o8e -z1 o0a o27 -Z1 o07 s1- z1 $O *07 -z1 ^n Z2 -z1 ^M Z2 Z1 $m T9 Z1 $M $M Z1 $M @@ -34717,16 +29091,12 @@ Z1 $M Z1 $m Z1 l i3? z1 l i1v -Z1 l $7 +Y1 l $7 Z1 l ^1 Z1 $l Z1 l -Z1 k $z -Z1 k s1s z1 ^K $7 Z1 k -$ Z1 k -z1 ^J Z1 z1 ^J r z1 ^J ^J z1 $j @@ -34736,12 +29106,11 @@ Z1 iAr u Z1 iAo Z1 iA2 D8 Z1 iA- -z1i9=O03 +z1 i9= O03 Z1 i8u E Z1 i8o [ z1 i8K .7 -z1 i8@ c -Z1 i85 u +z1 c i8@ Z1 i81 Z1 i7W *56 Z1 i7u @@ -34754,23 +29123,21 @@ z1 i7_ Z1 i6t Z1 i6k z1 i6@ i0o -Z1i6bO14 +Z1 i6b O14 z1 i67 -2 z1 i63 Z1 i6% Z1 i6- Z1 i5q { Z1 i53 -Z1 i5. +Y1 i5. z1 i4w *94 -Z1 i4u T0 -Z1 i4L C +Z1 C i4L Z1 i4e E Z1 i42 Z1 i4* Z1 i3v c Z1 i3q -Z1 i3? l z1 i3k Z1 i3H Z1 i3b @@ -34785,16 +29152,14 @@ Z1 i22 *57 Z1 i2@ z1 i2% z1 i1Z -z1 i1v l Z1 i1u ,3 z1 i1p Z1 i1o Z1 i1i Z1 i1h z1 i1c ^B -z1 i1B s14 Z1 i1B -} Z1 i19 +} Y1 i19 z1 i1& z1 i1_ Z1 i0w y4 @@ -34802,77 +29167,56 @@ z1 i0m -3 z1 i0m *03 Z1 i0l i4e z1 i0K i61 -z1 i0i Y1 -Z1 i0B Z1 i08 ^z -z1 ^H Y1 z1 ^h *54 z1 $H *16 Z1 ^H -z1fO7B -z1fO78 -z1fO68 +z1 f O7B +z1 f O78 +z1 f O68 Z1 ^F *31 z1 E o3p Z1 E i8u Z1 E i4e z1 $E C Z1 E *45 -Z1 E $+ Z1 $+ E -$* Z1 E +$* Y1 E z1 $e -Z1dO87 +Z1 d O87 z1 d 'B -Z1 d +A z1 $d $a Z1 D8 z1 D6 *52 z1 D5 $5 Z1 D4 .2 -Z1 D2 u $^ Z1 D2 Z1 D1 *28 -$- Z1 d +$- Y1 p1 z1 ^d } z1 ^) d -Z1 c p4 -Z1 c $p -Z1 c o85 -Z1 c o3a -z1 c o2z z1 c $K -z1 c i8@ -Z1 C i4L -Z1 c i3v -z1 C $E z1 c *56 z1 ^c ,5 Z1 C Z1 c $/ -Z1 $/ c -Z1 ^c } +Y1 ^c } } z1 ^c Z1 ^b Y4 z1 ^a z4 Z1 $a *A4 z1 $A -8 -Z1*A7O35 +Z1 *A7 O35 Z1 *A6 *59 z1 $A .5 Z1 *A4 $a Z1 ^A *37 Z1 +9 Y3 -Z1$9O02 -Z1 +9 T1 -Z1 $9 T0 +Z1 $9 O02 Z1 .9 *A7 z1 +9 *46 -Z1 ,8 Y1 -z1 ,8 o5! z1 -8 $A Z1 *86 *73 -Z1 *85 o2@ z1 *83 +7 Z1 *83 [ Z1 $8 *16 @@ -34881,24 +29225,17 @@ Z1 -8 .1 Z1 $/ -8 Z1 -8 $/ z1 -8 -Z1$7O03 -Z1 $7 l +Z1 $7 O03 z1 ,7 i0m z1 ^7 ^b -Z1*79O81 -z1 +7 *83 -Z1 *75 s1D +Z1 *79 O81 Z1 *75 Z1 *74 -7 z1 *74 .2 -Z1 *73 *86 Z1 .7 .2 -Z1 *71 q Z1 $* ,7 Z1 ,7 $* -Z1,6O72 Z1 -6 ^p -z1 $6 o0W } Z1 *67 z1 *64 *06 Z1 .6 -4 @@ -34909,54 +29246,31 @@ z1 ,6 .2 Z1 -6 [ } Z1 .6 z1 ,6 -Z1-5O03 -z1 $5 sL, +Z1 -5 O03 Z1 +5 p1 z1 ,5 $p z1 $5 D5 z1 .5 $A -Z1 *59 *A6 -Z1 *58 s8. Z1 { *58 -Z1 *56 i7W -z1 *56 c -Z1 ,5 *63 $+ Z1 *56 $= Z1 *56 -Z1 *53 o4r -z1 *53 *46 -z1 *52 D6 +z1 *46 *53 z1 *51 -4 Z1 *50 $$ Z1 +5 [ Z1 +5 z1 $5 -Z1 +4 Y4 -z1 +4 T7 -Z1 +4 o3q Z1 *47 -z1 *46 +9 -z1 *46 *53 -z1 *46 *31 -Z1 +4 -6 -Z1 -4 .6 -Z1 *45 E -z1 -4 *51 +z1 *31 *46 z1 ,4 *40 Z1 *42 +3 -z1 *41 o3d -z1 *40 o2- -Z1 [ .4 -[ Z1 .4 z1 -4 z1 ^4 z1 *38 i0b Z1 ,3 *53 Z1 *35 +0 -Z1 +3 *42 z1 ,3 *25 Z1 *31 Y4 -z1 *31 *46 z1 *31 *34 z1 *31 *20 Z1 -3 $1 @@ -34966,49 +29280,31 @@ z1 $! *31 Z1 +3 z1 '3 z1 $2 $s -Z1 .2 o0C -Z1 .2 i7. -z1 -2 i67 -Z1 .2 D4 Z1 *27 $q -z1 .2 *74 -Z1 .2 .7 $% Z1 *27 Z1 .2 $6 -z1 .2 ,6 z1 *24 y5 Z1 *21 $ Z1 $ *21 z1 -2 -1 -z1 *20 *31 $@ Z1 .2 -z1^1O72 -Z1 ^1 l -Z1 *18 o7C -Z1 .1 -8 +z1 ^1 O72 z1 *17 $. z1 $. *17 -Z1*16O82 z1 *16 $H Z1 *16 $8 -z1 *16 .8 -z1 *14 o2c Z1 $1 -3 z1 ^1 *23 -z1 -1 -2 $^ Z1 ,1 ^ Z1 ,1 -z1 ^1 -Z1$0O03 +Z1 $0 O03 z1 ^0 d z1 *07 $O ^. z1 *07 z1 *06 } z1 *05 ] z1 ] *05 -z1*04O31 -z1*03O52 -Z1 +0 *35 +z1 *04 O31 $ Z1 *02 z1 ^0 ^* z1 ^0 @@ -35018,12 +29314,8 @@ Z1 $_ [ Z1 $ { Z1 $= Z1 { { -Z1 [ $_ -Z1 [ $# $Z +1 -$' Z1 } $. Z1 ^@ -$. ^@ Z1 $= Z1 $( $^ Z1 { } Z1 @@ -35031,16 +29323,11 @@ $^ Z1 { ^Z +1 ^/ $; Z1 z1 $# -z1 $\ $\ z1 $. ^* } z1 } -^' z1 { ^- z1 ^< -$z .0 Z1 $z -0 u -^z *05 L6 $z *05 -^z *02 -7 $Z $! $! ^Z { $Z @@ -35054,7 +29341,6 @@ $& ^z ^z $- ^ ^z $y z5 Z4 -$y Z4 z5 ^y z2 Y1 $y Z2 o08 ^Y z2 *45 @@ -35063,7 +29349,6 @@ $Y Z2 $y $ Z2 ^y Z2 $y Z1 z1 -$y z1 Z1 ^Y Z1 ^N $Y $Z ] $Y y5 @@ -35072,55 +29357,50 @@ $y Y5 ] $y Y3 $Y y2 $y y2 -^y y2 $. ^y $. y2 -^y Y1 z2 ^Y Y1 ^W ^y Y1 o1d ^y Y1 } -^y y1 $Y $Y $Y $y ] ^y ^Y -$yO85 -$yO73 -$yO64$1 -^YO45^G -^yO43 -^yO42 -^yO35 -$yO34$c -$yO34 -^YO13i5m -$*^yO13 -$YO02 +$y O85 +$y O73 +$y O64 $1 +^Y O45 ^G +^y O43 +^y O42 +^y O35 +$y O34 $c +$y O34 +^Y O13 i5m +$* ^y O13 +$Y O02 ^y ^X -^Y ^W Y1 ^y ] $w $y $v $y ^v ^Y $u *76 -$Y t s2@ +$Y s2@ t $Y t $h $Y TA $m $Y $T } $Y ^t $y snc -^Y s3! i1u -$Y s2@ t +^Y i1u s3! $y s0q *71 $y r i3k $y r *52 ^Y $R $y $Q Y1 -$yqO07 +$y q O07 $y $q $y p5 i49 $y o9l $Y o8X l -$Y o8_ l -^Y o81 o0A -$yo6fO41 +$Y l o8_ +^Y o0A o81 +$y o6f O41 ^y o5M ^Y o4o *50 ^y o4l @@ -35134,16 +29414,12 @@ $Y o31 ^Y o1Z ^y o1j ^y o1d Y1 -^Y o0A o81 -$y o08 Z2 $y o0@ *43 $Y $O ^Y $o $y $O -^Y ^N Z1 $Y $m TA $y $m -$Y l o8_ $Y l i5l { $y L7 $y L6 @@ -35154,13 +29430,12 @@ $Y $K $y K ^y $k ^y ^k -$yiAqO17 +$y iAq O17 $Y i8j $y i6y ^y i6W ^y i6v ^Y i5y -$Y i5l l ^y i4p $y i4l $y i4j @@ -35170,12 +29445,9 @@ $y i4j $y i2d ^Y i2A $Y i1x -^Y i1u s3! ^Y i1u -^y i1i ^Y i1C $y i1- -^Y i0W ^y i0P ^y i0N $y i0k o03 @@ -35191,20 +29463,17 @@ $Y E o0y ^Y $E $y ^e } $y D6 { -^Y D1 $3 ^y ^D -$y$cO34 +$y $c O34 ^Y $C ^Y $c -^y ^b K $y *9B $Y $9 $y *80 ^Y $8 ^y $8 -$y*78O32 +$y *78 O32 ^y *72 -$y *71 s0q $y $7 ^y -7 $y .6 *62 @@ -35212,170 +29481,159 @@ $y *63 $y .6 ^y +6 ^y ,6 -y5Z5OA6 -y5Z4O67 +y5 Z5 OA6 +y5 Z4 O67 y5 Z3 i57 -y5 z3 *3A Y5 Z3 -Y5Z1O05 -Y5Z1O04 +Y5 Z1 O05 +Y5 Z1 O04 Y5 z1 u y5 y5 Y3 -Y5y5O27 -Y5Y5O12 +Y5 y5 O27 +Y5 Y5 O12 Y5 y5 *B0 -y5 Y5 *B0 Y5 Y5 y5 y4 u y5 Y4 t y5 Y3 y5 -y5Y3O62 -Y5Y2O39 +y5 Y3 O62 +Y5 Y2 O39 y5 Y1 o92 y5 ] $Y ] y5 $Y -Y5OA4.6 -y5OA3i5, -y5OA3E -y5OA2O34 -Y5OA2O25 -y5OA2o5k -Y5OA2 -y5OA1T5 -y5OA1oB) -y5O97o7l -y5O96*54 -y5O96*45 -y5O95 -y5O93O62 -y5O92sn/ -y5O92o38 -y5O91u -y5O89y5 -y5O86-3 -y5O85u -y5O84.4 -Y5O83O32 -y5O83k -Y5O83c -y5O82siv -y5O82C -y5O82.2 -y5O82$* -y5$*O82 -y5O81E -y5O78 -y5O74o0d -y5O74i5W -y5O73y2 -Y5O73O41 -Y5O73r -y5O73c -Y5O73-4 -Y5O72s49 -Y5O72+A -y5O72,5 -y5O71^V -y5O71+0 -y5O67T2 -y5O64t -Y5O64 -y5^#O64 -y5O63.7 -]Y5O63 -y5O62Y3 -Y5O62p4 -Y5O62o5m -y5O62o4K -Y5O62c -Y5O62*A8 -[y5O62 -y5[O61 -Y5O5A$R -y5O58 -Y5O56t -y5O56$r -y5O54k -Y5O54D5 -Y5O53*49 -y5O52[ -y5O51o0N -Y5O51] -Y5]O51 -Y5O49Y5 -y5O48+7 -Y5O47*04 -Y5O46$3 -$*Y5O46 -Y5O43i0f -Y5O42 -Y5O41t -Y5O3A -Y5O39Y2 -y5O38t -Y5O37 -Y5O36o77 -Y5O36*50 -y5O34o1h -y5O34l -y5O34K -Y5O32*98 -y5O31O74 -Y5O31$u -{Y5O31 -y5O31 -Y5O2Bu -y5O29i1o -Y5O28T4 -Y5O26 -Y5O25i82 -Y5O25c -Y5O25*21 -Y5O24^y -Y5O23K -y5O21O67 -y5O21o0R -Y5O1A -Y5O18T0 -Y5O18t -Y5O18l -Y5O18C -Y5O17*64 -Y5O16-7 -Y5O16+2 -Y5O15$o -Y5O15$n -Y5O15i4w -Y5O14'7 -Y5O14 -$*Y5O14 -Y5O13$l -Y5O13+7 -Y5O13$* -Y5$*O13 -Y5O12Y5 -y5O08t -y5O07i5& -Y5O06-1 -Y5O05Z1 -Y5O05t -Y5O04Z1 -$&Y5O04 -y5O03t -y5O02O51 -Y5O02t -y5O02t -y5O02o2r -Y5O02l -Y5O02 +Y5 OA4 .6 +y5 OA3 i5, +y5 OA3 E +y5 OA2 O34 +Y5 OA2 O25 +y5 OA2 o5k +Y5 OA2 +y5 OA1 T5 +y5 OA1 oB) +y5 O97 o7l +y5 O96 *45 +y5 O95 +y5 O93 O62 +y5 O92 sn/ +y5 O92 o38 +y5 O91 u +y5 O89 y5 +y5 O86 -3 +y5 O85 u +y5 O84 .4 +Y5 O83 O32 +y5 O83 k +Y5 O83 c +y5 O82 siv +y5 O82 C +y5 O82 .2 +y5 O82 $* +y5 $* O82 +y5 O81 E +y5 O78 +y5 O74 o0d +y5 O74 i5W +y5 O73 y2 +Y5 O73 O41 +Y5 O73 r +y5 O73 c +Y5 O73 -4 +Y5 O72 s49 +Y5 O72 +A +y5 O72 ,5 +y5 O71 ^V +y5 O71 +0 +y5 O67 T2 +y5 O64 t +Y5 O64 +y5 ^# O64 +y5 O63 .7 +] Y5 O63 +y5 O62 Y3 +Y5 O62 p4 +Y5 O62 o5m +y5 O62 o4K +Y5 O62 c +Y5 O62 *A8 +[ y5 O62 +y5 [ O61 +Y5 O5A $R +y5 O58 +Y5 O56 t +y5 O56 $r +y5 O54 k +Y5 O54 D5 +Y5 O53 *49 +y5 O52 [ +y5 O51 o0N +Y5 O51 ] +Y5 O49 Y5 +y5 O48 +7 +Y5 O47 *04 +Y5 O46 $3 +$* Y5 O46 +Y5 O43 i0f +Y5 O42 +Y5 t D4 +Y5 O3A +Y5 O39 Y2 +y5 O38 t +Y5 O37 +Y5 O36 o77 +Y5 O36 *50 +y5 O34 o1h +y5 O34 l +y5 O34 K +Y5 O32 *98 +y5 O31 O74 +Y5 O31 $u +{ Y5 O31 +y5 O31 +Y5 O2B u +y5 O29 i1o +Y5 O28 T4 +Y5 O26 +Y5 O25 i82 +Y5 O25 c +Y5 O25 *21 +Y5 O24 ^y +Y5 O23 K +y5 O21 O67 +y5 O21 o0R +Y5 O1A +Y5 O18 T0 +Y5 O18 t +Y5 O18 l +Y5 O18 C +Y5 O17 *64 +Y5 O16 -7 +Y5 O16 +2 +Y5 O15 $o +Y5 O15 $n +Y5 O15 i4w +Y5 O14 '7 +Y5 O14 +$* Y5 O14 +Y5 O13 $l +Y5 O13 +7 +Y5 O13 $* +Y5 $* O13 +Y5 O12 Y5 +y5 O08 t +y5 O07 i5& +Y5 O06 -1 +Y5 O05 t +Y5 O04 Z1 +$& Y5 O04 +y5 O03 t +y5 O02 O51 +Y5 O02 t +y5 O02 t +y5 O02 o2r +Y5 O02 l +Y5 O02 Y5 ^w -y5^VO81 -Y5 u z1 -y5 u y4 -y5uO91 -y5uO85 -Y5$uO31 -Y5uO2B +Y5 $u O31 Y5 u o9B y5 u o6a y5 u i40 @@ -35385,66 +29643,43 @@ y5 u +0 y5 u $0 Y5 u ] ] Y5 u -y5 t Y4 -y5tO64 -Y5tO56 -Y5tO41 -y5tO38 -Y5tO18 -y5tO08 -Y5tO05 -y5tO03 -Y5tO02 -y5tO02 Y5 t $s Y5 t o0M -Y5 t D4 y5 t *B6 y5 TA $j Y5 TA y5 t .A Y5 T8 y5 T8 -Y5 T7 T5 -Y5 T6 ] -Y5 ] T6 -y5T5OA1 Y5 T5 T7 +Y5 ] T6 Y5 T5 $1 -y5 T4 T3 y5 T3 T4 -y5T2O67 -Y5T0O18 Y5 t $0 Y5 t ] Y5 ^t y5 t $* y5 t ^( -y5 $* t -y5 ^( t y5 t y5 szi D9 y5 sua ,5 y5 $s t y5 ss2 y5 srn -y5 soe o45 -y5sn/O92 +y5 o45 soe y5 smp t y5 slJ o5d -y5sivO82 y5 sg7 C Y5 s9X ^L -Y5s49O72 y5 s3u E -Y5$RO5A -y5$rO56 +Y5 $R O5A +y5 $r O56 Y5 r D9 } Y5 RB ] y5 RA y5 R9 $2 Y5 p3 o8l -Y5$oO15 +Y5 $o O15 Y5 oBu y5 oBe Y5 oB1 @@ -35463,16 +29698,14 @@ Y5 o9S Y5 o9r y5 o9M l y5 o9e -Y5 o9B u y5 o99 *B8 y5 o98 p2 y5 o93 y5 o92 Y1 y5 o91 ] -y5 ] o91 Y5 o9_ Y5 o9 -Y5o8gO23 +Y5 o8g O23 Y5 o8g Y5 o8 Y5 o7w @@ -35481,7 +29714,6 @@ Y5 o7r K Y5 o7r y5 o7r Y5 o7p -y5o7lO97 y5 o7h y5 o7f DA Y5 o7d ,9 @@ -35497,83 +29729,65 @@ Y5 o6_ y5 o5w +B y5 o5w Y5 o5n -Y5o5mO62 -y5o5kOA2 Y5 o5k E y5 o5K E } y5 o5k Y5 o5h Y5 o5E -y5 o5d slJ Y5 o5- -y5o4KO62 y5 o4g y5 o4D i57 -Y5 o4 $D +Y5 o4 $D y5 [ o47 -y5 o45 soe y5 o4. y5 o4/ y5 [ o4- y5 o3w i5z -y5o38O92 y5 o37 y5 o2v y5 o2t .A Y5 o2p y5 o2p y5 o1w l -y5o1hO34 Y5 o1c Y5 o0z y5 o0u +3 -y5o0RO21 y5 o0q -y5o0NO51 y5 o0L DB Y5 o0J $j y5 o0j D4 y5 o0J y5 o0f -y5o0dO74 y5 o0c y5 o0b y5 o0A -Y5$nO15 +Y5 $n O15 Y5 ^N -Y5^MO14 -y5lO34 -Y5lO18 -Y5$lO13 -Y5lO02 -Y5 ^L s9X +Y5 ^M O14 +Y5 $l O13 y5 l o8I -y5 l o1w y5 $l $f y5 l 'A Y5 L9 i9A Y5 L5 -y5kO83 -y5kO54 -y5KO34 -Y5KO23 +y5 K O34 +Y5 K O23 Y5 K o7r Y5 k '8 Y5 ^K y5 $K y5 $j TA Y5 $j $s -Y5 $j o0J -Y5iB,O26 +Y5 iB, O26 y5 iAu y5 iAs y5 iAR y5 iAm y5 iAJ -y5iAaO51 +y5 iAa O51 y5 iA1 Y5 iA. -Y5i9DO06 +Y5 i9D O06 Y5 i9_ Y5 i8p Y5 i8m @@ -35585,11 +29799,9 @@ Y5 i7a Y5 i6m Y5 i6j Y5 i6_ -y5 i5z o3w y5 i5z y5 i5U y5 i57 Z3 -y5 i57 o4D Y5 i5@ Y5 i5 y5 i5+ @@ -35603,7 +29815,6 @@ Y5 ] i4t Y5 i46 y5 i44 y5 i41 -y5 i40 u Y5 i1S Y5 i1l o6b Y5 i1k @@ -35612,15 +29823,12 @@ y5 i13 *62 y5 i0m oB@ Y5 ^I y5 $H Z3 -Y5^FO14 +Y5 ^F O14 y5 $F -y5EOA3 -y5EO81 y5 E s3u y5 E oAu y5 E oAi Y5 E o5k -y5 E 'A y5 E -A Y5 E '9 y5 E $4 @@ -35628,167 +29836,98 @@ y5 E $0 Y5 $E y5 E Y5 $d Z2 -y5dO47 -y5 DB u -y5 DB o0L y5 DB -y5 DA o7f Y5 DA +2 -y5 D9 szi y5 D9 i9s ] y5 D9 [ y5 D9 Y5 D8 c -Y5D7O13 -Y5D5O54 +Y5 D7 O13 +Y5 D5 O54 Y5 D5 -Y5 D4 t -y5 D4 o0j y5 D3 o4A -y5D2O72 +y5 D2 O72 y5 D2 +7 -y5D0O62 y5 D0 $a -Y5cO83 -y5CO82 -y5cO73 -Y5cO62 -Y5cO25 -y5^cO23 -Y5CO18 -Y5 c o6g -Y5 c D8 +y5 ^c O23 y5 C 'A y5 c *81 -y5 C *50 y5 c $5 y5 c ,4 y5 'B $Y -Y5-BO73 +Y5 -B O73 y5 ^B r -y5 +B o5w Y5 'B *A7 -y5 *B8 o99 y5 -B $7 -y5 *B6 t Y5 +B *6A y5 *B5 *4B -y5*B4O24 +y5 *B4 O24 Y5 'B Y5 ,B Y5 ^a z1 y5 -A y5 -y5+AO13 -y5 .A t -y5 .A o2t -y5 'A l -y5 'A E +y5 +A O13 y5 -A E -y5 $a D0 -y5 'A C y5 *AB oA- Y5 *A8 *31 -Y5 *A7 'B -y5*A5O84 +y5 *A5 O84 Y5 *A2 D9 -Y5 'A *25 y5 -A +0 Y5 'A Y5 .A Y5 -A y5 -A [ -y5.9O09 +y5 .9 O09 y5 +9 u -Y5 ,9 o7d -Y5 '9 E Y5 *9A +2 y5 +9 *31 Y5 $9 y5 -9 -Y5-8O52 +Y5 -8 O52 Y5 '8 p1 -Y5 '8 k -Y5 '8 d -y5 *89 *75 +y5 *75 *89 Y5 *85 D5 Y5 *85 -4 -y5 *82 o6u -y5 *81 c Y5 $8 y5 [ -8 y5 '8 -Y5-7O03 -y5*7BO43 +Y5 -7 O03 +y5 *7B O43 y5 $7 -B -y5 *75 *89 -y5*74O75 -y5*73O67 +y5 *74 O75 +y5 *73 O67 y5 *70 D0 y5 *70 c y5 -7 *06 y5 $7 [ -y5 [ $7 $y *57 -Y5.6OA4 -y5.6O42 -Y5 *6A +B -Y5 *67 [ -y5 *67 +y5 .6 O42 Y5 [ *65 +y5 *67 [ Y5 *65 y5 +6 .5 y5 -6 +4 Y5 $6 -y5,5O72 -y5-5O01 -y5 ,5 sua -y5 $5 c +y5 -5 O01 [ y5 *56 -y5*54O96 y5 +5 .1 y5 $! -5 -y5 -5 $! -y5.4O84 -Y5-4O73 -y5+4O13 -y5 $4 E -y5 ,4 c -Y5 -4 *85 -y5 +4 -6 -y5*45O96 +y5 +4 O13 y5 *43 -y5*41O43 -Y5*41O25 +y5 *41 O43 +Y5 *41 O25 y5 *40 y5 +4 -y5-3O86 -Y5$3O46 -y5 +3 o0u -Y5 *31 *A8 -y5 *31 +9 +Y5 $3 O46 Y5 -3 -y5.2O82 -y5 $2 R9 $y *52 r Y5 $2 $H -Y5 +2 DA -Y5 +2 *9A -Y5 *25 'A -Y5 $1 T5 ] y5 *18 -Y5*17O25 -y5 .1 +5 +Y5 *17 O25 ^@ Y5 $1 -y5+0O71 y5 +0 u -y5 $0 u -Y5 $0 t -^Y *50 o4o -y5 $0 E -y5 +0 -A -y5 *06 -7 -y5*04O23 -Y5*03O15 +y5 *04 O23 +Y5 *03 O15 y5 *02 Y5 $. Y5 ] ] @@ -35807,156 +29946,150 @@ $, y5 y4 ^z z4 Y4 ^z t Y4 $z ^A -Y4Z5O62 -y4Z3O58 +Y4 Z5 O62 +y4 Z3 O58 y4 $' Z3 y4 Z1 $z -y4Z1O84 -Y4Z1O65 +y4 Z1 O84 +Y4 Z1 O65 y4 z1 D3 Y4 ^z Y4 $y ^w -y4y5O68 +y4 y5 O68 y4 Y5 *02 -y4y4OB6 -Y4y4O85 -y4Y4O81 +y4 y4 OB6 +Y4 y4 O85 +y4 Y4 O81 Y4 Y4 u y4 y4 T0 -Y4 Y4 r Y4 Y4 *34 Y4 Y4 $1 Y4 Y3 Y2 -y4Y3O83 +y4 Y3 O83 y4 Y3 t Y4 y2 y4 y4 Y2 Y2 -y4y2O82 -y4y2O71 -Y4Y2O42 +y4 y2 O82 +y4 y2 O71 +Y4 Y2 O42 y4 Y2 t Y4 y2 D3 y4 Y2 *B8 Y4 y2 -5 y4 y2 ,5 -y4Y1O62 +y4 Y1 O62 Y4 Y1 -y4 Y1 [ y4 [ Y1 $$ y4 Y1 Y4 $X Z4 y4 ^x L0 -y4OB4*10 -y4OB2 -Y4OA7$s -]Y4OA3 -y4OA2O72 -y4OA2c -y4OA1] -y4]OA1 -Y4O95 -y4O92o0S -Y4^.O92 -Y4O91*58 -Y4O91$5 -y4O85C -y4O84Z1 -y4O83Y3 -Y4O82*81 -Y4O82-6 -y4O82} -y4O81Y4 -y4O81^M -y4O75-7 -Y4O75*64 -Y4O75 -y4O74.4 -y4O74 -y4O73t -y4O73-0 -Y4O72sr8 -y4O72c -Y4O72+3 -y4O72 -Y4O6B -y4O67i4& -Y4O65Z1 -y4O65,4 -Y4O65 -y4O64y4 -y4O64i6r -y4O64E -Y4O63T5 -Y4O63o8k -Y4O63o1e -Y4O63*13 -}y4O63 -Y4O62Z5 -y4O62Y1 -y4O62o2s -y4O62*02 -y4O62 -Y4O61] -Y4]O61 -y4O57 -Y4O56 -Y4O54] -Y4]O54 -Y4O54 -Y4O53i85 -Y4O53-1 -Y4O52^Y -y4O52i4G -y4O52-2 -Y4O52 -y4O51$. -y4$.O51 -Y4O4A -Y4O48u -Y4O43*73 -Y4O43 -Y4O42Y2 -y4O42i0X -Y4O41K -y4O41D1 -Y4O37p1 -Y4O35 -$?Y4O35 -Y4O34t -$,Y4O34 -Y4O32$2 -Y4O32$_ -Y4$_O32 -Y4[O32 -Y4O32 -[Y4O32 -Y4O31] -Y4]O31 -y4O26o69 -Y4O26i2A -y4O25$u -y4O25$2 -Y4O24r -Y4O24 -Y4O23 -y4O21[ -y4O21 -^*Y4O14 -Y4O13y4 -Y4O13t -Y4O13i2C -Y4O13,8 -Y4O12O42 -Y4O08y4 -Y4O08u -Y4O08t -Y4O07z1 -Y4O07 -Y4O06y4 -Y4O04-2 -Y4O03^c -y4}O03 -y4O01+3 +y4 OB2 +Y4 OA7 $s +] Y4 OA3 +y4 OA2 O72 +y4 OA2 c +y4 OA1 ] +y4 ] OA1 +Y4 O95 +y4 O92 o0S +Y4 ^. O92 +Y4 O91 *58 +Y4 O91 $5 +y4 O85 C +y4 O84 Z1 +y4 O83 Y3 +Y4 O82 *81 +Y4 O82 -6 +y4 O82 } +y4 O81 Y4 +y4 O81 ^M +y4 O75 -7 +Y4 O75 *64 +Y4 O75 +y4 O74 .4 +y4 O74 +y4 O73 t +y4 O73 -0 +Y4 O72 sr8 +y4 O72 c +Y4 O72 +3 +y4 O72 +Y4 O6B +y4 O67 i4& +Y4 O65 Z1 +y4 O65 ,4 +Y4 O65 +y4 O64 y4 +y4 O64 i6r +y4 O64 E +Y4 O63 T5 +Y4 O63 o8k +Y4 O63 o1e +Y4 O63 *13 +} y4 O63 +Y4 O62 Z5 +y4 O62 Y1 +y4 O62 o2s +y4 O62 *02 +y4 O62 +Y4 O61 ] +Y4 ] O61 +y4 O57 +Y4 O56 +Y4 O54 ] +Y4 ] O54 +Y4 O54 +Y4 O53 i85 +Y4 O53 -1 +Y4 O52 ^Y +y4 O52 i4G +y4 O52 -2 +Y4 O52 +y4 O51 $. +y4 $. O51 +Y4 O4A +Y4 O48 u +Y4 O43 *73 +Y4 O43 +Y4 O42 Y2 +y4 O42 i0X +Y4 O41 K +y4 O41 D1 +Y4 O37 p1 +Y4 O35 +$? Y4 O35 +Y4 O34 t +$, Y4 O34 +Y4 O32 $2 +Y4 $_ O32 +Y4 O32 +[ Y4 O32 +Y4 O31 ] +y4 O26 o69 +Y4 O26 i2A +y4 O25 $u +y4 O25 $2 +Y4 O24 r +Y4 O24 +Y4 O23 +y4 O21 [ +y4 O21 +^* Y4 O14 +Y4 O13 y4 +Y4 O13 t +Y4 O13 i2C +Y4 O13 ,8 +Y4 O12 O42 +Y4 O08 y4 +Y4 O08 u +Y4 O08 t +Y4 O07 z1 +Y4 O07 +Y4 O06 y4 +Y4 O04 -2 +Y4 O03 ^c +y4 } O03 +y4 O01 +3 Y4 ^X y4 ^w ^e y4 ^w .6 @@ -35964,10 +30097,6 @@ Y4 $W Y4 ^w Y4 ^V Y4 $v -Y4 u Y4 -Y4uO48 -y4$uO25 -Y4uO08 Y4 u o62 Y4 u ^O y4 u i4N @@ -35980,40 +30109,26 @@ Y4 u .4 Y4 u -2 Y4 u -0 y4 u $! -y4 $! u -y4 t Y3 -y4 t Y2 -y4tO73 -Y4tO34 -Y4tO13 -Y4tO08 -y4 t T7 +y4 T7 t Y4 t o3W y4 t i9m y4 t i8. Y4 T8 y4 Y4 T8 *9A -y4 T7 t y4 T7 -Y4 t *63 y4 t $6 -Y4T5O63 Y4 T4 y4 t +4 y4 t .4 Y4 T3 o90 -y4 t *36 Y4 T3 -Y4 T2 T0 Y4 T0 T2 y4 T0 o39 Y4 $t y4 t $! -y4 $! t -Y4$sOA7 -y4^sO12 +Y4 $s OA7 +y4 ^s O12 y4 ssw -Y4sr8O72 y4 smH c y4 sbv y4 sBm u @@ -36025,30 +30140,27 @@ Y4 s37 i3Y Y4 s2z y4 s29 -3 Y4 s1x -y4 s1 o8. +y4 s1 o8. Y4 s0k Y4 $s -y4rO86 +y4 r O86 Y4 $R t y4 $r i4@ Y4 R9 E y4 R7 $2 y4 R3 Y4 R1 R0 -Y4 R0 R1 Y4 $r y4 ^R -y4 $r [ y4 [ $r y4 ^q y4 p3 o36 y4 p3 o1k -Y4 ^O u Y4 oBt y4 oBN y4 oB4 Y4 Y4 oAy -Y4oA!O42 +Y4 oA! O42 y4 oAu Y4 oAa Y4 oA9 @@ -36059,7 +30171,6 @@ Y4 o9i o4 Y4 o9a Y4 o95 y4 o92 -Y4 o90 T3 Y4 o9= +0 Y4 o90 y4 o90 @@ -36085,12 +30196,11 @@ Y4 o73 y4 } o72 Y4 o7= y4 o7_ -y4o6&O42 +y4 o6& O42 y4 o6u y4 o6j y4 o6a Y4 o69 -Y4 o62 u Y4 o6 y4 o5o Y4 o5n @@ -36106,7 +30216,6 @@ y4 o50 Y4 o4y y4 o4w y4 o4p -Y4 o4 o9i y4 o4m Y4 o4j d Y4 o4i -5 @@ -36120,13 +30229,10 @@ y4 o3n y4 o3k ,2 y4 o3f y4 o3a -y4 o39 T0 -Y4 o35 o7= Y4 o3 y4 o3_ y4 o2y Y4 o2V -y4o2sO62 y4 o2n y4 o2l Y4 o2G c @@ -36139,12 +30245,10 @@ Y4 o1z +2 y4 o1u E y4 o1o *63 y4 o1J -Y4o1eO63 y4 o14 $F y4 o0x y4 o0W Y4 o0t -y4o0SO92 Y4 o0S Y4 o0s y4 o0S @@ -36162,18 +30266,16 @@ y4 $M i0C Y4 $M y4 l $1 y4 L0 z2 -Y4 L0 i3/ +Y4 i3/ L0 Y4 ^l y4 [ ^l -Y4KO41 +Y4 K O41 y4 K C y4 K *53 -y4 $j Z1 Y4 $i $e y4 iAg y4 iA1 ,3 -Y4i9PO24 -y4 i8. t +Y4 i9P O24 Y4 i8c Y4 i88 *54 y4 i87 @@ -36188,10 +30290,7 @@ Y4 i7& Y4 i6d Y4 i6b Y4 i6+ -y4 i4@ $r -y4 i4N u $@ y4 i4e -Y4 i4B u y4 i4b ^i Y4 i4A ^K y4 i4A @@ -36199,8 +30298,6 @@ y4 i48 Y4 i4? y4 i4- ] y4 ] i4- -Y4 i3Y s37 -Y4 i3/ L0 Y4 i3j t y4 i3i Y4 i2y @@ -36209,36 +30306,26 @@ y4 i2s Y4 i1r y4 i1k Y4 i0u -y4 i0C $M y4 ^I Y4 ^h y2 y4 $h -Y4 ^G u Y4 ^g i5H Y4 ^g y4 $g -y4 $F o14 y4 $F -y4EO64 Y4 E R9 -Y4 E o59 -Y4 E o55 -y4 E o1u -Y4 E D7 +Y4 D7 E y4 E -A y4 E *39 y4 E *17 -Y4dO62 -Y4dO57 +Y4 d O62 +Y4 d O57 Y4 DA Y4 D9 $7 -y4D8O03 -Y4 D8 o2* +y4 D8 O03 Y4 D8 y4 D8 $. y4 $. D8 -y4 D7 o0N -Y4 D7 E y4 D7 *20 Y4 D7 ] Y4 ] D7 @@ -36248,59 +30335,46 @@ y4 D6 y4 D5 [ y4 D5 [ Y4 D4 -Y4 D2 u -y4 D0 u -y4 D0 -1 y4 ^D -y4cOA2 -y4CO85 -y4cO72 -y4CO04 +y4 C O04 Y4 c ^P -y4 C K Y4 $c iA3 Y4 c -2 y4 c +2 y4 C y4 ^c Y4 $B Y1 -Y4,BO24 +Y4 ,B O24 Y4 ^b u y4 ^b ^K -y4*B6O85 -y4*B6O84 +y4 *B6 O85 +y4 *B6 O84 y4 ^B -y4 -A o0M y4 -A E -Y4*A8O61 -Y4 'A *72 -y4 .A *63 -Y4 *A4 'A +Y4 *A8 O61 +Y4 *72 'A +y4 *63 .A Y4 *A4 ] Y4 ^A *38 -y4*A1O63 +y4 *A1 O63 y4 $A y4 'A $- y4 ^a Y4 '9 y5 -y4-9O62 -Y4 '9 o3u +y4 -9 O62 y4 +9 D2 -Y4 *9A T8 y4 -9 ^A -y4*98O42 +y4 *98 O42 Y4 *97 -Y4*96O41 +Y4 *96 O41 Y4 *96 o91 Y4 } *96 -y4*94O73 -Y4 *93 *78 +y4 *94 O73 +Y4 *78 *93 Y4 +9 *35 -Y4 *92 y2 Y4 +9 y4 +9 $! y4 $! +9 -Y4 +8 o4b Y4 +8 i7+ y4 *8B y4 Y4 *8B ] @@ -36308,84 +30382,52 @@ Y4 ] *8B Y4 *87 *65 Y4 -8 [ Y4 ^8 -Y4 -7 o85 Y4 $7 D9 -Y4 *7A u -Y4 *78 *93 Y4 *76 y4 *75 [ -Y4 *72 'A y4 -7 *12 y4 *70 o06 Y4 +7 Y4 $! .7 Y4 .7 $! Y4 -7 -Y4-6O82 -Y4.6O06 -y4 $6 t -Y4*68O42 +Y4 .6 O06 +Y4 *68 O42 Y4 *67 ,1 -Y4 *65 *87 Y4 +6 *52 -Y4*64O75 -y4 *64 o8j y4 *64 ,7 Y4 -6 *42 -Y4 *63 t -y4 *63 o1o -y4 *63 .A Y4 .6 .1 -Y4 *60 o45 y4 *60 Y4 +6 y4 $6 -Y4$5O91 -Y4 -5 o4i +Y4 $5 O91 y4 *59 D4 -Y4*58O91 Y4 *56 *75 y4 *56 *49 -y4 *56 y4 .5 .6 -Y4 *54 i88 y4 *53 K y4 *53 -Y4 *52 +6 Y4 *50 y4 +5 +0 Y4 +5 Y4 ,5 -y4.4O74 -y4,4O65 -y4+4O01 -Y4 .4 u y4 +4 t -y4 .4 t Y4 *49 i4k -y4 *49 *56 y4 *49 } ] Y4 *47 -Y4*45O31 +Y4 *45 O31 y4 +4 *54 y4 $4 $5 -Y4 *42 -6 y4 *42 +1 Y4 -4 *12 Y4 } *41 Y4 $4 y4 ,4 y4 -4 -Y4 -3 y2 -Y4+3O72 -Y4-3O21 +Y4 -3 O21 y4 -3 s29 -$y *43 o0@ -y4 ,3 iA1 -y4 *39 E y4 *38 -y4 *36 t -Y4 *35 +9 y4 *35 *24 Y4 *34 Y4 Y4 *34 @@ -36395,61 +30437,32 @@ y4 *31 +0 y4 ,3 $1 y4 -3 -1 y4 ^3 -y4-2O52 -Y4$2O32 -y4$2O25 -y4 $2 R7 -y4 ,2 o3k -Y4 +2 o1z y4 -2 D1 Y4 .2 d Y4 -2 c y4 +2 c -y4*29O76 -y4 *24 *35 +y4 *29 O76 Y4 *24 y4 -2 *32 -y4 ,2 -3 -y4 *20 D7 Y4 *20 y4 -2 -0 -y4 -2 [ y4 -2 Y4 $1 Y4 -Y4^1O85 -Y4-1O53 +Y4 ^1 O85 Y4 ^1 o9K -y4 $1 l -Y4*1BO92 -y4 *17 E -Y4 ,1 *67 +Y4 *1B O92 Y4 *16 .6 -Y4 .1 .6 -y4 +1 *42 -Y4*13O63 -Y4 *13 +0 -y4 $1 ,3 -y4 -1 -3 -y4 *12 -7 -Y4 *12 -4 +Y4 +0 *13 $y *41 *20 Y4 ,1 *16 y4 -1 *16 -y4*10OB4 Y4 ^1 -y4-0O73 Y4 -0 u -Y4 +0 o9= -y4*09O37 -y4 +0 +5 +y4 *09 O37 y4 $0 $4 Y4 *03 D3 -y4 +0 *31 y4 *02 Y5 Y4 *02 y4 -y4*02O62 -y4 -0 -2 -Y4 +0 *13 Y4 +0 Y4 $. Y4 $- @@ -36470,8 +30483,6 @@ Y3 ^Z Y4 Y3 Z5 z4 y3 z5 t Y3 z5 s6E -Y3 z5 *67 -Y3 z4 Z5 y3 Z4 D5 y3 $@ Z4 y3 Z4 @@ -36480,7 +30491,7 @@ y3 Z3 y3 y3 Z3 .5 y3 Z3 y3 Z2 y3 -Y3Z2O61 +Y3 Z2 O61 Y3 Z2 t Y3 Z2 y3 Z2 @@ -36489,24 +30500,22 @@ Y3 z1 i48 Y3 Z1 D7 Y3 Z1 $3 y3 z1 *16 -y3 z1 $. -y3 $. z1 ^ Y3 ^Z Y3 $y E Y3 $y c -y3Y5O5A -Y3Y5O47 -Y3y5O01 +y3 Y5 O5A +Y3 Y5 O47 +Y3 y5 O01 Y3 Y4 z3 Y3 Y4 ^Z -y3Y4O91 +y3 Y4 O91 Y3 y4 $A y3 Y4 *0A y3 y3 Z3 y3 y3 Z2 y3 y3 y3 Y3 Y3 y2 -y3y3O61 +y3 y3 O61 y3 y3 sea y3 Y3 s8h Y3 Y3 $s @@ -36526,14 +30535,13 @@ y3 ] y3 $, y3 y3 $` y3 y3 Y3 y2 Y3 -Y3y2O61 -y3Y2O31 +Y3 y2 O61 +y3 Y2 O31 y3 y2 o7g Y3 y2 K Y3 Y2 -9 y3 Y2 -8 Y3 y2 $. -Y3 $. y2 [ Y3 y2 y3 Y2 ] y3 Y2 @@ -36542,92 +30550,82 @@ Y3 Y1 .8 Y3 Y1 +5 y3 Y1 *10 Y3 ^x ^f -y3OB2E -y3OB1O51 -y3OA3t -y3OA1 -Y3O98o9k -Y3O94] -Y3]O94 -y3O92E -Y3O92c -Y3O92 -Y3O91o7o -y3O91i3o -Y3O91 -Y3O81O31 -Y3O81 -y3O74$+ -y3$+O74 -]Y3O73 -y3O72o0r -Y3O72o0g -y3O72+8 -y3O71*36 -y3O63-5 -y3O62E -y3O62*76 -Y3O62-4 -Y3O62 -y3O62] -y3]O62 -Y3O61Z2 -y3O61o5j -y3O61$D -Y3O61-4 -y3[O61 -y3O54*20 -y3O53i5y -y3O52o0d -Y3[O52 -Y3^$O52 -[Y3O52 -Y3O51y4 -Y3O51i4G -Y3O49 -Y3O47Y5 -y3O46smB -$*Y3O46 -y3O46 -Y3O45 -$@y3O45 -Y3O43*10 -Y3O42t -Y3O42^C -y3O41r -y3O41$3 -y3O41 -y3O36$5 -Y3O34y3 -y3O31Y2 -Y3O31c -Y3O29 -y3O25$p -Y3O24i2b -Y3O23 -Y3O21u -Y3O21$+ -Y3$+O21 -y3O0A -Y3O05$g -Y3O04$4 -Y3O03$W -Y3O03o47 -Y3O02O72 -Y3O01y5 -y3O01C -Y3$WO03 +y3 OB2 E +y3 OB1 O51 +y3 OA3 t +y3 OA1 +Y3 O98 o9k +Y3 O94 ] +Y3 ] O94 +y3 O92 E +Y3 O92 c +Y3 O92 +Y3 O91 o7o +y3 O91 i3o +Y3 O91 +Y3 O81 O31 +Y3 O81 +y3 O74 $+ +y3 $+ O74 +] Y3 O73 +y3 O72 o0r +Y3 O72 o0g +y3 O72 +8 +y3 O71 *36 +y3 O63 -5 +y3 O62 E +y3 O62 *76 +Y3 O62 -4 +Y3 O62 +y3 O62 ] +y3 ] O62 +Y3 O61 Z2 +y3 O61 o5j +y3 O61 $D +Y3 O61 -4 +y3 [ O61 +y3 O54 *20 +y3 O53 i5y +y3 O52 o0d +Y3 ^$ O52 +[ Y3 O52 +Y3 O51 y4 +Y3 O51 i4G +Y3 O49 +Y3 O47 Y5 +y3 O46 smB +$* Y3 O46 +y3 O46 +Y3 O45 +$@ y3 O45 +Y3 O42 t +Y3 O42 ^C +y3 O41 r +y3 O41 $3 +y3 O36 $5 +Y3 O34 y3 +y3 O31 Y2 +Y3 O31 c +Y3 O29 +y3 O25 $p +Y3 O24 i2b +Y3 O23 +Y3 u O21 +Y3 O21 $+ +y3 O0A +Y3 O05 $g +Y3 O04 $4 +Y3 O03 $W +Y3 O03 o47 +Y3 O02 O72 +Y3 O01 y5 +y3 O01 C y3 $W -Y3uO21 y3 ^u o1a Y3 $u $j y3 u D9 Y3 u *6B Y3 u ,5 -y3 t z5 -Y3 t Z2 -y3tOA3 -Y3tO42 y3 t $E y3 t D1 y3 T9 @@ -36641,24 +30639,19 @@ y3 ^t y3 swc .3 Y3 ssM Y3 ssg -Y3 sSf Y3 ssf Y3 so. -y3smBO46 y3 sk5 y3 sjm Y3 sfP +4 -y3 sea y3 Y3 se@ *75 y3 say y3 $S *9A Y3 s93 -y3 s8h Y3 y3 s8. *20 { Y3 s7x Y3 $S .7 y3 s7 -Y3 s6E z5 Y3 $s *61 Y3 s6 y3 s5. $f @@ -36666,35 +30659,33 @@ y3 s4d *15 Y3 s4- Y3 s2 y3 s18 ] -y3 ] s18 Y3 $s y3 ^S -Y3rO54 -Y3rO52 -Y3RAO07 +Y3 r O54 +Y3 r O52 +Y3 RA O07 y3 R9 R9 Y3 $r .9 Y3 R6 E y3 ^R { y3 r -y3$pO25 +y3 $p O25 y3 p4 i1a -y3p2O92 +y3 p2 O92 y3 p2 i3. -y3 [ ^p y3 ^p Y3 oBr Y3 oBp Y3 oBF .9 Y3 oB9 -7 -y3oA.O06 +y3 oA. O06 Y3 oAo Y3 Y3 oAj Y3 oA- Y3 oA Y3 o9y Y3 o9q -Y3o9PO21 +Y3 o9P O21 Y3 o9p Y3 o9k Y3 o9d @@ -36707,9 +30698,8 @@ Y3 o9_ y3 o8m y3 o8l y3 o8i Y3 -y3o7.O16 +y3 o7. O16 Y3 o7w -Y3o7oO91 y3 o7o Y3 o7m y3 o7h -2 @@ -36738,7 +30728,6 @@ y3 o5p .3 Y3 o5n Y3 o5m y3 o5m -y3o5jO61 Y3 o5j y3 o5g Y3 o5D @@ -36751,7 +30740,6 @@ Y3 o5@ Y3 o5! y3 o5_ y3 o5= -Y3 o4R o6a Y3 o4i Y3 o4h y3 o4d @@ -36795,16 +30783,13 @@ Y3 o12 ^E Y3 o0y y3 o0V y3 o0t -y3o0rO72 y3 o0o y3 o0N y3 o0l y3 o0k +7 Y3 o0J -6 -Y3o0gO72 y3 o0F *45 y3 o0F -y3o0dO52 Y3 o0D y3 o08 y3 o03 @@ -36814,13 +30799,11 @@ Y3 $N y3 ^n Y3 $M D0 y3 L6 L3 -y3 L3 L6 Y3 $L Y3 ^L Y3 $l ] Y3 $l y3 k ^Z -Y3 K y2 y3 K D6 Y3 k $A Y3 K ,9 @@ -36829,7 +30812,6 @@ Y3 K ^6 y3 K .4 } Y3 K y3 K [ -y3 [ K y3 k y3 ^j y3 ^i i0p @@ -36876,7 +30858,6 @@ y3 i3x E Y3 i3s y4 y3 i3j y3 i3e -y3 i3a o1i y3 i3& y3 i3! y3 i3_ ^( @@ -36885,44 +30866,33 @@ y3 i2s Y3 i2r y3 i2n y3 i2g -y3i2cO56 +y3 i2c O56 y3 i2a y3 i1i y3 i1e y3 i1( [ y3 i0W *65 -Y3i0MO24 -y3 i0K +Y3 i0M O24 y3 i0h -y3i0EO54 +y3 i0E O54 y3 i04 *06 y3 ^i y3 ^H -Y3$gO05 y3 $G -y3 $f s5. Y3 $F p4 Y3 ^f Y3 E $y -y3EOB2 -y3EO92 -y3EO62 Y3 E R6 -y3 E o25 y3 E i3x y3 E *35 Y3 E *27 y3 $e -2 -Y3 E $! Y3 $! E Y3 ^e y3 ^e -y3$DO61 +y3 $D O61 y3 d i7e -Y3 DA o59 -y3 DA o3E Y3 DA *94 -y3 D9 u y3 D9 *23 y3 D9 -2 y3 } D9 @@ -36940,80 +30910,60 @@ Y3 D5 y3 Y3 D5 -7 [ y3 D4 Y3 D3 c -y3 D1 t -^Y $3 D1 y3 D1 -y3 D0 ^n -Y3 D0 $M Y3 $D [ Y3 ^d y3 d -Y3 c $y -Y3cO92 -Y3cO31 -Y3^cO24 -y3CO01 +Y3 ^c O24 +y3 C O01 Y3 ^c u y3 c shB -y3 C D7 -Y3 c D3 y3 c +B Y3 c +6 Y3 c $* -Y3 $* c y3 ^c y3 +B c Y3 *B9 i6_ Y3 ^B *52 -y3*B1O74 +y3 *B1 O74 Y3 ^B y3 ,B Y3 $A y4 y3 ^A Y3 Y3 'A $t y3 ^a o1m -Y3 $A k Y3 *AB -9 Y3 *A9 .0 y3 *A8 [ y3 $a *56 y3 +A *53 Y3 'A *49 -Y3*A3O92 +Y3 *A3 O92 Y3 +A Y3 ] -A -Y3 -A ] Y3 -A y3 +A y3 $a Y3 -9 Y2 -Y3 .9 oBF Y3 ,9 K y3 *9A $S -Y3 -9 *AB -Y3 *97 o1i Y3 ,9 +7 -Y3 *94 DA Y3 *94 ] Y3 ] *94 -Y3 *93 *82 +Y3 *82 *93 Y3 ] .9 Y3 .9 ] y3 +9 y3 .9 -Y3 .8 Y1 Y3 -8 t y3 -8 i3; -Y3 -8 D5 ] Y3 *8A Y3 +8 ^a -Y3*89O31 -y3 +8 *76 +Y3 *89 O31 +y3 *76 +8 Y3 +8 ,7 -y3 *86 Y4 Y3 *86 Y2 Y3 +8 *32 -Y3 *82 *93 Y3 *81 Y3 ,8 y3 ,8 @@ -37021,82 +30971,53 @@ y3 -8 ] y3 -8 Y3 +7 t Y3 .7 $S -Y3 -7 oB9 -y3 +7 o0k -Y3 ,7 i96 y3 '7 $F -Y3 +7 ,9 [ y3 *79 -Y3 ,7 +8 Y3 *76 r -y3 *76 +8 -Y3 *75 se@ Y3 ,7 *56 -y3*73O42 +y3 *73 O42 y3 *73 *50 y3 [ *73 -Y3*72O72 +Y3 *72 O72 y3 ,7 *15 Y3 *70 E Y3 $7 Y3 ,7 Y3 ,6 Y3 -y3 -6 y3 -Y3 -6 o0J -Y3 ^6 K Y3 -6 D1 Y3 +6 c -Y3 *6B u -y3*69O62 -y3 *68 Y4 -y3 *67 o3m +y3 *69 O62 y3 .6 *72 y3 *65 o6v y3 *65 ^m y3 *65 -Y3 *64 *57 -y3 *63 T1 +Y3 *57 *64 Y3 *62 ] Y3 ] *62 Y3 *61 $s y3 *60 K Y3 *60 ^B y3 ^6 -y3 .5 Z3 Y3 +5 Y1 -y3-5O63 -y3$5O36 -Y3 ,5 u -y3 +5 o4c +y3 $5 O36 y3 $5 f -Y3 +5 D7 -Y3 *57 *64 y3 *56 $a -y3 *53 f -y3 *53 +A Y3 { *53 y3 *53 ] y3 ] *53 Y3 $5 *24 Y3 $5 +1 y3 +5 ,1 -y3 *50 *73 y3 *50 Y3 +5 y3 .5 -Y3-4O62 -Y3-4O61 -Y3$4O04 -y3 ,4 t +Y3 $4 O04 Y3 +4 sfP -Y3 -4 o6s y3 .4 K -Y3 *49 'A { y3 *49 y3 *48 -3 Y3 *47 y3 *45 Y4 -y3 *45 o0F y3 *45 *20 Y3 *40 $0 Y3 *40 @@ -37105,41 +31026,23 @@ Y3 .4 Y3 -4 y3 +4 y3 ,4 -[ y3 +4 Y3 -3 Y3 y3 ,3 y1 -y3$3O41 -y3 .3 swc -y3 .3 o5p Y3 -3 i3o y3 *39 ,9 -y3*36O71 -y3 *35 E y3 $3 $5 -y3 -3 *48 -Y3 *32 +8 y3 +3 *24 y3 $3 y3 .3 -y3 -2 o7h y3 -2 $e -y3 -2 D9 y3 *28 -Y3 *27 E y3 *27 Y3 *24 i2# Y3 *24 $5 -y3 *24 +3 -y3 *23 D9 $` y3 *23 y3 $2 .2 -y3 .2 $2 -Y3 *21 z5 Y3 *21 Y3 .2 ,1 -y3*20O54 -y3 *20 s8. -y3 *20 *45 y3 +2 +0 y3 .2 Y3 -1 Y3 @@ -37147,28 +31050,15 @@ Y3 -1 y3 Y3 $1 Y1 Y3 $1 o9A Y3 ,1 E -Y3 +1 D7 -y3*16O62 -y3*16O52 -y3 *15 s4d -y3 *15 ,7 +y3 *16 O62 +y3 *16 O52 Y3 *15 *50 -Y3 +1 $5 -y3 ,1 +5 -Y3 *14 o6m -Y3 ,1 .2 -y3 *10 Y1 -Y3*10O43 Y3 +0 y2 -Y3 +0 iA1 -y3 +0 iA0 -Y3 .0 *A9 Y3 *08 ] y3 *05 ^3 Y3 *04 ,5 Y3 $0 *40 y3 *02 ^k -y3 +0 +2 Y3 .0 y3 -0 Y3 $+ @@ -37185,21 +31075,18 @@ y3 $_ y3 $> y3 ] } y3 ] -y3 [ $- ] y3 [ Y2 $z Z1 Y2 ^Z Y5 Y2 $z i0a Y2 $Z *9A y2 z4 z3 -y2 z3 z4 y2 z3 u Y2 Z3 E Y2 $ Z3 Y2 Z3 -$ Y2 z3 -y2z2O63 -y2z2O53 +y2 z2 O63 +y2 z2 O53 Y2 z2 ^S Y2 Z2 -8 y2 Z2 *79 @@ -37211,9 +31098,9 @@ y2 Z1 *42 Y2 z1 { y2 y5 z2 Y2 Y5 ^Z -Y2Y5O53 -y2Y4O46 -y2Y4O31 +Y2 Y5 O53 +y2 Y4 O46 +y2 Y4 O31 Y2 y4 $t Y2 Y4 K Y2 y4 K @@ -37231,7 +31118,7 @@ y2 y4 ] y2 ] y4 Y2 Y3 Z2 y2 y3 y1 -y2Y3O41 +y2 Y3 O41 y2 y3 c Y2 Y3 *76 y2 y3 -3 @@ -37239,9 +31126,9 @@ Y2 Y3 ] Y2 y3 [ y2 Y3 y2 y3 -Y2y2O84 -Y2y2O73 -Y2Y2O45 +Y2 y2 O84 +Y2 y2 O73 +Y2 Y2 O45 Y2 Y2 o7u Y2 Y2 o2l Y2 Y2 o1o @@ -37261,16 +31148,14 @@ y2 Y2 [ y2 $ Y2 y2 { Y2 y2 [ Y2 -$ y2 Y2 -y2 y2 $* y2 $* y2 $? y2 y2 $! y2 y2 } y2 y2 ^- y2 y2 y2 y1 y3 -y2Y1O51 -Y2Y1O25 +y2 Y1 O51 +Y2 Y1 O25 Y2 Y1 o5j y2 Y1 i14 y2 y1 ^C @@ -37280,105 +31165,103 @@ Y2 $@ Y1 y2 Y1 $@ } y2 y1 Y2 ^Y -Y2OB1 -y2O94-4 -y2O91Y2 -y2O91i1a -y2O83slo -y2O83o7. -Y2O83+7 -Y2O83 -y2O82o1A -y2O81sby -y2O81*34 -[y2O81 -Y2O73-6 -Y2O73$3 -Y2O73 -y2$.O73 -y2O73 -Y2O72o98 -Y2O72-A -Y2O72 -y2O71-4 -y2O71 -Y2O65$i -Y2O64 -Y2O63T0 -y2O63skq -y2O63^k -y2O62.3 -y2O62*16 -Y2O62$1 -}Y2O62 -y2O61se. -Y2O61^d -y2O61*05 -Y2O61 -Y2O57 -Y2O54 -y2O53^i -y2O53E -Y2O52K -y2O52E -y2O51Y1 -[y2O51 -Y2O46Y5 -y2O46Y4 -y2O46$. -y2$.O46 -Y2O45Y2 -y2O45C -y2O43z2 -y2O43y2 -y2O43i4P -Y2O43 -Y2O42d -y2O42-9 -y2O41Y3 -Y2O41o1N -Y2O41,8 -$.Y2O41 -y2O35Y5 -y2O35y5 -y2O35i4_ -Y2O34o5w -y2O34,3 -Y2O34[ -Y2O32T0 -y2O32+3 -y2O31o8 -y2O31o1x -y2O31$J -y2O31 +Y2 OB1 +y2 O94 -4 +y2 O91 Y2 +y2 O91 i1a +y2 O83 slo +y2 O83 o7. +Y2 O83 +7 +Y2 O83 +y2 O82 o1A +y2 O81 sby +y2 O81 *34 +[ y2 O81 +Y2 O73 -6 +Y2 O73 $3 +Y2 O73 +y2 $. O73 +y2 O73 +Y2 O72 o98 +Y2 O72 -A +Y2 O72 +y2 O71 -4 +y2 O71 +Y2 O65 $i +Y2 O64 +Y2 O63 T0 +y2 O63 skq +y2 O63 ^k +y2 O62 .3 +y2 O62 *16 +Y2 O62 $1 +} Y2 O62 +y2 O61 se. +Y2 O61 ^d +y2 O61 *05 +Y2 O61 +Y2 O57 +Y2 O54 +y2 O53 ^i +y2 O53 E +Y2 O52 K +y2 O52 E +y2 O51 Y1 +[ y2 O51 +Y2 O46 Y5 +y2 O46 Y4 +y2 O46 $. +y2 $. O46 +Y2 O45 Y2 +y2 O45 C +y2 O43 y2 +y2 O43 i4P +Y2 O43 +Y2 O42 d +y2 O42 -9 +y2 O41 Y3 +Y2 O41 o1N +Y2 O41 ,8 +$. Y2 O41 +y2 O35 Y5 +y2 O35 y5 +y2 O35 i4_ +Y2 O34 o5w +y2 O34 ,3 +Y2 O34 [ +Y2 O32 T0 +y2 O32 +3 +y2 O31 o8 +y2 O31 o1x +y2 O31 $J +y2 O31 y2 $x -3 -Y2O28+3 -Y2O25Y1 -Y2O23z2 -Y2O23y3 -Y2O23$/ -Y2$/O23 -[Y2O23 -Y2O21y3 -y2O21+5 -Y2O17t -Y2O14z3 -Y2O13y5 -Y2O12*21 -Y2O12 -}Y2O12 -Y2O0B -Y2O0A -Y2O07y2 -Y2O07 -Y2O03$@ -Y2$@O03 -Y2O02t -Y2O02^k -Y2O02-3 -Y2O02-0 -y2O01st5 -Y2O01+3 +Y2 O28 +3 +Y2 O25 Y1 +Y2 O23 z2 +Y2 O23 y3 +Y2 O23 $/ +Y2 $/ O23 +[ Y2 O23 +Y2 D2 y3 +y2 O21 +5 +Y2 O17 t +Y2 O14 z3 +Y2 O13 y5 +Y2 O12 *21 +Y2 O12 +} Y2 O12 +Y2 O0B +Y2 O0A +Y2 O07 y2 +Y2 O07 +Y2 $@ O03 +Y2 O02 t +Y2 O02 ^k +Y2 O02 -3 +Y2 O02 -0 +y2 O01 st5 +Y2 O01 +3 y2 $w Z2 Y2 $W p3 y2 $w @@ -37386,17 +31269,13 @@ Y2 ^v L5 Y2 $v *53 y2 ^V y2 ^v -y2 u z3 Y2 u T6 y2 u o0F Y2 u D7 -Y2 u d Y2 u -A y2 u +5 y2 u +1 Y2 $t y4 -Y2tO17 -Y2tO02 y2 t D3 Y2 t $c Y2 t *96 @@ -37410,12 +31289,8 @@ y2 t *53 y2 t .5 y2 T4 y4 Y2 ^t $2 -y2 T2 ] y2 ] T2 -Y2 T1 *B8 y2 T1 *67 -Y2T0O63 -Y2T0O32 y2 T0 ^J Y2 T0 ,B Y2 T0 *67 @@ -37426,31 +31301,24 @@ Y2 $t Y2 t } y2 ^t y2 syl l -y2st5O01 Y2 ssc y2 ss8 c Y2 sr, -y2 sr; y2 snb y2 slr Y2 slp y2 slp -y2sloO83 -y2skqO63 Y2 sio c y2 sia y2 sFB o3W -y2se.O61 Y2 sex *56 Y2 sdm ^\ y2 sd/ $= y2 scg y2 ^s C -y2sbyO81 Y2 sbl Y2 sbK y2 sat -y2 sAI Y2 s96 Y2 s7g y2 s7. @@ -37470,12 +31338,11 @@ Y2 r +9 y2 R4 R4 Y2 R4 D5 Y2 R4 -Y2 r *32 +Y2 r *23 Y2 r *30 y2 r -3 y2 r *27 y2 R2 -4 -Y2 r *23 Y2 ^R .2 y2 R1 y2 R0 *15 @@ -37485,8 +31352,8 @@ y2 q *56 y2 $Q y2 $q y2 q -y2p3O09 -y2p2O03 +y2 p3 O09 +y2 p2 O03 Y2 p1 ^r y2 p1 ^r y2 p1 i6A @@ -37509,7 +31376,7 @@ Y2 o9 ] Y2 o9- Y2 o8@ Y1 Y2 o8x -y2o8vO35 +y2 o8v O35 Y2 o8s Y2 o8r y2 o8a @@ -37517,24 +31384,23 @@ y2 o85 *24 Y2 o84 y2 o82 Y2 o8* *12 -Y2 o8 *0A +Y2 o8 *0A Y2 o8% Y2 o8! Y2 o8 -y2o7.O83 Y2 o7r Y2 o7K Y2 o7j Y2 o7f y2 o7. -7 -Y2 o75 o5o +Y2 o5o o75 Y2 o74 Y2 o7/ Y2 o6y -9 y2 o6y y2 o6u C Y2 } o6s -y2 o6r o4K +y2 o4K o6r y2 o6R E Y2 o6r y2 o6p @@ -37546,7 +31412,6 @@ y2 o63 o1f $= Y2 o63 y2 o5W y2 o5v -Y2 o5o o75 Y2 o5j Y1 y2 o5f *25 Y2 o5f @@ -37564,7 +31429,6 @@ Y2 o4v Y2 o4q Y2 o4p *34 Y2 o4L y2 -y2 o4K o6r y2 o4h *12 y2 o4g -2 Y2 o4g @@ -37581,7 +31445,6 @@ Y2 o4[ Y2 o4- y2 o4_ Y2 o3x Z1 -y2 o3W sFB y2 o3r p4 Y2 o3r y2 o3@ p1 @@ -37611,13 +31474,9 @@ y2 o2d *47 y2 o2C y2 o2+ y2 o2, -y2o1xO31 Y2 o1o Y2 -Y2o1NO41 y2 o1k -y2 o1f o63 y2 o1f ^c -y2o1AO82 y2 o13 y2 o10 y2 o0X y1 @@ -37636,7 +31495,6 @@ y2 o0I y2 o0H Y2 o0g -5 y2 o0g -y2 o0F u y2 o0e *57 Y2 o0d *54 y2 o0c @@ -37648,25 +31506,19 @@ Y2 o02 y2 o02 Y2 $o Y2 ^N -y2 ^m K +y2 K ^m y2 ^M y2 l syl Y2 $l $S -y2 l o4w Y2 l +B y2 L0 y1 -Y2 l Y2 K y4 y2 k Y4 y2 k y3 -Y2 K y2 -Y2KO52 +Y2 K O52 y2 ^k ^u -y2 k T8 Y2 K o5d -y2 k o44 Y2 k o0O -y2 K ^m y2 K i6u Y2 k D4 Y2 k $7 @@ -37675,12 +31527,12 @@ Y2 K $^ Y2 $K Y2 ^K y2 ] $K -y2$JO31 +y2 $J O31 y2 ^J *34 -Y2$iO65 +Y2 $i O65 Y2 ^i i1b y2 iBe -Y2iB5O63 +Y2 iB5 O63 Y2 iB Y2 iA4 Y2 iA@ @@ -37696,11 +31548,11 @@ Y2 i80 Y2 i8; Y2 i8_ y2 i8_ -Y2i7`O02 +Y2 i7` O02 y2 i7v Y2 i7j y2 i7e -y2i7dO13 +y2 i7d O13 Y2 i7d y2 i7c Y2 i7 *42 @@ -37716,13 +31568,11 @@ Y2 i6* Y2 i6 y2 i6. y2 i5w -Y2 i5. s04 Y2 i5R y2 i5q Y2 i5e Y2 i5a y2 i4s $? -y2 $? i4s Y2 i4p y2 i4M Y2 i4g @@ -37763,39 +31613,32 @@ Y2 i1r y2 i1n Y2 i1l y2 i1c -y2i19O31 -y2 i14 Y1 +y2 i19 O31 y2 i14 +0 y2 i13 -y2i12O46 +y2 i12 O46 Y2 i1. Y2 i1, Y2 i0y *89 y2 i0t -Y2 i0k Y2 y2 i0h y3 y2 i0F ,5 y2 i0d y2 i0B -Y2 i0a $z Y2 $i y2 ^I y2 ^h .9 Y2 $H Y2 ^h y2 ^H -y2 $G z1 Y2 $G y2 ^g -y2^FO46 +y2 ^F O46 Y2 $f t Y2 $F i6t y2 f i5S Y2 $[ $f y2 ^f -Y2 E Z3 -y2EO53 -y2EO52 y2 E T1 Y2 E o9t y2 E i4d @@ -37803,25 +31646,14 @@ Y2 E $7 Y2 $e *17 Y2 E ^@ Y2 $E -y2 E ] y2 ] E y2 ^e -y2dO04 -Y2 d u -Y2 d ^r -y2 d ^r Y2 D8 Y4 -Y2 D7 u y2 D6 +4 -Y2 D5 R4 Y2 D5 *43 -Y2 D4 k Y2 D4 ^A Y2 D4 } -y2 D3 t -Y2 D3 o0l y2 D3 *65 -Y2 D2 y3 y2 ^d *21 } Y2 D2 y2 D2 @@ -37829,17 +31661,12 @@ Y2 D1 y2 Y2 D1 $3 y2 $_ ^d y2 ] ^d -y2 ^d ] y2 C y4 -y2CO45 Y2 c T4 y2 c ss8 y2 c slB Y2 c sio -Y2 c s5* -y2 c oB1 Y2 c ^J -y2 c i4c y2 c +A y2 c *67 y2 C *62 @@ -37847,25 +31674,18 @@ y2 C *58 y2 C *42 Y2 C *25 y2 c -0 -Y2 C [ Y2 $C Y2 c $? Y2 c { -Y2 $? c Y2 $c Y2 ^c $& Y2 c [ y2 c -Y2 ,B T0 Y2 +B l -Y2 *B8 T6 -Y2 *B8 T1 Y2 -B -7 y2 ,B *57 Y2 $A y4 Y2 -A u -y2 $A o38 -Y2 -A o2l y2 'A ^o Y2 +A i9/ y2 +A c @@ -37880,12 +31700,9 @@ Y2 $/ -A Y2 ,A Y2 -A y2 '9 y3 -Y2 -9 o6y -Y2 *9A $Z Y2 *9A *86 Y2 +9 .7 y2 -9 ,7 -Y2 *96 t Y2 *94 *45 Y2 ,9 .4 Y2 $$ ,9 @@ -37896,14 +31713,13 @@ y2 .9 y2 -9 Y2 +8 y5 Y2 +8 y3 -y2+8O62 +y2 +8 O62 Y2 -8 D6 Y2 +8 d -y2*8AO04 +y2 *8A O04 Y2 *89 $^ Y2 $^ *89 Y2 *87 *6A -Y2 *86 *9A Y2 *84 o48 Y2 *84 D8 y2 ,8 *45 @@ -37913,65 +31729,45 @@ Y2 *81 d Y2 +8 Y2 -8 Y2 ,7 y1 -Y2+7O83 -Y2 $7 k -Y2 $7 E Y2 *7B oB! Y2 *7B -Y2 -7 -B y2 *79 ,6 -Y2 .7 +9 -y2 ,7 -9 -Y2 *76 o0a Y2 *76 ^L Y2 *76 ,3 Y2 *76 *15 Y2 ,7 ,6 -y2 *75 t -y2 +7 *56 +y2 *56 +7 y2 *74 *36 Y2 *74 .1 y2 +7 *40 Y2 *73 *12 y2 *72 y2 *71 $A -y2 *71 *40 -Y2*70O12 +y2 *40 *71 +Y2 *70 O12 Y2 *70 } y2 *70 Y2 +7 [ y2 +7 -Y2-6O73 -y2 +6 T0 Y2 +6 t y2 -6 s04 Y2 -6 s0. y2 +6 r y2 ^6 p5 -Y2 +6 p1 -Y2 ,6 o4- -Y2 -6 o2n -y2*6AO46 -Y2 *6A *87 +y2 *6A O46 y2 *6A *10 y2 -6 $A -Y2 *69 T5 y2 *69 *43 y2 *69 -2 Y2 *68 D4 y2 *68 } -y2 *67 T1 -Y2 *67 T0 Y2 *67 r -y2 *67 c Y2 *67 *B7 -y2 ,6 *79 y2 *65 $a Y2 *64 i6 y2 *63 .4 y2 ^6 *34 Y2 *62 ^m -y2 *62 C y2 *61 $A Y2 *61 { Y2 *60 @@ -37981,156 +31777,90 @@ y2 ,6 $y *26 y2 .5 y2 y2 +5 u -y2 .5 t -Y2 -5 o45 -Y2 -5 o0g Y2 .5 K y2 *5B [ Y2 *58 y3 -Y2*58O75 -y2 *58 C -y2 *57 o0e -y2 *57 ,B +Y2 *58 O75 y2 *57 -y2 *56 T0 -Y2 *56 sex -y2 *56 +7 y2 *56 *05 -Y2 *54 o0d y2 ,5 *48 Y2 *53 $v -y2 *53 t Y2 -5 *34 y2 { *53 -Y2 *52 *30 -Y2 *52 +Y2 *30 *52 Y2 *51 D3 Y2 -5 *12 y2 *50 $s Y2 *50 +1 Y2 ,5 y2 +5 ] -y2 ] +5 y2 -5 y2 ^5 -y2-4O94 -y2-4O71 -y2 -4 R2 y2 +4 ^P -y2 +4 D6 y2 *4A -Y2 .4 ,9 Y2 *48 i8- Y2 *48 -y2 -4 ,8 -y2 *47 o2d -y2 .4 *63 Y2 *45 r -y2 *45 ,8 -Y2 *43 D5 -y2 *43 *69 y2 *42 Z1 -y2 *42 T0 -Y2 *42 i7 -y2 *42 C Y2 *42 Y2 *41 *31 Y2 *40 D4 -y2 *40 *71 -y2 *40 +7 y2 ] .4 y2 .4 ] -Y2$3O73 -y2.3O62 -y2 -3 $x +Y2 $3 O73 Y2 -3 s30 -Y2 -3 o2o -Y2 $3 D1 -Y2 ,3 *76 Y2 *37 -y2 *36 *74 Y2 *36 { y2 *36 y2 *35 -2 -y2*34O81 -Y2 *34 -5 y2 *32 $@ -y2 $@ *32 -Y2 *31 o0P y2 *30 y4 Y2 *30 r -Y2 *30 *52 Y2 ,3 [ y2 +3 { y2 +3 y2 ^3 Y2 -2 Y4 Y2 +2 Y2 -Y2^2O54 +Y2 ^2 O54 y2 +2 s35 -y2 -2 o4g -y2 +2 o0w -Y2 +2 o0B y2 -2 ^B Y2 *28 *23 -y2 *28 -Y2*27O01 -y2 -2 *69 +Y2 *27 O01 Y2 *26 -Y2 *25 C -y2 *25 -y2 *24 o85 -y2 -2 *35 y2 *21 *24 Y2 *21 $@ Y2 *21 Y2 $@ *21 $% Y2 *20 -y2 +2 -0 +y2 -0 +2 Y2 $2 Y2 .2 Y2 ,2 } Y2 ^2 Y2 ^1 z3 y2 -1 y2 -Y2$1O62 +Y2 $1 O62 y2 +1 u -Y2 .1 ^R y2 -1 i1z y2 *19 $1 Y2 *17 $e -Y2 .1 *74 Y2 *16 i5. -y2 *15 R0 -Y2 *15 *76 -Y2 +1 *50 { y2 *15 Y2 *13 -Y2 *12 o8* -y2 *12 o4h -Y2 *12 *73 -Y2 *12 -5 -Y2 *12 y2 $1 *19 -y2 *10 *6A Y2 $1 $* [ y2 +1 Y2 +0 p1 y2 .0 o12 -y2 +0 i14 y2 .0 ^i -Y2*08O41 +Y2 *08 O41 { y2 *08 -y2*07O65 -y2*05O61 +y2 *07 O65 y2 *05 y2 *04 Y1 -$y *20 *41 -$% Y2 *02 -y2 -0 +2 Y2 $0 y2 $0 [ -y2 [ $0 y2 -0 Y2 $/ Y2 $ @@ -38168,37 +31898,22 @@ $? y2 [ $* y2 [ y2 ^y .2 -Y1 $z y4 y1 ^z Y1 y1 ^z o2q Y1 $z -6 -y1 Z5 ^B -$ Y1 Z5 -$* y1 z5 y1 Z4 Y4 -Y1z4O35 -$ y1 Z4 -^@ y1 z4 -Y1z3O34 Y1 z1 p1 Y1 z1 $A y1 Z1 +5 -$\ Y1 z1 -$` Y1 z1 -y1 z1 $@ y1 $@ z1 Y1 $y k -Y1Y5O52 -y1y5O13 -Y1 y4 $z -Y1y4O42 +y1 y5 O13 +Y1 y4 O42 Y1 Y4 i6F -Y1 Y4 i0R Y1 [ y4 $$ Y1 y4 y1 ^) y4 y1 y3 Y1 -Y1Y3O03 Y1 y3 t Y1 Y3 oAx Y1 Y3 ,9 @@ -38206,65 +31921,58 @@ Y1 Y3 ,9 Y1 y2 o0L y1 Y2 C y1 Y2 -y1 Y1 ^z y1 Y1 y3 Y1 y1 ^w y1 Y1 i0b Y1 $# Y1 -Y1 Y1 -$* Y1 Y1 Y1 ^. y1 -{ Y1 y1 -^# Y1 y1 { y1 Y1 -^# y1 Y1 +^# Y1 y1 y1 ^! y1 Y1 $y y1 { $y Y1 $x Z5 Y1 $x Z2 -Y1O93iB7 -Y1O73$. -Y1$.O73 -y1O71*13 -$.Y1O64 -$y$1O64 -Y1O63t -Y1O63s7/ -Y1O62o4w -{Y1O62 -y1O61o0i -y1O52Y2 -Y1O52T1 -y1O51*13 -y1O43*31 -Y1O43-0 -y1O42$( -y1$(O42 -Y1O41$+ -Y1O41$@ -Y1$+O41 -Y1$@O41 -$!Y1O41 -Y1O36s0* -Y1O32^I -y1^!O32 -y1O32 -Y1O23L0 -Y1O23$1 -Y1O21-7 -Y1O13y1 -Y1O13i5- -y1O13*34 -$'Y1O13 -Y1O12 -y1O12^@ -{Y1O05 -y1O04 -Y1O03Y3 -Y1O02*43 -$'Y1O02 -Y1O01C +Y1 O93 iB7 +Y1 O73 $. +Y1 $. O73 +y1 O71 *13 +$. Y1 O64 +$y $1 O64 +Y1 O63 t +Y1 O63 s7/ +Y1 O62 o4w +{ Y1 O62 +y1 O61 o0i +O42 z1 Y2 +Y1 O52 T1 +y1 O51 *13 +y1 O43 *31 +Y1 O43 -0 +y1 O42 $( +y1 $( O42 +Y1 O41 $+ +Y1 O41 $@ +Y1 $+ O41 +Y1 $@ O41 +$! Y1 O41 +Y1 O36 s0* +Y1 O32 ^I +y1 ^! O32 +y1 O32 +Y1 O23 L0 +Y1 O23 $1 +Y1 O21 -7 +Y1 O13 y1 +Y1 O13 i5- +y1 O13 *34 +$' Y1 O13 +Y1 O12 +y1 O12 ^@ +y1 O04 +Y1 O02 *43 +$' Y1 O02 +Y1 O01 C y1 $x +0 y1 $w ,3 y1 ^V ^R @@ -38273,86 +31981,62 @@ y1 $u i4F Y1 u i2P Y1 u *57 Y1 $u -Y1 t y3 -Y1tO63 -Y1 t T8 Y1 t o6 Y1 t o1U y1 $t o16 y1 t i1s -Y1 T8 t y1 T6 *32 Y1 T5 o3O -Y1 T5 { Y1 T4 $5 Y1 T4 y1 t ,2 -Y1T1O52 Y1 T1 $A Y1 T1 ,9 Y1 T1 $# Y1 T1 -$$ Y1 T1 -$@ Y1 T1 $% Y1 t $- Y1 t Y1 sy@ y1 sws Y1 sue Y1 st_ -Y1 sO) -Y1 so) Y1 $s i41 y1 si* -y1 sgl Y1 seK *46 -Y1 sec Y1 se] y1 sAJ Y1 sa! i0t Y1 s8b -Y1s7/O63 { Y1 s7o y1 s75 y1 s6. ,4 Y1 s5@ -Y1 s3H Y1 s3! Y1 s3, Y1 s2z Y1 s2p $d y1 s-2 Y1 s1* $@ -Y1 $@ s1* -Y1s0*O36 Y1 ^s -} y1 $S y1 $s y1 ^r l Y1 R6 R6 -Y1 R6 o1w +Y1 o1w R6 Y1 R4 .2 y1 r ^3 y1 r ^ y1 r -y1 q z3 -Y1 q -7 y1 ] ^Q -y1 ^Q ] y1 ^q $_ y1 $q Y1 $p $y -Y1p5O0B +Y1 p5 O0B y1 p5 i1A Y1 p4 $h -Y1 p4 E Y1 ^P *38 -Y1 p2 $j y1 p2 *21 Y1 ^p ,2 Y1 p1 C -$; Y1 p1 -$- Y1 p1 Y1 oB1 Y1 o9r $0 Y1 o9c @@ -38360,7 +32044,6 @@ Y1 o7G ^N y1 o6z Y1 o6Y Y1 o6X -Y1 o6 t Y1 o6r Y1 o6p y1 o67 E @@ -38369,7 +32052,6 @@ Y1 o6. Y1 o5y Y1 o5K +8 y1 o59 *17 -Y1o4wO62 Y1 o4v Y1 o4k o0K Y1 o4e @@ -38377,9 +32059,7 @@ y1 o46 Y1 o44 *38 Y1 o4@ [ Y1 o4@ -Y1 o3T y1 o3p c -Y1 o3O T5 y1 o2Y l Y1 o2s Y1 o2j *20 @@ -38388,14 +32068,10 @@ y1 o2 E Y1 o2- y1 o2. y1 o2! -Y1 o1w R6 y1 o1D i1d -y1 o16 $t Y1 o0X Y1 o0w Y1 o0L +7 -Y1 o0K o4k -y1o0iO61 $? Y1 o0F Y1 o0B y2 Y1 o0A @@ -38405,28 +32081,20 @@ Y1 ^n i50 Y1 $m ^C y1 $m Y1 ^L y1 -y1 l ^r y1 ^l p1 Y1 L9 ^A -Y1 l $7 Y1 L5 i6H y1 L1 i2m Y1 ^L $1 -Y1L0O23 Y1 ^l -Y1 k $y Y1 ^k ^v y1 K i1w Y1 k i1t y1 K C Y1 $k ^- Y1 k -y1 ^J z1 -y1 ^J r y1 $j *12 y1 ^J -{ y1 ^j -Y1^IO42 Y1 i9z Y1 i9. Y1 i8_ *79 @@ -38436,7 +32104,6 @@ y1 i7K ,8 y1 i76 *40 y1 i6w Y1 i6i -Y1 i6H L5 Y1 i6F Y4 Y1 i66 -5 Y1 i6_ -5 @@ -38447,8 +32114,7 @@ Y1 i5o *34 Y1 i5i i3v y1 i5F y1 i59 -y1 i5 -0 -Y1 i5. +y1 i5 -0 Y1 i4x c y1 i4i y1 i4F $u @@ -38459,11 +32125,9 @@ Y1 i41 y1 i4- y1 i3p Y1 i34 -Y1 i2P u -y1 i2m L1 y1 } i2m y1 i2m -Y1 i2 l +Y1 i2 l Y1 i2C y1 i26 Y1 i2 @@ -38473,45 +32137,32 @@ y1 i1s } Y1 i1o E y1 i1f y1 i1d -} Y1 i19 -Y1 } i12 -y1i11O35 +y1 i11 O35 { Y1 i11 Y1 i0y $a -Y1 i0t sa! Y1 i0t -Y1 i0R Y4 Y1 i0p t -y1 i0l d y1 i0h i11 -y1 i0b Y1 Y1 i09 $* -Y1 $* i09 y1 ^H i24 ^@ Y1 ^H y1 ^G z1 -Y1^GO41 +Y1 ^G O41 Y1 $@ ^G y1 ^g y1 ^F ^V Y1 f i6- -Y1 f *97 -Y1 $F *85 Y1 f *79 +Y1 $F *85 $ Y1 f Y1 E y5 y1 ^e ^Y -Y1 E p4 -y1 E o67 y1 E o2 -Y1 E i1o y1 E ^B -Y1 E $7 +Y1 $7 E Y1 E ^4 Y1 E -$* Y1 E -Y1dO0A -Y1 $d s2p +Y1 d O0A y1 d ^A y1 D8 i6. Y1 D6 ^. @@ -38522,31 +32173,18 @@ Y1 D2 $_ Y1 $_ D2 y1 ^d ^$ y1 d -y1 C Y2 -y1 c o3p -y1 C K -Y1 c i7x -Y1 c i4x -Y1 c *23 y1 ^C $2 y1 $c .1 -Y1 C $@ Y1 $@ C -Y1 ^c } $\ Y1 c y1 C -y1 ^B Z5 $/ Y1 $b y1 { $B { y1 $b -Y1 $A z1 -Y1 $A T1 -Y1 $a i0y Y1 ^a $7 -Y1*A6O91 +Y1 *A6 O91 Y1 ^A ^@ y1 ,A -Y1 ,9 T1 Y1 $9 -9 Y1 -9 $9 $! Y1 *98 @@ -38554,43 +32192,27 @@ Y1 ,9 -6 Y1 *93 -7 $- Y1 *91 y1 -8 Y1 -Y1 +8 o5K Y1 $8 *65 Y1 *85 $F Y1 *83 ,3 Y1 +8 $0 y1 ,8 -Y1 +7 o0L -Y1 $7 l -Y1 $7 E -Y1 -7 *93 Y1 *78 -Y1*75O23 +Y1 *75 O23 Y1 -7 .5 y1 *73 .1 y1 *73 $. -^. y1 *70 -y1 +7 -y1 .7 Y1 -6 $z Y1 *6B '9 -Y1 -6 ,9 Y1 [ *68 Y1 *65 $8 Y1 $6 *56 y1 ^6 *36 y1 *62 *23 -Y1 *60 { Y1 $# -6 Y1 -6 $# y1 ^6 y1 +5 Z1 -Y1 $5 T4 -Y1 -5 i66 -Y1 ,5 i62 -Y1 -5 i6_ -Y1 *57 u -Y1 .5 -7 Y1 *56 $6 Y1 -5 -5 Y1 *52 *30 @@ -38598,19 +32220,15 @@ y1 -5 +2 y1 *50 $d y1 *50 .4 $- Y1 +5 -{ y1 +5 -y1 ,4 s6. y1 .4 i1u Y1 ^4 i1f Y1 *48 Z1 y1 *47 ^j -Y1 *46 seK { Y1 *45 y1 .4 *34 Y1 +4 $3 y1 ,4 .2 Y1 *41 -y1 *40 i76 Y1 +4 Y1 $@ .4 Y1 [ +4 @@ -38620,64 +32238,39 @@ $y *14 $. $y $. *14 ^* y1 .4 y1 ,3 $w -Y1 *38 o44 y1 *36 *12 -Y1 *34 i5o Y1 $3 +4 -y1 *32 T6 y1 ^3 *27 -y1*31O43 y1 ,3 *15 -Y1 *30 *52 Y1 { ,3 -y1 ] ^3 y1 ^3 } -y1 ^3 ] } y1 ^3 -y1 ,2 t -Y1 .2 R4 -y1 +2 i6. ^! y1 *27 -y1 +2 -5 Y1 *24 ^q -y1 .2 ,4 -Y1 *23 c Y1 +2 [ Y1 } ^2 $& Y1 -2 y1 .2 -Y1$1O23 +Y1 $1 O23 y1 .1 $c -y1*17O12 -y1 *17 o59 -y1 .1 *73 -y1 *15 ,3 +y1 *17 O12 y1 *14 -y1*13O71 -y1*13O51 Y1 *13 r y1 *12 $j y1 *12 i1q y1 *12 i1f -y1 *12 *36 y1 +1 -Y1-0O43 -y1 +0 $x Y1 $0 o9r Y1 ^0 ^j -y1 ^0 d y1 *08 r Y1 $0 +8 -Y1 *06 { Y1 *05 o0g y1 *03 ^f Y1 +0 $# Y1 +0 -Y1 $# +0 Y1 $0 Y1 .0 y1 $0 -Y1 $* $* Y1 $$ Y1 $_ Y1 $ @@ -38685,19 +32278,14 @@ Y1 ^( Y1 ^_ $% Y1 $& Y1 -$$ Y1 -$. Y1 } { Y1 $% { Y1 -y1 $. y1 $! y1 $_ $y $1 -$+ y1 $. $+ $. y1 } ^. y1 ^y +1 -^' y1 { $y -0 K $@ ^Y } $Y @@ -38710,9 +32298,7 @@ $_ $y ^= ^y ^X z5 l $X Z4 y4 -$X Z4 y2 -^X z4 y1 -^x z3 Z1 +$X y2 Z4 ^x z3 Y1 $x Z3 k $x Z3 @@ -38720,9 +32306,8 @@ $x Z3 $X Z2 *34 ^x z2 *15 $x Z2 *04 -^x Z1 z3 ^X Z1 ^T -$x Z1 s1_ +$x s1_ Z1 $x z1 i8x $x Z1 C ^x z1 *60 @@ -38733,41 +32318,32 @@ $X $Z $X Y5 -0 $X y4 Z4 $x y3 -$X y2 Z4 ^x Y2 Y2 ^x y2 -^X y1 z4 -^x Y1 z3 ^x y1 ssi -$X Y1 } $X Y1 ^X $X ,8 -^XO62*21 -$xO51*01 -$xO42$d -^xO25 -$xO06s1t -$xO04 -$xO01i5 -$xO01 +^X O62 *21 +$x O51 *01 +$x O42 $d +^x O25 +$x s1t O06 +$x O04 +$x O01 i5 ^X ^x $X $V $x } ^u ^x u -^X ^T Z1 $x t D4 ^X T8 $X T4 y4 ^X t $x $t ^x ^t -^x ssi y1 $X smp ^X sIM i5k -$x s1_ Z1 -$xs1tO06 ^X ^S -$XrO82 +$X r O82 $x R4 *60 ^x R3 k $X ^r @@ -38776,7 +32352,7 @@ $^ $x q $X p1 ] $- $x p1 ^x ^p -$x o9 so` +$x o9 so` $x o95 $x o9 ^x o8o @@ -38793,28 +32369,23 @@ $x o2j $x o2 $X ^o ^x ^o -^X l z5 $x L8 $x L7 $X L5 C $X L0 ^X $L $x k Z3 -^x k R3 -^x k q -^x k i7x +^x i7x k ^x K ^x $k ^x ^k $X i8W $x i8m -^x i7x k $X i7c ^x i73 ^x i6k $x i6h $X i5t -^X i5k sIM ^X i59 $x i4w ^x i4N @@ -38831,2980 +32402,2630 @@ $X i23 $x i1k ^x i1g ^x i12 ^j -^X i10 $x i0W -^x i0p -$X i01 ^x ^i $x ^g p4 ^X ^F $X E +8 $X E +0 ^X ^E -$x$dO42 +$x $d O42 ^x D7 -$x D4 t $x D3 ^x ^d +3 ^x $d *15 -^X d [ $x d -$x C Z1 ^X $C $x ^C ^x ^c -OBAoBk -OBAiB ] -OB6] -OB5OA1$. -OB5$.OA1 -OB5o8m -OB4O53u -OB4uO53 -OB4oB5 -OB4i9s -OB4*9B +OBA oBk +OBA iB ] +OB6 ] +OB5 OA1 $. +OB5 $. OA1 +OB5 o8m +OB4 O53 u +OB4 oB5 +OB4 i9s +OB4 *9B OB4 -OB3u -$ OB3$1 -OB2Z2O42 -OB2$z -OB2O42Z2 -OB2O34 -OB2O26 -OB2oBs -OB2o9e -OB2*A9 -OB2+9 +OB3 u +$ OB3 $1 +OB2 Z2 O42 +OB2 $z +OB2 O42 Z2 +OB2 O34 +OB2 O26 +OB2 oBs +OB2 o9e +OB2 *A9 +OB2 +9 OB2 -OB1OA1$m -OB1O36 -OB1u.A -OB1oAy -OB1o9iO42 -OB1o7c -OB1$mOA1 -OB1i8_ -OB1i0* -OB1.Au -OB1$A -OB1,A -OB1$a -OB1$8 -OB1$5 +OB1 OA1 $m +OB1 O36 +OB1 u .A +OB1 oAy +OB1 o9i O42 +OB1 o7c +OB1 $m OA1 +OB1 i8_ +OB1 i0* +OB1 $A +OB1 ,A +OB1 $a +OB1 $8 +OB1 $5 $x $b $x ^b -OA6O36 -OA6t -OA5D7 +OA6 O36 +OA6 t +OA5 D7 OA5 -OA4O35*20 -OA4uo8W -OA4o8Wu -OA4*20O35 -OA4$1 -OA3t,9 -OA3iBi -OA3D7 -OA3,B -OA3*A7 -OA3,9t -OA2T0iAg -OA2oAn -OA2oAm -OA2oA? -OA2o8y -OA2o8rc -OA2o8b -OA2K -OA2$k -OA2iBe-9 -OA2iBe -OA2iAgT0 -OA2co8r -OA2-9iBe -OA2*94O31 -OA2*68 -OA2-6 -OA2$2 -OA2^1 -OA2$. -OA1O34 -OA1O21O71 -OA1TB -OA1p1 -OA1oB7 -OA1o6ju -OA1i5g -OA1+BK -OA1*98$4 -OA1.8O32 -OA1$4*98 -OA1$2 +OA4 O35 *20 +OA4 o8W u +OA4 $1 +OA3 t ,9 +OA3 iBi +OA3 D7 +OA3 ,B +OA3 *A7 +OA2 iAg T0 +OA2 oAn +OA2 oAm +OA2 oA? +OA2 o8y +OA2 c o8r +OA2 o8b +OA2 K +OA2 $k +OA2 -9 iBe +OA2 iBe +OA2 *94 O31 +OA2 *68 +OA2 -6 +OA2 $2 +OA2 ^1 +OA2 $. +OA1 O34 +OA1 O21 O71 +OA1 TB +OA1 p1 +OA1 oB7 +OA1 o6j u +OA1 i5g +OA1 +B K +OA1 *98 $4 +OA1 .8 O32 +OA1 $4 *98 +OA1 $2 $x ^a ^x $a -O98$t -O98+9 -O98{{ +O98 $t +O98 +9 +O98 { { O98 -O97tDA -O97$e -O97DAt -O96u -O96o7o -O95i7_ -O95E$2 -O95$2E -O95$1 -O94o9y -O94o9k -O94o9a -O94o4 t -O94i8l -O94$2 -}O93z1 -O93Y3 -O93t*78 -O93sh8 -O93$o$p -O93oB1 -O93o9j -O93o82 -O93E -O93-B -O93*A9 -O93+9 -O93*78t -O93-7 -^,$.O93 -O92$y -O92O06 -]O92t -O92$su -O92oAw -O92o90 -O92o8l -O92o6b -O92o39 -O92$L -O92i5@ -O92^i -O92$e -O92,B -O92+A -O92$!-A -O92$A -O92-A$! -O92*41O31 -O92$, -$+O92 -$@O92 -$?O92 -O91y4c -O91OB1 -O91O54T1 -O91O12 -O91^W -O91u-8 -}O91T8 -O91T7T6 -O91T6T7 -O91T1O54 -O91sSV -O91ssb -O91s4Ao6O -O91^S -O91R9^2 -O91oBy -O91o8z -O91o8u -O91o8d -O91o88*87 -O91o7u -O91o7b -O91o77DB -O91o6Os4A -O91o6i -O91o5& -O91o4s -O91o3@ -O91o1o -O91o0f -O91i8B -O91i44 -[O91i0V -O91DBo77 -O91C$8 -$*O91c -O91+B -O91-B -O91$a -O91+9$1 -O91,8Y5 -O91-8u -O91$8C -O91-8.6 -O91,7 -O91.6-8 -O91$6 -O91$1+9 -O91*18 +O97 DA t +O97 $e +O96 u +O96 o7o +O95 i7_ +O95 E $2 +O95 $1 +O94 o9y +O94 o9k +O94 o9a +O94 o4 t +O94 i8l +O94 $2 +} O93 z1 +O93 Y3 +O93 t *78 +O93 sh8 +O93 $o $p +O93 oB1 +O93 o9j +O93 o82 +O93 E +O93 -B +O93 *A9 +O93 +9 +O93 -7 +^, $. O93 +O92 $y +O92 O06 +] O92 t +O92 $s u +O92 oAw +O92 o90 +O92 o8l +O92 o6b +O92 o39 +O92 $L +O92 i5@ +O92 ^i +O92 $e +O92 ,B +O92 +A +O92 $! -A +O92 $A +O92 -A $! +O92 *41 O31 +O92 $, +$+ O92 +$@ O92 +$? O92 +O91 y4 c +O91 OB1 +O91 O54 T1 +O91 O12 +O91 ^W +O91 u -8 +} O91 T8 +O91 T7 T6 +O91 sSV +O91 ssb +O91 s4A o6O +O91 ^S +O91 R9 ^2 +O91 oBy +O91 o8z +O91 o8u +O91 o8d +O91 o88 *87 +O91 o7u +O91 o7b +O91 o77 DB +O91 o6i +O91 o5& +O91 o4s +O91 o3@ +O91 o1o +O91 o0f +O91 i44 +[ O91 i0V +O91 $8 C +$* O91 c +O91 +B +O91 -B +O91 $a +O91 +9 $1 +O91 ,8 Y5 +O91 -8 u +O91 -8 .6 +O91 ,7 +O91 $6 +O91 $1 +9 +O91 *18 $x -9 ^X ,8 $X $X +8 E O8A -O89$1$A -O87Z1 -O87Y2Y2 -O86$1 -O86{*04 +O89 $1 $A +O87 Z1 +O87 Y2 Y2 +O86 $1 +O86 { *04 O86 -O85O32K -O85t -O85KO32 -O85^A -O85$1 -O84$Yu -O84Y4 -O84Y3u -O84Y1 -O84O31sau -O84uY3 -O84u$Y -O84sauO31 -O84oA1 -O84o57 -O84*8A-8 -O84*89 -O84*48 -[$ O84 -$ O83Z2 -O83O61i5 -O83O06 -O83s f -$\O83R9 -O83R8,9 -O83o90 -O83o8i -O83o5l -O83o3a -O83i9l -O83i7a -O83i4n -O83E$9 -O83'B,7 -O83$9E -O83-9 -O83-8 -O83,7'B -O83$2 -O83^1*27 -$@O83 -O82Z1u -O82Z1*78 -O82y5 -O82Y1$S -O82O42^@ -O82[O41 -O82O31 -O82$x -O82^v -O82uZ1 -O82ssz -O82s0m^! -O82^!s0m -O82p4z1 -O82o7_ -O82o6g*68 -O82o60 -O82o5s -O82o5_ -O82o44 -O82o0j -O82i8z -O82i7h -O82^i -O82D5[ -O82[D5 -O82C -O82*96,6 -O82+8 -O82*78Z1 -O82$7,3 -O82-7 -O82-6 -O82,3$7 -O82*16D5 -O82$, -O82}} -$*O82[ -$.O82 -]O82 -O81y2y2 -O81O61T5 -O81O54snq -O81O43 -O81uT9 -O81u*83 -O81T5O61 -O81T2o8R -O81snqO54 -O81sdj -O81scsK -O81s04 -O81s- -O81p3o2y -O81o8RT2 -O81o8e -O81o7s -O81o66 -O81o5l -O81o41 -O81o2. -O81o1u -O81o12+6 -O81o0D -}O81L0 -O81Kscs -O81i7s -O81i7f -O81i62 -O81i1-O42 -O81i1c -$@O81E -[O81E -O81'B -O81^A -O81,9 -O81*83u -O81+6o12 -O81$5 -O81*21k -^ O81 +O85 O32 K +O85 t +O85 K O32 +O85 ^A +O85 $1 +O84 $Y u +O84 Y4 +O84 Y3 u +O84 Y1 +O84 sau O31 +O84 oA1 +O84 o57 +O84 *8A -8 +O84 *89 +O84 *48 +[ $ O84 +$ O83 Z2 +O83 O61 i5 +O83 O06 +O83 s f +$\ O83 R9 +O83 R8 ,9 +O83 o90 +O83 o8i +O83 o5l +O83 o3a +O83 i9l +O83 i7a +O83 i4n +O83 E $9 +O83 'B ,7 +O83 -9 +O83 -8 +O83 $2 +O83 ^1 *27 +$@ O83 +O82 u Z1 +O82 Z1 *78 +O82 y5 +O82 Y1 $S +O82 O42 ^@ +O82 [ O41 +O82 O31 +O82 $x +O82 ^v +O82 ssz +O82 s0m ^! +O82 p4 z1 +O82 o7_ +O82 o6g *68 +O82 o60 +O82 o5s +O82 o5_ +O82 o44 +O82 o0j +O82 i8z +O82 i7h +O82 ^i +O82 D5 [ +O82 [ D5 +O82 C +O82 *96 ,6 +O82 +8 +O82 *78 Z1 +O82 $7 ,3 +O82 -7 +O82 -6 +O82 ,3 $7 +O82 *16 D5 +O82 $, +O82 } } +$* O82 [ +$. O82 +] O82 +O81 y2 y2 +O81 O61 T5 +O81 O54 snq +O81 O43 +O81 u T9 +O81 u *83 +O81 T2 o8R +O81 sdj +O81 scs K +O81 s04 +O81 s- +O81 p3 o2y +O81 o8e +O81 o7s +O81 o66 +O81 o5l +O81 o41 +O81 o2. +O81 o1u +O81 o12 +6 +O81 o0D +} O81 L0 +O81 i7s +O81 i7f +O81 i62 +O81 i1- O42 +O81 i1c +$@ O81 E +[ O81 E +O81 'B +O81 ^A +O81 ,9 +O81 $5 +O81 *21 k +^ O81 $x +8 ^x ,8 ^x ^8 -O7BO12 -O78ET4 -O76p1O07 -O76oA1 -O76K -O76i6r -O76$i -O75z2 -O75$z -^*O75T6 -O75o6_ -O75o3x -O75i7k -O75$9Z1 -O75]^1 -O75^1] +O7B O12 +O78 E T4 +O76 p1 O07 +O76 oA1 +O76 K +O76 i6r +O76 $i +O75 z2 +O75 $z +^* O75 T6 +O75 o6_ +O75 o3x +O75 i7k +O75 $9 Z1 +O75 ] ^1 O75 -O74y4k -O74Y4 -O74y1^A -^X*74O65 -O74O62 -O74O32O46 -O74O32 -O74o4c -O74i3e -O74$d -O74*58 -O74]] -$*O74 -$.O74 -}O74 -O73Z1 -O73O05u -O73uO05 -O73^q -O73o7- -O73o6m -O73^m -O73$l -O73i7@p4 -O73i4' -O73i3r -O73i0# -O73C$2 -O73'A -O73*87 -O73*53{ -O73]-3 -O73-3] -O73$2C -O73$1 -O73+0 -$*O73 -$)O73 -$#O72Z2 -O72y5 -O72Y4O63 -O72y3 -O72Y2*36 -O72O85 -[O72O51 -O72O31 -O72O24$t -O72O21 -O72O02 -O72u*06 -O72$tO24 -O72t$I -O72T5 -O72T0} -O72s3/ -O72s1@ -O72s1, -O72$s -O72[r -O72p3o27 -O72p1.7 -O72oAs -O72o9k -O72o8, -O72o7.Y1 -O72o7# -O72o6z$4 -O72o5k -O72o5h -O72o57 -O72o3c -O72o3 *27 -O72o3@ -O72o2 -$.O72o1a -O72K*31 -O72i7p -O72i7_ -O72i6j -O72i5s -O72i5H -O72i5e -O72i5D -O72i59 -O72i50 -O72i4t -O72i3o -O72D2 -O72+B$1 -O72$A -O72^A -O72,8 -O72-8 -O72*76+4 -O72*69 -O72*65 -O72$4o6z -O72+4*76 -O72-3-2 -O72*31K -O72,3 -O72*26$@ -O72$@*26 -O72*25 -O72-2-3 -O72+2+2 -O72-2-0 -O72$1+B -O72*06u -O72-0-2 -O72$.[ -O72[$. -$/O72 -$_O72 +O74 Y4 +O74 y1 ^A +^X *74 O65 +O74 O62 +O74 O32 O46 +O74 O32 +O74 o4c +O74 i3e +O74 $d +O74 *58 +O74 ] ] +$* O74 +$. O74 +} O74 +O73 Z1 +O73 O05 u +O73 ^q +O73 o7- +O73 o6m +O73 ^m +O73 $l +O73 i7@ p4 +O73 i4' +O73 i3r +O73 $2 C +O73 'A +O73 *87 +O73 *53 { +O73 ] -3 +O73 $1 +O73 +0 +$* O73 +$) O73 +$# O72 Z2 +O72 y5 +O72 Y4 O63 +O72 y3 +O72 Y2 *36 +O72 O85 +[ O72 O51 +O72 O31 +O72 O24 $t +O72 O21 +O72 O02 +O72 u *06 +O72 $t O24 +O72 t $I +O72 T5 +O72 T0 } +O72 s3/ +O72 s1@ +O72 s1, +O72 $s +O72 [ r +O72 p3 o27 +O72 p1 .7 +O72 oAs +O72 o9k +O72 o8, +O72 o7. Y1 +O72 o7# +O72 o6z $4 +O72 o5k +O72 o5h +O72 o57 +O72 o3c +O72 o3 *27 +O72 o3@ +O72 o2 +$. O72 o1a +O72 K *31 +O72 i7p +O72 i7_ +O72 i6j +O72 i5s +O72 i5H +O72 i5e +O72 i59 +O72 i50 +O72 i4t +O72 i3o +O72 D2 +O72 +B $1 +O72 $A +O72 ^A +O72 ,8 +O72 -8 +O72 *76 +4 +O72 *69 +O72 *65 +O72 $4 o6z +O72 -2 -3 +O72 *31 K +O72 ,3 +O72 *26 $@ +O72 $@ *26 +O72 *25 +O72 +2 +2 +O72 -0 -2 +O72 $1 +B +O72 [ $. +$/ O72 +$_ O72 ^x *72 -^@O72 -O71Z3o0l -$ O71Z1 -O71z1 -^?O71z1 -O71Y5 -O71y5 -O71Y1i33 -O71O05C -O71O05 -O71O02 -O71t.6 -O71^t -O71smd -O71s2! -O71R9o8y -O71o9g -O71o8yR9 -O71o8n -O71o77 -O71o61 -O71o5u -O71o5a -O71o41E -O71o2i -O71o2C -O71o1r -O71o0lZ3 -O71ki2d -O71i9m -O71i6j -O71i5u -O71i59 -O71i52 -O71i4x -O71i4ay5 -O71i33Y1 -O71i2dk -O71i2? -O71i1c+4 -O71[i0V -O71^G -O71Eo41 -O71dO07 -O71dO02 -O71c*13 -O71^BO13 -O71*A9+6 -O71^a -O71*78] -O71]*78 -O71*71*60 -O71^7 -O71.6t -O71+6*A9 -O71.6*59 -O71*60*71 -O71*59.6 -O71*59 -O71+4y4 -O71,4^s -O71*13c -O71} -O71^@ -$*O71 +^@ O72 +O71 Z3 o0l +$ O71 Z1 +O71 z1 +^? O71 z1 +O71 Y5 +O71 y5 +O71 Y1 i33 +O71 O05 C +O71 O05 +O71 O02 +O71 t .6 +O71 ^t +O71 smd +O71 s2! +O71 R9 o8y +O71 o9g +O71 o8n +O71 o77 +O71 o61 +O71 o5u +O71 o5a +O71 o41 E +O71 o2i +O71 o2C +O71 o1r +O71 o0l Z3 +O71 i2d k +O71 i9m +O71 i6j +O71 i5u +O71 i59 +O71 i52 +O71 i4x +O71 i4a y5 +O71 i33 Y1 +O71 i2? +O71 i1c +4 +O71 [ i0V +O71 ^G +O71 d O07 +O71 d O02 +O71 c *13 +O71 ^B O13 +O71 *A9 +6 +O71 ^a +O71 *78 ] +O71 ] *78 +O71 *71 *60 +O71 ^7 +O71 *59 .6 +O71 *59 +O71 +4 y4 +O71 ,4 ^s +O71 } +O71 ^@ +$* O71 ^X ^7 $x +6 Z1 -O6Au$2 -O6A$2u -O68o6k +O6A u $2 +O68 o6k ^X *68 O68 -O67*21 -O67] -O65Y3t -O65O31 -O65tY3 -O65o3w -O65Ki6g -O65$j -O65i6gK -O65i6_ -O65i2.c -O65ci2. -$_O65 +O67 *21 +O67 ] +O65 t Y3 +O65 O31 +O65 o3w +O65 K i6g +O65 $j +O65 i6g K +O65 i6_ +O65 i2. c +$_ O65 O65 -$.O64Y1 -O64OA1 -O64O62 -O64$s -$!O64o6& -O64o4s -O64o34 -O64^o -O64c -O64-6 -O64^4 -O64*34 -O64.3,2 -[O64*25 -O64,2.3 -O64] -O64^* -$*O64 -^!O64 -O63Z4$M -O63Y3u -O63y3C -O63Y2^t -O63Y2 -O63Y1i14 -O63O51 -O63uY3 -O63up1 -O63^tY2 -O63t*89 -O63$t -O63srw -O63s86 -O63^s -O63^r^m -O63p1u -O63$p -O63o8u -O63o7z -O63o5Ti6M -O63K -O63i6p -O63i6Mo5T -O63i6@ -O63i4 -O63i3t -O63i14Y1 -O63i0Y -O63$h -O63D9 -O63D5 -O63*89t -O63$6 -O63+5*53 -O63+5*31 -O63$5 -O63*47*43 -O63^4 -O63*31+5 -O63$3 -O63$* -O63$@ -$*O63 -$/O63 -^(O63 -O62$!Z1 -}O62z1 -O62Y4u -O62Y3 -}O62Y2 -O62Y1,6 -{O62Y1 -O62$x*65 -O62uY4 -O62u*79 -O62T1$$ -O62$$T1 -O62stw -O62srx -O62s28o7. -O62s1 z1 -O62s1!l -O62^*R6 -O62R6 -O62R5 -O62R4 -O62$r -O62p3$t -O62o8@ -O62o7.s28 -O62o66 -O62o4_ -O62o3f -^@O62o2y -O62o2f -O62o1t -O62o0F -O62ls1! -O62K -O62i8. -O62i7z -O62i5ii5P -O62i5-,2 -O62i5@ -O62i4ei5l -O62}i43 -O62i3x -O62i3m -O62i26 -O62i2- -O62^h -O62dO63 -O62D5 -O62d -O62C -O62-A -O62^a -O62$8 -O62*79u -O62*70 -O62,6Y1 -O62*65$x -O62*54 -O62*43,3 -O62+3 -O62.3 -O62,2i5- -O62.2,1 -O62,1.2 -O62^1 -O62$0 -O62[[ -$&O62 -$*O62 -^$O62 -^@O62 -^(O62 -O61^z -O61^y,5 -O61Y4*1A -O61Y3o0L -O61y3*96 -O61]Y2 -O61OA1 -O61O73p4 -O61O71O21 -O61O21O61 -O61O19 -O61O03y2 -O61O02y4 -O61$v+4 -O61$v -O61$uo7x -O61u'A -O61ti86 -O61^T -O61sZ$ -O61sHT -O61sH6 -O61scm -O61s29 -O61$r^F -O61R7R7 -O61R3 -O61R2 -O61o8w -O61o8! -O61o7_k -O61o7c -O61o71 -O61o3y -O61o3< -O61o2q*13 -O61o1Si61 -O61o1o -O61o0LY3 -O61^NT3 -}O61$m -O61L6Z2 -O61L3^e -O61ko7_ -O61k*23 -O61$k -O61i8i -O61i8d -O61i86t -O61i7u -O61i7n -O61i77 -O61i61o1S -O61i4k*76 -O61i3s -O61i3e -O61i3d -O61i3- -O61i17 -O61i15 -O61i07 -O61^H^R -O61^G^J -O61^f -O61^e -O61D7*34 -O61D0-7 -O61$D -O61$b*30 -O61'Au -O61'A-6 -O61*95.6 -O61+8 -O61+6Y3 -O61-6'A -O61.6*95 -O61^6 -O61+4$v -O61-4*35 -O61*35-4 -O61*34D7 -O61*30$b -O61$3 -O61^3 -O61*25-0 -O61*23k -O61+2+1 -O61,2 -O61^2 -O61*13o2q -^ O61*13 -O61+1+2 -O61-1 -O61-0*25 -O61*02^1 -O61+0$! -O61$!+0 -O61]-0 -O61-0] -O61$?[ -O61[$? -$+O61 -$?O61 -$!O61 -}O61] -}]O61 -]O61 -[O61 -$x *60 R4 +$. O64 Y1 +O64 OA1 +O64 O62 +O64 $s +$! O64 o6& +O64 o4s +O64 o34 +O64 ^o +O64 c +O64 -6 +O64 ^4 +O64 *34 +O64 .3 ,2 +[ O64 *25 +O64 ] +O64 ^* +$* O64 +^! O64 +O63 Z4 $M +O63 Y3 u +O63 y3 C +O63 Y2 ^t +O63 Y2 +O63 Y1 i14 +O63 O51 +O63 ^t Y2 +O63 *89 t +O63 $t +O63 srw +O63 s86 +O63 ^s +O63 ^r ^m +O63 $p +O63 o8u +O63 o7z +O63 i6M o5T +O63 K +O63 i6p +O63 i6@ +O63 i4 +O63 i3t +O63 i14 Y1 +O63 i0Y +O63 $h +O63 D9 +O63 D5 +O63 $6 +O63 +5 *53 +O63 +5 *31 +O63 $5 +O63 *47 *43 +O63 ^4 +O63 $3 +O63 $* +O63 $@ +$* O63 +$/ O63 +^( O63 +O62 $! Z1 +} O62 z1 +O62 Y4 u +O62 Y3 +} O62 Y2 +{ O62 Y1 +O62 $x *65 +O62 u *79 +O62 $$ T1 +O62 stw +O62 srx +O62 s28 o7. +O62 s1 z1 +O62 s1! l +O62 ^* R6 +O62 R6 +O62 R5 +O62 R4 +O62 $r +O62 p3 $t +O62 o8@ +O62 o66 +O62 o4_ +O62 o3f +^@ O62 o2y +O62 o2f +O62 o1t +O62 o0F +O62 K +O62 i8. +O62 i7z +O62 i5i i5P +O62 i5- ,2 +O62 i5@ +O62 i4e i5l +O62 } i43 +O62 i3x +O62 i3m +O62 i26 +O62 i2- +O62 ^h +O62 d O63 +O62 D5 +O62 d +O62 C +O62 -A +O62 ^a +O62 $8 +O62 *70 +O62 ,6 Y1 +O62 *65 $x +O62 *54 +O62 *43 ,3 +O62 +3 +O62 .3 +O62 .2 ,1 +O62 ^1 +O62 $0 +$& O62 +$* O62 +^$ O62 +^@ O62 +^( O62 +O61 ^y ,5 +O61 Y4 *1A +O61 Y3 o0L +O61 y3 *96 +O61 ] Y2 +O61 OA1 +O61 O73 p4 +O61 O71 O21 +O61 O19 +O61 O03 y2 +O61 O02 y4 +O61 $v +4 +O61 $v +O61 $u o7x +O61 u 'A +O61 t i86 +O61 ^T +O61 sZ$ +O61 sH6 +O61 scm +O61 s29 +O61 $r ^F +O61 R7 R7 +O61 R3 +O61 R2 +O61 o8w +O61 o8! +O61 o7_ k +O61 o7c +O61 o71 +O61 o3y +O61 o3< +O61 o2q *13 +O61 i61 o1S +O61 o1o +O61 o0L Y3 +O61 ^N T3 +} O61 $m +O61 L6 Z2 +O61 L3 ^e +O61 k *23 +O61 $k +O61 i8i +O61 i8d +O61 i7u +O61 i7n +O61 i77 +O61 i4k *76 +O61 i3s +O61 i3e +O61 i3d +O61 i3- +O61 i17 +O61 i15 +O61 i07 +O61 ^H ^R +O61 ^G ^J +O61 ^f +O61 ^e +O61 D7 *34 +O61 D0 -7 +O61 $D +O61 $b *30 +O61 'A -6 +O61 *95 .6 +O61 +8 +O61 +6 Y3 +O61 ^6 +O61 +4 $v +O61 -4 *35 +O61 *30 $b +O61 $3 +O61 ^3 +O61 -0 *25 +O61 +2 +1 +O61 ,2 +^ O61 *13 +O61 -1 +O61 *02 ^1 +O61 +0 $! +O61 ] -0 +O61 [ $? +$+ O61 +$! O61 +} O61 ] +} ] O61 +] O61 +[ O61 $X ,6 $x .6 ^x +6 -O59$k -O59i32 -O58s-4 -O57o2o -O57fO57 -O57*34 -O57]] -O56O06 -O56r -O56d -O56'9+4 -O56$7 -O56+4'9 -O56$2 -O56-1 -O54z5t -O54z3*18 -O54z2ssw -O54^$z2 -O54y5o5v -O54y4*75 -O54Y3o3 -O54y2+8 -O54O72 -O54O01^r -O54u -O54tz5 -O54t*01 -O54sswz2 -O54$r -O54qO04 -O54o73 -O54o3 Y3 -O54o3o$2 -O54o0y -O54o0bp3 -O54$lt -O54L5Z1 -O54E^3 -O54-B -O54^A -O54*93O24 -O54*64 -O54^5o6m -O54*54 -O54*34 -O54$3 -O54$2o3o -O54$2 -O54*02 -O54*01t -O54{{ -^(O54 -^`O53z3 -O53Y5o5k -O53Y2*87 -^$O53y1 -O53O64o43 -O53O52$. -O53$.O52 -O53^V -]O53u -O53^sz5 -O53^s -O53r -O53$q*24 -O53o8m -O53o4MY2 -O53o4c -O53o43O64 -O53o1r -O53o0f -O53$n -O53i6h -O53i6d -O53i1f.4 -O53i19 -}O53$h -O53$g -O53'A -O53*97 -O53*76i0J -O53-7*10 -O53^7 -O53*65$> -O53$>*65 -O53.6 -O53-5 -O53^5 -O53*43 -O53+4] -O53$4 -O53]+4 -O53*32 -O53,3 -O53*24$q -O53*24 -O53*10-7 -[O53*02 -O53$& -O53$@ -O53$! -O53$= -O53^* -$*O53 -$$O53 +O59 $k +O59 i32 +O58 s-4 +O57 o2o +O57 f O57 +O57 *34 +O57 ] ] +O56 O06 +O56 r +O56 d +O56 '9 +4 +O56 $7 +O56 $2 +O56 -1 +O54 z5 t +O54 z3 *18 +O54 ssw z2 +O54 ^$ z2 +O54 y5 o5v +O54 y4 *75 +O54 Y3 o3 +O54 y2 +8 +O54 O72 +O54 O01 ^r +O54 u +O54 t *01 +O54 $r +O54 q O04 +O54 o73 +O54 o3 Y3 +O54 o3o $2 +O54 o0y +O54 o0b p3 +O54 $l t +O54 L5 Z1 +O54 E ^3 +O54 -B +O54 ^A +O54 *93 O24 +O54 *64 +O54 ^5 o6m +O54 *54 +O54 *34 +O54 $3 +O54 $2 o3o +O54 $2 +O54 *02 +O54 { { +^( O54 +^` O53 z3 +O53 Y5 o5k +O53 Y2 *87 +^$ O53 y1 +O53 o43 O64 +O53 O52 $. +O53 $. O52 +O53 ^V +] O53 u +O53 ^s z5 +O53 ^s +O53 r +O53 $q *24 +O53 o8m +O53 o4M Y2 +O53 o4c +O53 o1r +O53 o0f +O53 $n +O53 i6h +O53 i6d +O53 i1f .4 +O53 i19 +} O53 $h +O53 $g +O53 'A +O53 *97 +O53 *76 i0J +O53 -7 *10 +O53 ^7 +O53 *65 $> +O53 $> *65 +O53 .6 +O53 -5 +O53 ^5 +O53 *43 +O53 +4 ] +O53 $4 +O53 *32 +O53 ,3 +O53 *24 $q +O53 *24 +[ O53 *02 +O53 $& +O53 $@ +O53 $! +O53 $= +O53 ^* +$* O53 +$$ O53 [ $x *53 -O52$zk -$ O52Z5 -^@O52z5 -O52Z2} -O52{Z2 -O52Z1sPA -O52y5o5D -O52Y4u -O52y4E -[O52Y3 -O52Y2u -O52Y2 -O52y1,5 -O52O92 -O52O74 -O52uY4 -O52uY2 -O52T4i71 -O52T4,7 -O52T4$% -O52$%T4 -O52ssz -O52sPAZ1 -O52so.c -O52snq] -O52]snq -O52sd& -O52s8#-0 -O52s1. -O52rp1 -O52r^e -O52^r*73 -O52R5+5 -O52R5 -O52p5o63 -O52p1r -O52p1] -O52oB0 -O52o76Z1 -O52o5- -O52o4, -O52o4_ -O52o2y -O52$n -O52^m -O52^L -O52k$z -O52K^3 -O52$j$t -O52i8p] -O52i71T4 -O52i6F -O52i6& -O52i5t -O52i5h*27 -O52i55 -O52i4p -O52i4N} -O52i3**65 -O52i34 -O52i3/ -O52i2y -O52i2h*53 -O52i1r -O52i11y4 -O52i0x -O52^f -O52^e -O52dO05 -O52d -O52cso. -O52c$* -O52$*c -O52^az2 -O52$A -O52^a -O52,7T4 -O52]$6 -O52+5R5 -O52,5 -O52^3K -O52.3+1 -$*O52-3 -O52*25^P -O52+1.3 -O52*12^t -O52^1 -^@O52+1 -O52-0s8# -O52$0*81 -O52*07O63 -O52.0*60 -O52*05 -O52+0 -O52-0 -O52$@ -O52$? -O52$! -O52$_ -$%O52 -{O52{ -^!{O52 -$#O51Z3 -O51Z2iA0 -O51}z2 -O51z1*23 -O51^Y$7 -O51y5T5 -O51y5o3i -O51y5o0J -O51y5i52 -O51y5$A -O51Y4 -O51y3y3 -O51Y3o6b -O51Y3[ -O51[Y3 -O51y1sue -O51Y1^d -O51OA5 -O51O82 -O51O73 -O51O65 -O51O19 -O51O13t -O51$w.2 -$*O51u -O51tO13 -O51T7 -O51T0.2 -O51t$- -O51$-t -O51syE.1 -O51^sO35 -O51suey1 -O51sbA.4 -O51sb@ -O51s5_$! -O51$!s5_ -O51$RR4 -O51$rl -O51R5 -O51R4$R -O51$q -O51oAj -O51o6=^K -O51o5t -O51o5!o0z -O51o5e -O51o50^@ -O51o5# -O51o5, -O51o4D -O51o37*02 -O51o3- -O51o2i -O51o1, -O51o0zo5! -O51o0* -O51$M -O51$m -O51l$r -O51K$P -O51K^H -O51^j -O51i8n -O51i8 -O51i3u -O51i35 -O51i1d -O51i11 -O51i0z -O51i08 -O51i0* -O51^HK -O51Ez2 -O51dY2 -O51^dY1 -O51d*61 -O51^d-2 -O51^d -O51d -O51^c -O51$Ay5 -O51$A*30 -O51*75 -O51*64,4 -O51$_.6 -[O51*58 -O51*52 -O51.4sbA -O51^4 -O51*30$A -O51^3 -O51.2$w -O51.2T0 -O51.1syE -O51*13o1L -O51*02o37 -O51^! -$*O51 -$?O51 -$ O51 -]O51] -]]O51 -^@O51] -^@]O51 -^-O51 +O52 $z k +$ O52 Z5 +^@ O52 z5 +O52 Z2 } +O52 { Z2 +O52 Z1 sPA +O52 y5 o5D +O52 Y4 u +O52 y4 E +O52 Y2 u +O52 Y2 +O52 y1 ,5 +O52 O92 +O52 O74 +O52 T4 i71 +O52 T4 ,7 +O52 T4 $% +O52 ssz +O52 so. c +O52 ] snq +O52 sd& +O52 s8# -0 +O52 s1. +O52 r ^e +O52 ^r *73 +O52 R5 +5 +O52 R5 +O52 p5 o63 +O52 p1 ] +O52 oB0 +O52 o76 Z1 +O52 o5- +O52 o4, +O52 o4_ +O52 o2y +O52 $n +O52 ^m +O52 ^L +O52 k $z +O52 K ^3 +O52 $j $t +O52 i8p ] +O52 i6F +O52 i6& +O52 i5h *27 +O52 i55 +O52 i4p +O52 i4N } +O52 i3* *65 +O52 i34 +O52 i3/ +O52 i2y +O52 i2h *53 +O52 i1r +O52 i11 y4 +O52 i0x +O52 ^f +O52 ^e +O52 d O05 +O52 d +O52 c so. +O52 $* c +O52 ^a z2 +O52 $A +O52 ^a +O52 ] $6 +O52 +5 R5 +O52 ,5 +O52 ^3 K +O52 +1 .3 +$* O52 -3 +O52 *25 ^P +O52 *12 ^t +O52 ^1 +^@ O52 +1 +O52 -0 s8# +O52 $0 *81 +O52 *07 O63 +O52 .0 *60 +O52 *05 +O52 +0 +O52 -0 +O52 $@ +O52 $? +O52 $! +O52 $_ +$% O52 +{ O52 { +^! { O52 +$# O51 Z3 +O51 Z2 iA0 +O51 } z2 +O51 z1 *23 +O51 ^Y $7 +O51 y5 o3i +O51 y5 o0J +O51 y5 i52 +O51 y5 $A +O51 Y4 +O51 y3 y3 +O51 Y3 o6b +O51 Y3 [ +O51 [ Y3 +O51 y1 sue +O51 Y1 ^d +O51 OA5 +O51 O82 +O51 O73 +O51 O65 +O51 O19 +O51 O13 t +O51 $w .2 +$* O51 u +O51 T7 +O51 .2 T0 +O51 t $- +O51 .1 syE +O51 ^s O35 +O51 .4 sbA +O51 sb@ +O51 $! s5_ +O51 $R R4 +O51 $r l +O51 R5 +O51 R4 $R +O51 $q +O51 oAj +O51 o6= ^K +O51 o5! o0z +O51 o5e +O51 o50 ^@ +O51 o5# +O51 o5, +O51 o4D +O51 o37 *02 +O51 o3- +O51 o2i +O51 o1, +O51 o0* +O51 $M +O51 $m +O51 K $P +O51 K ^H +O51 ^j +O51 i8n +O51 i8 +O51 i3u +O51 i35 +O51 i1d +O51 i08 +O51 i0* +O51 ^H K +O51 E z2 +O51 d Y2 +O51 d *61 +O51 ^d -2 +O51 ^d +O51 d +O51 ^c +O51 $A y5 +O51 $A *30 +O51 *75 +O51 *64 ,4 +O51 $_ .6 +[ O51 *58 +O51 *30 $A +O51 ^3 +O51 .2 $w +O51 *13 o1L +O51 ^! +$* O51 +$? O51 +$ O51 +] O51 ] +] ] O51 +^@ O51 ] +^@ ] O51 +^- O51 $x -5 -O49i2r$3 -O49$3i2r -O48y3o0C -O48$8$9 -O47O05 -O47O02 -O47o0H -O47i6e -O47i40i55 -O47i32i45 -O47$2 -O47$1 -O46y4o4I -O46y2.2 -O46$U -O46so0 -O46i51 -O46i4a -O46i4& -O46i2_ -O46i0BT1 -O46fo5l -O46*30 -O46-0 -$.O46 -O45Z1o6d -O45y5o9s -O45y5-5 -O45y4o4g -O45y4$? -O45$?y4 -O45y3 -O45Y2t -O45u -O45tY2 -O45s6- -O45s3C -O45p5$1 -O45i6w -O45i4x -O45i4]D1 -O45i4b+2 -O45i41 -O45i1y -O45D6+3 -O45d-5 -$/O45d -O45+6-5 -O45-5+6 -O45^5 -O45+3D6 -O45*31 -O45$3 -O45+2i4b -O45$2$5 -O45*13 -O45$* -O45[ -$?O45 -$!O45 -O43y5Y1 -O43Y5O32 -O43y5C -O43y5*60 -O43Y5 -O43Y4i5p -O43y3O52 -O43y3k -O43y3+4 -O43Y3{ -O43Y1y5 -O43y1 -O43O82 -O43O72 -O43O41 -O43^x -O43uo1Y -O43st> -O43srf -O43scg -O43sbt -O43qT0 -O43o4i -O43o42 -O43o3x -O43o2r -O43o1Yu -O43o1rk -O43o1Fy2 -O43o0F$8 -O43kC -O43i7 -O43i5y -O43i5w -O43i4Vc -O43i4k -O43i4J -O43i48} -$!O43i48 -O43i2t -O43i2D -O43i1l -O43i16 -O43i0$y1 -O43E^& -O43d-5 -O43D3 -O43C -[O43C -O43^c -O43$bR9 -O43$8o0F -O43$7 -O43$6Y1 -O43+3s1s -O43$3 -$=O43+3 -O43*25 -O43*23y3 -O43^1 -^@O43^1 -O43*04 -O43{-0 -O43$@ -O43$? -O43$! -O43$-[ -O43[$- -O43[ -O43^& -[O43 +O49 i2r $3 +O49 $3 i2r +O48 y3 o0C +O48 $8 $9 +O47 O05 +O47 O02 +O47 o0H +O47 i6e +O47 i40 i55 +O47 i32 i45 +O47 $2 +O47 $1 +O46 y4 o4I +O46 y2 .2 +O46 $U +O46 so0 +O46 i51 +O46 i4a +O46 i4& +O46 i2_ +O46 i0B T1 +O46 f o5l +O46 *30 +O46 -0 +$. O46 +O45 Z1 o6d +O45 y5 o9s +O45 y5 -5 +O45 y4 o4g +O45 y4 $? +O45 $? y4 +O45 y3 +O45 t Y2 +O45 u +O45 s6- +O45 s3C +O45 p5 $1 +O45 i6w +O45 i4x +O45 i4] D1 +O45 i4b +2 +O45 i41 +O45 i1y +O45 +3 D6 +O45 d -5 +$/ O45 d +O45 +6 -5 +O45 ^5 +O45 *31 +O45 $3 +O45 $2 $5 +O45 $* +$? O45 +$! O45 +O43 Y5 O32 +O43 y5 C +O43 y5 *60 +O43 Y5 +O43 Y4 i5p +O43 y3 O52 +O43 y3 k +O43 y3 +4 +O43 Y3 { +O43 y1 +O43 O82 +O43 O72 +O43 O41 +O43 ^x +O43 o1Y u +O43 st> +O43 srf +O43 scg +O43 sbt +O43 q T0 +O43 o4i +O43 o42 +O43 o3x +O43 o2r +O43 o1r k +O43 o1F y2 +O43 o0F $8 +O43 k C +O43 i7 +O43 i5y +O43 i5w +O43 i4V c +O43 i4k +O43 i4J +O43 i48 } +$! O43 i48 +O43 i2t +O43 i2D +O43 i1l +O43 i16 +O43 E ^& +O43 d -5 +O43 D3 +O43 C +[ O43 C +O43 ^c +O43 $b R9 +O43 $7 +O43 $6 Y1 +O43 +3 s1s +O43 $3 +$= O43 +3 +O43 *25 +O43 *23 y3 +O43 ^1 +^@ O43 ^1 +O43 *04 +O43 { -0 +O43 $@ +O43 $? +O43 $! +O43 $- [ +O43 [ +O43 ^& ^x *43 -^@O43 -O42Z5Z4 -O42Z5u -O42Z4Z5 -O42z3i0H -O42Z2o5u -]O42Z2 -O42z1Y2 -O42Z1.3 -O42Z1 -O42$z -O42Y5o5A -O42y4s2# -O42y4i4* -O42Y3E -O42Y2z1 -O42Y2y1 -O42y2^g -O42y2 -O42Y1Y3 -O42y1Y2 -O42Y1o59 -O42$#Y1 -O42$)Y1 -O42$x -O42^V -O42uZ5 -O42$t^e -O42^t^8 -O42T7 -O42T1{ -O42t.1 -O42T0p1 -O42T0$A -O42^t -O42ssuo4d -O42spw -O42spK*84 -O42sl% -O42siu -O42s9@ -O42s2#y4 -$.O42s1Y -O42^R -O42p1i5+ -O42p1 -O42o7z -O42o5z -O42o5i -O42o59Y1 -O42o58 -O42o5_ -O42o4y -O42o4p -O42o4dssu -O42o4B -O42o3yu -O42o3@D7 -O42o35 -O42o2zt -O42o2d -O42o29 -O42o1& -O42o0p -O42^Mo3h -O42$M -O42$l*05 -O42Ki3P -O42K^! -O42^!K -O42i8jO93 -O42i7 *9A -O42i7- -O42i7_ -O42i6@ -O42i5q -O42i53 -O42i5= -O42i3w -O42i3q -O42i3PK -O42i3o] -O42]i3o -O42i3i} -O42i2y -O42i2e -O42i1r -O42i0Z -O42i0| -O42$i -O42EY3 -O42E$. -O42$.E -O42$D$C -O42D7o3@ -O42d*54 -O42D0 -O42^@c -O42$AT0 -O42-A -O42$a -O42*97$? -O42$?*97 -O42*84spK -}O42*62 -O42^4D2 -O42*42 -O42.3Z1 -O42^3 -O42*23[ -O42*21-0 -O42*20 -O42+2 -$/O42+2 -O42.1t -O42+1{ -O42*07 -O42*05$l -O42*03y5 -O42-0*21 -O42+0 -O42-0 -$#O42 -$-O42 -$`O42 -[O41Z3 -O41z1i1i -O41z1i11 -O41$z -O41Y3T2 -O41y3 -O41y2o6 -O41Y2-2 -$.O41Y2 -O41Y1^t -$!O41Y1 -O41$y -O41$Xd -[O41O62 -O41O46 -O41O12 -O41^w -O41^u^F -O41$u*31 -O41^tY1 -O41tT2 -O41tR5 -O41T2Y3 -O41T2t -O41t] -O41t[ -O41t -O41sy -O41sSD -O41se(-7 -O41sc4 -O41sa! -O41s5 -O41s37 -O41$s -O41$rt -O41R5t -O41R5R5 -O41^py2 -O41p3O6A -O41p2Z1 -O41p2O64 -O41oAA -O41o8 -O41o7y -O41o6e -O41o52 -O41o4O$* -O41$*o4O -O41o41 -O41o4@ -O41o3z -O41o3r$6 -O41o3n -O41o3li1r -O41o3f -O41o30 -O41o3& -O41o2w -O41o2V -O41o2- -O41o1z^b -O41o1V -O41o1o -O41o1J -O41o1i*35 -O41o1e -O41o0X -O41o0W -O41o0d -O41o0+$+ -O41o0! -O41$+o0+ -O41^m-5 -O41KY4 -O41i7l -O41i7$ -O41{i6u -O41i6r -O41i60 -O41i5cE -O41i58 -O41i5& -O41i3c -O41i2m -O41i2@ -O41i1YR2 -O41i1-$7 -O41i15 -O41i1* -O41i0L -}O41i0. -O41f$E -O41^f$A -O41f*75 -O41Ei5c -O41E$a -O41E+5 -O41^e -O41}D9 -O41^B -O41$aE -O41*97] -O41-7se( -O41$7i1- -O41*78.4 -O41-7*64 -O41-7*52 -O41*71^t -O41$7 -O41$6o3r -O41$6*60 -O41*64-7 -O41*60$6 -O41,6 -O41^6 -O41+5E -O41*57L5 -O41*52-7 -O41.5 -O41^5 -O41.4*78 -O41*42] -O41]*42 -O41*35o1i -O41*31$u -O41-2Y2 -O41*23 -O41*16i2M -O41*12o2K -O41*10$? -O41$?*10 -O41*02] -O41]*02 -O41$0 -O41]] -O41^_ -$;O41 -^+^+O41 +^@ O43 +O42 Z5 Z4 +O42 Z5 u +O42 z3 i0H +O42 Z2 o5u +] O42 Z2 +O42 Z1 .3 +O42 Z1 +O42 $z +O42 Y5 o5A +O42 s2# y4 +O42 y4 i4* +O42 Y3 E +O42 Y2 z1 +O42 y2 ^g +O42 y2 +O42 Y1 Y3 +O42 Y1 o59 +O42 $# Y1 +O42 $) Y1 +O42 $x +O42 ^V +O42 $t ^e +O42 ^t ^8 +O42 T7 +O42 T1 { +O42 t .1 +O42 T0 p1 +O42 T0 $A +O42 ^t +O42 ssu o4d +O42 spw +O42 spK *84 +O42 sl% +O42 siu +O42 s9@ +$. O42 s1Y +O42 ^R +O42 p1 i5+ +O42 p1 +O42 o7z +O42 o5z +O42 o5i +O42 o59 Y1 +O42 o58 +O42 o5_ +O42 o4y +O42 o4p +O42 o4B +O42 o3y u +O42 o3@ D7 +O42 o35 +O42 o2z t +O42 o2d +O42 o29 +O42 o1& +O42 o0p +O42 ^M o3h +O42 $M +O42 $l *05 +O42 K i3P +O42 K ^! +O42 ^! K +O42 i8j O93 +O42 i7 *9A +O42 i7- +O42 i7_ +O42 i6@ +O42 i5q +O42 i53 +O42 i5= +O42 i3w +O42 i3q +O42 i3P K +O42 i3o ] +O42 ] i3o +O42 i3i } +O42 i2y +O42 i2e +O42 i1r +O42 i0Z +O42 $i +O42 E Y3 +O42 E $. +O42 $D $C +O42 d *54 +O42 ^@ c +O42 -A +O42 $a +O42 *97 $? +O42 $? *97 +} O42 *62 +O42 ^4 D2 +O42 *42 +O42 ^3 +O42 *23 [ +O42 -0 *21 +O42 *20 +O42 +2 +$/ O42 +2 +O42 +1 { +O42 *07 +O42 *05 $l +O42 *03 y5 +O42 +0 +O42 -0 +$# O42 +$- O42 +$` O42 +O41 z1 i1i +O41 z1 i11 +O41 $z +O41 Y3 T2 +O41 y3 +O41 y2 o6 +O41 Y2 -2 +$. O41 Y2 +O41 ^t Y1 +$! O41 Y1 +O41 $y +O41 $X d +O41 O46 +O41 O12 +O41 ^w +O41 ^u ^F +O41 $u *31 +O41 T2 t +O41 t R5 +O41 T2 Y3 +O41 t ] +O41 t [ +O41 t +O41 sy +O41 sSD +O41 se( -7 +O41 sc4 +O41 sa! +O41 s5 +O41 s37 +O41 $s +O41 $r t +O41 R5 t +O41 R5 R5 +O41 ^p y2 +O41 p3 O6A +O41 p2 Z1 +O41 p2 O64 +O41 oAA +O41 o8 +O41 o7y +O41 o6e +O41 o52 +O41 o4O $* +O41 $* o4O +O41 o41 +O41 o4@ +O41 o3r $6 +O41 o3n +O41 o3l i1r +O41 o3f +O41 o30 +O41 o3& +O41 o2w +O41 o2V +O41 o2- +O41 o1z ^b +O41 o1V +O41 o1o +O41 *35 o1i +O41 o1e +O41 o0X +O41 o0d +O41 o0+ $+ +O41 o0! +O41 ^m -5 +O41 K Y4 +O41 i7l +O41 i7$ +O41 { i6u +O41 i6r +O41 i60 +O41 i5c E +O41 i58 +O41 i5& +O41 i3c +O41 i2m +O41 i1Y R2 +O41 i1- $7 +O41 i15 +O41 i1* +O41 i0L +} O41 i0. +O41 f $E +O41 ^f $A +O41 f *75 +O41 E i5c +O41 E $a +O41 E +5 +O41 ^e +O41 } D9 +O41 ^B +O41 $a E +O41 *97 ] +O41 -7 se( +O41 .4 *78 +O41 -7 *64 +O41 *52 -7 +O41 *71 ^t +O41 $7 +O41 $6 o3r +O41 *60 $6 +O41 ,6 +O41 ^6 +O41 +5 E +O41 *57 L5 +O41 .5 +O41 ^5 +O41 *42 ] +O41 ] *42 +O41 *31 $u +O41 -2 Y2 +O41 *23 +O41 *16 i2M +O41 *12 o2K +O41 *10 $? +O41 $? *10 +O41 *02 ] +O41 ] *02 +O41 $0 +O41 ] ] +O41 ^_ +$; O41 +^+ ^+ O41 $X $4 $x $4 ^x $4 -O3Bo3f -O38y4y4 -O37$&Z2 -O37{z1 -O37p1c -O37^p -O37o0h -O37c$8 -O37^aq -O37$8c +O3B o3f +O38 y4 y4 +O37 $& Z2 +O37 { z1 +O37 p1 c +O37 ^p +O37 o0h +O37 c $8 +O37 ^a q $x *37 -O36Z1^E -O36y5 -O36y4*38 -O36^s -O36o6e -O36o3x -O36k -O36i3c -O36i2To43 -O36^EZ1 -O36E -O36$1 -O36*03 -O35Y4y3 -O35Y4 -O35y3Y4 -O35y3u -O35Y3t -O35y3i3> -O35Y3$1 -O35uy3 -O35tY3 -O35qp1 -O35p1q -$.O35p1 -O35o7q -O35o2b -O35i7s -O35i6# -O35i5g*50 -O35$#i5\ -O35dz1 -O35$aY4 -O35,1i1W -$!O35^$ -$@O34Z4 -O34Z3-3 +O36 ^E Z1 +O36 y5 +O36 y4 *38 +O36 ^s +O36 o6e +O36 o3x +O36 k +O36 i3c +O36 i2T o43 +O36 E +O36 $1 +O36 *03 +O35 Y4 y3 +O35 Y4 +O35 y3 Y4 +O35 y3 u +O35 Y3 t +O35 y3 i3> +O35 Y3 $1 +O35 q p1 +$. O35 p1 +O35 o7q +O35 o2b +O35 i7s +O35 i6# +O35 i5g *50 +O35 $# i5\ +O35 d z1 +O35 $a Y4 +O35 ,1 i1W +$! O35 ^$ +$@ O34 Z4 +O34 Z3 -3 $X *34 Z2 -O34Z1 -O34$y^u -O34y5E -O34y4*64 -O34y4*24 -O34y3o0Z -O34}y3 -O34y3 -O34Y2-5 -O34Y1r -O34O01y2 -O34$Wo6. -O34tR3 -O34T1,3 -O34T0q -O34$t -O34snr -O34ry1 -O34R3t -O34p1o2d -O34o7w -O34o6.$W -O34o5x -O34$m -O34^L*61 -O34k*57 -O34$+i7. -O34i5A -O34i4g*23 -O34i4- -O34i2r -O34i1s -O34i0! -O34^Hz1 -O34fO05 -O34Ep2 -O34cp2 -O34$A -O34'A -O34*64*06 -O34^6+4 -O34*57k -O34,4 -O34-3Z3 -O34,3T1 -O34+3 -O34.3 -O34*24 -O34*23i4g -O34+1 -O34$/^1 -O34$@ -O34$! -[O34 -O32Z3o1F -$$O32Z3 -O32z2*40 -^?O32z2 -$/O32Z1 -O32^*z1 -O32y5o9e -O32y5o3E -O32y5D6 -O32y5+4 -O32y4Y2 -O32Y4^H -O32Y4E -O32Y3c -O32Y2y4 -O32Y2,5 -O32y2^@ -O32Y1.3 -O32^*y1 -O32^Y -O32O83 -O32O47u -O32O46 -O32O42 -O32^wu -O32uO47 -O32u$A -O32^u -O32^T-1 -O32sxm -O32sMj -O32sI3d -O32$s*24 -O32R5R5 -O32R2$@ -O32$@R2 -{O32r -O32^Pp2 -O32p2O03 -O32p2 -O32o95o4t -O32o6Q -O32o6F -O32o5r -O32o4to95 -O32o4=,5 -O32o3r -O32o3p -O32o3A -O32o38 -O32o2j -O32o2d -$_O32o2A -[O32o2@ -O32o1y -O32o1w -O32o1u -O32o1s -O32o1FZ3 -O32o1E -O32o17 -O32o0Ky4 -O32o0Di1a -O32^J-7 -O32i7o -O32i6 s0$ -O32i5q -O32i4xE -O32i4w -O32i3x -O32i3s -O32i3b -O32i32p3 -O32i2s*35 -O32i2g -O32i2f^h -O32i2f -O32i22 -O32i2/ -O32i1j -O32i1ao0D -O32i11y2 -O32^HY4 -O32$g*03 -O32^F*12 -O32$f -O32^#f -O32EY4 -O32^eq -O32Ei4x -{O32E -O32dsI3 -O32D7Y3 -O32^d -O32cY3 -O32^c*21 -$$O32C -O32^c -O32[^B -O32$Au -O32'A -O32^8 -O32*76Y4 -O32*76$$ -O32$$*76 -O32-6 -O32,5Y2 -O32*53-4 -O32-4*53 -O32*42 -O32.3Y1 -O32*35Y2 -O32*31 -O32+3 -O32-3 -O32^3 -O32*25 -O32*24$s -O32.1 -O32^0z4 -O32$0$7 -O32*03$g -}O32*01 -O32.0 -O32$) -O32^. -{O32 -^@O32 -^!O32 -O31$zO02 -O31z4^L -O31$*Z4 -O31z2*30 -$-O31Z2 -O31Y4o1i -O31y3$A -O31y3] -O31]y3 -O31y2D8 -O31Y2D1 -O31Y2*BA -O31}y1 -O31O94 -O31O65 -O31O52k -O31O52C -O31O02$z -O31$VZ3 -O31^u$S -O31u$L -O31T7 -O31t,3 -O31T0f -O31t] -O31sMf -O31sa^ -O31^S$8 -O31s2' -O31rp2 -O31p2r -O31p2i5y -O31p2i0a -O31p1l -O31^p -O31o8ui8l -O31o7j -O31o6! -O31o5y -O31o4i -O31o43k -O31o3J -O31o3_ -O31o2v -O31o2j -O31o2g -O31o2f*46 -O31o2, -O31o1x -O31o19 -O31o10E -$?O31o0Y -O31o0U -O31o04 -O31$mZ5 -O31$Lu -O31lp1 -O31$li7b -O31^l -O31kO52 -O31ko43 -O31Kc -O31k*04 -O31$JD2 -O31$j*72 -O31i8I -O31i7+,7 -O31i71 -O31i6o -O31i6i -O31i6_ -O31i2nE -O31i2c -O31i2@ -O31i1d -O31i11 -O31^GC -O31fO45 -O31^f -$*O31^f -O31Eo10 -O31Ei2n -O31doAe -O31diA_ -O31D2$J -O31D1Y2 -O31$.d -O31Cy3 -O31CO52 -O31cK -O31C{ -O31^c -O31'B -O31$Ay3 -O31*83 -O31^5 -O31*46o2f -O31$4 -O31.3y5 -O31,3t -O31$3 -O31$2 -O31*15y2 -O31*12 +O34 Z1 +O34 $y ^u +O34 y5 E +O34 y4 *64 +O34 y4 *24 +O34 y3 o0Z +O34 } y3 +O34 y3 +O34 Y2 -5 +O34 Y1 r +O34 O01 y2 +O34 $W o6. +O34 t R3 +O34 T1 ,3 +O34 T0 q +O34 $t +O34 snr +O34 R3 t +O34 p1 o2d +O34 o7w +O34 o6. $W +O34 o5x +O34 $m +O34 ^L *61 +O34 k *57 +O34 $+ i7. +O34 i5A +O34 i4g *23 +O34 i4- +O34 i2r +O34 i1s +O34 i0! +O34 ^H z1 +O34 f O05 +O34 E p2 +O34 c p2 +O34 $A +O34 'A +O34 *64 *06 +O34 ^6 +4 +O34 ,4 +O34 -3 Z3 +O34 +3 +O34 .3 +O34 *24 +O34 +1 +O34 $/ ^1 +O34 $@ +O34 $! +[ O34 +O32 Z3 o1F +$$ O32 Z3 +O32 z2 *40 +^? O32 z2 +$/ O32 Z1 +O32 ^* z1 +O32 y5 o9e +O32 y5 o3E +O32 y5 D6 +O32 y5 +4 +O32 y4 Y2 +O32 Y4 ^H +O32 Y4 E +O32 Y3 c +O32 Y2 y4 +O32 Y2 ,5 +O32 y2 ^@ +O32 ^Y +O32 O83 +O32 O47 u +O32 O46 +O32 O42 +O32 ^w u +O32 u $A +O32 ^u +O32 ^T -1 +O32 sxm +O32 sMj +O32 sI3 d +O32 $s *24 +O32 R5 R5 +O32 R2 $@ +O32 $@ R2 +{ O32 r +O32 ^P p2 +O32 p2 O03 +O32 p2 +O32 o4t o95 +O32 o6Q +O32 o6F +O32 o5r +O32 o4= ,5 +O32 o3r +O32 o3p +O32 o3A +O32 o38 +O32 o2j +O32 o2d +$_ O32 o2A +[ O32 o2@ +O32 o1y +O32 o1w +O32 o1u +O32 o1s +O32 o1F Z3 +O32 o1E +O32 o17 +O32 o0K y4 +O32 o0D i1a +O32 ^J -7 +O32 i7o +O32 i6 s0$ +O32 i5q +O32 i4x E +O32 i4w +O32 i3x +O32 i3s +O32 i3b +O32 i32 p3 +O32 i2s *35 +O32 i2g +O32 i2f ^h +O32 i2f +O32 i22 +O32 i2/ +O32 i1j +O32 i11 y2 +O32 ^H Y4 +O32 $g *03 +O32 ^F *12 +O32 $f +O32 ^# f +O32 ^e q +O32 E i4x +{ O32 E +O32 D7 Y3 +O32 ^d +O32 c Y3 +O32 ^c *21 +$$ O32 C +O32 ^c +O32 [ ^B +O32 'A +O32 ^8 +O32 *76 $$ +O32 $$ *76 +O32 -6 +O32 ,5 Y2 +O32 -4 *53 +O32 *42 +O32 *35 Y2 +O32 *31 +O32 +3 +O32 -3 +O32 ^3 +O32 *25 +O32 *24 $s +O32 .1 +O32 ^0 z4 +O32 $0 $7 +O32 *03 $g +} O32 *01 +O32 .0 +O32 $) +O32 ^. +{ O32 +^@ O32 +^! O32 +O31 $z O02 +O31 z4 ^L +O31 $* Z4 +O31 z2 *30 +$- O31 Z2 +O31 Y4 o1i +O31 y3 $A +O31 y3 ] +O31 ] y3 +O31 y2 D8 +O31 Y2 D1 +O31 Y2 *BA +O31 } y1 +O31 O94 +O31 O65 +O31 O52 k +O31 O52 C +O31 O02 $z +O31 $V Z3 +O31 ^u $S +O31 u $L +O31 T7 +O31 t ,3 +O31 T0 f +] t D3 +O31 sMf +O31 ^S $8 +O31 s2' +O31 r p2 +O31 p2 i5y +O31 p2 i0a +O31 ^p +O31 o8u i8l +O31 o7j +O31 o6! +O31 o5y +O31 o4i +O31 o43 k +O31 o3_ +O31 o2v +O31 o2j +O31 o2g +O31 o2f *46 +O31 o2, +O31 o1x +O31 o19 +O31 o10 E +$? O31 o0Y +O31 o0U +O31 o04 +O31 $m Z5 +O31 $l i7b +O31 ^l +O31 K c +O31 k *04 +O31 $J D2 +O31 $j *72 +O31 i8I +O31 i7+ ,7 +O31 i71 +O31 i6o +O31 i6i +O31 i6_ +O31 i2n E +O31 i2c +O31 i2@ +O31 i1d +O31 i11 +O31 ^G C +O31 f O45 +O31 ^f +$* O31 ^f +O31 E i2n +O31 d oAe +O31 d iA_ +O31 D2 $J +O31 D1 Y2 +O31 $. d +O31 C y3 +O31 c K +O31 C { +O31 'B +O31 $A y3 +O31 *83 +O31 ^5 +O31 $4 +O31 .3 y5 +O31 $3 +O31 $2 +O31 *15 y2 +O31 *12 ^X *31 -O31$% -O31} -O31^# -O31^@ -O31^/{ -}O31 -]O31 +O31 $% +O31 } +O31 ^# +O31 ^@ +O31 ^/ { +} O31 +] O31 ^X $3 ^x ^3 -O2A+3 -O29y2$8 -O29rp4 -O29p4r -O29$8y2 -O28y4*36 -O28p2l -O28p2$& -O28lp2 -O28i6l -O28$7 -$*O28 -O27z4 -O27o3.y2 -O27o0b -O27K -O27i1v -O27$%f -O27^D -O26z4 -O26p4l -O26p4$( -O26o2h -O26lp4 -O26k -O26fo0k -O26d^Z -O26d*54 -O26+4 -O26*01 -O26$0 -$*O26 -^!O26 -O25y5E -O25y2z2 -O25y2t -O25ty2 -O25T0$& -O25$&T0 -O25qq -O25q*74 -O25q$2 -O25p4T4 -O25p3*54 -O25o4! -O25o2p -O25o2b -O25l$4 -O25i5x -O25i3g -O25i0J -O25$4l -O25$3Y2 -O25$#$# -O24^ZY4 -O24z5i3o -O24z2 -O24Z1+4 -O24Y4^Z -O24Y4*24 -[O24y2 -O24Y1+4 -O24^v -[O24u -O24tp4 -O24T2srS -O24^T -O24srST2 -O24se3 -O24R3 -O24qD9 -O24q*94 -O24q*65 -O24q] -O24p4t -O24p4^a -O24p3DA -O24p3 -O24p1i5@ -O24$P -O24o3=f -O24o3@ -O24o2-$. -O24$.o2- -O24$ld -O24L2 -O24i3yd -O24i3r -O24i2W -O24i2d -O24^Et -O24D9 -O24C,1 -O24+9 -O24+4Z1 -O24+4Y1 -O24$&-4 -O24-4$& -O24^1^m -O24*13 -O24}+0 -O24-0 -O24$ -O24^@ -O24^! -$(O24^) -$(^)O24 -{O24 -O23$zy4 -O23Z4Y2 -O23$=Z3 -O23Z2i2T -O23y4$z -O23y4K -O23y4*78 -O23y4,6 -O23y3Y1 -O23y2y5 -O23Y2t -O23Y2f -[O23Y2 -O23Y1y3 -O23Y1o4w -O23O62 -O23O4By4 -O23O41$$ -O23$$O41 -O23O02O56 -O23$x -O23^w*48 -O23$V -O23^u -O23tY2 -O23t-0 -$+O23t -O23snq -O23$S -O23R0^l -O23r -}O23q -O23p4l -O23p3'A -O23p2'A -O23p2] -O23p1o9$ -O23p1[ -O23o7h -O23o6!Y1 -O23o4wY1 -O23o3g -O23o2y] -O23]o2y -O23o2W -O23o2K -O23o1iq -O23o1_ -O23o0h$` -O23$`o0h -$.O23$O -O23^m -O23lp4 -O23L6^n -O23^'^L -O23kp2 -O23^K -O23^J -O23^j -O23i7, -O23i5y -O23i5/$B -O23i4# -O23i3t -O23i2TZ2 -O23i2b -O23i2& -O23i1p+2 -O23i1h -O23i06.3 -O23^h -O23^G -O23^eu -O23^ei1G -O23^e -O23d'A -O23D7-5 -O23$Bi5/ -O23$b -O23^7 -O23*64] -O23]*64 -O23-5D7 -O23*35Y4 -O23}$1 -O23-0t -O23$0 -O23^@ -$$O23 -$@O23 -$.O23 -$ -$<$>O12 +O15 C Y2 +O15 c +O15 *15 Z3 +O15 *12 +[ O15 +^* O15 +O14 z3 Y2 +O14 ^z +O14 Y5 ^J +O14 u Y4 +O14 y4 $L +^* O14 Y4 +O14 Y2 z3 +O14 Y2 k +O14 Y2 f +O14 Y2 c +O14 y2 ] +O14 ] y2 +O14 y1 $3 +O14 O15 +O14 $U i3o +O14 ssl +$! O14 slg +O14 R3 q +O14 R2 K +O14 ^r +O14 q *56 +O14 l p4 +O14 p2 o5! +O14 p2 $, +O14 ^P +O14 o83 +O14 o75 +O14 o45 +2 +O14 o3v Y5 +O14 o3l +O14 o1u +O14 $L y4 +O14 k Y2 +O14 K R2 +O14 ^J Y5 +O14 ^j +O14 i41 ^Y +O14 i3o $U +O14 i18 +O14 ^h +O14 ^g $4 +O14 ^e +O14 d o7, +O14 d *97 +O14 D2 o2H +O14 c Y2 +O14 $c +O14 $9 +O14 -3 +O14 ^2 ^5 +O14 $1 +[ O14 +^$ O14 +O13 z5 z3 +O13 z5 t +O13 Y1 z2 +O13 y5 o0J +O13 y4 o25 +O13 t Y3 +O13 Y3 D4 +O13 y3 $5 +O13 y3 +O13 y2 i8n +O13 y2 d +$' O13 Y1 +O13 u *30 +O13 .0 T6 +O13 i31 T0 +$% O13 T0 +O13 s-l +O13 r p1 +O13 ] R0 +O13 $q +O13 o3x +O13 o3l +O13 o37 +O13 o2b +O13 o21 +O13 o0t ^r +O13 o0g +O13 o0C +O13 ^m +O13 k -6 +O13 k +O13 ^j +O13 i6o +O13 i5p +O13 i3v +O13 i3l +O13 i3_ +O13 i2q +O13 i2, f +O13 i2D o5+ +O13 ] f +O13 D4 Y3 +O13 $5 y3 +O13 *54 +O13 *46 +O13 *32 ^! +O13 *30 +O13 .0 ^U +O13 $0 +O13 .0 +O13 $% +O13 $* +O13 $. +O13 ^' +O12 Z3 +O12 z2 t +O12 z2 *25 +$$ O12 Z2 +O12 ^x Z1 +O12 ^z +O12 y3 ^k +O12 y3 .6 +O12 y3 +O12 y2 *64 +O12 y2 *10 +} O12 Y2 +O12 y1 i0z +O12 Y1 +O12 $X Y1 +O12 O51 *24 +O12 O24 p2 +O12 O21 z2 +O12 ^W +O12 t D0 +O12 t +$* O12 t +O12 suc +O12 srW +O12 snc +O12 sln +O12 s74 +O12 s5L +O12 $s +O12 R7 R7 +O12 ^R +O12 p5 ^w +O12 p3 O08 +O12 p3 $# +O12 p1 *B9 +O12 p1 +O12 o95 +O12 o5O +O12 o3- +O12 o2f +$! O12 o1S +O12 o0x K +O12 ^l +O12 K o0x +} O12 i6r +O12 i5w +O12 i5b +O12 i5- +O12 i4@ +O12 i3y +O12 i3l +O12 i3k +O12 i2R y5 +O12 i2C $? +O12 $? i2C +O12 i2a y3 +O12 i2) +$/ O12 i0/ +O12 f O62 +O12 E O41 +O12 ^E +O12 d O05 +O12 d +A +O12 C z3 +O12 $c +O12 ^B +O12 $b +O12 $a $, +O12 ,7 -6 +O12 +7 +O12 *46 d +O12 *40 ^m +O12 *32 y1 +O12 ^2 .6 +O12 *16 i3n +O12 -1 +O12 ^0 +O12 $+ +O12 $. +O12 } ^# +$< O12 $> +$< $> O12 ^x .1 *03 ^x $1 ^+ ^x -1 $X -0 Y5 $X +0 E -O0BK -O0B] -O0Az4 -O0AO31 -O0Ap2O02 -O0Ap2 -O0AD6 -O0A} -^(O0A -O09p5 -O09^6 -O09+0 -O09$} -O09^* -O08y2C -O08y1 -O08p1 -O08C$* -O08$*C -O08$2 -O08$1 -O08,1 -O08} -$ O08 -O07Z3q -O07Y4 -O07Y3q -O07Y2 -O07O93 -O07O6B -O07O36 -O07-0 -O07} -O07{ -O06z4 -O06z2u -O06z1 -O06Y3q -O06Y2y2 -O06y2Y2 -O06Y1 -O06uz2 -O06rp2 -O06qZ3 -O06q*19 -O06p3*45 -O06p2r -O06L1 -O06kp2 -O06^K -O06^i -O06d -O06C -O06$aZ4 -O06$4 -O06+3Y5 -O06$2 -[O06$2 -O06*10 -O06$* -O06$@ -O05z2*42 -O05Z1y5 -O05$z -O05y5Z1 -O05y5O43 -O05y5*97 -O05y5+8 -O05y4[ -O05y3 -O05y2D6 -O05Y1 -{O05Y1 -O05O21u -O05O12 -O05uO21 -$*O05u -]O05u -O05s1+ -O05q -O05p4k -{O05p4 -O05^.o7. -O05o35 -O05o2v -O05i5% -O05i3n -O05i3. -O05i1u -O05i19 -O05^h -}O05$h -O05f*20 -O05E$0 -O05$e -O05dY1 -O05dc -O05Cz3 -O05Cz2 -{O05C -O05$5 -O05^5 -O05'3 -O05$2 -O05.2 -O05$0E -O05$* -O05[ -O04Z4Z4 -O04Z4q -O04Z4-5 -O04Z3 +O0B K +O0B ] +O0A z4 +O0A O31 +O0A p2 O02 +O0A p2 +O0A D6 +O0A } +^( O0A +O09 p5 +O09 ^6 +O09 +0 +O09 $} +O08 y2 C +O08 y1 +O08 C $* +O08 $2 +O08 $1 +O08 ,1 +O08 } +$ O08 +O07 Z3 q +O07 Y4 +O07 Y3 q +O07 Y2 +O07 O93 +O07 O6B +O07 O36 +O07 -0 +O07 } +O07 { +O06 z4 +O06 u z2 +O06 Y3 q +O06 Y2 y2 +O06 Y1 +O06 r p2 +O06 q Z3 +O06 q *19 +O06 p3 *45 +O06 L1 +O06 k p2 +O06 ^K +O06 ^i +O06 d +O06 C +O06 $a Z4 +O06 $4 +O06 +3 Y5 +O06 $2 +[ O06 $2 +O06 *10 +O06 $* +O06 $@ +O05 z2 *42 +O05 Z1 y5 +O05 $z +O05 y5 Z1 +O05 y5 O43 +O05 y5 *97 +O05 y5 +8 +O05 y4 [ +O05 y3 +O05 y2 D6 +O05 Y1 +O05 u O21 +O05 O12 +$* O05 u +] O05 u +O05 s1+ +O05 q +O05 p4 k +{ O05 p4 +O05 ^. o7. +O05 o35 +O05 o2v +O05 i5% +O05 i3n +O05 i3. +O05 i1u +O05 i19 +O05 ^h +} O05 $h +O05 f *20 +O05 $0 E +O05 $e +O05 d Y1 +O05 d c +O05 C z3 +O05 C z2 +{ O05 C +O05 $5 +O05 ^5 +O05 '3 +O05 $2 +O05 .2 +O05 $* +O04 Z4 Z4 +O04 Z4 q +O04 Z4 -5 +O04 Z3 $x *04 Z2 -O04z1^o -O04Y5Y1 -O04y4i4, -O04y3 -O04y2+2 -O04^Xt -O04O72 -$.O04$w -O04u$* -O04$*u -O04u -O04t+2 -O04ss1c -O04$/q -$/O04q -O04p5 -O04p2DB -O04p2] -O04p1o11 -O04$_^P -O04o57*24 -O04o4 -O04o38 -O04o0xy2 -O04o01 -O04^N$4 -O04^M -O04$L -O04iA2 -O04i6. -O04i4$ -$%O04i4$ -O04i3k -O04i2yt -O04i1t -O04i0Y -O04i0jR2 -O04i0B$5 -O04D6 -O04css1 -O04^c -O04^B -O04$a -O04+7 -O04*65*64 -O04-6 -O04$5i0B -O04^5 -O04$4Y4 -O04+2t -O04*24o57 -O04*23 -O04'2 -O04$0Y1 -$.O04$0 -O04$* -O04$@ -O04$! -O04]] -$$O04 -^/O04 -O03Z5t -O03z3^G -O03Z2i2h -O03z2i2b -O03z2 -O03Z1^m -O03y5Y1 -O03Y5i6e -O03Y4Y4 -O03y4*56 -O03y3y3 -O03y3y2 -O03y3k -O03y3.1 -O03Y3 -O03Y2y5 -O03Y2 -O03Y1y5 -O03O93 -O03O32 -O03O12 -O03$W -O03^V*23 -O03^u^z -O03uR5 -O03ui22 -O03tZ5 -O03tk -O03t*30 -O03t'3 -O03t*13 -O03$sL6 -^)O03se. -O03^s -O03R5u -O03qo8f -O03q -O03p2C -O03p1Y1 -O03p1$h -O03^P^! -O03o7ki7o -O03o6ME -O03o55 -O03o4cp1 -O03o44^A -O03o2e -O03o1sp4 -O03o0z -O03^o -O03$N -O03^N -O03^mZ1 -O03L6$s -O03kt -O03K^d -O03K+5 -O03^jo6e -O03i55 -O03i5 -O03i4qi4h -O03i4h -O03i3v-3 -O03i3b -O03i36 -O03i2-y2 -O03i2-i22 -O03i2hZ2 -O03i2b -O03i22u -O03i2. -O03i1j -O03i1- -O03^g$c -$+O03E -O03^dK -O03d$h -O03d+B -O03d'9 -O03D6 -O03D4$@ -O03$@D4 -O03^d-1 -O03d+0 -O03^d -O03d -O03cy2 -O03Cp2 -O03$c -O03c -O03'B -O03*73*48 -O03+5K -O03*48*73 -O03'3t -O03*30t -O03$!-3 -O03-3$! -O03^2y1 -O03*23 -O03*13t -^x *03 .1 -O03*04 -O03$? -$*O03 -$.O03 -$>O03 -}O03 -O02z4t -O02Z3*40 -O02z3 -O02z2t -O02Z2 -O02Z1$! -^_O02$z -O02y3u -O02y3c -O02Y3$/ -O02Y2Y3 -O02Y2i0h -O02y2D5 -O02Y1y1 -O02y1Y1 -O02Y1*34 -$'O02Y1 -O02O83 -O02O62Y3 -O02O16 -O02$VZ1 -O02uy3 -O02$u -O02tz4 -O02tz2 -O02sxF$. -O02$.sxF -O02srp -O02soa -O02scs -O02s27 -O02s1+ -O02^/r -]O02q -O02p1$W -O02^p -O02o8oO71 -O02o5z -O02o51 -O02o5@ -O02o32i6a -O02o2z -O02o1.z4 -O02o1y -O02o1s -O02o1e^M -O02o13 -O02o0d$9 -O02}$o -O02k$k -O02$kk -O02^k -O02i6ao32 -O02i64 -O02i6* -O02i6$ -O02i51 -O02i50 -O02i4n -O02i4Jl -O02i4h -O02i48 -O02i3s -O02i3n -O02i3-i3- -O02i33 -O02i3@ -O02i2o -O02i1v -O02i1ui2T -O02i1u -O02i1l -O02i1a -O02i0K -O02i0hY2 -O02E -O02dO04 -O02DB -O02D5*10 -O02d-5 -O02D4 -O02^d -O02c -O02'B -O02*AB -O02$9o0d -O02$8 -O02-8 -O02.6 -O02-6 -O02+5Y4 -O02*53i1w -O02*45 -O02*43 -}O02*42 -O02*41*27 -O02*40Z3 -O02*40 -O02{*35 -O02*34Y1 -O02$3 -O02,3 -O02*27*41 -O02*15.0 -O02*10D5 -O02-1 -O02$%^@ -O02$- -O01z3o2l -O01Z2$D -O01Y5+9 -O01Y4Y4 -O01y4i8@ -O01y4[ -O01y2u -O01O82 -O01O61$@ -O01$@O61 -O01O56 -O01O51*35 -$x*01O51 -O01O42 -O01$x -O01uy2 -$-O01t -O01sad -O01rD5 -O01R2$d -O01r -O01p2$* -O01p2] -O01o7*E -O01o7! -O01o6p -O01o6+ -O01o4S$. -O01$.o4S -O01o3X -O01o2v -O01o1ip1 -O01k$! -O01$!k -O01^J*86 -$@O01i71 -O01i65 -O01i6! -O01i54 -O01i5% -O01i4v -O01i4e -O01^f$b -O01Ey3 -O01Eo7* -O01ED2 -O01$dR2 -O01$Dr -O01d,6 -O01D3r -O01D3[ -O01D2E -O01$d -O01$a -O01-7-2 -O01*6AO43 -O01*41 -O01-2-7 -O01$- -O01} +O04 z1 ^o +O04 Y5 Y1 +O04 y4 i4, +O04 y3 +O04 y2 +2 +O04 ^X t +O04 O72 +$. O04 $w +O04 u $* +O04 u +O04 t +2 +O04 ss1 c +O04 $/ q +$/ O04 q +O04 p5 +O04 p2 DB +O04 p2 ] +O04 p1 o11 +O04 $_ ^P +O04 *24 o57 +O04 o4 +O04 o38 +O04 o0x y2 +O04 o01 +O04 ^N $4 +O04 ^M +O04 $L +O04 iA2 +O04 i6. +O04 i4$ +$% O04 i4$ +O04 i3k +O04 i2y t +O04 i1t +O04 i0j R2 +O04 $5 i0B +O04 D6 +O04 c ss1 +O04 ^c +O04 ^B +O04 $a +O04 +7 +O04 *65 *64 +O04 -6 +O04 ^5 +O04 $4 Y4 +O04 +2 t +O04 *23 +O04 '2 +O04 $0 Y1 +$. O04 $0 +O04 $* +O04 $@ +O04 $! +O04 ] ] +$$ O04 +^/ O04 +O03 Z5 t +O03 z3 ^G +O03 Z2 i2h +O03 z2 i2b +O03 z2 +O03 Z1 ^m +O03 Y5 i6e +O03 Y4 Y4 +O03 y4 *56 +O03 y3 y3 +O03 y3 y2 +O03 y3 k +O03 y3 .1 +O03 Y3 +O03 Y2 y5 +O03 Y2 +O03 O93 +O03 O32 +O03 O12 +O03 $W +O03 ^V *23 +O03 ^u ^z +O03 u R5 +O03 u i22 +O03 t k +O03 t *30 +O03 t '3 +O03 t *13 +O03 $s L6 +^) O03 se. +O03 ^s +O03 R5 u +O03 q o8f +O03 q +O03 p2 C +O03 p1 Y1 +O03 p1 $h +O03 ^P ^! +O03 o7k i7o +O03 o6M E +O03 o55 +O03 o4c p1 +O03 o44 ^A +O03 o2e +O03 o1s p4 +O03 o0z +O03 ^o +O03 $N +O03 ^N +O03 L6 $s +O03 K ^d +O03 K +5 +O03 ^j o6e +O03 i55 +O03 i5 +O03 i4q i4h +O03 i4h +O03 i3v -3 +O03 i3b +O03 i36 +O03 i2- y2 +O03 i2- i22 +O03 i2h Z2 +O03 i2b +O03 i2. +O03 i1j +O03 i1- +O03 ^g $c +$+ O03 E +O03 ^d K +O03 d +B +O03 d '9 +O03 D6 +O03 D4 $@ +O03 $@ D4 +O03 ^d -1 +O03 d +0 +O03 ^d +O03 d +O03 c y2 +O03 C p2 +O03 $c +O03 c +O03 'B +O03 *73 *48 +O03 +5 K +O03 $! -3 +O03 -3 $! +O03 ^2 y1 +O03 *23 +O03 *04 +O03 $? +$* O03 +$. O03 +$> O03 +} O03 +O02 t z4 +O02 Z3 *40 +O02 z3 +O02 z2 t +O02 Z2 +O02 Z1 $! +^_ O02 $z +O02 u y3 +O02 y3 c +O02 Y3 $/ +O02 Y2 Y3 +O02 Y2 i0h +O02 y2 D5 +O02 y1 Y1 +O02 Y1 *34 +$' O02 Y1 +O02 O83 +O02 O62 Y3 +O02 O16 +O02 $V Z1 +O02 $u +O02 sxF $. +O02 srp +O02 soa +O02 scs +O02 s27 +O02 s1+ +O02 ^/ r +] O02 q +O02 p1 $W +O02 o8o O71 +O02 o5z +O02 o51 +O02 o5@ +O02 o32 i6a +O02 o2z +O02 o1. z4 +O02 o1y +O02 o1s +O02 o1e ^M +O02 o13 +O02 o0d $9 +O02 } $o +O02 k $k +O02 $k k +O02 ^k +O02 i64 +O02 i6* +O02 i6$ +O02 i51 +O02 i50 +O02 i4n +O02 i4J l +O02 i4h +O02 i48 +O02 i3s +O02 i3n +O02 i3- i3- +O02 i33 +O02 i3@ +O02 i2o +O02 i1v +O02 i1u i2T +O02 i1u +O02 i1l +O02 i1a +O02 i0h Y2 +O02 E +O02 d O04 +O02 DB +O02 D5 *10 +O02 d -5 +O02 D4 +O02 ^d +O02 c +O02 'B +O02 *AB +O02 $8 +O02 -8 +O02 .6 +O02 -6 +O02 +5 Y4 +O02 *53 i1w +O02 *45 +O02 *43 +} O02 *42 +O02 *41 *27 +O02 *40 Z3 +O02 *40 +O02 { *35 +O02 *34 Y1 +O02 $3 +O02 ,3 +O02 *15 .0 +O02 -1 +O02 $% ^@ +O02 $- +O01 z3 o2l +O01 Z2 $D +O01 Y5 +9 +O01 Y4 Y4 +O01 y4 i8@ +O01 y4 [ +O01 u y2 +O01 O82 +O01 O61 $@ +O01 $@ O61 +O01 O56 +O01 O51 *35 +O01 $x +O01 sad +r ] D5 +O01 R2 $d +O01 p2 $* +O01 p2 ] +O01 E o7* +O01 o6+ +O01 o4S $. +O01 $. o4S +O01 o3X +O01 o1i p1 +O01 k $! +O01 $! k +O01 ^J *86 +$@ O01 i71 +O01 i6! +O01 i54 +O01 i4e +O01 ^f $b +O01 E y3 +O01 E D2 +O01 $d R2 +O01 $D r +O01 d ,6 +O01 D3 r +O01 D3 [ +O01 $d +O01 $a +O01 -2 -7 +O01 *6A O43 +O01 *41 +O01 $- ^x $0 $X $$ } $X @@ -41823,20 +35044,19 @@ $w Z5 -5 ^w z4 ^W z3 $w Z2 z1 -$wZ2O84 +$w Z2 O84 $w Z2 t $W Z2 E ] ^W z2 -$w z1 Z2 -^wz1O73 -^Wz1O62 +^w z1 O73 +^W z1 O62 ^W Z1 o5g ^W z1 ^w $z -$WY5OA3 -^wY5O51 -^wy5O32 -^WY5O12 +$W Y5 OA3 +^w Y5 O51 +^w y5 O32 +^W Y5 O12 $W $y *53 $w Y5 $W y4 @@ -41845,39 +35065,33 @@ $W y2 z5 $w y2 o9A ^w y2 o2t ^w y2 ,9 -$wY1O51 +$w Y1 O51 ^W y1 u ^W Y1 ^Q -$wO84Z2 -^wO72T0 -^wO65y1 -$wO64$u -$wO63 -^wO63 -$wO51Y1 -^WO46y2 -^WO43,2 -$wO42 -^WO34 -^wO31 -^wO23 -^WO12Y5 -$.$wO04 +$w O84 Z2 +^w O72 T0 +^w O65 y1 +$w O64 $u +$w O63 +^w O63 +$w O51 Y1 +^W O46 y2 +^W O43 ,2 +$w O42 +^W O34 +^w O23 +^W O12 Y5 +$. $w O04 $W $W { $W $w $w ^v -^W u y1 -$w$uO64 +$w $u O64 ^w u D7 ^W ^U -$w t Z2 -$w t Y3 ^w t $8 ^W T6 -^wT0O72 ^w sli *25 ^w ^s LA -$W sig [ $W [ sig $w $s E $w s9. @@ -41889,7 +35103,6 @@ $W $S ^W ^S ^w r $w $q Z1 -^W ^Q Y1 ^W q q ^W ^Q $w $P Y2 @@ -41935,7 +35148,6 @@ $W i8E r $W i8e $w i7f $W i74 -^W i73 $w i6i $W i65 ^w i5y @@ -41954,15 +35166,10 @@ $w i2k ^w i2f $W i2e ^w i2d -^W i1S ^w i1i ^W i1G $w i0o ^z ^w i0N -^W i0M -$W i0j -^w i0h -^W i0E ^W i0C ^w i05 o24 ^W ^G @@ -41970,11 +35177,9 @@ $w $G $W E Z2 $W E T4 $W $e t -$w E $s ^W ^D i0S ^w d E ^W D8 i1C -^w D7 u ^w D7 $W D6 $w D5 @@ -41995,18 +35200,15 @@ $w ^A ^w +A ^w $A $w ^a -^w $8 t $w -8 $s $W ^8 ^8 $W ^8 ^w +8 ] -^w ] +8 ^W .7 ,6 ^w *76 $w *70 *52 $W ,7 ^w +7 -^W ,6 .7 $w *65 $n $w *64 $W +6 @@ -42016,20 +35218,15 @@ $w +5 ^j $W *57 $w *54 D4 $W *53 $y -$w *52 *70 -^W *50 s1S $w ^5 $w +4 -^w $3 c ^w *3A ,A $w *36 ^l $w ,3 $w ^3 ^w -3 ^w ^3 -^W,2O43 ^w *28 -^w *25 sli ^w *20 ^W $2 ^w -2 @@ -42048,7 +35245,6 @@ $/ ^w $_ $w $^ ^w { $w -[ $w ^w } } ^w ^( ^w ^/ @@ -42056,14 +35252,14 @@ $^ ^w ^V z5 u $v Z4 $v Z3 -$vZ2O74 +$v Z2 O74 $V Z2 ^v Z2 ^' $v Z2 ^V z1 $N $v Z1 d $- $v Z1 -$v y5 u +$v u y5 ^v Y4 ^V y2 y5 ^V y2 @@ -42071,21 +35267,19 @@ $v $. Y2 $v y2 $v Y1 D5 $v $y -$VOB4 -$VO72 -^vO63i0S -$vO63 -^vO42 -$vO34 -$vO32$r -^vO25 -^VO23y2 -^VO15^A +$V OB4 +$V O72 +^v O63 i0S +$v O63 +^v O42 +$v O34 +$v O32 $r +^v O25 +^V O23 y2 +^V O15 ^A ^v $v *31 $V $v ^V ^v -^V u z5 -$v u y5 ^v u i0D $V u [ $V u @@ -42102,14 +35296,14 @@ $v s.8 ^v s53 $v ^S ^v ^S -$v$rO32 +$v $r O32 $v $r ^v ^Q ^@ ^v p5 $v ^p ^v ^p $v o9s -$Vo8PO52 +$V o8P O52 $V o77 $v o6p $v o6- @@ -42128,17 +35322,14 @@ $v o3p ^v o2@ ^V o1w p3 $v o1v -^V o1P $V o0M $v o0A ^v ^O $v $o ^v ^o -^V $N z1 $V $M ^V ^M ^v ^M -^V l o3t $v L7 ^v L0 z2 $V $L @@ -42154,7 +35345,7 @@ $v i8y $v i7_ $v i6x *30 ^V i6/ -^vi5%O23 +^v i5% O23 ^v i5m ^v i5h r ^v i4n @@ -42166,23 +35357,16 @@ $v i3n $v i3m ^V i1- K ^V i1. -^V i0P -^v i0D u -$v i0D ^v i0C ^v i0a ^v ^E ,8 -^v D8 o3, ^v D8 *52 -^v D7 ^V D6 ^v D6 $v D5 Y1 -$v D5 k $v D4 $v D3 } $v D3 -^v D3 $v $c +8 $v $c ^v { $b @@ -42191,21 +35375,17 @@ $v $c $v *97 $v *95 ^v *90 +8 -^v +8 *90 $V *82 Y1 $v *82 ^V $7 ^V -7 ^v *63 Z1 -^v *52 D8 $v $5 ^v $4 ^v *34 ^v *31 $v ^v *31 -$v *30 i6x -^v^2O24 -^v *20 o3- +^v ^2 O24 ^v ^2 $v ^1 ^v *06 @@ -42227,7 +35407,7 @@ $. ^v u $Z Z5 u ^Z ^X u Z5 Z5 -uZ5O71 +u Z5 O71 u z5 sIA u Z5 s2q u Z5 o2Z @@ -42236,13 +35416,10 @@ u Z5 D7 u Z5 ,9 u Z5 *64 u Z5 +5 -] u Z5 u z5 -u z4 z2 -u z4 y2 u Z4 ^V -uZ3O83 -uZ3O23 +u Z3 O83 +u Z3 O23 $u Z3 ^v u Z3 s80 u Z3 s*0 @@ -42250,35 +35427,28 @@ u Z3 $s $u Z3 D8 u $* Z3 u ] Z3 -u z2 z4 u z2 o1J u Z2 .2 u z2 -0 $U Z2 -$# u Z2 -u z2 u Z1 Y5 u Z1 $Y -uZ1O31 +u Z1 O31 $u Z1 iA. $U z1 ,5 u Z1 -1 -u Z1 $u Z1 -$& u Z1 -{ u Z1 ^u $z ^u ^Y y2 u $Y $C -uy5O92 -uY5O84 +u y5 O92 +u Y5 O84 u y5 $w u Y5 o1t u Y5 i9T u Y5 i7S u y5 *8A u y5 *09 -] u Y5 u y4 $t ^U y4 l u y4 $C @@ -42286,18 +35456,15 @@ u Y4 *87 u Y4 +6 u Y4 ,3 u Y4 $. -uY3O52 +u Y3 O52 u Y3 ,8 u Y3 ,7 u Y3 *02 $u Y3 -u Y2 Y2 $u Y2 Y2 -uy2O47 $u Y2 t u Y2 o8g u Y2 i9. -u Y2 D0 ^u y2 ^c u Y2 ,B u y2 *51 @@ -42312,80 +35479,62 @@ u y1 *41 ^U Y1 ^U $y u ^X z4 -u$XO42 -^uOA5 -uO83Z3 -$uO82 -^UO81smC -uO71Z5 -uO71 -^uO71 -uO65$I -uO64Y4 -uO64t -uO63t -uO62$J -^uO62D3 -uO61$J -uO61$j -^uO54^K -uO53$M -]uO53 -uO52] -u]O52 -uO51$4 -$uO51 -$*uO51 -uO45 -uO43t -uO43d -uO42$X -uO42 -uO35y3 -uO35t -uO32k -^UO32 -uO32 -uO31Z1 -^uO31t -uO31o0W -uO24t -uO24d -[uO24 -^uO24 -uO23Z3 -uO23i5? -uO21k -uO14y2 -$*uO05 -]uO05 -uO04^G +u $X O42 +^u OA5 +u O83 Z3 +$u O82 +^U O81 smC +u O71 Z5 +u O71 +^u O71 +u O65 $I +u O64 Y4 +u O64 t +u O63 t +u O62 $J +^u O62 D3 +u O61 $J +u O61 $j +^u O54 ^K +u O53 $M +u O52 ] +u ] O52 +u O51 $4 +$u O51 +u O43 t +u O43 d +u O42 $X +u O42 +u O35 t +u O32 k +^U O32 +u O32 +u O31 Z1 +^u O31 t +u O31 o0W +u O24 t +u O24 d +^u O24 +u O23 Z3 +u O23 i5? +u O21 k +u O14 y2 +u O04 ^G u $X u ^- ^X $u $x u $w y5 $U ^W -u ^V Z4 -$u ^v Z3 ^U ^V K ^U ^V -[ u $V u $U i7F ^u u $2 $U ^u u $t y4 -$u t Y2 -utO64 -utO63 -u^tO52 -utO43 -utO35 -^utO31 -utO24 +u ^t O52 $U $t o6f $U t K u T8 $! -u $! T8 u T7 T2 u T6 -4 ^U T6 @@ -42393,38 +35542,29 @@ u ^T ,6 ^U T5 o1P u T3 $7 ^U T3 -u T2 T7 $U ^T u $T $u ^T u ^t -$' u t u sZB ^U sy7 u sTD u sSV $O u sR* -u sOo $. u $. sOo $U so0 u sO* u sNn u sNM -^UsmCO81 u sLT ] -u ] sLT u sIU -u sIA z5 u sHW u s H u sEz u sCP DA -u s80 Z3 u s7! i3" u s3D +5 -u s2q Z5 u s1l -u s*0 Z3 ^U $S u $S u $s @@ -42437,24 +35577,19 @@ $u $R u r } $u r ^@ $u p4 -up3OAB -up2O62 -up2O4A -up2O2A -up2O06 +u p3 OAB +u p2 O62 +u p2 O4A +u p2 O2A u p2 -up1O23 -^up1O05 +^u p1 O05 u p1 $X u p1 o2J -u p1 ^L u p1 $J u p1 i6S u p1 i64 -u p1 +B u p1 ^. $u p1 $_ -u $O sSV u $o i1o $u oAy ^U oAu @@ -42469,7 +35604,7 @@ u o7M ^U o7i u o7A *63 u o78 o1t -uo73O41 +u o73 O41 u o6Z u o6Y u o6U K @@ -42483,7 +35618,6 @@ u o6 ] u o5W u o5t u o5S ] -u ] o5S u o56 .6 ^u o54 ^u o53 @@ -42494,44 +35628,31 @@ u o4f *46 u o4_ D0 u o46 *43 u o3W -$u o3D o88 -u o39 o6% u o3- u o2Z Z5 u o2T *97 u o2S u o2F ,1 u o1t Y5 -u o1t o78 -^U o1P T5 -^U o1P $u o1f *17 $U o1b *70 -uo0WO31 u o0W -7 $u o0p u o0l -u o0G -u o0g $* u $* o0g ^U ^O u $N ^u ^n ^u ^m z1 -u$MO53 +u $M O53 u ^M $1 u $l Z1 -^U l y4 ^u l ^L -^u l i5g +^u i5g l $u L6 u L5 Y2 ^u L0 r $u ^L -ukO32 -ukO21 -^U K ^V -$U K t u K o6U ^U k i5r u K *A8 @@ -42544,11 +35665,11 @@ $U $K $u $k } u k u $j Z5 -u$JO62 -u$JO61 -u$jO61 +u $J O62 +u $J O61 +u $j O61 u $J $F -u$IO65 +u $I O65 $U $i E u iBY u iBD @@ -42556,7 +35677,7 @@ u iAR u iAn u i9. Y2 u i8F -ui89O12 +u i89 O12 u i7T u i7N u i7j @@ -42573,10 +35694,8 @@ $u i6A u i6? [ u i6 u i5T -^U i5r k ^u i5n *01 ^U i5m -^u i5g l u i5A D2 u i5/ u i4Y @@ -42585,7 +35704,6 @@ u i4c u i4_ -2 { u i3Y u i3x ,4 -u i3" s7! ^u i3l u i3I u i3B @@ -42596,15 +35714,14 @@ u i2E o72 u { i29 u i27 Y1 ^U i1Y -^U i1T +^T ^U ^U i1r -u i1o $o u i1K u i0X z2 ^u i0t *46 u i0R $a u i0$ r -ui0HO13 +u i0H O13 ^U i0E ^T ^u i0a ^U i0# } @@ -42617,54 +35734,39 @@ $U $H u $h $u $h ^u ^g o2y -ufO6B +u f O6B u ^F i0D -u f -6 u f *56 ^U ^F u $E Z2 $U E T4 u ^e i1d -$U E $i u [ ^E $u E $u $e ^u ^e -udO96 -udO93 -udO52 -udO13 -u d $X $u d $U u d o8K u d o56 u d o55 u d o41 -u d $J u d iA$ u d i70 u d i60 u $d i6= -u d ,B -u DA sCP u d $A u d .9 u D8 i3O u D7 Z5 ^u D7 i1n -u d -7 u D6 +5 -u d +6 u D5 D1 [ u D5 -u D3 z4 -u D0 Y2 $U d u $C y4 $u c $b $u $c u ^b ^x -$u $b c u *B9 *B7 ^u ^B *12 u ^B ,1 @@ -42672,29 +35774,23 @@ u ^B ,1 ^u $b u ^A z1 u 'A $T -u $a i0R u .A 'B u $A +8 u $a *67 $u $a *14 ^U +A u +A -u ^a $u ^a ^u $a u ,9 Z5 u +9 Z2 -u *97 o2T ^U ^9 -u +9 ] -u $9 u ] +9 +u $9 ] u ,9 u +8 $A u *86 K -u-7O41 -u $7 T3 -u -7 o0W +u -7 O41 u .7 $I u ,7 $H ^u ,7 ^f @@ -42704,45 +35800,35 @@ u *76 u *75 Y2 u +7 *36 u +7 -3 -$U *70 o1b -u *70 *58 +u *58 *70 } u ^7 u '6 Y3 u -6 Y3 -u .6 o56 -u +6 D4 -^u *6A k u *67 $a u *64 Z5 u *64 *45 -u *63 o7A u -6 ^u -6 u +5 Z5 -u ,5 ^T u +5 s3D u ^5 r u ,5 K -u +5 D6 u ,5 *95 -u *58 *70 u *56 u +5 *45 u *52 +4 -u *51 -2 +u -2 *15 u +5 +0 [ u *50 ^U $5 u -5 u +4 y4 u ,4 Y3 -u$4O51 -u -4 T6 +u $4 O51 u ^4 i6n -u*4AO52 +u *4A O52 u *46 .3 $u *45 $r -u +4 *52 ^u -4 *39 u *41 { u *40 ,5 @@ -42751,50 +35837,34 @@ u [ +4 ^u ^4 u ,3 Y4 u ,3 o2A -^u *39 -4 -u -3 +7 -u *36 +7 $# u *35 [ u *34 u *32 -0 u *30 Y2 u ^2 z5 -u .2 Z2 -^u $2 u -u -2 i4_ u *26 *13 $u *26 -u -2 *51 ^u *24 $1 u -2 *15 ^U $2 u +2 ] u $2 -u ] +2 u -1 Z1 u +1 p3 -u ,1 o2F u ^1 ^C u *17 $u *16 .6 -u *15 -2 u *14 i2y $u *14 $a u *14 u *13 f -u *13 *26 -^u $1 *24 ^u -1 u ^0 z4 u +0 y3 u +0 y2 -u +0 +5 u *03 z5 -u -0 *32 u *02 Y3 -u *02 -4 $u *02 -^u *01 i5n u .0 *02 $u .0 { $# ^U @@ -42803,82 +35873,64 @@ $# ^U u ^" ^" $& $u $* u $^ -$* $^ u $; ^u $- $u } $u { u ^u $? ^u } -^* u { -^* { u ^$ ^u ^- ^u t $Z Z5 -t ^Z t -tz5O87 +t z5 O87 t Z5 s9k -t z4 y2 -$t Z4 Y1 t z4 sBV t z4 o2@ t Z4 i86 -$_ t Z4 -^t Z3 z2 +^t z2 Z3 t Z3 t z3 ] t ] z3 -^t z2 Z3 -$t Z2 z1 -tZ2O61 +$t z1 Z2 t Z2 sHw t Z2 o7P $t Z2 ^H t Z2 $E ^t Z2 *68 ^T z2 -$t z1 Z2 $t Z1 y4 ^t Z1 ^w t Z1 T1 -t Z1 .6 -t z1 +2 -t Z1 -^! t z1 +t Y1 .6 [ t ^Z t $z t ^Y i0m t Y5 Z1 -ty5O83 -ty5O69 -tY5O18 -t y5 T5 +t y5 O83 +t y5 O69 t y5 K t y5 $k t y5 i56 $T y5 E t y5 +A -t y5 *90 t Y5 +1 t ] Y5 -t y5 $t y5 ^t y5 $t y4 Z1 -tY4OB2 -ty4O65 -tY4O02 +t Y4 OB2 +t y4 O65 +t Y4 O02 t y4 $X t y4 s27 t Y4 o5M t Y4 ^O -t Y4 i0O t Y4 ^C t Y4 +2 ^t y4 ^t Y3 y2 -tY3O82 -tY3O62 +t Y3 O82 +t Y3 O62 t Y3 ^S ^t y3 D5 t Y3 *45 @@ -42888,92 +35940,76 @@ t y2 r t y2 *36 $t Y2 $t y2 -$t Y1 Z4 -tY1OB1 -tY1O42 +t Y1 OB1 +t Y1 O42 t Y1 i4W ^T y1 i1M ^t Y1 i1b t Y1 $E t y1 $E -t Y1 .6 ^t y1 +3 $T $Y +1 -$% t Y1 -$- t Y1 $t ^y t $X y4 -tOB4 -tOB1Y1 -$tOA2$u -tO98 -tO94 -tO92Y4 -]tO92 -tO91*69 -tO87 -tO82Y3 -tO82o6P -^tO82,2 -tO81O52 -tO81$I -tO81.A -tO72D0 -$tO72 -tO63O12 -^TO63 -tO61Z2 -tO53d -tO52$I -^TO51 -$tO51 -tO42Y1 -tO41o1y -tO41$l -$tO41l -$TO41 -tO41 -tO32y4 -tO31$P -tO31-4 -tO27^S -tO24p4 -^TO24*21 -$+tO23 -^tO23 -tO16o2? -tO13z2 -^tO13i1e -tO12 -$*tO12 -tO02Y4 -$-tO01 +t OB4 +t OB1 Y1 +$t OA2 $u +t O98 +t O94 +t O92 Y4 +t O91 *69 +t O87 +t O82 Y3 +t O82 o6P +^t O82 ,2 +t O81 O52 +t O81 $I +t O81 .A +t O72 D0 +$t O72 +t O63 O12 +^T O63 +t O61 Z2 +t O53 d +t O52 $I +^T O51 +$t O51 +t O42 Y1 +t O41 o1y +t O41 $l +$t O41 l +$T O41 +t O32 y4 +t O31 $P +t O31 -4 +t O27 ^S +^T O24 *21 +^t O23 +t O16 o2? +t O13 z2 +^t O13 i1e +t O02 Y4 ^T ^x $t ^X ^t $x t $W Z5 -^t ^w Z1 ^T ^w t $v Z5 ^t $V $t ^v -$t$uOA2 +$t $u OA2 ^T u .7 -^T ^U ^t ^u ] t TB t [ T9 ] t T9 t T8 -3 -t T7 T6 -t T7 t T6 T7 +t T7 $T T6 ] t T6 t T5 $L t T5 ] -t ] T5 -t T4 { t T1 Z1 ^T $T t sZP @@ -42987,17 +36023,13 @@ t sRD t sOZ ^T ^S $M t sLJ $! -t $! sLJ -t sHw Z2 t shW t sG5 t sES t sdm o5. t sCc $T sC1 -t sBV z4 ^T sae -t s9k Z5 t s7z ^T s@6 t s 6 @@ -43005,7 +36037,6 @@ t s 6 $T s4 i8t t ^S .4 t s3# -t s27 y4 t s25 t s1I t s17 @@ -43027,23 +36058,16 @@ $t ^q o8 t $Q $t $q $t q -t ^P z4 -t$PO31 +t $P O31 t $P o1U t $p +6 -tp3OAB -tp3O9B +t p3 OAB t p3 '9 -tp2OA7 -tp2OA4 -tp2O86 -tp2O75 -$t p2 r -tp1O42 -tp1O15 +t p2 OA7 +t p2 OA4 +t p1 O15 t p1 $W t p1 iA_ -t p1 i61 t p1 i5S t p1 i3# t p1 $B @@ -43057,8 +36081,8 @@ $t $p t ^O Y4 t $o p5 t $O i8W -toByO26 -toAKO52 +t oBy O26 +t oAK O52 t oAG t } oAa t o9Z @@ -43078,16 +36102,14 @@ t $O ,7 $& t o7( ^] t o7} t o6s i6f -to6PO82 ^t o6n -t o6E o4O +t o4O o6E ^t o6d ^T o6c ^t o69 [ t o68 ^T o6@ t o5Y -t o5. sdm t o5N $t o5n t o5h Y3 @@ -43102,7 +36124,6 @@ t o52 $C t o5( [ t o5- ^T o4t -t o4O o6E t o4L t o4K p1 t o42 @@ -43119,7 +36140,6 @@ t o36 t o33 ] t o30 t o3# $# -t $# o3# ^t o3@ t o2X ^t o2w @@ -43133,7 +36153,6 @@ t o23 t o22 *73 t o2 -0 t o2_ -to1yO41 t o1X t o1U $P t o1l *04 @@ -43147,15 +36166,13 @@ t $o ^1 t o0O ^T ^o t ^O -^T ^n T0 ^T $n t $n t ^m $1 $T $m t $m t $l Z5 -t$lO41 -$tlO41 +t $l O41 t $L T5 $t l D4 $T l ^C @@ -43169,7 +36186,6 @@ t $k y5 $t k D2 ^t k *87 t K ,8 -t K +5 ^t } ^K ^t K t k { @@ -43177,12 +36193,11 @@ t ^j $9 ^T $j t ^j ^t $i Y2 -t$IO81 -t$IO52 +t $I O81 +t $I O52 t iA. t iA t i9. -$T i8t s4 $t i8r t i8C ^T i7s @@ -43194,7 +36209,6 @@ t i7a $t i73 ^T i7- t i6_ Y3 -t i6R o2A $T i6O ^t i6k t i6C @@ -43208,10 +36222,10 @@ t i5m y5 ^t i5j *37 t i5E *72 t i5C -$Ti56O34 +$T i56 O34 $t i5_ -ti4$O62 -ti4 O0B +t i4$ O62 +t i4 O0B t i4W Y1 $t i4w t i4V i6V @@ -43221,8 +36235,6 @@ t i4m y1 $T i4i t i4I t i4D -t i4 C -^t i46 t i4@ $t i4& $t i4. @@ -43232,41 +36244,29 @@ $t i3w t i2Y t i2T +1 ^t i2s -^T i2F t i2C $T i22 -t i2 t i1z ^t } i1v ^* ^t i1v -^T i1u -^T i1S $t i1s -^t i1b Y1 ^t i18 ^T i10 ^t i1- -^t i0z ^t i0y ^t i0X t i0W ^t i0v -t i0O Y4 -^T i0N -^T i0G t i0d ^5 -t i0a t $I *05 $T $i ^T $i t ^I -$t ^H Z2 t ^h ^C -tfOA5 +t f OA5 t f *A8 t ^F -6 t f -5 -t $E y1 ^t E o7t t ^E D3 t $E ,7 @@ -43275,30 +36275,19 @@ t d $Z t d oBM t d o31 $T $D l -t d i61 t d i60 -t d $B t $D +A t d *92 ^T D9 -t d ^7 t D6 o64 -t d -6 -t D5 d { t D5 -$t D4 l $t D4 i64 t D3 'A t D3 $4 ^T D3 +1 -] t D3 -$t D2 k t D2 i42 [ t D2 -t D1 -] t D0 t ^D -t d t $C Z2 t ^C Y4 t $C o52 @@ -43307,7 +36296,6 @@ t $C ^2 t $c $t c t $b $Z -] TB t TB iB3 TB i77 t $b i72 @@ -43321,7 +36309,7 @@ TB ^0 $! TB ] TB t ^A z3 -t+AO81 +t +A O81 TA o92 p3 TA o50 TA i64 @@ -43338,12 +36326,10 @@ t $a *54 ^@ TA t ] $A ^t 'A -T9Z5OA6 +T9 Z5 OA6 ^T +9 Y1 T9 t T2 ] T9 T8 -T9 T2 t -] T9 t T9 sT- T9 p3 $# T9 oAG @@ -43358,22 +36344,17 @@ T9 $9 t .9 *8B T9 *87 t -9 +8 -T9 *43 k t *93 .4 $t *92 T9 ] ] ^t ,9 ^t ^9 t $8 Z4 -T8 Z1 t T8 Y3 T8 $$ Y1 -}T8O91 -T8}O81 -T8O42+0 -T8O41D4 -T8 t Z1 -] T8 T9 +T8 } O81 +T8 O42 +0 +T8 O41 D4 $* T8 T7 T8 T4 o2P T8 T4 @@ -43384,7 +36365,6 @@ T8 R0 ^1 T8 o78 T8 o74 T8 o48 -T8 o2P T4 T8 o2a T8 o0K T8 iA6 @@ -43393,57 +36373,46 @@ T8 i55 T8 i51 T8 i4t T8 D7 } -T8D4O41 -t *8B .9 +T8 D4 O41 ^T *89 i80 T8 $9 T8 .9 } -t +8 -9 -^t *87 k -T8 *67 T0 T8 $5 T8 ^5 t -8 $5 T8 ^4 TA t *83 *37 t *83 -T8+0O42 T8 $+ T8 $@ T8 ^# $. T8 t ,8 ^t ,8 -T7 z1 y3 T7 z1 t t -7 y4 -T7Y3O62 -T7O81 -T7O32 -T7O13 -T7O03 -T7O02 -^T .7 u -T7 t z1 -T7 t K +T7 Y3 O62 +T7 O81 +T7 O32 +T7 O13 +T7 O03 +T7 O02 +T7 K t T7 T8 o5/ -$* T7 T8 T7 s7& T7 s58 T7 o8! -T7 o5/ T8 T7 o2t T7 o14 T7 [ o0J T7 o05 t ,7 $O T7 $L -T7 K t T7 K ^4 T7 } i93 T7 i7N T7 i21 -T7 } i05 +T7 } ^5 T7 i0@ T7 } ^f t ,7 $E @@ -43451,13 +36420,10 @@ t $7 $A T7 .6 *34 t .7 +6 ] t *76 -T7 } ^5 T7 ^4 K t ,7 *45 T7 $4 $, T7 $4 -t *73 o22 -T7 *34 .6 T7 $3 T7 ^2 ^T -7 *08 @@ -43467,38 +36433,29 @@ T7 ^* $# T7 $. T7 t +7 ] -t ] +7 t ] ,7 -t ,7 ] $t +7 $t } +7 t -6 Z2 T6 Z1 i6_ -t .6 Z1 T6 y5 -T6Y2O51 -T6Y2O23 +T6 Y2 O51 +T6 Y2 O23 T6 Y2 D5 T6 Y2 *B8 t ,6 Y2 T6 y1 i7K -t .6 Y1 -^*T6O75 -T6O51Y2 -T6O42 -T6O23Y2 -T6O15i1T -T6O06 +T6 O51 Y2 +T6 O42 +T6 O23 Y2 +T6 O15 i1T +T6 O06 T6 $u i0n -T6 t T7 -T6 T7 t T6 T3 D5 T6 T2 ] -T6 ] T2 -T6 T1 o0[ +T6 o0[ T1 T6 T0 d T6 T0 +0 -] T6 t T6 slL T6 s0K t +6 $p @@ -43509,9 +36466,7 @@ T6 o5Z T6 o23 T6 o1O T6 o1i -T6 o1A T6 o1& -T6 o0[ T1 T6 o0S T6 o0P T6 o0L @@ -43521,12 +36476,8 @@ T6 i7L T6 i7K y1 T6 i7* T6 i6_ Z1 -T6 i0n $u T6 D5 Y2 -T6 D5 T3 -t +6 +A T6 ,7 -t +6 .7 t *65 *02 t *63 *14 T6 $2 @@ -43544,17 +36495,14 @@ T5 $! Z3 T5 z2 ^4 T5 Z1 T5 Y2 *30 -T5O72$0 -T5O63T0 +T5 O72 $0 +T5 T0 O63 ^T -5 ^V T5 T6 ] -T5 ] T6 T5 T4 T1 -T5 T3 ] T5 ] T3 T5 T2 D7 ] T5 T2 -T5T0O63 T5 T0 T5 ^T T5 ssZ @@ -43564,7 +36512,6 @@ T5 sgd T5 seo o3F T5 sa4 T5 s13 -T5 s1| T5 ^S $$ T5 $r T5 o99 @@ -43575,11 +36522,8 @@ T5 o6P t ^5 o5g T5 o44 T5 o40 -^t .5 o3w -T5 o3F seo T5 o38 $S T5 o2s -t +5 o2k T5 o1i T5 o11 D6 T5 o10 @@ -43596,26 +36540,22 @@ T5 i6_ T5 i5G t ,5 i3B [ T5 i03 -T5fO62 -T5 D7 T2 -T5 D6 o11 -T5 D1 -0 -T5,AO71 +T5 f O62 +T5 -0 D1 +T5 ,A O71 t *59 +0 t *58 -3 t $5 -8 t *57 p1 t +5 *75 t *57 -4 -t*56O21 +t *56 O21 T5 *67 $! T5 $! *67 t -5 *65 t *56 -4 T5 $5 i6. -T5 $5 $& T5 ^5 -T5 $4 o0x t *54 $a ^t *54 ^@ T5 *31 @@ -43625,12 +36565,10 @@ t .5 *21 T5 ^2 t +5 ,2 t *51 *40 -T5$0O72 -T5 -0 D1 +T5 $0 O72 T5 } } T5 ] $) T5 $@ -$) $@ T5 [ T5 ^T ,5 t $5 @@ -43645,14 +36583,10 @@ T4 Y1 $5 T4 t T3 T4 T7 T4 t *50 -T4 T3 t T4 T0 D2 T4 $T -T4 sRW ^z T4 sB3 d -T4 sa4 ] T4 ] sa4 -T4 s6% } T4 } s6% T4 R8 .3 T4 ^Q z4 @@ -43669,10 +36603,10 @@ T4 o0E T4 o0% t -4 ^N T4 ^I Y4 -T4i5 O69 +T4 i5 O69 T4 i5V T4 i5 -T4i4 O46 +T4 i4 O46 T4 i4E T4 i4a t .4 i4$ @@ -43680,24 +36614,16 @@ T4 i2t T4 i27 T4 i2- T4 ^E -T4 d sB3 t $4 D3 -T4 D2 T0 T4 D2 $* T4 $* D2 T4 +A t -4 ^A -t*49O17 +t *49 O17 T4 *97 -t .4 *93 -t*46O53 -t *45 ,7 -t -4 *57 -t -4 *56 -T4 *50 t +t *46 O53 T4 $. -4 T4 -4 $. -T4 .3 R8 T4 $3 *02 ^T *42 [ t *42 @@ -43707,11 +36633,9 @@ T4 +1 t } *41 T4 $0 Z1 t *40 D4 -t *40 *51 T4 *02 $3 -T4 +0 ] -T4 +0 T4 ] +0 +T4 +0 T4 ^0 T4 $# T4 $@ @@ -43720,19 +36644,15 @@ T4 $- T4 $_ $+ T4 } T4 ] -} ] T4 ^T .4 -^@ T4 ] t +4 ^t -4 -T3 Z4 Y5 T3 $. Z1 [ T3 y3 T3 y2 i5w T3 y1 T3 $W *97 T3 ^w -t -3 T8 T3 t *56 T3 T0 T3 ssP @@ -43770,13 +36690,9 @@ T3 *97 T3 $8 T3 [ ^8 t *37 $1 -T3 $7 T3 *69 T3 ^@ -6 -t -3 *58 -T3 *56 t t [ *35 -T3 ,4 D7 T3 ,4 { T3 +4 ^t -3 -3 @@ -43784,7 +36700,6 @@ T3 ^2 } t *31 T3 *02 t *30 +2 -T3 $* T3 ^* ] T3 t $3 $* @@ -43792,16 +36707,12 @@ $t +3 ^t ,3 t ^2 z4 T2 z3 z3 -T2 Z1 ^! T2 z1 T2 ^Z t +2 Y4 T2 Y3 D4 -^t,2O82 -T2[O32 -T2 T5 o6$ -] T2 T5 -T2 T4 $= +T2 [ O32 +T2 o6$ T5 T2 $= T4 T2 T1 K T2 T0 y2 @@ -43812,7 +36723,6 @@ T2 s7^ T2 s4* T2 s29 T2 o7! -T2 o6$ T5 T2 o1K T2 o13 T2 o1% @@ -43821,12 +36731,9 @@ T2 o0g T2 K T1 T2 ^K $@ T2 K -T2 [ k T2 } i7o T2 i4? L4 -T2 i4f T2 i3g T3 -T2 i3% T2 i3= T2 i2J T2 i2. @@ -43840,53 +36747,38 @@ T2 ^9 ^! T2 .6 Y4 T2 .6 +1 $, T2 .6 -t ,2 +5 { $t *25 $t *24 *01 t *23 $1 T2 *30 $1 -t +2 *30 T2 ,3 -T2 +1 .6 -t *21 .5 T2 $1 *30 t $2 *10 t *20 o20 T2 *04 y2 t *20 T2 [ -$! T2 ^T +2 { t +2 T1 $! Z2 -T1 $@ Z1 T1 $_ Z1 -t +1 z1 t +1 Y5 -T1 Y4 t -T1Y3O41 +T1 Y3 O41 T1 Y2 { T1 Y2 t $1 Y2 T1 Y1 T2 T1 Y1 .4 -T1 $# Y1 -$# T1 Y1 -$$ T1 Y1 -$@ T1 Y1 { T1 y1 t ^1 y1 -$T +1 $Y -T1O42{ -T1O41Y3 -T1O41o4$ +T1 O41 Y3 +T1 O41 o4$ t .1 ^W T1 ^u -T1 t Y4 T1 T3 T1 t $3 T1 T2 Y1 -T1 T2 D8 +T1 D8 T2 T1 T2 T1 t ^2 T1 T0 @@ -43915,11 +36807,9 @@ T1 o0R ^X T1 o01 T1 o0% T1 K ^S -T1 k o2u T1 k -2 T1 $% K $& T1 K -[ T1 k T1 i92 T1 i83 T1 i6# @@ -43933,21 +36823,15 @@ T1 i47 T1 i43 T1 i4! T1 i3Q .0 -t +1 i2T T1 i2h T1 i1A [ T1 i0w T1 i0o T1 i03 -T1 D8 T2 -T1 D7 ssC -^T +1 D3 T1 $c -T1+AO21 +T1 +A O21 T1 $a T1 $8 -3 -T1 $8 -T1 .7 o51 T1 *75 K T1 -7 T1 *67 @@ -43956,24 +36840,16 @@ T1 $! *64 T1 *61 Z2 T1 $6 T1 *54 *64 -T1 .4 Y1 -t *14 *63 T1 *46 T1 [ +4 t *14 ] -t *14 t ] *14 -T1 $3 t T1 $3 o6/ -T1 ,3 o4@ T1 -3 $8 t $1 *37 -T1 ^2 t -T1 -2 k t $1 *23 T1 *20 ^* T1 $2 -T1 .0 i3Q t *10 $2 T1 $0 } T1 -0 @@ -43984,21 +36860,19 @@ T1 ^$ ^- { T1 t -1 ^t -1 -T0z4O95 +T0 z4 O95 T0 Y3 o21 T0 y2 i5y T0 Y2 T0 y1 T0 ^X ^D -T0O84 -T0O82*17 -T0O67 -T0O62o13 -T0O61*53 -T0O14 -$%T0O13 +T0 O84 +T0 O82 *17 +T0 O67 +T0 O62 o13 +T0 O61 *53 +T0 O14 T0 ^X -T0 t p1 T0 $T i0U T0 TA Z1 T0 T9 Z2 @@ -44011,15 +36885,10 @@ T0 s9$ *57 T0 s7j T0 s1Q T0 s0N *27 -T0 r { -T0 p4 stT -T0 p1 t T0 o8z $d -T0 o7? T0 o6s -T0 o6G i79 +T0 i79 o6G T0 o5W -T0 o5B T0 o4U T0 o4C [ T0 o4 @@ -44027,75 +36896,51 @@ T0 o3x [ T0 o3K T0 o2h o1v T0 o21 Y3 -t -0 o2 T0 o1W -T0 o1v o2h T0 o1K D2 -T0o13O62 T0 o13 T0 ^N $8 T0 ^N T0 K *85 T0 i86 -T0 i7h T0 i7e -T0 i79 o6G -T0 i7! T0 i68 *48 T0 i5p T0 i4l ,7 T0 i4e D7 T0 i3? -T0 i0U $T T0 i0E ^R T0 ^i T0 $d o8z $@ T0 D9 -T0 D2 o1K T0 ^d } t -0 ^D T0 $A r T0 $A T0 -9 i2@ T0 ,8 $7 -^T *08 -7 T0 +8 +4 T0 $7 ,8 T0 -7 +5 T0 ,7 T0 .6 .7 T0 $6 ^5 -T0 .5 T2 t *05 $I -t +0 *59 -T0 *57 s9$ -T0 +5 -7 T0 ,5 *65 -T0*53O61 -t *04 o1l -T0 +4 +8 T0 *47 ^# T0 $* -4 T0 -4 $* $= T0 +4 } T0 *32 T0 ^3 -^t *02 o3s -T0 *27 s0N -t *02 *65 T0 *24 $? T0 $? *24 -T0 ] ^2 T0 ^2 ] t *02 $@ t $@ *02 $t *02 -^t *01 ssf -T0*17O82 -$t *01 *24 T0 $1 $1 T0 ^1 ^- -^t $0 ,1 T0 $. ^@ T0 ^$ t $0 @@ -44118,10 +36963,8 @@ $* t $. $t $/ $t $? ^t -$! t { $t ] t } -] } t [ } ^t ^t $+ ^t $# @@ -44133,7 +36976,6 @@ $! t ^s $z Z2 ] szZ szZ -sZ$O61 szx szv *76 szv } @@ -44143,10 +36985,8 @@ $_ szs szs sz? o0e $s Z5 -$s Z4 Y5 $S Z3 $A $S Z3 -s.` Z3 $s Z2 o0S ^s Z2 -7 ^s z2 -4 @@ -44154,8 +36994,6 @@ $s Z2 o0S $S Z2 ^s Z1 i80 sz1 c -} $S z1 -^s Z1 s*Z s>Z $$ s*Z @@ -44175,8 +37013,8 @@ syk *45 syj syI c syH o2r -syfY2O43 -syfO43Y2 +syf Y2 O43 +syf O43 Y2 syf i4# sye ^1 sye @@ -44189,7 +37027,7 @@ $s y5 t ^S Y5 o5l s-_ y5 ^s y5 -$sy4O65 +$s y4 O65 $S Y4 D7 $S y4 C $S y4 @@ -44204,7 +37042,6 @@ sy1 i38 ^S Y1 i1C $s y1 $e $s y1 *56 -} $S y1 ^- sy1 sy0 o1i s*Y @@ -44212,7 +37049,6 @@ s$Y $s $Y sy_ $@ $s $y [ -$s [ $y sxX $. sxv sX* t @@ -44221,25 +37057,22 @@ sxq $ sXP $e t sxp sxm -sx[ L6 +4 +sx[ +4 L6 sxj sxc sxb -^SOA1 sx9 $! -$sO65 -^SO54 -sx[ +4 L6 -s .O43 -^sO34 +$s O65 +^S O54 +s . O43 +^s O34 sx3 -^sO24 -^sO15D3 -^sO14O58 -$sO13$c -^sO13 -^SO12i20 -s ,O02 +^s O24 +^s O15 D3 +^s O14 O58 +$s O13 $c +^S O12 i20 +s , O02 sx0 s/X swz $. @@ -44248,9 +37081,7 @@ sw* Y2 *96 swX i6y swx swt ssv -sWS Z4 sws y3 -swS Y1 u swS u Y1 swO o6Y sWL $F @@ -44263,8 +37094,7 @@ sWD i4a sw0 $s $W s w -[ sv_ Z2 -svyY5O62 +svy Y5 O62 svw svV svS snt @@ -44279,15 +37109,14 @@ $- s-V sv* suz sux u D3 -sux D3 u -s,uO25 +s,u O25 sUW suU sUt o2v sus i5c $s u ^S -suoO71 -sumO21 +suo O71 +sum O21 sul o6e su{ L2 suG ^S @@ -44303,14 +37132,11 @@ $S $u stz p1 stz $1 -B stz -sty shd p1 sty p1 shd sty o5p -sTY C sTy C -$s t y5 stx o8. -st/O31*51 +st/ O31 *51 stv -8 s!T ^U stu @@ -44328,16 +37154,16 @@ sTj $. st, i3p sth *52 sth +4 -sTGy5O84 +sTG y5 O84 stf $h D3 stf D3 $h st- ^F std $M D2 std D2 $M -stcO03^V +stc O03 ^V stc $5 st9 +2 -$sT7O14 +$s T7 O14 $! st5 $S t -4 st4 @@ -44349,7 +37175,6 @@ sT1 $L ^S $t st! s+t -s*+ t $! st. ssz T5 ssz -5 @@ -44357,17 +37182,15 @@ ss^ Z1 ssx i3j ^S sxc ssx ,6 -ss.O43 +ss. O43 ssX $1 $> ssX -ssW Y1 E -ssw $M ssW E Y1 +ssw $M ssw ssV u $@ ssv ^s sue -$s ^S u ssu ssT R3 sst ^l ^u @@ -44392,19 +37215,16 @@ ss$ o4h D0 ^s $s o10 ss$ o07 ^s snp -sSn *05 -sSm Y3 sSM i8. ss& $m ssl $8 ^S $s L6 ssl *26 *14 -ssl *14 *26 ssL *07 $* ssL $s skc ssk ,3 -ssjO03 +ssj O03 ssj K i0b ssj i0b K ^S sis +3 @@ -44414,28 +37234,25 @@ ss) i5I ssi ^S sgt ^S sgM -ssfO01r +ssf O01 r ] ssf i64 ssf [ *35 ssf *30 sse ssd y5 -sS* d t ssd s1 ssd $Q -ssdi6eO43 +ssd i6e O43 ssD i5Q ^s $s d $@ ssc p4 -$s scf ^T ssc -5 sSb o46 c ssb i1x -sSb c o46 ^S saS ssa ] ss_ ^a -ss6O51 +ss6 O51 ss. $6 $S s5s sS4 D1 @@ -44455,22 +37272,19 @@ $ ss srz d sRy p4 T0 s-r Y3 Y3 -srxO52 -$.srxO21 +srx O52 srX ^x -srx o0, ,5 srx ,5 o0, srx +5 srw o2u srw *35 srW *32 sru t d -sru d t sru c ] sr* u -srtO81 +srt O81 srt o5v -sR* t K +sR* K t srt i0g srt +2 srq r @@ -44480,12 +37294,10 @@ srn o2a srN E srn *53 srn *24 -srMO01 +srM O01 srm i4j srl o0w -srL ,5 ^. sR. l -sR* K t srk o9. sr+ k .4 srj k @@ -44495,11 +37307,8 @@ sri *26 sri srH y4 -0 srh y1 -srgO53 -srG u +srg O53 sRg t d -srg t -sRg d t srf o3k srf o3f srf $5 @@ -44513,11 +37322,9 @@ srb D3 $$ srb srA ^M ^s R9 -sr8 Z1 sr8 Y2 sr7 sr$ *62 -sr+ .4 k sr4 E sr $4 $S R3 *03 @@ -44525,7 +37332,6 @@ $S R3 *03 sr_ $2 sr1 R1 sr1 D6 c -sr1 c D6 $s R0 sr# $# sr @@ -44534,7 +37340,7 @@ $s r $$ ^s ^r ^$ s/r sqt -sQq o4 -0 +sQq o4 -0 sqe sqB D1 sqb @@ -44545,7 +37351,7 @@ $s $q $s q ^s ^q spz c -spwO21 +spw O21 spw i2g spw spu ^j @@ -44560,7 +37366,6 @@ sPF $X spf i63 spf $b spC o3i c -spC c o3i spC $2 spB c ] spb @@ -44570,7 +37375,7 @@ sp *47 s`| ^P $! soz soy $Y p3 -soyO13 +soy O13 sox slz sow *34 s#o $w @@ -44588,10 +37393,8 @@ soO i8Z soN o3d soM T2 sOM s0G p2 -sOM p2 s0G ] som so| L5 -sok Y3 t sok t Y3 soK *51 soJ o3J @@ -44602,7 +37405,6 @@ sof $Q sof o42 soe oAl soc .6 -so! c $! so! $! c soB *25 D2 soa y3 @@ -44632,7 +37434,6 @@ $s o5m so$ ,5 $s o4 r $S o4l -so *47 ^S o3v $s o3t ^s o3n @@ -44654,12 +37455,9 @@ $S o1f ^S o1d so1 c ^s o11 -^s o10 $s -so0O81t -so0tO81 +so0 O81 t so0 TA $s o0T -$s o0S Z2 ^S o0q y3 so0 o8M $s o0G @@ -44690,7 +37488,7 @@ snv ^2 snT K s/N T5 sN* t ] -sN_ $ sxq +sN_ $ sxq sns i1I snS D4 .3 snR u @@ -44704,15 +37502,12 @@ sn- o2d { snN s/n $n snM +6 -2 -snM -2 +6 snm $2 { snm [ -{ [ snm sNl ^s 'A snL i5d snl *12 snk c -snI Y1 s-n iBe sn* i7. sni -6 @@ -44723,22 +37518,18 @@ snh snf ^x sN. $f q snf *03 -sn, E *78 +sn, *78 E snd ] Y2 snD R1 D3 -snD D3 R1 snd *75 $$ snd $$ *75 sND *13 ^1 snd -sncO12 sNc *54 .1 -sNc .1 *54 snB ^@ -snaO02 +sna O02 snA C *50 sNA -sn, *78 E sn6 Y1 sn *45 sn3 o5p @@ -44751,15 +37542,13 @@ sn0 *64 sn+ ^s ^n smz i4. -sMYO61.1 +sMY O61 .1 smy DB -sMY.1O61 smX o5S smx *65 -smwO01 +[ smw smw sim smW c -[ smw smv o7q smv -B smv +4 p4 @@ -44770,7 +37559,7 @@ smt -7 sMT .5 sm> sa> sms $ -smrO32 +smr O32 smx $c smr smq u @@ -44778,10 +37567,8 @@ smq +2 smp u smp +4 i4 smP *35 -sMP *34 +1 sMP +1 *34 sm. o67 -smo *45 -3 smo -3 *45 s-m o2M smM *13 @@ -44793,18 +37580,13 @@ smK K -4 sMK *86 smK -4 K smK $1 -sMjO32 -sMJ s10 C -smj l $3 sMJ C s10 -smj $3 l +smj l $3 sMJ smh D6 *31 -smh *31 D6 smh *08 smh sMg i1r -sMfO31 [ smf smd o1a smd $5 @@ -44812,17 +37594,15 @@ smd ] smd smc ^g smc -smBO21 +smB O21 smb $* sM9 $u L7 sM9 L7 $u sm8 o30 sM7 sm5 o0S +1 -sm5 +1 o0S sM- .3 sm2 ^u -sM1 sv5 D5 sM1 D5 sv5 sm1 c sm? ,1 @@ -44836,37 +37616,31 @@ slz o5k slz sly o7w sly *63 -sly *36 sl. y2 slx u -sl%O42 -sl/O32^g +sl/ O32 ^g slx slw +1 -slVY3O51 -slVO51Y3 +slV Y3 O51 +slV O51 Y3 slv *07 slu i3y slu -slt *46 slt slS u sl; sp[ slS -slrO61 -slRO51E +slr O61 +slR O51 E slr i5u suP -slREO51 slR c $* -slR $* c slr $2 -slqO43 +slq O43 slq $q *53 slq *53 $q slp $z slP o6# slp -6 -sln R5 ] sln ] R5 slN c slL K @@ -44879,29 +37653,24 @@ sLj ^2 slj -0 slI slh ^@ -$!slgO14 -sLG u sLg u slg K Z2 slg sLF Y4 t slf Y3 Y3 slf y2 -sLF t Y4 slf D5 i5w slF $6 -sleO81 +sle O81 sLE sl! E sle sld Z2 y4 sld y4 Z2 slc $j -slC *51 -slbO91 +slb O91 sLA T2 slA -B -sl! *86 ^S L6 $s ^S L6 sl; +6 @@ -44917,10 +37686,7 @@ sl[ sl. s?! l $s l $! -$s $! l -^s ^l ^. s$/ l -$)sKZO21 sK* z2 ] skz sky $v @@ -44930,7 +37696,6 @@ skw D1 skw *03 skV *42 skv *20 -^S K ^V skv } sKU skt T0 @@ -44947,14 +37712,12 @@ sKL skj ^s skH E skh -sKg p1 -sKg d sk_ ^g sKf $m p1 $s K f -skDO51 +skD O51 skd oB5 -skcO72 +skc O72 sKC ^1 d sKC skc ] @@ -44966,14 +37729,13 @@ sk3 +8 ^S ^K s.k s k -^s $k sjz K ^k sjz ^k K sjy i6t s*j Y2 Y2 sjx Y2 sJW D8 -sJSO42 +sJS O42 sjs ^m sj$ s0O c sjs @@ -44985,17 +37747,14 @@ sjK i5L sjJ sJH o4l y1 sjh } -sJG Z5 sjg y2 +2 sJg -2 sje u d -sje d u sjD R8 sja *12 sj0 s?j $. sj. -^s ^j siz *62 siy E siy $2 @@ -45003,20 +37762,15 @@ siy $2 [ siy six +2 $. six $. +2 -siw *35 -siv $h [ siv [ $h siv *31 -[ siv siv siu o7z +2 -siU l ,7 siU ,7 l -siu +2 o7z siu ] s i u s.I $S -siQO37 +siQ O37 siq *61 sip o2y sio Z1 @@ -45026,21 +37780,19 @@ siO i2. si- o5y .6 si_ o0s siN y3 y3 -siN Y1 c siN c Y1 si! L5 sil *02 sik -siNsNk +siN sNk siI sih $! sig sif -sieO42 -sieO32c +sie O42 +sie O32 c sie T1 sie o4 -siecO32 siE C siE *24 si@ D7 @@ -45049,7 +37801,6 @@ siD siC o1s *12 sic $. siB L7 *30 -siB *30 L7 sia o0m z1 $s iAO sia $D @@ -45067,7 +37818,6 @@ si/ $7 ^s i6z ^s i6y ^S i6P -si- .6 o5y $S i6N *32 ^s i6h $s i6e @@ -45080,12 +37830,11 @@ $S i5M $s i5k $s i5i ^S i5c .8 -si@ +5 *97 $S i53 ^s i51 ^S i5! si@ +5 -si4O03 +si4 O03 ^s i4q $s i4o $s i4n @@ -45105,31 +37854,22 @@ $* si3 si2 *26 si2 *15 ^S i2. -si1O53 -^S i1W +si1 O53 ^s i1w si1 T0 ^S i1L si1 $h si1 E -^S i1D -^S i1C Y1 -^S i1C ^S i1A si1 ^a si1 *35 -^S i1& ] si1 -^s i0Z si0 R4 ^s i0j y1 ^S i0J -^S i0G -^s i0g si *04 ^S i02 p5 s=+ i02 -$s i02 si0 $@ $s i0# si0 @@ -45139,39 +37879,32 @@ si! ] si| s!i $s $i -] si! ^s ^i } -shzO43 -shzO32 +shz O43 +shz O32 shz $8 sh_ ^z sHW u } shW $C shw *70 p5 -shv y5 u -shvO62+4 shv u y5 +shv +4 O62 } shv o3f -shv *52 -shv+4O62 shv *25 shv shu i2f -sht*69O42 +sht *69 O42 shr -shpO02 +shp O02 shp *73 $k shp shn shm o32 *07 sHM +4 -shm *07 o32 -shlO91c -shlcO91 +shl c O91 shk o6_ shk +3 sh i5o -shG Z2 .2 shG .2 Z2 shG $2 shf Y3 +0 @@ -45179,7 +37912,6 @@ shf +0 Y3 $# she shD .5 shd -2 -sh@ .7 sh7 sh4 ^S $h *23 @@ -45210,20 +37942,17 @@ sGk ^a sgk +0 sgk sgf i0* -sgd E $8 sgd $8 E sgd .0 sgd sgb Z2 s5I -sgb s5I Z2 sgb *36 -sg9O32 +sg9 O32 sg9 -sg'*75O02 +sg' *75 O02 $! sg6 c -sg6-7O41 +sg6 -7 O41 sg4 '8 -] sg4 s,G *37 s.@ ^G $- s-G @@ -45235,7 +37964,6 @@ sfv ^$ z3 sfv sfs sfq -sFP i05 $! sfN sfl s!F K @@ -45246,40 +37974,34 @@ sfF ska $@ sfF ^S $F C sfb -sF7 y1 sf5 *50 -sf5 *05 s.F .4 $S ^f ,2 [ sez o51 sez -5 -se& Z3 sez *13 se_ Y4 se_ Y3 -$s $e y1 seY sey -s*EO24$O -se*O13 -^)se.O03 -sewrO53 +s*E O24 $O +se* O13 +sew r O53 sev $n seu r -setdO05 +set d O05 set ^d E set $3 ses y5 c $s E ss$ seS o1F -ses { -seqO21 +seq O21 seQ u seq *71 sep i2v sep $9 -seoO67 -s*E$OO24 +seo O67 +s*E $O O24 seo '9 $n seo *54 [ seo *41 @@ -45287,10 +38009,9 @@ seo ,2 seo ^' seN *53 seM o2k -semdO03 +sem d O03 $= sEm -seJO41 -sejO12 +sej O12 sej ^3 se; i7n sEi *56 @@ -45300,7 +38021,6 @@ $. sei ^s E D7 se_ d [ sep y2 -sec Y1 sec ,3 se@ c $S E $B @@ -45316,7 +38036,7 @@ se- -4 se .4 se3 Z1 se3 y3 -se3O73 +se3 O73 se3 ^r se3 o6! se3 D8 @@ -45329,16 +38049,12 @@ $s E -0 se- .0 $_ se0 sE* -$s E se# s*e [ -} se; [ se` ^s $@ ^e ^s ^e -[ sdy $z sdy t -^\ sd/ y2 sdw +7 sdw sdT -5 @@ -45351,19 +38067,17 @@ sdn y2 sdn E sdm sdl -sdkO23 +sdk O23 sdk r { sDk $Q o3n sDk o3n $Q -sdK E $. sdK $. E sdk sDi +6 .1 -sDi .1 +6 sdH q E $! sdh sdf y5 -sdfO62 +sdf O62 sDf $t *05 sDf *67 sdf *20 @@ -45373,7 +38087,6 @@ sdf sdD Z2 sdc $7 sDa -^s D7 E $S [ D6 $s D6 sd6 @@ -45388,14 +38101,13 @@ sd4 ^S $* D3 ^s D3 $s D2 -sd1 Z1 [ sd1 [ Z1 sd0 scz $! $S C y4 $* scy scx Y2 -$s$cO13 +$s $c O13 scX scv k scT u @@ -45414,34 +38126,27 @@ scP o2N sCp i3a scN s6& scn -sCm Y3 scm k scl *64 sCl -scKO72 +scK O72 scK K sck $e sck *A8 sck +8 ^@ scK scK -scjO58 -scj t k -scj o4g ^d +scj O58 scj k t +scj o4g ^d scJ ^$ ^$ -$s C i4_ sch ^Y sch ^s -$= scg y2 -sCGO31 -scgO12 +sCG O31 +scg O12 scF D7 scF ,2 -^S C $F -sCe *05 sce -$s c D4 scC Y1 sc@ ^A $s c -0 @@ -45453,7 +38158,6 @@ s-c $s $c ^* sby o7w sb@ Y3 *20 -sbX T2 *50 sbX *50 T2 sbw sth sbv D5 @@ -45466,12 +38170,11 @@ sb sBO sbs *25 sbs sb$ R3 E -sbqO63 +sbq O63 sbQ q sbq o7d sbp o2x { sbp { -{ { sbp sbp sbN c sbm Y2 @@ -45479,7 +38182,7 @@ sbm o20 sbm ^M p4 } sbM sbm -sbkO02 +sbk O02 sbJ $! sbj sbh Y1 @@ -45494,13 +38197,9 @@ sbB o6a sb7 k sb7 D1 *08 sb, -6 ,2 -sB3 l ^\ sB3 ^\ l -sb2 *68 -sb, ,2 -6 sb@ *20 Y3 sb! *12 *62 -sb0 z1 $5 sb0 $5 z1 ^s $B sb/ $* @@ -45515,18 +38214,17 @@ say $. saX $P saX i1M sax c -sa&OA2 -^s^AO72 -sa+O62 -sa.O54 +sa& OA2 +^s ^A O72 +sa+ O62 +sa. O54 saX *53 -s^AO21 saW saV -3 sav $_ sa@ ^v sav -sauO61 +sau O61 saU u sau i09 sau $. ^H @@ -45538,21 +38236,18 @@ saT $K sat *57 sat +2 saT *02 -sas u p1 sas p1 u sa@ soO sas o1k { sAs -sarO02 sap +2 $. sap $. +2 -saoO73 +sao O73 sa@ o8$ sa@ o5a sao *57 sa. o0G } saO } -} } saO sao sAn -2 { saN @@ -45569,7 +38264,6 @@ sag *06 $! sag $! *06 saf o0y saf +6 -sAf *02 sAf $+ sae scg sae c @@ -45581,7 +38275,6 @@ sad $y sad d sa_ D6 sa, D2 -saC o5X -3 saC -3 o5X ^@ sac sab $= @@ -45597,7 +38290,7 @@ sa8 sa6 R3 R3 sa@ *65 $s *A6 -sa5O02-7 +sa5 O02 -7 sa4 r sa4 D3 $& sa4 @@ -45606,8 +38299,7 @@ sa *25 sa- *21 sa *21 } sa2 -sa1OA2 -sa1O42 +sa1 OA2 sa1 R6 sa1 $c sa1 -6 @@ -45622,39 +38314,33 @@ $@ s@A sa$ } $! sa. ] s-a -s9. Y2 y2 s9. y2 Y2 -s9.O43 +s9. O43 s9w $W } s9s s9) R9 R9 s9Q Z1 ^A s9q $Q -s9Q ^A Z1 -s9. o4* *50 +s9. *50 o4* s9, o33 D4 s9@ ^M s9m s9] i8[ s9! i24 -s9H z2 s9& $H s9g $i s9d i3b ] s9d ] i3b -s9, D4 o33 s9C $c $c s9@ ^B s9a 'B s97 -2 s97 $! -0 -s97 -0 $! $/ s97 s97 s96 T4 s96 s87 s96 C -s9. *50 o4* s9% *42 s94 *12 s93 o37 @@ -45673,7 +38359,6 @@ s9 s9> s.9 ] ^s +9 -s8@ z5 s8/ Z1 c s8# y5 r s8, y3 y1 @@ -45689,23 +38374,18 @@ s8# r y5 s8R L8 i04 s8- ^o z1 s8O -s8n ] ^A s8n ^A ] s,8 $k s8@ i4@ s8! i2D -s8= i1 $1 +s8= i1 $1 s8h Y1 ^h -s8h ^h Y1 s8G Y5 T1 s8G T1 Y5 s8f s8+ E -s8! D0 -s8/ c Z1 s8c d *20 s8- C -s8b Z1 s8B ^Y s8b o3n t s8A i37 @@ -45725,7 +38405,6 @@ s85 +9 s8 .5 s84 i38 $! s84 -s83 Y5 s83 Y2 s83 +4 s82 @@ -45734,7 +38413,6 @@ s81 o8a s8 *14 s8< *12 $+ s81 -^S *80 u s80 ,9 $S $8 ^S .8 @@ -45745,19 +38423,14 @@ s8 s,8 s 8 $s ^8 -^s ,8 s7* Z2 -{ s7x Y3 s7X i6R -s7 O81o1e +s7 O81 o1e s7w i7u s7W $C s7v ^K s7T ^Z s7R ^C -$@ s7r -{ s7o Y1 -s7 o1eO81 s7! i5E s7g z3 { s7F Y3 @@ -45767,19 +38440,19 @@ s7a i13 $S *79 $s *78 s 7 $7 -s75$ O86 +s75 $ O86 s75 $- s75 $ s73 T4 s73 ,9 s73 -s72O01 +s72 O01 s72 +4 s72 $4 s71 i4j ^D $s *71 s71 -s70O15*86 +s70 O15 *86 s70 $s s70 $S $7 @@ -45796,22 +38469,17 @@ s6. Y3 s6@ Y2 s6x +7 s6x *35 -{ s6V -s@6 ^T s-6 t -{ s6* t s6s i1g s6* r s6q y2 y2 s6Q i53 ^{ s{6 oB9 -s6N *45 s6k -5 s6I y4 s6! i0U s6g $o } s6E Y1 ^a -s6E ^a Y1 s6e .5 ^^ s6c K s6c ^$ @@ -45844,7 +38512,6 @@ s5Z $1 s5x q s5x ^s ,5 ^w -s5- ^s Z1 s5! so0 s5S s5. p3 @@ -45861,21 +38528,18 @@ s5D $! s5C s-5 'B s5A Y1 t -s5A t Y1 -s5ap2O0A +s5a p2 O0A s59 i5p s59 ^4 s58 ^s -[ s57 ^V s57 $. s54 y2 s5% *42 s5/ +4 -^s *54 -s53O61 +s53 O61 } $s *53 s52 c -s51y3O01 +s51 y3 O01 s51 .8 $S *51 s50 +6 @@ -45894,7 +38558,6 @@ s4w $5 s4v Y2 s4. T2 Y4 $S -4 t -^S .4 src s4^ so6 s4/ s0t s4Q @@ -45928,7 +38591,6 @@ $s *46 s4@ *56 s@4 ^5 s43 -1 -s4$ *30 s4 .3 s41 o8@ s4 +1 @@ -45939,11 +38601,9 @@ s4? $! s4- $s -4 $) s4( $( -$) $( s4( [ s4! ^s +4 ^s $4 -^s -4 s3z k s3$ Z2 o82 s3' z1 { @@ -45951,23 +38611,20 @@ s3Z s3- y5 s3. y3 s3x d c -s3=O42 -s*3O14 +s3= O42 +s*3 O14 s3w ^a s3v Z2 s3v y5 s3, $v ^* s3T -s3# t s3s y2 ^S +3 sis -s3s *41 *02 s3s *02 *41 s3$ ^R s3p .3 s3p s3o $k -^s -3 o6a s3- o63 s3N ^P s3m Y2 @@ -45975,8 +38632,6 @@ s3m $r s-3 ^L s3* $l s3 k -^S +3 i82 -s3H Y1 s3h { s3f o0c s3F $M i7L @@ -45985,16 +38640,13 @@ s3e E s3e s3d ^9 s3{ D0 { -s3CO45 s3c i2R s3C ^@ s3# C s3A i7z s3A ^A s!3 +9 -^s ,3 ,9 s39 -s38 T8 s3* $7 s3. $7 s37 @@ -46003,19 +38655,16 @@ s36 K $S *35 *20 $S *35 s34 $l -$S *32 i6N s3% *24 s3? *23 $. s3? $. *23 s32 ] s3! .2 -] s32 s31 c s31 *48 s31 $# -] s31 s30 o42 -s30i4gO21 +s30 i4g O21 s3. *04 s30 *30 $S .3 @@ -46030,7 +38679,6 @@ s2. Z2 s2z s2. y2 s2y $! -s2'O31 ^S +2 ^X s2w z2 s2w $l @@ -46038,24 +38686,19 @@ s2U s2T $s +2 t s2s Y3 Y3 -s2s y1 -s2- s0_ ] s2- ] s0_ s2! ^S s2+ $s s2p $s k s2p k $s s2P ^H -^s -2 o5K s2[ o4d Y2 s2O -2 -} s2o } } } s2o s2N $Z s2m $q s2m p1 s2m $- -s2L .7 s2_ K Y3 s2k $! ] s2j u @@ -46065,8 +38708,7 @@ s2- i3m s2I *24 Z4 [ s2f o3a s2$ E -s2DO41u -s2DuO41 +s2D u O41 s2' D3 s2c i32 Y5 s2C $F @@ -46075,7 +38717,6 @@ s2! c ,3 s2& $c s2B -8 s2B -] s2A s28 s3$ s28 o0S s28 $c @@ -46083,7 +38724,6 @@ s27 y4 ^w s27 s26 $@ s2^ +6 -} s26 s25 K s25 i2l s2@ ,5 @@ -46097,7 +38737,6 @@ s24 +1 s.2 $4 ^S *23 $h s23 ^g -s2! ,3 c s2$ -3 s2@ +3 s2_ $2 @@ -46105,9 +38744,7 @@ s21 y1 ^S *21 R2 s$2 ^1 } s21 -^s *20 D4 s20 +5 -$S *20 *35 $S *20 s2. .0 ^S ,2 @@ -46120,18 +38757,15 @@ $ s2. ^& s2& s1z $o ^. s1z -$.s1YO42 s1Y ^T '8 s1# Y2 -s1x i1h E s1x E i1h s1x D6 -^ s1 O98 +^ s1 O98 s1X $3 -s1@O23 -s1+O05 +s1@ O23 s1v d -s1# u o2P +s1# o2P u s1! u s1$ T3 s1, T2 @@ -46142,20 +38776,17 @@ s1@ $s s1* r s1q $A s1Q $2 -s1p T6 $1 -s1pdO04 -s1? p3 s1p $1 T6 +s1p d O04 +s1? p3 s1p s1o T6 -s1# o2P u s1o +2 s1O ^0 s1n T3 D5 s1n i8_ s1n i6d s1n i3h -s1n D5 T3 $! s1m i94 s1m i6f s1L y1 @@ -46185,7 +38816,7 @@ s18 o3@ s18 *45 s1$ $8 } s18 -s17O31 +s17 O31 s1? ,7 p4 ^s *17 K s17 *34 @@ -46201,10 +38832,8 @@ s15 *51 s1. *51 s1+ .5 $$ s15 -$s*14O27 -s1.,4O13 -s14O03 -s14 l +$s *14 O27 +s1. ,4 O13 s14 C $s *14 $/ s14 @@ -46213,11 +38842,9 @@ s13 $R s13 K s13 ^C s12 $! Z2 -^s *12 t s1@ *20 s1* .2 s10 i83 -s1- *03 s1+ s1@ s1. } @@ -46235,7 +38862,6 @@ s0Z y2 y2 s0z i4w i5w s0. Z1 ,3 s0$ Z1 ^$ -s0$ ^$ Z1 s0. $z s0% Y3 R6 s0- Y2 D8 @@ -46247,10 +38873,9 @@ s0w $@ s0u s0T y1 +1 s0s i4@ -s0% r d +s0% d r s0r $7 s0r *34 ,1 -s0r ,1 *34 s0r s0p Z2 s0 $? p3 @@ -46264,25 +38889,20 @@ s0o +1 s0_ o0w s0@ o0t p4 s0N $Z -s0N $n l s0N l $n s0L o5b o0h -s0L o0h o5b s0- $l s0k $P -s0@ k [ s0* k s0J o4T s0I s0h ^j s0H $h -s0f *13 s0e Z1 $s -0 E -s0% d r s0) D8 s0. D7 -s0CO45 +s0C O45 s0C ^B s0# C s0* c @@ -46291,19 +38911,17 @@ s0B r i31 s0B *89 s0b s0A o3P l -s0a l s0A ^a s0a *36 s0^ +A s0a s09 Y2 $! -s09O86 +s09 O86 s09 o0S s0@ *86 s0_ -7 s07 s06 u -} s06 ^s *06 s05 ^j s0. *58 @@ -46314,7 +38932,7 @@ s0 $4 s04 s0. ,3 Z1 s03 K -s01^NO42 +s01 ^N O42 s01 } L0 s01 ^@ $ $s *01 @@ -46403,31 +39021,23 @@ $R Z2 r $# Z2 r ^# z2 ^r z2 } -^R Z1 Y4 $r z1 y2 r z1 $r r z1 i1n r Z1 .8 $R z1 *45 r Z1 *37 -r Z1 *19 ^R z1 -r $ Z1 -r Z1 -r z1 } ^R ^Z ^R ^Z ^r ^z -ry5O93 -ry5O67 -r y5 c +r y5 O67 r y5 *84 r { Y5 $r Y4 oAd r y4 i92 r Y4 [ r [ Y4 -r Y4 r Y3 Y3 ^R y3 u r Y3 t @@ -46436,9 +39046,7 @@ r Y3 $l r y2 y2 ^r Y2 i0u r Y2 *92 -r y2 *32 r Y2 ,3 -r y2 *23 ^R Y1 i7r r Y1 i52 r y1 i49 @@ -46447,61 +39055,46 @@ r Y1 *47 r Y1 ,2 ^@ r Y1 ^, r Y1 -$ROA2u -$rO93$R -rO74$y -rO72r -rO72 +$R u OA2 +$r O93 $R +r O74 $y +r O72 r +r O72 r ^x -7 -$rO63 -$rO62 -rO61$s -rO61+4 -rO61^@ -^rO61 -rO53+0 -rO52+3 -$rO51l -rO51] -r]O51 -$rO51 -^RO42 -rO41y4 -$rO37$g -rO28u -$rO25^L -rO25 -rO24r -^.rO21 -rO14r -^RO13 -rO12p1 -^RO12o89 -rO05p4 -$rO03$l -$RO02y2 +$r O63 +$r O62 +r O61 $s +r O61 +4 +r O61 ^@ +r O53 +0 +r O52 +3 +$r O51 l +^R O42 +r O41 y4 +$r O37 $g +r O28 u +$r O25 ^L +r O25 +r O24 r +^. r O21 +r O14 r +^R O13 +^R O12 o89 +r O05 p4 +$r O03 $l +$R O02 y2 $r $x $R $w E r $w +6 $r $v ^8 r $v -5 -^R u y3 -$RuOA2 -ruO28 r ^U sUT $R u r -$r u r r u p1 ^R u -1 -] $R u -r u $r $u ^r u $! -^r $! u -^r t Z4 -r t Y3 r t $9 -} r T8 $$ $r T5 r t *20 r T2 { @@ -46509,7 +39102,7 @@ $r T2 r T1 $R t ^R $t -r$sO61 +r $s O61 $r stx ^r ssq $r sry @@ -46525,31 +39118,23 @@ r s2z r s1t $R $S $r ^s -r $r z1 -$r$RO93 -$R r u -$r r u +$r $R O93 $R r o4z r ^r i2m r R4 R4 r R3 R3 r R0 ^R $R -$r } $R $r q z1 -$r q y1 -r ^? q -r ^q -r^pO71 -^Rp5O02 +r ^p O71 +^R p5 O02 r ^p *56 r $p -5 -rp4O0A -rp3O0A -rp3O08 -rp3O04 +r p4 O0A +r p3 O0A +r p3 O08 +r p3 O04 r p3 *B9 -r p1 u ^r p1 o0J r ^P $r $P @@ -46604,7 +39189,6 @@ r o4C f r o4* r o4$ ^R o3Y -r o3. o7y r o3C r o37 r o30 l @@ -46612,7 +39196,6 @@ r o3! r o3 ^r o2r ^R o2P i4T -r o2m o7! ^r o2j ^r o2g r o2f @@ -46625,7 +39208,6 @@ r o1m r o1e r o16 $R o10 -$r o0Z Z5 r o0M $r o0H ^Z r o0G p4 @@ -46635,14 +39217,11 @@ $r o0b y1 r o0$ ^% ^r ^O $r $o -^r ^n Z2 $R ^M c r $m *21 $r $M $r ^m -$rlO51 -$r$lO03 -r l o30 +$r $l O03 $r L7 *63 r L6 } r L4 ^f @@ -46651,12 +39230,10 @@ r L2 i4m ^R $l $r $l ^r $l -r ^k z1 r ^K y1 $R $K t ^R K o4c r K k -r k K $r K i5a r k i4/ $r K i3n @@ -46670,7 +39247,7 @@ $R ^K $r K [ r K [ $r K -r ^k +$k r $r k ^r ^k $r iAB @@ -46699,18 +39276,15 @@ $r i5a r i57 r i55 r i52 Y1 -ri51O63 +r i51 O63 r i51 $s ^r i4z ^r i4w -^R i4T o2P ^r i4t $R i4S c ^R i4p r i4n -r i4m L2 ^r i4l -r i4/ k r i4& D9 r i4d r i4B @@ -46720,7 +39294,7 @@ r i4_ r i3v ^R i3t o4t r i3q -ri3nO63 +r i3n O63 $r i3n K r i3h r i3e @@ -46737,45 +39311,37 @@ r i25 *62 $r i24 r i22 r i20 -0 -^r i1w r i1m z3 ^R i1c r i1C r i15 r i11 -^r i0u Y2 ^R i0. ^M ^r i0K -^R i0G +^R ^G r i0c ^s -^R i0C K r ^_ i0c r i01 *35 $R $i ^r ^i r ^H r ^h -$r$gO37 +$r $g O37 r $g ^b r $g ^1 -^R ^G r ^g -rfO96 -rfO59 -rfO53 +r f O96 +r f O59 +r f O53 r f ^x -r f sAQ r ^f $r $f -$R E $w ^r E +7 r ^E $r E $! -$r $! E r ^D y3 -r^dO53 +r ^d O53 r d $x -r $d o0. $\ r D8 r D7 r r D7 ^n @@ -46788,7 +39354,6 @@ r D6 -5 r D6 *46 r D5 D6 r D5 ] -r ] D5 r D4 p1 r D3 p2 r D3 i01 @@ -46803,7 +39368,6 @@ $R $d $R ^d ^R ^d r c T6 -r C r r $C ^B r c $6 $R ^c @@ -46811,26 +39375,23 @@ r ^C $r $C $r ^C r { c -r ^! c -RBOA1 -RBO91R9 -RBO54R7 +RB OA1 +RB O91 R9 +RB O54 R7 r $b t RB oAA RB D5 c r ^b d -RB c D5 RB $@ r ^b { [ r ^b RA z1 $X RA Z1 RA y1 c -RA $X z1 RA u -A ^r 'A ^u -RARAO73 -RARAO04 +RA RA O73 +RA RA O04 RA RA l $* RA RA RA R9 ,8 @@ -46839,7 +39400,6 @@ RA l RA RA iA3 RA i6s RA -A u -RA ,8 R9 r 'A -7 RA *69 r *A6 *79 @@ -46855,30 +39415,24 @@ R9 Z2 D2 r $9 Z1 r '9 ^u R9 T4 T0 -R9 T0 T4 -r $9 t R9 ^S o1e R9 p2 ,A -R9 D7 *56 +R9 *56 D7 R9 D2 Z2 R9 *81 r *97 -R9 *56 D7 $= R9 ^$ R9 -r .8 Z1 R8 Y1 { R8 Y1 -^%R8O53 -R8O01R7 -R8R8O52 -R8 R8 [ +^% R8 O53 +R8 R8 O52 R8 o7z $) R8 i8( R8 i4t R8 C +6 R8 *78 -^r*86O61 +^r *86 O61 R8 +6 C ^ r *85 r *84 *62 @@ -46892,19 +39446,15 @@ $r ^8 } ^r '8 R7 Z1 ^u R7 $@ Y1 -R7O82sfG -R7O43 -R7O25d -R7O15q -R7 ^u Z1 -R7 t '8 +R7 O82 sfG +R7 O43 +R7 O25 d +R7 O15 q +R7 '8 t R7 t -R7sfGO82 R7 s2s r '7 ^q -^r +7 o5j R7 o5a -R7 o4P ] R7 ] o4P R7 o2a R7 o18 @@ -46913,20 +39463,15 @@ R7 i7B R7 i72 R7 i3# ^r +7 E -R7 c $$ R7 $$ c -r -7 'A -r *79 *A6 r *79 *53 R7 $9 -R7 '8 t R7 ,8 K r *76 *79 r *76 *41 r *75 +3 R7 -4 -4 R7 $4 -r *72 sev ^. r *72 R7 $1 R7 *04 @@ -46938,23 +39483,19 @@ $r $7 ^r .7 R6 Z5 u R6 Y4 -R6 y2 t -R6O42 -R6O32.3 -R6O05 -r +6 $w -R6 u Z5 R6 t y2 +R6 O42 +R6 O32 .3 +R6 O05 +r +6 $w R6 t o5y R6 t .5 -R6 t [ R6 s7b t R6 s40 -R6 s0# o7& +R6 o7& s0# R6 } ^S R6 r o3/ R6 R7 -R6 o7& s0# R6 o78 R6 o4y d R6 o4v @@ -46967,105 +39508,79 @@ R6 i4[ R6 i3. ^8 r $6 f r '6 d -r $6 c r *68 -1 R6 '8 r *67 r -R6 +7 r *67 ^r *67 -R6 .5 t r *65 +2 -$r *63 L7 r } *63 r *62 K -r *62 *84 r '6 .1 R6 *02 R6 $$ $! [ R6 { R6 $r $6 -R5 z3 t -R5Z2O41 -R5 y5 y5 -R5Y2O02 -R5O41Z2 -R5O41 -R5O02Y2 -r -5 $v R5 t z3 +R5 Z2 O41 +R5 y5 y5 +R5 Y2 O02 +R5 O41 Z2 +R5 O41 +R5 O02 Y2 +r -5 $v R5 su1 R5 R6 R0 -R5 R6 *75 -R5 R5 Z1 +R5 *75 R6 R5 R5 Y1 -R5 R5 ] R5 ] R5 R5 R4 o0f R5 R4 *13 -R5 R3 *48 +R5 *48 R3 R5 R2 k -R5 R0 R6 r -5 $p R5 o6S R5 o6n R5 [ o5l -R5o34O02 +R5 o34 O02 R5 o28 R5 o23 R5 o2& R5 o0m R5 o0k y2 -R5 o0f R4 R5 o03 *51 -R5 k R2 R5 i6b R5 [ i64 R5 i53 R5 i40 *26 R5 d T0 -r -5 D6 -R5 D4 R4 R5 D3 -r*59O53 -r *57 *84 -R5 *75 R6 +r *59 O53 r *57 -0 R5 '6 -R5 +5 +2 -R5 *51 o03 -R5 *48 R3 +R5 +2 +5 R5 *46 *35 -] R5 *41 R5 ] .4 R5 .4 ] r *54 -r *53 *79 -R5 *35 *46 R5 *35 .0 -r *53 *24 R5 ^3 -R5 +2 +5 -R5 *13 R4 -R5 .0 *35 R5 ^0 r *50 { ^r .5 ^r -5 ^! -R4Z2O54 +R4 Z2 O54 r $4 Z2 R4 Z1 .2 R4 y2 k -r+4O61 -R4O54Z2 +R4 O54 Z2 R4 ^V *31 R4 ss2 p4 R4 siO c R4 scm R4 s58 [ R4 R4 -R4 p4 ss2 R4 p4 $3 R4 o8A R4 o6t @@ -47081,7 +39596,6 @@ R4 o13 R4 o0A R4 o08 R4 $n [ -R4 [ $n R4 k ^G R4 i6W R4 i6/ @@ -47096,17 +39610,13 @@ R4 C $r *49 r *48 $k R4 *85 r -r -4 +8 R4 -7 r *46 Y5 R4 ,5 i53 $R *45 *43 -R4 .2 Z1 r } *42 -r *41 *76 R4 *16 .6 ^. r *41 -R4 +0 i51 $r } *40 R4 $# $@ R4 @@ -47117,13 +39627,10 @@ R3 Z4 Z4 R3 Z2 o28 R3 y4 r ,3 Y2 -r+3O52 -R3 t *21 +R3 *21 t { R3 t -r $3 sl4 R3 si3 R3 ^S -R3 R5 R3 R4 { R3 R3 R3 R2 @@ -47131,7 +39638,6 @@ r .3 r R3 ^q R3 p5 o7? R3 o7v -r ,3 o5f R3 o4! R3 o2g ^@ R3 o28 Z2 @@ -47152,34 +39658,27 @@ R3 E .4 r +3 $A $. R3 *83 r *37 Z1 -r +3 *75 r *36 Z1 R3 +6 ,4 R3 *54 +0 -R3 $5 [ R3 [ $5 -r *35 R3 .4 E -R3 ,4 +6 ] R3 *46 r *34 *05 $r *34 ^r *32 ^g -R3 *21 t r *31 $A { R3 +1 -R3 +0 *54 R3 { $! $. R3 r +3 $! r $! +3 r ,2 Y1 r -2 y1 -R2O02 +R2 O02 R2 ^T R2 t ] R2 r d -R2 R2 y2 R2 p5 Y2 R2 p1 c R2 $o o6Z @@ -47191,7 +39690,7 @@ R2 o3* R2 o1f R2 o0V R2 o0R *37 -R2^nO51 +R2 ^n O51 R2 L5 p1 R2 K o3h R2 K +0 @@ -47205,15 +39704,9 @@ R2 i24 R2 i21 R2 i1z R2 i0D -R2 d r R2 D5 R2 *97 -r +2 *65 -r *24 *53 -R2 *37 o0R r *21 $m -R2 *10 i3z -r *20 t R2 +0 K R2 { $R $2 @@ -47226,13 +39719,10 @@ R1 z1 R1 Y4 Y4 R1 y2 ^R -1 u -^r .1 s1t R1 o6n k -R1 o55 l +R1 l o55 R1 o4h y3 R1 o2P -R1 l o55 -R1 k o6n R1 K R1 i4l R1 i3R @@ -47242,11 +39732,7 @@ R1 i25 R1 i1k R1 C z2 r } *19 -r *17 o4g -r -1 *68 -r .1 '6 } r *16 -r *14 o7t R1 *26 R1 ,2 R1 *15 y3 @@ -47263,49 +39749,37 @@ R0 y4 R0 Y2 ^& R0 ^& Y2 R0 { y2 -R0^@O53 -r+0O53 -R0O51o3s -R0O45i6N +R0 ^@ O53 +R0 O51 o3s +R0 O45 i6N R0 T1 -R0 sea { R0 { sea R0 sb; R0 R1 -^r +0 o8t R0 o7y R0 o50 R0 o4Y -R0o3sO51 -R0 o2l o1t R0 o1t o2l -R0 o1t .4 +R0 .4 o1t R0 k ^M R0 ^J R0 i4J { R0 i3- -r -0 i20 R0 i1j R0 i17 R0 ^F R0 E r R0 D5 R0 ^c -R0 'A *05 +R0 *05 'A [ $R *09 -r *08 } R0 { *75 r *07 .0 -r -0 *57 -r *05 *34 -R0 .4 o1t $% R0 -3 R0 *21 R0 .2 ,1 r *02 *07 R0 *16 -R0 ,1 .2 -R0 *05 'A R0 $? R0 ^@ R0 ^! @@ -47324,23 +39798,16 @@ $. ^R r $. ^+ r $- r { $, -r ^@ r ^. -$\ [ r -$$ [ r -$$ r { r $? { $r { { r ] $r -[ $\ r -[ $$ r ^r ^@ ^@ r ^- ^r ^ r -qz5O76 -$QZ5O07 +$Q Z5 O07 $q Z4 u ^Q z4 q Z3 y1 @@ -47349,7 +39816,7 @@ $q Z2 r $q Z2 *32 $Q Z2 } ^. ^q z2 -qZ1O12 +q Z1 O12 $q Z1 u $q Z1 *51 q ^Z @@ -47359,108 +39826,90 @@ $q $z $q ^y p5 ^Q Y5 s8q q Y5 -^qy4O71 +^q y4 O71 q Y4 $O $Q y4 i52 -q y4 *65 -q y4 *56 $Q y4 -qy3O74 -qy3O65 +q y3 O74 $q Y3 ^q Y3 ] $q y2 y4 ^q y2 +2 $Q y2 -0 -q y2 $. -q $. y2 ^q y2 -q y1 Z3 -qY1O15 -$qY1O06 +q Y1 O15 +$q Y1 O06 ^q y1 K $q Y1 i7Q $Q Y1 D1 ^Q y1 'B $q Y1 *43 ] q Y1 -$_ $q y1 ^q ^y -qOB8c -qOB3O06 -qOA1o9o -qO95D4 -qO93OA2 -qO82E -$QO81 -qO75*24 -qO72*86 -qO68o4y -qO67 -qO65O01 -qO64sKm -qO63*62 -^qO61*02 -qO58$l -$qO52 -^qO51o7h -qO4Bi1m -qO4B*05 -qO49^# -qO46*85 -qO46-7 -qO46*20 -qO45$U -$@qO45 -q[O42 -qO38*31 -qO36,2 -$qO34 -qO32$1 -$qO32 -^qO32 -qO31t -qO31l -qO31*57 -qO28*31 -qO26se, -qO25i0s -qO24*30 -qO21T0 -qO18*20 -qO15Y1 -qO15o2# -$qO15K -$QO14 -qO14 -qO12Z1 -qO09i34 -$QO07Z5 -$qO06Y1 -$qO05 +q OB8 c +q OB3 O06 +q OA1 o9o +q O95 D4 +q O93 OA2 +q O82 E +$Q O81 +q O75 *24 +q O72 *86 +q o4y O68 +q O67 +q O65 O01 +q O64 sKm +q O63 *62 +^q O61 *02 +q O58 $l +$q O52 +^q O51 o7h +q O4B i1m +q O4B *05 +q O49 ^# +q O46 *85 +q O46 -7 +q O46 *20 +q $U O45 +$@ q O45 +q [ O42 +q O38 *31 +q O36 ,2 +$q O34 +q O32 $1 +$q O32 +^q O32 +q t O31 +q O31 l +q O31 *57 +q O28 *31 +q se, O26 +q O25 i0s +q O24 *30 +q T0 O21 +q O18 *20 +q O15 Y1 +q O15 o2# +$q O15 K +$Q O14 +q O14 +q O09 i34 +$Q O07 Z5 +$q O06 Y1 +$q O05 ^Q ^X q $x $q $x ^q ^w L3 -$q u Z4 -$q u Z1 -q$UO45 $Q $U ^Q u -qtO31 q TA -qT0O21 $q $T $q ^t ^q $t $q smy -qsKmO64 -qse,O26 -^Q s8q Y5 $q s82 [ -$q [ s82 q s6b -q s3w $. q $. s3w q s2 *42 ^Q ^S @@ -47476,18 +39925,15 @@ q q $q $Q $q *51 $Q $P $Q oA1 o4b -qo9oOA1 ^q o95 $q o8Q -qo8AO08 +q o8A O08 q o6. i07 $q o5z ^q o5s i1w -qo5gO14 +q o5g O14 ^q o59 z1 -qo4yO68 q o4T -$Q o4b oA1 $q o47 $q o45 $; q o3X @@ -47498,7 +39944,6 @@ q o1z ^Q o1U ^q o1i q o0P 'A -q o0c o2f q o0A $a $q $o q ^M $1 @@ -47506,22 +39951,18 @@ $q ^M ^q ^M $q ^m $Q $l Z1 -q$lO58 -qlO31 q l o7D -q l D3 $q L8 $q L4 Z3 ^q L0 z1 -^q k Y4 ^q K y1 -$qKO15 +$q K O15 ^q K *20 $q k q ^J $9 q iB2 $Q i9q -qi9AOA4 +q i9A OA4 $q i7Q Y1 $Q i6z ^q i6y @@ -47543,7 +39984,6 @@ $q i3c $q i2h $q i2g ^q i1n -$Q i16 ^q i0n ^q i0m *35 q i0h i1H @@ -47552,38 +39992,33 @@ q $i q ^H $h ^Q ^G $q ^g -^QfO31 +^Q f O31 ^q f *25 q ^F ^q ^f -qEO82 ^q ^e i88 $Q E -8 $q $e $q ^e q DB -qDAO23 -q D8 D0 +q DA O23 +q D0 D8 q D8 *24 q D7 q D6 D3 q D5 *45 { $q D5 q D4 o75 -q D3 l ^q D3 i02 -q D3 D6 q D2 -A $Q D1 Y1 -q D0 D8 q D0 D3 ^Q ^D $q $d -qcOB8 q $C $c -q c *82 +q *82 c q c ] -q*B8O08 +q *B8 O08 ^q *B5 *68 ^q *B3 q *B2 *81 @@ -47591,35 +40026,27 @@ q *B0 -9 q *B0 *38 $Q $B q $b -q 'A o0P -q $a o0A $Q ^A c -$q *A5 *86 -q'9O21 -q -9 *B0 -q*9AO18 +$q *86 *A5 +q '9 O21 +q *9A O18 q *97 *31 -q *92 *65 +q *65 *92 $Q $9 q $9 $Q -8 E -$q *86 *A5 $Q *86 q *85 -q *82 c -q *81 *B2 $Q $8 $q $8 $q ,8 -q+7O23 +q +7 O23 [ ^q *74 q *71 o1a ^- $q *70 ^Q ,7 -^q *68 *B5 ^q *65 ^q ^Q *65 i0Q -q *65 *92 ^q *61 $Q ,6 $Q -6 @@ -47633,43 +40060,32 @@ $Q *51 $q q $5 q ^5 ^Q *47 y1 -q*47O15 +q *47 O15 ^q *46 $q *43 Y1 -q *42 s2 $q *40 $# $q $# *40 $Q +4 q $4 $q -4 ^q $4 -q *38 *B0 -q*37O01 +q *37 O01 ^q *37 -q *35 f $q *32 Z2 -q *31 *97 $Q +3 $q .3 $q ,3 ^q $3 ^q ^3 -q,2O36 -q -2 i4. ^q +2 i2w -q*24O75 -q *24 D8 -q*20O46 ^q *20 K ^q *20 $q ,2 -q$1O32 -q*16O14 +q *16 O14 $q *15 i5p ^q *13 q $1 $* q *09 -^q*02O61 $q +0 $q -0 $Q $? @@ -47690,15 +40106,12 @@ $. q ^+ q ^@ $q ^@ ^q -] ^P z5 -^P z5 ] ^P ] z5 ^p Z3 Z3 $p z2 +1 $p Z2 [ -$p [ Z2 ^p z2 -$pZ1O62 +$p Z1 O62 $P z1 ^k ^P ^z ^p $z @@ -47710,7 +40123,6 @@ $p Y4 $p y2 $p ^P Y2 ^C ^p y2 *63 -^p y2 *36 ^P Y2 ] ^P y2 $p Y2 @@ -47720,23 +40132,22 @@ $P Y1 ^P $y $p $y ^p $y -$POB2u -$pO91 -$pO62Z1 -^PO53o2G -$pO43 -$pO42 -^PO24o44 -$pO23 -$pO21 -^PO08 +$P OB2 u +$p O91 +$p O62 Z1 +^P O53 o2G +$p O43 +$p O42 +^P O24 o44 +$p O23 +$p O21 +^P O08 ^P ^w t $P $W ^P $W ^P ^W $p $w $p $v -$PuOB2 ^P u r $P ^U $P ^u @@ -47749,20 +40160,16 @@ $P $T ^P $t ^p stq $p spt *21 -$P saX ^p $s *28 -^P r u ^P r i2H $P r ^H $p R4 *30 $P ^r +1 ^P ^R $p ^R -$p r ] ^p r $P $Q *41 ^P ^Q -$p $p y2 ^p p4 $Q ^p p4 i5v ^p p3 i6p @@ -47777,13 +40184,12 @@ $p o7w ^p o55 ^p o52 ^p o5` -^Po4vO12 +^P o4v O12 ^p o4G $p o4b ^P o3V $p o3p ^P o2n c -^Po2GO53 ^P o2@ $p o2& { ^P o1G @@ -47795,7 +40201,6 @@ $p o15 $p o13 ^p o13 ^p o1. -$p o0m { $p o0m ^p ^N ^d $p ^N @@ -47815,7 +40220,7 @@ $P $k ^P ^J $5 $p ^J $1 ^p $j -$p^iO12 +$p ^i O12 ^p i88 $P i7o ^p i72 i7p @@ -47838,33 +40243,21 @@ $P i4p ^P i2Z $p i2z $p i2x -^P i1V $P i1g c -^P i1G $p i1d -^P i0X -^P i0V -^p i0u ^p i0j ] -^p ] i0j ^p i0i $p ^G ^p ^g ^P ^F -^P E o7# ^P ^E $P $e ^p d C -^p D8 t $P D7 $L $p D7 $P $d $p ^D $p $d -^P ^C Y2 -^P c o2n -^p c o14 -$P c i1g ^p ^C ^p $c ^p ^c @@ -47886,39 +40279,33 @@ $p .7 $y $P .6 *40 $p $6 p5 Z3 ^a -p5 y2 slx +p5 slx y2 p5 y2 sa, -p5 y2 $m -p5OA8o99 -p5O13 -p5O0A*76 +p5 $m y2 +p5 OA8 o99 +p5 O13 +p5 O0A *76 p5 ^w -4 p5 $v *30 p5 swp i9m -p5 slx y2 -p5 sa, y2 p5 $S *A7 p5 ^P *46 p5 ^O o1o p5 oBx -p5o99OA8 -p5 o6U o4G +p5 o4G o6U p5 o5t $4 p5 o4. ^i -p5 o4G o6U $& p5 o2y p5 o2b *60 p5 o1s *73 p5 o0y +5 p5 o0g ^e -p5 $m y2 p5 ^i ^B -p5i9WOAB -p5 i9m swp +p5 i9W OAB p5 i7l $2 p5 i6a *06 -p5 i5 $v -p5 i54 $e +p5 i5 $v +p5 $e i54 p5 i42 C $_ p5 i3d p5 i1t u @@ -47926,33 +40313,20 @@ p5 i1B ^9 p5 i0p D2 p5 $H $1 } p5 $g -p5 $e i54 p5 ^D +5 -p5 C i42 p5 $a Z4 -p5 ^a Z3 -p5 *A7 $S p5 *A7 p5 } *A7 -p5 *96 } p5 ^! +9 p5 '8 Y5 -p5 { *7A -p5 *74 *02 -p5 *73 o1s +p5 *02 *74 p5 +6 i5 p5 *6B *34 -p5 *60 o2b -p5 +5 o0y -p5 $4 o5t -p5 *34 *6B $p *53 *27 -p5 *30 $v $p *53 p5 $2 i7l p5 *24 [ p5 $ ^1 -p5 *02 *74 p5 ^] ^[ } ^p -5 [ p5 @@ -47960,55 +40334,46 @@ p4 $\ Z4 p4 Z2 -4 p4 $% Z2 p4 z1 { -p4 { z1 p4 Y3 p4 Y2 i6f p4 Y1 $K p4 y1 i1_ -p4 y1 { -p4 { y1 -]p4O7B -p4O71i18 -p4O45'A -p4O34O8A -p4O08O48 -p4O05$v -p4$vO05 +] p4 O7B +p4 O71 i18 +p4 O45 'A +p4 O34 O8A +p4 O08 O48 +p4 O05 $v +p4 $v O05 p4 ^v o6y p4 $u ^P p4 T5 o4W -$@ p4 ssc p4 sov *46 p4 s n p4 s5a p4 r $z $- p4 $r -p4 $q D0 +p4 $q [ p4 $q [ p4 ] $q -p4 [ $q p4 o95 o0T p4 o8u $1 $\ p4 o8q -p4 o8. ,6 +p4 ,6 o8. p4 o7T E p4 o7G $3 -p4 o7c *63 +p4 *63 o7c p4 o6o u p4 o6b *02 -p4 o6 $6 +p4 o6 $6 p4 o5 'B -p4 o4W T5 p4 o4m y2 -p4o4iO31 -p4 o2r $@ +p4 o4i O31 p4 $@ o2r p4 o1c .6 p4 o1% C -p4 o0T o95 -p4 o0E ,5 +p4 ,5 o0E p4 $m ^a -^P ,4 l p4 $J Z2 p4 ^j } p4 i9# D6 @@ -48026,273 +40391,190 @@ p4 E i6F p4 ^e +4 p4 E { p4 D7 i5U -p4 D7 ,3 -p4 D0 $q +p4 ,3 D7 p4 $D -p4 C o1% -p4 'B o5 p4 'B p4 'A ^s { p4 ^a } p4 '9 [ p4 '8 -p4 ,6 o8. -p4 .6 o1c p4 .6 i71 -p4 *63 o7c -p4 ,5 o0E p4 ,5 p4 -4 Z2 -p4 *46 sov -p4 $3 o7G -p4 ,3 D7 p4 -2 *B2 $P *41 $Q -p4 $1 o8u p4 *13 y5 ^p ,4 ,1 -p4 $0 i5y -$P *40 .6 -p4 *02 o6b ^P -4 $* p4 $^ p3 $Z [ -p3 [ $Z p3 y3 $a p3 $y -3 -p3Y2O8A +p3 Y2 O8A p3 y2 s83 -p3Y1O09 -p3OBAsNA -p3OB4o8= -p3OB1] -p3]OB1 -p3OABs40 -p3O92O03 -p3O91$6 -p3O8AY2 -p3O83*02 -p3O81O41 -p3O7Bt -p3O78u -]p3O76 -p3O72-2 -p3O62o6/ -p3O5BO76 -p3O5Bt -p3O14 -p3O09Y1 -p3O09^a -p3O08sdl -p3O07] -p3]O07 -p3O01$m -p3O01*BA +p3 OBA sNA +p3 OB4 o8= +p3 ] DB +p3 s40 OAB +p3 O92 O03 +p3 O91 $6 +p3 O83 *02 +p3 O81 O41 +p3 O7B t +p3 O78 u +] p3 O76 +p3 O72 -2 +p3 O62 o6/ +p3 O5B O76 +p3 O5B t +p3 O14 +p3 O09 ^a +p3 O08 sdl +p3 O07 ] +p3 ] O07 +p3 [ *AB p3 ] $v -p3uO78 -p3tO7B -p3tO5B -p3 $t o7c +p3 o7c $t p3 t o0v -p3 t 'A -p3 T3 o2A -p3 T0 i6K -p3 T0 'B -p3sNAOBA -p3 sln o6v -p3 sgb $Q -p3sdlO08 -p3 s83 y2 -p3 s7. -p3s40OAB -p3 s*. -p3rO0A -p3rO04 -p3 r *B9 -p3 $r [ -p3 [ $r +p3 'A t +p3 o2A T3 +p3 i6K T0 +p3 'B T0 +p3 o6v sln p3 $Q sgb +p3 s7. +p3 s*. +p3 [ $r p3 ^Q 'A p3 $p i9P p3 oBx -p3oAtO54 -p3o8=OB4 +p3 oAt O54 ^! p3 o7o -p3 o7c $t p3 o76 i83 -p3 o6v sln p3 o6f 'A p3 } o6$ p3 o5x *46 p3 o5u *32 p3 o5f *12 -p3 o4x ] p3 ] o4x p3 o4! K p3 o3W '9 p3 o34 *43 -p3 o2A T3 p3 o1o +7 p3 o0L p3 o0e -p3 o0b $$ p3 $$ o0b -p3$mO01 p3 ] $m p3 l 'B -p3 K o4! p3 $K $5 -p3 $k *45 -p3iA5O14 +p3 *45 $k +p3 iA5 O14 p3 i9P $p ] p3 i9- p3 i8G c p3 i8c i9c -p3 i83 o76 p3 i7d +8 -p3 i6K T0 p3 i5l +6 -p3i09O53 +p3 i09 O53 p3 ^F $4 p3 E i2C -p3 ] ^e p3 ^e ] p3 d o0H p3 DB ] -p3 ] DB ^P -3 ^C p3 } ^c -p3 'B T0 -p3 'B l p3 'B i9R -p3 'B .4 +p3 .4 'B p3 'B p3 'A y4 -p3 $a y3 -p3 'A t -p3 'A o6f p3 'A $i -p3 [ *AB p3 .A .2 p3 'A $_ p3 'A -p3 '9 o3W p3 '9 ^M p3 '9 $5 p3 *80 *32 -p3 +7 o1o p3 $! ,7 -p3 ,7 $! $p *37 -p3$6O91 p3 .6 ^s ^P *36 -p3 *53 *10 -p3 .4 'B -p3 *46 o5x -p3 *45 $k p3 .4 *24 -p3 -3 $y p3 +3 i2r -p3 *32 o5u -p3 *32 *80 -p3-2O72 -p3 .2 .A p3 $1 Z3 -p3 *12 o5f -p3 *10 *53 -$p *30 R4 ^p *30 i2a -p3*02O83 $ p3 $0 $p -3 $, p3 $; $, p3 -^# p3 } ^# } p3 p2 $z Z1 -p2Z2OB9 +p2 Z2 OB9 p2 $+ Z2 p2 $) Z2 p2 Y3 -p2Y2O94 +p2 Y2 O94 p2 Y1 ^r -p2OB9Z2 -p2OB9O02 -p2OB7t -p2OB5 -[p2OB2 -p2OA9O05 -p2O98o5@ -p2O95u -p2O95+7 -p2O95 -p2O94Y2 -p2O93O13 -p2O93t -p2O8AO32 -p2O8Au -p2O89t -p2O87-6 -p2O85t -p2O83O83 -p2O7BE -p2O7Ai0h -p2O79O78 -p2O78O98 -p2O78O79 -p2O73O39 -p2O6At -p2O6Ao5A -p2[O69 -p2O64'B -p2O63i6t -p2O59.4 -p2O53u -p2O53o5u -p2O4Au -p2O48t -p2O42$2 -p2O3B -]p2O3B -p2O38] -p2]O38 -p2O2B -p2O29D4 -p2O28O78 -p2O27o0c -p2O23O6B -p2O23'B -p2O1B*72 -p2O1Ak -p2O1A -p2O18y2 -p2O15'A -p2O0A^s -p2O08t -p2O07O8A -p2O07i7/ +p2 OB9 O02 +p2 OB7 t +p2 OB5 +[ p2 OB2 +p2 OA9 O05 +p2 O98 o5@ +p2 O95 u +p2 O95 +7 +p2 O95 +p2 O94 Y2 +p2 O93 O13 +p2 O93 t +p2 O8A O32 +p2 O8A u +p2 O89 t +p2 O87 -6 +p2 O85 t +p2 O83 O83 +p2 O7B E +p2 O7A i0h +p2 O79 O78 +p2 O78 O98 +p2 O78 O79 +p2 O73 O39 +p2 O6A t +p2 o5A O6A +p2 [ O69 +p2 O64 'B +p2 O63 i6t +p2 O59 .4 +p2 u O53 +p2 O53 o5u +p2 t O48 +p2 O42 $2 +p2 O3B +] p2 O3B +p2 O38 ] +p2 ] O38 +p2 O2B +p2 O29 D4 +p2 O28 O78 +p2 O27 o0c +p2 O23 O6B +p2 O23 'B +p2 O1B *72 +p2 O1A k +p2 O1A +p2 O18 y2 +p2 O15 'A +p2 O0A ^s +p2 O08 t +p2 O07 O8A +p2 O07 i7/ p2 $w Z2 [ p2 ^w p2 $V $D -p2uO95 -p2uO8A -p2uO53 -p2uO4A p2 $u ^s p2 u ^L -p2 $t Z1 p2 $t Y1 -p2tOB7 -p2tO93 -p2tO89 -p2tO85 -p2tO6A -p2tO48 -p2tO08 p2 t i57 p2 ^t ^g -p2 TB TA p2 TA TB p2 T7 DB p2 T2 $7 @@ -48300,12 +40582,7 @@ p2 ^s ^S p2 slF E p2 si1 R5 p2 s8+ ] -p2 ] s8+ -p2 s1c -p2 ^r Y1 -p2rO04 -p2rO02 -p2 r $q +p2 r O02 p2 R5 si1 p2 ^p r p2 ^p L0 @@ -48315,95 +40592,64 @@ p2 o9u -6 p2 o99 p2 o6x -2 p2 o6O +3 -p2o5@O98 p2 o5t +0 -p2o5AO6A $@ p2 o2z p2 o1@ ^G -p2o0cO27 p2 ^N ^T p2 $m Z2 -p2^mO1A -p2 ^L u +p2 ^m O1A p2 l 'B p2 ^l p2 ^k ^e p2 $j i8J p2 iAx -p2iAmO12 -p2 i8J $j +p2 iAm O12 p2 i5n '9 -p2 i57 t p2 i5 p2 i4$ p2 i0z -p2 i0p L0 p2 i0k p2 i0a $- -p2 $- i0a p2 $h ^E -p2^gO1B +p2 ^g O1B p2 $G ^g p2 ^g $3 -p2EO7B p2 E ] -p2 ] E p2 $e ^@ [ p2 $e p2 DB Y3 -p2 DB T7 p2 DB +7 p2 D8 'A p2 ^d ^5 -p2D3O79 +p2 D3 O79 p2 D1 o3i -p2 d [ p2 $d p2 C 'B [ p2 c p2 'B Y3 -p2 'B l p2 $B $K -p2 'B C p2 'B *64 p2 'B -4 -p2 $! -B -p2 'B { p2 -B $! +p2 'B { p2 $a Z5 p2 $A Z3 p2 .A y4 p2 $A ^a p2 $a ^a -p2 'A *59 +p2 *59 'A [ p2 $a -p2 '9 -7 +p2 -7 '9 p2 +9 -1 ^p *28 $s ^P *28 -p2+7O95 -p2 $7 T2 -p2 +7 DB -p2 -7 '9 -$p *27 *53 -p2-6O87 -p2 -6 o9u -p2*6AO7B -p2 *64 'B +p2 *6A O7B p2 $6 -p2 +5 oAj -p2 *59 'A -p2 -4 'B $P *24 -p2 +3 o6O -p2*3BO6B +p2 *3B O6B p2 *32 { -p2$2O42 -p2 -2 o6x +p2 $2 O42 p2 *28 -$p *21 spt -p2 -1 +9 -p2 +0 o5t p2 $0 $P $2 p2 $. @@ -48416,87 +40662,64 @@ $, p2 ] [ p2 $* p1 ^z ^Z p1 Z4 -p1 z3 *41 -p1 z3 *14 $- p1 Z1 p1 $z p1 ^y ^N p1 Y5 *20 -p1 Y5 *02 -p1Y3O07 -p1 y3 .4 -[ p1 Y3 -p1 Y2 t +p1 Y3 O07 p1 y2 +9 -p1 Y1 ,6 -p1^XO15 -p1OB2*46 -p1OABc -p1OA9+6 -p1OA7t -p1OA4C -p1OA3t -p1OA2O03 -p1OA2oAO -p1O96-6 -p1O95E -p1O93[ -p1O87,9 -p1O84K -p1O81OA4 -p1O7A -p1O76ssd -p1O76 -p1O75O72 -p1O72O75 -p1O72.1 -p1O68t -p1O68K -p1O67u -p1O67l -p1O67k -p1O64c -p1O62DB -p1O5A.A -p1O52u -p1O49^a -p1}O47 -p1O41u -p1O41C -p1O39c -p1O38 -p1O34} -p1O25$1 -p1O25] -p1]O25 -p1O21u -p1O16o0f -p1O14o0m -p1O12z2 -p1O12u -p1O09*89 -}p1O08 -[p1O08 -p1O07Y3 -p1O07K -p1O07,6 -p1O06O21 -p1O06sao -p1O05O94 -p1O05i3_ -p1O04u -p1O04t -p1O04*36 -p1O02o60 -p1O02*81 -p1O02$7 -p1uO67 -p1uO52 -p1uO41 -p1uO21 -p1uO12 -p1uO04 -p1 u $s +p1 ^X O15 +p1 OB2 *46 +p1 OAB c +p1 OA9 +6 +p1 OA7 t +p1 OA4 C +p1 OA2 O03 +p1 OA2 oAO +p1 O96 -6 +p1 O95 E +p1 O93 [ +p1 O87 ,9 +p1 O84 K +p1 O81 OA4 +p1 O7A +p1 O76 ssd +p1 O76 +p1 O75 O72 +p1 O72 O75 +p1 O72 .1 +p1 O68 t +p1 O68 K +p1 O67 k +p1 O64 c +p1 O62 DB +p1 O5A .A +p1 O49 ^a +p1 } O47 +p1 O41 C +p1 O39 c +p1 O38 +p1 O34 } +p1 O25 $1 +p1 O25 ] +p1 ] O25 +p1 O16 o0f +p1 O14 o0m +p1 O12 z2 +p1 O09 *89 +} p1 O08 +[ p1 O08 +p1 O07 Y3 +p1 O07 K +p1 O07 ,6 +p1 O06 O21 +p1 O06 sao +p1 O05 O94 +p1 O05 i3_ +p1 O04 *36 +p1 O02 o60 +p1 O02 *81 +p1 O02 $7 p1 u oB7 p1 u oB3 p1 u oB2 @@ -48505,8 +40728,6 @@ p1 u o6H p1 u o6E p1 u o4U p1 u ^M -p1 u ^L -p1 u ^K p1 u i85 p1 u i80 p1 u i7Y @@ -48515,21 +40736,9 @@ p1 u i65 p1 u i5B p1 u i51 p1 u i4A -p1 u D0 -p1 u ^C -p1 u ,B p1 u $b p1 u $7 -p1 u +6 -p1 u *04 -p1 u $0 -p1 t Y2 -p1tOA7 -p1tOA3 -p1tO68 -p1tO04 p1 t ^X -p1 $t t p1 t s16 p1 t $s p1 t o5L @@ -48541,32 +40750,20 @@ p1 t i80 p1 t i6E p1 t i5J p1 t i41 -p1 t i0A p1 t *BA p1 t *B2 -p1 t +8 -p1 t +6 -p1 t ,6 -p1 t *54 p1 t ,5 p1 T3 p1 T2 p1 T0 $8 -p1 t *04 -p1 $s t p1 ssm ] -p1 ] ssm -p1ssdO76 -p1 sr; ] p1 ] sr; p1 smg u p1 $s i5S -p1saoO06 p1 sae p1 s8+ o3- p1 s7. o4B p1 s1Z -p1 s16 t p1 s0v p1 s0n T2 p1 s0j @@ -48574,36 +40771,26 @@ p1 s0g o4h p1 s0. p1 ^S p1 ^s -p1rO02 -p1 r p3 -p1 r E -p1 r c +p1 r O02 p1 R7 u p1 r $2 -p1 $Q [ p1 [ $Q p1 $q [ p1 $# $q p1 $q -p1 [ $q -p1 p3 r p1 $p -p1$OOB3 +p1 $O OB3 p1 oBD p1 oBB -p1 oB7 u -p1 oB3 u -p1 oB2 u p1 oB0 p1 oA7 -p1oA2O02 +p1 oA2 O02 p1 o9I DA p1 o99 p1 o98 p1 o9! p1 o8z p1 o8v -p1 o8U u p1 o8o 'A p1 o8j p1 o8a @@ -48613,12 +40800,10 @@ p1 o78 p1 o77 p1 o76 p1 o7. -p1o6 O75 +p1 o6 O75 ] p1 o6s p1 o6P t p1 o6M -p1 o6H u -p1 o6E u p1 o6a .7 p1 o62 { p1 o5i @@ -48628,217 +40813,108 @@ p1 o55 p1 o54 p1 o53 ] p1 o51 -p1 o4U u -p1 o4h s0g -p1 o4B s7. p1 o43 p1 o3s u -p1 o3- s8+ [ p1 o32 p1 o1t p1 o0s +4 p1 o0r u -p1o0mO14 p1 o0h K -p1 o0g -p1o0fO16 p1 o0B -p1 ^M u p1 ^M -p1lO67 -p1 ^L u p1 ^l ^O -p1 l i01 -p1 L7 ] -p1 ] L7 -p1 l $7 -p1 l *36 -p1 l $3 p1 $L -p1KO84 -p1KO68 -p1kO67 -p1kO15 -p1^kO14 -p1KO07 -p1 ^K u +p1 k O15 +p1 ^k O14 +p1 K O07 p1 K o0h p1 K *31 p1 ] K p1 ^J i0j p1 iBy u -p1iB,O06 +p1 iB, O06 ] p1 iBK p1 iB; p1 iB, p1 i98 z1 -p1 i9; p1 i8X t p1 i8H t -p1 i85 u -p1 i83 t -p1 i80 u -p1 i80 t -p1 i8; -p1 i8, -p1 i7Y u p1 i7y p1 i7M p1 i7j p1 i7h p1 i7C t p1 i7= -p1 i6W u p1 i6q t p1 i6m -p1 i65 u p1 i6? p1 i6_ -p1 i6 $_ p1 $_ i6 p1 i5S $s -p1 i5B u -p1 i51 u p1 i4k ^M -p1 i4A u p1 i4a ^p -p1 i41 t p1 i25 -p1i1xO75 +p1 i1x O75 p1 i1a -6 -p1 i0r p1 i0m y1 -p1 i0A -p1 i01 l -p1 $h t -p1 $h $h p1 ^G p1 $F -p1EO95 p1 ^e i15 p1 $E ^E p1 ^d i12 -p1DAO76 -p1 DA o9I +p1 DA O76 p1 [ D7 -p1 D0 u p1 D0 'A p1 D0 p1 ^c y1 -p1cOAB -p1COA4 -p1cO64 -p1CO41 -p1cO39 -p1CO03 -p1 ^C u p1 c T3 p1 $c p1 c p1 'B $z -p1 ,B u -p1 'B o7- p1 'B i75 -p1 *BA t -p1 *B2 t -p1*B1O36 +p1 *B1 O36 p1 { +B -p1 ^a z1 p1 'A y2 -p1 'A o8o p1 -A K p1 'A -9 -p1*A0O38 +p1 *A0 O38 p1 } ,A p1 ] $A -p1 $a [ -p1 [ $a -p1 $9 Z1 -p1 '9 o7n -p1 -9 'A p1 .9 +8 p1 *97 *04 p1 *96 '9 p1 *95 ,4 -p1 '9 *48 +p1 *48 '9 p1 +9 -3 -p1 $8 T0 -p1 +8 t -p1 +8 .9 -p1 *87 o5g p1 $7 Z1 -p1 +7 y2 -p1$7O02 -p1 $7 u -p1 .7 o6a -p1 $7 l +p1 $7 O02 p1 ,7 +7 p1 -7 +5 p1 +7 *32 -p1 *71 *53 p1 -7 -p1 ^6 z3 -p1 ,6 Y1 -p1+6OA9 -p1-6O96 -p1 +6 u -p1 +6 t -p1 ,6 t p1 *6B ,5 p1 *68 p1 -6 ,7 p1 *61 ,4 [ p1 ,6 -p1 ,5 t -p1 +5 -7 -p1 ,5 *6B -p1 *54 t -p1 +5 *4B -p1 .5 ,4 -p1 *53 *71 -p1 *53 } -p1 +4 o0s p1 *4B +5 -p1 ,4 *95 -p1 *48 '9 -p1*46OB2 -p1 ,4 *61 -p1 ,4 .5 -^p ,1 ,4 -p1 $3 l +p1 .5 ,4 +p1 *53 } p1 $3 $i -p1 *3A -p1 -3 +9 -p1 *36 l -p1 *32 +7 p1 *31 K ^P *13 p1 +3 $% p1 +3 -p1 $% +3 -p1 .2 p1 -p1 .2 d p1 *27 -0 p1 *20 Y5 -p1.1O72 -p1$1O25 p1 +1 i1o -p1 ] $1 p1 ] ^1 -p1 ^1 ] -p1 $0 u -p1 *04 u -p1 *04 t -p1 *04 *97 -p1 *02 Y5 -p1 -0 *27 p1 $& p1 $! } p1 $@ [ p1 { -[ { p1 $p *03 -$P*02O21 +$P *02 O21 ^P $0 $/ ^P } ^P @@ -48854,21 +40930,18 @@ $p [ ^- ^p $o z5 Z2 $o Z5 u -$o Z4 Z3 +$o Z3 Z4 $o Z4 Y4 $o Z4 -$o Z3 Z4 ^o z3 *14 -$o Z2 z5 $O Z2 y3 -$oZ2O82 -$oZ2O51 -^O z2 u +$o Z2 O82 +$o Z2 O51 +^O u z2 ^o z2 -^oz1O52 +^o z1 O52 ^O z1 { $O $Z -^o y5 u ^O Y4 r $O Y4 { $O { Y4 @@ -48883,26 +40956,22 @@ $o Y1 ^8 ^O y1 *25 ^O y1 *05 ^o $x ^j -$oO93 -$oO82Z2 -^oO65^L -^oO52z1 -$oO51Z2 -^oO46^b -^oO26 -^oO24 -$.$OO23 -$OO13 +$o O93 +$o O82 Z2 +^o O65 ^L +^o O52 z1 +$o O51 Z2 +^o O46 ^b +^o O26 +^o O24 +$. $O O23 +$O O13 ^o ^X ^o ^W $o ^w $o $v D6 ^o ^V -$o u Z5 -^O u z2 -^o u y5 $o ^u -$o t Y3 $O T3 $1 $o sOj -6 ^o ^s c @@ -48921,7 +40990,7 @@ $O o91 ^o o6N Y1 ^O o65 } $o o5L -^O o5# E +^O E o5# ^O o2m ^o o2k ^O o2d @@ -48945,7 +41014,6 @@ $O i90 $O i71 $o i6z $o i6x -^O i61 $o i6+ $o i5r $o i5g @@ -48954,18 +41022,14 @@ $o i5g ^o i3m $O i2J ^o i18 z2 -^O i1> ^o i0w ,4 $o i0T -^o i0S ^O i0K -^o i0k ] ^o ^I $O $h ^o ^f .2 $o $f -^O E o5# -$oDBO24 +$o DB O24 $o D6 $v ^o D6 ^o ^d -6 @@ -48977,47 +41041,43 @@ $o C $0 oBx u oBX oBw Z2 -oBuOA1 -oBtO52 +oBu OA1 +oBt O52 oBT E -oB. T0 oBt -oBsO81 +oBs O81 oBs E oB\ RB ] -oB\ ] RB oBO o9H oBo -oBnO92 +oBn O92 oBm -A oBM ] oBm -oBlO65 +oBl O65 oBl E oBK u oB K oBi Y2 oBi Y1 oB. iA2 -oBhO91c -oBhcO91 -oBfO81 +oBh c O91 +oBf O81 oBe o4a oBe *B9 ] oBe ] *B9 -oBdO61 +oBd O61 oBD { { oBC oBc ] ] oBc ] oBB c -oBaO61 +oBa O61 oBa o8a oBa $1 oB@ +A oBA oBa -^{ oB9 s{6 oB9 o6@ oB9 $1 oB$ .9 @@ -49029,7 +41089,7 @@ oB8 oB7 Z1 DA oB7 y4 oB7 T1 -oB7dOBA +oB7 d OBA oB7 DA Z1 oB7 *A9 oB@ *78 @@ -49037,13 +41097,13 @@ oB7 $? oB5 oA8 ^! oB5 oB4 Y4 -oB4Y1O73 -oB4O73Y1 +oB4 Y1 O73 +oB4 O73 Y1 oB4 iA oB4 $A oB4 -3 oB3 ] p2 -oB2OA1 +oB2 OA1 oB2 R8 oB2 $E oB2 *9A @@ -49061,8 +41121,8 @@ oB@ oB! oB- $_ $) oB( -oAzO62$p -oAz$pO62 +oAz O62 $p +oAz $p O62 oAz LA oA\ Z3 oAz $3 @@ -49070,44 +41130,40 @@ oA. Z1 oAy E oA Y1 oAY -oA#O91 -oA.O82 -oA.O34 -oA@O03 +oA# O91 +oA. O82 +oA. O34 +oA@ O03 ] oAx -oAUOB1E -oAUEOB1 +oAU OB1 E oAu c oAu 'B -oAtO03 -oAT r p3 +oAt O03 oAT p3 r oA& T0 oAT oAS t oAs $t -oAsi87O64 +oAs i87 O64 oAs D8 oAS ] ] oAs oAs oAR u oAq Z2 -oA-^OO15 +oA- ^O O15 oAo D6 oA@ o91 oA& o9( oAo $1 oAn -oAmO91u -oAMO45T5 -oAmuO91 +oAm u O91 +oAM O45 T5 oAM c oAl K -$O ^a l oAl ] -oAkO82 -oAkO62 +oAk O82 +oAk O62 oAk u oAk +7 oAk *59 @@ -49125,7 +41181,7 @@ $? oAG $g oAf o9l oAf oA. E -oA.dO3A +oA. d O3A oAd $m oA# D9 oA! D9 @@ -49134,20 +41190,17 @@ oA! D1 oA/ c oA c oAa $z -oAAO32 -oAa T0 +oAA O32 oA9 Z1 E oA9 o1o -oA9 E Z1 -oA9 ,B *57 oA9 *57 ,B oA. -9 oA! .9 oA8 RB ] oA8 c oA7 Y1 -oA7p1O09 -oA7i7tO23 +oA7 p1 O09 +oA7 i7t O23 oA7 C T4 oA. -7 oA6 Z2 @@ -49169,12 +41222,11 @@ oA. .4 oA3 C oA3 +5 oA3 $? -oA2O81o3c -oA2O64 -]oA2O31 -oA2 o9 s\D +oA2 O81 o3c +oA2 O64 +] oA2 O31 +oA2 o9 s\D oA2 o9 -oA2o3cO81 oA2 +8 oA2 $- $% oA2 @@ -49206,27 +41258,25 @@ $- oA_ ^+ oA# ^? oA? ^> oA< -o9zO52 +o9z O52 o9Z c ,6 o9z $c -o9Z ,6 c o9z $5 o9* Z2 o9? Z2 o9$ Z1 -o9Y Z1 u -o9yOA1 o9Y u Z1 +o9y OA1 o9y +6 -o9xO32 +o9x O32 o9X u -o9.O13$6 +o9. O13 $6 o9X o9x o9w Z2 o9W t o9w *09 -o9vO72 +o9v O72 o9V $v o9u DA o9u D7 @@ -49237,12 +41287,10 @@ o9t $s o9t $7 p2 o9! T7 o9s Z1 -3 -o9sO71u -o9suO71 +o9s O71 u o9s o6w -o9S i8L C -o9s i4s o9S C i8L +o9s i4s o9s c o9s -3 Z1 o9r K E @@ -49252,13 +41300,11 @@ o9r $7 o9r -5 o9Q -6 { o9q -o9pO41 +o9p O41 o9p +8 -o9OO61u -o9OuO61 +o9O O61 u o9o o7o } o9O o0H c -o9O c o0H o9o *96 o9? o8? o9< o8@ @@ -49271,7 +41317,7 @@ $@ o9o o9N $Z o9n *9A o9N *87 -o9mOA2 +o9m OA2 o9m r o9m o8l o9m o7d @@ -49284,13 +41330,11 @@ o9L o9k o7t o9k -8 o9k [ -7 -o9jO81.6 +o9j O81 .6 o9J ^W E -o9j.6O81 o9J -6 -o9iO43 +o9i O43 o9i u p5 -o9i p5 u o9. iAd o9/ iA3 o9_ i99 @@ -49298,24 +41342,22 @@ o9# i3@ o9I o9i o9h o8k -o9h ^m o9h D6 o9h $a o9h ] o9g i0G o9g D4 -o9fO52 -o9fO35 -] o9F u +o9f O52 +o9f O35 o9f $s o9f *B9 RB $) o9f -o9EO45d +o9E O45 d o9E u ] o9e D7 o9e -7 o9e *60 -o9dO53 +o9d O53 o9d $H l o9% DA c o9d -8 @@ -49323,31 +41365,28 @@ o9- D6 o9d ,5 o9/ D3 ] o9d -o9c u -o9% c DA o9c *95 o9C $1 o9@ c ] o9c -o9BZ5O17 -o9BO17Z5 -o9bO05 +o9B Z5 O17 +o9B O17 Z5 +o9b O05 o9b *93 o9B -o9aOA1 +o9a OA1 o9a $S o9a k *24 o9A i90 o9a -8 o9A *53 o9a $3 -o9a *24 k o9A *24 o9A $2 o9/ 'A o9_ ,A o9a $. -o99O62 +o99 O62 o99 s45 o99 o6i o99 o4 @@ -49358,7 +41397,6 @@ o99 *9B o9@ $9 o98 Y1 o98 $v -o98 T3 o9. .8 p4 o98 i8s o98 C @@ -49369,7 +41407,6 @@ o9 .8 $@ o98 o97 u p1 o97 T0 -o97 p1 u o97 o3u o97 o1i ] o97 $9 @@ -49380,16 +41417,16 @@ o9@ ,7 o9 $7 $- o97 o96 Y4 -o96O21$4 -o9.$6O13 +o96 O21 $4 +o9. $6 O13 o96 o33 o9. *68 o9+ *67 -o96$4O21 +o96 $4 O21 o96 $4 o96 ^# o95 Z4 -o95O61 +o95 O61 o95 o77 o95 D3 o95 'A @@ -49397,7 +41434,6 @@ o9+ *59 o95 *89 o9. *57 o95 -5 *39 -o95 *39 -5 o95 ,1 o95 -0 o9. ,5 @@ -49410,8 +41446,8 @@ o94 *46 o9. *40 $# o94 o93 Y1 -o93O72 -o93O53 +o93 O72 +o93 O53 o93 T1 o93 o6f o93 o2m @@ -49433,7 +41469,6 @@ o9? .2 ] o92 o91 Y1 o91 s0 -o9% $1 l o91 K o91 i8d o91 i3a @@ -49447,13 +41482,12 @@ o9% $1 o9, $1 $- o91 [ o91 -o90O81C +o90 O81 C o90 o80 ] o90 o73 o90 o0W o90 { k o90 i0D -o90CO81 o90 +A o90 +8 o90 *79 @@ -49474,7 +41508,7 @@ $? o9 ^, o9. ^- o9- o8Z $z -o8zO05 +o8z O05 o8z $f o8z D3 o8! Z3 o8Z @@ -49484,36 +41518,33 @@ o8 Z2 o8+ Z1 R0 o8- Z1 E o8@ Z1 -o8yO32s8H -o8ys8HO32 +o8y s8H O32 o8y r o8y p5 o8y D3 D6 o8y *83 o8. Y2 -o8^Y1O42 +o8^ Y1 O42 o8* Y1 o8- Y1 [ -o8- [ Y1 -$o ^8 Y1 } o8y ] o8y o8x K o8X E o8x D9 o8x ,9 -o8.O71D5 -o8&O53 -o8@O53 -o8_O52 -o8^O42Y1 -o8#O34d -o8*O34 -o8_O32 -o8.O31 -o8*O17 -o8#O12 -o8_O12 +o8. O71 D5 +o8& O53 +o8@ O53 +o8_ O52 +o8^ O42 Y1 +o8# O34 d +o8* O34 +o8_ O32 +o8. O31 +o8* O17 +o8# O12 +o8_ O12 o8X o8w Z1 o8w $z @@ -49526,7 +41557,7 @@ o8w 'B o8w *21 o8w +0 o8@ ^W -o8vO51 +o8v O51 o8v u o8V [ T7 o8V T0 @@ -49534,12 +41565,11 @@ o8V c o8V -7 o8v ] [ o8v -o8u Y1 C +o8u C Y1 o8u s90 o8u o9p o8U $E o8u D4 -o8u C Y1 o8u $. o8u ] [ o8u @@ -49554,28 +41584,26 @@ o8@ T4 -B o8s Z2 o8s T4 o8s $p -^] o8* s]N o8S D3 +6 o8s .3 o8s +0 ] o8s -o8rO41 +o8r O41 o8R u o8R T2 o8r $o -o8r L7 i8i o8r i8i L7 o8+ R0 Z1 o8R o8q o8P Y1 -o8pO52 +o8p O52 o8p t o8p oBk o8p *85 o8p -5 o8o Y2 -o8oO91p3 +o8o O91 p3 o8O o6n o8! o7x o8< o7h @@ -49589,8 +41617,8 @@ o8* o4. o8o *27 } $@ o8o o8N Y1 -o8NO26$S -o8N$SO26 +o8N O26 $S +o8N $S O26 o8n o5^ o8n 'B o8m Z1 @@ -49601,7 +41629,6 @@ o8m $* o8l Z1 o8L i7e o8l *86 -o8L ] ] o8L $= o8l o8k t @@ -49617,9 +41644,9 @@ o8j D7 o8j *86 o8j *78 o8i ^Y o0j -o8iY2O41 -o8iO42 -o8iO41Y2 +o8i Y2 O41 +o8i O42 +o8i O41 Y2 o8i T4 o8i K o8i D4 @@ -49637,30 +41664,28 @@ o8i -5 o8i -3 o8. i25 o8I -o8hO42 -o8hO26 -o8hO23p4 +o8h O42 +o8h O26 +o8h O23 p4 o8H o4y o8H ^I o8h *68 o8g Z1 o8G Y3 Y3 o8g Y2 -o8gO61u -o8guO61 +o8g u O61 o8g $s o8g i8m o8g *08 o8f Z1 -o8fO32 -o8fO31 +o8f O32 +o8f O31 o8f $n o8f $h o8f ] o8/ ^f [ o8f -o8- E Z1 -o8eO71 +o8e O71 o8e $k o8e D5 o8e D4 @@ -49669,17 +41694,15 @@ o8e $2 [ o8E o8E o8d Y3 -o8dO52 -o8d t DB +o8d O52 +o8d DB t o8d T6 o8d sed -0 o8D $S -o8d DB t o8+ D3 o8@ D2 o8_ D1 K o8d -0 sed -o8! D0 o8& $D o8d ^@ o8c Y2 c @@ -49688,15 +41711,13 @@ o8c o7y o8C o7M o8c c Y2 o8c -7 -o8bO21D8 -o8@ -B T4 +o8b O21 D8 o8b o4w -o8B l $5 +o8B $5 l o8B i31 R9 o8b D5 o8b *86 *62 o8B -6 -o8B $5 l o8b -5 o8! 'B $@ o8A o3z @@ -49714,7 +41735,6 @@ o8a .1 o8A +0 o8a $. o89 Z3 -o8. '9 o77 o89 o0L o8$ ,9 o8- .9 @@ -49724,8 +41744,8 @@ o88 C o88 $7 $? o8 *86 o88 *02 k -o87O61 -o8-.7O34 +o87 O61 +o8- .7 O34 o87 p1 o87 o3- o87 o1y @@ -49738,13 +41758,13 @@ o87 [ o8* .7 o8! .7 o8_ .7 -o86O32$f +o86 O32 $f o86 s13 o86 R9 o86 i3h o86 i1o o86 i1i -o86$fO32 +o86 $f O32 ^* o86 *40 o86 +2 ^O *86 @@ -49762,16 +41782,15 @@ o85 ,7 o85 *36 o8* +5 $+ o85 -o84O05 -o84 T1 -4 -o84p1O57 +o84 O05 +o84 -4 T1 +o84 p1 O57 o84 o0B o84 i5+ o84 ^h -o84 -4 T1 o8. -4 -o83O31 -o83O14 +o83 O31 +o83 O14 o83 o93 o83 o1A o83 C @@ -49780,7 +41799,7 @@ o8@ $3 o8/ -3 ^o *83 ^@ o83 -o82O52 +o82 O52 o82 T2 *21 o82 i7k o82 D9 @@ -49798,7 +41817,7 @@ o81 ^L o81 i8= o81 i2z o81 $E -o81D2O04 +o81 D2 O04 o81 ^d o81 C o81 $4 p4 @@ -49807,7 +41826,7 @@ o80 Y4 o80 D9 o80 D4 ^N o80 *46 -o8-*03O26 +o8- *03 O26 o8@ +0 o8# ^@ o8! $? @@ -49818,7 +41837,6 @@ $! o8% } o8* { o8_ ^[ o8] -^' o8' o7Z u ] o7z o4y o7Z o1o @@ -49844,8 +41862,8 @@ $" o7z $1 o7z { o7z [ } o7z -o7yO51 -o7yO05 +o7y O51 +o7y O05 o7y t $E o7Y K E o7y i7s @@ -49862,41 +41880,36 @@ o7* Y1 o7@ Y1 o7y -0 o7Y } } -o7xY2O81 -o7xR4O21 +o7x Y2 O81 +o7x R4 O21 o7x r o7X o1Z *56 o7X $L o7x $L o7x ^8 o7x *79 -o7X *56 o1Z -o7*O52 +o7* O52 o7X *50 -o7$O42 -o7+O41 -o7 O41 -o7$O31 +o7$ O42 +o7+ O41 +o7 O41 +o7$ O31 o7x *14 -o7*O01^6 -o7wO41 +o7* O01 ^6 +o7w O41 o7w $p o7w o5b o7W C ] o7w c o7w *46 -o7w *31 o7w *07 -o7w ] $@ o7w -o7v Z4 .2 +o7v .2 Z4 o7v r o7v o6c o7v o3 o7v $a o7v *41 -o7v .2 Z4 -o7. ^v o7u ^T o7u o5s o7u o0k @@ -49906,9 +41919,8 @@ o7u ,6 o7U ] $! o7U o7U -o7tO34u -o7tO21 -o7tuO34 +o7t O34 u +o7t O21 o7t u o7T ^T E o7t o45 -7 @@ -49919,30 +41931,22 @@ o7t ^O o7T E *21 ] o7t E o7t $b -o7t -7 o45 -o7+ T6 o7# T2 Y1 -o7T *21 E o7* T1 Z1 o7t $1 o7t *02 -$& o7( t -^] o7} t -o7sO23o0s -o7s t +o7s o0s O23 o7S svl o7, s,@ R6 o7s o6o o7s o6' o7s o4U -o7so0sO23 -o7S E *32 +o7S *32 E o7S $B o7s $b -o7s*93O02 +o7s *93 O02 o7s *56 o7s *41 -o7S *32 E $$ o7s o7R T2 o7r i7. @@ -49950,7 +41954,6 @@ o7r $I o7, R6 s,@ o7r *50 o7r *26 -o7r *25 } o7R } o7r o7q t @@ -49959,10 +41962,8 @@ o7q +0 o7q $@ o7q ] o7P Y1 -o7pO01 o7p u o5O o7p o5V -o7p o5O u o7p k o7p ,8 o7p *70 @@ -49970,15 +41971,14 @@ o7p $4 o7p *26 o7p $2 } o7p -o7oO34 -o7oO31 +o7o O34 +o7o O31 o7o t o7o C o7o *83 o7 o8< o7o +6 o7o .6 -o7. o6. o7$ o5$ o7! o4G o7? o3< @@ -50008,22 +42008,18 @@ o7m $o *34 o7m D8 o7m D6 ,9 o7. ^M D6 -o7M *81 o7m *61 o7m *34 $o $? o7m o7m -o7 l Z1 -o7LO92u -o7lO91 -o7LuO92 +o7L u O92 +o7l O91 o7l u D6 o7l o6a o7l o5s o7l i8e o7L i6M o7L $F -o7l D6 u o7L $5 o7l +5 $+ o7L @@ -50031,16 +42027,14 @@ o7L o7l ] $^ o7? l o7K Y2 -o7kO41z2 -o7kO41 +o7k O41 z2 +o7k O41 o7k u -2 -o7k T1 o7k o25 o7. K o1u o7k o0v o7k l D3 o7k i0x -o7k D3 l o7k $9 o7K *65 o7k .6 @@ -50054,11 +42048,10 @@ o7j o3t o7J $o ] o7j $k o7J $D [ -o7J [ $D o7j .9 o7j *57 o7j *02 -o7iO51 +o7i O51 o7i T0 o7i $m o7i K @@ -50077,21 +42070,19 @@ o7/ i7/ o7# i5N .3 o7? i4K o7* i46 ,7 -o7< i3y o2m o7$ i31 o7. i2n -o7. i0v o7I o7i $@ o7@ ^i $_ o7i -o7hO02i3d +o7h O02 i3d o7h u o7h ^i o7h *64 o7h $2 ] o7h -o7gOA2 +o7g OA2 o7G T3 o7g ssj o7g ^R @@ -50112,22 +42103,20 @@ o7. ^F o7e Y3 o7e u o7e t p1 -o7e p1 t -o7E o6W *35 +o7E *35 o6W o7e o5i o7e o0a o7e $A o7e $8 o7e *54 -o7E *35 o6W o7e $2 o7e +0 $* o7e -o7dO91*75 -o7dO91 -o7dO61 -o7DO52 -o7dO52 +o7d O91 *75 +o7d O91 +o7d O61 +o7D O52 +o7d O52 o7D T2 o7d sth o7d $r +5 @@ -50138,7 +42127,6 @@ o7D i6R $2 o7d DA o7d D8 o7, D8 -o7d*75O91 o7# ^d *70 o7d +5 $r o7, D4 @@ -50146,7 +42134,6 @@ o7d $3 o7D $2 i6R ] o7d o7c Z2 -o7! c Z2 o7C Y1 o7C t i5I o7c t @@ -50159,17 +42146,16 @@ o7c +1 o7c *02 o7! C o7c { -o7bY3O95 -o7bO34^m +o7b Y3 O95 +o7b O34 ^m o7B t -o7b srO *16 +o7b *16 srO o7b o58 o7B c o7b *76 o7B *73 o7b -6 o7b *57 -o7b *16 srO o7B *07 o7b +0 o7_ ^B @@ -50179,7 +42165,6 @@ o7a o5l o7a i1c o7a $e o7A C -o7A ^9 Y1 o7a *78 o7a +5 t o7A +4 @@ -50189,7 +42174,7 @@ o7@ +A o7a [ ] o79 Y2 o79 Y1 -o79O82 +o79 O82 o79 sta o79 s73 o79 o41 @@ -50215,7 +42200,6 @@ $& o78 $* o78 o77 y3 y3 o77 ^v -} o77 T3 o77 o8- o77 o6g o77 o69 @@ -50229,7 +42213,6 @@ o7. *75 o7% *74 $& o7% $& *74 o77 $3 -o7+ -7 o76 z1 o76 R5 c o76 o0v @@ -50255,18 +42238,16 @@ o75 $- o75 ] o7@ -5 o74 Z2 -o74O02^0 +o74 O02 ^0 o74 u d o74 T3 o74 T1 o74 $q o74 o2l -o74 k { o74 k o74 i9k o74 i6. o74 i1 *98 -o74 d u o74 $c o74 *70 o74 *64 ^3 @@ -50276,9 +42257,7 @@ o74 $ ^$ o74 o73 y4 o73 Y2 -o73O52 -] o73 o90 -o7# .3 i5N +o73 O52 o73 i4J o73 i0L -8 o73 ^E @@ -50292,20 +42271,18 @@ o7# -3 o7 $3 o7! ,2 Z2 o72 Y2 -o72O03d +o72 O03 d o72 T2 $! -o72 $! T2 o72 $T o72 ^* R7 o72 k o72 +6 -o7 *24 ,6 o72 ^@ $+ o72 o71 Z2 *78 o71 y3 o71 Y2 *78 -o71O43 +o71 O43 o71 $M o71 L8 Z2 o71 i5U @@ -50353,27 +42330,24 @@ o7^ $# o7@ $/ o7* $= o7 -[ o7! [ o7_ ^$ o7, ^@ o7? ^[ o7. -^? o7( o6z ^Z o6Z Y1 -o6zO32 +o6z O32 o6z o5@ o6z o4b o6z o06 { o6Z l d -o6Z d l o6z D0 ^R o6z +9 -o6@Z5O14 +o6@ Z5 O14 o6Z .5 o6z $5 o6_ Z3 -o6.Z2O42 +o6. Z2 O42 o6# Z2 o6* Z2 o6) Z2 @@ -50394,7 +42368,7 @@ o6y D7 o6y D0 o6y *63 o6y -5 -o6.y4O82 +o6. y4 O82 o6 Y4 o6. y3 *62 o6_ y3 @@ -50408,31 +42382,29 @@ o6- y2 $! o6y o6X Z2 [ o6X [ Z2 -o6xO41 -o6XO15^7 -o6x T3 T2 +o6x O41 +o6X O15 ^7 o6x T2 T3 o6X o5T } o6x k .1 o6x i7u o6X c o6x ,A -o6_O82 +o6_ O82 o6x +8 -o6=O75L6 -o6@O72 +o6= O75 L6 +o6@ O72 o6x -7 -o6.O42Z2 -o6@O42 -o6-O41 -o6-O32 -o6@O31 -o6!O23} -o6@O14Z5 +o6. O42 Z2 +o6@ O42 +o6- O41 +o6- O32 +o6! O23 } +o6@ O14 Z5 ^@ o6x o6w Z2 ,1 -o6wz1O21 -o6wO01 +o6w z1 O21 +o6w O01 o6w sys o6w skf o6w o7m @@ -50446,14 +42418,13 @@ o6W $1 o6w $1 o6! ^W o6W -o6vO82 -o6vO13 +o6v O82 +o6v O13 o6v r o6V $P d o6V o9i E o6v o7s o6V o3& k -o6V k o3& o6V E o9i o6V E o6v *83 @@ -50461,9 +42432,9 @@ o6v *61 o6v $5 o6v { o6u $z -o6uO82 -o6uO21 -o6uO14 +o6u O82 +o6u O21 +o6u O14 o6u u o6u o5D o6u $n @@ -50476,14 +42447,12 @@ o6u *70 o6u -7 o6* u ,5 o6u -2 -o6U *16 l $. o6u o6t z1 o6T y2 ^0 o6t o8x o6t o2t o6* t k -o6t D5 o6t [ ^d o6t *78 o6T ,7 @@ -50493,8 +42462,8 @@ o6, T1 o6t *04 o6T o6s Z3 i7@ -o6sO74 -o6sO41 +o6s O74 +o6s O41 o6s u ] o6s ss4 o6S s%D i6U @@ -50506,21 +42475,17 @@ o6s K o6S $J o6s i8y o6s i7@ Z3 -o6si7/O21 +o6s i7/ O21 o6s i74 E -o6S i6U s%D -o6s E i74 o6S $e $! o6S c *87 o6S c -o6S *87 c $. o6s -7 -o6s *50 -2 +o6s -2 *50 o6s *42 o6s -4 o6! s3% -o6s -2 *50 -o6s*02O01 +o6s *02 O01 o6S o6s $* o6r y4 @@ -50545,27 +42510,24 @@ o6q Z4 Z4 o6q Z3 { o6q Z2 -3 o6q Y3 -o6q}O12 +o6q } O12 o6Q ^Q o6Q o5@ -o6q o4z .2 +o6q .2 o4z o6q o0t o6q k o6Q i6Q o6q *64 o6q -3 Z2 o6q *36 -o6q .2 o4z o6_ ^q o6q -o6PO74E +o6P E O74 o6P u o6P T2 o6P s7o o6p R5 o6p $r -o6P o0T c -o6PEO74 o6P c o0T o6p $7 Y1 o6P *68 @@ -50575,7 +42537,7 @@ $@ o6p [ [ o6p o6o $z o6O y5 y5 -o6oO24y4 +o6o O24 y4 o6o o3l o6o $O o6o ^M @@ -50588,7 +42550,6 @@ o6. o9! o6o *67 o6& o5l o6o .5 ,4 -o6o ,4 .5 o6o -4 o6 o3l o6@ o34 *36 @@ -50610,26 +42571,24 @@ o6n ] $. o6n o6M Z4 Y2 o6m Y3 -o6mOA4t -o6mtOA4 +o6m t OA4 } o6m o5@ -o6Mi0mO61 +o6M i0m O61 o6M ^D o6m $b o6M +9 o6_ ^m $7 -o6M *60 *24 +o6M *24 *60 o6m $5 o6m *34 o6m ,3 ^4 o6m *31 -o6M *24 *60 o6! ^M o6l z2 o6l Y3 o6l $y -o6lO93 -o6lO91 +o6l O93 +o6l O91 o6L u o6l s28 C o6l $r @@ -50638,22 +42597,19 @@ o6L o7F o6l o4d o6l o2K o6l i5z -o6l C s28 o6l .8 o6l *75 o6l *74 o6l ,7 -o6=L6O75 -o6l*57O03 +o6l *57 O03 o6l $5 $@ o6L o6L $@ o6l o6K y3 .4 o6K Y2 -o6kO83 +o6k O83 o6K t i3n -o6* k t o6k s9j o6k o0J o6k L7 @@ -50668,27 +42624,25 @@ o6k *42 o6k +1 o6, k ] o6k -o6jO51K -o6jO21 +o6j O51 K +o6j O21 o6J s1T o6J o9i o6j L3 -o6jKO51 +o6j K O51 o6j *71 o6j +5 o6j +2 $. o6j o6i Y2 -o6iO31 +o6i O31 o6i smv o6i o7w o6i o5v -o6i o4H ] o6i ] o4H o6i o0L o6i $i o6I E -o6i ^C o6/ i7p o6& i79 o6+ i6/ @@ -50699,43 +42653,37 @@ o6* i58 o6. i5. o6+ i4s o6* i3* -o6@ i2g o6+ i1p o6# i1l o6# i11 -o6$ i0i o6& } ^i -o6$ ^i o6@ $i { o6i ] o6i -o6hO32 -o6HqO06 +o6h O32 +o6H q O06 o6h i4B o6h $7 o6h ,7 o6h ^1 -o6H *07 o6H o6h [ $! o6h o6g Z2 $J o6g y2 -o6gO12 -o6gO03 +o6g O03 o6g o4c o6g o0l o6G c o6g *63 +5 -o6g +5 *63 o6g $5 o6G *32 *21 o6g .2 o6g ,1 o6g *02 o6g [ -o6fO42 -o6fO02 +o6f O42 +o6f O02 o6f $s *12 o6f $s -0 o6f k @@ -50746,7 +42694,6 @@ o6f ,9 o6f *71 o6f *12 $s o6f *12 -o6f -0 $s o6f [ { o6f o6e Y2 @@ -50763,8 +42710,8 @@ o6e *20 o6. E ^! ] o6e ^( o6e -o6dO13+2 -o6dO02 +o6d O13 +2 +o6d O02 o6d ^s K o6d p4 R9 o6d o8n p3 @@ -50779,15 +42726,13 @@ o6_ D4 c o6D .3 o6, D3 o6d $2 -o6+ D0 $b +o6+ $b D0 [ o6d -o6# c Z1 o6C s0M o6c o7- o6c o5q K o6c K o5q o6c $e -o6_ c D4 o6C C o6c $A o6c *98 @@ -50801,68 +42746,53 @@ o6c *51 o6c +3 o6$ C } o6- C -o6@ c $! o6@ $! c { o6c -o6bO51t -o6BO42 -o6btO51 +o6b t O51 +o6B O42 o6B o5F *31 o6B ^M o6B i6. o6b i0t -o6+ $b D0 o6b ^A .1 o6b -9 -o6B +6 *54 o6B *54 +6 -o6b *46 *23 -o6b *34 -o6B *31 o5F -o6b +3 o6b *23 *46 +o6b +3 [ o6B *15 $! o6b *06 o6B $- o6. 'B -^( o6B $# o6b o6A Y2 -o6aO72u -o6auO72 +o6a u O72 o6a o76 o6A o49 o6A o16 *72 o6A i6@ o6a i2a -o6AfO38 +o6A f O38 o6A D4 y5 o6a ^9 z2 o6a *74 -o6A *72 o16 o6a *64 o6A *54 o6a ,5 o6A *46 o6a *31 o6a +0 r -o6# ^A o6A $? o6a -o69O41o3B +o69 O41 o3B o69 u d o69 o5Z C o69 o4m } -o69o3BO41 o69 k *16 -o69 d u -o69 C o5Z o69 $8 o69 +7 $# o69 $# +7 o69 ^6 o68 Z4 -[ o68 t o68 ^p o68 o76 o68 o1. y1 @@ -50884,7 +42814,6 @@ o6_ ^+ '8 $? o68 } o68 ^@ [ o68 -o6* ,7 T1 o6@ -7 o6= -7 o6^ ,7 @@ -50894,7 +42823,6 @@ o66 $w o66 p5 *57 o66 p2 o0v o66 o5@ l -o66 l o5@ o66 K +3 o66 ^f o6. *69 @@ -50916,11 +42844,10 @@ o6} +6 o6. ^* +6 o6? .5 y2 o65 Y1 -o65O73+3 -o65O51 -o65O21 -o65O13 -o6* ,5 u +o65 O73 +3 +o65 O51 +o65 O21 +o65 O13 o65 $s *06 o65 o8. o65 o7k @@ -50929,7 +42856,7 @@ o6_ .5 ^n o65 k o65 ^j o65 i3? -o65fO85 +o65 f O85 o65 D3 *79 o65 D1 ^z o65 $A @@ -50939,7 +42866,6 @@ o6 .5 *64 o65 -4 o6- *54 o6 *54 -o65+3O73 o65 *06 $s o65 } o65 [ @@ -50948,21 +42874,15 @@ o64 u p1 o64 t p1 o64 T0 o64 sHm -o64 p1 u -o64 p1 t o64 o3, *21 o64 o1l *21 o64 i4& o64 i03 o64 i02 -o64 *75 -o64 *21 o3, o64 *20 o64 $1 o6- *41 -o64 ^$ o64 ^- -o6. ,4 $! o64 ] o64 [ o64 @@ -51001,12 +42921,10 @@ $+ o62 $@ o62 $ o62 o61 $z -o61O23 +o61 O23 o61 sl/ ] -o61 ] sl/ o61 sg4 p3 -o61 p3 sg4 -o61p1O04 +o61 p1 O04 o61 o1S o61 ^n o61 i6i @@ -51026,7 +42944,7 @@ $/ o61 ^, o61 o60 ] Y3 o60 Y2 -o60O21 +o60 O21 o60 t o60 i5w o60 ^I @@ -51034,12 +42952,10 @@ o60 D3 D8 o60 -A o60 +8 o6_ *05 ^E -o60 -5 o6- *05 [ o6+ *04 o60 *23 $1 o60 *23 -o6= *01 *65 o60 $1 *23 o60 $- o60 { ] @@ -51053,7 +42969,6 @@ o6@ o6{ o6( o6. ^| -o6, ^$ o6` $# o6+ $$ o6@ @@ -51069,7 +42984,6 @@ o5Z i5N o5z D8 o5z $D o5z -7 +6 -o5z +6 -7 o5! z4 z4 o5. Z3 *20 o5@ Z3 $2 @@ -51078,23 +42992,22 @@ o5- Z2 +2 o5@ Z2 [ o5@ Z2 o5_ Z1 -o5 Z1 +o5 Y1 $? o5, Z1 o5z $1 $! o5Z o5z $. o5y $z o5y y4 -o5yO14y5 +o5y O14 y5 o5y $v o5y T4 o5Y T2 o5y R1 o5y $N -o5Y l ^k +o5Y ^k l o5y L7 o5% $y l -o5Y ^k l o5y K o5y k o5y i5s @@ -51114,89 +43027,73 @@ o5. Y1 i6B o5+ Y1 i19 o5* Y1 ^a o5_ y1 *45 -o5 Y1 } o5y $) } $) o5y o5X y3 -o5XO62 -o5XO21t -o5xO01p4 +o5X O62 +o5X O21 t +o5x O01 p4 o5X ^# ^x -o5XtO21 o5x scq o5x $r *53 o5x R4 o5x $q o5x o6y o5X o6B -o5x o2x i3B +o5x i3B o2x o5X l $b o5x k o5x i6u -o5x i3B o2x -o5X $b l -o5 O91 +o5 O91 o5x *72 -o5_O71 -o5_O62K -o5!O61 +o5_ O71 +o5_ O62 K +o5! O61 o5x *53 $r o5x *17 o5x -0 $> o5x -o5W Z3 u o5W u Z3 -] o5W u o5w p3 *85 -o5W o4E '8 +o5W '8 o4E o5w o4a o5W o41 y4 o5W ^L o5w D6 o5w D2 -o5W '8 o4E o5W $8 o5w *64 o5w *53 -o5w *47 o5w *27 -o5vO32 +o5v O32 o5v t o5v oA3 ] o5V o4T o5v o22 -o5V l *12 -o5v L1 +o5V *12 l o5v $g o5v D3 y5 o5v *43 o5v *32 -o5v *23 -o5V *12 l o5v $+ $* o5v -o5u Z5 Z2 o5u Z2 Z5 -o5uO81 +o5u O81 o5U u $0 o5u T0 $? -o5u $? T0 o5U $p i4* -o5U l *48 +o5U *48 l o5u i5l o5U i4* $p o5u i3m o5u i0z o5u D1 o5u C T4 -o5U *48 l o5u .4 -o5U $0 u o5u -0 o5u ^, o5t o4. o5t o3m ] -o5t ] o3m o5T o2b o5t o11 $5 o5T ^L @@ -51211,7 +43108,6 @@ o5. T4 o5# T2 o5T *05 o5? [ T0 -[ o5- t o5s Y2 D6 o5S Y2 c o5s t -6 @@ -51219,7 +43115,7 @@ o5; sop o5s o9! o5S o2s o5s o0z -o5si83O31 +o5s i83 O31 o5s i76 o5s i4s o5- sH. @@ -51246,21 +43142,18 @@ o5r d o5r *70 o5r .7 o5* R4 -o5. R4 ] o5. ] R4 o5_ R4 o5R $? o5R } } o5r $. o5r ] -o5r [ [ -o5qO76 +o5q O76 o5q spy o5q K o5q i2z o5q -0 o5@ $Q [ -o5@ [ $Q o5Q o5q $! $! o5q @@ -51284,13 +43177,11 @@ o5@ $p o5o z3 $F o5O y2 o5o Y1 -o5oO71 +o5o O71 o5o o0K -o5o $F z3 -o5_o8tO32 +o5_ o8t O32 o5! o76 o5, o70 -} o5@ o6m o5o ,6 o5o -6 o5$ o6! @@ -51309,8 +43200,7 @@ o5. o0E o5o { o5o [ o5N y2 *74 -o5nO71u -o5nuO71 +o5n u O71 o5N t o5n smh o5n oB1 @@ -51321,31 +43211,27 @@ o5n i5I o5N i1d o5n *45 ] o5n ] *45 -o5n *43 o5n *37 o5& ^N o5n $/ { o5n o5n o5M y5 $s -o5mO41D3 -o5mO14y3 +o5m O41 D3 +o5m O14 y3 o5m u o5M $s y5 o5M slL -o5m o7g D8 +o5m D8 o7g o5M o6P o5M o6K o5M o4l o5m i4N -o5m D8 o7g o5m *75 o5m +6 ^( o5m o5l Y3 -o5% l $y -o5lO21 -o5# l ^r +o5l O21 o5l oA4 +B o5L o6U o5l o3H @@ -51353,20 +43239,15 @@ o5L o0M } o5L $o { o5l K o5l $i -o5l +B oA4 o5l $9 o5l '9 o5L *75 -o5l +7 -o5l *31 -o5l *12 o5l [ o5_ $l -o5| l $| o5| $| l o5* K Z2 o5k $z -o5_KO62 +o5_ K O62 o5K R0 *16 o5k o3n o5% K L7 @@ -51377,7 +43258,6 @@ o5k i3r o5k i0s o5k D3 o5K ,4 -o5K *16 R0 o5k +1 o5k +0 o5k $! @@ -51402,14 +43282,14 @@ o5J $! ] o5j [ o5j o5I Z2 -o5iY4O21 -o5iO86 -o5iO81 -o5iO21Y4 +o5i Y4 O21 +o5i O86 +o5i O81 +o5i O21 Y4 o5i o0X o5i i6h o5i ^A -o5i *85 .3 +o5i .3 *85 o5_ i7s o5/ i78 o5+ i7= @@ -51424,27 +43304,24 @@ o5i *57 o5i *56 o5) i5@ o5- i3t -o5@ i3c o0K -o5i .3 *85 o5. i3, o5. i2s o5i ^2 o5= i2= o5+ i19 Y1 o5i *12 -o5$ i0$ o5I o5i } $. o5i o5h y5 y5 -o5hO31 -o5hO21D2 +o5h O31 +o5h O21 D2 o5h ^p o5h oA@ o5h o6a o5H $o o5H i5 -o5hD2O21 +o5h D2 O21 o5h .9 o5h ] o5g Z2 p3 @@ -51467,39 +43344,34 @@ o5g *23 o5g *12 o5G -0 o5g -0 -o5fY1O71 -o5fO71Y1 -o5fO71 -o5FO12*27 +o5f Y1 O71 +o5f O71 Y1 +o5f O71 +o5F O12 *27 o5f ^T R5 -o5f t K +o5f K t o5f R5 .7 o5F o83 -3 o5f o4w o5F o4D o5f o0y -o5f K t o5f ^k o5f i3E [ o5F $F o5f ^c D2 -o5f C *43 -o5f .7 R5 +o5f *43 C o5f +7 o5F ,6 o5f *53 o5f *52 -o5f *43 C o5f *42 o5f ^4 -o5F -3 o83 o5f *23 o5f *06 -] o5F ^@ o5F $( o5f o5E Z1 -o5EO32^F +o5E O32 ^F o5E T4 y4 o5e T1 o5e s9. @@ -51513,16 +43385,14 @@ o5E i5G o5e i2q o5e [ D2 o5e ^b -o5e *41 ,3 +o5e ,3 *41 o5? E .4 o5e .4 -o5e ,3 *41 -o5* ^E o5e [ } o5e ] o5 $e o5d Z2 -o5Dy3O62 +o5D y3 O62 o5d y3 o5D T7 o5D r *76 @@ -51534,47 +43404,42 @@ o5d o0p o5D K o5& D8 o5D $6 o6@ -o5D *67 o5D $6 ^@ o5& D6 o5D *57 o5* D1 o5. D0 ^@ o5d -o5c Z3 u -o5CO03$8 -o5cO02$4 -o5c ^V o5c u Z3 -o5C T4 +6 -o5c T3 o4i +o5C O03 $8 +o5c O02 $4 +o5c ^V +o5C +6 T4 +o5c o4i T3 o5c o9- o5= c o6T -o5c o4i T3 o5c o0D o5C $k o5c K o5c ^k o5C [ i5- o5c i34 -o5C$8O03 +o5C $8 O03 o5c *72 o5C ,7 o5c $7 -o5C +6 T4 [ o5C ^6 o5c *57 o5c *52 o5- c $5 -o5c$4O02 +o5c $4 O02 o5c .4 o5c *37 o5c [ o5, c } } o5c -o5bO73 +o5b O73 o5B ^W u -o5B u ^W o5b o1e o5b i5/ o5b D7 @@ -51588,8 +43453,7 @@ $$ o5b o5A y5 { o5a y3 o5a y2 -o5* ^a Y1 -o5AO63 +o5A O63 o5A o7% o5a o6g o5a o2A @@ -51609,7 +43473,6 @@ o5a ^! o5- ^a $% o5a ^* o5a -o59 t } o59 } t o59 r o59 o31 @@ -51628,13 +43491,11 @@ o58 R6 *43 o5/ +8 p4 o58 p1 +7 o58 o3d -o58 o0D ,6 +o58 ,6 o0D o58 D4 Z1 o58 C { o5@ *87 -o58 ,6 o0D o5$ *85 -o58 *43 R6 o58 *14 o58 [ o5_ $8 @@ -51644,7 +43505,6 @@ o57 Y2 Y2 o57 ^K o57 i6z o57 $b -o5! *75 o2k o57 *04 o5^ '7 -0 o57 $% @@ -51652,11 +43512,9 @@ $- o57 o56 Y4 o56 y3 o56 T6 $! -o56 $! T6 o56 o4d o56 i52 o56 C -o5* *67 o56 $5 o5@ *65 o56 *43 @@ -51678,15 +43536,11 @@ o55 o95 o55 o7f o55 o67 o55 o44 -o5$ -5 o2# o55 o1M o55 o1f o55 ^m *65 o55 i5@ -o5- $5 c -o5@ *56 o55 $4 -o55 .2 o55 .0 o55 $= o54 y3 @@ -51697,9 +43551,7 @@ o54 o40 o54 k o54 i78 o54 i6a Y2 -o5? .4 E o54 D2 -o5$ .4 +9 o54 ,8 o54 *75 o5@ *45 @@ -51718,7 +43570,6 @@ o53 o08 o53 ^n o53 i4o t o53 E -o53 d t o53 D8 o53 'B o53 -6 @@ -51729,13 +43580,11 @@ o5& ,3 o5_ +3 [ o5 ,3 o5- +2 Z2 -o52O84 +o52 O84 o52 smu o52 o6_ o52 o4* o52 o1d L2 -o52 L2 o1d -o52 l o52 i5e o52 ^i o52 ,9 @@ -51743,19 +43592,14 @@ o52 *76 o52 +6 o52 -6 o52 *56 -4 -o52 -4 *56 -o5! *23 +6 o5. *20 Z3 o5. ] ,2 -o5. ,2 ] $$ o52 -o51 Z5 t +o51 t Z5 o51 ^z o51 y1 i03 -o51O21 -o51 t Z5 +o51 O21 o51 T0 -[ o51 sez o51 p1 c o51 o8l o51 o82 @@ -51782,7 +43626,6 @@ o50 Y3 o50 Y2 o50 stk o50 o34 -o50 l y5 o50 ^L ^K o50 K o50 i2s @@ -51791,9 +43634,7 @@ o50 $b o50 +A o50 ,8 Z2 $O $5 *08 -o5^ -0 '7 o50 } *64 -o5/ +0 .3 o50 } o5+ -0 $$ o50 @@ -51802,24 +43643,20 @@ $O ^5 o5+ $. o5& { o5& -o5* ^* o5$ $$ o5@ $! o5' o5/ o5? $! -o5! ^@ o5_ ^@ o5> $o +5 -$@ o5@ $! o5@ ] o5& ] o5; ^( o5. -o4z y5 t -o4z y5 o4z t y5 +o4z y5 o4Z R5 o4z p5 i6n o4z i7y @@ -51829,15 +43666,13 @@ o4Z C o4z ^A o4z *96 o4Z +5 -o4* Z4 ^w +o4* ^w Z4 o4- z1 si5 -$! o4! Z1 o4z .1 o4z $. o4y y5 y5 o4Y Y2 t o4y Y2 -o4Y t Y2 o4y r o4y i3- o4Y c ] @@ -51857,25 +43692,23 @@ o4y *24 $? o4y $? *24 [ o4@ Y1 o4y ^0 -o4xO71 +o4x O71 o4x T2 o4x o3I o4x o0z o4X o0W .2 o4X i5n o4x i4- -o4/O81 -o4_O72 +o4/ O81 +o4_ O72 o4x *63 -o4.O63 -o4_O61 +o4. O63 +o4_ O61 o4x *60 -o4 O51 -o4X .2 o0W +o4 O51 o4x *05 -o4* ^w Z4 o4w z1 ,6 -o4wO52 +o4w O52 o4w u o4W snl o4W s3h @@ -51888,7 +43721,7 @@ o4w D8 r o4w +6 o4w -5 o4w *32 -o4vO31 +o4v O31 o4V u o4v sgo o4v o7c @@ -51897,11 +43730,10 @@ o4v o5e o4v o3g o4V o0S o4v i2p ^m -o4v *52 o4v ^3 *46 o4v *23 o4u y3 -o4uO62 +o4u O62 o4U u o4u slq o4u scR @@ -51911,7 +43743,6 @@ o4U i5P o4u i4v o4u i3L o4u i2t -o4u *52 o4u *17 o4u $1 o4u $# @@ -51923,7 +43754,6 @@ $> o4u o4t y2 o4t $T o4t $P D7 -] o4T o5V o4T o5S o4T o2R o4t i5w @@ -51937,8 +43767,6 @@ o4T *76 ,5 o4t ,7 +5 o4* T7 o4T -6 c -o4T ,5 *76 -o4t +5 ,7 o4 t *57 o4* t *45 o4$ T3 ,2 @@ -51948,7 +43776,6 @@ o4t -3 o4@ T1 o4. T1 o4t *01 -[ o4 T0 o4t -0 o4T $# o4@ ^T @@ -51958,8 +43785,6 @@ o4s $r o4s o9@ o4S o3J o4s ] ^n -o4s ^n ] -o4- si5 z1 o4s *62 o4s *47 o4S ,3 @@ -51969,7 +43794,6 @@ o4s $# $* o4s $? o4s $_ o4s -o4R y2 E o4R sR< o4r R5 *42 o4r o3@ @@ -51981,7 +43805,6 @@ o4r ,8 o4r ^8 o4r .7 o4R ,6 ^ -o4r *42 R5 o4# R3 o4r $2 o4R $0 @@ -51991,12 +43814,11 @@ o4. r $! o4r { o4r o4q o5p -o4. q D0 -o4q +7 o4. q [ +o4q +7 o4q o4p ^y -o4pO53 +o4p O53 o4p u o4P o3s o4p o3e @@ -52056,18 +43878,14 @@ o4N o3M o4n $N o4N i60 o4N i50 Y3 -o4n C *53 -o4n *82 o4n *53 C +o4n *82 o4N $1 o4N $? o4n { o4- $n -o4M z3 z3 o4m y4 -o4M ^y -o4mO21i0W -o4m o0g +o4m O21 i0W o4m i0J o4m d o4M c @@ -52082,7 +43900,7 @@ o4m *28 o4m $! o4l y3 p3 o4l y2 -o4l t *34 +o4l *34 t o4l sr& o4l o3P o4L i6v @@ -52091,8 +43909,6 @@ o4L ^C o4l c o4l +6 *34 o4l $4 -o4l *34 t -o4l *34 +6 o4_ L2 y2 o4L *25 o4l +2 @@ -52102,8 +43918,8 @@ o4l $= o4l ^; o4l o4k y5 -o4#^KO65 -o4kO63 +o4# ^K O65 +o4k O63 o4k o3o o4k i4u o4k i47 @@ -52119,26 +43935,22 @@ o4k -0 o4_ ^K } o4k o4j Y3 -o4JO51 -o4JO31 +o4J O51 o4j t *46 o4j smf p1 -o4j p1 smf o4j o7! o4J i6y o4J i4T o4j i4O -o4J D3 } o4j $c -o4j *46 t o4j $2 o4j -2 o4j +1 o4 $J o4i Y2 *72 o4i y2 -o4iO92 -o4iO01 +o4i O92 +o4i O01 o4I u o4i t d o4i R6 @@ -52146,7 +43958,6 @@ o4i o8, o4i o6u o4i o3D o4i k ^K -o4i d t o4i d $o o4I C o4I *63 @@ -52186,15 +43997,14 @@ o4F i4s o4f i3c o4f i2d o4f $F -o4fdO94 +o4f d O94 o4f D2 o4f D1 o4f *75 o4F *21 -o4f +1 o4, ^F o4f [ -o4eO13 +o4e O13 o4e ^s o4E L7 o4e i6e @@ -52208,18 +44018,14 @@ o4 E o4e o4D y2 y5 o4d Y1 c -o4DO31-2 -o4DO31 -o4D o1C +o4D -2 O31 +o4D O31 o4d i6r o4d i4l -o4d c Y1 -o4D 'A *40 -o4d *89 o4D *40 'A +o4d *89 o4@ D3 *57 o4d *34 -o4D-2O31 o4d { -1 o4d *05 $* o4d @@ -52234,38 +44040,33 @@ o4 C $! o4C o4c } } o4( c -o4bO53 -o4bO13u -o4bO12 -o4buO13 +o4b O53 +o4b u O13 +o4b O12 o4b t p1 o4B $s *84 -o4b p1 t o4b o6t { o4B ^C o4b ^A o4B *84 $s o4b +3 o4b $3 -o4B$0O72 +o4B $0 O72 o4b $! $! o4b $- o4b -o4az4O07 +o4a z4 O07 o4a Y3 o4a ^Y o4a u d o4a sth o4a $R o4a oA_ -o4A l ^h o4A ^h l -o4a d u o4A ^D o4a 'B o4a *21 o4a *15 } -o4a *12 o4* ^A o49 u o49 o8@ @@ -52276,24 +44077,22 @@ o49 i53 o49 i0g i1v o49 ^g o49 ^7 -o4=*94O62 +o4= *94 O62 o49 +2 -o4$ *91 ,8 +o4$ ,8 *91 o4 $9 o4 '9 $. o49 $, o49 $- o49 -o48O71 +o48 O71 o48 u d o48 ^T C o48 o6t o48 o1s } $o *48 $n o48 i7| -o48 d u -o48*96O12 -o4$ ,8 *91 +o48 *96 O12 o48 *53 o48 .5 o48 .1 @@ -52303,7 +44102,6 @@ o4< +8 o47 Z2 [ o47 [ Z2 o47 } $z -o47 y1 u o47 u y1 o47 r o47 o3* @@ -52314,9 +44112,9 @@ o4_ ,7 $. { o47 o47 o46 y3 -o46O53 -o46O03i4u -o46O01 +o46 O53 +o46 O03 i4u +o46 O01 o46 ^w o46 $r o46 $g @@ -52324,7 +44122,6 @@ o46 D5 o46 $. .8 o4@ *67 o46 ,3 -o4? *63 o46 *24 o46 ^1 o46 $! @@ -52338,14 +44135,11 @@ o45 i78 o45 i75 o45 E ,9 o45 DA -o45 ,9 E o45 ,8 -o4 *57 t o45 *78 o45 *74 o45 *34 ^f o4, *52 -o45 *14 T9 o45 *14 o45 $! o4@ +5 @@ -52356,13 +44150,11 @@ o44 T7 o44 $c $$ o44 c o44 '6 -o4* *45 t o44 .5 o44 ^4 o44 ] o44 [ o4# ^4 -] o44 o43 Y4 c o43 R3 o43 o6@ @@ -52379,33 +44171,28 @@ o43 *54 o43 ^4 o43 *27 ,7 o4# *32 [ -o4$ *32 o4* +3 o4. +3 o4. .3 o4- -3 $. o43 o42 Y3 o2d -o4$ ,2 T3 o42 p4 o7. o42 o58 o42 o2d Y3 -o4@ .2 i4e o42 $i o42 E D3 -o42 D3 E o42 $d o42 *40 ^u o42 $4 o42 ^4 o4@ *24 -o4$ *23 o42 +2 o42 .1 o42 *04 $# o42 } o42 -o41O52 +o41 O52 o41 T7 o41 T5 o41 ^s @@ -52432,24 +44219,21 @@ o4- +1 o4_ ,1 o4_ ^1 o4 $1 -o40O93 -o40O71i13 -o40O62 +o40 O93 +o40 O71 i13 +o40 O62 o40 o8@ o40 o54 i4- o40 $k o40 i2g ^o *40 ^F o40 c $@ -o40 $@ c o40 *97 -o4- *08 *71 o40 *85 o40 *78 o40 *73 o40 ^7 o4- *07 -o4- *03 o4* *02 o40 $, o4_ $0 @@ -52458,7 +44242,6 @@ o40 o4% o4# o4* [ -o4@ ^ o4( $) o4( o4! @@ -52472,18 +44255,15 @@ $- o4- $_ o4_ o3z Z5 u o3z y4 -o3zO61 -o3z u Z5 +o3z O61 o3z $r -$@ o3z o8A o3z o4@ o3z $f -o3z ,9 *43 +o3z *43 ,9 o3z $9 o3z *70 o3z *58 o3- Z4 Z4 -o3z *43 ,9 o3z .2 o3z -2 o3z *14 Y2 @@ -52495,12 +44275,11 @@ $. o3z o3y y5 t o3y y5 ] o3y ] y5 -o3y t y5 o3y o2V o3y ^j o3y ^A o3y *72 -o3y *65 *12 +o3y *12 *65 o3y .4 o3* y4 o3@ y4 @@ -52508,7 +44287,6 @@ o3$ y3 y3 o3y *31 o3@ Y3 o3- y2 -o3y *12 *65 o3* y1 +2 o3. Y1 o3y [ @@ -52525,20 +44303,18 @@ o3X E *21 o3x $c o3x -5 $p o3x *57 -o3-O52*04 -o3.O51l -o3+O41 +o3- O52 *04 +o3. O51 l +o3+ O41 o3x .4 -o3X *21 E -o3$O01 +o3$ O01 o3! $x o3w Y2 -7 -o3wO61 +o3w O61 o3w sC4 o4$ o3w ^q o3w $p o3w o4z -o3w o4$ sC4 o3W o0K o3W ^E o3w +9 @@ -52552,30 +44328,27 @@ o3v $A o3v *67 *02 o3v *67 o3v ,5 -o3v *02 *67 o3v *02 o3v { -o3uZ3O52 +o3u Z3 O52 o3u ^z o3u y5 E o3u y2 -o3uO52Z3 +o3u O52 Z3 o3u u K o3u o4. o3u o2i -o3u K u o3u K $! o3u k o3u i2t ] o3u ] i2t -o3u D7 *50 -o3u $A o3u *50 D7 +o3u $A o3u [ *31 o3u *03 ^B ^! o3u -o3tO52 -o3tO51 +o3t O52 +o3t O51 o3T T8 o3T T4 o3t r ^n @@ -52587,16 +44360,14 @@ o3* T2 o3@ T2 o3t *12 o3% T1 -^< o3t o3s z2 o3s y3 o3s Y2 -o3sO63 +o3s O63 o3S u r o3s so# o3S s20 o3s s17 -o3S r u o3s R6 o3s p1 o3S o5l @@ -52616,10 +44387,6 @@ o3s *67 o3S .6 o3s ^4 o1K o3s *45 -o3S +1 o4h -o3s *16 +7 -o3s *13 L0 -o3s $! -0 o3s -0 $! $% o3s o3r r -6 @@ -52636,9 +44403,8 @@ o3r +0 o3r $. o3_ r ^% o3r ] -^% ] o3r -o3qO72 -o3qO52 +o3q O72 +o3q O52 o3q $p *57 o3q o0g o3q *75 @@ -52652,16 +44418,15 @@ o3q *03 o3p Z1 o3p y4 Y1 o3p Y1 y4 -o3pO51 +o3p O51 o3 ^p t -o3pp1O06 +o3p p1 O06 o3p ^k o3p i6. o3P i0L o3p ^G k o3p D4 ^e o3p D1 i4b -o3p -8 *64 o3p *64 -8 o3p -5 o3p -4 @@ -52671,15 +44436,14 @@ o3P $% o3) ^p ^, o3p o3O Z2 y3 -o3oZ1O41 +o3o Z1 O41 o3O y3 Z2 o3o y2 -o3oO41Z1 +o3o O41 Z1 o3o u p1 -o3o u *62 +o3o *62 u o3o s9- o3o $S -o3o p1 u o3o o2c o3o o0a o3o o02 @@ -52690,15 +44454,13 @@ o3o D1 o3o +A o3* o7q o3. o7g -o3< o7? o3. o66 -o3o *62 u o3. o5k o3 o56 o3? o4a o3+ o48 o3O ,4 -o3o*37O43 +o3o *37 O43 o3o +2 y2 o3. o2y o3# o2F @@ -52711,7 +44473,7 @@ o3@ o0A o3$ o0# o3O { o3o -o3ny4O41 +o3n y4 O41 o3n D1 o3N c +5 o3N +5 c @@ -52723,12 +44485,10 @@ o3m ^r o3m o6f o3m o0Z o3M o0c -o3m o0c o3m ^L o3m i6M c o3M i3Y o3M i2I -o3M D2 o3M -6 i0N o3m $4 o3m .4 [ @@ -52737,8 +44497,6 @@ o3M $2 $- o3m o3l y4 o3L Y1 *41 -o3.lO51 -o3L R2 ] o3L ] R2 o3l ^J o3l ^I @@ -52753,26 +44511,22 @@ o3l ,1 o3l [ *01 o3& l ] } o3K z2 -o3kO51u +o3k u O51 o3k $w -o3kuO51 -[ o3K T0 o3K o6A -o3Ko5RO41 +o3K o5R O41 o3k o0v -o3k l *34 +o3k *34 l o3K $k o3k i7f o3k i5r ^1 o3k i5. -o3kD0O91 +o3k D0 O91 o3- K ^B o3k .7 o3k *61 o3k $6 o3- k $6 -o3K *47 -o3k *34 l } o3K *30 o3k *14 [ o3@ k *05 @@ -52780,12 +44534,11 @@ o3k $0 ] o3- K o3k $% $. o3k -o3jy5O47 +o3j y5 O47 o3j y5 -o3jO02 +o3j O02 o3J u o3J i2P -o3J D4 o3j d *20 o3J D1 -0 o3j D1 @@ -52795,19 +44548,17 @@ o3j $5 o3@ $j -5 o3j *25 o3j *24 -o3J -0 D1 o3j +0 o3& ^J $@ o3J $. o3j o3i Z2 o3i Y1 { -o3iO02^G +o3i O02 ^G o3i p1 o3i o4s -o3i i3t c -o3i DA *A8 o3i c i3t +o3i DA *A8 o3i C o3i $8 o3i *76 @@ -52820,14 +44571,12 @@ o3 i33 o3@ i3_ o3 i0g o3 i0a -o3@ i04 o3i } o3h Z5 *31 -o3hO62 -o3HO42 +o3h O62 +o3H O42 o3H o7S o3h o5o -o3H o5l o3H i3E o3h +7 o3h *65 @@ -52838,36 +44587,30 @@ o3h $$ o3h $! ] o3h o3g y4 -o3gO61u -o3guO61 +o3g O61 u o3G u D1 o3g R0 o3G q o3g o6e o3g $k K o3g i4B -o3g E *54 -o3G D1 u +o3g *54 E o3g [ d o3g +7 o3g ,6 $% o3g +6 o3g *57 -o3g *54 E o3g *20 o3G $1 o3g -0 o3f Z1 o5q -o3fO43 -} o3f shv -o3f R7 *52 +o3f *52 R7 o3f o5q Z1 o3F o5I o3f o0q o3F i38 o3f $A o3f -8 -o3f *52 R7 o3f +5 o3f ,4 o3f -2 @@ -52881,12 +44624,10 @@ o3e o5- k o3e o54 o3e o2h p1 o3e $O -o3e l i0| +o3e i0| l o3e ^l -o3e k o5- o3e K o3E i1A -o3e i0| l o3e *46 $# o3e $# *46 o3e *40 @@ -52897,39 +44638,31 @@ o3 ^E o3 E o3^ E o3e ^_ -o3DY2O53 +o3D Y2 O53 o3d o8t o3d o7o o3D o4u *12 o3D o40 o3d i1l -o3d i0J o3D E ,2 o3d *46 o3d *45 o3D *42 o3 D4 o3D ^3 -o3D ,2 E o3d *25 -o3d *24 +1 -o3D *12 o4u o3d +1 *24 o3. d o3! ^d o3c Z1 C -o3cO72 o3c $x *62 -$!o3cO12 +$! o3c O12 o3c sa4 o3c o5$ o3C o2s C o3C ^N -o3= c i4d o3c i3p -o3c i0m o3c D1 -o3c C Z1 o3c *62 $x o3c *23 o3# ^C *13 @@ -52957,7 +44690,6 @@ o3a y5 o3A y4 o3A y3 *20 o3a sAu -[ o3a s2f o3a R4 o3a $p o3a [ o4c @@ -52971,8 +44703,6 @@ o3a k o3a i5c o3a i29 o3a ^a -o3a -4 o2y -o3a *46 o3a -3 o3a $# $1 o3& ^A @@ -52994,7 +44724,6 @@ o39 o38 Z4 -6 o38 ^t o38 r i5p -o38 R4 o38 o4X o38 o4 o38 -2 @@ -53047,33 +44776,27 @@ o34 i5b o6g o3# *47 o3. *45 $- o3. $- *45 -o34 *31 +o34 *13 o34 .2 o3 *42 -o34 *13 $* o34 o33 y3 ^@ o33 Y1 -o33O41 -o33 sy_ D5 +o33 O41 +o33 D5 sy_ o33 $S o33 o93 o33 o2< o33 o0X y1 o33 K o33 i73 -o33 D5 sy_ o33 D0 o33 c *42 o33 C o33 $A -o3 *35 o1f o3+ *35 o3& *35 -o3? *35 $? o3? $? *35 -o33 *42 c -o3- *34 o33 *34 o33 ,2 o3( *31 [ @@ -53083,7 +44806,7 @@ o3. ^3 $? o33 o32 Z1 *27 o32 Y3 o0@ -o32O52 +o32 O52 o32 svr o32 s59 o32 o5B @@ -53091,11 +44814,9 @@ o32 o13 o32 o0@ Y3 o32 ^l o32 i27 .1 -o32 ^A o32 *8A o32 +5 o32 ,5 -o3- -2 ,5 o32 $4 o32 $3 o32 +2 @@ -53111,13 +44832,11 @@ o3- ^2 [ o32 o31 z1 o31 T1 $$ -o31 $$ T1 o31 p4 ^d o31 ^N o31 i7Y o31 $f o31 D5 -^o *31 +6 o31 ,4 o31 *21 ^, o3_ *12 @@ -53126,18 +44845,14 @@ o31 } o31 ] o3$ $1 o31 -o30O65 -o30 t ,4 -] o30 t +o30 O65 +o30 ,4 t o30 o5u o30 { i0m o30 -7 *12 o30 *65 o3- ^0 ,5 -o3-*04O52 -o30 ,4 t o30 *24 -o30 *12 -7 o30 *02 { o30 $? o30 $_ @@ -53159,8 +44874,8 @@ o2z $Z o2Z y4 l o2z Y4 o2z y4 -o2zO5B -o2zO52 +o2z O5B +o2z O52 o2z ssd o2z $Q o5z o2z p3 @@ -53170,7 +44885,6 @@ o2z o3f o2z o3b o2z o3. o2z o02 -o2Z l y4 o2z i2t o2z $5 o2- z3 @@ -53183,19 +44897,16 @@ o2z ] o2. ^z $@ o2z o2y Y3 -^@o2yO62 o2y se o2y R8 o2y r o2y p4 $x o2y o0Y ] o2y $M -o2y k ,4 +o2y ,4 k o2y i2z o2Y c $% -o2Y $% c o2y *61 -o2y ,4 k o2- Y4 o2_ y3 o2- y2 K @@ -53205,21 +44916,18 @@ o2+ y2 o2, y2 o2y *04 $. o2y -o2xO52 +o2x O52 o2x ^U *43 o2x t D9 o2x $R o2x $p o2x o0j o2x ^l -o2x D9 t -o2x +6 *02 +o2x *02 +6 o2x *54 o2x +5 o2x *47 +7 o2x +3 i3v -[o2@O32 -o2x *02 +6 o2x *02 o2X $! o2X @@ -53227,11 +44935,10 @@ o2x $? o2w Z2 o2w Y5 $L o2w y5 -o2WO01T4 +o2W O01 T4 o2w t o2w $s o2w r -o2w o1s [ o2w K o2w i6m o2w i4o @@ -53243,20 +44950,18 @@ o2w -3 o2w *16 o2w $@ ] o2w -o2V Z5 Z4 o2V Z4 Z5 o2v Y2 -o2vOA2 -o2vO51 +o2v OA2 +o2v O51 o2v sbx o2v r -o2v q l +o2v l q o2v $q o2v ^p o2v o7p o2v o4s o2v o1k -o2v l q o2v ^j o2v i4T o2v $d @@ -53269,7 +44974,7 @@ $? o2v o2U y5 K o2u y4 o2u y3 -o2uO82 +o2u O82 o2u $+ p5 o2u o4k o2U K y5 @@ -53284,10 +44989,9 @@ o2 u $- o2u ] o2u o2u -o2t y5 u -o2t Y4 Y4 -o2TO31E o2t u y5 +o2t Y4 Y4 +o2T O31 E o2t u d o2t $s o2t o73 Y4 @@ -53299,8 +45003,6 @@ o2t $O o2T l o2- t K o2t ^H -o2TEO31 -o2t d u o2t D6 o2T D5 o2t $d @@ -53314,46 +45016,40 @@ o2T .4 o2S y3 o2s y3 o2s Y2 -o2sO41 -o2sO31 +o2s O41 +o2s O31 o2s t T3 o2S T8 -o2s T3 t o2S T1 *54 o2s $s -6 o2s s36 *64 o2s o7b o2s o6n o2s i86 -o2Si0nO51 +o2S i0n O51 o2( s9) $. o2s *74 o2s *70 o2s -6 $s -o2s *64 s36 o2s *57 +0 -o2S *54 T1 o2s .5 -o2s +0 *57 o2s +0 *04 o2s +0 -o2ry4O42 +o2r y4 O42 o2R o1V o2r o0t -o2R k .4 +o2R .4 k o2r ^K o2r i3g o2r i1v p3 o2r i0O o2r $e -o2r D6 *23 +o2r *23 D6 o2r +7 o2r $7 o2r *54 o2r *52 -o2R .4 k o2R $4 -o2r *23 D6 o2r -0 o2r $$ o2r $@ @@ -53363,8 +45059,8 @@ o2_ r $! o2r o2Q z1 *14 o2q ^z -o2qOA1 -o2qO32 +o2q OA1 +o2q O32 o2q $x o2! q q o2q K @@ -53380,7 +45076,7 @@ o2q $@ o2p u o2P t o2p o5y -o2P^MO12 +o2P ^M O12 o2P k o2p ^K o2p ^k @@ -53417,21 +45113,18 @@ o2N o3M o2n o0s o2n $M o2N i5R -o2n c *78 -o2N ^A o2n *78 c -o2n *75 +o2N ^A o2n *70 o2n *60 o2n $5 -o2n ^3 o2n *17 ] o2n ] *17 o2n *14 o2n ,1 ^[ o2n ^& $/ o2n -o2m Z2 c +o2m c Z2 o2M y5 l o2m y2 o2m Y1 $0 @@ -53440,7 +45133,6 @@ o2m u o2m spI o2m o0R o2m $O -o2M l y5 o2m K o2m ^k o2m i7 @@ -53449,7 +45141,6 @@ o2m i5f o2m i4f o2m i2t o2m $G -o2m c Z2 o2M .6 *46 o2m .6 o2m *57 @@ -53464,7 +45155,7 @@ $. o2m $? o2m o2l t o2l p5 -o2L l *41 +o2L *41 l o2l i72 o2l i3f o2l i3@ @@ -53474,23 +45165,19 @@ o2L D5 o2l .8 o2l *74 o2l .6 r -o2L *41 l o2l *36 o2l *13 o2l .0 o2l ] -] o2l ] ] ] o2l o2k Z2 o2k y3 o2- K y2 -o2kO81 -o2kO52 -o2kO45u -o2kO41 -o2KO31*14 -o2kuO45 -o2- K t +o2k O81 +o2k O52 +o2k O45 u +o2k O41 +o2K O31 *14 o2k sk@ *02 o2k o5r o2K o3O @@ -53504,26 +45191,22 @@ o2k D6 $h o2k ,8 o2k +6 [ o2k ,1 -o2k *02 sk@ o2j Z1 ^A o2j $z o2j y4 -o2jO45 +o2j O45 o2j $@ ^t -o2J p4 l +o2J l p4 o2j p1 o2j o5s o2j o4r l o2j o48 o2j o3u o2j o3g -o2J l p4 -o2j l o4r o2j k -1 o2j K o2j ^k o2j i3a -o2j ^A Z1 o2j +7 [ o2j .6 o2j *56 @@ -53534,15 +45217,12 @@ o2j $@ o2j ^, $, o2j o2i Y1 -o2iO73 +o2i O73 o2I u o3B o2i u ^A -o2I o3B u -o2I l D1 -^! o2i D4 o2I D1 l +^! o2i D4 o2i ^b -o2i ^A u o2i $9 o2- i4a o2i *30 @@ -53559,11 +45239,11 @@ o2i $# { o2i o2h y5 { o2h { y5 -o2hY3O34 +o2h Y3 O34 o2h Y2 -o2h u *9A +o2h *9A u o2h ssz *73 -o2H $s i0G +o2H i0G $s o2h o1t o2h o0f o2H o0B @@ -53572,12 +45252,8 @@ o2h i6u o2h i6i o2h i1v L4 o2H i0N -o2H i0G $s o2h D5 -o2h D4 o2h ^a -o2h *9A u -o2h *73 ssz o2h *31 o2h *27 o2h *03 @@ -53590,11 +45266,10 @@ o2G o1I Z1 o2g l o2g k o2g i2c -o2gfO59 +o2g f O59 o2g D1 o2g $8 o2g *46 -o2g *35 R1 o2g *31 o2g *20 o2g ^# @@ -53616,8 +45291,8 @@ o2f $/ o2e Y4 o2e Y2 +0 o2% E Y2 -o2eO42y3 -o2e t d +o2e O42 y3 +o2e d t o2e R7 o2e o6t o2E o1S @@ -53625,9 +45300,7 @@ o2e o0f o2e k D4 o2E i3l z1 ] o2e E -o2e d t o2e D7 -o2e D4 k o2e -7 o2e +3 o2e +0 Y2 @@ -53665,11 +45338,10 @@ o2_ ^d o2C z4 ,5 o2c Z1 s1d o2c y5 -o2cO81 -o2cO52[ +o2c O81 +o2c O52 [ o2c ^v o2c s8# -o2c s1d Z1 o2C o5l o2C o0A o2c i4+ @@ -53686,13 +45358,12 @@ o2, $c o2 ^c o2B y5 l o2b y4 -o2bO63 -o2bO46 -o2bO02y3 +o2b O63 +o2b O46 +o2b O02 y3 o2b u .1 o2b son o2b o3s -o2B l y5 o2b i51 o2b i3W o2b i3. @@ -53702,22 +45373,18 @@ o2B .6 o2b *56 o2b *34 $! o2b $! *34 -o2b *31 o2% ^B *20 -o2b .1 u o2b $1 o2B *02 o2b *02 o2a Y4 o2a y2 y2 o2A y2 -o2AO72T5 -o2aO71 -o2aO63*63 -$_o2AO32 -o2aO31 +o2A O72 T5 +o2a O71 +o2a O63 *63 +o2a O31 o2a ^v *46 -o2AT5O72 o2A svm o2A p1 E o2a o1w @@ -53752,7 +45419,6 @@ o28 o17 o28 o0s o28 -6 *13 o2- *84 -o28 *13 -6 o28 ^1 o2@ '8 $# o28 @@ -53771,18 +45437,16 @@ o2@ *64 o26 $* o2} '6 ^{ o2= $6 -o25O01 -o25 ^j +o25 O01 o25 ^F o25 D9 o25 *52 o25 ,3 +0 ^* o25 -1 -o25 +0 ,3 o2# -5 o2, +5 o24 y2 -o24O01 +o24 O01 o24 ^o $o *24 i2c o2/ *46 @@ -53794,15 +45458,14 @@ $. o24 o23 Y3 o23 y2 o23 y1 -o23O61 -o23O41i2c +o23 O61 +o23 O41 i2c o23 srR o2. ,3 p1 o23 o9D o23 ^k o23 k o23 i0f -o2$ ,3 D6 o23 *75 $+ o23 $+ *75 o23 +5 @@ -53817,7 +45480,6 @@ o22 T1 o22 T0 o36 o22 R8 o22 R4 -o22 o36 T0 o22 o0a o22 i5- o2. *29 @@ -53828,23 +45490,19 @@ o2@ *25 o2 *20 o2 $2 o21 $x -o21 o52 [ o21 K o21 $j o21 ^B o21 *83 o21 ,4 y1 -o21 *34 o2@ *13 o21 ^! -o2$ ^1 o2; +1 $. o21 o20 Y4 ] -o20 l $d +o20 $d l o20 l o20 i3@ -o20 $d l o20 ^c o20 c o20 *76 @@ -53864,7 +45522,6 @@ $@ o2_ $ o2 } o2@ ^[ o2] -^) o2) o1z z3 *36 o1z Y2 ^x o1z ^x Y2 @@ -53872,10 +45529,9 @@ o1Z q o1z o64 o1z o56 o1z o44 -o1z o2i k +o1z k o2i o1z L0 o1Z K p1 -o1z k o2i o1Z i73 o1z i4y o1z ^h r @@ -53895,31 +45551,26 @@ o1y +4 o1y -4 o1y *24 o1$ y2 *21 -o1Y ^1 u o1* y1 t o1y *06 o1y -0 o1_ ^Y { o1y -[ [ o1y ^@ o1y o1x Z1 o71 o1x Z1 E -o1xO35 +o1x O35 o1x R3 o1x R2 o1x p1 o1X o5t o0@ -o1X o0@ o5t -o1x E Z1 o1x *53 -o1X *20 o1X *06 $! o1X $! *06 o1w ^z o1W y4 c o1w y3 y3 -o1wO01.2 +o1w O01 .2 o1w ^s o1w p4 ,5 o1W o31 @@ -53931,25 +45582,24 @@ o1w ^D o1w *51 o1w -0 o1w { -o1vO61 -o1vO34 -o1VO31*53 +o1v O61 +o1v O34 +o1V O31 *53 o1v t o1v sv0 o4d o1v s2g -o1v o4d sv0 o1v o22 o1v K -o1vi3cO32 +o1v i3c O32 o1v ^d o1v ^b o1v *64 [ o1V *60 $. o1V o1u Y4 -9 -o1uO65 -o1uO54 -o1UO41-0 +o1u O65 +o1u O54 +o1U -0 O41 o1U u o1u sm4 o1u R0 @@ -53959,25 +45609,20 @@ o1u *41 o1u *34 y5 o1u -3 o1u $1 -o1U-0O41 o1U *01 o1u $/ { o1u ] o1u o1T z1 o1t y1 ^a -o1* t y1 o1t $m o1T k $2 o1t i58 o1T i0! -o1T -8 o1t -7 o1@ T5 ^. o1t -5 -$O $1 T3 o1T $2 k -o1& T2 o1@ T2 o1t *18 ^@ o1T @@ -53989,10 +45634,8 @@ o1# so) o1S k $4 o1s $g o1! se@ -o1s DB o1s D5 o1s ^B -o1s $7 o0w o1S $7 o1s *52 o1s ^4 ^w @@ -54000,15 +45643,13 @@ o1S $4 k o1s *34 i1& o1s -1 *06 o1_ s1@ -o1s *06 -1 o1s $0 o1s [ o1/ ^s o1R o0F -o1r k +8 +o1r +8 k o1r i2D c o1r ^h -o1r +8 k o1r $6 o1r $4 o1r *31 @@ -54027,8 +45668,8 @@ o1Q i5O o1q i2d o1Q .6 o1q *24 -o1pO01] -o1p]O01 +o1p O01 ] +o1p ] O01 o1p stW o1p ^r o1p o5W @@ -54041,13 +45682,12 @@ o1p ^@ D1 o1p $d o1P c -3 o1P -3 c -o1p *17 o0W o1P ^@ o1p o1p o1o y5 o1O Y2 k -o1oO32i2k +o1o O32 i2k o1O p1 *47 o1o o9e o1o o7. *23 @@ -54061,18 +45701,14 @@ o1o $F o1o DA o1o $d o1O c $9 -o1o ^b -o1O $9 c o1o +9 o1o .7 o1o *67 o1o -6 o1# o50 *32 -o1@ o4N o1o *32 o1o -3 o1* o3! -o1o *23 o7. o1^ o21 o1. o0e o1o *08 @@ -54089,26 +45725,21 @@ o1n d i5@ o1n -0 o1- ^N [ o1n -o1My4O62 +o1M y4 O62 o1m u *32 -o1M o55 o1M o41 -5 o1m o2P o1m o0d o1M l o1M K c o1M k $7 -o1M k *32 -o1mfO3A +o1M *32 k +o1m f O3A [ o1m E o1m D3 o1M c K o1m ^c o1M $7 k -o1M -5 o41 -o1m *32 u -o1M *32 k -o1m +3 o1m .0 o1M $% o1M $! @@ -54121,12 +45752,10 @@ o1l o2K o1L o0S ,7 o1l ^J o1L i3w -o1L ,7 o0S -o1L .7 +0 +o1L +0 .7 o1l +5 o1l +2 o1l *12 -o1L +0 .7 o1* ^L $! o1L o1k Y5 @@ -54138,18 +45767,15 @@ o1k o5, o1k i2g o1k i1, o1k D3 -o1K D0 -o1k *54 o1k $2 o1@ K o1k $- ^$ o1k -o1jy5O52 +o1j y5 O52 o1j Y4 o1j Y3 o1j r z2 o1j ^R -{ o1j o68 o1j $7 o1j $4 o1j *35 Y5 @@ -54157,7 +45783,6 @@ o1j +0 o1J [ o1j $! $. o1j -o1i Z1 ^@ o1i ^@ Z1 o1i Y4 o1i y4 @@ -54176,13 +45801,13 @@ o1- i3= o1= i1k o1. i0w o1- i0f -o1@ i0C +o1@ ^C o1@ ^I o1i ^@ $* o1i $? o1i -o1hO42 -o1hO32y4 +o1h O42 +o1h O32 y4 o1h $w o1H ^t o1h R0 @@ -54200,7 +45825,6 @@ o1G o4l o1g i4v o1g i3K o1g i1j -o1G $C z5 o1g *74 o1G $7 o1G *42 @@ -54208,14 +45832,13 @@ o1@ ^G o1g ] ] $! o1g o1f y4 -o1FO01.2 +o1F O01 .2 o1f $L o1f i5g o1f i1F o1f i14 i6r o1f D4 o1f ^6 -o1f *23 $! o1F o1f { o1f [ @@ -54225,8 +45848,7 @@ o1e y3 o1E Y2 [ o1E [ Y2 o1! E y2 -o1eO41 -o1eO31 +o1e O31 o1e o6i o1e o4F o1e i5_ p2 @@ -54254,12 +45876,11 @@ o1d *60 o1d +6 ] o1d *57 o1+ D5 -o1D *46 k o1d -3 -3 o1d $1 o1D o1d -o1cO23^e +o1c O23 ^e o1c u o1c ^s o1c o61 @@ -54269,14 +45890,12 @@ o1c ^M o1c i4n o1c i1s o1C f k -o1cdO82 +o1c d O82 o1c ^d ^h o1c ,A o1c *64 -o1C -5 .0 -o1c *43 o1C .0 -5 -o1@ ^C +o1c *43 o1c $@ o1c ^< o1) c @@ -54287,19 +45906,16 @@ o1b Z1 .0 o1B u k o1b o5a o1B o2F t -o1B k u o1b k $9 [ o1b i6- o1B i3q o1b i20 -o1b E '9 +o1b '9 E o1b ^d [ o1b $d o1b $9 k -o1b '9 E o1b -7 o1B *15 -o1b .0 Z1 o1b +0 o1_ ^B ^@ o1B @@ -54308,13 +45924,11 @@ o1A z2 o1A Z1 E o1a Y1 o7k o1a { y1 -$.o1aO72 o1a u d -o1A T4 *32 +o1A *32 T4 o1a T2 o1a sDK o1A s01 r -o1A r s01 o1a o7q o1a o6b o1A o58 @@ -54325,13 +45939,10 @@ o1a iB. o1a i4d o1a i1r o1a i1i -o1A E Z1 -o1a d u o1A c o1a *87 o1a $8 o1a *54 -o1A *32 T4 o1A *25 o1a *07 o1= ^A @@ -54340,17 +45951,15 @@ o1@ $a $. o1a o19 { $a ] o19 $9 -o19 *01 o19 .0 { o19 -o18O32 +o18 O32 o18 T2 o18 o60 o18 $O o18 i3. o18 ^C y3 o18 c $3 -o18 $3 c o18 *26 o18 *01 o18 -0 @@ -54363,9 +45972,9 @@ o1- } *72 o17 *15 o17 $+ o17 -o16O54 -o16O42 -o16p2O02 +o16 O54 +o16 O42 +o16 p2 O02 o16 '8 r o16 +3 o16 ] @@ -54373,7 +45982,6 @@ o16 o15 y2 o15 { o9+ o15 o4q o3h -o15 o3h o4q o15 *91 o15 *67 o15 .5 ^6 @@ -54384,14 +45992,13 @@ o15 $@ ^o *15 o14 Z5 Z5 o14 y4 -o14O31 +o14 O31 o14 T4 o14 o0H *74 o14 i1? o1@ o14 D5 -o14*A8O52 +o14 *A8 O52 o14 $A -o14 *74 o0H o14 $7 o14 *52 o14 +3 @@ -54399,9 +46006,8 @@ o1+ *42 *17 o14 *16 o14 $* $@ o14 -o13O71T4 +o13 O71 T4 o13 TA -o13T4O71 o13 o3e o13 o0K o1@ -3 ^M @@ -54409,7 +46015,6 @@ o13 C o13 *97 o13 .5 o1; *34 i1i -o1# *32 o50 o13 .2 o1_ *31 o12 T7 @@ -54417,7 +46022,6 @@ o1) +2 ^Q o12 p2 $v o12 o3w l o12 o2- -o12 l o3w o12 ^@ L2 o12 k [ o12 i23 @@ -54430,21 +46034,19 @@ o12 *24 o1; +2 ] o12 o11 y1 -o11O51$j +o11 O51 $j o11 si3 o11 o5! -o11$jO51 +o11 $j O51 o11 i1k o11 $h o11 $G *56 o11 *81 -o1+ *17 *42 o11 *56 $G -o1- *14 o11 ^2 y4 ^@ o11 o10 y2 -o10O37*30 +o10 O37 *30 o10 R5 o10 o74 $. o10 o0T @@ -54456,13 +46058,12 @@ o10 -3 o10 *14 o10 *12 o10 $* -o10 ] +] o10 o10 ^! o1@ -0 o1. +0 o1, .0 o1 +0 -] o10 [ o10 o1% o1@ $@ @@ -54479,18 +46080,16 @@ $o $1 ^, o1. o0z Z2 o0z y5 -o0zY4O15 +o0z Y4 O15 o0Z y2 -o0zO72 +o0z O72 o0Z T6 o0z sdn o0z p1 z1 o0Z oA1 -[ o0z o2- o0z k o0z i7@ o0Z i4< -o0z i0a o0z ^i o0z $a o0z *68 @@ -54507,14 +46106,11 @@ o0@ Z2 o0> $< Z2 o0@ Z1 $@ o0$ z1 -$) o0Z o0z ^! o0Y ^Z o0Y Y2 Y3 -o0y y2 t -o0Y Y1 $# -$?o0YO31 o0y t y2 +o0Y Y1 $# o0y T4 o0Y T2 o0y o5h @@ -54526,7 +46122,6 @@ o0y ] i3q o0y $8 $o o0Y +8 o0Y $7 -o0Y ,5 o0| Y2 Z2 o0Y +2 o0y .2 @@ -54538,9 +46133,9 @@ o0y $. o0x Z3 D6 o0x y4 o0x y2 -9 -o0xO64 -o0xO54 -o0XO52 +o0x O64 +o0x O54 +o0X O52 o0X t i2d o0x $r p1 o0x o64 @@ -54548,15 +46143,15 @@ o0x o3h o0x i4t o0x ^e o0x D6 Z3 -o0$O91 -o0?O62 +o0$ O91 +o0? O62 o0X -6 o0x -6 o0x *52 o0x *47 o0x *45 *65 -o0.O41y4 -o0@O41^m +o0. O41 y4 +o0@ O41 ^m o0x *27 o0x *21 o0x } @@ -54570,14 +46165,13 @@ o0W y2 o0w Y2 o0w y2 o0w y1 *06 -o0wO53y5 +o0w O53 y5 o0w so6 o0w slm o0w s21 ^e o0W p5 -o0Wp1O04 +o0W p1 O04 o0W ^P -o0w ^p o0w ^o ^r o0w o7j o0w o6h @@ -54588,16 +46182,13 @@ o0w o13 o0w ^j o0w i5n o0w i2t -o0W i0P o0w i0C o0W i02 -o0w ^e s21 o0w D3 o0w 'B o0w $9 o0W '8 o0w -6 -o0w *56 o0W *41 o0w *40 o0w ,4 @@ -54605,19 +46196,17 @@ o0w *34 o0W .3 o0w *20 *15 [ o0w +2 -o0w *15 *20 o0w *03 p5 o0w $0 o0v Z2 o0V Z1 -o0vO31 -o0V u ^L +o0v O31 +o0V ^L u o0V o7Z o0v o7d o0v o4o o0v o4i o0v o2z -o0V ^L u o0V k ^r o0v k o0V ^J @@ -54632,51 +46221,39 @@ o0v *43 o0V .4 o0V *31 o0v *31 -o0v *10 o0v *07 C o0V $* -o0V $( -o0V ^! $( o0V +o0V ^! o0_ ^v -o0u z1 z1 o0u Y2 -o0uO32 o0U $u o0U T3 o0u ^q -o0u o1b *87 +o0u *87 o1b o0u ^m o0u ^K o0u ^J o0u i7X o0u $9 -o0u *87 o1b o0U ,4 -o0u *32 o0u ^1 $@ o0U o0T Z5 u o0T y4 y4 -o0T Y3 t +o0T t Y3 o0T y2 o0T Y1 -o0tO24 -o0T u Z5 -o0T t Y3 +o0t O24 o0t t ^M -[ o0T T4 o0T t o0t som o0T se_ -o0t ^s o0T o7. o0t o6d o0T o2F o0T o1B -$. o0T o10 o0t $m -o0t L6 o0t K Z1 $! o0T k o0t i80 @@ -54686,7 +46263,6 @@ o0T i3i o0t i0T o0T i0K [ o0t $i -o0T D2 o0t ^c o0T *97 *36 o0t *91 @@ -54694,7 +46270,6 @@ o0t -7 o0t *60 o0T $4 o0@ T4 -o0T *36 *97 o0t *30 o0t ,3 $? o0t -3 @@ -54704,14 +46279,12 @@ o0^ T1 o0T $. o0t $# o0t $. -$# o0t $@ o0t -o0S Z1 z1 o0S z1 Z1 -o0sY4O62 +o0s Y4 O62 o0s ^Y o0s $y -o0sO21 +o0s O21 o0s u o0S s39 o0S $S @@ -54729,7 +46302,7 @@ o0s ^m o0S ^L o0s i7f o0s i2i -o0Si1aO81 +o0S i1a O81 o0s $H o0S DA o0S D8 @@ -54742,7 +46315,6 @@ o0s +8 o0s ,7 o0S *65 o0S *41 -o0S *37 o1t o0s *35 } o0s *25 o0s *24 @@ -54757,7 +46329,6 @@ o0r se, o0R R1 o0r o8s o3a o0r o6y -o0r o3a o8s o0r o2p o0r o2j o0r o2i @@ -54783,14 +46354,13 @@ o0r *34 o0r ^1 o0r { o0. r -o0q z5 t +o0q t z5 o0Q z3 o0Q z2 o0q y5 o0Q y1 -o0qO63 +o0q O63 o0q $w -1 -o0q t z5 o0q r Y2 o0q p1 D0 o0q o7t @@ -54803,8 +46373,8 @@ o0q +5 o0q -1 $w o0Q ^1 o0Q $. -o0PO82 -o0PO42-4 +o0P O82 +o0P O42 -4 o0P u o0p T7 o0P ^T @@ -54848,7 +46418,6 @@ o0o y1 o0O ^W o0o u p1 o0o shp -o0o p1 u o0o o6@ o0o o1s o0O $O @@ -54863,16 +46432,16 @@ o0' o2l o0o -1 o0 ^o o0n y5 -A -o0nY2O43 +o0n Y2 O43 o0N Y2 o0n ^X -8 -o0nO62 -o0nO61 -o0NO52 -o0nO43Y2 -o0NO32 -o0NO21 -o0n u $H +o0n O62 +o0n O61 +o0N O52 +o0n O43 Y2 +o0N O32 +o0N O21 +o0n $H u o0n ^U o0N q $L o0N o3m @@ -54881,29 +46450,23 @@ o0N K D1 o0N i4S o0n i2m o0N i2@ -o0n $H u o0N D1 K o0N $6 o0n *41 o0n *24 ,2 o0n *06 -o0m Y5 t +o0m t Y5 o0m Y3 $K o0M y2 -o0mO63 +o0m O63 o0m ^w -o0M u p1 -o0m t Y5 o0m t o4u -o0m $ sp +o0m $ sp o0M $r ,5 o0M p4 D5 -o0M p1 u -{ o0m $p o0m o9s { o0M o9e o0m o93 -o0m o79 o0M o5x o0M o4z o0m o3m @@ -54937,9 +46500,9 @@ o0L Z2 o0L Y2 Y2 o0L Y2 $w o0l y2 k -o0LOA1 -o0LO71 -o0lO32 +o0L OA1 +o0L O71 +o0l O32 o0l u d o0l ^u o0l t d @@ -54952,17 +46515,12 @@ o0L i4b o0L i3s o0l i0O o0L i02 -o0l d u -o0l d t o0L D2 ^Y o0L D2 o0L ^b o0l +B -o0l ^B o0L ,8 -o0L ^8 o0l +8 -o0L +6 o0l *54 z2 [ o0l -4 o0L .3 @@ -54970,30 +46528,26 @@ o0l +3 o0L *23 o0l *17 o0L *12 -o0* L0 s9! o0{ L0 o0L $% -$% o0L $# o0L -o0l $. o0@ ^l o0K y4 D4 o0K y1 -o0KO93,4 +o0K O93 ,4 o0k $X o0k $x o0K T5 o0K t o0K se0 o0K $S -o0k $R o0k p4 y3 o0k p2 *25 o0k oA5 o0K o8n o0k o5l o0k o3u -o0k o2o *41 +o0k *41 o2o o0K $N o0k K *35 $@ o0k k @@ -55007,9 +46561,7 @@ o0k 'B o0k $9 o0K *61 o0k -5 -o0K,4O93 o0k *41 y5 -o0k *41 o2o o0k *35 K o0K *21 o1# o0K *14 @@ -55020,8 +46572,8 @@ o0J z2 o0j y3 o0J y2 o0j y1 -o0jO83 -o0jO41y4 +o0j O83 +o0j O41 y4 o0J u $8 o0J $S o0j ^s @@ -55030,14 +46582,11 @@ o0J o4n p3 o0j $J o0J i2m o0j i2h -^_ o0j i0w o0J i0M o0j D4 o0J ^B -o0J ^A o0j $A o0J *95 -o0J $8 u o0J *89 o0j *63 o0j -6 @@ -55051,11 +46600,11 @@ o0J *13 o0j $/ o0j ] o0< ^j -o0iY3O34 +o0i Y3 O34 o0i y3 [ o0i y2 o0i y1 -o0iO34Y3 +o0i O34 Y3 o0i ^V o0i u ^A o0I u @@ -55065,16 +46614,12 @@ o0i o4n o0i o3d o0I i2n o0i i1v -o0i i0P -o0i i06 o0i ^C o0i ^b -o0i ^A u o0$ i84 o0% i6t o0I *67 o0* i60 -o0i ^6 o0i *57 o0$ i3M o0, i3l @@ -55084,18 +46629,16 @@ o0i *34 o0i *31 [ o0i .3 o0i } *20 -o0. i1s o0i *14 *16 -o0@ i0z o0_ i0l o0i *01 y2 o0$ i0# $? o0i o0i o0h Z2 -o0hO71 -o0hO42 -o0HO41 +o0h O71 +o0h O42 +o0H O41 o0h ^r o0h o5i o0h o3- @@ -55108,7 +46651,6 @@ o0H D2 o0H *B9 +5 o0H $9 o0h *85 -o0H +5 *B9 o0h .5 o0H ^4 o0h .4 @@ -55128,44 +46670,35 @@ o0g y3 o0g Y2 ^d o0G y2 ] o0G ] y2 -o0gO74 -o0gO51 -o0gO31t -o0g u Z4 -o0g t y4 -o0gtO31 -o0G T3 ,5 +o0g O74 +o0g O51 +o0g O31 t +o0G ,5 T3 o0G T3 o0G T2 o0g $t o0g R1 o0g p2 '9 -o0G o4k *58 +o0G *58 o4k o0g i7- o0G i02 o0g $i o0g f i4g o0g ^d Y2 -o0G D2 -o0G -9 *15 +o0G *15 -9 o0G $9 o0G *82 -o0G +8 o0g +7 o0G *62 o0G $6 -o0G ,5 T3 -o0G *58 o4k -o0g ,5 -2 +o0g -2 ,5 o0g *46 *63 o0g *43 o0g *42 o0g -4 o0G *34 $2 $! o0G ,3 -o0g -2 ,5 o0G $2 *34 -o0G *15 -9 o0g *12 o0G .1 o0G ^# @@ -55174,15 +46707,11 @@ o0G $_ o0g o0f Z5 u o0F Z2 -o0fy4O62 +o0f y4 O62 o0f Y4 o0f Y3 u -$? o0F Y1 -o0?fO64 -o0fO62 -o0F $X -o0f u Z5 -o0f u Y3 +o0? f O64 +o0f O62 o0F $T o0f s1_ o0f R1 @@ -55202,11 +46731,9 @@ o0f i3b r o0f i1L o0F i1B o0F i0K -o0f $I o0F D2 o0f d o0f *86 -o0f *76 o0F *73 o0f -7 o0f ^6 @@ -55218,49 +46745,40 @@ o0f *41 o0F +3 o0F .2 i3e o0f +2 -o0f *13 o0F .1 o0F ^1 ] o0F o0f $% o0- ^f o0e y5 -o0EO41 -o0EO24$, -o0E$,O24 +o0E O41 +o0E O24 $, +o0E $, O24 o0E T5 o0E T2 o0e T1 -o0E ^S o0E o91 o0E o2c +5 o0e o1i o0E K .7 -o0E i0T -o0E i0Q -o0e D4 *01 +o0e *01 D4 o0e c o3V o0e ^B o0E *96 -o0e ,8 ,3 -o0E +5 o2c -o0E -5 o0e ,3 ,8 +o0E -5 o0e +2 o0e *10 o0e +1 -o0e *01 D4 $! o0e $- o0e -^@ o0e o0d y3 o0, ^d y2 o0d y1 -o0dO61 -o0dO52 -o0DO41 -o0DO21] -o0D]O21 +o0d O61 +o0d O52 +o0D O21 ] +o0D ] O21 o0D T3 o0d R3 o0d o9y @@ -55291,16 +46809,13 @@ o0d ] o0C Z3 sGh o0c y3 o0C ] Y1 -o0CO92 -o0CO63 -o0CO51 -o0CO23 +o0C O92 +o0C O63 +o0C O51 +o0C O23 o0c ^x o0C T4 -o0C T3 -o0C sGh Z3 o0c sea -{ o0c s3f o0c r o0c $q o0c o5u @@ -55313,22 +46828,17 @@ o0c i6n o0c i58 o0C i3M o0c i3 -o0cdO04 +o0c d O04 o0C DA o0C D7 o0C ^A o0c +7 o0c -7 -o0C *51 -o0c *30 o0c $2 o0C } -$o $0 C -{ o0C ] { ] o0C o0C o0c $, -$* o0c ] o0c o0b Y4 ^B o0B Y4 @@ -55337,39 +46847,31 @@ o0B y2 Y1 o0b y2 $! o0b $! y2 o0B Y1 y2 -o0B y1 $3 +o0B $3 y1 o0B Y1 -o0BO32i3n -o0B t y3 +o0B O32 i3n o0B T4 o0b saz -o0b $s o0B o90 o0b o63 -$? o0B o6! o0B o5# o0b o1x o0b $n o0b i4c c o0b ^I -o0b c i4c o0b C i0p o0b C -4 o0b ^B Y4 o0B ^b o0b $b -o0b -8 o0B ,6 o0b +6 -o0B $3 y1 o0b .3 *21 o0b $3 o0b *23 -o0b *21 .3 o0B +2 o0B ,2 o0B $+ -o0B $, o0- $B $% o0b o0a Z2 *73 @@ -55381,14 +46883,11 @@ o0a o1i o0A o1e o0A l o0a ^l -o0a i1z o0a E Y2 o0a E $7 -o0a $7 E o0A $7 $9 o0A *76 { o0A $6 -o0A +5 o0A .5 o0A } o0) $A @@ -55408,38 +46907,31 @@ $O *08 $5 o08 ^5 o08 ,1 d o08 .1 -} o08 ^o *08 o07 Z2 o07 o6c o25 -o07 o25 o6c o07 i20 o07 ^9 -o07 ^8 o0@ *75 o07 ^2 o0 *71 ^ o0! *70 -$ o06 Z2 -o06 Z1 snk -o06 y1 -o06O41 o06 snk Z1 +o06 y1 +o06 O41 o06 o88 o06 +8 o0@ *67 -o06 *46 *10 +o06 *10 *46 o06 *46 o06 *43 o0$ *62 -o06 *10 *46 o06 *0A -o05O62 +o05 O62 o05 T2 o05 t o05 R5 o05 o7w -o05 i1P o05 ^h o05 *74 o0& $5 *34 @@ -55456,7 +46948,6 @@ o04 *45 o04 *25 o04 +2 o0. ^4 -} o04 o03 Y3 o03 ^T o0_ +3 s_p @@ -55470,21 +46961,19 @@ o03 *09 o0. *30 .1 o03 } o02 y3 y3 -o02O83 +o02 O83 o02 T6 o02 o5p -o02 o28 *51 +o02 *51 o28 o02 o11 ] o02 k o02 -6 -o02 *51 o28 o02 +2 o0* -2 o0@ ^2 o0, +2 $= o02 o01 T8 -o01 $T o01 r { o01 i3T *31 o01 i2j @@ -55492,7 +46981,6 @@ o01 ^f o01 $E o01 ^d o01 *51 -o0. .1 *30 o01 +2 o01 ] o0+ -1 @@ -55519,13 +47007,11 @@ $% o0# $# o0% $# o0_ $* o0@ -$( o0# $* ^O $_ ^O ^. ^O $o $* $o ^, -^N Z5 z4 ^N z4 Z5 ^N z4 Y5 ^N Z3 o9M @@ -55535,7 +47021,6 @@ $n z2 d ^n z2 ^n Z1 i0m $n $z -^N ^Y k ^N Y5 z4 ^n Y4 $n $y .4 @@ -55544,35 +47029,31 @@ $N y3 ^n Y2 Y2 $n Y2 $n y2 -{ $n y1 ^N ^Y $n ^Y -$nOA1 -$nO94 -$nO84 -$NO64$! -$N$!O64 -$nO43 -}^nO32 -^nO31o01 -$NO24$6 -$nO05 +$n OA1 +$n O94 +$n O84 +$N O64 $! +$N $! O64 +$n O43 +} ^n O32 +$N O24 $6 +$n O05 ^n u i68 ^n u *40 ^N ^u -$N t $n $t -$n ss5 $n srp ^n sna ^n seg ^n s8i ^n s5- ^n ^S -$n R8 ,7 +$n ,7 R8 ^n R4 ^n } ^r -^np1O04 +^n p1 O04 $n p1 E ^N p1 $n oAo @@ -55593,7 +47074,6 @@ $N o2g ^N o2F $N o17 $n o06 -^no01O31 ^n ^O ^N ^n $N $M @@ -55616,33 +47096,28 @@ $n i7/ *16 $N i71 $n i6z *96 $n i6z -$ni6pO32 +$n i6p O32 $n i6k -^n i68 u $n i68 ^n i5z *41 -^N i5n ^n i5h ^N i5d ^N i5a ^N i49 ^N i3w $n i3D -^N i1Y $n i1t ^N i1r $n i1p -^N i1k +^k ^N ^N i1j ^N i1e $n i19 $n i11 -^n i0m Z1 ^N i0K $N i09 $n i04 ^N ] ^I -^N ^I ] $N $i ^n $i ^n ^G @@ -55652,15 +47127,12 @@ $N E oAb $n D6 ^N D3 o30 ^N $D -$N ^c l ^n ^C ^n 'B { ^N ^a $! $n ,A ^n ,9 -$n ,7 R8 -^n *70 k -$N$6O24 +$N $6 O24 $n *6A ^n *65 i4l $n *65 @@ -55671,8 +47143,6 @@ $n $5 Z2 $n -5 $n .4 $y ^N *43 -^n *41 i5z -^n *40 u ^n ,4 ^n -4 $N +3 @@ -55685,7 +47155,6 @@ $n *25 $n ^2 ^n +2 ^n ,2 -$n *16 i7/ $N *13 ^N $1 $n +1 @@ -55717,18 +47186,14 @@ $m Z5 $M Z4 $m Z2 -1 ^M Z2 -$M Z1 z1 $M z1 Z1 $m Z1 z1 -$m z1 Z1 $m Z1 o1m ^M Z1 $D $M Z1 d -{ ^M Z1 ^m ^, z1 -^M ^Z $M $z -^MY5O15 +^M Y5 O15 ^M ^y *54 ^m Y5 $] ^M Y4 u @@ -55736,33 +47201,29 @@ $M Y4 s4n ^m Y4 $m y2 $d ^m y2 $/ -^m $/ y2 -^m Y1 ^z -^mY1O15 +^m Y1 O15 $m y1 u ^m y1 D4 ^M $Y -$mO82 -$mO72 -$MO71 -}$mO61 -^MO53 -^mO52C -^mO52 -$MO51$e -^MO32z1 -$mO21$p -^mO15Y1 -^MO14K -^MO13 -^mO12 -$MO04$O -$mO03 +$m O82 +$m O72 +$M O71 +} $m O61 +^M O53 +^m O52 C +^m O52 +$M O51 $e +^M O32 z1 +$m O21 $p +^m O15 Y1 +^M O14 K +^M O13 +^m O12 +$M O04 $O +$m O03 ^m ^X ^m ^v $0 $M $V -^M u Y4 -$m u y1 $M $u oAl $m u *79 $M $u @@ -55778,21 +47239,18 @@ $m snl $m sm3 TA ^M sdY $M sb2 -$M s4n Y4 $m s3M $m $S $m $s -^mrO34 +^m r O34 [ ^M ^R $$ $M r ^M r $m ^R -$m$pO21 -$m p3 t -$m p3 { +$m $p O21 $m { p3 $m ^P -$M$OO04 +$M $O O04 ^m ^o i1a $M oAl $u ^M o9e @@ -55815,9 +47273,7 @@ $M o2p ^M o2o ^M o2_ ^m o1y -^m o1q ^M o1p -$m o1m Z1 ^m o1j $m o0v $m ^n r @@ -55828,12 +47284,10 @@ $M L4 $M $l $m $L ^m l -^MKO14 -$m k o4+ +^M K O14 $m k *76 $M $K $m k -^m ^k $M ^j $M iA8 $M i92 @@ -55865,34 +47319,26 @@ $m i3 ^m i2b $m i2A ] ^m i21 -^mi1rO24 +^m i1r O24 ^m i1m i2x $M i1i -^m i1g ^m i1a L8 $m i13 ^m i1@ ^m i0l -^m i0g -^M i0E -$m i0b $m $I $m $h *53 ^M ^H $M $f ^m ^F -$M$eO51 -$m $d y2 +$M $e O51 ^M D5 z1 $M D1 $M d .0 $m $d $m d -^mCO52 -^m C o83 ^m c i0K $M C ,3 -$M c $_ $M $_ c $M ^c $M $B @@ -55900,9 +47346,8 @@ $M $B $M $b $M $A K ] ^M ^A -^m ^a ^m +9 t -^M *94 .6 +^M .6 *94 ^M $9 ^M '9 $m ,9 @@ -55911,16 +47356,13 @@ $m ,9 $M ,8 $M ^8 ^M -8 -$m *79 u } ^M *78 -$m *76 k ^m *76 $M ,7 $m +7 -^M .6 *94 ^m *65 ^m ,6 $1 -^m ,6 .1 +^m .1 ,6 $m -6 $m +5 Z5 ^m *57 *24 @@ -55935,15 +47377,12 @@ $M ^4 ^m .4 ^m -4 ^m ^4 -$M ,3 C $m *30 i0e $m .3 ^m -3 -^m *24 *57 $m -1 Z2 ^m *16 ^m $1 ,6 -^m .1 ,6 $m *14 $M .1 $M -1 @@ -55969,82 +47408,66 @@ $@ ^m $? ^m ^m $, ^l ^z Z3 -$L $Z z2 +$L z2 $Z ^l z5 t ^l Z5 *82 l Z4 so0 -$| l Z4 -^l Z3 ^z -$# l Z3 -$l Z2 z2 $l z2 Z2 -$L z2 $Z l Z2 i3a -l Z2 $f $l Z2 E $l Z2 { -] l z2 -$L Z1 t -l Z1 i3? -l Z1 $7 +$L Y1 t ^l z1 .7 $L Z1 -l Z1 $l ^Z -lY5O63 -^ly5O2B +^l y5 O2B l y5 -0 ^l Y5 ^l y4 -ly3O32 +l y3 O32 l Y3 i4l ^l Y2 Y2 -lY2O15 +l Y2 O15 l Y2 i5% -l Y2 ,B -l y2 ,4 ^l y2 -lY1O71 -^Ly1O51 -$L Y1 t +l Y1 O71 +^L y1 O51 ^l y1 .6 ^l Y1 -4 $L ^Y ^l ^Y l $X i7 -^lO83 -^lO82O21 -lO71Y1 -lO71o1W -^LO71i1d -^lO62K -$LO62 -^lO62 -$LO54$J -lO51D3 -lO51d -lO51-3 -lO48 -^lO43 -$LO42 -^LO42 +^l O83 +^l O82 O21 +l O71 Y1 +l O71 o1W +^L O71 i1d +^l O62 K +$L O62 +^l O62 +$L O54 $J +l O51 D3 +l O51 d +l O51 -3 +l O48 +^l O43 +$L O42 +^L O42 l $X .4 -lO37 -lO32 -}^lO32 -lO24p4 -$LO23+1 -^LO23 -^lO21Y5 -lO21*13 -^lO16y5 -lO15Y2 -^lO14i6h -lO14 -^LO13 -lO12$h -^lO05i3d -lO02$h +l O37 +l O32 +} ^l O32 +$L O23 +1 +^L O23 +^l O21 Y5 +^l O16 y5 +l O15 Y2 +^l O14 i6h +l O14 +^L O13 +l O12 $h +^l O05 i3d +l O02 $h ^l ^X l $W sae l $w o3f @@ -56053,17 +47476,12 @@ $l $v K ^L $v l ^U $T ^l ^U -^l t z5 -$L t Z1 -$L t Y1 l $T o5s -l ^t o0s ^l t i1_ l T9 l T8 *67 l T7 $@ l $T ,7 -l $@ T7 $l t *52 l T3 i73 l { T3 @@ -56072,44 +47490,34 @@ l T2 ^! l T1 *89 l T1 ^l t { -^l { t -l sxb $& l $& sxb $L s-x l suy -l so0 Z4 l s*M *26 $# l sfV l sfc l sda i3k -l sae $W $L sAE -l sa8 K +l K sa8 $l s9s ^l s93 l s2$ +0 l s1. i7, l s1C l s0@ i2e -l s03 $L $S ^L ] ^S -^L ^S ] l $S -l $s } ^l s!* ^l $s -^. l s$/ -l r ^F +l $F r l RB RB $L R6 l R5 R4 -l R4 R5 $L R2 *41 $L $R ^L $R ^l $R -^l r { ^L q *43 ^L $Q $l ^q @@ -56117,14 +47525,13 @@ $l ^q ^l p5 ^S ^l p5 o2m l p5 -^Lp1O07 +^L p1 O07 l p1 i5x $L $P -lo9zO41 +l o9z O41 ^l o8m -3 l o8+ LA $l o7m -$^ l o7? l o6" Y2 l o6p *42 l o6D i27 @@ -56139,19 +47546,15 @@ l o5H *24 ^L o5B l o53 o34 l o4T -l o4( o3/ -l o4a o5u +l o3/ o4( l o3t .5 ^L o3P l o3o $K -l o3/ o4( l o3m l o3f $w l o3f ^C -l o34 o53 l o2g +6 l o2' *45 -lo1WO71 } ^L o1V ^L o1J ^l o1d @@ -56167,17 +47570,13 @@ $l ^M l $@ ^m l ^. ^m $l ^m -l $L Z1 $L ^l r ^l l ^F $L l D1 $l $l D1 -l LA o8+ l L6 ^L -^L l ^, ^L ^, l -^lKO62 -l K sa8 +^l K O62 l $K o3o l K i65 l K i5c @@ -56185,13 +47584,11 @@ l K i5c ^l K *82 l K -6 l K +5 -l k *30 -l k *03 $. ^L K ^L ^K ^L $k ^l ^K -$L$JO54 +$L $J O54 l ^j o6G $L i9P E $. l i9_ @@ -56206,9 +47603,7 @@ $= l i8a ^L i86 ,6 l i7 $X l i7@ ^U -l i7, s1. $L i7l -l i73 T3 $L i7' ^l i6q $L i6N $@ @@ -56237,69 +47632,49 @@ l i3? Z1 $l i3w $l i3v ^l i3U -^l i3r k -l i3k sda l i3a Z2 ^L i3A Y3 ^l i39 $) l i36 ^L i3! ^l i3. -$L i2W o12 ^L i2u ^L i2m -l i2e s0@ l i24 -^l i1x -^l i1_ t -^l i1k $l i1H l i0y o1i -$L i0W -$L i0M -$l i0k ^l i0H ^l i0G $l i0F $l i0c $l i0, $b -l i0$ l i0@ $L $i -l$hO12 -l$hO02 +l $h O12 +l $h O02 $L ^h ^L $h l $G Y1 l ^G y1 $L ^G *61 -lfO46 -l $F r +l f O46 ^l ^f 'A -] ^L ^F ^L ] ^F -^L ^F ] $l E Z2 $L ^e ^L $e ^L ^e $! l $E -^l E $- ^l $- E -$ldO7B -ldO67 +$l d O7B l d i8, $L DB l D6 T6 $L D6 l D6 l D5 d -l D4 f l D4 ^A -l D4 .2 l D2 *31 -$L D1 l -$l D1 $l $L { $D $l $D ^L ^C @@ -56307,13 +47682,11 @@ $l $D $- ^L c { ^l $c l ^B ^J -$l $b i0, -LB +A ] LB ] +A $% l *B8 $l ^b ^l ^b -LA}O81 +LA } O81 l $A i8; LA } D8 ^l 'A -9 @@ -56323,20 +47696,17 @@ L9 Z2 L9 i77 l -9 i5L L9 C p3 -^l -9 'A L9 +9 $l *97 -l *95 K ^l *95 $] L9 ^l $9 L8 Z1 i4o L8 y2 D2 -$)L8O42 +$) L8 O42 L8 i4o Z1 -l *89 T1 l $8 *34 -L8*27O34 +L8 *27 O34 } ^l *80 l +8 $. l $. +8 @@ -56347,15 +47717,15 @@ $l +8 L7 Z2 L7 Y1 i6t L7 Y1 D6 -L7O32i3@ -L7O03*32 +L7 O32 i3@ +L7 O03 *32 l ,7 $T L7 sgz L7 $r E L7 o6j L7 o5x L7 o4q -L7 o4a -1 +L7 -1 o4a L7 l o3H L7 K *32 L7 i7e @@ -56369,7 +47739,6 @@ L7 D6 Y1 l -7 +5 ^l *75 L7 *32 K -L7 -1 o4a l ,7 $1 $L ,7 { $L ,7 @@ -56391,10 +47760,8 @@ l '6 q L6 $p L6 o7d Y4 L6 o5v -l +6 o2g L6 o26 l -6 K -^L ,6 i86 L6 i6D L6 i5c L6 i5= ,6 @@ -56404,10 +47771,9 @@ L6 i4_ L6 i3v L6 i0N L6 i0e t -L6fO04 +L6 f O04 L6 ^B L6 $b -l *67 T8 $l *67 l +6 *65 l *65 +5 @@ -56415,23 +47781,19 @@ L6 ] .5 L6 .5 ] L6 *41 *43 L6 *40 i47 -L6 *13 R2 L6 +0 L6 ^= ${ L6 $l $6 L5 Z2 z1 -L5 z1 Z2 L5 y4 y4 L5 Y2 -{L5O01 +{ L5 O01 L5 s1v [ -L5 [ s1v L5 ^r L5 $p L5 o4J +0 L5 o41 *63 -l .5 o3t L5 $k L5 ^j L5 i5y +2 @@ -56441,14 +47803,8 @@ L5 i4m L5 i1f L5 i0g L5 C i6i -l*58O71 +l *58 O71 ^L -5 $7 -l +5 -7 -L5 *63 o41 -l *54 -$l *52 t -L5 +2 i5y -L5 +0 o4J L5 $= ^L $5 l +5 @@ -56477,47 +47833,34 @@ L4 ^A ^l *48 { L4 *73 l *46 +1 -l *45 o2' -{ L4 *37 -l *42 o6p -L4 ,2 o3d L4 *27 -$L *41 R2 $@ L4 $l $4 L3 ^y $5 L3 $y -l-3O51 L3 ^w L3 s3c i4v L3 s1n d l -3 r L3 q Y1 L3 p2 -4 -^l -3 o8m L3 L3 ] -L3 ] L3 L3 K L3 k { L3 ^J -L3 i4v s3c -l +3 i4v L3 i3h L3 i3E ^8 L3 i1v L3 $i L3 ^h *75 -L3dO03 -L3 d s1n +L3 d O03 L3 $c L3 ^a -L3 *75 *03 +L3 *03 *75 l *34 $8 ^^ l *34 ^l *32 +3 l -3 ,2 -l *31 k -L3 *03 *75 l .3 -0 L3 $. L3 $! @@ -56525,8 +47868,6 @@ L3 $! L2 Z3 f L2 z2 i43 L2 Y4 scm -L2 sku p1 -L2 scm Y4 L2 p1 sku L2 ^L L2 K ^@ @@ -56534,19 +47875,12 @@ L2 ^@ K L2 ^J L2 i5p L2 i4r -^l -2 i3z L2 i3t l +2 i2r L2 i1Y -L2fO51 -l .2 D4 -L2 d { -L2 { d +L2 f O51 } L2 ^b -l *26 s*M -l *24 o5H L2 *46 -l ,2 -3 [ L2 +1 ^l *21 L2 $[ @@ -56560,20 +47894,17 @@ L1 z1 ^2 l $1 Z1 L1 Y4 *75 L1 Y2 o2h -L1O31^D -L1O23u -$L+1O23 +L1 O31 ^D +L1 u O23 L1 ^w ^g -L1uO23 L1 ^R L1 r -L1p5O13 +L1 p5 O13 L1 p3 z1 L1 o2h Y2 -L1 o21 i6e +L1 i6e o21 L1 o0e L1 k ^d -L1 i6e o21 L1 i4S L1 i46 l .1 i2b @@ -56584,13 +47915,11 @@ L1 $b L1 ^a l $1 ,7 ^l *17 -l +1 *46 ^L ,1 *21 L1 ] .0 L1 .0 ] L1 .0 L1 } -L1 ] $l .1 } l ^1 ^l $1 @@ -56600,7 +47929,6 @@ L0 z2 r L0 $! Z1 L0 { Z1 L0 y1 ^C -}L0O81 L0 $v L0 s5k l +0 s2$ @@ -56613,18 +47941,14 @@ L0 i0E L0 ^f L0 { $d L0 ^A -L0 *65 L0 ^6 -l -0 .3 ^l *03 -l *02 i4P L0 *12 L0 +0 ,1 L0 $# L0 } $* L0 ^\ L0 ] -^\ ] L0 ^| L0 $L $? $L $! @@ -56641,15 +47965,9 @@ l { { l ] $l $* $l $; -$$ l ^@ -$$ ^@ l -$@ l $. l -$? l $= l $( -$= $( l } l ^^ -} ^^ l ] $l ] ^l [ $l @@ -56658,28 +47976,25 @@ $= $( l ^l $> ^% ^l ^. l ^_ -^. ^_ l ^! ^l -K$zO12 +K $z O12 k $z r k ^z p2 K $z i5d -K Z5 Z4 -k Z5 Z3 +K Z4 Z5 +k Z3 Z5 $k Z5 Y1 -$kZ5O23 +$k Z5 O23 $k Z5 +6 $k Z5 ,6 $k Z5 -K Z4 Z5 -k Z3 Z5 k Z3 +5 k $. Z3 k $ Z3 $k z3 k Z2 y3 -^kZ2O31 -kZ2O14 +^k Z2 O31 +k Z2 O14 k z2 o1s k Z2 o0c ^K z2 ^N @@ -56698,12 +48013,10 @@ K Z1 o6l ^k Z1 o65 k Z1 o1s K z1 o14 -K Z1 $k $k Z1 k K Z1 i75 k z1 ,4 -^* K Z1 -$ k Z1 +^* K Y1 K $z *01 K $z k ^z @@ -56713,7 +48026,7 @@ K Y5 ^T K y5 sqa k Y5 o9r K y5 o8o -ky4O62 +k y4 O62 K Y4 *B9 K Y4 ] ^K Y4 @@ -56738,12 +48051,9 @@ K Y2 ^G k Y2 E $_ K Y2 k } Y2 -[ k y2 -^. k y2 -$k Y1 Z5 ^k y1 Y5 -KY1O81 -^kY1O52 +K Y1 O81 +^k Y1 O52 ^k Y1 o5b K Y1 k K Y1 i5 @@ -56751,76 +48061,72 @@ K Y1 C K Y1 *54 K Y1 .5 k Y1 +2 -k y1 +2 -K Y1 ^* K ^* Y1 K Y1 -^* K Y1 k $@ Y1 $+ $k Y1 ^- k Y1 $K ^Y K $y ^k ^Y -k$xO01 +k $x O01 K $x c -KOB1 -KOA3t -KOA2 -KOA1$t -KO91 -KO82 -KO81Y1 -^KO81 -kO81$. -kO81{ -k$.O81 -$kO62Y2 -kO62$8 -KO61*54 -kO57,6 -kO53O62 -^kO52Y1 -$kO52 -^kO52 -KO51Y3 -^kO51i4a -KO51,8 -kO51+2 -kO42O62 -KO42$. -K$.O42 -K[O42 -k^@O42 -kO41.1 -^kO41 +K OB1 +K OA3 t +K OA2 +K OA1 $t +K O91 +K O82 +K O81 Y1 +^K O81 +k O81 $. +k O81 { +k $. O81 +$k O62 Y2 +k O62 $8 +K O61 *54 +k O57 ,6 +k O53 O62 +^k O52 Y1 +$k O52 +^k O52 +K O51 Y3 +^k O51 i4a +K O51 ,8 +k O51 +2 +k O42 O62 +K O42 $. +K $. O42 +K [ O42 +k ^@ O42 +k O41 .1 +^k O41 K $x *36 -kO35t -^KO34 -$kO34 -^KO32 -^kO31Z2 -kO31p1 -kO31K -{^kO31 -KO25 -KO24t -KO24*34 -$kO23Z5 -KO21$K -kO21i1m -kO14Z2 -^KO14 -kO13*84 -kO13 -KO12$z -KO12$n -kO12k -KO04*20 -KO03 -$kO02$p -KO02 -kO01$x +k O35 t +^K O34 +$k O34 +^K O32 +^k O31 Z2 +k O31 K +{ ^k O31 +K O25 +K O24 t +K O24 *34 +$k O23 Z5 +K O21 $K +k O21 i1m +k O14 Z2 +^K O14 +k O13 *84 +k O13 +K O12 $z +K O12 $n +k O12 k +K O04 *20 +K O03 +$k O02 $p +K O02 +k O01 $x K $w i7@ K ^W $0 ^K $W @@ -56832,18 +48138,12 @@ K $u ] K ^u $k ^U k u -} k u ] ^k u ^k ^u K $t Z2 -^k t Z1 K t $Z K ^T Y5 -k t Y2 -KtOA3 -K$tOA1 -ktO35 -KtO24 +K $t OA1 K $T $t k ^T o7? K t D1 @@ -56851,7 +48151,6 @@ k t d K $t *75 k ^t *54 K T4 o2y -k t .3 k T2 o0U K T2 o0M K T2 ^! @@ -56865,16 +48164,14 @@ K T0 *58 K T0 +2 $K ^T K t $. -K $. t K $t k sy1 c -^K^SO41 +^K ^S O41 K ^s ^w -k st Y1 +k st Y1 K sty $k ss4 K sr6 *62 -K sqa y5 k sob o1a K sMb ^N k seh -5 @@ -56887,20 +48184,16 @@ $K s8S K s86 k s7. *71 K s70 -K s6c K ^s -3 ^K s3- k s2z K s2U k s2g +1 -K s25 K $s *24 $K s12 k s10 ^K s0@ -[ k s0* $K $S -K $s [ K [ $s [ K $s k ^S @@ -56917,25 +48210,21 @@ k R1 i3R k R1 $> k $> R1 K R0 -k r ^0 -$K r k ^r -$k r -^k q Z1 -K $q Y1 ^k q Y1 +K $q Y1 K $q K ^ q ^k ^Q k ^ q $k ^q ^k q -$k$pO02 +$k $p O02 K $P ^F K $p +7 K p5 o52 K p5 *7A -Kp4OA5 +K p4 OA5 ^K p4 i6a ^k p4 i4u K p4 @@ -56944,10 +48233,9 @@ k p3 o0x K p3 K p2 $a $k p2 '9 -Kp1O76 -Kp1O72 -Kp1O46 -K p1 l +K p1 O76 +K p1 O72 +K p1 O46 K p1 $A k ^o o3} k $o $k @@ -56955,8 +48243,6 @@ K oBg K oAi K oA2 p4 K o9V -K o9S sCs -K o9d R7 ^k o99 K o94 ^k o92 @@ -56976,12 +48262,9 @@ K o7k ] $k o7j $k o7i K o74 +1 -{ k o74 -k o72 k o71 K o6# ^S K o6l Z1 -$! k o6k K o6g K o6c K o6a @@ -57018,7 +48301,6 @@ K o43 K o4 k o3y K o3w -k o3u k o3s ,2 K o3r ^k o3r @@ -57036,7 +48318,6 @@ $K $O -3 ] K o3- k o3= K o2z -K o2y T4 [ K o2w k o2u k o2S @@ -57056,7 +48337,7 @@ k o25 k o24 k o21 ^6 [ K o21 -k o1z +[ i1z K o1y K o1w k o1 ^T @@ -57067,20 +48348,16 @@ k o1P i34 k [ o1p ^k o1p ^K o1n -k o1m ^K o1e -k o1a sob K o1a k o18 K o1. +7 ^K o1@ K o0z -k o0U T2 K o0r K o0q K o0p $k o0n *32 -K o0M T2 K o0G ,4 K o0G K o0F @@ -57089,15 +48366,12 @@ k o0c Z2 k o04 ^K ^O K ] ^o -K ^o ] $K $o -K$nO12 +K $n O12 k ^n u -K ^N sMb K ^N K $n K ^n -^k ^N k ^n k ^m o1- K ^M ^F @@ -57105,27 +48379,22 @@ k ^m -1 K } $m k $M k $L R2 -K l p1 -^K l o4b k ^l $h K $L E -K l *85 { K L8 K L7 *36 K $l +7 $k L6 -K l +5 $k L3 K L0 $k L0 $K ^L -$. K ^L K $l $k k Z1 K k Y1 k $K Y1 -kKO31 -K$KO21 +k K O31 +K $K O21 k ^k i76 ^k K i2@ k K i0N @@ -57143,9 +48412,8 @@ K $J K iAx $k iAs $k iAi -KiA1O62 +K iA1 O62 K i9a -k i94 T0 K i90 $3 $k i8i k i8a *86 @@ -57153,7 +48421,6 @@ K i88 K i80 C K i8' K i8. -^k i8^ $K i7S K ^! i7r K i7i ,6 @@ -57211,7 +48478,6 @@ k i4_ k i3x { $k i3w ^k i3s -k i3R R1 $k i3q ^k i3q K i3p $c @@ -57225,13 +48491,12 @@ k i3g k i3! E K i3a ^k i35 -k i34 o1P k i34 $K i32 K i3! K i2t ^k i2@ K -ki2iO52 +k i2i O52 k i2i $- k $- i2i K i2H ^k @@ -57241,7 +48506,7 @@ k i2f $@ k i2e K i2a $4 K i21 -k i2 +1 +k i2 +1 ^k i2 K i1y $K i1s @@ -57250,7 +48515,6 @@ k i1f K i1e +1 ^k i1b ^y K i1B i0D -^K i1B k i1A ^k i1A k i16 ^9 @@ -57258,18 +48522,15 @@ k i15 k ^i +1 k i0z $8 k i0z $2 -^k i0u k i0N K ^k i0n k i0M p5 k i0e o21 -k i0e k i0D *41 K i0c +6 K i0c ^K i0A -^K i05 -^k i03 +^k ^3 K $i ^k ^i k ^h y3 @@ -57281,15 +48542,13 @@ K $g r ^k ^g o11 ^k ^G $0 ] k ^G -kfO6A +k f O6A K ^f D2 -k f *A9 k f *9A [ K ^f K $e y3 k E Y2 -k E i3! -$K $e c +$K c $e K E $A k E *65 K E *56 @@ -57300,7 +48559,6 @@ $# K E ^k ^E $k ^e k ^D t -k d t K d $Q K $D $k K $d i66 @@ -57318,7 +48576,6 @@ k D6 -1 K D6 $- k D6 ^k D6 -k D5 o4_ K D5 $d k D5 *35 k D5 *25 @@ -57327,13 +48584,11 @@ K D4 ^k K D4 $3 k D4 $* k $* D4 -k D3 p1 [ k D3 K D2 ^g K D2 D3 -k D2 c +k c D2 k D2 +6 -K D1 t K D1 $a K D1 $4 K D1 .4 @@ -57343,17 +48598,11 @@ k ^D ^k ^D $k $d ^k $d -K C Y1 -K c $x k c sy1 $K c r -k c o4g K $c k -K C i80 K $c i3p K c ^F -$K c $e -k c D2 k c *79 k c $7 $K $C *67 @@ -57363,20 +48612,17 @@ k c *24 k c +1 K C ] $K ^C -$K c $$ $K $$ c k $B $H k $b ^5 K 'B $K $B $- K ^B -k ] ^b k ^b ] k $a Y1 -K^aO25 +K ^a O25 K $a D1 K *A9 -k *A0 o2o K $$ ^A K $A $K -A @@ -57387,8 +48633,7 @@ K .9 $1 K $9 k +9 { k -9 -k$8O62 -k $8 i0z +k $8 O62 K *8A k *89 *24 K *87 D5 @@ -57396,43 +48641,32 @@ K *87 D5 k *86 ^m k +8 *62 k { *86 -K *85 l -k +8 *26 k *82 *59 $. k ,8 ^k ,8 -k +7 Z1 $k $7 Y1 k +7 ^s K +7 $p K ,7 o63 k $7 o5b K $7 o3B -K +7 o1. K +7 $l k +7 d -k $7 c -k *79 c k *76 *37 K *75 $t k *75 ,6 K *75 K *74 ,4 -^k *73 o2m K *73 ^a -k *71 s7. -K $ .7 +K $ .7 $K +7 k +7 $k +6 Z5 $k ,6 Z5 -K +6 o3e -K ,6 i7i k *67 y2 -k*67O42 +k *67 O42 $K *67 $C k *67 *42 -k *65 E k *65 ^a K *65 -4 K *65 +3 @@ -57440,8 +48674,6 @@ K *65 $$ K *65 K $$ *65 k +6 -3 -K *62 sr6 -k *62 +8 k *60 i33 K *60 K +6 $! @@ -57454,25 +48686,16 @@ $K -6 ^K ^6 k ,6 k ^6 -K .5 Y1 k -5 seh -k +5 o62 K +5 l K +5 C -k *59 *82 -K *58 T0 -K *57 *46 +K *46 *57 k *57 *41 k *57 +4 -K *56 E k *56 -1 -K *56 $$ -K $$ *56 K *54 Y1 -K*54O61 -K -5 *48 +K *48 -5 K *54 *03 -K *54 k +5 -3 k *52 *75 k *52 +0 @@ -57490,28 +48713,19 @@ $K .5 ^K $5 ^! K -5 k -4 ^w -K ,4 o0G ^K ,4 $k ^k .4 i4- K $4 i2a K $4 D1 -K *48 -5 -k *47 o5j K *47 .1 -K *46 i7e k *46 i4. k *46 i1. -K *46 *57 -K -4 *65 k *46 *20 -k +4 *57 K } *45 k *45 $! k $! *45 -k *42 *67 k .4 ,2 K *41 i2b -k *41 *57 k -4 *03 K +4 K .4 @@ -57520,7 +48734,6 @@ k +4 $* k $* +4 k .4 $k +4 -k .3 t $K -3 $O K $3 i90 k ^3 i7+ @@ -57528,48 +48741,25 @@ K $3 D4 K *3A y2 K *37 i3r K *36 $x -K *36 L7 K *36 ^l -K +3 *65 -k -3 +6 $k *35 r -k -3 +5 k *34 ^D -$k *32 o0n k +3 *06 k *30 *23 -K *30 K } *30 k +3 -0 k +3 [ $k ^3 ^k ] $3 ^k ,3 -^k ^3 -^k $2 z2 k +2 Y1 -k+2O51 -K +2 T0 k -2 p1 -k ,2 o3s -^K ,2 o3H -K +2 i48 -k $2 i0z K $2 D5 -k -2 d -k *26 +8 k *25 +2 -K +2 -5 K *25 -k .2 ,5 K *24 $s -k *24 c -k *24 *89 -k ,2 .4 k *23 y2 -^K *21 k *21 } -k *20 *46 K $- $2 $K $2 } K $2 @@ -57577,13 +48767,8 @@ k -2 $? ^k +2 ^k ,2 k +1 y2 -k.1O41 k +1 t k +1 s2g -K +1 o74 -^k .1 o69 -k +1 o2q -k -1 D6 k +1 c K $1 .9 K *17 @@ -57591,9 +48776,7 @@ $k *17 } k *17 k *16 o1v { k *16 -k -1 *56 -k *15 +0 -K .1 *47 +k +0 *15 k *14 $k *13 ^p K *12 Y3 @@ -57605,26 +48788,12 @@ $- k ^1 [ k $1 ^k $1 k $0 Z2 -K -0 o3a -k +0 i5F k *07 -k *06 +3 -k *05 o1s -k +0 *52 -K +0 .5 -} K *05 { k *04 -K *03 k -K *03 *54 -k *03 -4 -k *03 .1 -k -0 +3 K *02 o0e $K *02 K -k *02 K *01 $z K *01 $k -k +0 *15 K +0 K -0 k -0 { @@ -57658,7 +48827,6 @@ $k $* $+ $k $+ k $* ^k -$! k $@ $! $@ k $ ^k $= $k @@ -57666,7 +48834,7 @@ $= $k ^k ^, ^@ $k ^@ ^k -$j Z5 u +$j u Z5 ^J Z5 .5 $j Z5 *43 $j Z4 y3 @@ -57677,7 +48845,6 @@ $j Z4 y3 $j Z1 s84 ^J z1 *87 $J Z1 } -$j Z1 [ $j [ Z1 $j Z1 { $j Z1 @@ -57687,39 +48854,35 @@ $j Y5 o4? $j Y5 $j y3 Z4 ^J y3 -^jy2O76 +^j y2 O76 ^j y1 t ^J ^Y -$jO72 -^jO62$j -^JO51 -$JO43i5D -^jO43 -$jO34$h -^jO32 -^JO23{ -$jO16o0m -^JO14 -$JO12 -$JO05 +$j O72 +^j O62 $j +^J O51 +$J O43 i5D +^j O43 +$j O34 $h +^j O32 +^J O23 { +$j O16 o0m +^J O14 +$J O12 +$J O05 ^J } ^W -^j $w } $J $V $J $v ^J $v $j $v ^j ^v -$j u Z5 ^J $u -^j t y1 $J T1 ^W -^j T1 o3X +^j o3X T1 $j T0 $h $j $t .0 $J $s o2Q ^j siu $j sdq -$j s84 Z1 $j s1R $j $s ^J r Y1 @@ -57743,34 +48906,29 @@ $j o8\ R8 ^J o7j ^J o65 ^j o5m k -^J o5d ^J o4c -^j o3X T1 ^j o2y ^J o2v ^J o2u +3 $J o2Q $s ^j o2% -$jo0mO16 $j $O $j $n ^j $n ^j $m c $j $M $j l -^j k o5m $J ^k $j $K $j ^K $j ^k -^j$jO62 +^j $j O62 $j iAh $j i9w $J i9j $J i7Y $J i7v $J i7S -^J i7N $J i7d u $j i7= $j i6w y1 @@ -57791,7 +48949,7 @@ $J i3a $j i3A ^J i3# ^j i2y -$ji2wO52 +$j i2w O52 $j i2q $j i2J *02 $j i2d @@ -57799,21 +48957,17 @@ $j i1w ^J i1q ^# ^j i1p $j i1m -^j i1h $. ^j $. i1h -^J i1C -^J i0R $j i0n $j $i -$j$hO34 -$j $h T0 +$j $h O34 ^J ^H ^J $h ^j ^H } $j ^h $J $G ^j ^F -^JdO06 +^J d O06 $J d E ^J d E $j D6 @@ -57822,40 +48976,32 @@ $j D6 $J $d $j ^d } ^j d -^j c $m -^J c $2 +^J $2 c $J $c ^J $b -^j ^b ^J ^9 o1C $J $! .9 ^J -8 z1 ^J $8 -^j *76 +2 +^j +2 *76 ^j $7 .5 $j *73 o7i ^J -7 $j *62 ] ^j *62 -^J .5 Z5 ^j .5 $7 ^J *54 ^j *52 $J +5 -$j*47O32 +$j *47 O32 ^J ,4 -4 $j *43 Z5 ^j *41 ^j -4 -^J +3 o2u $j +3 { ^j .3 -^j +2 o7K -^J $2 c -^j +2 *76 $j *26 i5h ^j +2 -$j .0 $t $J *04 ^j $0 $J $* @@ -57871,7 +49017,7 @@ $- $j { ^j ^j $, ^j -$IZ5O95 +$I Z5 O95 $I Z5 oB5 ^I Z4 o5o $I Z3 oB1 @@ -57880,8 +49026,7 @@ $I Z2 sI* $I z2 $i ^i Z2 *54 $i Z2 -$IZ1O74 -^IZ1O42 +$I Z1 O74 $i Z1 o0s $I Z1 i6X ^I z1 E @@ -57895,42 +49040,36 @@ $i y2 t $i Y2 *48 ^I Y2 ^i y2 -$iY1O93 -^IY1O42 -^iY1O12 +$i Y1 O93 +^i Y1 O12 $I Y1 ,1 -$iO93Y1 -$iO82 -^iO82 -$IO74Z1 -$iO62u -$iO62*51 -$IO61c -$IO61 -$iO52p4 -^iO45 -^IO42Z1 -^IO42Y1 -^IO42 -^iO42 -^IO32^F -^IO31 -$iO31 -^IO16$s -^iO12Y1 -^IO12 -^iO04$$ -^i$$O04 +$i O93 Y1 +$i O82 +^i O82 +$I O74 Z1 +$i O62 u +$i O62 *51 +$I O61 c +$I O61 +$i O52 p4 +^i O45 +^I O42 Y1 +^I O42 +^i O42 +^I O32 ^F +^I O31 +$i O31 +^I O16 $s +^i O12 Y1 +^I O12 +^i O04 $$ +^i $$ O04 $I $v -$iuO62 ^i $u ^5 -$i t y2 $I } T5 -^i T1 ^i t *05 $i $t -^I$sO16 -$I sI* Z2 +^I $s O16 ^I s9@ ^I s6H $I s41 @@ -57941,7 +49080,6 @@ $I q -5 $I $P ^i ^P $i oAa -^I o9H ^I o87 ^I o84 ^i { o7k @@ -57962,34 +49100,28 @@ $I o1i ^T ^i o1] ^i o1< [ $i o0t -$i o0s Z1 $i $n D9 $i ^M $i $m $I l ^U -^i ^L ^i K i0F $I K ^i ^K -$I $i z2 $I i7L $I i6X Z1 $i i6u $i i6n -^i i6b o3s ^i i6. ^i i5d ^i i54 $I i4H $i i4b ^i i3O -^ii3gO52 +^i i3g O52 ^i i24 $i i1i ^i i1g ^C -^I i1C ^I i0w -^i i0F K ^I ^I ^I $i ^i $I @@ -58003,18 +49135,16 @@ $i D9 $n ^! $i D5 ^i D2 $i ^D -$IcO61 $i c *68 $I $C ^I ^C ^i ^c iB- Y2 -iBX Z1 [ iBX [ Z1 -iB=O74 -iB-O51 +iB= O74 +iB- O51 iBW c -iBuO56 +iBu O56 iB u $I $B t iBt @@ -58025,18 +49155,18 @@ iBM iB_ K iBk iBJ u -iBe$yO84 -iBeO84$y +iBe $y O84 +iBe O84 $y iBe iBC ^F iB, c -iBaO82 -iBaO71 -iBaO61 +iBa O82 +iBa O71 +iBa O61 iB8 ] -iB5y4O35 +iB5 y4 O35 iB. $5 -iB4O27 +iB4 O27 iB+ $4 $@ iB4 iB3 ] @@ -58051,73 +49181,67 @@ $# iB* ] iB@ iAz oBx iAZ E -iAxO36y2 +iAx O36 y2 iAx o9u -iA`O51 -iA%O05 -iAvO81E -iAvEO81 +iA` O51 +iA% O05 +iAv E O81 iAv -iAu sue iBf iAu iBf sue iAt D7 iA# T3 iA_ t iAs -iArO64 -iArO54 +iAr O64 +iAr O54 iAr K iAr *8B -iAPOA3+B +iAP OA3 +B { iAo *A0 iA_ o3n -iAnO06 +iAn O06 iAn u -iAmO64u -iAmuO64 +iAm O64 u iAm c iAM *A8 .7 iAM iAm ] iAL iA_ l $. -iA_ $. l $. iAl ] iAl iAl iAh iAg -iAEiBpO7A +iAE iBp O7A iAe $1 iA, E -iAD l $0 +iAD $0 l iA@ D7 iA_ D6 iA- D2 -iAD $0 l iAd -iAaO25 +iAa O25 iAa D6 iA *98 iA/ ,9 iA9 -iA8O72 -iA8O32 -iA7O71 +iA8 O72 +iA8 O32 +iA7 O71 iA7 o9( iA7 iA6 i9@ iA6 *65 $3 iA6 $3 *65 iA3 ] -iA2O42 +iA2 O42 iA2 o9t iA2 -iA1O42-3 +iA1 O42 -3 iA1 u iA1 iB0 iA1 *9B oB7 -iA1-3O42 iA0 oB9 iA0 o8_ iA0 iA. @@ -58137,54 +49261,51 @@ i9Z y1 ,A i9z $0 i9< Y2 i9y -i9xO62 -i9XO54l -i9XlO54 -i9'O93} -i9-O72*25 -i9.O62 -i9.O51 -i9_O45 -i9.O41 -i9-O32 -i9#O25 -i9 O07y3 -i9@O04 -^@i9.O03 -i9wO53 -i9vO05 +i9x O62 +i9X l O54 +i9' O93 } +i9- O72 *25 +i9. O62 +i9. O51 +i9_ O45 +i9. O41 +i9- O32 +i9# O25 +i9 O07 y3 +i9@ O04 +^@ i9. O03 +i9w O53 +i9v O05 i9V u i9u o7h i9U C i9U $9 -i9t D4 *23 -i9t *A8 i9t *23 D4 +i9t *A8 i9- t i9t -i9sY2O43 -i9sOA2E -i9sO43Y2 +i9s Y2 O43 +i9s E OA2 +i9s O43 Y2 i9s u i9s ^s -i9sEOA2 i9 s95 i9s ] .4 i9s .4 ] i9S -i9RO21[ +i9R O21 [ i9r o8e i9r o7f i9r -A i9r i9p o7w -i9oO31 +i9o O31 i9o u i9o o5c i9o K i9O iAK $. i9. oB9 -i9;o9lO43 +i9; o9l O43 i9$ o7@ i9n $a i9n ,8 @@ -58192,18 +49313,16 @@ i9N i9M y2 i9M o8F i9m *97 -i9lO63 +i9l O63 i9L E -$. i9_ l i9k RA i9k +A i9/ K ^= i9k { -i9jO54 +i9j O54 i9J u i9J c i9j ,9 -3 -i9j -3 ,9 i9i i9k i9i c -5 i9- i81 @@ -58211,10 +49330,8 @@ i9. i6n i9i -5 c i9_ i0s [ i9i -i9hO27 i9g i8 -i9EO73o67 -i9Eo67O73 +i9E o67 O73 i9e K iBu i9e iBu K i9 E D2 @@ -58226,14 +49343,13 @@ i9, E i9/ DA $* i9/ $* DA i9_ D3 -i9 D2 E i9C C i9c *65 i9c i9B D1 i9b -B i9b ] -i9AO21 +i9A O21 i9A o8F i9a iAj i9. $A @@ -58250,12 +49366,12 @@ i98 ^1 i98 ] $@ i9, .8 $- i9_ -7 -$@i96O35 +$@ i96 O35 i96 iA2 i9 *67 i96 i95 Y1 -i95O72^f +i95 O72 ^f i95 o8@ i95 o1k i95 +8 @@ -58264,24 +49380,19 @@ i95 ,1 $@ i95 $! i95 i95 -i94O03 -$! i94 s1m i94 D1 -i9,*45O51 +i9, *45 O51 i9, $4 i93 Z2 -i93 *5A i93 -4 i93 $* i92 [ E ] i92 -6 -i9-*25O72 ] i92 i91 Y2 i91 TA i91 D6 -0 i91 *87 -i91 -0 D6 ^I *91 i90 c $@ i90 @@ -58289,7 +49400,6 @@ $! i90 i9% ] i9/ ^! i9? -i9! ^_ i9, i9 ] i9^ $* @@ -58300,26 +49410,23 @@ $> i9< ^. i9- ^! i9! i8z Z2 .7 -i8zO53 +i8z O53 i8z C -i8z .7 Z2 i8z ,7 i8. Z4 E i8y Z3 -$! i8y l i8y $! ,7 i8y ,7 $! -i8xO43 -i8XO12 +i8x O43 i8X s*D -i8 O95 -i8#O51 -i8/O42 -i8-O42 -i8.O24^S -i8-O24 -i8_O12 -i8 O01 +i8 O95 +i8# O51 +i8/ O42 +i8- O42 +i8. O24 ^S +i8- O24 +i8_ O12 +i8 O01 i8x i8W c i8v o9k @@ -58335,7 +49442,7 @@ i8u $@ i8- $u ] i8u i8u -i8tO62 +i8t O62 i8t $W i8t shn i8t s3. @@ -58361,9 +49468,7 @@ i8Q i8a i8Q $1 i8q i8p +B .8 -i8p .8 +B -i8p *43 -i8_p1O98 +i8_ p1 O98 i8P i8p i8o Z1 @@ -58390,41 +49495,35 @@ i8n ,3 i8m ^M i8m $m i8M -i8lO92u -i8lO15 -i8luO92 +i8l O92 u +i8l O15 i8l t -i8@ l o6e i8l D1 i8l +9 [ i8l *53 p3 i8l ] [ i8l i8k Z1 C -i8kO34 +i8k O34 i8= $K l i8k K i8K i8* i8K ^e -i8k C Z1 i8* K *67 i8k $6 i8= K $@ i8K i8k i8j D5 -i8J*48O52 +i8J *48 O52 $. i8j ] i8j -i8i Z1 D0 -i8i t '9 -i8i o4g i8i D0 Z1 +i8i '9 t +i8i o4g i8% iA3 i8i -A -i8i '9 t i8- i9G $# -i8- $# i9G i8% i92 i8_ i6_ E i8@ i6e @@ -58433,50 +49532,41 @@ i8/ i0/ i8h Y2 i8H c +8 i8H ,9 -i8H +8 c i8h $8 i8h -6 i8h -3 -i8gO42 +i8g O42 i8g *68 i8F c -B i8F -B c i8f *90 -i8. E Z4 -i8eO93 +i8e O93 i8e u 'A i8e t i8e $p -i8_ E i6_ i8e $e -i8e 'A u i8e 'A i8e *87 -i8e +7 i8e -7 i8e *28 i8E +0 i8e -i8DO74c +i8D c O74 i8D oA0 i8d o9f D2 -i8DcO74 i8D c i8/ D1 } } i8D -i8cO73,6 -i8cO52 -i8c,6O73 +i8c O73 ,6 +i8c O52 i8) c -i8bO26 i8b -4 i8_ -B -$= i8a l i8a C ] i8A $0 $i *8A ] i8a -i89O64^/ +i89 O64 ^/ i89 r i89 p5 .1 i8/ *9A @@ -58486,7 +49576,7 @@ i89 $@ i8. $9 i8/ ,9 i8_ .9 -i88O32 +i88 O32 i88 $S i88 o2p i88 i80 @@ -58494,15 +49584,13 @@ i88 -9 i88 *8B i88 *54 i88 ,5 $0 -i8#*84O42 -i88 $0 ,5 +i8# *84 O42 i88 $. i8_ $8 i87 Z4 -i8#.7O52 -i87O25 -i87O04 -i87 ^E +i8# .7 O52 +i87 O25 +i87 O04 i87 *83 i87 .4 i8. -7 @@ -58511,42 +49599,36 @@ $@ i87 $! i87 ] i87 ^ i8 $7 -i86 T0 i8* *67 K i86 *39 i8_ +6 ] i86 i85 Z1 -i85O32 +i85 O32 i85 $A -i85 +7 i8@ *56 i85 $5 $? i85 $! i8. +5 $! i85 -i84O42 -i84O12 -i84O02 -i84o5WO14 +i84 O42 +i84 O12 +i84 o5W O14 i84 o0s -i84 D6 i84 c i84 ,9 i84 *84 i84 *58 i8. *45 i8- +4 -i83O61 +i83 O61 i83 oAa i83 o0S i83 $9 $u i8. +3 i82 t *41 -i82 -8 -6 i82 -6 -8 i82 .5 -i82 *41 t [ i82 .1 i8. .2 i8, $2 @@ -58554,9 +49636,8 @@ i8_ $2 i8_ ,2 i81 Y5 u i81 Y3 -i81O25 -i81O23 -i81 u Y5 +i81 O25 +i81 O23 i81 TA i81 o0K i81 +3 @@ -58567,7 +49648,7 @@ i80 u i80 oAr i80 oA= i80 ^K t -i80*B8O35 +i80 *B8 O35 i80 *36 p5 $I { *80 i80 $/ @@ -58605,27 +49686,27 @@ i7y o8f i7y iA1 i7y i6w i7y .6 -i7 y5O36 +i7 y5 O36 i7y $5 -i7.Y3O32 +i7. Y3 O32 i7_ Y3 i7. Y2 Y2 $* i7Y [ i7y -i7XO51 -i7XO45Y3 +i7X O51 +i7X O45 Y3 i7X k $. i7x D8 -i7 OB1 +i7 OB1 i7x *56 -i7@O41 -i7.O32Y3 -i7-O31 -i7)O17 +i7@ O41 +i7. O32 Y3 +i7- O31 +i7) O17 i7x $1 -i7!O04d -i7*O03 -i7*O02 +i7! O04 d +i7* O03 +i7* O02 i7# $x $@ i7x i7w o6k @@ -58633,44 +49714,36 @@ i7w i7j ,4 i7w $A i7W .6 i7w .6 -i7w ,4 i7j i7w -1 i7W *07 $_ i7w [ i7w -^. i7w i7v t i7v o6d $? i7V i7v ] i7u Y1 *64 -i7uO41,3 +i7u ,3 O41 i7u u i7u C i7u *64 Y1 -i7u,3O41 -i7TO41c +i7T c O41 i7t k ] i7t D3 -i7TcO41 i7t *84 i7t *72 .0 i7t .6 -i7% T5 i7t $5 i7# T3 i7. T2 -i7t .0 *72 i7+ T0 *45 i7t [ -i7sOB1 -i7sOA2 +i7s OB1 +i7s OA2 i7S u -i7s s90 [ i7s [ s90 i7s s75 i7! sdD -i7s D0 i7S c T2 i7S c i7s $B @@ -58678,12 +49751,10 @@ i7s -8 i7s *71 i7- s57 o8- i7- s18 -} i7' s0z i7$ s02 i7s ] i7r r i7r o6j -i7r o1y i7r [ C i7r +9 i7r -8 @@ -58691,16 +49762,14 @@ i7r +6 i7r .6 i7r *46 i7_ R1 D3 -i7R *08 -i7QO42 +i7Q O42 i7Q $T i7Q ^Q -i7q+8O31 +i7q +8 O31 i7p srk i7p o8m i7p c i7p +5 -i7p *34 i7* p3 .2 i7* p2 i7* i7 p2 $9 @@ -58708,9 +49777,8 @@ i7P i7p { i7@ $p i7o Y2 -i7oO51 -i7oO02 -i7Op1O81 +i7o O02 +i7O p1 O81 i7o o6y i7o o6g i7o $o @@ -58718,12 +49786,10 @@ i7o i8n ] i7@ o9a i7@ o99 i7o '9 -i7- o8- s57 i7o *8A i7] o7. *9A i7@ o60 K i7+ o60 -i7| o48 i7* o2u i7, o1g i7O @@ -58736,14 +49802,12 @@ i7n $! i7m Y2 i7m t -8 i7m s4P -i7m k D2 -i7M E i7m D2 k +i7M E i7M c i7m -8 t i7m *75 i7m .6 p5 -i7M *46 i7m *08 i7m +0 $! i7m @@ -58765,7 +49829,6 @@ i7j o8w i7j o5i +4 i7j D6 i8k i7j .6 -i7j +4 o5i i7# $J i7i $W i7I t @@ -58803,19 +49866,19 @@ i7h *70 i7h .6 i7h *53 i7h [ -i7gOA1 -i7gO23 +i7g OA1 +i7g O23 i7G o1@ i7g ,B D8 i7g $3 i7G -i7fO81D6 +i7f O81 D6 i7f D3 i7f ,8 *83 i7f *07 i7e Y3 -i7eO92 -i7eO12 +i7e O92 +i7e O12 i7e i7g i7e $a i7e +8 @@ -58825,7 +49888,6 @@ i7d i7e i7d i4t i7d ^D i7_ D4 -i7_ D3 R1 i7@ D3 i7' D3 i7@ D2 @@ -58833,26 +49895,22 @@ i7/ D1 *75 i7d *13 [ i7d i7d -i7cO43 -i7cO12 -i7cO01O32 +i7c O43 +i7c O12 +i7c O01 O32 i7c sDW i7c D2 *17 i7* C i7- C i7c ] -i7c [ -i7BO43 i7B u i7B i7L i7B D4 *73 i7b -A -i7b *61 -i7b *16 i7@ ,B i7 -B i7a Y4 *37 -i7aO21 +i7a O21 i7a K ,9 i7a i2n ] i7A E @@ -58864,13 +49922,11 @@ i7 -A i7A i7_ ^a i7a -i79O31 +i79 O31 i79 C ,4 -i7] *9A o7. -i7! *97 +8 +i7! +8 *97 i79 +6 ] i79 .6 -i79 ,4 C i79 *48 i7* *94 *7B i79 *34 @@ -58889,26 +49945,22 @@ i7 +8 Y2 i78 u i78 R6 i78 i7. -i78 D3 c -i78 D1 i78 c D3 +i78 D1 i78 -A -i7! +8 *97 i78 *73 i78 $7 -i7+*86O43 +i7+ *86 O43 i7- *85 Z1 i78 .3 i7@ +8 i7. +8 i7! ,8 -i7(.7O32 +i7( .7 O32 i77 p4 $8 i77 $G -i7* *7B *94 i77 $A i77 -9 -i77 -8 i77 .6 i77 [ i7# $7 @@ -58916,7 +49968,7 @@ i7- $7 i7_ $7 $# i76 Z2 i76 Y3 Y3 -i76y3O46 +i76 y3 O46 i76 Y3 T2 i76 T3 i76 T2 Y3 @@ -58924,7 +49976,6 @@ i76 o68 i76 C i76 'B *67 i7. *69 -i76 *67 'B i76 *58 i7- *65 i76 $4 @@ -58936,7 +49987,6 @@ i7/ +6 i7_ $6 $` i76 i76 -i75O01 i7- ^5 L9 i75 i69 ,6 i75 ^C @@ -58950,12 +50000,8 @@ i7@ ,5 i7@ -5 i7_ +5 i74 TB -i74 c $. i74 $. c i74 $a +3 -i74 *68 -i74 -6 -i7+ *45 T0 i74 .5 i74 +3 $a i74 *24 @@ -58963,25 +50009,22 @@ i7% $4 i7. -4 i7/ +4 i73 o6a -i73 o1Z i73 K i73 i8i i73 i34 i73 $9 i73 *69 -i73 *65 ] i73 ] *65 i73 +6 i73 $5 i73 [ [ ^+ { i73 -i72Z2O41 -i72 Y5 l -i72O41Z2 -i72 R3 -i72p3O83 -i72 o0c +i72 Z2 O41 i72 l Y5 +i72 O41 Z2 +i72 R3 +i72 p3 O83 +i72 o0c i72 i67 i72 i4L i72 i3d *06 @@ -58998,13 +50041,11 @@ i7_ $2 i71 i7A i71 i1r ^i *71 *60 -i71 *40 i71 $@ i71 ^@ i7_ ^1 $* i71 -i70O83 -i70O01o6w +i70 O83 i70 ^P E i70 i6p o7* i70 i53 @@ -59012,7 +50053,6 @@ i70 i51 i7. *04 i70 *23 i7& ] -i7@ ^? i7{ $} i7. ^# i7? ^? @@ -59026,33 +50066,27 @@ i7 ] $ ] i7- ] i7_ ^i +7 ] -^i ] +7 ^i ,7 ^% i7% -^% i7& -^$ i7/ ^@ i7@ ^- i7- -^_ i7 ^^ i7^ -i6ZO65o3o -i6Z o4V -i6Zo3oO65 +i6Z o3o O65 i6z o1i i6z L6 i6z i5e i6z *89 -i6#Z4O14 -i6@Z3O13 +i6# Z4 O14 +i6@ Z3 O13 i6+ z1 i6z $* i6y ^y i6y seO i6Y i6N -i6yi0AO13 +i6y i0A O13 i6y E i6y -9 -i6-Y3O03 +i6- Y3 O03 i6 Y3 i6@ Y2 *64 i6@ Y2 @@ -59068,51 +50102,46 @@ i6y ] i6X u ] i6X u i6x $S -i6xo5 OA5 +i6x o5 OA5 i6x o5 i6x o2V i6x $m i6x E -7 i6X D2 -i6,OA1 -i6,O93*54 -i6-O93 -i6X .8 +i6, OA1 +i6, O93 *54 +i6- O93 i6x -7 E -i6@O74 -i6 O73s = -i6.O73 -i6)O52^b -i6/O34 -i6-O32 -i6_O32 -i6 O21 -i6#O14Z4 -i6@O13Z3 -i6+O12 -i6_O12 -i6,O09 +i6@ O74 +i6 O73 s = +i6. O73 +i6) O52 ^b +i6/ O34 +i6- O32 +i6_ O32 +i6 O21 +i6# O14 Z4 +i6@ O13 Z3 +i6+ O12 +i6_ O12 +i6, O09 i6x *04 -i6-O03Y3 +i6- O03 Y3 } } i6X i6x $= i6w Y3 Y3 -i6WO24 -i6wO13k +i6w O13 k i6W o7A $N i6W $N o7A -i6w i8y i6w D1 i6w -8 i6w *74 i6w +5 i6w { $? i6w -i6vO42c -i6vO41 -{ i6v o3B +i6v c O42 +i6v O41 i6V ^E -i6vcO42 i6v .7 i6V *21 $$ i6V @@ -59120,8 +50149,8 @@ i6V i6v $- $! i6v i6u Y3 -i6uO91O31 -i6uO72 +i6u O91 O31 +i6u O72 i6u R4 i6u k i6u DB @@ -59133,43 +50162,37 @@ i6u } i6u ^@ i6, u $= i6u -i6tO04 +i6t O04 i6t skj i6t o7r +8 i6t o3d i6t i1o -i6t $g D0 i6t D0 $g i6@ T9 -i6t +8 o7r i6! T7 i6_ T7 i6t *26 i6+ T1 -i6@ T1 ] i6_ ^T $* i6t i6S Z1 E i6S Y2 i6@ sxw -i6sO73Y1 -i6 s =O73 +i6s O73 Y1 i6s ^X i6s $W i6* sv* i6s p5 *01 -i6s o30 ,5 +i6s ,5 o30 i6/ smf i6 sm1 i6s ^l i6s i6s i6s i6r i6s ^g -i6S E Z1 i6s ^E i6! s9f i6s $6 -i6s ,5 o30 i6+ s5* i6S $! i6s $. @@ -59185,7 +50208,6 @@ i6r L3 i6r ^j i6r i6w i6r ^E -i6R D3 o0S i6R C i6r c i6_ r '8 @@ -59199,8 +50221,7 @@ i6q T7 i6Q $T i6Q o5Q i6q i5i -i6Q ,7 -i6q*0BO24 +i6q *0B O24 i6Q i6` $q i6p i4H o4k @@ -59210,10 +50231,9 @@ i6p -4 i6P $- i6 ^p $! i6p -i6O Y2 t -i6oO74 -i6o u i6O t Y2 +i6o O74 +i6o u i6o $s } i6o o4I i6o o3k @@ -59230,20 +50250,15 @@ i6' o6. K i6o *61 i6o *54 i6o *52 -i6) o5( i6_ o4x -$i .6 o42 -i6o *41 -7 -i6* o37 i6. o2x i6- o2n -[ i6- o1b i6/ o0V i6/ o0B i6< o0> i6- $o i6o -i6nO93 +i6n O93 i6N ^u r i6N u i6n p1 'B @@ -59253,11 +50268,10 @@ i6n o2y i6N E i6N C ] i6n 'B -i6n *86 -0 -i6n +7 i6n -0 *86 +i6n +7 i6m Y3 -i6mO92 +i6m O92 i6M T1 i6M p3 T7 i6m o3N @@ -59277,15 +50291,12 @@ i6l i2g i6l ^D i6L ,5 i6l +4 -i6l *31 i6l *23 *36 -i6l *15 sln i6l ] i6+ l $$ -i6+ $$ l i6k Y2 -i6kO05 -i6kO02 +i6k O05 +i6k O02 i6k t i6' K o6. i6k o5l @@ -59295,11 +50306,9 @@ i6k l -7 i6k $L i6k k i6k i7o $+ -i6k $+ i7o i6k D1 i6& K c i6k '9 -i6K ,7 y1 i6k -7 l } i6k ,1 i6k *02 @@ -59316,7 +50325,7 @@ i6j *13 i6+ ^j ^@ i6j i6i Z3 -i6iO92 +i6i O92 i6i T1 i6i sbl i6i s6e @@ -59345,19 +50354,16 @@ i6/ ] i4l i6- i42 i6 i3d i6 i3 -i6= i2n l i6* i1i i6@ i0c -i6 i0_ i6I -i6hO93 -i6h L7 +i6h O93 i6h D3 i6h .0 $! i6H i6h [ -i6gO12 -i6gO04 +i6g O12 +i6g O04 i6g t +8 i6g ^p i6g o4o @@ -59370,14 +50376,13 @@ i6G *60 i6g ] $@ i6g i6g -i6fO75 +i6f O75 i6f k *23 i6F ^d i6f *34 -i6f *23 k i6@ ^f ] i6f -i6eO41 +i6e O41 i6E L7 c i6e $L i6E i3c @@ -59391,58 +50396,47 @@ i6& E i6d ssW -6 i6d sdv i6d o7a -i6d [ o54 i6D i84 i6D i3D l i6d i2D i6D C -i6d -6 ssW i6@ D3 i6d *23 i6d *10 -i6% D0 i6D { -[ i6D i6d $- ] i6d i6c Z3 *54 i6c Z2 -i6, c Y1 i6c ^t i6c r i6c o8i i6c o8@ i6C L7 i6& c K -i6C i7f +0 +i6C +0 i7f i6c D1 i6_ c 'B i6 C -8 i6c *79 -i6c *54 Z3 i6- c +5 i6c $4 i6c +1 -i6C +0 i7f i6c +0 i6_ $C i6c ] i6@ $c i6b $z -i6bOA4 -i6bO42o0W +i6b OA4 +i6b o0W O42 i6b o7h i6B o3A -i6bo0WO42 i6B c $7 -i6_ 'B c i6b *95 i6b *86 -i6B $7 c i6b *72 i6b *70 [ i6b *69 -i6B ,5 i6b +5 i6b ^3 } i6- 'B @@ -59453,12 +50447,11 @@ $# i6b $. i6b i6a Z2 i6a y2 -i6aO03 +i6a O03 i6a $x i6a sdS i6a s4s i6a ^S -i6, 'A o9a i6A o5T i6a o3i i6a ^M @@ -59468,14 +50461,12 @@ i6a i2) .2 i6a i0r i6a c .7 i6a .8 -i6a .7 c i6A ,7 i6a *31 ^b i6, -A i6_ $a -i69 l d -i69 i40 i69 d l +i69 i40 i69 D8 i69 D1 i69 ^d @@ -59489,18 +50480,16 @@ i6, '9 i6= -9 ] i69 i68 Y5 t -i68O24 -i68 t Y5 -i68 s8 sj2 +i68 O24 +i68 s8 sj2 i68 s8 i68 o2I i68 o1o i68 $O -i68D9O73 +i68 D9 O73 i68 D9 i68 D3 i6 -8 C -$i *68 c i6. *86 i6- *86 i6| $8 ,6 @@ -59516,20 +50505,17 @@ i6 +8 ] i68 i67 z1 -0 i67 Y3 c -i67O21 +i67 O21 i67 u $7 i67 o58 i67 l K -i67 K l i67 c Y3 i67 *87 $1 i6- *78 -i67 $7 u i67 +7 i67 *69 +6 i67 *57 i67 .4 -i6@ *73 *82 i67 +2 i67 $1 *87 i6& -7 @@ -59538,29 +50524,26 @@ i6 $. -7 i6 -7 $. $) i67 $. i66 Z2 -i66O41$o -i66O01 +i66 O41 $o +i66 O01 i66 u p1 i66 t .9 i66 s3B i66 $s -i66 p1 u -i66$oO41 +i66 $o O41 i66 o51 i66 ^A -i66 .9 t -i6| ,6 $8 i66 ,7 i6@ *64 Y2 i66 ,1 i66 $$ i6_ ^6 i65 Y2 K -i65 o1j +3 +i65 +3 o1j i65 o0n i65 K c i65 i8X -i65i5xO03 +i65 i5x O03 i65 i5o i65 i2j i65 $h @@ -59571,13 +50554,9 @@ i6 *59 i65 +8 .5 i65 *78 i65 -7 -i65 .5 +8 i65 $5 -i6,*54O93 i65 $4 i65 .4 -i6 *54 -i65 +3 o1j i6. *53 -5 i65 $% i65 ] @@ -59587,20 +50566,18 @@ i6, +5 i6 ,5 ] i65 i65 -i64 Z3 c +i64 c Z3 i64 Y4 i64 Y2 i7a i64 Y2 -i6$^4O43 -i64O13d -] i64 ssf +i6$ ^4 O43 +i64 O13 d i64 p1 i64 o7S i64 o56 i64 o5- i64 i7a Y2 i64 D4 .3 -i64 c Z3 i64 $8 ] i64 *76 i6- *46 @@ -59619,8 +50596,8 @@ i63 Y2 Y4 i63 ^s z2 i63 R5 i63 i7@ -i63i3]O32 -i63*85O04 +i63 i3] O32 +i63 *85 O04 i63 ^6 i6 *35 i63 *32 @@ -59628,7 +50605,7 @@ i6. *32 i6/ *30 i6/ -3 i6_ ,3 -i62O92 +i62 O92 i62 o7s i62 k i62 i98 @@ -59643,10 +50620,8 @@ i62 } i6. -2 i6` -2 $! i62 -[ i62 i61 ^u i61 RB -i61 o51 i61 o4y i61 ^k ^h i61 ^K @@ -59657,7 +50632,6 @@ i61 $9 *67 i61 ,7 i61 *67 $9 i61 *40 p3 -i61 +4 i61 +3 i61 *25 i61 *24 @@ -59670,14 +50644,12 @@ $/ i61 i60 Z1 -3 i60 Y4 i60 Y3 o3g -i60O02 +i60 O02 i60 $, p3 i60 o3g Y3 -^i *60 *71 i60 .7 i60 -3 Z1 i60 +3 ] -i60 ] +3 i6 *03 i6. *02 ] i6. *02 @@ -59705,8 +50677,8 @@ $_ i6- [ i6, ^, i6, i5z Z1 -i5zy2O43 -i5zO72 +i5z y2 O43 +i5z O72 i5z ^w i5z p1 i5z o4J @@ -59714,7 +50686,6 @@ i5z i4o i5Z E *85 i5Z c i5z $A -i5Z *85 E i5z +8 i5z *63 i5; Z2 @@ -59724,7 +50695,7 @@ i5* Z1 $i ,5 Z1 i5@ z1 i5y $z -i5yO91c +i5y c O91 i5y $x i5y $p i5y o0r @@ -59734,7 +50705,6 @@ i5y i3r i5y i0a i5y $i i5y D2 -i5ycO91 i5y C i5@ y5 t i5` y5 D5 @@ -59753,7 +50723,7 @@ i5y ^2 i5y $# $@ i5y } i5y -i5xO17E +i5x O17 E i5x $W i5x ^w i5x $N @@ -59761,46 +50731,41 @@ i5x $n i5X i6A i5x i3t i5x i1j -i5xEO17 i5X d ] -i5 OA2 -i5#O81 -i5-O72i34 +i5 OA2 +i5# O81 +i5- O72 i34 i5x ,6 -i5[O56T0 -i5'O41o5V -i5@O32 -i5@O31*23 -i5-O31 -i5 Z4 @@ -62390,7 +53132,6 @@ i2m D7 i2M D4 f $/ i2m d i2m $c -i2m *75 t i2m *57 i2m +5 i2m *35 @@ -62399,18 +53140,16 @@ i2m +1 i2m *05 ^D i2m { [ i2m -i2lO82*18 -i2lO34*10 +i2l O82 *18 +i2l O34 *10 i2l ^q ,6 i2l o89 $. i2l $. o89 i2l $A -i2l*8BO23 -i2l *51 +i2l *8B O23 i2l +5 i2l $4 i2L ,3 -i2l*10O34 i2l +0 i2l $+ i2l $, @@ -62433,14 +53172,13 @@ i2% K ] i2k i2j y4 ] i2j ] y4 -i2jO73 -i2jO72 -i2jO51 -i2jO43 +i2j O73 +i2j O72 +i2j O51 +i2j O43 i2j $v i2j p3 -3 i2j o6o D4 -i2J o4O i2J L4 i2j D0 o5e i2j ^a @@ -62448,7 +53186,6 @@ i2j ,9 i2j *57 i2j -5 *37 i2j $4 -i2j *37 -5 i2j *27 i2j *03 i2_ ^j @@ -62463,7 +53200,6 @@ i2I c -A i2I -A c i2_ iA_ i2i ,7 $4 -i2i *72 i2 i6e i2i *53 i2i *51 @@ -62473,7 +53209,6 @@ i2_ i4i i2i $4 ,7 i2< i36 i2I ,3 -i2] i2[ k i2' i1' i2- i1_ i2- i0v @@ -62482,16 +53217,14 @@ i2i [ +0 ] i2i i2h y2 i2h ^y -i2hOA2 -i2HO63l -i2hO42 +i2h OA2 +i2H O63 l i2h u i2h s85 i2h s2s +5 i2h o75 i2h o63 i2h o4c -i2HlO63 i2H K i5h i2h K ^+ i2h ^+ K @@ -62508,10 +53241,10 @@ i2H c i2h +5 s2s i2h -3 $. i2h -i2gy5O85 -i2GO52d -i2GO34+0 -i2gO34 +i2g y5 O85 +i2G O52 d +i2G O34 +0 +i2g O34 i2g $x i2g ^T i2g p4 *31 @@ -62528,7 +53261,6 @@ i2g $8 i2g *63 i2g *47 ] i2g ] *47 -i2G+0O34 i2G $! i2g $@ i2f y4 @@ -62555,17 +53287,13 @@ i2E y3 ^E i2e $w r i2E u i2e L4 -$@ i2e k i2e i7t i2e ^i i2E ^E y3 i2E E -i2e E -i2E c i2e c i2e ^A i2e ,3 -i2e -3 i2e *03 i2# E i2. ^E @@ -62573,12 +53301,11 @@ i2e ] i2d Z2 $^ i2D Y2 Y2 i2d Y1 -i2dO82 +i2d O82 i2d s96 i2d $R i2d o1l i2d k -i2D i7d i2d i4# i2D i3g i2d D7 @@ -62595,26 +53322,21 @@ i2d -0 i2d $, i2_ d [ i2d -i2c Y3 s0- -i2c y2 -i2cO82+7 -i2c t k i2c s0- Y3 +i2c y2 +i2c O82 +7 +i2c k t i2c o5w i2c o4z *43 -[ i2c o1p i2c o0l i2c L6 i2C l [ -i2c k t i2c ^k i2c i6 [ i2c E [ i2C c i2@ ^c c i2c $9 *95 -i2c+7O82 -i2c *67 i2c *60 i2c ,6 i2C -1 @@ -62622,8 +53344,8 @@ i2c *07 i2c -0 i2! C i2b y2 -i2bO52 -i2bO32 +i2b O52 +i2b O32 i2B ^U i2b o1x i2b $n @@ -62642,42 +53364,37 @@ i2b *16 i2- $b { i2b ] i2b -i2AY5O23 +i2A Y5 O23 i2a Y2 i2a Y1 L6 -i2AO41l -i2AO23+4 +i2A O41 l +i2A O23 +4 i2A T3 [ i2a sr7 *05 i2a R3 i2a ^P +8 i2A o3l -i2AlO41 i2a L6 Y1 i2A L5 i2a i7o i2a i6n c i2A i45 i2A ^F -i2A E i2a E i2a D7 -i2A D5 ,3 -i2a c i6n +i2A ,3 D5 i2a 'A i2 *A9 i2a +6 -i2A ,3 D5 i2a *26 i2& $a ,2 -i2a *05 sr7 i2a *04 i2@ ^A i2_ 'A i2a $^ i29 Z2 i29 y1 *41 -i29O62 +i29 O62 [ i29 *61 i29 *53 ,6 i29 $% @@ -62686,12 +53403,12 @@ i28 ^o i28 i33 i28 i23 i28 } $h -i28fO59 +i28 f O59 i28 *74 i28 ,3 i28 *14 i2- '8 -i27O52 +i27 O52 i27 ^n i27 i34 i27 +3 @@ -62706,41 +53423,32 @@ i2* *64 i26 ,3 i2 *62 +1 i2- ^5 z1 -i25O41$@ -i25$@O41 +i25 O41 $@ +i25 $@ O41 i25 u ^B -} i25 su7 i25 o1d .4 i25 i63 i25 i4m i25 i3- -i25 ^B u -i25 +5 -i25 .5 -i25 .4 o1d i2_ +5 $. i25 i24 Z1 -i24 Y1 T0 -i24 $x *92 i24 T0 Y1 +i24 $x *92 i24 p1 'B i24 o7. i24 [ o5h i24 o39 i24 ^n i24 i4t -i24 *50 *34 i24 *34 *50 i24 } i2_ $3 y2 i23 o7w -[ i23 o12 i23 K i23 i6g i23 i2t i23 i1j -^i *23 D6 i23 '8 i23 *58 i23 *53 @@ -62755,12 +53463,9 @@ i22 $z i22 Y3 ,5 i22 $x i22 T4 i76 -{ i22 sI4 i22 o0P -i22 i76 T4 i22 i2s i22 i2A -i2& ,2 $a i2. *29 i22 '8 i2@ *28 @@ -62770,25 +53475,20 @@ i2 *25 i22 *42 *52 i22 .3 p1 i21 Z1 -i21O81 +i21 O81 i21 T1 i2, -1 p4 [ i21 o62 i21 $O i21 ^o -i2. -1 D4 -i21 *73 i21 '7 -i2 +1 *62 i21 *52 i21 ^3 i21 +1 -i20O62 +i20 O62 i20 o5m K i20 o1m -i2@ +0 o1L i20 K o5m -i20 i6* i20 i24 i20 i15 i20 D6 @@ -62800,10 +53500,7 @@ i20 ^I ,2 i2+ [ i2& $; -i2* ^@ -i2$ ^# i2@ $. -i2] ^[ i2. $! i2/ i2! } @@ -62811,23 +53508,20 @@ i2! i2_ $i ^2 $! i2# -} i1z y3 -i1zO61 -i1zO43 +i1z O61 +i1z O43 i1z R0 i1z o3x i1z o3? D2 i1z i10 i1z ^b -i1z [ ^a i1z *71 i1z *30 i1/ z1 E i1z *18 k i1@ $z -[ i1z i1y y3 -i1yO71 +i1y O71 i1y sx, i1y o7b i1y i6Z @@ -62841,38 +53535,33 @@ i1. Y1 i1$ y1 i1_ ^y i1X { z5 -$& i1x Z4 -$& i1x Z2 -i1x{O31 +i1x { O31 ] i1X sXd i1x p4 Y5 -i1x o0z .7 +i1x .7 o0z i1x i07 i1x D7 i1x ^c -i1#O82.0 -i1x .7 o0z -i1 O41 -i1%O32i31 +i1# O82 .0 +i1 O41 +i1% O32 i31 i1x ,2 i1x -2 -i1(O17 +i1( O17 ] i1x i1x -i1wY4O37 -i1wO53 -i1wO52 +i1w Y4 O37 +i1w O53 +i1w O52 i1w $t i1w r y2 i1w $r -i1w o6u o0M i1w o0M o6u -i1W o0E i1w i4q i1w i1t y1 i1w D7 i1w -4 -i1w^1O36 +i1w ^1 O36 i1_ ^w $ i1w ] i1w @@ -62883,18 +53572,17 @@ i1v *13 i1V $0 i1v $* i1u y2 -i1uO52 +i1u O52 i1U s2l i1u o5k i1u o3k [ i1u o2P i1u o2f i1u *52 -i1u *20 i1u +0 i1# ^u i1t $x -i1t R0 *43 +i1t *43 R0 i1t ^p i1t o6Z i1t o43 @@ -62904,19 +53592,15 @@ i1t i0a i1T ^A k i1T ^A i1t *51 -i1t *43 R0 i1t $2 i1, T0 -i1t $! i1t } -i1t [ -$# i1t [ ] i1t i1t i1s Z3 i1S Y3 c -i1SO32.4 -i1sO01o3p +i1S O32 .4 +i1s O01 o3p i1s t i1S R7 D4 i1* sMz *45 @@ -62927,7 +53611,7 @@ i1s ^h i1s ^e i1S c Y3 i1s ^a -i1s*72O43 +i1s *72 O43 i1s +3 i1s $@ { i1s @@ -62941,19 +53625,16 @@ i1r K .2 i1R i8s i1r i4d i1r i1k -i1R E *43 -i1r c *25 +i1R *43 E +i1r *25 c i1r ^b i1r +8 i1r +7 i1r +6 i1r +5 -i1R *43 E i1r -4 -i1r *37 i1r .2 K i1r *28 -i1r *25 c i1r *17 i1r .0 i1q ^s @@ -62965,25 +53646,22 @@ i1q *51 $@ i1q i1q i1p ^z -i1pO01T6 +i1p O01 T6 i1p $S o01 i1p si. i1p sdg -i1P o0V -i1p o01 $S i1P k *96 i1p i2h i1P i0I -i1P *96 k i1p .5 p5 i1@ p4 i11 i1p +2 i1p $. i1o y3 i1O $y -i1oO32 +i1o O32 i1O u -i1o sSY D6 +i1o D6 sSY i1o ssy i1o ^S i1o p1 @@ -62995,13 +53673,10 @@ i1o i6i i1o i2b i1o $g i1o E .6 -i1o D6 sSY i1o ^c p4 -i1O c ,9 -i1o c i1O ,9 c +i1o c i1o *78 -i1o .6 E i1_ o59 ^t i1o .3 i1@ o2# K @@ -63015,21 +53690,18 @@ i1n Z2 i1n Y4 i1n y2 i1n $x p5 -i1N u *12 +i1N *12 u i1n ^p i1n K ^c i1n K i1n $G i1n d -i1n ^c K i1n $4 i1n .3 *13 -i1N *12 u i1@ ^N i1m z5 C i1m z2 -i1mO31t -i1mtO31 +i1m t O31 i1m D4 i1m C z5 i1m c @@ -63040,7 +53712,7 @@ i1m *13 $. i1M i1* ^m i1l Z1 -i1lO32 +i1l O32 i1l ^u u i1L $r i1l o2m @@ -63056,7 +53728,7 @@ i1L d ] i1l C i1L ^B +1 i1l ^A -i1l.6O31 +i1l .6 O31 i1L $5 i1l -2 i1L $! @@ -63069,46 +53741,37 @@ i1k y2 i1k Y1 y3 i1k y1 u i1k Y1 *40 -i1kO62 -i1k u y1 +i1k O62 i1k R0 i1k o57 i1k o3o ] -i1k ] o3o i1@ K o2# i1k i4m i1k ^5 i1k *45 -3 i1k *40 Y1 -i1k -3 *45 i1k $3 i1_ K .0 i1& K i1_ K -^- i1K i1k $! i1j y5 *17 -i1JO62[ +i1J O62 [ i1J u $7 i1j s1h i1j i6n i1j i3g i1j ^H -i1j ^E i1j D7 i1j $b -i1J $7 u -i1j *56 i1j -2 i1@ ^j i1j -i1i y2 Y1 +i1i Y1 y2 i1i y2 -8 i1i Y2 i1i y2 -i1i Y1 y2 -i1iO92 -i1i o0c +i1i O92 i1i i5, i1i i2o i1i '9 $2 @@ -63116,51 +53779,42 @@ i1i ,8 i1i .4 i1* i4* i1. i1r -i1i *17 i1- i0v i1_ i0u i1i -0 i1I $# i1i $! -i1hZ1O51 +i1h Z1 O51 i1H Y2 -i1hO51Z1 -{i1hO41 -i1hrO32 +i1h O51 Z1 +{ i1h O41 +i1h r O32 [ i1h R6 i1h $Q i1H o74 i1h o7/ i1H l $_ -i1H $_ l i1h ^K i1h i9_ i1h i2m i1H E *32 i1h D4 i1h ^b -i1H *32 E i1h } i1g y3 i1G Y1 -i1gO62*41 -i1gO32srb +i1g O62 *41 +i1g O32 srb i1g $v i1g t *64 -i1g syq D0 -i1gsrbO32 +i1g D0 syq i1G o6# i1g o3n k -i1g k o3n -i1G k ^F i1g i67 i1g i5f i1g i5a -i1g$HO84 -i1g D0 syq +i1g $H O84 i1g ^d -i1g *64 t -i1g*41O62 i1g ,3 i1g .2 i1g $1 @@ -63168,9 +53822,8 @@ i1G i1F z2 Y1 i1F Z1 [ i1f y2 -i1F Y1 z2 i1f Y1 i5- -i1fO23 +i1f O23 i1f t i1f ^Q o0y i1f o45 @@ -63188,8 +53841,8 @@ i1f ] i1e y2 .3 i1e Y2 i1E Y1 o3z -i1eO52+4 -i1eO41 +i1e O52 +4 +i1e O41 i1E ^S i1E o3z Y1 i1e o2d @@ -63197,9 +53850,7 @@ i1e L0 i1e i5i -9 i1e i4k *24 i1e i2v -i1e i0E [ i1e $f -i1e E ^$ i1E D6 i1e D4 i1e C @@ -63207,20 +53858,16 @@ i1E ^A i1e ^A i1e $a i1@ E *65 -i1e+4O52 } i1E ] -} ] i1E i1e $! $) i1e { i1e ] i1e i1d y5 -i1d Y4 u -i1D y1 -i1dO05o2g i1d u Y4 +i1D y1 +i1d O05 o2g i1d ^p u -i1d i4s i1D i2u i1d i2s i1d i28 @@ -63239,14 +53886,12 @@ i1d $$ ^ i1d i1c Z1 { i1c y5 -i1CO54u -i1cO23*64 -i1CuO54 +i1C O54 u +i1c O23 *64 i1C s8E i1c o3* i1c ^i i1c D4 -i1c *87 i1c *30 i1C } i1C @@ -63258,30 +53903,26 @@ i1B y1 i1B s5E i1b R0 i1b o0m -i1B l *41 +i1B *41 l i1B i66 i1b i0R -i1B *41 l i1b *14 i1b -0 $* i1B i1b $+ $! i1b i1a Z5 Z2 -i1a Z2 Z5 i1A Z2 i1a Z1 y3 i1a y3 Z1 i1a y3 *07 i1a Y3 -i1A y1 i1A sod i1A o2X t i1A o2J i1A o1y $0 i1a ^m i1A $k -i1a i8. i1a i4r p3 i1a i3Y i1a i1S @@ -63293,18 +53934,13 @@ i1a ^B o7# i1a +9 i1A *82 i1a ,6 -i1A $0 o1y ^+ i1A -i1a $# [ i1a [ $# i1a ^@ -} i19 Z1 -i19 y3 y3 } i19 Y1 +i19 y3 y3 i19 u K i19 o6S i6M -i19 K u -i19 i5F i19 $h i19 ^6 i19 ,2 @@ -63321,8 +53957,6 @@ i1- *84 i18 $* -2 i18 -2 $* i1- ,8 *15 -i18 .0 D2 -} i18 ^* i18 i17 Z1 i17 ^M @@ -63330,18 +53964,14 @@ i17 K i17 d E i17 -5 i17 ^3 -i1(*71O53 +i1( *71 O53 i17 *15 i1@ -7 i1. -7 -] i17 -i16 Z2 o04 -i16 Y5 Y5 i16 o04 Z2 +i16 Y5 Y5 i16 i18 -i1@ *65 E i1_ *61 $f -i16 +0 i16 ] i15 i4z i15 i2y @@ -63350,14 +53980,12 @@ i15 ^D *73 i1- *58 D7 i15 *53 i1# -5 ,2 -] i15 i14 y4 i14 T6 i14 ^M i14 i3r i14 i2* i1. *47 -i1* *45 sMz i14 '4 i14 $1 i1@ *41 @@ -63373,20 +54001,15 @@ i13 *62 i13 ^2 *73 i13 *25 p5 i1$ -3 -i12O61 +i12 O61 i12 ^Q i12 o6@ -i12 o1z ^k -i12 o0N $N i12 $N o0N -i12 K c -i12 ^g i12 c K +i12 ^g i12 ^A i12 $a i12 +5 -i1# ,2 -5 -i1` *24 i12 ,2 i12 i11 y3 @@ -63395,15 +54018,11 @@ i11 r +2 i11 K i11 i3s i11 ^G -i1- *15 ,8 -i1@ *13 o0J i11 ^2 o1w i11 ] $. i11 i10 Y4 Y2 -i1#.0O82 i10 $p l -i10 l $p i1_ .0 K i1; *03 .3 i10 *06 y2 @@ -63417,38 +54036,23 @@ i1_ $. i1_ } i1 $. $[ i1[ -^@ i1_ ^" i1# ^! ^! i1! ] -^! ] i1! -^- i1- -i0z Z1 ^j -i0z Y3 y1 -i0z y1 Y3 -i0zO61 -i0zO31 -i0zO12^h +i0z ^j Z1 +i0z O12 ^h i0z $r i0z o7p -5 i0z o3@ i0Z $o -i0z ^j Z1 i0z *87 *25 i0Z *65 $2 -i0z -5 o7p i0Z *42 ^H -i0 z3 -i0+Z2O56 +i0+ Z2 O56 i0Z $2 *65 -i0z *25 *87 i0# z2 +5 -i0z .1 -i0z $% i0- ^z $? i0z -i0YO14 i0y ^T -i0Y ^N i0y i67 Y2 i0y D1 o1o i0y ^B @@ -63459,179 +54063,119 @@ i0- Y1 ^v i0. y1 o5Y i0y *03 $$ i0y -i0X $x i0X ^R i0X o6! -i0x o18 $l -i0x ^N i0x $l o18 +i0x ^N i0X ^K i0x i6o c i0x i2d -4 -i0x i1g -i0X i1C i0x i0n -i0x c i6o -i0X $7 -i0_O61*46 -i0+O56Z2 +i0_ O61 *46 +i0+ O56 Z2 i0x -4 i4Y -i0'O43 -}i0.O41 -i0)O14C -i0!O13^y -i0>O07t -i0-O03i2p +} i0. O41 +i0) O14 C +i0! O13 ^y +i0> O07 t +i0- O03 i2p $% i0X -i0x $* -{ i0x ^/ i0x -i0x i0w z4 *59 i0@ ^w Y5 i0w y1 i0W $w *43 i0W $w i0W $R -i0W ^R i0w o8l -i0W $L i0w i4_ -i0w i1j i0W ^A D3 -i0w $a -i0w $ *76 +i0w $ *76 i0w *74 i0w .5 i0W *43 $w i0w *15 z2 i0$ $W -$& i0W i0w $* i0V y1 ] -i0V ] y1 -i0- ^v Y1 -i0vO53o5s -i0VO31*47 +i0v O53 o5s +i0V O31 *47 i0V ^R -i0v $p k i0v k $p i0v i5@ i0v i3m i0V ^I -i0v D3 i0v ,5 ^& i0v -0 -i0v $$ i0u z1 ^k -i0u y4 i0U Y2 -i0u $y -i0uO35 +i0u O35 i0U sva ,6 i0U sUo .7 -i0U ^R i0u oA# { i0U o5A i0u o4_ i0U l D6 -i0u i4p -i0U D6 l -i0U .7 sUo -i0U ,6 sva -i0U ,4 i0u ,1 -i0u $# -i0u -i0t z2 i0T Z1 i0T Y3 Y3 ^. i0t y1 -i0tO23*34 -i0>tO07 +i0t O23 *34 i0t ^U -i0t $u i0T T5 i0T s0M -i0T ^S i0t r i1B i0t $l i0t i4_ i0T i0L } -i0T i0F i0T $h i0t ^H i0t ^F i0t *74 i0t *67 -i0t ^5 i0t $2 i0T +1 -i0T ^@ -$$ i0T i0t ^! -i0- ^t i0s z4 i0S Y5 Y5 -i0S Y5 i0s y4 i0S y1 -i0sO62 -i0sO21 -i0S ^W +i0s O62 +i0s O21 i0s $v i0s su1 *01 i0s o72 -i0s i2t -i0s i1d -i0s i0w -i0s D4 i0s D2 *16 -i0S c i0s .4 -i0S ,3 i0S *23 i0s ^2 i0, s2, -i0s *01 su1 -^& i0S i0_ } ^s [ i0s i0r Y5 -i0r Y4 i0r y1 } -i0r y1 i0r ^Y -i0RO21^G -i0R ^T +i0R O21 ^G i0r sie +7 i0R o1. i0r L0 -i0R i1N -i0R i1J -i0r i0e -i0r ^d -i0R ^b i0r +7 sie i0r .5 i0R *46 -i0r +3 $% i0R i0@ ^r -i0- r -i0= r -i0qO21$p +i0q O21 $p i0Q $W .4 -i0q$pO21 +i0q $p O21 i0Q $P i0Q o7q i0q i2h i0q -7 z2 i0Q .4 $W -i0q*09O07 +i0q *09 O07 i0! ^Q i0p Z1 *21 -i0pO52 +i0p O52 i0p $x i0P s1W i0p oA2 @@ -63639,203 +54183,137 @@ i0P o90 i0p o1l ^U i0P $o i0p ^m -i0P i0T i0P *52 i0p *21 Z1 i0p *16 -i0_ ^P i0O Z1 i0o Y4 D7 i0O y2 -i0oO12 -i0o ^S i0O o2t -i0O i61 -i0o ^B -i0$ o7# i0# o65 l -i0$ o5$ o4e i0$ o4e o5$ i0_ o41 i0* o3z i0@ o3n i0@ o3i i0n ^Z -i0nO13K -i0n $w -i0N ^R +i0n O13 K i0n ^r i0n p2 *41 i0N o7@ i0N o45 -i0N l -i0nKO13 +i0n K O13 i0N i4u i0N i30 -i0N i1T i0n $f i0N $7 $. i0N *51 -i0N *43 *15 i0N *15 *43 i0n .1 *04 -i0n *04 .1 -i0MO93 -i0m ^r +i0M O93 i0m oA1 i0m o6a i0M o6@ -i0m o4c i0m o3i i0M o1A i0M o1a i0M k o0F -i0M i8m i0m i84 i0M i43 -i0m i2g -i0m i1k -i0M i1j -i0m ^g -i0M ^E i0M d o5V [ i0m D5 -i0m $b i0M ^a i0M +9 i0m -7 ^J } i0M -6 i0m *42 i0l Y5 o0F -i0lO35^; +i0l O35 ^; i0L u i0L s2X -i0# l o65 i0L o5# i0l o3w '8 i0l o1o -i0l o1& *52 +i0l *52 o1& i0L K Y2 i0L ^j i0L i3# i0l i2g i0l i1o i0l ^A T7 -i0l '8 o3w -i0l *52 o1& -i0L *51 -i0l *50 -i0l ,4 i0L $0 i0l $0 ^- i0l $0 -^$ i0L i0@ $l -i0K z5 z4 i0K z4 z5 i0k z4 o27 i0k y5 -4 i0K y2 o0V ^_ i0K y1 -i0kO43z1 -i0KO12 +i0k O43 z1 i0k slz i0K o43 -i0K o3a l -i0K o1h i0K l o3a +i0K o1h i0k i4b -i0K i1B -i0K ^G i0k ^G i0K +6 i0k *36 i0K $3 i0K *13 -i0J Y4 u -i0J ^W i0J u Y4 -i0J ^R i0j o2y c -i0J o1D -i0J^KO63 +i0J ^K O63 i0J i5c -i0J i0F ] i0J ] i0F i0J i0F -i0J ^D -i0j c o2y i0j *60 -i0J $1 i0j ^# i0' $j i0! ^j $+ i0j -i0iO21 +i0i O21 i0i p3 ,A i0I o7. i0I o6- i0i o3k i0I o12 -5 -i0I $o i0i ^o { i0i ^n i0I i4U -i0I ^H -i0i ^H i0i c ^R i0i C *21 i0i ^C i0I $7 -i0i ^6 i0[ i6] -i0I -5 o12 i0I *53 -i0? i49 -i0@i3FO53 -i0# i37 +i0@ i3F O53 i0i *24 -i0i *21 C i0. i0N D6 i0. i0F i0- i0b -i0I i0i } i0i ] ^- i0i i0h ^y -i0H ^R i0h o74 i0h i72 -i0H *32 i0H *31 -i0H *23 i0g Y4 *63 i0g ^r } i0G p2 Z1 -i0G ^P i0g o5m -i0g ^m i0g i87 i0g i6b -i0G i0F i0g -3 i0G *24 ^F i0G $! ^1 -i0G $* i0= ^G -$* i0G -i0G -i0F z1 -i0f y1 -^.i0FO32 -i0fO12*31 -i0F ^W -i0F ^U +^. i0F O32 +i0f O12 *31 i0f t *06 i0f soi i0f sme -i0f ^s i0f o5c i0F o3* i0f ^m @@ -63843,97 +54321,59 @@ i0F k o0! i0F ^J i0f i7/ i0F i2E -i0F i1G -i0f ^9 -i0f ] -7 i0f -7 ] i0F ^4 -i0f *06 t -i0F $* } i0F i0@ ^f -i0Ey5O78 -i0eO52-2 +i0E y5 O78 +i0e O52 -2 i0e $T i0e o4d i0E o41 -i0E o2f i0e L7 i0e L3 *35 i0E i2 *67 -i0E i1W -i0E i1@ i0e i05 -i0e D5 i0E $C i0E *73 *65 $! i0E -7 i0e .7 -i0E *65 *73 -i0e *45 -i0e-2O52 -i0E $2 i0e ^2 -$# i0e i0d Y2 t i0D y1 i3A -i0DO41 -i0d t Y2 -i0D sm3 { +i0D O41 i0D { sm3 -i0D ^S i0d R7 -i0d o38 *52 +i0d *52 o38 i0D o1w -i0D ^J i0d i7e i0D i4s i0d i3b i0D $i } } i0D $g i0D ^E -i0d $c i0D *54 -i0d *52 o38 -i0d ^2 i0c z1 oA0 -i0)CO14 i0C ^V -i0c ^s -i0C o2@ i0c ^n i0C i6e i0C i5& i0C i4j i0c i4* -i0C ^I i0C ^G -i0C $e i0c $e -i0c ^e -i0C ^D -i0C ^B i0C ^A -i0c +8 -i0c *17 i0b Z2 *78 i0B $$ Z1 -i0B z1 i0B y3 D4 i0b Y1 i12 -i0bO13-4 +i0b O13 -4 i0B ^S K -i0B K ^S i0B i5. i0b i2y i0B i2! i0B i1Q -i0b i12 Y1 i0B $I -i0b $h -i0B ^d -i0b *78 Z2 -i0b $5 i0b } ^ i0b i0a z2 *75 @@ -63948,63 +54388,41 @@ i0a i5x i0A i2Z i0a i2f i0A i1C -4 -i0A i0B i0a i07 i0a ^I -i0A E o6# i0a *A8 i0A *68 Y1 i0A *31 i0a -2 ^2 i0A *01 z2 $) i0a -$. i0a ^* i0a i09 T5 i09 i0k -i09 ^c i09 .3 -i0* -9 -i08 z3 i08 Y3 y1 i08 y1 Y3 -i08 $x i08 o29 i08 $e ^= i08 D8 y4 i08 *04 i49 i0& ^8 -i0/ ^8 -^% i08 -^! i08 i07 ^t y1 i07 o6o z3 i07 D2 -i07 ^c -i06O41 -i06O13 +i06 O41 +i06 O13 i06 ^w -i06 ^V i06 K *03 i06 ^g i06 D3 -i06 ^d i06 +9 -i06 $9 -i06 $7 i06 *03 K -i0! .6 -} i06 -^i *05 t -i05 o6S i05 i7k -i05 i3- i05 ^6 i05 $$ -i04 u $! i04 $! u i04 sea { -i04 { sea i04 r ^v i04 ^M i04 i55 @@ -64014,82 +54432,47 @@ i04 $A *50 i04 *50 $A i04 -4 .2 i04 -4 -i04 .2 -4 -i0@ $4 $? i04 -^. i04 i03 y2 { i03 y1 $q -i03 $q y1 -i03 o3n i03 ^L i03 i3m i0 *31 -i03 ] i0@ ,3 -i0! $3 -i02O25 +i02 O25 i02 $U i02 s2v i02 o24 -i02 o1c i02 i5G E -i02 i04 i02 D2 i02 +6 ^b -i02 $6 i0, *25 *24 -i02 *40 -i02 *04 $? i02 ^i *02 i01 Y4 o1B i01 ^y -i01 ^r i01 o8S -i01 $K i01 i82 i0@ *12 -i0# -1 -i0* $1 i0< $1 -$. i01 -^* i01 i00 y2 $* -i00 $* y2 -i00 s0% i00 L6 { i00 i3. i00 i05 r i00 i0. i00 c { i0* *04 -i00 ^3 i00 *05 i00 -i0% $& -i0# $# -i0# $* i0\ -i0* $. i0* ^# i0* ^/ -i0$ $$ i0) } } i0' ^( -i0/ -i0? -i0! $# i0, $, i0 -i0< -$% i0% -$& i0% -$. i0. ^i $0 ^+ i0- -^# i0* -^_ i0@ $I $. $* ^I { ^I @@ -64105,15 +54488,12 @@ $= ^i ^@ ^i ^( $i $H z5 y2 -^H z4 z2 +^H z2 z4 $H Z4 $H Z3 l -^H z2 z4 ^H Z2 ^H Z1 z1 -^H z1 Z1 ^h Z1 z1 -^h z1 Z1 $H Z1 E ^H Z1 *25 ^h z1 *07 @@ -64121,29 +54501,27 @@ $H z1 ^h z1 { ^H ^Z ^h ^z -$h $y y2 -^H^yO18 +$h y2 $y +^H ^y O18 ^h y4 ^h y3 y3 ^h y3 -$h y2 $y ^H y2 -^@ ^H Y1 ^H $y -$hO83 -$HO62*70 -$HO61 -$hO5B -^HO53 -}$hO53 -$hO32*25 -$HO32 -^hO23 -^HO18C -^HO16$s -}$hO05 +$h O83 +$H O62 *70 +$H O61 +$h O5B +^H O53 +} $h O53 +$h O32 *25 +$H O32 +^h O23 +^H O18 C +^H O16 $s +} $h O05 $h ^w r -$H u o7C +$H o7C u ^H u D7 $H $u ^h $/ ^U @@ -64151,7 +54529,7 @@ $H $u ^H T5 ^H T3 $H $T -^H$sO16 +^H $s O16 ^h s0y ^H r $Z $h r ^z @@ -64162,18 +54540,15 @@ $h [ R0 $H p4 ^A ^h o7w $H o7L -$H o7C u -^Ho6tO23 +^H o6t O23 $h o6a $H o61 $h o6- ^H o5N ^h o4i $H o4| -$H o3G R4 ^h o2y +3 ^H o2y -^H o2r ^H o2d ^H o2 ^H o1p @@ -64186,9 +54561,8 @@ $h ^n ^h $n $H ^M ^H ^M -$H l Z3 ^H L7 -^h L5 *42 +^h *42 L5 ^h ^L $h ^l $H $K p5 @@ -64220,33 +54594,25 @@ $h i2k ^h i2a ^H i28 ^H i2, -^h i1w $H i1h ] ^H i1F -^H i1C ^h i17 -$H i10 ^H i0z -$H i0R $h i0q i57 -^H i0N ^H i0h -$h i0b $H $i $h $i } $h $i $H $G $h ^g -^HfO16 +^H f O16 ^h $F $H E Z1 $h $e ^h ^e -^H D7 u $h D4 ,5 $H D4 ^h ^D -^HCO18 $h $c ^h ^b $H *A7 @@ -64254,12 +54620,11 @@ $h *A6 ^H ^A +4 ^H $9 ^H ,8 ^O -^h*83O42 +^h *83 O42 $H ^8 $H ^7 $h .7 $h ^7 -^h *6A t ^h *68 [ ^h *60 ^h *60 @@ -64271,16 +54636,13 @@ $H $5 $h $5 ^h ,5 ^H *48 -^h *42 L5 $h *41 *27 ^H *41 } $h *40 ^H +4 ^h -4 ^h ^4 } -^h +3 o2y ^h $3 -$h *27 *41 ^h *27 ] ^h ] *27 ^H *25 Z1 @@ -64296,14 +54658,13 @@ $@ ^h $! ^h [ $/ ^h ^. ^h -^g { Z5 ^g z3 $g Z2 *17 $g $z ^g ^y *A9 ^G Y4 Y4 $G y4 y4 -$gY4O14 +$g Y4 O14 ^g y2 u ^g Y2 r ^g y2 C @@ -64314,59 +54675,53 @@ $g y2 $G Y1 l ^g y1 *43 $G $Y -$gOB3t -^GO74 -^gO51 -^gO43 -^gO41 -^gO23 -^gO21 -^gO18 -$gO14Y4 -$gO05$w +$g t OB3 +^G O74 +^g O51 +^g O43 +^g O41 +^g O23 +^g O21 +^g O18 +$g O14 Y4 +$g O05 $w $G ^x -$g$wO05 +$g $w O05 $G $W $g $w ^g ^w ^G ^V y1 $g ^v s2j ^g ^V -^g u y2 $g $U u -$g u $U $G u $H $G u ,5 $G $u -$gtOB3 ^g snf -^g sk_ ^g s.g ^g s9g ^G s8R $g s5c -$g s2j ^v $G s%@ ^g $s -^GrO21 +^G r O21 ^G ^R o3h ^g ^r ^i ^g r $G $g R4 D5 ^g R4 *23 -$g r *12 $G $r ^1 ^G ^R ^g ^R ^g $r $G q *81 -$Gp1O02 +$G p1 O02 ^g $p $g $o Z1 $? $g oAG ^g o97 D7 ^G o91 Y1 -^G o80 *96 +^G *96 o80 ^g o8$ $g o6u $G o6a @@ -64378,14 +54733,12 @@ $g o5i ^g o5h ^g o5d ^G o5 -^g o5? $G o4y $M $G o4F ^G o42 ^G o3s $G o3@ ^g o2v -^g o1r ^G o1p iA0 $g o1p ^G o1h @@ -64398,17 +54751,14 @@ $G $O ^g ^O $G $M o4y ^G ^m -$G l Y1 ^g l *51 $g $l ^G ^K ^G $k $g ^j ^g ^j -^G iA0 o1p ^g i8_ -^Gi7sO14 -^G i6t o0x +^G i7s O14 $g i6s $G i6i } ^g i6e @@ -64435,41 +54785,32 @@ $g i29 ^g i1v ^G i1o $g i1n -^g i1m $g i1h ^g i13 ^g i0T -^g i0m $G i0l -^G i0D -} $g i0D ^G ^I ^g ^i -$G $H u $G $H ^g $g *02 ^g { $G $G $F $G f -^G E y1 $G $e ^g $E $g D9 $G D7 D2 ^g $d *62 -$g D5 R4 ^g D3 +2 ^G c z3 -^g c y1 $G c +0 $G $C $G ^C $g $c $G $b -^g-AO61 +^g -A O61 ^g +A } $g ^a -^G *96 o80 ^g *86 $G +8 $g ,7 i0G @@ -64481,11 +54822,9 @@ $g *68 ^G $6 $g -6 ^g ,6 -$G ,5 u ^g *57 $G *56 D4 $G *54 -^g *51 l ^g $5 ^g -5 ^G *43 @@ -64496,10 +54835,7 @@ $g .3 -2 ^g *30 $g ^3 ^G .2 Y2 -^g +2 D3 ^g $2 -6 -^g *23 R4 -$g -2 .3 $G *20 $. $G $. *20 $g ^2 @@ -64507,7 +54843,6 @@ $g ^2 ^g *19 ^G ^1 $G +0 c -^g *02 $g $g -0 $G $* ^G } $! @@ -64525,7 +54860,7 @@ $* ^g ^' $g ^/ ^g ^ ^g -f$zO59 +f $z O59 ^f z3 ^f z2 ,4 $f Z2 @@ -64534,149 +54869,129 @@ $f [ z2 $f Z1 +4 ^f ^Z $f $z -^fy5O03 +^f y5 O03 f y5 i6H ^F y5 -fy4O98 +f y4 O98 ^F Y3 -fY2O79 +f Y2 O79 f y2 K f Y2 *57 $F y2 -$f Y1 y1 $f y1 Y1 } $f $y -fOB7 -fOA8k -fOA7*86 -fOA6 -fOA5O65 -fOA3,9 -fOA1O61 -fO96c -fO95 -fO92u -fO8BT0 -fO8B -fO86-6 -fO84^m -fO83u -fO82K -$fO82 -fO81$( -f$(O81 -f[O81 -fO7Ai65 -fO7A+3 -fO79Y2 -fO78E -fO76$5 -fO75] -f]O75 -fO74k -fO73C -^fO73 -fO72 -$fO72 -}^fO72 -fO71 -f{O69 -fO67E -fO67[ -fO64T3 -fO64s4x -fO64o3q -fO64 -fO63*79 -fO62c -fO62+4 -fO62*34 -fO61$9 -fO59$z -fO59o38 -fO59i2s -fO59c -fO58*57 -$fO58 -fO57sJN -fO57o5d -fO57$F -fO57$^ -f$^O57 -fO56*97 -fO56 -fO54T0 -fO51s5O -fO51$9 -fO51 -fO47$^ -f$^O47 -fO45i78 -fO43^J -fO42O63 -fO42O62 -fO42k -fO39+1 -fO38*32 -fO38 -fO37O41 -fO37] -f]O37 -fO36t -fO36 -fO35t -fO34K -fO28t -}fO28 -fO26 -fO25 -fO24-3 -f$ O24 -^fO23^j -$fO23 -^fO21 -fO19O21 -fO17D5 -^fO16i02 -fO15r -fO14$s -fO14 -^fO13 -fO12*31 -fO05O35 -fO04] -f]O04 -$fO03q -fO03D5 -fO02+3 +f OB7 +f OA8 k +f OA7 *86 +f OA6 +f OA5 O65 +f OA3 ,9 +f OA1 O61 +f O96 c +f O95 +f O92 u +f O8B T0 +f O8B +f O86 -6 +f O84 ^m +f O83 u +f O82 K +$f O82 +f $( O81 +f [ O81 +f O7A i65 +f O7A +3 +f O79 Y2 +f O78 E +f O76 $5 +f O75 ] +f O74 k +f O73 C +^f O73 +f O72 +$f O72 +} ^f O72 +f O71 +f { O69 +f O67 E +f O67 [ +f O64 T3 +f O64 s4x +f O64 o3q +f O64 +f O63 *79 +f O62 c +f O62 +4 +f O62 *34 +f O61 $9 +f O59 $z +f O59 o38 +f O59 i2s +f O59 c +f O58 *57 +$f O58 +f O57 sJN +f O57 o5d +f O57 $F +f O57 $^ +f $^ O57 +f O56 *97 +f O56 +f O54 T0 +f O51 s5O +f O51 $9 +f O51 +f O47 $^ +f O45 i78 +f O43 ^J +f O42 O63 +f O42 O62 +f O42 k +f O39 +1 +f O38 *32 +f O38 +f O37 O41 +f ] O37 +f t O36 +f O36 +f O35 t +f O34 K +f O28 t +} f O28 +f O26 +f O25 +f O24 -3 +f $ O24 +^f O23 ^j +$f O23 +^f O21 +f O19 O21 +f O17 D5 +^f O16 i02 +f O15 r +f O14 $s +f O14 +^f O13 +f O12 *31 +f O05 O35 +f ] O04 +$f O03 q +f O03 D5 +f O02 +3 ^F ^X f $w Z2 f $w } ^f ^v $F $u Y2 -fuO92 -fuO83 -ftO36 -ftO35 -ftO28 ^F ^T i2X f t $i ^f t d -f T8 T0 -^F T4 -1 -fT3O64 -f t *12 -fT0O8B -fT0O54 f T0 T8 -f$sO14 +^F T4 -1 ^f smg *32 ^f sm/ -fsJNO57 $f sf9 i2j $f sdu -fs5OO51 -fs4xO64 f s2` i4e ^F s2F $F $S @@ -64689,25 +55004,22 @@ $F $r { $f r ^F q q ^F p4 'A -fp1O86 +f p1 O86 $f $p -$f^oO03 +$f ^o O03 f $o o7k f oB3 *75 f oAk -foAbO28 +f oAb O28 f o9R ^F o91 ^f o8x i21 -f o7k $o ^F o77 f o75 $F o71 ^f o71 -^f o6s $f o6c f o5l -[ $F o5F f o54 ^f o5- ^f o4R c @@ -64715,9 +55027,7 @@ $f o4o ^F o41 ^F o4- ^f o3v -fo3qO64 $f o3g -fo38O59 ^f o2v f o2s ,3 ^f o2p @@ -64735,14 +55045,8 @@ $f L4 ^f L3 *50 ^F ^L $F $l -f K y2 -fkOA8 -fKO96 -fKO82 -fkO74 -fkO42 -fKO34 -^F k ^T +f K O96 +f K O34 f K E $f K ^a f K *97 @@ -64751,12 +55055,11 @@ f K *75 f K *67 f k *67 f k *42 -[ ^f K [ f k ^f $J r $f $j f $i t -fi9 kernel_threads_min) { diff --git a/src/backend.c b/src/backend.c index ea6fa7acd..f7c916e1d 100644 --- a/src/backend.c +++ b/src/backend.c @@ -157,13 +157,10 @@ static int backend_ctx_find_alias_devices (hashcat_ctx_t *hashcat_ctx) // show a warning for specifically listed devices if they are an alias - if (backend_ctx->backend_devices_filter != (u64) -1) + if (backend_ctx->backend_devices_filter[alias_device->device_id]) { - if (backend_ctx->backend_devices_filter & (1ULL << alias_device->device_id)) - { - event_log_warning (hashcat_ctx, "The device #%d specifically listed was skipped because it is an alias of device #%d", alias_device->device_id + 1, backend_device->device_id + 1); - event_log_warning (hashcat_ctx, NULL); - } + event_log_warning (hashcat_ctx, "The device #%d specifically listed was skipped because it is an alias of device #%d", alias_device->device_id + 1, backend_device->device_id + 1); + event_log_warning (hashcat_ctx, NULL); } } } @@ -273,9 +270,9 @@ static int ocl_check_dri (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx) return 0; } -static bool setup_backend_devices_filter (hashcat_ctx_t *hashcat_ctx, const char *backend_devices, u64 *out) +static bool setup_backend_devices_filter (hashcat_ctx_t *hashcat_ctx, const char *backend_devices, bool *out) { - u64 backend_devices_filter = 0; + bool backend_devices_filter[DEVICES_MAX + 1] = {false}; if (backend_devices) { @@ -291,7 +288,7 @@ static bool setup_backend_devices_filter (hashcat_ctx_t *hashcat_ctx, const char { const int backend_device_id = (const int) strtol (next, NULL, 10); - if ((backend_device_id <= 0) || (backend_device_id >= 64)) + if ((backend_device_id <= 0) || (backend_device_id >= DEVICES_MAX)) { event_log_error (hashcat_ctx, "Invalid device_id %d specified.", backend_device_id); @@ -300,7 +297,7 @@ static bool setup_backend_devices_filter (hashcat_ctx_t *hashcat_ctx, const char return false; } - backend_devices_filter |= 1ULL << (backend_device_id - 1); + backend_devices_filter[backend_device_id - 1] = true; } while ((next = strtok_r ((char *) NULL, ",", &saveptr)) != NULL); @@ -308,10 +305,16 @@ static bool setup_backend_devices_filter (hashcat_ctx_t *hashcat_ctx, const char } else { - backend_devices_filter = -1ULL; + for (int i = 0; i <= DEVICES_MAX; i++) + { + backend_devices_filter[i] = true; + } } - *out = backend_devices_filter; + for (int i = 0; i <= DEVICES_MAX; i++) + { + out[i] = backend_devices_filter[i]; + } return true; } @@ -1055,8 +1058,8 @@ int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, // - hooks can have a large influence depending on the OS. // spawning threads and memory allocations take a lot of time on windows (compared to linux). // - the kernel execution can take shortcuts based on intermediate values - // while these intermediate valus depend on input values. - // - if we meassure runtimes of different kernels to find out about their weightning + // while these intermediate values depend on input values. + // - if we measure runtimes of different kernels to find out about their weightning // we need to call them with real input values otherwise we miss the shortcuts inside the kernel. // - the problem is that these real input values could crack the hash which makes the chaos perfect. // @@ -1589,7 +1592,7 @@ static void rebuild_pws_compressed_append (hc_device_param_t *device_param, cons const u32 dst_pw_len4_cnt = dst_pw_len4 / 4; pw_idx_dst->cnt = dst_pw_len4_cnt; - pw_idx_dst->len = src_len; // this is intenionally! src_len can not be dst_len, we dont want the kernel to think 0x80 is part of the password + pw_idx_dst->len = src_len; // this is intentionally! src_len can not be dst_len, we dont want the kernel to think 0x80 is part of the password u8 *dst = (u8 *) (tmp_pws_comp + pw_idx_dst->off); @@ -2031,8 +2034,8 @@ int run_opencl_kernel_bzero (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *devi cl_kernel kernel = device_param->opencl_kernel_bzero; - if (hc_clSetKernelArg (hashcat_ctx, kernel, 0, sizeof (cl_mem), (void *) &buf) == -1) return -1; - if (hc_clSetKernelArg (hashcat_ctx, kernel, 1, sizeof (cl_ulong), (void *) &num16d) == -1) return -1; + if (hc_clSetKernelArg (hashcat_ctx, kernel, 0, sizeof (cl_mem), &buf) == -1) return -1; + if (hc_clSetKernelArg (hashcat_ctx, kernel, 1, sizeof (cl_ulong), &num16d) == -1) return -1; const size_t global_work_size[3] = { num_elements, 1, 1 }; const size_t local_work_size[3] = { kernel_threads, 1, 1 }; @@ -3512,7 +3515,7 @@ int run_cracker (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, co if (iconv_ctx == (iconv_t) -1) return -1; } - // find higest password length, this is for optimization stuff + // find highest password length, this is for optimization stuff u32 highest_pw_len = 0; @@ -4396,19 +4399,15 @@ int backend_ctx_init (hashcat_ctx_t *hashcat_ctx) backend_ctx->rc_hiprtc_init = rc_hiprtc_init; hiprtc_close (hashcat_ctx); + } + if ((rc_hip_init == 0) && (rc_hiprtc_init == -1)) + { #if defined (_WIN) event_log_warning (hashcat_ctx, "Support for HIPRTC was dropped by AMD Adrenalin Edition 22.7.1 and later."); event_log_warning (hashcat_ctx, "This is not a hashcat problem."); event_log_warning (hashcat_ctx, NULL); - event_log_warning (hashcat_ctx, "For details please read: https://github.com/hashcat/hashcat/issues/3501"); - event_log_warning (hashcat_ctx, NULL); - event_log_warning (hashcat_ctx, "In order to make HIP work, you have two options:"); - event_log_warning (hashcat_ctx, "- Install AMD Adrenalin version 22.5.1 EXACTLY"); - event_log_warning (hashcat_ctx, "- Read the details from the above link for other workarounds"); - event_log_warning (hashcat_ctx, NULL); - event_log_warning (hashcat_ctx, "You can also just stick to OpenCL support."); - event_log_warning (hashcat_ctx, "To do this, just use --backend-ignore-hip option to ignore HIP."); + event_log_warning (hashcat_ctx, "Please install the AMD HIP SDK"); event_log_warning (hashcat_ctx, NULL); #endif } @@ -4543,27 +4542,6 @@ int backend_ctx_init (hashcat_ctx_t *hashcat_ctx) mtl_close (hashcat_ctx); } - else - { - if (user_options->force == false) - { - // disable metal < 300 - - if (backend_ctx->metal_runtimeVersion < 300) - { - event_log_warning (hashcat_ctx, "Unsupported Apple Metal runtime version '%s' detected! Falling back to OpenCL...", backend_ctx->metal_runtimeVersionStr); - event_log_warning (hashcat_ctx, NULL); - - rc_metal_init = -1; - - backend_ctx->rc_metal_init = rc_metal_init; - - backend_ctx->mtl = NULL; - - mtl_close (hashcat_ctx); - } - } - } } else { @@ -4613,7 +4591,7 @@ int backend_ctx_init (hashcat_ctx_t *hashcat_ctx) event_log_warning (hashcat_ctx, " \"AMDGPU\" (21.50 or later) and \"ROCm\" (5.0 or later)"); #elif defined (_WIN) event_log_warning (hashcat_ctx, "* AMD GPUs on Windows require this driver:"); - event_log_warning (hashcat_ctx, " \"AMD Adrenalin Edition\" (Adrenalin 22.5.1 exactly)"); + event_log_warning (hashcat_ctx, " \"AMD Adrenalin Edition\" (23.7.2 or later) and \"AMD HIP SDK\" (23.Q3 or later)"); #endif event_log_warning (hashcat_ctx, "* Intel CPUs require this runtime:"); @@ -4638,11 +4616,11 @@ int backend_ctx_init (hashcat_ctx_t *hashcat_ctx) * Backend device selection */ - u64 backend_devices_filter; + bool backend_devices_filter[DEVICES_MAX + 1]; - if (setup_backend_devices_filter (hashcat_ctx, user_options->backend_devices, &backend_devices_filter) == false) return -1; + if (setup_backend_devices_filter (hashcat_ctx, user_options->backend_devices, backend_devices_filter) == false) return -1; - backend_ctx->backend_devices_filter = backend_devices_filter; + for (int i = 0; i <= DEVICES_MAX; i++) backend_ctx->backend_devices_filter[i] = backend_devices_filter[i]; /** * OpenCL device type selection @@ -4957,7 +4935,7 @@ int backend_ctx_init (hashcat_ctx_t *hashcat_ctx) event_log_warning (hashcat_ctx, " \"AMDGPU\" (21.50 or later) and \"ROCm\" (5.0 or later)"); #elif defined (_WIN) event_log_warning (hashcat_ctx, "* AMD GPUs on Windows require this driver:"); - event_log_warning (hashcat_ctx, " \"AMD Adrenalin Edition\" (Adrenalin 22.5.1 exactly)"); + event_log_warning (hashcat_ctx, " \"AMD Adrenalin Edition\" (23.7.2 or later) and \"AMD HIP SDK\" (23.Q3 or later)"); #endif event_log_warning (hashcat_ctx, "* Intel CPUs require this runtime:"); @@ -5301,7 +5279,7 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) // skipped - if ((backend_ctx->backend_devices_filter & (1ULL << device_id)) == 0) + if (!backend_ctx->backend_devices_filter[device_id]) { device_param->skipped = true; } @@ -5718,7 +5696,7 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) // skipped - if ((backend_ctx->backend_devices_filter & (1ULL << device_id)) == 0) + if (!backend_ctx->backend_devices_filter[device_id]) { device_param->skipped = true; } @@ -6215,7 +6193,7 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) // skipped - if ((backend_ctx->backend_devices_filter & (1ULL << device_id)) == 0) + if (!backend_ctx->backend_devices_filter[device_id]) { device_param->skipped = true; } @@ -6263,35 +6241,6 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) if (device_param->device_processors == 1) device_param->skipped = true; - // Since we can't match OpenCL with Metal devices (missing PCI ID etc.) and at the same time we have better OpenCL support than Metal support, - // we disable all Metal devices by default. The user can reactivate them with -d. - - if (device_param->skipped == false) - { - if (backend_ctx->backend_devices_filter == -1ULL) - { - if ((user_options->quiet == false) && (user_options->backend_info == 0)) - { - event_log_warning (hashcat_ctx, "The device #%d has been disabled as it most likely also exists as an OpenCL device, but it is not possible to automatically map it.", device_id + 1); - event_log_warning (hashcat_ctx, "You can use -d %d to use Metal API instead of OpenCL API. In some rare cases this is more stable.", device_id + 1); - event_log_warning (hashcat_ctx, NULL); - } - - device_param->skipped = true; - } - else - { - if (backend_ctx->backend_devices_filter & (1ULL << device_id)) - { - // ok - } - else - { - device_param->skipped = true; - } - } - } - /** * activate device */ @@ -7043,7 +6992,7 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) // skipped - if ((backend_ctx->backend_devices_filter & (1ULL << device_id)) == 0) + if (!backend_ctx->backend_devices_filter[device_id]) { device_param->skipped = true; } @@ -7313,6 +7262,22 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) event_log_warning (hashcat_ctx, " Falling back to OpenCL runtime."); event_log_warning (hashcat_ctx, NULL); + + if ((backend_ctx->rc_cuda_init == 0) && (backend_ctx->rc_nvrtc_init == -1)) + { + #if defined (_WIN) + event_log_warning (hashcat_ctx, "If you are using WSL2 you can use CUDA instead of OpenCL."); + event_log_warning (hashcat_ctx, "Users must not install any NVIDIA GPU Linux driver within WSL 2"); + event_log_warning (hashcat_ctx, "For all details: https://docs.nvidia.com/cuda/wsl-user-guide/index.html"); + event_log_warning (hashcat_ctx, NULL); + + event_log_warning (hashcat_ctx, "TLDR; go to https://developer.nvidia.com/cuda-downloads and follow this path:"); + event_log_warning (hashcat_ctx, " Linux -> Architecture -> Distribution -> Version -> deb (local)"); + event_log_warning (hashcat_ctx, "Follow the installation Instructions on the website."); + event_log_warning (hashcat_ctx, NULL); + + #endif + } } } } @@ -7613,6 +7578,57 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) backend_ctx->backend_devices_cnt = cuda_devices_cnt + hip_devices_cnt + metal_devices_cnt + opencl_devices_cnt; backend_ctx->backend_devices_active = cuda_devices_active + hip_devices_active + metal_devices_active + opencl_devices_active; + #if defined (__APPLE__) + // disable Metal devices if at least one OpenCL device is enabled + if (backend_ctx->opencl_devices_active > 0) + { + if (backend_ctx->mtl) + { + for (int backend_devices_cnt = 0; backend_devices_cnt < backend_ctx->backend_devices_cnt; backend_devices_cnt++) + { + hc_device_param_t *device_param = &backend_ctx->devices_param[backend_devices_cnt]; + + if (device_param->is_metal == false) continue; + + // Since we can't match OpenCL with Metal devices (missing PCI ID etc.) and at the same time we have better OpenCL support than Metal support, + // we disable all Metal devices by default. The user can reactivate them with -d. + + if (device_param->skipped == false) + { + if (backend_ctx->backend_devices_filter[DEVICES_MAX]) + { + if ((user_options->quiet == false) && (user_options->backend_info == 0)) + { + event_log_warning (hashcat_ctx, "The device #%d has been disabled as it most likely also exists as an OpenCL device, but it is not possible to automatically map it.", device_param->device_id + 1); + event_log_warning (hashcat_ctx, "You can use -d %d to use Metal API instead of OpenCL API. In some rare cases this is more stable.", device_param->device_id + 1); + event_log_warning (hashcat_ctx, NULL); + } + + device_param->skipped = true; + } + else + { + if (backend_ctx->backend_devices_filter[device_param->device_id]) + { + // ok + } + else + { + device_param->skipped = true; + } + } + + if (device_param->skipped == true) + { + backend_ctx->metal_devices_active--; + backend_ctx->backend_devices_active--; + } + } + } + } + } + #endif + // find duplicate devices //if ((cuda_devices_cnt > 0) && (hip_devices_cnt > 0) && (opencl_devices_cnt > 0)) @@ -7648,7 +7664,7 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) // additional check to see if the user has chosen a device that is not within the range of available devices (i.e. larger than devices_cnt) - if (backend_ctx->backend_devices_cnt >= 64) + if (backend_ctx->backend_devices_cnt >= DEVICES_MAX) { event_log_error (hashcat_ctx, "Illegal use of the --backend-devices parameter because too many backend devices were found (%u).", backend_ctx->backend_devices_cnt); event_log_error (hashcat_ctx, "If possible, disable one of your backends to reduce the number of backend devices. For example \"--backend-ignore-cuda\" or \"--backend-ignore-opencl\" ."); @@ -7656,16 +7672,19 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) return -1; } - if (backend_ctx->backend_devices_filter != (u64) -1) + if (!backend_ctx->backend_devices_filter[DEVICES_MAX]) { const u64 backend_devices_cnt_mask = ~(((u64) -1 >> backend_ctx->backend_devices_cnt) << backend_ctx->backend_devices_cnt); - if (backend_ctx->backend_devices_filter > backend_devices_cnt_mask) + for (int i = backend_ctx->backend_devices_cnt; i < DEVICES_MAX; i++) { - event_log_error (hashcat_ctx, "An invalid device was specified using the --backend-devices parameter."); - event_log_error (hashcat_ctx, "The specified device was higher than the number of available devices (%u).", backend_ctx->backend_devices_cnt); + if (backend_ctx->backend_devices_filter[i]) + { + event_log_error (hashcat_ctx, "An invalid device was specified using the --backend-devices parameter."); + event_log_error (hashcat_ctx, "The specified device was higher than the number of available devices (%u).", backend_ctx->backend_devices_cnt); - return -1; + return -1; + } } } @@ -8016,7 +8035,7 @@ int backend_ctx_devices_init (hashcat_ctx_t *hashcat_ctx, const int comptime) device_param->device_available_mem = device_param->device_global_mem - MAX_ALLOC_CHECKS_SIZE; - if (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU) + if ((device_param->opencl_device_type & CL_DEVICE_TYPE_GPU) && ((device_param->opencl_platform_vendor_id != VENDOR_ID_INTEL_SDK) || (device_param->device_host_unified_memory == 0))) { // OK, so the problem here is the following: // There's just CL_DEVICE_GLOBAL_MEM_SIZE to ask OpenCL about the total memory on the device, @@ -9796,8 +9815,10 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) device_param->size_results = size_results; - u64 size_rules = (u64) straight_ctx->kernel_rules_cnt * sizeof (kernel_rule_t); - u64 size_rules_c = (u64) KERNEL_RULES * sizeof (kernel_rule_t); + u32 aligned_rules_cnt = MAX (MAX (straight_ctx->kernel_rules_cnt, device_param->kernel_loops_min), KERNEL_RULES); + + u64 size_rules = (u64) aligned_rules_cnt * sizeof (kernel_rule_t); + u64 size_rules_c = (u64) KERNEL_RULES * sizeof (kernel_rule_t); device_param->size_rules = size_rules; device_param->size_rules_c = size_rules_c; @@ -9893,6 +9914,13 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) } } + if ((int) kern_type == -1) + { + event_log_error (hashcat_ctx, "Invalid hash-mode selected: -1"); + + return -1; + } + // built options const size_t build_options_sz = 4096; @@ -15080,7 +15108,7 @@ int backend_session_begin (hashcat_ctx_t *hashcat_ctx) // size_pws_idx - size_pws_idx = (u64) (kernel_power_max + 1) * sizeof (pw_idx_t); + size_pws_idx = (kernel_power_max + 1) * sizeof (pw_idx_t); // size_tmps @@ -16459,7 +16487,7 @@ int backend_session_update_mp_rl (hashcat_ctx_t *hashcat_ctx, const u32 css_cnt_ return 0; } -void *hook12_thread (void *p) +HC_API_CALL void *hook12_thread (void *p) { hook_thread_param_t *hook_thread_param = (hook_thread_param_t *) p; @@ -16483,7 +16511,7 @@ void *hook12_thread (void *p) return NULL; } -void *hook23_thread (void *p) +HC_API_CALL void *hook23_thread (void *p) { hook_thread_param_t *hook_thread_param = (hook_thread_param_t *) p; diff --git a/src/brain.c b/src/brain.c index 480170bb1..646a334d3 100644 --- a/src/brain.c +++ b/src/brain.c @@ -209,9 +209,9 @@ u32 brain_compute_attack (hashcat_ctx_t *hashcat_ctx) XXH64_update (state, &hex_wordlist, sizeof (hex_wordlist)); - const int wordlist_autohex_disable = user_options->wordlist_autohex_disable; + const int wordlist_autohex = user_options->wordlist_autohex; - XXH64_update (state, &wordlist_autohex_disable, sizeof (wordlist_autohex_disable)); + XXH64_update (state, &wordlist_autohex, sizeof (wordlist_autohex)); if (user_options->encoding_from) { @@ -259,9 +259,9 @@ u32 brain_compute_attack (hashcat_ctx_t *hashcat_ctx) XXH64_update (state, &hex_wordlist, sizeof (hex_wordlist)); - const int wordlist_autohex_disable = user_options->wordlist_autohex_disable; + const int wordlist_autohex = user_options->wordlist_autohex; - XXH64_update (state, &wordlist_autohex_disable, sizeof (wordlist_autohex_disable)); + XXH64_update (state, &wordlist_autohex, sizeof (wordlist_autohex)); if (user_options->encoding_from) { @@ -302,12 +302,12 @@ u32 brain_compute_attack (hashcat_ctx_t *hashcat_ctx) XXH64_update (state, &hex_charset, sizeof (hex_charset)); const int markov_classic = user_options->markov_classic; - const int markov_disable = user_options->markov_disable; + const int markov = user_options->markov; const int markov_inverse = user_options->markov_inverse; const int markov_threshold = user_options->markov_threshold; XXH64_update (state, &markov_classic, sizeof (markov_classic)); - XXH64_update (state, &markov_disable, sizeof (markov_disable)); + XXH64_update (state, &markov, sizeof (markov)); XXH64_update (state, &markov_inverse, sizeof (markov_inverse)); XXH64_update (state, &markov_threshold, sizeof (markov_threshold)); @@ -397,12 +397,12 @@ u32 brain_compute_attack (hashcat_ctx_t *hashcat_ctx) XXH64_update (state, &hex_charset, sizeof (hex_charset)); const int markov_classic = user_options->markov_classic; - const int markov_disable = user_options->markov_disable; + const int markov = user_options->markov; const int markov_inverse = user_options->markov_inverse; const int markov_threshold = user_options->markov_threshold; XXH64_update (state, &markov_classic, sizeof (markov_classic)); - XXH64_update (state, &markov_disable, sizeof (markov_disable)); + XXH64_update (state, &markov, sizeof (markov)); XXH64_update (state, &markov_inverse, sizeof (markov_inverse)); XXH64_update (state, &markov_threshold, sizeof (markov_threshold)); @@ -480,9 +480,9 @@ u32 brain_compute_attack (hashcat_ctx_t *hashcat_ctx) XXH64_update (state, &hex_wordlist, sizeof (hex_wordlist)); - const int wordlist_autohex_disable = user_options->wordlist_autohex_disable; + const int wordlist_autohex = user_options->wordlist_autohex; - XXH64_update (state, &wordlist_autohex_disable, sizeof (wordlist_autohex_disable)); + XXH64_update (state, &wordlist_autohex, sizeof (wordlist_autohex)); if (user_options->encoding_from) { @@ -527,12 +527,12 @@ u32 brain_compute_attack (hashcat_ctx_t *hashcat_ctx) XXH64_update (state, &hex_charset, sizeof (hex_charset)); const int markov_classic = user_options->markov_classic; - const int markov_disable = user_options->markov_disable; + const int markov = user_options->markov; const int markov_inverse = user_options->markov_inverse; const int markov_threshold = user_options->markov_threshold; XXH64_update (state, &markov_classic, sizeof (markov_classic)); - XXH64_update (state, &markov_disable, sizeof (markov_disable)); + XXH64_update (state, &markov, sizeof (markov)); XXH64_update (state, &markov_inverse, sizeof (markov_inverse)); XXH64_update (state, &markov_threshold, sizeof (markov_threshold)); @@ -575,9 +575,9 @@ u32 brain_compute_attack (hashcat_ctx_t *hashcat_ctx) XXH64_update (state, &hex_wordlist, sizeof (hex_wordlist)); - const int wordlist_autohex_disable = user_options->wordlist_autohex_disable; + const int wordlist_autohex = user_options->wordlist_autohex; - XXH64_update (state, &wordlist_autohex_disable, sizeof (wordlist_autohex_disable)); + XXH64_update (state, &wordlist_autohex, sizeof (wordlist_autohex)); if (user_options->encoding_from) { @@ -620,9 +620,9 @@ u32 brain_compute_attack (hashcat_ctx_t *hashcat_ctx) XXH64_update (state, &hex_wordlist, sizeof (hex_wordlist)); - const int wordlist_autohex_disable = user_options->wordlist_autohex_disable; + const int wordlist_autohex = user_options->wordlist_autohex; - XXH64_update (state, &wordlist_autohex_disable, sizeof (wordlist_autohex_disable)); + XXH64_update (state, &wordlist_autohex, sizeof (wordlist_autohex)); if (user_options->encoding_from) { @@ -2074,7 +2074,7 @@ void brain_server_handle_signal (int signo) } } -void *brain_server_handle_dumps (void *p) +HC_API_CALL void *brain_server_handle_dumps (void *p) { brain_server_dumper_options_t *brain_server_dumper_options = (brain_server_dumper_options_t *) p; @@ -2106,7 +2106,7 @@ void *brain_server_handle_dumps (void *p) return NULL; } -void *brain_server_handle_client (void *p) +HC_API_CALL void *brain_server_handle_client (void *p) { brain_server_client_options_t *brain_server_client_options = (brain_server_client_options_t *) p; @@ -2382,7 +2382,7 @@ void *brain_server_handle_client (void *p) hc_thread_mutex_unlock (brain_server_dbs->mux_dbs); - // higest position of that attack + // highest position of that attack u64 highest = brain_server_highest_attack (brain_server_db_attack); diff --git a/src/debugfile.c b/src/debugfile.c index cf943f3aa..20ee3ad1f 100644 --- a/src/debugfile.c +++ b/src/debugfile.c @@ -55,7 +55,7 @@ static void debugfile_format_plain (hashcat_ctx_t *hashcat_ctx, const u8 *plain_ } else { - hc_fwrite ((void *)plain_ptr, plain_len, 1, &debugfile_ctx->fp); + hc_fwrite (plain_ptr, plain_len, 1, &debugfile_ctx->fp); } } @@ -76,7 +76,7 @@ void debugfile_write_append (hashcat_ctx_t *hashcat_ctx, const u8 *rule_buf, con if ((debug_mode == 3) || (debug_mode == 4) || (debug_mode == 5)) hc_fputc (':', &debugfile_ctx->fp); } - hc_fwrite ((void *) rule_buf, rule_len, 1, &debugfile_ctx->fp); + hc_fwrite (rule_buf, rule_len, 1, &debugfile_ctx->fp); if ((debug_mode == 4) || (debug_mode == 5)) { diff --git a/src/dictstat.c b/src/dictstat.c index 02bb86b5f..a607cf7d6 100644 --- a/src/dictstat.c +++ b/src/dictstat.c @@ -94,11 +94,15 @@ void dictstat_read (hashcat_ctx_t *hashcat_ctx) { hashconfig_t *hashconfig = hashcat_ctx->hashconfig; dictstat_ctx_t *dictstat_ctx = hashcat_ctx->dictstat_ctx; + user_options_t *user_options = hashcat_ctx->user_options; if (dictstat_ctx->enabled == false) return; if (hashconfig->dictstat_disable == true) return; + if (user_options->rule_buf_l_chgd == true) return; + if (user_options->rule_buf_r_chgd == true) return; + HCFILE fp; if (hc_fopen (&fp, dictstat_ctx->filename, "rb") == false) @@ -182,11 +186,15 @@ int dictstat_write (hashcat_ctx_t *hashcat_ctx) { hashconfig_t *hashconfig = hashcat_ctx->hashconfig; dictstat_ctx_t *dictstat_ctx = hashcat_ctx->dictstat_ctx; + user_options_t *user_options = hashcat_ctx->user_options; if (dictstat_ctx->enabled == false) return 0; if (hashconfig->dictstat_disable == true) return 0; + if (user_options->rule_buf_l_chgd == true) return 0; + if (user_options->rule_buf_r_chgd == true) return 0; + HCFILE fp; if (hc_fopen (&fp, dictstat_ctx->filename, "wb") == false) diff --git a/src/dispatch.c b/src/dispatch.c index c38006dee..fdb0b441d 100644 --- a/src/dispatch.c +++ b/src/dispatch.c @@ -247,12 +247,12 @@ static int calc_stdin (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_par char rule_buf_out[RP_PASSWORD_SIZE]; int rule_jk_len = (int) user_options_extra->rule_len_l; - char *rule_jk_buf = (char *) user_options->rule_buf_l; + const char *rule_jk_buf = user_options->rule_buf_l; if (attack_mode == ATTACK_MODE_HYBRID2) { rule_jk_len = (int) user_options_extra->rule_len_r; - rule_jk_buf = (char *) user_options->rule_buf_r; + rule_jk_buf = user_options->rule_buf_r; } if (run_rule_engine (rule_jk_len, rule_jk_buf)) @@ -1426,12 +1426,12 @@ static int calc (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param) // post-process rule engine int rule_jk_len = (int) user_options_extra->rule_len_l; - char *rule_jk_buf = (char *) user_options->rule_buf_l; + const char *rule_jk_buf = user_options->rule_buf_l; if (attack_mode == ATTACK_MODE_HYBRID2) { rule_jk_len = (int) user_options_extra->rule_len_r; - rule_jk_buf = (char *) user_options->rule_buf_r; + rule_jk_buf = user_options->rule_buf_r; } if (run_rule_engine (rule_jk_len, rule_jk_buf)) diff --git a/src/ext_hiprtc.c b/src/ext_hiprtc.c index ea1b67c27..ad7d14be9 100644 --- a/src/ext_hiprtc.c +++ b/src/ext_hiprtc.c @@ -41,14 +41,14 @@ int hiprtc_init (void *hashcat_ctx) #if defined (_WIN) hiprtc->lib = hc_dlopen ("hiprtc.dll"); - if (hiprtc->lib == NULL) hiprtc->lib = hc_dlopen ("contrib/bin/win64/hiprtc0503.dll"); + if (hiprtc->lib == NULL) hiprtc->lib = hc_dlopen ("C:/Program Files/AMD/ROCm/5.5/bin/hiprtc0505.dll"); if (hiprtc->lib == NULL) hiprtc->lib = hc_dlopen ("amdhip64.dll"); #elif defined (__APPLE__) hiprtc->lib = hc_dlopen ("fixme.dylib"); #elif defined (__CYGWIN__) hiprtc->lib = hc_dlopen ("hiprtc.dll"); - if (hiprtc->lib == NULL) hiprtc->lib = hc_dlopen ("contrib/bin/win64/hiprtc0503.dll"); + if (hiprtc->lib == NULL) hiprtc->lib = hc_dlopen ("C:/Program Files/AMD/ROCm/5.5/bin/hiprtc0505.dll"); if (hiprtc->lib == NULL) hiprtc->lib = hc_dlopen ("amdhip64.dll"); #else hiprtc->lib = hc_dlopen ("libhiprtc.so"); diff --git a/src/ext_iokit.c b/src/ext_iokit.c index 78a7cada3..1c45ea367 100644 --- a/src/ext_iokit.c +++ b/src/ext_iokit.c @@ -48,7 +48,7 @@ kern_return_t hm_IOKIT_SMCOpen (void *hashcat_ctx, io_connect_t *conn) CFMutableDictionaryRef matchingDictionary = IOServiceMatching ("AppleSMC"); - result = IOServiceGetMatchingServices (kIOMasterPortDefault, matchingDictionary, &iterator); + result = IOServiceGetMatchingServices (hc_IOMasterPortDefault, matchingDictionary, &iterator); if (result != kIOReturnSuccess) { @@ -231,7 +231,7 @@ int hm_IOKIT_get_utilization_current (void *hashcat_ctx, int *utilization) CFMutableDictionaryRef matching = IOServiceMatching ("IOAccelerator"); - if (IOServiceGetMatchingServices (kIOMasterPortDefault, matching, &iterator) != kIOReturnSuccess) + if (IOServiceGetMatchingServices (hc_IOMasterPortDefault, matching, &iterator) != kIOReturnSuccess) { event_log_error (hashcat_ctx, "IOServiceGetMatchingServices(): failure"); diff --git a/src/ext_metal.m b/src/ext_metal.m index a9ab89229..6a51d48bd 100644 --- a/src/ext_metal.m +++ b/src/ext_metal.m @@ -47,7 +47,7 @@ static bool iokit_getGPUCore (void *hashcat_ctx, int *gpu_core) CFMutableDictionaryRef matching = IOServiceMatching ("IOAccelerator"); - io_service_t service = IOServiceGetMatchingService (kIOMasterPortDefault, matching); + io_service_t service = IOServiceGetMatchingService (hc_IOMasterPortDefault, matching); if (!service) { diff --git a/src/ext_sysfs_cpu.c b/src/ext_sysfs_cpu.c index 532d284a3..54683d741 100644 --- a/src/ext_sysfs_cpu.c +++ b/src/ext_sysfs_cpu.c @@ -42,7 +42,7 @@ void sysfs_cpu_close (void *hashcat_ctx) } } -char *hm_SYSFS_CPU_get_syspath_hwmon () +char *hm_SYSFS_CPU_get_syspath_hwmon (void) { char *found[4]; @@ -63,7 +63,7 @@ char *hm_SYSFS_CPU_get_syspath_hwmon () if (hc_fopen_raw (&fp, path, "rb") == false) continue; - char buf[32] = { 0 }; + char buf[64] = { 0 }; const size_t line_len = fgetl (&fp, buf, sizeof (buf)); diff --git a/src/filehandling.c b/src/filehandling.c index 4d56a2f2c..9a2d0ea39 100644 --- a/src/filehandling.c +++ b/src/filehandling.c @@ -477,7 +477,7 @@ size_t hc_fread (void *ptr, size_t size, size_t nmemb, HCFILE *fp) if (inLeft == 0 && outLeft == 0) { /* partial read */ - n = (size_t) (outPos / size); + n = (outPos / size); break; } outPos += outLeft; diff --git a/src/hashcat.c b/src/hashcat.c index dd00dc638..a6dd823d1 100644 --- a/src/hashcat.c +++ b/src/hashcat.c @@ -547,7 +547,7 @@ static int outer_loop (hashcat_ctx_t *hashcat_ctx) if (module_ctx->module_deprecated_notice != MODULE_DEFAULT) { - if (user_options->deprecated_check_disable == false) + if (user_options->deprecated_check == true) { if ((user_options->show == true) || (user_options->left == true)) { @@ -615,7 +615,7 @@ static int outer_loop (hashcat_ctx_t *hashcat_ctx) * potfile removes */ - if (user_options->potfile_disable == false) + if (user_options->potfile == true) { EVENT (EVENT_POTFILE_REMOVE_PARSE_PRE); @@ -1063,8 +1063,8 @@ int hashcat_init (hashcat_ctx_t *hashcat_ctx, void (*event) (const u32, struct h hashcat_ctx->event = event; } - hashcat_ctx->brain_ctx = (brain_ctx_t *) hcmalloc (sizeof (brain_ctx_t)); hashcat_ctx->bitmap_ctx = (bitmap_ctx_t *) hcmalloc (sizeof (bitmap_ctx_t)); + hashcat_ctx->brain_ctx = (brain_ctx_t *) hcmalloc (sizeof (brain_ctx_t)); hashcat_ctx->combinator_ctx = (combinator_ctx_t *) hcmalloc (sizeof (combinator_ctx_t)); hashcat_ctx->cpt_ctx = (cpt_ctx_t *) hcmalloc (sizeof (cpt_ctx_t)); hashcat_ctx->debugfile_ctx = (debugfile_ctx_t *) hcmalloc (sizeof (debugfile_ctx_t)); @@ -1098,8 +1098,8 @@ int hashcat_init (hashcat_ctx_t *hashcat_ctx, void (*event) (const u32, struct h void hashcat_destroy (hashcat_ctx_t *hashcat_ctx) { - hcfree (hashcat_ctx->brain_ctx); hcfree (hashcat_ctx->bitmap_ctx); + hcfree (hashcat_ctx->brain_ctx); hcfree (hashcat_ctx->combinator_ctx); hcfree (hashcat_ctx->cpt_ctx); hcfree (hashcat_ctx->debugfile_ctx); @@ -1400,6 +1400,7 @@ bool autodetect_hashmode_test (hashcat_ctx_t *hashcat_ctx) hashinfo_t *hash_info = (hashinfo_t *) hcmalloc (sizeof (hashinfo_t)); + hash_info->dynamicx = (dynamicx_t *) hcmalloc (sizeof (dynamicx_t)); hash_info->user = (user_t *) hcmalloc (sizeof (user_t)); hash_info->orighash = (char *) hcmalloc (256); hash_info->split = (split_t *) hcmalloc (sizeof (split_t)); diff --git a/src/hashes.c b/src/hashes.c index 9ed4cc680..9de7a95a3 100644 --- a/src/hashes.c +++ b/src/hashes.c @@ -241,6 +241,17 @@ int save_hash (hashcat_ctx_t *hashcat_ctx) hc_fputc (separator, &fp); } + if (user_options->dynamic_x == true) + { + dynamicx_t *dynamicx = hashes->hash_info[idx]->dynamicx; + + u32 i; + + for (i = 0; i < dynamicx->dynamicx_len; i++) hc_fputc (dynamicx->dynamicx_buf[i], &fp); + + hc_fputc (separator, &fp); + } + const int out_len = hash_encode (hashcat_ctx->hashconfig, hashcat_ctx->hashes, hashcat_ctx->module_ctx, (char *) out_buf, HCBUFSIZ_LARGE, salt_pos, digest_pos); out_buf[out_len] = 0; @@ -1003,7 +1014,7 @@ int hashes_init_stage1 (hashcat_ctx_t *hashcat_ctx) void *esalts_buf = NULL; void *hook_salts_buf = NULL; - if ((user_options->username == true) || (hashconfig->opts_type & OPTS_TYPE_HASH_COPY) || (hashconfig->opts_type & OPTS_TYPE_HASH_SPLIT)) + if ((user_options->dynamic_x == true) || (user_options->username == true) || (hashconfig->opts_type & OPTS_TYPE_HASH_COPY) || (hashconfig->opts_type & OPTS_TYPE_HASH_SPLIT)) { u64 hash_pos; @@ -1013,6 +1024,11 @@ int hashes_init_stage1 (hashcat_ctx_t *hashcat_ctx) hashes_buf[hash_pos].hash_info = hash_info; + if (user_options->dynamic_x == true) + { + hash_info->dynamicx = (dynamicx_t *) hcmalloc (sizeof (dynamicx_t)); + } + if (user_options->username == true) { hash_info->user = (user_t *) hcmalloc (sizeof (user_t)); @@ -1902,7 +1918,7 @@ int hashes_init_stage1 (hashcat_ctx_t *hashcat_ctx) event_log_advice (hashcat_ctx, "* Token length exception: %u/%u hashes", hashes->parser_token_length_cnt, hashes->parser_token_length_cnt + hashes->hashes_cnt); event_log_advice (hashcat_ctx, " This error happens if the wrong hash type is specified, if the hashes are"); event_log_advice (hashcat_ctx, " malformed, or if input is otherwise not as expected (for example, if the"); - event_log_advice (hashcat_ctx, " --username option is used but no username is present)"); + event_log_advice (hashcat_ctx, " --username or --dynamic-x option is used but no username or dynamic-tag is present)"); event_log_advice (hashcat_ctx, NULL); } @@ -2004,7 +2020,7 @@ int hashes_init_stage2 (hashcat_ctx_t *hashcat_ctx) hashinfo_t **hash_info = NULL; - if ((user_options->username == true) || (hashconfig->opts_type & OPTS_TYPE_HASH_COPY) || (hashconfig->opts_type & OPTS_TYPE_HASH_SPLIT)) + if ((user_options->username == true) || (user_options->dynamic_x == true) || (hashconfig->opts_type & OPTS_TYPE_HASH_COPY) || (hashconfig->opts_type & OPTS_TYPE_HASH_SPLIT)) { hash_info = (hashinfo_t **) hccalloc (hashes_cnt, sizeof (hashinfo_t *)); } @@ -2211,7 +2227,6 @@ int hashes_init_stage3 (hashcat_ctx_t *hashcat_ctx) hashes->digests_done_zero = digests_done_zero; hashes->digests_done_pot = digests_done_pot; - hashes->salts_cnt = salts_cnt; hashes->salts_done = salts_done; return 0; @@ -2545,7 +2560,7 @@ int hashes_init_zerohash (hashcat_ctx_t *hashcat_ctx) hash_t *hashes_buf = hashes->hashes_buf; u32 hashes_cnt = hashes->hashes_cnt; - // no solution for these special hash types (for instane because they use hashfile in output etc) + // no solution for these special hash types (for instance because they use hashfile in output etc) hash_t hash_buf; diff --git a/src/hlfmt.c b/src/hlfmt.c index be71742e2..819eae910 100644 --- a/src/hlfmt.c +++ b/src/hlfmt.c @@ -28,15 +28,13 @@ static void hlfmt_hash_hashcat (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, char *l const user_options_t *user_options = hashcat_ctx->user_options; const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; - if (user_options->username == 0) + *hashbuf_pos = line_buf; + *hashbuf_len = line_len; + + if (user_options->username == true) { - *hashbuf_pos = line_buf; - *hashbuf_len = line_len; - } - else - { - char *pos = line_buf; - size_t len = line_len; + char *pos = *hashbuf_pos; + size_t len = *hashbuf_len; for (int i = 0; i < line_len; i++, pos++, len--) { @@ -53,6 +51,18 @@ static void hlfmt_hash_hashcat (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, char *l *hashbuf_pos = pos; *hashbuf_len = len; } + + if (user_options->dynamic_x == true) + { + char *pos = NULL; + int len = 0; + + if (extract_dynamicx_hash ((const u8 *) line_buf, line_len, (u8 **) &pos, &len) != -1) + { + *hashbuf_pos = pos; + *hashbuf_len = len; + } + } } static void hlfmt_user_hashcat (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, char *line_buf, const int line_len, char **userbuf_pos, int *userbuf_len) diff --git a/src/hwmon.c b/src/hwmon.c index 5ef2e4a9c..d18d12552 100644 --- a/src/hwmon.c +++ b/src/hwmon.c @@ -1226,17 +1226,17 @@ int hwmon_ctx_init (hashcat_ctx_t *hashcat_ctx) return 0; #endif // WITH_HWMON - if (user_options->usage > 0) return 0; - if (user_options->backend_info > 0) return 0; + if (user_options->usage > 0) return 0; + if (user_options->backend_info > 0) return 0; - if (user_options->hash_info == true) return 0; - if (user_options->keyspace == true) return 0; - if (user_options->left == true) return 0; - if (user_options->show == true) return 0; - if (user_options->stdout_flag == true) return 0; - if (user_options->version == true) return 0; - if (user_options->identify == true) return 0; - if (user_options->hwmon_disable == true) return 0; + if (user_options->hash_info == true) return 0; + if (user_options->keyspace == true) return 0; + if (user_options->left == true) return 0; + if (user_options->show == true) return 0; + if (user_options->stdout_flag == true) return 0; + if (user_options->version == true) return 0; + if (user_options->identify == true) return 0; + if (user_options->hwmon == false) return 0; hwmon_ctx->hm_device = (hm_attrs_t *) hccalloc (DEVICES_MAX, sizeof (hm_attrs_t)); diff --git a/src/interface.c b/src/interface.c index 1cba43229..691e2931b 100644 --- a/src/interface.c +++ b/src/interface.c @@ -137,7 +137,7 @@ int hashconfig_init (hashcat_ctx_t *hashcat_ctx) return -1; } - // check for missing pointer assignements + // check for missing pointer assignments #define CHECK_DEFINED(func) \ if ((func) == NULL) \ @@ -282,12 +282,12 @@ int hashconfig_init (hashcat_ctx_t *hashcat_ctx) } } - if (user_options->multiply_accel_disable == true) + if (user_options->multiply_accel == false) { hashconfig->opts_type |= OPTS_TYPE_MP_MULTI_DISABLE; } - if (user_options->self_test_disable == true) + if (user_options->self_test == false) { hashconfig->opts_type |= OPTS_TYPE_SELF_TEST_DISABLE; } @@ -357,7 +357,7 @@ int hashconfig_init (hashcat_ctx_t *hashcat_ctx) if (user_options->hash_info == false) { - if (user_options->optimized_kernel_enable == true) + if (user_options->optimized_kernel == true) { if (hashconfig->has_optimized_kernel == false) { @@ -469,18 +469,18 @@ int hashconfig_init (hashcat_ctx_t *hashcat_ctx) { const int hook_threads = (int) user_options->hook_threads; - module_ctx->hook_extra_params = (void *) hccalloc (hook_threads, sizeof (void *)); + module_ctx->hook_extra_params = hccalloc (hook_threads, sizeof (void *)); for (int i = 0; i < hook_threads; i++) { - module_ctx->hook_extra_params[i] = (void *) hcmalloc (hashconfig->hook_extra_param_size); + module_ctx->hook_extra_params[i] = hcmalloc (hashconfig->hook_extra_param_size); } } else { - module_ctx->hook_extra_params = (void *) hccalloc (1, sizeof (void *)); + module_ctx->hook_extra_params = hccalloc (1, sizeof (void *)); - module_ctx->hook_extra_params[0] = (void *) hcmalloc (1); + module_ctx->hook_extra_params[0] = hcmalloc (1); } if (module_ctx->module_hook_extra_param_init != MODULE_DEFAULT) @@ -688,7 +688,7 @@ bool default_potfile_keep_all_hashes (MAYBE_UNUSED const hashconfig_t *hashconfi // keep all hashes if --username was combined with --left or --show - if (user_options->username == true) + if ((user_options->username == true) || (user_options->dynamic_x == true)) { if ((user_options->show == true) || (user_options->left == true)) { @@ -818,7 +818,7 @@ u32 default_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED co u32 default_salt_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { - // salt_min : this limit is only interessting for generic hash types that support a salt + // salt_min : this limit is only interesting for generic hash types that support a salt u32 salt_min = SALT_MIN; @@ -837,7 +837,7 @@ u32 default_salt_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED { const bool optimized_kernel = (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL); - // salt_max : this limit is only interessting for generic hash types that support a salt + // salt_max : this limit is only interesting for generic hash types that support a salt u32 salt_max = SALT_MAX; diff --git a/src/logfile.c b/src/logfile.c index d69e15d75..45e58b43d 100644 --- a/src/logfile.c +++ b/src/logfile.c @@ -77,7 +77,7 @@ int logfile_init (hashcat_ctx_t *hashcat_ctx) logfile_ctx_t *logfile_ctx = hashcat_ctx->logfile_ctx; user_options_t *user_options = hashcat_ctx->user_options; - if (user_options->logfile_disable == true) return 0; + if (user_options->logfile == false) return 0; hc_asprintf (&logfile_ctx->logfile, "%s/%s.log", folder_config->session_dir, user_options->session); diff --git a/src/loopback.c b/src/loopback.c index c20c88ea5..28dcff0d0 100644 --- a/src/loopback.c +++ b/src/loopback.c @@ -49,7 +49,7 @@ static void loopback_format_plain (hashcat_ctx_t *hashcat_ctx, const u8 *plain_p } else { - hc_fwrite ((void *)plain_ptr, plain_len, 1, &loopback_ctx->fp); + hc_fwrite (plain_ptr, plain_len, 1, &loopback_ctx->fp); } } diff --git a/src/main.c b/src/main.c index 69cc64fa5..085ce38b4 100644 --- a/src/main.c +++ b/src/main.c @@ -154,7 +154,7 @@ static void main_log_advice (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE_UNUS { const user_options_t *user_options = hashcat_ctx->user_options; - if (user_options->advice_disable == true) return; + if (user_options->advice == false) return; main_log (hashcat_ctx, stdout, LOGLEVEL_ADVICE); } @@ -563,7 +563,12 @@ static void main_outerloop_mainscreen (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, { event_log_advice (hashcat_ctx, "ATTENTION! Potfile storage is disabled for this hash mode."); event_log_advice (hashcat_ctx, "Passwords cracked during this session will NOT be stored to the potfile."); - event_log_advice (hashcat_ctx, "Consider using -o to save cracked passwords."); + + if(user_options->outfile_chgd == false) + { + event_log_advice (hashcat_ctx, "Consider using -o to save cracked passwords."); + } + event_log_advice (hashcat_ctx, NULL); } @@ -571,7 +576,12 @@ static void main_outerloop_mainscreen (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, { event_log_advice (hashcat_ctx, "ATTENTION! Potfile read/write is disabled for this attack mode."); event_log_advice (hashcat_ctx, "Passwords cracked during this session will NOT be stored to the potfile."); - event_log_advice (hashcat_ctx, "Consider using -o to save cracked passwords."); + + if(user_options->outfile_chgd == false) + { + event_log_advice (hashcat_ctx, "Consider using -o to save cracked passwords."); + } + event_log_advice (hashcat_ctx, NULL); } /** @@ -776,7 +786,7 @@ static void main_monitor_performance_hint (MAYBE_UNUSED hashcat_ctx_t *hashcat_c event_log_advice (hashcat_ctx, "Cracking performance lower than expected?"); event_log_advice (hashcat_ctx, NULL); - if (user_options->optimized_kernel_enable == false) + if (user_options->optimized_kernel == false) { if ((hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) == 0) { @@ -988,7 +998,7 @@ static void main_hashconfig_post (MAYBE_UNUSED hashcat_ctx_t *hashcat_ctx, MAYBE { if (hashconfig->opti_type & OPTI_TYPE_RAW_HASH) { - event_log_info (hashcat_ctx, "Minimim salt length supported by kernel: %u", hashconfig->salt_min); + event_log_info (hashcat_ctx, "Minimum salt length supported by kernel: %u", hashconfig->salt_min); event_log_info (hashcat_ctx, "Maximum salt length supported by kernel: %u", hashconfig->salt_max); } } diff --git a/src/memory.c b/src/memory.c index c8a18baba..54995cc86 100644 --- a/src/memory.c +++ b/src/memory.c @@ -70,7 +70,7 @@ void hcfree (void *ptr) void *hcmalloc_aligned (const size_t sz, const int align) { // store the original allocated address so we can later use it to free the memory - // this is convinient to use because we don't need to store two memory addresses + // this is convenient to use because we don't need to store two memory addresses const int align1 = align - 1; diff --git a/src/modules/module_00022.c b/src/modules/module_00022.c index 986ddc37e..6e974b024 100644 --- a/src/modules/module_00022.c +++ b/src/modules/module_00022.c @@ -180,7 +180,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - u32 *digest = (u32 *) digest_buf; + const u32 *digest = (const u32 *) digest_buf; char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' }; diff --git a/src/modules/module_00400.c b/src/modules/module_00400.c index 3105bc546..23dc5c4c4 100644 --- a/src/modules/module_00400.c +++ b/src/modules/module_00400.c @@ -228,7 +228,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE phpass_encode (digest_buf, tmp); - return snprintf (line_buf, line_size, "%s%s%s", (char *) salt->salt_sign, (char *) salt->salt_buf, tmp); + return snprintf (line_buf, line_size, "%s%s%s", (const char *) salt->salt_sign, (const char *) salt->salt_buf, tmp); } void module_init (module_ctx_t *module_ctx) diff --git a/src/modules/module_00500.c b/src/modules/module_00500.c index e2e6bba93..dad794f1b 100644 --- a/src/modules/module_00500.c +++ b/src/modules/module_00500.c @@ -21,7 +21,8 @@ static const char *HASH_NAME = "md5crypt, MD5 (Unix), Cisco-IOS $1$ (MD5)"; static const u64 KERN_TYPE = 500; static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE - | OPTS_TYPE_PT_GENERATE_LE; + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_DEEP_COMP_KERNEL; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "$1$38652870$DUjsu4TTlTsOe/xxZ05uf/"; @@ -50,6 +51,11 @@ u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } +u32 module_deep_comp_kernel (MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const u32 salt_pos, MAYBE_UNUSED const u32 digest_pos) +{ + return KERN_RUN_3; +} + u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u64 tmp_size = (const u64) sizeof (md5crypt_tmp_t); @@ -256,7 +262,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; - module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = MODULE_DEFAULT; module_ctx->module_dgst_pos0 = module_dgst_pos0; module_ctx->module_dgst_pos1 = module_dgst_pos1; diff --git a/src/modules/module_00501.c b/src/modules/module_00501.c index 76980adaa..f31985406 100644 --- a/src/modules/module_00501.c +++ b/src/modules/module_00501.c @@ -107,7 +107,7 @@ static void juniper_decrypt_hash (const u8 *in, const int in_len, u8 *out) u8 base64_buf[100] = { 0 }; - base64_decode (base64_to_int, (const u8 *) in, in_len, base64_buf); + base64_decode (base64_to_int, in, in_len, base64_buf); // iv stuff diff --git a/src/modules/module_01500.c b/src/modules/module_01500.c index 1956999dd..c6bb1e995 100644 --- a/src/modules/module_01500.c +++ b/src/modules/module_01500.c @@ -57,7 +57,7 @@ bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const void *tmps, const u32 *src_buf, MAYBE_UNUSED const size_t src_sz, MAYBE_UNUSED const int src_len, u32 *dst_buf, MAYBE_UNUSED const size_t dst_sz) { - u8 *ptr_src = (u8 *) src_buf; + const u8 *ptr_src = (const u8 *) src_buf; u8 *ptr_dst = (u8 *) dst_buf; for (int i = 0; i < src_len; i++) diff --git a/src/modules/module_02400.c b/src/modules/module_02400.c index 064a0986d..1856a6f1d 100644 --- a/src/modules/module_02400.c +++ b/src/modules/module_02400.c @@ -45,6 +45,20 @@ u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } +u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const bool optimized_kernel = (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL); + + u32 pw_max = PW_MAX; + + if (optimized_kernel == true) + { + pw_max = 31; + } + + return pw_max; +} + int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) { u32 *digest = (u32 *) digest_buf; @@ -217,7 +231,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_potfile_disable = MODULE_DEFAULT; module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; module_ctx->module_pwdump_column = MODULE_DEFAULT; - module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_max = module_pw_max; module_ctx->module_pw_min = MODULE_DEFAULT; module_ctx->module_salt_max = MODULE_DEFAULT; module_ctx->module_salt_min = MODULE_DEFAULT; diff --git a/src/modules/module_02410.c b/src/modules/module_02410.c index a12eb50c8..e7aa402b8 100644 --- a/src/modules/module_02410.c +++ b/src/modules/module_02410.c @@ -44,6 +44,41 @@ u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } +u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const bool optimized_kernel = (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL); + + u32 pw_max = PW_MAX; + + if (optimized_kernel == true) + { + if (user_options->attack_mode == ATTACK_MODE_BF) + { + pw_max = 47; // with salt_len 1, but 44 if salt_len is 4 + } + else + { + pw_max = 31; + } + } + + return pw_max; +} + +u32 module_salt_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 salt_min = 1; + + return salt_min; +} + +u32 module_salt_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 salt_max = 4; + + return salt_max; +} + int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) { u32 *digest = (u32 *) digest_buf; @@ -233,10 +268,10 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_potfile_disable = MODULE_DEFAULT; module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; module_ctx->module_pwdump_column = MODULE_DEFAULT; - module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_max = module_pw_max; module_ctx->module_pw_min = MODULE_DEFAULT; - module_ctx->module_salt_max = MODULE_DEFAULT; - module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_max = module_salt_max; + module_ctx->module_salt_min = module_salt_min; module_ctx->module_salt_type = module_salt_type; module_ctx->module_separator = MODULE_DEFAULT; module_ctx->module_st_hash = module_st_hash; diff --git a/src/modules/module_02500.c b/src/modules/module_02500.c index 1a5d75cad..95e0c8713 100644 --- a/src/modules/module_02500.c +++ b/src/modules/module_02500.c @@ -138,8 +138,8 @@ static void to_hccapx_t (const hashes_t *hashes, hccapx_t *hccapx, const u32 sal memcpy (hccapx->essid, salt->salt_buf, hccapx->essid_len); - wpa_eapol_t *wpa_eapols = (wpa_eapol_t *) esalts_buf; - wpa_eapol_t *wpa_eapol = &wpa_eapols[digest_cur]; + const wpa_eapol_t *wpa_eapols = (const wpa_eapol_t *) esalts_buf; + const wpa_eapol_t *wpa_eapol = &wpa_eapols[digest_cur]; hccapx->message_pair = wpa_eapol->message_pair; hccapx->keyver = wpa_eapol->keyver; @@ -309,10 +309,10 @@ int module_hash_encode_potfile (MAYBE_UNUSED const hashconfig_t *hashconfig, MAY int module_hash_encode_status (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - wpa_eapol_t *wpa_eapol = (wpa_eapol_t *) esalt_buf; + const wpa_eapol_t *wpa_eapol = (const wpa_eapol_t *) esalt_buf; const int line_len = snprintf (line_buf, line_size, "%s (AP:%02x:%02x:%02x:%02x:%02x:%02x STA:%02x:%02x:%02x:%02x:%02x:%02x)", - (char *) salt->salt_buf, + (const char *) salt->salt_buf, wpa_eapol->orig_mac_ap[0], wpa_eapol->orig_mac_ap[1], wpa_eapol->orig_mac_ap[2], @@ -557,8 +557,6 @@ bool module_potfile_custom_check (MAYBE_UNUSED const hashconfig_t *hashconfig, M kernel_param.digests_offset_host = 0; kernel_param.combs_mode = 0; kernel_param.salt_repeat = 0; - kernel_param.combs_mode = 0; - kernel_param.salt_repeat = 0; kernel_param.pws_pos = 0; kernel_param.gid_max = 1; diff --git a/src/modules/module_02501.c b/src/modules/module_02501.c index 63d7a158e..3b987cee8 100644 --- a/src/modules/module_02501.c +++ b/src/modules/module_02501.c @@ -136,8 +136,8 @@ static void to_hccapx_t (const hashes_t *hashes, hccapx_t *hccapx, const u32 sal memcpy (hccapx->essid, salt->salt_buf, hccapx->essid_len); - wpa_eapol_t *wpa_eapols = (wpa_eapol_t *) esalts_buf; - wpa_eapol_t *wpa_eapol = &wpa_eapols[digest_cur]; + const wpa_eapol_t *wpa_eapols = (const wpa_eapol_t *) esalts_buf; + const wpa_eapol_t *wpa_eapol = &wpa_eapols[digest_cur]; hccapx->message_pair = wpa_eapol->message_pair; hccapx->keyver = wpa_eapol->keyver; @@ -533,8 +533,6 @@ bool module_potfile_custom_check (MAYBE_UNUSED const hashconfig_t *hashconfig, M kernel_param.digests_offset_host = 0; kernel_param.combs_mode = 0; kernel_param.salt_repeat = 0; - kernel_param.combs_mode = 0; - kernel_param.salt_repeat = 0; kernel_param.pws_pos = 0; kernel_param.gid_max = 1; @@ -574,10 +572,10 @@ bool module_potfile_custom_check (MAYBE_UNUSED const hashconfig_t *hashconfig, M int module_hash_encode_status (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - wpa_eapol_t *wpa_eapol = (wpa_eapol_t *) esalt_buf; + const wpa_eapol_t *wpa_eapol = (const wpa_eapol_t *) esalt_buf; const int line_len = snprintf (line_buf, line_size, "%s (AP:%02x:%02x:%02x:%02x:%02x:%02x STA:%02x:%02x:%02x:%02x:%02x:%02x)", - (char *) salt->salt_buf, + (const char *) salt->salt_buf, wpa_eapol->orig_mac_ap[0], wpa_eapol->orig_mac_ap[1], wpa_eapol->orig_mac_ap[2], diff --git a/src/modules/module_02630.c b/src/modules/module_02630.c new file mode 100644 index 000000000..f1098413d --- /dev/null +++ b/src/modules/module_02630.c @@ -0,0 +1,226 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_INSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 3; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 1; +static const u32 DGST_SIZE = DGST_SIZE_4_4; +static const u32 HASH_CATEGORY = HASH_CATEGORY_RAW_HASH_SALTED; +static const char *HASH_NAME = "md5(md5($pass.$salt))"; +static const u64 KERN_TYPE = 2630; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_RAW_HASH; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS14; +static const u32 SALT_TYPE = SALT_TYPE_GENERIC; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "0127eecea3120e34c8934ba3b72a390a:0"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 2; + + token.sep[0] = hashconfig->separator; + token.len[0] = 32; + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + token.len_min[1] = SALT_MIN; + token.len_max[1] = SALT_MAX; + token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH; + + if (hashconfig->opts_type & OPTS_TYPE_ST_HEX) + { + token.len_min[1] *= 2; + token.len_max[1] *= 2; + + token.attr[1] |= TOKEN_ATTR_VERIFY_HEX; + } + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + const u8 *hash_pos = token.buf[0]; + + digest[0] = hex_to_u32 (hash_pos + 0); + digest[1] = hex_to_u32 (hash_pos + 8); + digest[2] = hex_to_u32 (hash_pos + 16); + digest[3] = hex_to_u32 (hash_pos + 24); + + if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) + { + digest[0] -= MD5M_A; + digest[1] -= MD5M_B; + digest[2] -= MD5M_C; + digest[3] -= MD5M_D; + } + + const u8 *salt_pos = token.buf[1]; + const int salt_len = token.len[1]; + + memset (salt->salt_buf, 0, sizeof (salt->salt_buf)); + + const bool parse_rc = generic_salt_decode (hashconfig, salt_pos, salt_len, (u8 *) salt->salt_buf, (int *) &salt->salt_len); + + if (parse_rc == false) return (PARSER_SALT_LENGTH); + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u32 *digest = (const u32 *) digest_buf; + + // we can not change anything in the original buffer, otherwise destroying sorting + // therefore create some local buffer + + u32 tmp[4]; + + tmp[0] = digest[0]; + tmp[1] = digest[1]; + tmp[2] = digest[2]; + tmp[3] = digest[3]; + + if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) + { + tmp[0] += MD5M_A; + tmp[1] += MD5M_B; + tmp[2] += MD5M_C; + tmp[3] += MD5M_D; + } + + u8 *out_buf = (u8 *) line_buf; + + int out_len = 0; + + u32_to_hex (tmp[0], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[1], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[2], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[3], out_buf + out_len); out_len += 8; + + out_buf[out_len] = hashconfig->separator; + + out_len += 1; + + out_len += generic_salt_encode (hashconfig, (const u8 *) salt->salt_buf, (const int) salt->salt_len, out_buf + out_len); + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = MODULE_DEFAULT; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_03200.c b/src/modules/module_03200.c index 8f0ad91aa..bd38d8aec 100644 --- a/src/modules/module_03200.c +++ b/src/modules/module_03200.c @@ -227,7 +227,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memset (tmp_buf, 0, sizeof (tmp_buf)); - base64_decode (bf64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf); + base64_decode (bf64_to_int, salt_pos, salt_len, tmp_buf); memcpy (salt_buf_ptr, tmp_buf, 16); @@ -238,7 +238,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memset (tmp_buf, 0, sizeof (tmp_buf)); - base64_decode (bf64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf); + base64_decode (bf64_to_int, hash_pos, hash_len, tmp_buf); memcpy (digest, tmp_buf, 24); @@ -281,7 +281,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE tmp_buf[22 + 31] = 0; // base64_encode wants to pad - return snprintf (line_buf, line_size, "%s$%s", (char *) salt->salt_sign, tmp_buf); + return snprintf (line_buf, line_size, "%s$%s", (const char *) salt->salt_sign, tmp_buf); } void module_init (module_ctx_t *module_ctx) diff --git a/src/modules/module_03730.c b/src/modules/module_03730.c index eb37c234f..c5959ad06 100644 --- a/src/modules/module_03730.c +++ b/src/modules/module_03730.c @@ -122,11 +122,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE digest[3] -= MD5M_D; } - const bool parse_rc1 = generic_salt_decode (hashconfig, token.buf[1], token.len[1], (u8 *) md5_double_salt->salt1_buf, (int *) &md5_double_salt->salt1_len); + const bool parse_rc1 = generic_salt_decode (hashconfig, token.buf[1], token.len[1], (u8 *) md5_double_salt->salt1_buf, &md5_double_salt->salt1_len); if (parse_rc1 == false) return (PARSER_SALT_LENGTH); - const bool parse_rc2 = generic_salt_decode (hashconfig, token.buf[2], token.len[2], (u8 *) md5_double_salt->salt2_buf, (int *) &md5_double_salt->salt2_len); + const bool parse_rc2 = generic_salt_decode (hashconfig, token.buf[2], token.len[2], (u8 *) md5_double_salt->salt2_buf, &md5_double_salt->salt2_len); if (parse_rc2 == false) return (PARSER_SALT_LENGTH); @@ -186,13 +186,13 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE out_len += 1; - out_len += generic_salt_encode (hashconfig, (const u8 *) md5_double_salt->salt1_buf, (const int) md5_double_salt->salt1_len, out_buf + out_len); + out_len += generic_salt_encode (hashconfig, (const u8 *) md5_double_salt->salt1_buf, md5_double_salt->salt1_len, out_buf + out_len); out_buf[out_len] = hashconfig->separator; out_len += 1; - out_len += generic_salt_encode (hashconfig, (const u8 *) md5_double_salt->salt2_buf, (const int) md5_double_salt->salt2_len, out_buf + out_len); + out_len += generic_salt_encode (hashconfig, (const u8 *) md5_double_salt->salt2_buf, md5_double_salt->salt2_len, out_buf + out_len); return out_len; } diff --git a/src/modules/module_04420.c b/src/modules/module_04420.c new file mode 100644 index 000000000..9a2727935 --- /dev/null +++ b/src/modules/module_04420.c @@ -0,0 +1,221 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_INSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 3; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 1; +static const u32 DGST_SIZE = DGST_SIZE_4_4; +static const u32 HASH_CATEGORY = HASH_CATEGORY_RAW_HASH_SALTED; +static const char *HASH_NAME = "md5(sha1($pass.$salt))"; +static const u64 KERN_TYPE = 4420; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_RAW_HASH; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS15; +static const u32 SALT_TYPE = SALT_TYPE_GENERIC; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "34ebbba3e5c98f6253c160eae53da092:6224378456121050285"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 2; + + token.sep[0] = hashconfig->separator; + token.len[0] = 32; + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + token.len_min[1] = SALT_MIN; + token.len_max[1] = SALT_MAX; + token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH; + + if (hashconfig->opts_type & OPTS_TYPE_ST_HEX) + { + token.len_min[1] *= 2; + token.len_max[1] *= 2; + + token.attr[1] |= TOKEN_ATTR_VERIFY_HEX; + } + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + const u8 *hash_pos = token.buf[0]; + + digest[0] = hex_to_u32 (hash_pos + 0); + digest[1] = hex_to_u32 (hash_pos + 8); + digest[2] = hex_to_u32 (hash_pos + 16); + digest[3] = hex_to_u32 (hash_pos + 24); + + if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) + { + digest[0] -= MD5M_A; + digest[1] -= MD5M_B; + digest[2] -= MD5M_C; + digest[3] -= MD5M_D; + } + + const u8 *salt_pos = token.buf[1]; + const int salt_len = token.len[1]; + + const bool parse_rc = generic_salt_decode (hashconfig, salt_pos, salt_len, (u8 *) salt->salt_buf, (int *) &salt->salt_len); + + if (parse_rc == false) return (PARSER_SALT_LENGTH); + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u32 *digest = (const u32 *) digest_buf; + + u32 tmp[4]; + + tmp[0] = digest[0]; + tmp[1] = digest[1]; + tmp[2] = digest[2]; + tmp[3] = digest[3]; + + if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) + { + tmp[0] += MD5M_A; + tmp[1] += MD5M_B; + tmp[2] += MD5M_C; + tmp[3] += MD5M_D; + } + + u8 *out_buf = (u8 *) line_buf; + + int out_len = 0; + + u32_to_hex (tmp[0], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[1], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[2], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[3], out_buf + out_len); out_len += 8; + + out_buf[out_len] = hashconfig->separator; + + out_len += 1; + + out_len += generic_salt_encode (hashconfig, (const u8 *) salt->salt_buf, (const int) salt->salt_len, out_buf + out_len); + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = MODULE_DEFAULT; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_04430.c b/src/modules/module_04430.c new file mode 100644 index 000000000..52eae5dea --- /dev/null +++ b/src/modules/module_04430.c @@ -0,0 +1,221 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_INSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 3; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 1; +static const u32 DGST_SIZE = DGST_SIZE_4_4; +static const u32 HASH_CATEGORY = HASH_CATEGORY_RAW_HASH_SALTED; +static const char *HASH_NAME = "md5(sha1($salt.$pass))"; +static const u64 KERN_TYPE = 4430; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_RAW_HASH; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; +static const u32 SALT_TYPE = SALT_TYPE_GENERIC; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "df0e9ede5b6c7d1f1b47199f86029002:59132809201799180722359939692710461886"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 2; + + token.sep[0] = hashconfig->separator; + token.len[0] = 32; + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + token.len_min[1] = SALT_MIN; + token.len_max[1] = SALT_MAX; + token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH; + + if (hashconfig->opts_type & OPTS_TYPE_ST_HEX) + { + token.len_min[1] *= 2; + token.len_max[1] *= 2; + + token.attr[1] |= TOKEN_ATTR_VERIFY_HEX; + } + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + const u8 *hash_pos = token.buf[0]; + + digest[0] = hex_to_u32 (hash_pos + 0); + digest[1] = hex_to_u32 (hash_pos + 8); + digest[2] = hex_to_u32 (hash_pos + 16); + digest[3] = hex_to_u32 (hash_pos + 24); + + if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) + { + digest[0] -= MD5M_A; + digest[1] -= MD5M_B; + digest[2] -= MD5M_C; + digest[3] -= MD5M_D; + } + + const u8 *salt_pos = token.buf[1]; + const int salt_len = token.len[1]; + + const bool parse_rc = generic_salt_decode (hashconfig, salt_pos, salt_len, (u8 *) salt->salt_buf, (int *) &salt->salt_len); + + if (parse_rc == false) return (PARSER_SALT_LENGTH); + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u32 *digest = (const u32 *) digest_buf; + + u32 tmp[4]; + + tmp[0] = digest[0]; + tmp[1] = digest[1]; + tmp[2] = digest[2]; + tmp[3] = digest[3]; + + if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) + { + tmp[0] += MD5M_A; + tmp[1] += MD5M_B; + tmp[2] += MD5M_C; + tmp[3] += MD5M_D; + } + + u8 *out_buf = (u8 *) line_buf; + + int out_len = 0; + + u32_to_hex (tmp[0], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[1], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[2], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[3], out_buf + out_len); out_len += 8; + + out_buf[out_len] = hashconfig->separator; + + out_len += 1; + + out_len += generic_salt_encode (hashconfig, (const u8 *) salt->salt_buf, (const int) salt->salt_len, out_buf + out_len); + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = MODULE_DEFAULT; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_04510.c b/src/modules/module_04510.c index 51d0a686a..6659b478d 100644 --- a/src/modules/module_04510.c +++ b/src/modules/module_04510.c @@ -166,7 +166,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE out_len += 1; - out_len += generic_salt_encode (hashconfig, (const u8 *) salt->salt_buf, (const int) salt->salt_len, (u8 *) out_buf + out_len); + out_len += generic_salt_encode (hashconfig, (const u8 *) salt->salt_buf, (const int) salt->salt_len, out_buf + out_len); return out_len; } diff --git a/src/modules/module_04710.c b/src/modules/module_04710.c index 48d0e0a9b..6a04380c0 100644 --- a/src/modules/module_04710.c +++ b/src/modules/module_04710.c @@ -166,7 +166,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE out_len += 1; - out_len += generic_salt_encode (hashconfig, (const u8 *) salt->salt_buf, (const int) salt->salt_len, (u8 *) out_buf + out_len); + out_len += generic_salt_encode (hashconfig, (const u8 *) salt->salt_buf, (const int) salt->salt_len, out_buf + out_len); return out_len; } diff --git a/src/modules/module_04711.c b/src/modules/module_04711.c index 5020a5d18..1e1bfdcc0 100644 --- a/src/modules/module_04711.c +++ b/src/modules/module_04711.c @@ -167,7 +167,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE out_len += 1; - out_len += generic_salt_encode (hashconfig, (const u8 *) salt->salt_buf, (const int) salt->salt_len, (u8 *) out_buf + out_len); + out_len += generic_salt_encode (hashconfig, (const u8 *) salt->salt_buf, (const int) salt->salt_len, out_buf + out_len); return out_len; } diff --git a/src/modules/module_05200.c b/src/modules/module_05200.c index 66eb5fd8d..47fb863cb 100644 --- a/src/modules/module_05200.c +++ b/src/modules/module_05200.c @@ -133,7 +133,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE HCFILE fp; - if (hc_fopen (&fp, (const char *) line_buf, "rb") == false) return (PARSER_HASH_FILE); + if (hc_fopen (&fp, line_buf, "rb") == false) return (PARSER_HASH_FILE); psafe3_t in; diff --git a/src/modules/module_05500.c b/src/modules/module_05500.c index ec6771bd9..9fc1de726 100644 --- a/src/modules/module_05500.c +++ b/src/modules/module_05500.c @@ -351,9 +351,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int out_len = 0; - u8 *ptr; - - ptr = (u8 *) netntlm->userdomain_buf; + const u8 *ptr = (const u8 *) netntlm->userdomain_buf; for (int i = 0; i < netntlm->user_len; i += 2) { @@ -372,7 +370,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE out_buf[out_len++] = ':'; - ptr = (u8 *) netntlm->chall_buf; + ptr = (const u8 *) netntlm->chall_buf; for (int i = 0; i < netntlm->srvchall_len; i++) { diff --git a/src/modules/module_05600.c b/src/modules/module_05600.c index 9870369fe..a40ec4e64 100644 --- a/src/modules/module_05600.c +++ b/src/modules/module_05600.c @@ -196,7 +196,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE digest[3] = hex_to_u32 (hash_pos + 24); /** - * reuse challange data as salt_buf, its the buffer that is most likely unique + * reuse challenge data as salt_buf, its the buffer that is most likely unique */ salt->salt_buf[0] = 0; @@ -249,9 +249,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int out_len = 0; - u8 *ptr; - - ptr = (u8 *) netntlm->userdomain_buf; + const u8 *ptr = (const u8 *) netntlm->userdomain_buf; for (int i = 0; i < netntlm->user_len; i += 2) { @@ -270,7 +268,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE out_buf[out_len++] = ':'; - ptr = (u8 *) netntlm->chall_buf; + ptr = (const u8 *) netntlm->chall_buf; for (int i = 0; i < netntlm->srvchall_len; i++) { diff --git a/src/modules/module_05700.c b/src/modules/module_05700.c index dab3dc8c5..e981eeea1 100644 --- a/src/modules/module_05700.c +++ b/src/modules/module_05700.c @@ -71,7 +71,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 tmp_buf[100] = { 0 }; - base64_decode (itoa64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf); + base64_decode (itoa64_to_int, hash_pos, hash_len, tmp_buf); memcpy (digest, tmp_buf, 32); diff --git a/src/modules/module_06800.c b/src/modules/module_06800.c index 35eebf6b4..6439f98f3 100644 --- a/src/modules/module_06800.c +++ b/src/modules/module_06800.c @@ -175,7 +175,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE lastpass_t *lastpass = (lastpass_t *) esalt_buf; - const int iv_size = hex_decode ((const u8 *) token.buf[3], token.len[3], (u8 *) lastpass->iv); + const int iv_size = hex_decode (token.buf[3], token.len[3], (u8 *) lastpass->iv); if (iv_size != sizeof (lastpass->iv)) return (PARSER_IV_LENGTH); diff --git a/src/modules/module_07200.c b/src/modules/module_07200.c index 7f2852234..7387334b8 100644 --- a/src/modules/module_07200.c +++ b/src/modules/module_07200.c @@ -195,7 +195,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE line_len += snprintf (line_buf + line_len, line_size - line_len, "%s%u.", SIGNATURE_SHA512GRUB, salt->salt_iter + 1); - unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf; + const unsigned char *salt_buf_ptr = (const unsigned char *) pbkdf2_sha512->salt_buf; for (u32 i = 0; i < salt->salt_len; i++) { diff --git a/src/modules/module_07300.c b/src/modules/module_07300.c index 77a07db2d..00bff337a 100644 --- a/src/modules/module_07300.c +++ b/src/modules/module_07300.c @@ -140,7 +140,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const rakp_t *rakp = (const rakp_t *) esalt_buf; - u8 *ptr = (u8 *) rakp->salt_buf; + const u8 *ptr = (const u8 *) rakp->salt_buf; int line_len = 0; diff --git a/src/modules/module_07400.c b/src/modules/module_07400.c index b4f82ed16..251aec4f8 100644 --- a/src/modules/module_07400.c +++ b/src/modules/module_07400.c @@ -21,7 +21,8 @@ static const char *HASH_NAME = "sha256crypt $5$, SHA256 (Unix)"; static const u64 KERN_TYPE = 7400; static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE - | OPTS_TYPE_PT_GENERATE_LE; + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_DEEP_COMP_KERNEL; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; static const char *ST_HASH = "$5$7777657035274252$XftMj84MW.New1/ViLY5V4CM4Y7EBvfETaZsCW9vcJ8"; @@ -52,6 +53,11 @@ typedef struct sha256crypt_tmp static const u32 ROUNDS_SHA256CRYPT = 5000; static const char *SIGNATURE_SHA256CRYPT = "$5$"; +u32 module_deep_comp_kernel (MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const u32 salt_pos, MAYBE_UNUSED const u32 digest_pos) +{ + return KERN_RUN_3; +} + static void sha256crypt_decode (u8 digest[32], const u8 buf[43]) { int l; @@ -337,7 +343,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { char ptr_plain[48] = { 0 }; - sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain); + sha256crypt_encode ((const unsigned char *) digest_buf, (unsigned char *) ptr_plain); char tmp_salt[SALT_MAX * 2]; @@ -371,7 +377,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; - module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = MODULE_DEFAULT; module_ctx->module_dgst_pos0 = module_dgst_pos0; module_ctx->module_dgst_pos1 = module_dgst_pos1; diff --git a/src/modules/module_07401.c b/src/modules/module_07401.c index 9584781a4..ae5fdd434 100644 --- a/src/modules/module_07401.c +++ b/src/modules/module_07401.c @@ -358,7 +358,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 tmp_dgst[100] = { 0 }; - const int dgst_len = hex_decode ((const u8 *) hash_pos, hash_len, (u8 *) tmp_dgst); + const int dgst_len = hex_decode (hash_pos, hash_len, (u8 *) tmp_dgst); if (dgst_len != 43) return (PARSER_HASH_ENCODING); @@ -373,7 +373,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 dgst[100] = { 0 }; - sha256crypt_encode ((u8 *) digest_buf, dgst); + sha256crypt_encode ((const u8 *) digest_buf, dgst); // yeah, this is weird: we use hex-encoding for base64-encoded salt // this has to do with missing MySQL function to decode/encode this variant of base64 diff --git a/src/modules/module_07500.c b/src/modules/module_07500.c index f119402cd..e8434e5f6 100644 --- a/src/modules/module_07500.c +++ b/src/modules/module_07500.c @@ -216,8 +216,8 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { const krb5pa_t *krb5pa = (const krb5pa_t *) esalt_buf; - u8 *ptr_timestamp = (u8 *) krb5pa->timestamp; - u8 *ptr_checksum = (u8 *) krb5pa->checksum; + const u8 *ptr_timestamp = (const u8 *) krb5pa->timestamp; + const u8 *ptr_checksum = (const u8 *) krb5pa->checksum; char data[128] = { 0 }; @@ -225,21 +225,21 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (u32 i = 0; i < 36; i++, ptr_data += 2) { - sprintf (ptr_data, "%02x", ptr_timestamp[i]); + snprintf (ptr_data, 3, "%02x", ptr_timestamp[i]); } for (u32 i = 0; i < 16; i++, ptr_data += 2) { - sprintf (ptr_data, "%02x", ptr_checksum[i]); + snprintf (ptr_data, 3, "%02x", ptr_checksum[i]); } *ptr_data = 0; const int line_len = snprintf (line_buf, line_size, "%s%s$%s$%s$%s", SIGNATURE_KRB5PA, - (char *) krb5pa->user, - (char *) krb5pa->realm, - (char *) krb5pa->salt, + (const char *) krb5pa->user, + (const char *) krb5pa->realm, + (const char *) krb5pa->salt, data); return line_len; diff --git a/src/modules/module_07800.c b/src/modules/module_07800.c index 080a26252..8aa784460 100644 --- a/src/modules/module_07800.c +++ b/src/modules/module_07800.c @@ -109,11 +109,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *hash_pos = token.buf[1]; - digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); - digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); - digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); - digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); - digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]); + digest[0] = hex_to_u32 (&hash_pos[ 0]); + digest[1] = hex_to_u32 (&hash_pos[ 8]); + digest[2] = hex_to_u32 (&hash_pos[16]); + digest[3] = hex_to_u32 (&hash_pos[24]); + digest[4] = hex_to_u32 (&hash_pos[32]); digest[0] = byte_swap_32 (digest[0]); digest[1] = byte_swap_32 (digest[1]); diff --git a/src/modules/module_07801.c b/src/modules/module_07801.c index 0e390d259..4caf03e84 100644 --- a/src/modules/module_07801.c +++ b/src/modules/module_07801.c @@ -109,11 +109,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *hash_pos = token.buf[1]; - digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); - digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); - digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); - digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); - digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]); + digest[0] = hex_to_u32 (&hash_pos[ 0]); + digest[1] = hex_to_u32 (&hash_pos[ 8]); + digest[2] = hex_to_u32 (&hash_pos[16]); + digest[3] = hex_to_u32 (&hash_pos[24]); + digest[4] = hex_to_u32 (&hash_pos[32]); digest[0] = byte_swap_32 (digest[0]); digest[1] = byte_swap_32 (digest[1]); diff --git a/src/modules/module_07900.c b/src/modules/module_07900.c index bebfb6aab..7afbe2221 100644 --- a/src/modules/module_07900.c +++ b/src/modules/module_07900.c @@ -428,7 +428,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // ugly hack start - char *tmpx = (char *) salt->salt_buf_pc; + const char *tmpx = (const char *) salt->salt_buf_pc; ptr_plain[42] = tmpx[0]; @@ -436,7 +436,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE ptr_plain[43] = 0; - const int line_len = snprintf (line_buf, line_size, "%s%s%s", (char *) salt->salt_sign, (char *) salt->salt_buf, ptr_plain); + const int line_len = snprintf (line_buf, line_size, "%s%s%s", (const char *) salt->salt_sign, (const char *) salt->salt_buf, ptr_plain); return line_len; } diff --git a/src/modules/module_08200.c b/src/modules/module_08200.c index 4098df8c8..b8a7b75d9 100644 --- a/src/modules/module_08200.c +++ b/src/modules/module_08200.c @@ -62,6 +62,11 @@ typedef struct pbkdf2_sha512_tmp bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) { + if (device_param->opencl_device_vendor_id == VENDOR_ID_INTEL_SDK) + { + return true; + } + // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs if (device_param->is_metal == true) { @@ -237,7 +242,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (int i = 0, j = 0; i < 512; i += 1, j += 8) { - sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]); + snprintf (data_buf + j, 9, "%08x", cloudkey->data_buf[i]); } data_buf[cloudkey->data_len * 2] = 0; diff --git a/src/modules/module_08300.c b/src/modules/module_08300.c index 88975f396..74bb19823 100644 --- a/src/modules/module_08300.c +++ b/src/modules/module_08300.c @@ -175,7 +175,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE char domain_buf_c[33] = { 0 }; - memcpy (domain_buf_c, (char *) salt->salt_buf_pc, salt_pc_len); + memcpy (domain_buf_c, (const char *) salt->salt_buf_pc, salt_pc_len); for (u32 i = 0; i < salt_pc_len; i++) { diff --git a/src/modules/module_08800.c b/src/modules/module_08800.c index 7de1ecf2c..6b78e7f16 100644 --- a/src/modules/module_08800.c +++ b/src/modules/module_08800.c @@ -183,7 +183,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (u32 i = 0, j = 0; i < 384; i += 1, j += 8) { - sprintf (tmp + j, "%08x", androidfde->data[i]); + snprintf (tmp + j, 9, "%08x", androidfde->data[i]); } tmp[3072] = 0; diff --git a/src/modules/module_08900.c b/src/modules/module_08900.c index d7b7a9a62..6f996a3b0 100644 --- a/src/modules/module_08900.c +++ b/src/modules/module_08900.c @@ -336,7 +336,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 tmp_buf[128] = { 0 }; - const int tmp_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf); + const int tmp_len = base64_decode (base64_to_int, salt_pos, salt_len, tmp_buf); memcpy (salt->salt_buf, tmp_buf, tmp_len); @@ -349,7 +349,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memset (tmp_buf, 0, sizeof (tmp_buf)); - const int digest_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf); + const int digest_len = base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf); // digest_len should be safe because of 88 limit diff --git a/src/modules/module_09000.c b/src/modules/module_09000.c index 8ea86ae32..4ed3b41ff 100644 --- a/src/modules/module_09000.c +++ b/src/modules/module_09000.c @@ -188,7 +188,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE HCFILE fp; - if (hc_fopen (&fp, (const char *) line_buf, "rb") == false) return (PARSER_HASH_FILE); + if (hc_fopen (&fp, line_buf, "rb") == false) return (PARSER_HASH_FILE); psafe2_hdr buf; diff --git a/src/modules/module_09200.c b/src/modules/module_09200.c index bfc3aac69..495dea9fd 100644 --- a/src/modules/module_09200.c +++ b/src/modules/module_09200.c @@ -171,9 +171,9 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // salt - const pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) esalt_buf; + const pbkdf2_sha256_t *pbkdf2_sha256 = (const pbkdf2_sha256_t *) esalt_buf; - unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf; + const unsigned char *salt_buf_ptr = (const unsigned char *) pbkdf2_sha256->salt_buf; // hash diff --git a/src/modules/module_09300.c b/src/modules/module_09300.c index e60d47b36..b4e06bef9 100644 --- a/src/modules/module_09300.c +++ b/src/modules/module_09300.c @@ -337,7 +337,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE tmp_buf[43] = 0; // cut it here - const int line_len = snprintf (line_buf, line_size, "%s%s$%s", SIGNATURE_CISCO9, (unsigned char *) salt->salt_buf, tmp_buf); + const int line_len = snprintf (line_buf, line_size, "%s%s$%s", SIGNATURE_CISCO9, (const unsigned char *) salt->salt_buf, tmp_buf); return line_len; } diff --git a/src/modules/module_09600.c b/src/modules/module_09600.c index 10b55cd3e..9232e543f 100644 --- a/src/modules/module_09600.c +++ b/src/modules/module_09600.c @@ -261,7 +261,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - const office2013_t *office2013 = (office2013_t *) esalt_buf; + const office2013_t *office2013 = (const office2013_t *) esalt_buf; const int line_len = snprintf (line_buf, line_size, "%s*%d*%d*%d*%d*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x%08x%08x", SIGNATURE_OFFICE2013, diff --git a/src/modules/module_09800.c b/src/modules/module_09800.c index 899b852e7..7c3036d5c 100644 --- a/src/modules/module_09800.c +++ b/src/modules/module_09800.c @@ -259,7 +259,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { secondBlockData[0] = '*'; - u8 *ptr = (u8 *) oldoffice34->secondBlockData; + const u8 *ptr = (const u8 *) oldoffice34->secondBlockData; for (int i = 0, j = 1; i < 32; i += 1, j += 2) { diff --git a/src/modules/module_09810.c b/src/modules/module_09810.c index b689304ea..d0c838e01 100644 --- a/src/modules/module_09810.c +++ b/src/modules/module_09810.c @@ -278,7 +278,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { secondBlockData[0] = '*'; - u8 *ptr = (u8 *) oldoffice34->secondBlockData; + const u8 *ptr = (const u8 *) oldoffice34->secondBlockData; for (int i = 0, j = 1; i < 32; i += 1, j += 2) { diff --git a/src/modules/module_09820.c b/src/modules/module_09820.c index 7508f8fff..f356fcbcb 100644 --- a/src/modules/module_09820.c +++ b/src/modules/module_09820.c @@ -293,7 +293,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { secondBlockData[0] = '*'; - u8 *ptr = (u8 *) oldoffice34->secondBlockData; + const u8 *ptr = (const u8 *) oldoffice34->secondBlockData; for (int i = 0, j = 1; i < 32; i += 1, j += 2) { diff --git a/src/modules/module_10000.c b/src/modules/module_10000.c index ce6518d3d..47901e03c 100644 --- a/src/modules/module_10000.c +++ b/src/modules/module_10000.c @@ -164,7 +164,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 tmp_buf[100] = { 0 }; - base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf); + base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf); memcpy (digest, tmp_buf, 32); diff --git a/src/modules/module_10200.c b/src/modules/module_10200.c index b236e573a..8c743a518 100644 --- a/src/modules/module_10200.c +++ b/src/modules/module_10200.c @@ -111,7 +111,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 tmp_buf[256] = { 0 }; - const int tmp_len = base64_decode (base64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf); + const int tmp_len = base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf); if (tmp_len < 32 + 1) return (PARSER_HASH_LENGTH); @@ -155,7 +155,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE char tmp_buf[SALT_MAX * 2]; const int tmp_len = snprintf (tmp_buf, sizeof (tmp_buf), "%s %08x%08x%08x%08x", - (char *) cram_md5->user, + (const char *) cram_md5->user, byte_swap_32 (digest[0]), byte_swap_32 (digest[1]), byte_swap_32 (digest[2]), diff --git a/src/modules/module_10300.c b/src/modules/module_10300.c index 0768b6029..85937d115 100644 --- a/src/modules/module_10300.c +++ b/src/modules/module_10300.c @@ -117,7 +117,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 tmp_buf[100] = { 0 }; - const u32 decoded_len = base64_decode (base64_to_int, (const u8 *) base64_pos, base64_len, tmp_buf); + const u32 decoded_len = base64_decode (base64_to_int, base64_pos, base64_len, tmp_buf); if (decoded_len < 24) return (PARSER_SALT_LENGTH); diff --git a/src/modules/module_10400.c b/src/modules/module_10400.c index 65a76701e..079325392 100644 --- a/src/modules/module_10400.c +++ b/src/modules/module_10400.c @@ -289,7 +289,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { const pdf_t *pdf = (const pdf_t *) esalt_buf; - char *line_format = "$pdf$%d*%d*%d*%u*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x"; + const char *line_format = "$pdf$%d*%d*%d*%u*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x"; if (pdf->P_minus == 1) line_format = "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x"; diff --git a/src/modules/module_10410.c b/src/modules/module_10410.c index 1e0914738..265a15662 100644 --- a/src/modules/module_10410.c +++ b/src/modules/module_10410.c @@ -310,7 +310,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { const pdf_t *pdf = (const pdf_t *) esalt_buf; - char *line_format = "$pdf$%d*%d*%d*%u*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x"; + const char *line_format = "$pdf$%d*%d*%d*%u*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x"; if (pdf->P_minus == 1) line_format = "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x"; diff --git a/src/modules/module_10420.c b/src/modules/module_10420.c index 23e8cb663..14054efc7 100644 --- a/src/modules/module_10420.c +++ b/src/modules/module_10420.c @@ -319,7 +319,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *rc4key = (const u8 *) pdf->rc4key; - char *line_format = "$pdf$%d*%d*%d*%u*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x"; + const char *line_format = "$pdf$%d*%d*%d*%u*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x"; if (pdf->P_minus == 1) line_format = "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x"; diff --git a/src/modules/module_10500.c b/src/modules/module_10500.c index b9d932bc0..0e9026ef1 100644 --- a/src/modules/module_10500.c +++ b/src/modules/module_10500.c @@ -378,7 +378,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE if (pdf->id_len == 32) { - char *line_format = "$pdf$%d*%d*%d*%u*%d*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x"; + const char *line_format = "$pdf$%d*%d*%d*%u*%d*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x"; if (pdf->P_minus == 1) line_format = "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x"; @@ -419,7 +419,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE } else { - char *line_format = "$pdf$%d*%d*%d*%u*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x"; + const char *line_format = "$pdf$%d*%d*%d*%u*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x"; if (pdf->P_minus == 1) line_format = "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x"; diff --git a/src/modules/module_10600.c b/src/modules/module_10600.c index dc5422137..6cd76cbbd 100644 --- a/src/modules/module_10600.c +++ b/src/modules/module_10600.c @@ -236,7 +236,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8) { - pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]); + pdf->u_buf[i] = hex_to_u32 (&u_buf_pos[j]); } salt->salt_buf[0] = pdf->u_buf[8]; diff --git a/src/modules/module_10700.c b/src/modules/module_10700.c index e8a8edce2..05be37b65 100644 --- a/src/modules/module_10700.c +++ b/src/modules/module_10700.c @@ -84,10 +84,13 @@ static const int ROUNDS_PDF17L8 = 64; bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) { - // AppleM1, OpenCL, MTLCompilerService, createKernel: newComputePipelineState failed (or never-end with pure kernel) + // AppleM1, OpenCL, MTLCompilerService, createKernel never-end with pure kernel if ((device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) && (device_param->opencl_device_type & CL_DEVICE_TYPE_GPU)) { - return true; + if ((hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) == 0) + { + return true; + } } return false; @@ -132,6 +135,11 @@ char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAY { char *jit_build_options = NULL; + if (device_param->is_metal == true) + { + hc_asprintf (&jit_build_options, "-D FORCE_DISABLE_SHM"); + } + if ((device_param->opencl_device_vendor_id == VENDOR_ID_AMD) && (device_param->has_vperm == false)) { // this is a workaround to avoid a Segmentation fault and self-test fails on AMD GPU PRO @@ -307,7 +315,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8) { - pdf->u_buf[i] = hex_to_u32 ((const u8 *) &u_buf_pos[j]); + pdf->u_buf[i] = hex_to_u32 (&u_buf_pos[j]); } salt->salt_buf[0] = pdf->u_buf[8]; diff --git a/src/modules/module_10901.c b/src/modules/module_10901.c index ed95f467d..b0444bb8d 100644 --- a/src/modules/module_10901.c +++ b/src/modules/module_10901.c @@ -165,7 +165,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { const u32 *digest = (const u32 *) digest_buf; - const pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) esalt_buf; + const pbkdf2_sha256_t *pbkdf2_sha256 = (const pbkdf2_sha256_t *) esalt_buf; u32 tmp_digest[64]; diff --git a/src/modules/module_11300.c b/src/modules/module_11300.c index 7b81b3d26..6ece4048a 100644 --- a/src/modules/module_11300.c +++ b/src/modules/module_11300.c @@ -236,7 +236,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (int i = 0, j = 0; j < cry_master_len; i += 1, j += 8) { - bitcoin_wallet->cry_master_buf[i] = hex_to_u32 ((const u8 *) &cry_master_buf_pos[j]); + bitcoin_wallet->cry_master_buf[i] = hex_to_u32 (&cry_master_buf_pos[j]); } bitcoin_wallet->cry_master_len = cry_master_len / 2; diff --git a/src/modules/module_11400.c b/src/modules/module_11400.c index f6f656629..e5264d053 100644 --- a/src/modules/module_11400.c +++ b/src/modules/module_11400.c @@ -408,10 +408,10 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE * digest */ - digest[0] = hex_to_u32 ((const u8 *) &digest_pos[ 0]); - digest[1] = hex_to_u32 ((const u8 *) &digest_pos[ 8]); - digest[2] = hex_to_u32 ((const u8 *) &digest_pos[16]); - digest[3] = hex_to_u32 ((const u8 *) &digest_pos[24]); + digest[0] = hex_to_u32 (&digest_pos[ 0]); + digest[1] = hex_to_u32 (&digest_pos[ 8]); + digest[2] = hex_to_u32 (&digest_pos[16]); + digest[3] = hex_to_u32 (&digest_pos[24]); return (PARSER_OK); } diff --git a/src/modules/module_11600.c b/src/modules/module_11600.c index 9f1d37992..7205f6b7e 100644 --- a/src/modules/module_11600.c +++ b/src/modules/module_11600.c @@ -185,13 +185,13 @@ void module_hook23 (hc_device_param_t *device_param, MAYBE_UNUSED const void *ho { seven_zip_hook_t *hook_items = (seven_zip_hook_t *) device_param->hooks_buf; - seven_zip_hook_salt_t *seven_zips = (seven_zip_hook_salt_t *) hook_salts_buf; - seven_zip_hook_salt_t *seven_zip = &seven_zips[salt_pos]; + const seven_zip_hook_salt_t *seven_zips = (const seven_zip_hook_salt_t *) hook_salts_buf; + const seven_zip_hook_salt_t *seven_zip = &seven_zips[salt_pos]; - seven_zip_hook_extra_t *seven_zip_hook_extra = (seven_zip_hook_extra_t *) hook_extra_param; + const seven_zip_hook_extra_t *seven_zip_hook_extra = (const seven_zip_hook_extra_t *) hook_extra_param; u8 data_type = seven_zip->data_type; - u32 *data_buf = seven_zip->data_buf; + const u32 *data_buf = seven_zip->data_buf; u32 unpack_size = seven_zip->unpack_size; // this hook data needs to be updated (the "hook_success" variable): @@ -286,7 +286,7 @@ void module_hook23 (hc_device_param_t *device_param, MAYBE_UNUSED const void *ho { u32 crc_len = seven_zip->crc_len; - char *coder_attributes = seven_zip->coder_attributes; + const char *coder_attributes = seven_zip->coder_attributes; // input buffers and length @@ -657,7 +657,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (u32 i = 0, j = 0; j < coder_attributes_len; i += 1, j += 2) { - seven_zip->coder_attributes[i] = hex_to_u8 ((const u8 *) &coder_attributes_pos[j]); + seven_zip->coder_attributes[i] = hex_to_u8 (&coder_attributes_pos[j]); seven_zip->coder_attributes_len++; } @@ -716,7 +716,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - seven_zip_hook_salt_t *seven_zip = (seven_zip_hook_salt_t *) hook_salt_buf; + const seven_zip_hook_salt_t *seven_zip = (const seven_zip_hook_salt_t *) hook_salt_buf; const u32 data_len = seven_zip->data_len; @@ -752,7 +752,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE salt->salt_sign[0], cost, seven_zip->salt_len, - (char *) seven_zip->salt_buf, + (const char *) seven_zip->salt_buf, iv_len, iv[0], iv[1], diff --git a/src/modules/module_13100.c b/src/modules/module_13100.c index 23e0ee1f0..eb6288fb6 100644 --- a/src/modules/module_13100.c +++ b/src/modules/module_13100.c @@ -133,8 +133,8 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { if (line_buf[token.len[0] + 3] == '*') { - char *account_info_start = (char *) line_buf + 12; // we want the * char included - char *account_info_stop = strchr ((const char *) account_info_start + 1, '*'); + const char *account_info_start = line_buf + 12; // we want the * char included + char *account_info_stop = strchr (account_info_start + 1, '*'); if (account_info_stop == NULL) return (PARSER_SEPARATOR_UNMATCHED); @@ -311,9 +311,9 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (u32 i = 0, j = 0; i < krb5tgs->edata2_len; i += 1, j += 2) { - u8 *ptr_edata2 = (u8 *) krb5tgs->edata2; + const u8 *ptr_edata2 = (const u8 *) krb5tgs->edata2; - sprintf (data + j, "%02x", ptr_edata2[i]); + snprintf (data + j, 3, "%02x", ptr_edata2[i]); } int line_len; @@ -324,7 +324,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { line_len = snprintf (line_buf, line_size, "%s23$%s%08x%08x%08x%08x$%s", SIGNATURE_KRB5TGS, - (char *) krb5tgs->account_info, + (const char *) krb5tgs->account_info, byte_swap_32 (krb5tgs->checksum[0]), byte_swap_32 (krb5tgs->checksum[1]), byte_swap_32 (krb5tgs->checksum[2]), @@ -335,7 +335,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { line_len = snprintf (line_buf, line_size, "%s%s:%08x%08x%08x%08x$%s", SIGNATURE_KRB5TGS, - (char *) krb5tgs->account_info, + (const char *) krb5tgs->account_info, byte_swap_32 (krb5tgs->checksum[0]), byte_swap_32 (krb5tgs->checksum[1]), byte_swap_32 (krb5tgs->checksum[2]), diff --git a/src/modules/module_13400.c b/src/modules/module_13400.c index 7187f5815..8f019d859 100644 --- a/src/modules/module_13400.c +++ b/src/modules/module_13400.c @@ -139,8 +139,6 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE token.attr[3] = TOKEN_ATTR_VERIFY_LENGTH | TOKEN_ATTR_VERIFY_DIGIT; - if (line_len < 16) return (PARSER_SALT_LENGTH); - const u8 version = line_buf[10]; if (version == '1') @@ -284,10 +282,10 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *final_random_seed_pos = token.buf[4]; - keepass->final_random_seed[0] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 0]); - keepass->final_random_seed[1] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 8]); - keepass->final_random_seed[2] = hex_to_u32 ((const u8 *) &final_random_seed_pos[16]); - keepass->final_random_seed[3] = hex_to_u32 ((const u8 *) &final_random_seed_pos[24]); + keepass->final_random_seed[0] = hex_to_u32 (&final_random_seed_pos[ 0]); + keepass->final_random_seed[1] = hex_to_u32 (&final_random_seed_pos[ 8]); + keepass->final_random_seed[2] = hex_to_u32 (&final_random_seed_pos[16]); + keepass->final_random_seed[3] = hex_to_u32 (&final_random_seed_pos[24]); keepass->final_random_seed[0] = byte_swap_32 (keepass->final_random_seed[0]); keepass->final_random_seed[1] = byte_swap_32 (keepass->final_random_seed[1]); @@ -296,10 +294,10 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE if (keepass->version == 2) { - keepass->final_random_seed[4] = hex_to_u32 ((const u8 *) &final_random_seed_pos[32]); - keepass->final_random_seed[5] = hex_to_u32 ((const u8 *) &final_random_seed_pos[40]); - keepass->final_random_seed[6] = hex_to_u32 ((const u8 *) &final_random_seed_pos[48]); - keepass->final_random_seed[7] = hex_to_u32 ((const u8 *) &final_random_seed_pos[56]); + keepass->final_random_seed[4] = hex_to_u32 (&final_random_seed_pos[32]); + keepass->final_random_seed[5] = hex_to_u32 (&final_random_seed_pos[40]); + keepass->final_random_seed[6] = hex_to_u32 (&final_random_seed_pos[48]); + keepass->final_random_seed[7] = hex_to_u32 (&final_random_seed_pos[56]); keepass->final_random_seed[4] = byte_swap_32 (keepass->final_random_seed[4]); keepass->final_random_seed[5] = byte_swap_32 (keepass->final_random_seed[5]); @@ -311,14 +309,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *transf_random_seed_pos = token.buf[5]; - keepass->transf_random_seed[0] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 0]); - keepass->transf_random_seed[1] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 8]); - keepass->transf_random_seed[2] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[16]); - keepass->transf_random_seed[3] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[24]); - keepass->transf_random_seed[4] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[32]); - keepass->transf_random_seed[5] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[40]); - keepass->transf_random_seed[6] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[48]); - keepass->transf_random_seed[7] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[56]); + keepass->transf_random_seed[0] = hex_to_u32 (&transf_random_seed_pos[ 0]); + keepass->transf_random_seed[1] = hex_to_u32 (&transf_random_seed_pos[ 8]); + keepass->transf_random_seed[2] = hex_to_u32 (&transf_random_seed_pos[16]); + keepass->transf_random_seed[3] = hex_to_u32 (&transf_random_seed_pos[24]); + keepass->transf_random_seed[4] = hex_to_u32 (&transf_random_seed_pos[32]); + keepass->transf_random_seed[5] = hex_to_u32 (&transf_random_seed_pos[40]); + keepass->transf_random_seed[6] = hex_to_u32 (&transf_random_seed_pos[48]); + keepass->transf_random_seed[7] = hex_to_u32 (&transf_random_seed_pos[56]); keepass->transf_random_seed[0] = byte_swap_32 (keepass->transf_random_seed[0]); keepass->transf_random_seed[1] = byte_swap_32 (keepass->transf_random_seed[1]); @@ -333,10 +331,10 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *enc_iv_pos = token.buf[6]; - keepass->enc_iv[0] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 0]); - keepass->enc_iv[1] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 8]); - keepass->enc_iv[2] = hex_to_u32 ((const u8 *) &enc_iv_pos[16]); - keepass->enc_iv[3] = hex_to_u32 ((const u8 *) &enc_iv_pos[24]); + keepass->enc_iv[0] = hex_to_u32 (&enc_iv_pos[ 0]); + keepass->enc_iv[1] = hex_to_u32 (&enc_iv_pos[ 8]); + keepass->enc_iv[2] = hex_to_u32 (&enc_iv_pos[16]); + keepass->enc_iv[3] = hex_to_u32 (&enc_iv_pos[24]); keepass->enc_iv[0] = byte_swap_32 (keepass->enc_iv[0]); keepass->enc_iv[1] = byte_swap_32 (keepass->enc_iv[1]); @@ -351,14 +349,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *contents_hash_pos = token.buf[7]; - keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]); - keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]); - keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]); - keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]); - keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]); - keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]); - keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]); - keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]); + keepass->contents_hash[0] = hex_to_u32 (&contents_hash_pos[ 0]); + keepass->contents_hash[1] = hex_to_u32 (&contents_hash_pos[ 8]); + keepass->contents_hash[2] = hex_to_u32 (&contents_hash_pos[16]); + keepass->contents_hash[3] = hex_to_u32 (&contents_hash_pos[24]); + keepass->contents_hash[4] = hex_to_u32 (&contents_hash_pos[32]); + keepass->contents_hash[5] = hex_to_u32 (&contents_hash_pos[40]); + keepass->contents_hash[6] = hex_to_u32 (&contents_hash_pos[48]); + keepass->contents_hash[7] = hex_to_u32 (&contents_hash_pos[56]); keepass->contents_hash[0] = byte_swap_32 (keepass->contents_hash[0]); keepass->contents_hash[1] = byte_swap_32 (keepass->contents_hash[1]); @@ -378,7 +376,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (int i = 0, j = 0; j < contents_len; i += 1, j += 8) { - keepass->contents[i] = hex_to_u32 ((const u8 *) &contents_pos[j]); + keepass->contents[i] = hex_to_u32 (&contents_pos[j]); keepass->contents[i] = byte_swap_32 (keepass->contents[i]); } @@ -394,14 +392,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *expected_bytes_pos = token.buf[7]; - keepass->expected_bytes[0] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 0]); - keepass->expected_bytes[1] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 8]); - keepass->expected_bytes[2] = hex_to_u32 ((const u8 *) &expected_bytes_pos[16]); - keepass->expected_bytes[3] = hex_to_u32 ((const u8 *) &expected_bytes_pos[24]); - keepass->expected_bytes[4] = hex_to_u32 ((const u8 *) &expected_bytes_pos[32]); - keepass->expected_bytes[5] = hex_to_u32 ((const u8 *) &expected_bytes_pos[40]); - keepass->expected_bytes[6] = hex_to_u32 ((const u8 *) &expected_bytes_pos[48]); - keepass->expected_bytes[7] = hex_to_u32 ((const u8 *) &expected_bytes_pos[56]); + keepass->expected_bytes[0] = hex_to_u32 (&expected_bytes_pos[ 0]); + keepass->expected_bytes[1] = hex_to_u32 (&expected_bytes_pos[ 8]); + keepass->expected_bytes[2] = hex_to_u32 (&expected_bytes_pos[16]); + keepass->expected_bytes[3] = hex_to_u32 (&expected_bytes_pos[24]); + keepass->expected_bytes[4] = hex_to_u32 (&expected_bytes_pos[32]); + keepass->expected_bytes[5] = hex_to_u32 (&expected_bytes_pos[40]); + keepass->expected_bytes[6] = hex_to_u32 (&expected_bytes_pos[48]); + keepass->expected_bytes[7] = hex_to_u32 (&expected_bytes_pos[56]); keepass->expected_bytes[0] = byte_swap_32 (keepass->expected_bytes[0]); keepass->expected_bytes[1] = byte_swap_32 (keepass->expected_bytes[1]); @@ -416,14 +414,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *contents_hash_pos = token.buf[8]; - keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]); - keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]); - keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]); - keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]); - keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]); - keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]); - keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]); - keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]); + keepass->contents_hash[0] = hex_to_u32 (&contents_hash_pos[ 0]); + keepass->contents_hash[1] = hex_to_u32 (&contents_hash_pos[ 8]); + keepass->contents_hash[2] = hex_to_u32 (&contents_hash_pos[16]); + keepass->contents_hash[3] = hex_to_u32 (&contents_hash_pos[24]); + keepass->contents_hash[4] = hex_to_u32 (&contents_hash_pos[32]); + keepass->contents_hash[5] = hex_to_u32 (&contents_hash_pos[40]); + keepass->contents_hash[6] = hex_to_u32 (&contents_hash_pos[48]); + keepass->contents_hash[7] = hex_to_u32 (&contents_hash_pos[56]); keepass->contents_hash[0] = byte_swap_32 (keepass->contents_hash[0]); keepass->contents_hash[1] = byte_swap_32 (keepass->contents_hash[1]); @@ -444,14 +442,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { keepass->keyfile_len = 32; - keepass->keyfile[0] = hex_to_u32 ((const u8 *) &keyfile_pos[ 0]); - keepass->keyfile[1] = hex_to_u32 ((const u8 *) &keyfile_pos[ 8]); - keepass->keyfile[2] = hex_to_u32 ((const u8 *) &keyfile_pos[16]); - keepass->keyfile[3] = hex_to_u32 ((const u8 *) &keyfile_pos[24]); - keepass->keyfile[4] = hex_to_u32 ((const u8 *) &keyfile_pos[32]); - keepass->keyfile[5] = hex_to_u32 ((const u8 *) &keyfile_pos[40]); - keepass->keyfile[6] = hex_to_u32 ((const u8 *) &keyfile_pos[48]); - keepass->keyfile[7] = hex_to_u32 ((const u8 *) &keyfile_pos[56]); + keepass->keyfile[0] = hex_to_u32 (&keyfile_pos[ 0]); + keepass->keyfile[1] = hex_to_u32 (&keyfile_pos[ 8]); + keepass->keyfile[2] = hex_to_u32 (&keyfile_pos[16]); + keepass->keyfile[3] = hex_to_u32 (&keyfile_pos[24]); + keepass->keyfile[4] = hex_to_u32 (&keyfile_pos[32]); + keepass->keyfile[5] = hex_to_u32 (&keyfile_pos[40]); + keepass->keyfile[6] = hex_to_u32 (&keyfile_pos[48]); + keepass->keyfile[7] = hex_to_u32 (&keyfile_pos[56]); keepass->keyfile[0] = byte_swap_32 (keepass->keyfile[0]); keepass->keyfile[1] = byte_swap_32 (keepass->keyfile[1]); @@ -509,15 +507,15 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 algorithm = keepass->algorithm; u32 keyfile_len = keepass->keyfile_len; - u32 *ptr_final_random_seed = (u32 *) keepass->final_random_seed; - u32 *ptr_transf_random_seed = (u32 *) keepass->transf_random_seed; - u32 *ptr_enc_iv = (u32 *) keepass->enc_iv; - u32 *ptr_contents_hash = (u32 *) keepass->contents_hash; - u32 *ptr_keyfile = (u32 *) keepass->keyfile; + const u32 *ptr_final_random_seed = (const u32 *) keepass->final_random_seed; + const u32 *ptr_transf_random_seed = (const u32 *) keepass->transf_random_seed; + const u32 *ptr_enc_iv = (const u32 *) keepass->enc_iv; + const u32 *ptr_contents_hash = (const u32 *) keepass->contents_hash; + const u32 *ptr_keyfile = (const u32 *) keepass->keyfile; // specific to version 2 u32 expected_bytes_len; - u32 *ptr_expected_bytes; + const u32 *ptr_expected_bytes; u32 final_random_seed_len; u32 transf_random_seed_len; @@ -545,20 +543,17 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE *ptr_data = '*'; ptr_data++; - for (u32 i = 0; i < final_random_seed_len; i++, ptr_data += 8) - sprintf (ptr_data, "%08x", ptr_final_random_seed[i]); + for (u32 i = 0; i < final_random_seed_len; i++, ptr_data += 8) snprintf (ptr_data, 9, "%08x", ptr_final_random_seed[i]); *ptr_data = '*'; ptr_data++; - for (u32 i = 0; i < transf_random_seed_len; i++, ptr_data += 8) - sprintf (ptr_data, "%08x", ptr_transf_random_seed[i]); + for (u32 i = 0; i < transf_random_seed_len; i++, ptr_data += 8) snprintf (ptr_data, 9, "%08x", ptr_transf_random_seed[i]); *ptr_data = '*'; ptr_data++; - for (u32 i = 0; i < enc_iv_len; i++, ptr_data += 8) - sprintf (ptr_data, "%08x", ptr_enc_iv[i]); + for (u32 i = 0; i < enc_iv_len; i++, ptr_data += 8) snprintf (ptr_data, 9, "%08x", ptr_enc_iv[i]); *ptr_data = '*'; ptr_data++; @@ -566,10 +561,9 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE if (version == 1) { u32 contents_len = keepass->contents_len; - u32 *ptr_contents = (u32 *) keepass->contents; + const u32 *ptr_contents = (const u32 *) keepass->contents; - for (u32 i = 0; i < contents_hash_len; i++, ptr_data += 8) - sprintf (ptr_data, "%08x", ptr_contents_hash[i]); + for (u32 i = 0; i < contents_hash_len; i++, ptr_data += 8) snprintf (ptr_data, 9, "%08x", ptr_contents_hash[i]); *ptr_data = '*'; ptr_data++; @@ -583,31 +577,28 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE char ptr_contents_len[10] = { 0 }; - sprintf ((char*) ptr_contents_len, "%u", contents_len); + snprintf ((char*) ptr_contents_len, sizeof (ptr_contents_len), "%u", contents_len); - sprintf (ptr_data, "%u", contents_len); + snprintf (ptr_data, sizeof (ptr_contents_len), "%u", contents_len); ptr_data += strlen (ptr_contents_len); *ptr_data = '*'; ptr_data++; - for (u32 i = 0; i < contents_len / 4; i++, ptr_data += 8) - sprintf (ptr_data, "%08x", ptr_contents[i]); + for (u32 i = 0; i < contents_len / 4; i++, ptr_data += 8) snprintf (ptr_data, 9, "%08x", ptr_contents[i]); } else if (version == 2) { expected_bytes_len = 8; - ptr_expected_bytes = (u32 *) keepass->expected_bytes; + ptr_expected_bytes = (const u32 *) keepass->expected_bytes; - for (u32 i = 0; i < expected_bytes_len; i++, ptr_data += 8) - sprintf (ptr_data, "%08x", ptr_expected_bytes[i]); + for (u32 i = 0; i < expected_bytes_len; i++, ptr_data += 8) snprintf (ptr_data, 9, "%08x", ptr_expected_bytes[i]); *ptr_data = '*'; ptr_data++; - for (u32 i = 0; i < contents_hash_len; i++, ptr_data += 8) - sprintf (ptr_data, "%08x", ptr_contents_hash[i]); + for (u32 i = 0; i < contents_hash_len; i++, ptr_data += 8) snprintf (ptr_data, 9, "%08x", ptr_contents_hash[i]); } if (keyfile_len) @@ -622,15 +613,14 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE *ptr_data = '*'; ptr_data++; - sprintf (ptr_data, "%u", keyfile_len * 2); + snprintf (ptr_data, 3, "%u", keyfile_len * 2); ptr_data += 2; *ptr_data = '*'; ptr_data++; - for (u32 i = 0; i < 8; i++, ptr_data += 8) - sprintf (ptr_data, "%08x", ptr_keyfile[i]); + for (u32 i = 0; i < 8; i++, ptr_data += 8) snprintf (ptr_data, 9, "%08x", ptr_keyfile[i]); } return strlen (line_buf); diff --git a/src/modules/module_13500.c b/src/modules/module_13500.c index 8aa803f3e..5f59900df 100644 --- a/src/modules/module_13500.c +++ b/src/modules/module_13500.c @@ -184,7 +184,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { const u8 *ptr = (const u8 *) pstoken->salt_buf; - sprintf (pstoken_tmp + j, "%02x", ptr[i]); + snprintf (pstoken_tmp + j, 3, "%02x", ptr[i]); } const int line_len = snprintf (line_buf, line_size, "%08x%08x%08x%08x%08x%c%s", diff --git a/src/modules/module_13600.c b/src/modules/module_13600.c index 6ab9db77f..f927d5761 100644 --- a/src/modules/module_13600.c +++ b/src/modules/module_13600.c @@ -245,8 +245,8 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { if (salt_len != 16) return (PARSER_SALT_VALUE); - zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]); - zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]); + zip2->salt_buf[0] = hex_to_u32 (&salt_pos[ 0]); + zip2->salt_buf[1] = hex_to_u32 (&salt_pos[ 8]); zip2->salt_buf[2] = 0; zip2->salt_buf[3] = 0; @@ -256,9 +256,9 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { if (salt_len != 24) return (PARSER_SALT_VALUE); - zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]); - zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]); - zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]); + zip2->salt_buf[0] = hex_to_u32 (&salt_pos[ 0]); + zip2->salt_buf[1] = hex_to_u32 (&salt_pos[ 8]); + zip2->salt_buf[2] = hex_to_u32 (&salt_pos[16]); zip2->salt_buf[3] = 0; zip2->salt_len = 12; @@ -267,10 +267,10 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { if (salt_len != 32) return (PARSER_SALT_VALUE); - zip2->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[ 0]); - zip2->salt_buf[1] = hex_to_u32 ((const u8 *) &salt_pos[ 8]); - zip2->salt_buf[2] = hex_to_u32 ((const u8 *) &salt_pos[16]); - zip2->salt_buf[3] = hex_to_u32 ((const u8 *) &salt_pos[24]); + zip2->salt_buf[0] = hex_to_u32 (&salt_pos[ 0]); + zip2->salt_buf[1] = hex_to_u32 (&salt_pos[ 8]); + zip2->salt_buf[2] = hex_to_u32 (&salt_pos[16]); + zip2->salt_buf[3] = hex_to_u32 (&salt_pos[24]); zip2->salt_len = 16; } @@ -358,7 +358,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { const u8 *ptr = (const u8 *) zip2->salt_buf; - sprintf (salt_tmp + j, "%02x", ptr[i]); + snprintf (salt_tmp + j, 3, "%02x", ptr[i]); } const u32 data_len = zip2->data_len; @@ -369,7 +369,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { const u8 *ptr = (const u8 *) zip2->data_buf; - sprintf (data_tmp + j, "%02x", ptr[i]); + snprintf (data_tmp + j, 3, "%02x", ptr[i]); } const u32 auth_len = zip2->auth_len; @@ -380,7 +380,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { const u8 *ptr = (const u8 *) zip2->auth_buf; - sprintf (auth_tmp + j, "%02x", ptr[i]); + snprintf (auth_tmp + j, 3, "%02x", ptr[i]); } const int line_len = snprintf (line_buf, line_size, "%s*%u*%u*%u*%s*%x*%x*%s*%s*%s", diff --git a/src/modules/module_13711.c b/src/modules/module_13711.c index f442901d2..05ab89ecc 100644 --- a/src/modules/module_13711.c +++ b/src/modules/module_13711.c @@ -93,11 +93,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc_tmp->pim - 15); } } diff --git a/src/modules/module_13712.c b/src/modules/module_13712.c index 9c05ead68..6f62b2b33 100644 --- a/src/modules/module_13712.c +++ b/src/modules/module_13712.c @@ -93,11 +93,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc_tmp->pim - 15); } } diff --git a/src/modules/module_13713.c b/src/modules/module_13713.c index cd5e41ab6..ba414a5a0 100644 --- a/src/modules/module_13713.c +++ b/src/modules/module_13713.c @@ -93,11 +93,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc_tmp->pim - 15); } } diff --git a/src/modules/module_13721.c b/src/modules/module_13721.c index 4042664a0..f6f335eb6 100644 --- a/src/modules/module_13721.c +++ b/src/modules/module_13721.c @@ -30,6 +30,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_BINARY_HASHFILE | OPTS_TYPE_LOOP_EXTENDED | OPTS_TYPE_MP_MULTI_DISABLE + | OPTS_TYPE_KEYBOARD_MAPPING | OPTS_TYPE_COPY_TMPS; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; @@ -105,11 +106,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc64_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc64_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc64_tmp->pim - 15); } } diff --git a/src/modules/module_13722.c b/src/modules/module_13722.c index 980df5d2b..6ce7258e3 100644 --- a/src/modules/module_13722.c +++ b/src/modules/module_13722.c @@ -30,6 +30,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_BINARY_HASHFILE | OPTS_TYPE_LOOP_EXTENDED | OPTS_TYPE_MP_MULTI_DISABLE + | OPTS_TYPE_KEYBOARD_MAPPING | OPTS_TYPE_COPY_TMPS; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; @@ -105,11 +106,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc64_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc64_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc64_tmp->pim - 15); } } diff --git a/src/modules/module_13723.c b/src/modules/module_13723.c index 8bea36ed7..ca2a70316 100644 --- a/src/modules/module_13723.c +++ b/src/modules/module_13723.c @@ -30,6 +30,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_BINARY_HASHFILE | OPTS_TYPE_LOOP_EXTENDED | OPTS_TYPE_MP_MULTI_DISABLE + | OPTS_TYPE_KEYBOARD_MAPPING | OPTS_TYPE_COPY_TMPS; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; @@ -105,11 +106,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc64_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc64_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc64_tmp->pim - 15); } } diff --git a/src/modules/module_13731.c b/src/modules/module_13731.c index 15927541d..428c33ffa 100644 --- a/src/modules/module_13731.c +++ b/src/modules/module_13731.c @@ -112,11 +112,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc_tmp->pim - 15); } } diff --git a/src/modules/module_13732.c b/src/modules/module_13732.c index d577c819f..742b68d39 100644 --- a/src/modules/module_13732.c +++ b/src/modules/module_13732.c @@ -112,11 +112,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc_tmp->pim - 15); } } diff --git a/src/modules/module_13733.c b/src/modules/module_13733.c index 35f6020f3..1e9007315 100644 --- a/src/modules/module_13733.c +++ b/src/modules/module_13733.c @@ -112,11 +112,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc_tmp->pim - 15); } } diff --git a/src/modules/module_13751.c b/src/modules/module_13751.c index 71a051217..5530305f0 100644 --- a/src/modules/module_13751.c +++ b/src/modules/module_13751.c @@ -112,11 +112,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc_tmp->pim - 15); } } diff --git a/src/modules/module_13752.c b/src/modules/module_13752.c index 7ac105149..d5485047f 100644 --- a/src/modules/module_13752.c +++ b/src/modules/module_13752.c @@ -112,11 +112,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc_tmp->pim - 15); } } diff --git a/src/modules/module_13753.c b/src/modules/module_13753.c index 76a78d62a..5b6d7297d 100644 --- a/src/modules/module_13753.c +++ b/src/modules/module_13753.c @@ -112,11 +112,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc_tmp->pim - 15); } } diff --git a/src/modules/module_13771.c b/src/modules/module_13771.c index 592c5f2d6..e6283a499 100644 --- a/src/modules/module_13771.c +++ b/src/modules/module_13771.c @@ -98,11 +98,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc64_sbog_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc64_sbog_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc64_sbog_tmp->pim - 15); } } diff --git a/src/modules/module_13772.c b/src/modules/module_13772.c index e232bada5..7ae4bed75 100644 --- a/src/modules/module_13772.c +++ b/src/modules/module_13772.c @@ -98,11 +98,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc64_sbog_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc64_sbog_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc64_sbog_tmp->pim - 15); } } diff --git a/src/modules/module_13773.c b/src/modules/module_13773.c index d87d27eee..df1e35ba0 100644 --- a/src/modules/module_13773.c +++ b/src/modules/module_13773.c @@ -98,11 +98,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc64_sbog_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc64_sbog_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc64_sbog_tmp->pim - 15); } } diff --git a/src/modules/module_13800.c b/src/modules/module_13800.c index af1b68946..199aeebda 100644 --- a/src/modules/module_13800.c +++ b/src/modules/module_13800.c @@ -163,7 +163,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (int i = 0, j = 0; i < 32; i += 1, j += 8) { - sprintf (buf + j, "%08x", esalt->salt_buf[i]); + snprintf (buf + j, 9, "%08x", esalt->salt_buf[i]); } const int line_len = snprintf (line_buf, line_size, "%08x%08x%08x%08x%08x%08x%08x%08x%c%s", diff --git a/src/modules/module_14500.c b/src/modules/module_14500.c index 8033ed481..c940dc953 100644 --- a/src/modules/module_14500.c +++ b/src/modules/module_14500.c @@ -185,7 +185,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); - const u32 type = atoi ((char *)token.buf[1]); + const u32 type = atoi ((const char *)token.buf[1]); if (type > 14) return (PARSER_CRYPTOAPI_KERNELTYPE); @@ -208,7 +208,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE case 14: cryptoapi->kern_type = KERN_TYPE_CRYPTOAPI_WHIRLPOOL_TWOFISH; break; } - const u32 key_size = atoi ((char *)token.buf[2]); + const u32 key_size = atoi ((const char *)token.buf[2]); if (key_size > 2) return (PARSER_CRYPTOAPI_KEYSIZE); diff --git a/src/modules/module_14600.c b/src/modules/module_14600.c index 19421eabc..6848ca06a 100644 --- a/src/modules/module_14600.c +++ b/src/modules/module_14600.c @@ -380,7 +380,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE HCFILE fp; - if (hc_fopen (&fp, (const char *) line_buf, "rb") == false) return (PARSER_HAVE_ERRNO); + if (hc_fopen (&fp, line_buf, "rb") == false) return (PARSER_HAVE_ERRNO); struct luks_phdr hdr; diff --git a/src/modules/module_14700.c b/src/modules/module_14700.c index 601e07063..f71fd99a9 100644 --- a/src/modules/module_14700.c +++ b/src/modules/module_14700.c @@ -169,16 +169,16 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 *wpky_buf_ptr = (u32 *) itunes_backup->wpky; - wpky_buf_ptr[0] = hex_to_u32 ((const u8 *) &wpky_pos[ 0]); - wpky_buf_ptr[1] = hex_to_u32 ((const u8 *) &wpky_pos[ 8]); - wpky_buf_ptr[2] = hex_to_u32 ((const u8 *) &wpky_pos[16]); - wpky_buf_ptr[3] = hex_to_u32 ((const u8 *) &wpky_pos[24]); - wpky_buf_ptr[4] = hex_to_u32 ((const u8 *) &wpky_pos[32]); - wpky_buf_ptr[5] = hex_to_u32 ((const u8 *) &wpky_pos[40]); - wpky_buf_ptr[6] = hex_to_u32 ((const u8 *) &wpky_pos[48]); - wpky_buf_ptr[7] = hex_to_u32 ((const u8 *) &wpky_pos[56]); - wpky_buf_ptr[8] = hex_to_u32 ((const u8 *) &wpky_pos[64]); - wpky_buf_ptr[9] = hex_to_u32 ((const u8 *) &wpky_pos[72]); + wpky_buf_ptr[0] = hex_to_u32 (&wpky_pos[ 0]); + wpky_buf_ptr[1] = hex_to_u32 (&wpky_pos[ 8]); + wpky_buf_ptr[2] = hex_to_u32 (&wpky_pos[16]); + wpky_buf_ptr[3] = hex_to_u32 (&wpky_pos[24]); + wpky_buf_ptr[4] = hex_to_u32 (&wpky_pos[32]); + wpky_buf_ptr[5] = hex_to_u32 (&wpky_pos[40]); + wpky_buf_ptr[6] = hex_to_u32 (&wpky_pos[48]); + wpky_buf_ptr[7] = hex_to_u32 (&wpky_pos[56]); + wpky_buf_ptr[8] = hex_to_u32 (&wpky_pos[64]); + wpky_buf_ptr[9] = hex_to_u32 (&wpky_pos[72]); wpky_buf_ptr[0] = byte_swap_32 (wpky_buf_ptr[0]); wpky_buf_ptr[1] = byte_swap_32 (wpky_buf_ptr[1]); @@ -254,11 +254,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 *dpsl_buf_ptr = (u32 *) itunes_backup->dpsl; - dpsl_buf_ptr[0] = hex_to_u32 ((const u8 *) &dpsl_pos[ 0]); - dpsl_buf_ptr[1] = hex_to_u32 ((const u8 *) &dpsl_pos[ 8]); - dpsl_buf_ptr[2] = hex_to_u32 ((const u8 *) &dpsl_pos[16]); - dpsl_buf_ptr[3] = hex_to_u32 ((const u8 *) &dpsl_pos[24]); - dpsl_buf_ptr[4] = hex_to_u32 ((const u8 *) &dpsl_pos[32]); + dpsl_buf_ptr[0] = hex_to_u32 (&dpsl_pos[ 0]); + dpsl_buf_ptr[1] = hex_to_u32 (&dpsl_pos[ 8]); + dpsl_buf_ptr[2] = hex_to_u32 (&dpsl_pos[16]); + dpsl_buf_ptr[3] = hex_to_u32 (&dpsl_pos[24]); + dpsl_buf_ptr[4] = hex_to_u32 (&dpsl_pos[32]); dpsl_buf_ptr[0] = byte_swap_32 (dpsl_buf_ptr[ 0]); dpsl_buf_ptr[1] = byte_swap_32 (dpsl_buf_ptr[ 1]); diff --git a/src/modules/module_14800.c b/src/modules/module_14800.c index 2825b93ce..2a5f6b33c 100644 --- a/src/modules/module_14800.c +++ b/src/modules/module_14800.c @@ -185,16 +185,16 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 *wpky_buf_ptr = (u32 *) itunes_backup->wpky; - wpky_buf_ptr[0] = hex_to_u32 ((const u8 *) &wpky_pos[ 0]); - wpky_buf_ptr[1] = hex_to_u32 ((const u8 *) &wpky_pos[ 8]); - wpky_buf_ptr[2] = hex_to_u32 ((const u8 *) &wpky_pos[16]); - wpky_buf_ptr[3] = hex_to_u32 ((const u8 *) &wpky_pos[24]); - wpky_buf_ptr[4] = hex_to_u32 ((const u8 *) &wpky_pos[32]); - wpky_buf_ptr[5] = hex_to_u32 ((const u8 *) &wpky_pos[40]); - wpky_buf_ptr[6] = hex_to_u32 ((const u8 *) &wpky_pos[48]); - wpky_buf_ptr[7] = hex_to_u32 ((const u8 *) &wpky_pos[56]); - wpky_buf_ptr[8] = hex_to_u32 ((const u8 *) &wpky_pos[64]); - wpky_buf_ptr[9] = hex_to_u32 ((const u8 *) &wpky_pos[72]); + wpky_buf_ptr[0] = hex_to_u32 (&wpky_pos[ 0]); + wpky_buf_ptr[1] = hex_to_u32 (&wpky_pos[ 8]); + wpky_buf_ptr[2] = hex_to_u32 (&wpky_pos[16]); + wpky_buf_ptr[3] = hex_to_u32 (&wpky_pos[24]); + wpky_buf_ptr[4] = hex_to_u32 (&wpky_pos[32]); + wpky_buf_ptr[5] = hex_to_u32 (&wpky_pos[40]); + wpky_buf_ptr[6] = hex_to_u32 (&wpky_pos[48]); + wpky_buf_ptr[7] = hex_to_u32 (&wpky_pos[56]); + wpky_buf_ptr[8] = hex_to_u32 (&wpky_pos[64]); + wpky_buf_ptr[9] = hex_to_u32 (&wpky_pos[72]); wpky_buf_ptr[0] = byte_swap_32 (wpky_buf_ptr[0]); wpky_buf_ptr[1] = byte_swap_32 (wpky_buf_ptr[1]); @@ -270,11 +270,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 *dpsl_buf_ptr = (u32 *) itunes_backup->dpsl; - dpsl_buf_ptr[0] = hex_to_u32 ((const u8 *) &dpsl_pos[ 0]); - dpsl_buf_ptr[1] = hex_to_u32 ((const u8 *) &dpsl_pos[ 8]); - dpsl_buf_ptr[2] = hex_to_u32 ((const u8 *) &dpsl_pos[16]); - dpsl_buf_ptr[3] = hex_to_u32 ((const u8 *) &dpsl_pos[24]); - dpsl_buf_ptr[4] = hex_to_u32 ((const u8 *) &dpsl_pos[32]); + dpsl_buf_ptr[0] = hex_to_u32 (&dpsl_pos[ 0]); + dpsl_buf_ptr[1] = hex_to_u32 (&dpsl_pos[ 8]); + dpsl_buf_ptr[2] = hex_to_u32 (&dpsl_pos[16]); + dpsl_buf_ptr[3] = hex_to_u32 (&dpsl_pos[24]); + dpsl_buf_ptr[4] = hex_to_u32 (&dpsl_pos[32]); dpsl_buf_ptr[0] = byte_swap_32 (dpsl_buf_ptr[ 0]); dpsl_buf_ptr[1] = byte_swap_32 (dpsl_buf_ptr[ 1]); diff --git a/src/modules/module_14900.c b/src/modules/module_14900.c index 2bedb5553..62499126f 100644 --- a/src/modules/module_14900.c +++ b/src/modules/module_14900.c @@ -89,7 +89,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *hash_pos = token.buf[0]; - digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]); + digest[0] = hex_to_u32 (&hash_pos[0]); digest[1] = 0; digest[2] = 0; digest[3] = 0; @@ -99,7 +99,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *salt_pos = token.buf[1]; const int salt_len = token.len[1]; - salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]); + salt->salt_buf[0] = hex_to_u32 (&salt_pos[0]); salt->salt_len = salt_len / 2; // 4 diff --git a/src/modules/module_15300.c b/src/modules/module_15300.c index 8f1782dee..701e5d695 100644 --- a/src/modules/module_15300.c +++ b/src/modules/module_15300.c @@ -52,7 +52,7 @@ typedef struct dpapimk u32 SID_offset; /* here only for possible - forward compatibiliy + forward compatibility */ // u8 cipher_algo[16]; // u8 hash_algo[16]; @@ -215,7 +215,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (u32 i = 0; i < dpapimk->contents_len / 8; i++) { - dpapimk->contents[i] = hex_to_u32 ((const u8 *) &contents_pos[i * 8]); + dpapimk->contents[i] = hex_to_u32 (&contents_pos[i * 8]); dpapimk->contents[i] = byte_swap_32 (dpapimk->contents[i]); } @@ -246,10 +246,10 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // iv - dpapimk->iv[0] = hex_to_u32 ((const u8 *) &iv_pos[ 0]); - dpapimk->iv[1] = hex_to_u32 ((const u8 *) &iv_pos[ 8]); - dpapimk->iv[2] = hex_to_u32 ((const u8 *) &iv_pos[16]); - dpapimk->iv[3] = hex_to_u32 ((const u8 *) &iv_pos[24]); + dpapimk->iv[0] = hex_to_u32 (&iv_pos[ 0]); + dpapimk->iv[1] = hex_to_u32 (&iv_pos[ 8]); + dpapimk->iv[2] = hex_to_u32 (&iv_pos[16]); + dpapimk->iv[3] = hex_to_u32 (&iv_pos[24]); dpapimk->iv[0] = byte_swap_32 (dpapimk->iv[0]); dpapimk->iv[1] = byte_swap_32 (dpapimk->iv[1]); @@ -292,9 +292,9 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8* SID_tmp; - u32 *ptr_SID = (u32 *) dpapimk->SID; - u32 *ptr_iv = (u32 *) dpapimk->iv; - u32 *ptr_contents = (u32 *) dpapimk->contents; + const u32 *ptr_SID = (const u32 *) dpapimk->SID; + const u32 *ptr_iv = (const u32 *) dpapimk->iv; + const u32 *ptr_contents = (const u32 *) dpapimk->contents; u32 u32_iv[4]; diff --git a/src/modules/module_15310.c b/src/modules/module_15310.c index 51128f356..b10b93792 100644 --- a/src/modules/module_15310.c +++ b/src/modules/module_15310.c @@ -55,7 +55,7 @@ typedef struct dpapimk u32 SID_offset; /* here only for possible - forward compatibiliy + forward compatibility */ // u8 cipher_algo[16]; // u8 hash_algo[16]; @@ -231,7 +231,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (u32 i = 0; i < dpapimk->contents_len / 8; i++) { - dpapimk->contents[i] = hex_to_u32 ((const u8 *) &contents_pos[i * 8]); + dpapimk->contents[i] = hex_to_u32 (&contents_pos[i * 8]); dpapimk->contents[i] = byte_swap_32 (dpapimk->contents[i]); } @@ -258,10 +258,10 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // iv - dpapimk->iv[0] = hex_to_u32 ((const u8 *) &iv_pos[ 0]); - dpapimk->iv[1] = hex_to_u32 ((const u8 *) &iv_pos[ 8]); - dpapimk->iv[2] = hex_to_u32 ((const u8 *) &iv_pos[16]); - dpapimk->iv[3] = hex_to_u32 ((const u8 *) &iv_pos[24]); + dpapimk->iv[0] = hex_to_u32 (&iv_pos[ 0]); + dpapimk->iv[1] = hex_to_u32 (&iv_pos[ 8]); + dpapimk->iv[2] = hex_to_u32 (&iv_pos[16]); + dpapimk->iv[3] = hex_to_u32 (&iv_pos[24]); dpapimk->iv[0] = byte_swap_32 (dpapimk->iv[0]); dpapimk->iv[1] = byte_swap_32 (dpapimk->iv[1]); @@ -304,9 +304,9 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 SID[512] = { 0 }; u8 *SID_tmp = NULL; - u32 *ptr_SID = (u32 *) dpapimk->SID; - u32 *ptr_iv = (u32 *) dpapimk->iv; - u32 *ptr_contents = (u32 *) dpapimk->contents; + const u32 *ptr_SID = (const u32 *) dpapimk->SID; + const u32 *ptr_iv = (const u32 *) dpapimk->iv; + const u32 *ptr_contents = (const u32 *) dpapimk->contents; u32 u32_iv[4]; u8 iv[32 + 1]; diff --git a/src/modules/module_15400.c b/src/modules/module_15400.c index a42b7ba67..ffcbc1b5a 100644 --- a/src/modules/module_15400.c +++ b/src/modules/module_15400.c @@ -145,22 +145,22 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *position_marker = token.buf[1]; - chacha20->position[0] = hex_to_u32 ((const u8 *) position_marker + 0); - chacha20->position[1] = hex_to_u32 ((const u8 *) position_marker + 8); + chacha20->position[0] = hex_to_u32 (position_marker + 0); + chacha20->position[1] = hex_to_u32 (position_marker + 8); // iv const u8 *iv_marker = token.buf[3]; - chacha20->iv[0] = hex_to_u32 ((const u8 *) iv_marker + 8); - chacha20->iv[1] = hex_to_u32 ((const u8 *) iv_marker + 0); + chacha20->iv[0] = hex_to_u32 (iv_marker + 8); + chacha20->iv[1] = hex_to_u32 (iv_marker + 0); // plain const u8 *plain_marker = token.buf[4]; - chacha20->plain[0] = hex_to_u32 ((const u8 *) plain_marker + 0); - chacha20->plain[1] = hex_to_u32 ((const u8 *) plain_marker + 8); + chacha20->plain[0] = hex_to_u32 (plain_marker + 0); + chacha20->plain[1] = hex_to_u32 (plain_marker + 8); /* some fake salt for the sorting mechanisms */ @@ -178,8 +178,8 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *cipher_marker = token.buf[5]; - digest[0] = hex_to_u32 ((const u8 *) cipher_marker + 8); - digest[1] = hex_to_u32 ((const u8 *) cipher_marker + 0); + digest[0] = hex_to_u32 (cipher_marker + 8); + digest[1] = hex_to_u32 (cipher_marker + 0); return (PARSER_OK); } diff --git a/src/modules/module_15500.c b/src/modules/module_15500.c index 2d190f1dd..b87390fb7 100644 --- a/src/modules/module_15500.c +++ b/src/modules/module_15500.c @@ -140,21 +140,21 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *checksum_pos = token.buf[1]; - jks_sha1->checksum[0] = hex_to_u32 ((const u8 *) &checksum_pos[ 0]); - jks_sha1->checksum[1] = hex_to_u32 ((const u8 *) &checksum_pos[ 8]); - jks_sha1->checksum[2] = hex_to_u32 ((const u8 *) &checksum_pos[16]); - jks_sha1->checksum[3] = hex_to_u32 ((const u8 *) &checksum_pos[24]); - jks_sha1->checksum[4] = hex_to_u32 ((const u8 *) &checksum_pos[32]); + jks_sha1->checksum[0] = hex_to_u32 (&checksum_pos[ 0]); + jks_sha1->checksum[1] = hex_to_u32 (&checksum_pos[ 8]); + jks_sha1->checksum[2] = hex_to_u32 (&checksum_pos[16]); + jks_sha1->checksum[3] = hex_to_u32 (&checksum_pos[24]); + jks_sha1->checksum[4] = hex_to_u32 (&checksum_pos[32]); // iv const u8 *iv_pos = token.buf[2]; - jks_sha1->iv[0] = hex_to_u32 ((const u8 *) &iv_pos[ 0]); - jks_sha1->iv[1] = hex_to_u32 ((const u8 *) &iv_pos[ 8]); - jks_sha1->iv[2] = hex_to_u32 ((const u8 *) &iv_pos[16]); - jks_sha1->iv[3] = hex_to_u32 ((const u8 *) &iv_pos[24]); - jks_sha1->iv[4] = hex_to_u32 ((const u8 *) &iv_pos[32]); + jks_sha1->iv[0] = hex_to_u32 (&iv_pos[ 0]); + jks_sha1->iv[1] = hex_to_u32 (&iv_pos[ 8]); + jks_sha1->iv[2] = hex_to_u32 (&iv_pos[16]); + jks_sha1->iv[3] = hex_to_u32 (&iv_pos[24]); + jks_sha1->iv[4] = hex_to_u32 (&iv_pos[32]); // enc_key @@ -165,7 +165,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (int i = 0, j = 0; j < enc_key_len; i += 1, j += 2) { - enc_key_buf[i] = hex_to_u8 ((const u8 *) &enc_key_pos[j]); + enc_key_buf[i] = hex_to_u8 (&enc_key_pos[j]); jks_sha1->enc_key_len++; } @@ -176,7 +176,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 *der = (u8 *) jks_sha1->der; - der[0] = hex_to_u8 ((const u8 *) &der1_pos[0]); + der[0] = hex_to_u8 (&der1_pos[0]); // der2 @@ -184,7 +184,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (int i = 6, j = 0; j < 28; i += 1, j += 2) { - der[i] = hex_to_u8 ((const u8 *) &der2_pos[j]); + der[i] = hex_to_u8 (&der2_pos[j]); } der[1] = 0; @@ -224,18 +224,18 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE char enc_key[16384 + 1] = { 0 }; - u8 *ptr = (u8 *) jks_sha1->enc_key_buf; + const u8 *ptr = (const u8 *) jks_sha1->enc_key_buf; for (u32 i = 0, j = 0; i < jks_sha1->enc_key_len; i += 1, j += 2) { - sprintf (enc_key + j, "%02X", ptr[i]); + snprintf (enc_key + j, 3, "%02X", ptr[i]); } - u8 *der = (u8 *) jks_sha1->der; + const u8 *der = (const u8 *) jks_sha1->der; char alias[65] = { 0 }; - memcpy (alias, (char *) jks_sha1->alias, 64); + memcpy (alias, (const char *) jks_sha1->alias, 64); const int line_len = snprintf (line_buf, line_size, "%s*%08X%08X%08X%08X%08X*%08X%08X%08X%08X%08X*%s*%02X*%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X*%s", SIGNATURE_JKS_SHA1, diff --git a/src/modules/module_15600.c b/src/modules/module_15600.c index a9605061f..c06af7f29 100644 --- a/src/modules/module_15600.c +++ b/src/modules/module_15600.c @@ -198,27 +198,27 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *ciphertext_pos = token.buf[3]; - ethereum_pbkdf2->ciphertext[0] = hex_to_u32 ((const u8 *) &ciphertext_pos[ 0]); - ethereum_pbkdf2->ciphertext[1] = hex_to_u32 ((const u8 *) &ciphertext_pos[ 8]); - ethereum_pbkdf2->ciphertext[2] = hex_to_u32 ((const u8 *) &ciphertext_pos[16]); - ethereum_pbkdf2->ciphertext[3] = hex_to_u32 ((const u8 *) &ciphertext_pos[24]); - ethereum_pbkdf2->ciphertext[4] = hex_to_u32 ((const u8 *) &ciphertext_pos[32]); - ethereum_pbkdf2->ciphertext[5] = hex_to_u32 ((const u8 *) &ciphertext_pos[40]); - ethereum_pbkdf2->ciphertext[6] = hex_to_u32 ((const u8 *) &ciphertext_pos[48]); - ethereum_pbkdf2->ciphertext[7] = hex_to_u32 ((const u8 *) &ciphertext_pos[56]); + ethereum_pbkdf2->ciphertext[0] = hex_to_u32 (&ciphertext_pos[ 0]); + ethereum_pbkdf2->ciphertext[1] = hex_to_u32 (&ciphertext_pos[ 8]); + ethereum_pbkdf2->ciphertext[2] = hex_to_u32 (&ciphertext_pos[16]); + ethereum_pbkdf2->ciphertext[3] = hex_to_u32 (&ciphertext_pos[24]); + ethereum_pbkdf2->ciphertext[4] = hex_to_u32 (&ciphertext_pos[32]); + ethereum_pbkdf2->ciphertext[5] = hex_to_u32 (&ciphertext_pos[40]); + ethereum_pbkdf2->ciphertext[6] = hex_to_u32 (&ciphertext_pos[48]); + ethereum_pbkdf2->ciphertext[7] = hex_to_u32 (&ciphertext_pos[56]); // hash const u8 *hash_pos = token.buf[4]; - digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); - digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); - digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); - digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); - digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]); - digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]); - digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]); - digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]); + digest[0] = hex_to_u32 (&hash_pos[ 0]); + digest[1] = hex_to_u32 (&hash_pos[ 8]); + digest[2] = hex_to_u32 (&hash_pos[16]); + digest[3] = hex_to_u32 (&hash_pos[24]); + digest[4] = hex_to_u32 (&hash_pos[32]); + digest[5] = hex_to_u32 (&hash_pos[40]); + digest[6] = hex_to_u32 (&hash_pos[48]); + digest[7] = hex_to_u32 (&hash_pos[56]); return (PARSER_OK); } diff --git a/src/modules/module_15700.c b/src/modules/module_15700.c index baf0c72c1..6b8550095 100644 --- a/src/modules/module_15700.c +++ b/src/modules/module_15700.c @@ -377,27 +377,27 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *ciphertext_pos = token.buf[5]; - ethereum_scrypt->ciphertext[0] = hex_to_u32 ((const u8 *) &ciphertext_pos[ 0]); - ethereum_scrypt->ciphertext[1] = hex_to_u32 ((const u8 *) &ciphertext_pos[ 8]); - ethereum_scrypt->ciphertext[2] = hex_to_u32 ((const u8 *) &ciphertext_pos[16]); - ethereum_scrypt->ciphertext[3] = hex_to_u32 ((const u8 *) &ciphertext_pos[24]); - ethereum_scrypt->ciphertext[4] = hex_to_u32 ((const u8 *) &ciphertext_pos[32]); - ethereum_scrypt->ciphertext[5] = hex_to_u32 ((const u8 *) &ciphertext_pos[40]); - ethereum_scrypt->ciphertext[6] = hex_to_u32 ((const u8 *) &ciphertext_pos[48]); - ethereum_scrypt->ciphertext[7] = hex_to_u32 ((const u8 *) &ciphertext_pos[56]); + ethereum_scrypt->ciphertext[0] = hex_to_u32 (&ciphertext_pos[ 0]); + ethereum_scrypt->ciphertext[1] = hex_to_u32 (&ciphertext_pos[ 8]); + ethereum_scrypt->ciphertext[2] = hex_to_u32 (&ciphertext_pos[16]); + ethereum_scrypt->ciphertext[3] = hex_to_u32 (&ciphertext_pos[24]); + ethereum_scrypt->ciphertext[4] = hex_to_u32 (&ciphertext_pos[32]); + ethereum_scrypt->ciphertext[5] = hex_to_u32 (&ciphertext_pos[40]); + ethereum_scrypt->ciphertext[6] = hex_to_u32 (&ciphertext_pos[48]); + ethereum_scrypt->ciphertext[7] = hex_to_u32 (&ciphertext_pos[56]); // hash const u8 *hash_pos = token.buf[6]; - digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); - digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); - digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); - digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); - digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]); - digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]); - digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]); - digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]); + digest[0] = hex_to_u32 (&hash_pos[ 0]); + digest[1] = hex_to_u32 (&hash_pos[ 8]); + digest[2] = hex_to_u32 (&hash_pos[16]); + digest[3] = hex_to_u32 (&hash_pos[24]); + digest[4] = hex_to_u32 (&hash_pos[32]); + digest[5] = hex_to_u32 (&hash_pos[40]); + digest[6] = hex_to_u32 (&hash_pos[48]); + digest[7] = hex_to_u32 (&hash_pos[56]); return (PARSER_OK); } @@ -412,7 +412,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE tmp_salt[salt_len] = 0; - ethereum_scrypt_t *ethereum_scrypt = (ethereum_scrypt_t *) esalt_buf; + const ethereum_scrypt_t *ethereum_scrypt = (const ethereum_scrypt_t *) esalt_buf; const int line_len = snprintf (line_buf, line_size, "%s*%u*%u*%u*%s*%08x%08x%08x%08x%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x%08x%08x", SIGNATURE_ETHEREUM_SCRYPT, diff --git a/src/modules/module_15900.c b/src/modules/module_15900.c index f8c15a99d..d3d2df0b7 100644 --- a/src/modules/module_15900.c +++ b/src/modules/module_15900.c @@ -53,7 +53,7 @@ typedef struct dpapimk u32 SID_offset; /* here only for possible - forward compatibiliy + forward compatibility */ // u8 cipher_algo[16]; // u8 hash_algo[16]; @@ -228,7 +228,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (u32 i = 0; i < dpapimk->contents_len / 8; i++) { - dpapimk->contents[i] = hex_to_u32 ((const u8 *) &contents_pos[i * 8]); + dpapimk->contents[i] = hex_to_u32 (&contents_pos[i * 8]); dpapimk->contents[i] = byte_swap_32 (dpapimk->contents[i]); } @@ -259,10 +259,10 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // iv - dpapimk->iv[0] = hex_to_u32 ((const u8 *) &iv_pos[ 0]); - dpapimk->iv[1] = hex_to_u32 ((const u8 *) &iv_pos[ 8]); - dpapimk->iv[2] = hex_to_u32 ((const u8 *) &iv_pos[16]); - dpapimk->iv[3] = hex_to_u32 ((const u8 *) &iv_pos[24]); + dpapimk->iv[0] = hex_to_u32 (&iv_pos[ 0]); + dpapimk->iv[1] = hex_to_u32 (&iv_pos[ 8]); + dpapimk->iv[2] = hex_to_u32 (&iv_pos[16]); + dpapimk->iv[3] = hex_to_u32 (&iv_pos[24]); dpapimk->iv[0] = byte_swap_32 (dpapimk->iv[0]); dpapimk->iv[1] = byte_swap_32 (dpapimk->iv[1]); @@ -304,9 +304,9 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 SID[512] = { 0 }; u8* SID_tmp; - u32 *ptr_SID = (u32 *) dpapimk->SID; - u32 *ptr_iv = (u32 *) dpapimk->iv; - u32 *ptr_contents = (u32 *) dpapimk->contents; + const u32 *ptr_SID = (const u32 *) dpapimk->SID; + const u32 *ptr_iv = (const u32 *) dpapimk->iv; + const u32 *ptr_contents = (const u32 *) dpapimk->contents; u32 u32_iv[4]; u8 iv[32 + 1]; diff --git a/src/modules/module_15910.c b/src/modules/module_15910.c index 9a1c59be9..8ca85a5fd 100644 --- a/src/modules/module_15910.c +++ b/src/modules/module_15910.c @@ -56,7 +56,7 @@ typedef struct dpapimk u32 SID_offset; /* here only for possible - forward compatibiliy + forward compatibility */ // u8 cipher_algo[16]; // u8 hash_algo[16]; @@ -237,7 +237,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (u32 i = 0; i < dpapimk->contents_len / 8; i++) { - dpapimk->contents[i] = hex_to_u32 ((const u8 *) &contents_pos[i * 8]); + dpapimk->contents[i] = hex_to_u32 (&contents_pos[i * 8]); dpapimk->contents[i] = byte_swap_32 (dpapimk->contents[i]); } @@ -264,10 +264,10 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // iv - dpapimk->iv[0] = hex_to_u32 ((const u8 *) &iv_pos[ 0]); - dpapimk->iv[1] = hex_to_u32 ((const u8 *) &iv_pos[ 8]); - dpapimk->iv[2] = hex_to_u32 ((const u8 *) &iv_pos[16]); - dpapimk->iv[3] = hex_to_u32 ((const u8 *) &iv_pos[24]); + dpapimk->iv[0] = hex_to_u32 (&iv_pos[ 0]); + dpapimk->iv[1] = hex_to_u32 (&iv_pos[ 8]); + dpapimk->iv[2] = hex_to_u32 (&iv_pos[16]); + dpapimk->iv[3] = hex_to_u32 (&iv_pos[24]); dpapimk->iv[0] = byte_swap_32 (dpapimk->iv[0]); dpapimk->iv[1] = byte_swap_32 (dpapimk->iv[1]); @@ -310,9 +310,9 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 SID[512] = { 0 }; u8 *SID_tmp = NULL; - u32 *ptr_SID = (u32 *) dpapimk->SID; - u32 *ptr_iv = (u32 *) dpapimk->iv; - u32 *ptr_contents = (u32 *) dpapimk->contents; + const u32 *ptr_SID = (const u32 *) dpapimk->SID; + const u32 *ptr_iv = (const u32 *) dpapimk->iv; + const u32 *ptr_contents = (const u32 *) dpapimk->contents; u32 u32_iv[4]; u8 iv[32 + 1]; diff --git a/src/modules/module_16100.c b/src/modules/module_16100.c index edcf33e8b..57b0d5a33 100644 --- a/src/modules/module_16100.c +++ b/src/modules/module_16100.c @@ -109,10 +109,10 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 *session_ptr = (u8 *) tacacs_plus->session_buf; - session_ptr[0] = hex_to_u8 ((const u8 *) session_pos + 0); - session_ptr[1] = hex_to_u8 ((const u8 *) session_pos + 2); - session_ptr[2] = hex_to_u8 ((const u8 *) session_pos + 4); - session_ptr[3] = hex_to_u8 ((const u8 *) session_pos + 6); + session_ptr[0] = hex_to_u8 (session_pos + 0); + session_ptr[1] = hex_to_u8 (session_pos + 2); + session_ptr[2] = hex_to_u8 (session_pos + 4); + session_ptr[3] = hex_to_u8 (session_pos + 6); // ct_buf @@ -123,7 +123,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (int i = 0, j = 0; j < ct_buf_len; i += 1, j += 2) { - ct_data_ptr[i] = hex_to_u8 ((const u8 *) &ct_buf_pos[j]); + ct_data_ptr[i] = hex_to_u8 (&ct_buf_pos[j]); tacacs_plus->ct_data_len++; } @@ -134,8 +134,8 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 *sequence_ptr = (u8 *) tacacs_plus->sequence_buf; - sequence_ptr[0] = hex_to_u8 ((const u8 *) sequence_pos + 0); - sequence_ptr[1] = hex_to_u8 ((const u8 *) sequence_pos + 2); + sequence_ptr[0] = hex_to_u8 (sequence_pos + 0); + sequence_ptr[1] = hex_to_u8 (sequence_pos + 2); // fake salt @@ -166,7 +166,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (u32 i = 0, j = 0; i < tacacs_plus->ct_data_len; i += 1, j += 2) { - sprintf (ct_data + j, "%02x", ct_data_ptr[i]); + snprintf (ct_data + j, 3, "%02x", ct_data_ptr[i]); } const u8 *session_ptr = (const u8 *) tacacs_plus->session_buf; diff --git a/src/modules/module_16200.c b/src/modules/module_16200.c index 36e14358e..f3d65d007 100644 --- a/src/modules/module_16200.c +++ b/src/modules/module_16200.c @@ -178,10 +178,10 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *ZCRYPTOSALT_pos = token.buf[3]; - apple_secure_notes->ZCRYPTOSALT[ 0] = hex_to_u32 ((const u8 *) &ZCRYPTOSALT_pos[ 0]); - apple_secure_notes->ZCRYPTOSALT[ 1] = hex_to_u32 ((const u8 *) &ZCRYPTOSALT_pos[ 8]); - apple_secure_notes->ZCRYPTOSALT[ 2] = hex_to_u32 ((const u8 *) &ZCRYPTOSALT_pos[16]); - apple_secure_notes->ZCRYPTOSALT[ 3] = hex_to_u32 ((const u8 *) &ZCRYPTOSALT_pos[24]); + apple_secure_notes->ZCRYPTOSALT[ 0] = hex_to_u32 (&ZCRYPTOSALT_pos[ 0]); + apple_secure_notes->ZCRYPTOSALT[ 1] = hex_to_u32 (&ZCRYPTOSALT_pos[ 8]); + apple_secure_notes->ZCRYPTOSALT[ 2] = hex_to_u32 (&ZCRYPTOSALT_pos[16]); + apple_secure_notes->ZCRYPTOSALT[ 3] = hex_to_u32 (&ZCRYPTOSALT_pos[24]); apple_secure_notes->ZCRYPTOSALT[ 4] = 0; apple_secure_notes->ZCRYPTOSALT[ 5] = 0; apple_secure_notes->ZCRYPTOSALT[ 6] = 0; @@ -199,12 +199,12 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *ZCRYPTOWRAPPEDKEY_pos = token.buf[4]; - apple_secure_notes->ZCRYPTOWRAPPEDKEY[0] = hex_to_u32 ((const u8 *) &ZCRYPTOWRAPPEDKEY_pos[ 0]); - apple_secure_notes->ZCRYPTOWRAPPEDKEY[1] = hex_to_u32 ((const u8 *) &ZCRYPTOWRAPPEDKEY_pos[ 8]); - apple_secure_notes->ZCRYPTOWRAPPEDKEY[2] = hex_to_u32 ((const u8 *) &ZCRYPTOWRAPPEDKEY_pos[16]); - apple_secure_notes->ZCRYPTOWRAPPEDKEY[3] = hex_to_u32 ((const u8 *) &ZCRYPTOWRAPPEDKEY_pos[24]); - apple_secure_notes->ZCRYPTOWRAPPEDKEY[4] = hex_to_u32 ((const u8 *) &ZCRYPTOWRAPPEDKEY_pos[32]); - apple_secure_notes->ZCRYPTOWRAPPEDKEY[5] = hex_to_u32 ((const u8 *) &ZCRYPTOWRAPPEDKEY_pos[40]); + apple_secure_notes->ZCRYPTOWRAPPEDKEY[0] = hex_to_u32 (&ZCRYPTOWRAPPEDKEY_pos[ 0]); + apple_secure_notes->ZCRYPTOWRAPPEDKEY[1] = hex_to_u32 (&ZCRYPTOWRAPPEDKEY_pos[ 8]); + apple_secure_notes->ZCRYPTOWRAPPEDKEY[2] = hex_to_u32 (&ZCRYPTOWRAPPEDKEY_pos[16]); + apple_secure_notes->ZCRYPTOWRAPPEDKEY[3] = hex_to_u32 (&ZCRYPTOWRAPPEDKEY_pos[24]); + apple_secure_notes->ZCRYPTOWRAPPEDKEY[4] = hex_to_u32 (&ZCRYPTOWRAPPEDKEY_pos[32]); + apple_secure_notes->ZCRYPTOWRAPPEDKEY[5] = hex_to_u32 (&ZCRYPTOWRAPPEDKEY_pos[40]); // fake salt diff --git a/src/modules/module_16300.c b/src/modules/module_16300.c index 1efe11c73..9c2fa883d 100644 --- a/src/modules/module_16300.c +++ b/src/modules/module_16300.c @@ -165,10 +165,10 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *encseed_pos = token.buf[1]; const int encseed_len = token.len[1]; - ethereum_presale->iv[0] = hex_to_u32 ((const u8 *) &encseed_pos[ 0]); - ethereum_presale->iv[1] = hex_to_u32 ((const u8 *) &encseed_pos[ 8]); - ethereum_presale->iv[2] = hex_to_u32 ((const u8 *) &encseed_pos[16]); - ethereum_presale->iv[3] = hex_to_u32 ((const u8 *) &encseed_pos[24]); + ethereum_presale->iv[0] = hex_to_u32 (&encseed_pos[ 0]); + ethereum_presale->iv[1] = hex_to_u32 (&encseed_pos[ 8]); + ethereum_presale->iv[2] = hex_to_u32 (&encseed_pos[16]); + ethereum_presale->iv[3] = hex_to_u32 (&encseed_pos[24]); ethereum_presale->iv[0] = byte_swap_32 (ethereum_presale->iv[0]); ethereum_presale->iv[1] = byte_swap_32 (ethereum_presale->iv[1]); @@ -179,7 +179,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (int i = 32, j = 0; i < encseed_len; i += 8, j++) { - esalt_buf_ptr[j] = hex_to_u32 ((const u8 *) &encseed_pos[i]); + esalt_buf_ptr[j] = hex_to_u32 (&encseed_pos[i]); esalt_buf_ptr[j] = byte_swap_32 (esalt_buf_ptr[j]); } @@ -201,10 +201,10 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *bkp_pos = token.buf[3]; - digest[0] = hex_to_u32 ((const u8 *) &bkp_pos[ 0]); - digest[1] = hex_to_u32 ((const u8 *) &bkp_pos[ 8]); - digest[2] = hex_to_u32 ((const u8 *) &bkp_pos[16]); - digest[3] = hex_to_u32 ((const u8 *) &bkp_pos[24]); + digest[0] = hex_to_u32 (&bkp_pos[ 0]); + digest[1] = hex_to_u32 (&bkp_pos[ 8]); + digest[2] = hex_to_u32 (&bkp_pos[16]); + digest[3] = hex_to_u32 (&bkp_pos[24]); return (PARSER_OK); } diff --git a/src/modules/module_16400.c b/src/modules/module_16400.c index 009d82ad2..eecd9fe3d 100644 --- a/src/modules/module_16400.c +++ b/src/modules/module_16400.c @@ -91,10 +91,10 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *hash_pos = (const u8 *) line_buf + 10; - digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); - digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); - digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); - digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); + digest[0] = hex_to_u32 (&hash_pos[ 0]); + digest[1] = hex_to_u32 (&hash_pos[ 8]); + digest[2] = hex_to_u32 (&hash_pos[16]); + digest[3] = hex_to_u32 (&hash_pos[24]); if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) { diff --git a/src/modules/module_16500.c b/src/modules/module_16500.c index d4add2cf9..cea9e0a24 100644 --- a/src/modules/module_16500.c +++ b/src/modules/module_16500.c @@ -327,7 +327,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE ptr_plain[86] = 0; } - const int line_len = snprintf (line_buf, line_size, "%s.%s", (char *) jwt->salt_buf, (char *) ptr_plain); + const int line_len = snprintf (line_buf, line_size, "%s.%s", (const char *) jwt->salt_buf, (const char *) ptr_plain); return line_len; } diff --git a/src/modules/module_16600.c b/src/modules/module_16600.c index 0571028f7..47ed037d7 100644 --- a/src/modules/module_16600.c +++ b/src/modules/module_16600.c @@ -121,19 +121,19 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *iv_pos = token.buf[2]; - electrum_wallet->iv[0] = hex_to_u32 ((const u8 *) &iv_pos[ 0]); - electrum_wallet->iv[1] = hex_to_u32 ((const u8 *) &iv_pos[ 8]); - electrum_wallet->iv[2] = hex_to_u32 ((const u8 *) &iv_pos[16]); - electrum_wallet->iv[3] = hex_to_u32 ((const u8 *) &iv_pos[24]); + electrum_wallet->iv[0] = hex_to_u32 (&iv_pos[ 0]); + electrum_wallet->iv[1] = hex_to_u32 (&iv_pos[ 8]); + electrum_wallet->iv[2] = hex_to_u32 (&iv_pos[16]); + electrum_wallet->iv[3] = hex_to_u32 (&iv_pos[24]); // encrypted const u8 *encrypted_pos = token.buf[3]; - electrum_wallet->encrypted[0] = hex_to_u32 ((const u8 *) &encrypted_pos[ 0]); - electrum_wallet->encrypted[1] = hex_to_u32 ((const u8 *) &encrypted_pos[ 8]); - electrum_wallet->encrypted[2] = hex_to_u32 ((const u8 *) &encrypted_pos[16]); - electrum_wallet->encrypted[3] = hex_to_u32 ((const u8 *) &encrypted_pos[24]); + electrum_wallet->encrypted[0] = hex_to_u32 (&encrypted_pos[ 0]); + electrum_wallet->encrypted[1] = hex_to_u32 (&encrypted_pos[ 8]); + electrum_wallet->encrypted[2] = hex_to_u32 (&encrypted_pos[16]); + electrum_wallet->encrypted[3] = hex_to_u32 (&encrypted_pos[24]); // salt fake diff --git a/src/modules/module_16700.c b/src/modules/module_16700.c index 50314c20d..3066b8f0b 100644 --- a/src/modules/module_16700.c +++ b/src/modules/module_16700.c @@ -142,10 +142,10 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *ZCRYPTOSALT_pos = token.buf[3]; - apple_secure_notes->ZCRYPTOSALT[ 0] = hex_to_u32 ((const u8 *) &ZCRYPTOSALT_pos[ 0]); - apple_secure_notes->ZCRYPTOSALT[ 1] = hex_to_u32 ((const u8 *) &ZCRYPTOSALT_pos[ 8]); - apple_secure_notes->ZCRYPTOSALT[ 2] = hex_to_u32 ((const u8 *) &ZCRYPTOSALT_pos[16]); - apple_secure_notes->ZCRYPTOSALT[ 3] = hex_to_u32 ((const u8 *) &ZCRYPTOSALT_pos[24]); + apple_secure_notes->ZCRYPTOSALT[ 0] = hex_to_u32 (&ZCRYPTOSALT_pos[ 0]); + apple_secure_notes->ZCRYPTOSALT[ 1] = hex_to_u32 (&ZCRYPTOSALT_pos[ 8]); + apple_secure_notes->ZCRYPTOSALT[ 2] = hex_to_u32 (&ZCRYPTOSALT_pos[16]); + apple_secure_notes->ZCRYPTOSALT[ 3] = hex_to_u32 (&ZCRYPTOSALT_pos[24]); apple_secure_notes->ZCRYPTOSALT[ 4] = 0; apple_secure_notes->ZCRYPTOSALT[ 5] = 0; apple_secure_notes->ZCRYPTOSALT[ 6] = 0; @@ -171,12 +171,12 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *ZCRYPTOWRAPPEDKEY_pos = token.buf[5]; - apple_secure_notes->ZCRYPTOWRAPPEDKEY[0] = hex_to_u32 ((const u8 *) &ZCRYPTOWRAPPEDKEY_pos[ 0]); - apple_secure_notes->ZCRYPTOWRAPPEDKEY[1] = hex_to_u32 ((const u8 *) &ZCRYPTOWRAPPEDKEY_pos[ 8]); - apple_secure_notes->ZCRYPTOWRAPPEDKEY[2] = hex_to_u32 ((const u8 *) &ZCRYPTOWRAPPEDKEY_pos[16]); - apple_secure_notes->ZCRYPTOWRAPPEDKEY[3] = hex_to_u32 ((const u8 *) &ZCRYPTOWRAPPEDKEY_pos[24]); - apple_secure_notes->ZCRYPTOWRAPPEDKEY[4] = hex_to_u32 ((const u8 *) &ZCRYPTOWRAPPEDKEY_pos[32]); - apple_secure_notes->ZCRYPTOWRAPPEDKEY[5] = hex_to_u32 ((const u8 *) &ZCRYPTOWRAPPEDKEY_pos[40]); + apple_secure_notes->ZCRYPTOWRAPPEDKEY[0] = hex_to_u32 (&ZCRYPTOWRAPPEDKEY_pos[ 0]); + apple_secure_notes->ZCRYPTOWRAPPEDKEY[1] = hex_to_u32 (&ZCRYPTOWRAPPEDKEY_pos[ 8]); + apple_secure_notes->ZCRYPTOWRAPPEDKEY[2] = hex_to_u32 (&ZCRYPTOWRAPPEDKEY_pos[16]); + apple_secure_notes->ZCRYPTOWRAPPEDKEY[3] = hex_to_u32 (&ZCRYPTOWRAPPEDKEY_pos[24]); + apple_secure_notes->ZCRYPTOWRAPPEDKEY[4] = hex_to_u32 (&ZCRYPTOWRAPPEDKEY_pos[32]); + apple_secure_notes->ZCRYPTOWRAPPEDKEY[5] = hex_to_u32 (&ZCRYPTOWRAPPEDKEY_pos[40]); // fake salt diff --git a/src/modules/module_16800.c b/src/modules/module_16800.c index f01ac61ee..9022b4cfb 100644 --- a/src/modules/module_16800.c +++ b/src/modules/module_16800.c @@ -269,8 +269,6 @@ bool module_potfile_custom_check (MAYBE_UNUSED const hashconfig_t *hashconfig, M kernel_param.digests_offset_host = 0; kernel_param.combs_mode = 0; kernel_param.salt_repeat = 0; - kernel_param.combs_mode = 0; - kernel_param.salt_repeat = 0; kernel_param.pws_pos = 0; kernel_param.gid_max = 1; diff --git a/src/modules/module_16801.c b/src/modules/module_16801.c index 43886ed82..183677ace 100644 --- a/src/modules/module_16801.c +++ b/src/modules/module_16801.c @@ -291,8 +291,6 @@ bool module_potfile_custom_check (MAYBE_UNUSED const hashconfig_t *hashconfig, M kernel_param.digests_offset_host = 0; kernel_param.combs_mode = 0; kernel_param.salt_repeat = 0; - kernel_param.combs_mode = 0; - kernel_param.salt_repeat = 0; kernel_param.pws_pos = 0; kernel_param.gid_max = 1; diff --git a/src/modules/module_16900.c b/src/modules/module_16900.c index 213b5940e..3fd5a3d40 100644 --- a/src/modules/module_16900.c +++ b/src/modules/module_16900.c @@ -214,7 +214,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (int i = 0, j = 0; j < ct_buf_len; i += 1, j += 2) { - ct_data_ptr[i] = hex_to_u8 ((const u8 *) &ct_buf_pos[j]); + ct_data_ptr[i] = hex_to_u8 (&ct_buf_pos[j]); ansible_vault->ct_data_len++; } @@ -223,14 +223,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *hash_pos = token.buf[5]; - digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); - digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); - digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); - digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); - digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]); - digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]); - digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]); - digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]); + digest[0] = hex_to_u32 (&hash_pos[ 0]); + digest[1] = hex_to_u32 (&hash_pos[ 8]); + digest[2] = hex_to_u32 (&hash_pos[16]); + digest[3] = hex_to_u32 (&hash_pos[24]); + digest[4] = hex_to_u32 (&hash_pos[32]); + digest[5] = hex_to_u32 (&hash_pos[40]); + digest[6] = hex_to_u32 (&hash_pos[48]); + digest[7] = hex_to_u32 (&hash_pos[56]); digest[0] = byte_swap_32 (digest[0]); digest[1] = byte_swap_32 (digest[1]); diff --git a/src/modules/module_17010.c b/src/modules/module_17010.c index 865a6f8eb..c5b4280b0 100644 --- a/src/modules/module_17010.c +++ b/src/modules/module_17010.c @@ -242,7 +242,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const int enc_data_size = hc_strtoul ((const char *) token.buf[2], NULL, 10); - const int encrypted_data_size = hex_decode ((const u8 *) token.buf[4], token.len[4], (u8 *) gpg->encrypted_data); + const int encrypted_data_size = hex_decode (token.buf[4], token.len[4], (u8 *) gpg->encrypted_data); if (enc_data_size != encrypted_data_size) return (PARSER_CT_LENGTH); @@ -266,7 +266,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE if (hc_strtoul ((const char *) token.buf[9], NULL, 10) != sizeof (gpg->iv)) return (PARSER_IV_LENGTH); - const int iv_size = hex_decode ((const u8 *) token.buf[10], token.len[10], (u8 *) gpg->iv); + const int iv_size = hex_decode (token.buf[10], token.len[10], (u8 *) gpg->iv); if (iv_size != sizeof (gpg->iv)) return (PARSER_IV_LENGTH); @@ -282,7 +282,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE salt->salt_repeats = gpg->cipher_algo == 7 ? 0 : 1; // "minus one" - salt->salt_len = hex_decode ((const u8 *) token.buf[12], token.len[12], (u8 *) salt->salt_buf); + salt->salt_len = hex_decode (token.buf[12], token.len[12], (u8 *) salt->salt_buf); if (salt->salt_len != 8) return (PARSER_SALT_LENGTH); diff --git a/src/modules/module_17020.c b/src/modules/module_17020.c index c4c9c7bef..a877ab82d 100644 --- a/src/modules/module_17020.c +++ b/src/modules/module_17020.c @@ -246,7 +246,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const int enc_data_size = hc_strtoul ((const char *) token.buf[2], NULL, 10); - const int encrypted_data_size = hex_decode ((const u8 *) token.buf[4], token.len[4], (u8 *) gpg->encrypted_data); + const int encrypted_data_size = hex_decode (token.buf[4], token.len[4], (u8 *) gpg->encrypted_data); if (enc_data_size != encrypted_data_size) return (PARSER_CT_LENGTH); @@ -270,7 +270,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE if (hc_strtoul ((const char *) token.buf[9], NULL, 10) != sizeof (gpg->iv)) return (PARSER_IV_LENGTH); - const int iv_size = hex_decode ((const u8 *) token.buf[10], token.len[10], (u8 *) gpg->iv); + const int iv_size = hex_decode (token.buf[10], token.len[10], (u8 *) gpg->iv); if (iv_size != sizeof (gpg->iv)) return (PARSER_IV_LENGTH); @@ -284,7 +284,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // Salt Value - salt->salt_len = hex_decode ((const u8 *) token.buf[12], token.len[12], (u8 *) salt->salt_buf); + salt->salt_len = hex_decode (token.buf[12], token.len[12], (u8 *) salt->salt_buf); if (salt->salt_len != 8) return (PARSER_SALT_LENGTH); diff --git a/src/modules/module_17030.c b/src/modules/module_17030.c index 05867755c..52fa74c92 100644 --- a/src/modules/module_17030.c +++ b/src/modules/module_17030.c @@ -242,7 +242,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const int enc_data_size = hc_strtoul ((const char *) token.buf[2], NULL, 10); - const int encrypted_data_size = hex_decode ((const u8 *) token.buf[4], token.len[4], (u8 *) gpg->encrypted_data); + const int encrypted_data_size = hex_decode (token.buf[4], token.len[4], (u8 *) gpg->encrypted_data); if (enc_data_size != encrypted_data_size) return (PARSER_CT_LENGTH); @@ -266,7 +266,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE if (hc_strtoul ((const char *) token.buf[9], NULL, 10) != sizeof (gpg->iv)) return (PARSER_IV_LENGTH); - const int iv_size = hex_decode ((const u8 *) token.buf[10], token.len[10], (u8 *) gpg->iv); + const int iv_size = hex_decode (token.buf[10], token.len[10], (u8 *) gpg->iv); if (iv_size != sizeof (gpg->iv)) return (PARSER_IV_LENGTH); @@ -280,7 +280,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // Salt Value - salt->salt_len = hex_decode ((const u8 *) token.buf[12], token.len[12], (u8 *) salt->salt_buf); + salt->salt_len = hex_decode (token.buf[12], token.len[12], (u8 *) salt->salt_buf); if (salt->salt_len != 8) return (PARSER_SALT_LENGTH); diff --git a/src/modules/module_17040.c b/src/modules/module_17040.c new file mode 100644 index 000000000..dd3661136 --- /dev/null +++ b/src/modules/module_17040.c @@ -0,0 +1,435 @@ +/** + * Author......: Netherlands Forensic Institute + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 1; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 3; +static const u32 DGST_SIZE = DGST_SIZE_4_4; +static const u32 HASH_CATEGORY = HASH_CATEGORY_PRIVATE_KEY; +static const char *HASH_NAME = "GPG (CAST5 (SHA-1($pass)))"; +static const u64 KERN_TYPE = 17040; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_LOOP_PREPARE + | OPTS_TYPE_AUX1 + | OPTS_TYPE_DEEP_COMP_KERNEL; +static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const char *ST_PASS = "Hashcat1!"; +static const char *ST_HASH = "$gpg$*1*1308*4096*ddf02802e2d06319bcf5962745b73677ecfa229649fed991e3360bdf2fffe71f521b8f877bccfcdce9a4fb4aeb63bd21fed6e37f96f193a6f7d3c476f4a7e01e7421d0eba5bfcd59544e37887572cd40e8d03e901574ec0f3afdff35ad3f25cb818ddadee84ddfef636207febd8d12d8a98983c86afa46608d178dba5ec51e98a182bd9687b6431fba87b5a16b5e0cf872db7dc12c55bfe7faaa443044d5a84ddf034198e5bc6b4b707b5f4a4c5999ff3885975113fca02693620f36f8f20570bdaf581726053b6c982cb988a3091dc206624f9d36372b151b22c7dc2cb71b9aaed95dc5630c4c4b045f80c403836cc9c84951fc04b8d6e413e1d4f6b3815508f43cf80c25c7db3882b5b6572f1395a00dcda7fe65ce2155f9ea2cfe13588e0fb10316e7dd978e1d89cffc06a5e722ec765315926d2ee9060d8f449ead31cbacea88a5251be3b518d23984530da9f930114e614b7ed30f748c7512bddca8604bb5310ed76b9982eb88acaf49a29325e9db6987c6dea3878e2cb7daf3800177579ddcaafeacdba8edd147fae61bae36ab83a98db69a6c92017b3db8cff68985db989a03ee1bd045e6a577151486cdaeaf26517027b2f140b8493e2f401ea222511c2ce61c7057d64e8c3568e3f547f4b2875db59bc8c4f3346e0faf54e30745f583494b59e570bacb2b9eb71eb834e57f68aadda9af4bdb03276f71770c611aad0278033bb8c108471c4f4a2aa9070774367b9334661daf8a5e3eaf3d8dcca723d64ae7264c8709987a6cee9f42287b6e20d1d753262ff74886f3995412e59d09c61e4c637b6e97e6a3b08f9fa6adf9a1ec44a0372e893febd6712decc00bbd9cdacaf6bb9302fe8bd2ca27fdf5156c33582d56781ab0e5bd14da4b1edd73edd8f2a034a56d1a6f836724b605657f4714d59d522805e0ab02c6c5daed0973f93120ae01623ce0a96fbdf4402ce20ebb4f97fabbc90da5bb12aac3cd5f15c1add2d3863be59e843dca564ce9aa25b43ca1044b1e7e65d03d1f55f77d2a39cd85536ff38058837a23743c4e252f7de5654a562506b55d2b8fa29c7f4ecd307a8ae686cbb73fea6a8f72775d9e417ec346415024263a9f339dda286b682ccc8f93f7d4f59921620dd276188441fd44fc63925d18caa30a75c79c37a2ea45d14f6e423d2146281f9c6699a0658e50d69cfbc174090a0420bbb6f4e6b5b1f2b81b26f035aaf5c2e558c812496cb494587c78bf75350fb1a36e8c88076b4684094e0cba5dcdc4f672dbd2b432306b75077ae07b8fd88ba5b829eaed3fd2959a09b162329b75ac8fc20d4eea6e5971f54b31a23952dd4c111765822182cd60ee0de3cce3752c648918e3ec4c52643223132dcc885140faf8108230ebf4ef4149cbfa3070c91ec013404c15c1cecaa1efd544ab8313d378ef0e77c615b76b8ec07769960873ce9c7bdb1d75e7faef4c8a0b015c95a4e2bcd9ff7f5dfddd9a243fc0688db09e534ef1f3ebebd0c73b75bd57b8e02667da5744b1400dc695d4ae1e255d3487d1dead115de7d48962a15c7aecb97444173c40c028a46a7cfdd8cc7421f71d757cb809341c5148aedeab16f9289bc55b7475d646ae4993ab36fe5609a05121d140d4390289c94e4d87fd902fe03c8bfa13e7cfc9c21355ab6461d214137e4d90dff4a8f599020f12d7560fa4b5aaee1727f21c873fde76415b65357ecb923a547ddcdb20dde0880a287ed26d5ea4ce45514b907e368527c62e39ffdf2efeb817cd59694d23bafd48862e723f45e3c258cff3c804c5d2f17e24be8fe81a00f11f519beb9cde7be95226ac2a7f11e0f4f09dc040c11e1bf63172aa0f8a*1*254*2*3*8*0000000000000000*0*a11df265e4e54bee"; + + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +typedef struct gpg +{ + u32 cipher_algo; + u32 iv[4]; // TODO make this dynamic based on the input hash.. iv_size can be 8 bytes or 16 bytes + u32 modulus_size; + u32 encrypted_data[384]; + u32 encrypted_data_size; + +} gpg_t; + +typedef struct gpg_tmp +{ + u32 salted_pw_block[80]; + + u32 salted_pw_block_len; + + u32 h[10]; + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + u32 len; + +} gpg_tmp_t; + +static const char *SIGNATURE_GPG = "$gpg$"; + +u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 esalt_size = (const u64) sizeof (gpg_t); + + return esalt_size; +} + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = (const u64) sizeof (gpg_tmp_t); + + return tmp_size; +} + +bool module_hlfmt_disable (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const bool hlfmt_disable = true; + + return hlfmt_disable; +} + +u32 module_kernel_loops_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 kernel_loops_min = 1024; + + return kernel_loops_min; +} + +u32 module_kernel_loops_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 kernel_loops_max = 65536; + + return kernel_loops_max; +} + +u32 module_deep_comp_kernel (MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const u32 salt_pos, MAYBE_UNUSED const u32 digest_pos) +{ + const u32 digests_offset = hashes->salts_buf[salt_pos].digests_offset; + + gpg_t *gpgs = (gpg_t *) hashes->esalts_buf; + + gpg_t *gpg = &gpgs[digests_offset + digest_pos]; + + if (gpg->cipher_algo == 3) // CAST5 + { + return KERN_RUN_AUX1; + } + return 0; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + gpg_t *gpg = (gpg_t *) esalt_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 13; + + // signature $gpg$ + token.signatures_cnt = 1; + token.signatures_buf[0] = SIGNATURE_GPG; + + // signature $gpg$ + token.sep[0] = '*'; + token.len[0] = 5; + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_SIGNATURE; + + // "1" -- unknown option + token.sep[1] = '*'; + token.len[1] = 1; + token.attr[1] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_DIGIT; + + // size of the encrypted data in bytes + token.sep[2] = '*'; + token.len_min[2] = 3; + token.len_max[2] = 4; + token.attr[2] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_DIGIT; + + // size of the key: 1024, 2048, 4096, etc. + token.sep[3] = '*'; + token.len_min[3] = 3; + token.len_max[3] = 4; + token.attr[3] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_DIGIT; + + // encrypted key -- twice the amount of byte because its interpreted as characters + token.sep[4] = '*'; + token.len_min[4] = 256; + token.len_max[4] = 3072; + token.attr[4] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + // "3" - String2Key parameter "S2K Type" https://www.rfc-editor.org/rfc/rfc4880#section-3.7 + // https://security.stackexchange.com/questions/142914/does-s2k-hold-any-use-in-symmetric-encryption-with-gnupg "OpenPGP uses the string-to-key function for both encrypting the private key with a passphrase and symmetric encryption. The function is used to derive a session key (cipher block) for symmetric encryption." + // https://github.com/gpg/gnupg/blob/ab35d756d86438db124fa68aa633fe528ff8be50/g10/packet.h#L98 + // https://www.rfc-editor.org/rfc/rfc4880#section-3.7 so we only have a salted s2k not an iterated-and-salted + // ID S2K Type + // -- -------- + // 0 Simple S2K + // 1 Salted S2K + // 2 Reserved value + // 3 Iterated and Salted S2K + token.sep[5] = '*'; + token.len[5] = 1; + token.attr[5] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_DIGIT; + + // "254" - String2Key parameter "usage" / "Secret-Key Packet Format" https://github.com/openwall/john/blob/bleeding-jumbo/src/gpg2john.c#L2424 + // 255 or 254 + // indicates that a string-to-key specifier is being given. Any + // other value is a symmetric-key encryption algorithm identifier. + + // If the string-to-key usage octet was + // 254, then a 20-octet SHA-1 hash of the plaintext of the + // algorithm-specific portion. + token.sep[6] = '*'; + token.len[6] = 3; + token.attr[6] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_DIGIT; + + // "2" - String2Key parameter "HASH_ALGS" https://github.com/openwall/john/blob/bleeding-jumbo/src/gpg2john.c#L646 + // sha1 in this case + token.sep[7] = '*'; + token.len[7] = 1; + token.attr[7] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_DIGIT; + + // "3" cipher mode: String2Key parameter "SYM_ALGS" https://github.com/openwall/john/blob/bleeding-jumbo/src/gpg2john.c#L558 + // cast in this case + token.sep[8] = '*'; + token.len[8] = 1; + token.attr[8] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_DIGIT; + + // size of initial vector in bytes: 8 or 16 + token.sep[9] = '*'; + token.len_min[9] = 1; + token.len_max[9] = 2; + token.attr[9] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_DIGIT; + + // initial vector - twice the amount of bytes because its interpreted as characters + token.sep[10] = '*'; + token.len_min[10] = 16; + token.len_max[10] = 32; + token.attr[10] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + // iteration count + token.sep[11] = '*'; + token.len_min[11] = 1; + token.len_max[11] = 8; + token.attr[11] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_DIGIT; + + // salt - 8 bytes / 16 characters + token.len[12] = 16; + token.attr[12] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + // Modulus size + + const int modulus_size = hc_strtoul ((const char *) token.buf[3], NULL, 10); + + if ((modulus_size < 256) || (modulus_size > 16384)) return (PARSER_SALT_LENGTH); + + gpg->modulus_size = modulus_size; + + // Encrypted data + + const int enc_data_size = hc_strtoul ((const char *) token.buf[2], NULL, 10); + + const int encrypted_data_size = hex_decode (token.buf[4], token.len[4], (u8 *) gpg->encrypted_data); + + if (enc_data_size != encrypted_data_size) return (PARSER_CT_LENGTH); + + gpg->encrypted_data_size = encrypted_data_size; + + // Check String2Key parameters + + if ((hc_strtoul ((const char *) token.buf[5], NULL, 10) != 1) && (hc_strtoul ((const char *) token.buf[5], NULL, 10) != 3)) { + return (PARSER_HASH_VALUE); // for us this "String2Key parameter 1" is 1 instead of 3, no idea what that means.. + } + + // 100 to 110 Private/Experimental S2K + if (hc_strtoul ((const char *) token.buf[6], NULL, 10) != 254) return (PARSER_HASH_VALUE); + if (hc_strtoul ((const char *) token.buf[7], NULL, 10) != 2) return (PARSER_HASH_VALUE); + + // Cipher algo + const int cipher_algo = hc_strtoul ((const char *) token.buf[8], NULL, 10); + + if (cipher_algo != 3) return (PARSER_CIPHER); + + gpg->cipher_algo = cipher_algo; + + // IV (size) + + // if (hc_strtoul ((const char *) token.buf[9], NULL, 10) != sizeof (gpg->iv)) { + // // printf("hc_strtoul ((const char *) token.buf[9]=%d\n", (const char *) token.buf[9], NULL, 10); + // // printf("sizeof (gpg->iv)=%d\n", sizeof (gpg->iv)); + // return (PARSER_IV_LENGTH); + // } + // const int iv_size = hex_decode ((const u8 *) token.buf[10], token.len[10], (u8 *) gpg->iv); + + // if (iv_size != sizeof (gpg->iv)){ + // return (PARSER_IV_LENGTH); + // } + + + // Salt Iter + + const u32 salt_iter = hc_strtoul ((const char *) token.buf[11], NULL, 10); + + if (salt_iter != 0) return (PARSER_HASH_VALUE); // only accept 0 for now + if(salt_iter ==0){ salt->salt_iter = 8; } // just once should work? TODO not sure why I cannot change this to zero / remove the salt_iter completely.. + // else { + // if (salt_iter < 8 || salt_iter > 65011712){ return (PARSER_SALT_ITERATION); } + // else { + // salt->salt_iter = salt_iter; + // } + // } + + + // Salt Value + + salt->salt_repeats = gpg->cipher_algo == 7 ? 0 : 1; // "minus one" // TODO check this? + + salt->salt_len = hex_decode (token.buf[12], token.len[12], (u8 *) salt->salt_buf); + + if (salt->salt_len != 8) return (PARSER_SALT_LENGTH); + + // hash fake + digest[0] = gpg->iv[0]; + digest[1] = gpg->iv[1]; + digest[2] = gpg->iv[2]; + digest[3] = gpg->iv[3]; + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const gpg_t *gpg = (const gpg_t *) esalt_buf; + + u8 encrypted_data[(384 * 8) + 1]; + memset(encrypted_data,0,384*8+1); // always initialize to zero + + hex_encode ((const u8 *) gpg->encrypted_data, gpg->encrypted_data_size, (u8 *) encrypted_data); + + const int line_len = snprintf (line_buf, line_size, "%s*%d*%d*%d*%s*%d*%d*%d*%d*%d*%08x%08x*%d*%08x%08x", + SIGNATURE_GPG, + 1, /* unknown field */ + gpg->encrypted_data_size, + gpg->modulus_size, + encrypted_data, + 1, /* version (major?) */ + 254, /* version (minor?) */ + 2, /* key cipher (sha-1) */ + gpg->cipher_algo, + 8, /*iv_size*/ + byte_swap_32 (gpg->iv[0]), + byte_swap_32 (gpg->iv[1]), + 0, /* salt_iter is always zero */ + byte_swap_32 (salt->salt_buf[0]), + byte_swap_32 (salt->salt_buf[1])); + + return line_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = module_esalt_size; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = module_hlfmt_disable; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = module_kernel_loops_max; + module_ctx->module_kernel_loops_min = module_kernel_loops_min; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_18100.c b/src/modules/module_18100.c index d7b1f62a9..37a8ef2e7 100644 --- a/src/modules/module_18100.c +++ b/src/modules/module_18100.c @@ -83,7 +83,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); // now we need to reduce our hash into a token - int otp_code = hc_strtoul ((const char *) line_buf, NULL, 10); + int otp_code = hc_strtoul (line_buf, NULL, 10); digest[0] = otp_code; diff --git a/src/modules/module_18200.c b/src/modules/module_18200.c index 05ac3885d..b99d4978d 100644 --- a/src/modules/module_18200.c +++ b/src/modules/module_18200.c @@ -142,8 +142,8 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE krb5asrep->format = 2; } - char *account_info_start = (char *) line_buf + strlen (SIGNATURE_KRB5ASREP) + parse_off; - char *account_info_stop = strchr ((const char *) account_info_start, ':'); + const char *account_info_start = line_buf + strlen (SIGNATURE_KRB5ASREP) + parse_off; + char *account_info_stop = strchr (account_info_start, ':'); if (account_info_stop == NULL) return (PARSER_SEPARATOR_UNMATCHED); @@ -281,9 +281,9 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (u32 i = 0, j = 0; i < krb5asrep->edata2_len; i += 1, j += 2) { - u8 *ptr_edata2 = (u8 *) krb5asrep->edata2; + const u8 *ptr_edata2 = (const u8 *) krb5asrep->edata2; - sprintf (data + j, "%02x", ptr_edata2[i]); + snprintf (data + j, 3, "%02x", ptr_edata2[i]); } int line_len = 0; @@ -292,7 +292,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { line_len = snprintf (line_buf, line_size, "%s23$%s:%08x%08x%08x%08x$%s", SIGNATURE_KRB5ASREP, - (char *) krb5asrep->account_info, + (const char *) krb5asrep->account_info, byte_swap_32 (krb5asrep->checksum[0]), byte_swap_32 (krb5asrep->checksum[1]), byte_swap_32 (krb5asrep->checksum[2]), @@ -303,7 +303,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { line_len = snprintf (line_buf, line_size, "%s%s:%08x%08x%08x%08x$%s", SIGNATURE_KRB5ASREP, - (char *) krb5asrep->account_info, + (const char *) krb5asrep->account_info, byte_swap_32 (krb5asrep->checksum[0]), byte_swap_32 (krb5asrep->checksum[1]), byte_swap_32 (krb5asrep->checksum[2]), diff --git a/src/modules/module_18300.c b/src/modules/module_18300.c index 6a3750718..adc98432a 100644 --- a/src/modules/module_18300.c +++ b/src/modules/module_18300.c @@ -173,10 +173,10 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *ZCRYPTOSALT_pos = token.buf[3]; - apple_secure_notes->ZCRYPTOSALT[ 0] = hex_to_u32 ((const u8 *) &ZCRYPTOSALT_pos[ 0]); - apple_secure_notes->ZCRYPTOSALT[ 1] = hex_to_u32 ((const u8 *) &ZCRYPTOSALT_pos[ 8]); - apple_secure_notes->ZCRYPTOSALT[ 2] = hex_to_u32 ((const u8 *) &ZCRYPTOSALT_pos[16]); - apple_secure_notes->ZCRYPTOSALT[ 3] = hex_to_u32 ((const u8 *) &ZCRYPTOSALT_pos[24]); + apple_secure_notes->ZCRYPTOSALT[ 0] = hex_to_u32 (&ZCRYPTOSALT_pos[ 0]); + apple_secure_notes->ZCRYPTOSALT[ 1] = hex_to_u32 (&ZCRYPTOSALT_pos[ 8]); + apple_secure_notes->ZCRYPTOSALT[ 2] = hex_to_u32 (&ZCRYPTOSALT_pos[16]); + apple_secure_notes->ZCRYPTOSALT[ 3] = hex_to_u32 (&ZCRYPTOSALT_pos[24]); apple_secure_notes->ZCRYPTOSALT[ 4] = 0; apple_secure_notes->ZCRYPTOSALT[ 5] = 0; apple_secure_notes->ZCRYPTOSALT[ 6] = 0; @@ -202,16 +202,16 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *ZCRYPTOWRAPPEDKEY_pos = token.buf[5]; - apple_secure_notes->ZCRYPTOWRAPPEDKEY[0] = hex_to_u32 ((const u8 *) &ZCRYPTOWRAPPEDKEY_pos[ 0]); - apple_secure_notes->ZCRYPTOWRAPPEDKEY[1] = hex_to_u32 ((const u8 *) &ZCRYPTOWRAPPEDKEY_pos[ 8]); - apple_secure_notes->ZCRYPTOWRAPPEDKEY[2] = hex_to_u32 ((const u8 *) &ZCRYPTOWRAPPEDKEY_pos[16]); - apple_secure_notes->ZCRYPTOWRAPPEDKEY[3] = hex_to_u32 ((const u8 *) &ZCRYPTOWRAPPEDKEY_pos[24]); - apple_secure_notes->ZCRYPTOWRAPPEDKEY[4] = hex_to_u32 ((const u8 *) &ZCRYPTOWRAPPEDKEY_pos[32]); - apple_secure_notes->ZCRYPTOWRAPPEDKEY[5] = hex_to_u32 ((const u8 *) &ZCRYPTOWRAPPEDKEY_pos[40]); - apple_secure_notes->ZCRYPTOWRAPPEDKEY[6] = hex_to_u32 ((const u8 *) &ZCRYPTOWRAPPEDKEY_pos[48]); - apple_secure_notes->ZCRYPTOWRAPPEDKEY[7] = hex_to_u32 ((const u8 *) &ZCRYPTOWRAPPEDKEY_pos[56]); - apple_secure_notes->ZCRYPTOWRAPPEDKEY[8] = hex_to_u32 ((const u8 *) &ZCRYPTOWRAPPEDKEY_pos[64]); - apple_secure_notes->ZCRYPTOWRAPPEDKEY[9] = hex_to_u32 ((const u8 *) &ZCRYPTOWRAPPEDKEY_pos[72]); + apple_secure_notes->ZCRYPTOWRAPPEDKEY[0] = hex_to_u32 (&ZCRYPTOWRAPPEDKEY_pos[ 0]); + apple_secure_notes->ZCRYPTOWRAPPEDKEY[1] = hex_to_u32 (&ZCRYPTOWRAPPEDKEY_pos[ 8]); + apple_secure_notes->ZCRYPTOWRAPPEDKEY[2] = hex_to_u32 (&ZCRYPTOWRAPPEDKEY_pos[16]); + apple_secure_notes->ZCRYPTOWRAPPEDKEY[3] = hex_to_u32 (&ZCRYPTOWRAPPEDKEY_pos[24]); + apple_secure_notes->ZCRYPTOWRAPPEDKEY[4] = hex_to_u32 (&ZCRYPTOWRAPPEDKEY_pos[32]); + apple_secure_notes->ZCRYPTOWRAPPEDKEY[5] = hex_to_u32 (&ZCRYPTOWRAPPEDKEY_pos[40]); + apple_secure_notes->ZCRYPTOWRAPPEDKEY[6] = hex_to_u32 (&ZCRYPTOWRAPPEDKEY_pos[48]); + apple_secure_notes->ZCRYPTOWRAPPEDKEY[7] = hex_to_u32 (&ZCRYPTOWRAPPEDKEY_pos[56]); + apple_secure_notes->ZCRYPTOWRAPPEDKEY[8] = hex_to_u32 (&ZCRYPTOWRAPPEDKEY_pos[64]); + apple_secure_notes->ZCRYPTOWRAPPEDKEY[9] = hex_to_u32 (&ZCRYPTOWRAPPEDKEY_pos[72]); // fake salt @@ -236,7 +236,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - apple_secure_notes_t *apple_secure_notes = (apple_secure_notes_t *) esalt_buf; + const apple_secure_notes_t *apple_secure_notes = (const apple_secure_notes_t *) esalt_buf; const int out_len = snprintf (line_buf, line_size, "%s%u$16$%08x%08x%08x%08x$%u$%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x", SIGNATURE_APFS, diff --git a/src/modules/module_18900.c b/src/modules/module_18900.c index 2141796f2..0d07400f8 100644 --- a/src/modules/module_18900.c +++ b/src/modules/module_18900.c @@ -185,28 +185,28 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (int i = 0, j = 0; j < 128; i += 1, j += 8) { - android_backup->user_salt[i] = hex_to_u32 ((const u8 *) user_salt_pos + j); + android_backup->user_salt[i] = hex_to_u32 (user_salt_pos + j); } // ck_salt for (int i = 0, j = 0; j < 128; i += 1, j += 8) { - android_backup->ck_salt[i] = hex_to_u32 ((const u8 *) ck_salt_pos + j); + android_backup->ck_salt[i] = hex_to_u32 (ck_salt_pos + j); } // user_iv for (int i = 0, j = 0; j < 32; i += 1, j += 8) { - android_backup->user_iv[i] = hex_to_u32 ((const u8 *) user_iv_pos + j); + android_backup->user_iv[i] = hex_to_u32 (user_iv_pos + j); } // masterkey_blob for (int i = 0, j = 0; j < 192; i += 1, j += 8) { - android_backup->masterkey_blob[i] = hex_to_u32 ((const u8 *) masterkey_blob_pos + j); + android_backup->masterkey_blob[i] = hex_to_u32 (masterkey_blob_pos + j); } // make the entry unique in our databases diff --git a/src/modules/module_19000.c b/src/modules/module_19000.c index 7179bac0c..286635726 100644 --- a/src/modules/module_19000.c +++ b/src/modules/module_19000.c @@ -115,7 +115,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE iter = hc_strtoul ((const char *) token.buf[1] + 2, NULL, 10); } - // iter++; the additinal round is added in the init kernel + // iter++; the additional round is added in the init kernel salt->salt_iter = iter; @@ -123,10 +123,10 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE if (token.len[2] != 32) return (PARSER_HASH_LENGTH); - digest[0] = hex_to_u32 ((const u8 *) token.buf[2] + 0); - digest[1] = hex_to_u32 ((const u8 *) token.buf[2] + 8); - digest[2] = hex_to_u32 ((const u8 *) token.buf[2] + 16); - digest[3] = hex_to_u32 ((const u8 *) token.buf[2] + 24); + digest[0] = hex_to_u32 (token.buf[2] + 0); + digest[1] = hex_to_u32 (token.buf[2] + 8); + digest[2] = hex_to_u32 (token.buf[2] + 16); + digest[3] = hex_to_u32 (token.buf[2] + 24); // salt diff --git a/src/modules/module_19100.c b/src/modules/module_19100.c index af94f1c9b..50b89ecec 100644 --- a/src/modules/module_19100.c +++ b/src/modules/module_19100.c @@ -107,7 +107,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE iter = hc_strtoul ((const char *) token.buf[1] + 2, NULL, 10); } - // iter++; the additinal round is added in the init kernel + // iter++; the additional round is added in the init kernel salt->salt_iter = iter; @@ -115,14 +115,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE if (token.len[2] != 64) return (PARSER_HASH_LENGTH); - digest[0] = hex_to_u32 ((const u8 *) token.buf[2] + 0); - digest[1] = hex_to_u32 ((const u8 *) token.buf[2] + 8); - digest[2] = hex_to_u32 ((const u8 *) token.buf[2] + 16); - digest[3] = hex_to_u32 ((const u8 *) token.buf[2] + 24); - digest[4] = hex_to_u32 ((const u8 *) token.buf[2] + 32); - digest[5] = hex_to_u32 ((const u8 *) token.buf[2] + 40); - digest[6] = hex_to_u32 ((const u8 *) token.buf[2] + 48); - digest[7] = hex_to_u32 ((const u8 *) token.buf[2] + 56); + digest[0] = hex_to_u32 (token.buf[2] + 0); + digest[1] = hex_to_u32 (token.buf[2] + 8); + digest[2] = hex_to_u32 (token.buf[2] + 16); + digest[3] = hex_to_u32 (token.buf[2] + 24); + digest[4] = hex_to_u32 (token.buf[2] + 32); + digest[5] = hex_to_u32 (token.buf[2] + 40); + digest[6] = hex_to_u32 (token.buf[2] + 48); + digest[7] = hex_to_u32 (token.buf[2] + 56); // salt diff --git a/src/modules/module_19200.c b/src/modules/module_19200.c index 9def88b03..9e4467b40 100644 --- a/src/modules/module_19200.c +++ b/src/modules/module_19200.c @@ -110,7 +110,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE iter = hc_strtoul ((const char *) token.buf[1] + 2, NULL, 10); } - // iter++; the additinal round is added in the init kernel + // iter++; the additional round is added in the init kernel salt->salt_iter = iter; @@ -118,14 +118,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE if (token.len[2] != 128) return (PARSER_HASH_LENGTH); - digest[0] = hex_to_u64 ((const u8 *) token.buf[2] + 0); - digest[1] = hex_to_u64 ((const u8 *) token.buf[2] + 16); - digest[2] = hex_to_u64 ((const u8 *) token.buf[2] + 32); - digest[3] = hex_to_u64 ((const u8 *) token.buf[2] + 48); - digest[4] = hex_to_u64 ((const u8 *) token.buf[2] + 64); - digest[5] = hex_to_u64 ((const u8 *) token.buf[2] + 80); - digest[6] = hex_to_u64 ((const u8 *) token.buf[2] + 96); - digest[7] = hex_to_u64 ((const u8 *) token.buf[2] + 112); + digest[0] = hex_to_u64 (token.buf[2] + 0); + digest[1] = hex_to_u64 (token.buf[2] + 16); + digest[2] = hex_to_u64 (token.buf[2] + 32); + digest[3] = hex_to_u64 (token.buf[2] + 48); + digest[4] = hex_to_u64 (token.buf[2] + 64); + digest[5] = hex_to_u64 (token.buf[2] + 80); + digest[6] = hex_to_u64 (token.buf[2] + 96); + digest[7] = hex_to_u64 (token.buf[2] + 112); // salt diff --git a/src/modules/module_19210.c b/src/modules/module_19210.c new file mode 100644 index 000000000..b014c60cb --- /dev/null +++ b/src/modules/module_19210.c @@ -0,0 +1,304 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" +#include "emu_inc_hash_sha512.h" +#include "memory.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 1; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 3; +static const u32 DGST_SIZE = DGST_SIZE_8_16; +static const u32 HASH_CATEGORY = HASH_CATEGORY_OS; +static const char *HASH_NAME = "QNX 7 /etc/shadow (SHA512)"; +static const u64 KERN_TYPE = 7100; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_USES_BITS_64 + | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_ST_BASE64; +static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "@S@vm2nBGHes6QkXra0f74XmouSiRzjYD3r/0py+txv0Kr8A4hCPMGFHoZqr41JFiYcJPPOeIheqFseMyLyw/15Pw==@NDY2MDEwNjk3YjBjYzM2MzliMzc3Mzc0ZTNiMTAzNzE="; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +typedef struct pbkdf2_sha512 +{ + u32 salt_buf[64]; + +} pbkdf2_sha512_t; + +typedef struct pbkdf2_sha512_tmp +{ + u64 ipad[8]; + u64 opad[8]; + + u64 dgst[16]; + u64 out[16]; + +} pbkdf2_sha512_tmp_t; + +u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 esalt_size = (const u64) sizeof (pbkdf2_sha512_t); + + return esalt_size; +} + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = (const u64) sizeof (pbkdf2_sha512_tmp_t); + + return tmp_size; +} + +static const int ROUNDS_QNX = 4096; +static const int HASH_SIZE = 64; + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u64 *digest = (u64 *) digest_buf; + + pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) esalt_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 4; + + // @digest@hash@salt + // @digest,iterations@hash@salt + + token.sep[0] = '@'; + token.len[0] = 0; + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH; + + token.sep[1] = '@'; + token.len_min[1] = 1; + token.len_max[1] = 8; + token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH; + + token.sep[2] = '@'; + token.len_min[2] = 64; + token.len_max[2] = 100; + token.attr[2] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_BASE64A; + + token.sep[3] = '@'; + token.len_min[3] = 16; + token.len_max[3] = 60; + token.attr[3] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_BASE64A; + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + u8 tmp_buf[512]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + // check hash type + + if (token.buf[1][0] != 'S') return (PARSER_SIGNATURE_UNMATCHED); + + // check iter + + u32 iter = ROUNDS_QNX; + + if (token.len[1] > 1) + { + if (token.buf[1][1] != ',') return (PARSER_SEPARATOR_UNMATCHED); + + iter = hc_strtoul ((const char *) token.buf[1] + 2, NULL, 10); + } + + salt->salt_iter = iter - 1; // iter++; the additional round is added in the init kernel + + // salt + + const u8 *salt_pos = token.buf[3]; + const int salt_len = token.len[3]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + const int decoded_salt_len = base64_decode (base64_to_int, salt_pos, salt_len, tmp_buf); + + if (decoded_salt_len < 1) return (PARSER_SALT_LENGTH); + if (decoded_salt_len > 256) return (PARSER_SALT_LENGTH); + + memcpy (salt->salt_buf, tmp_buf, decoded_salt_len); + + salt->salt_len = decoded_salt_len; + + memcpy (pbkdf2_sha512->salt_buf, tmp_buf, decoded_salt_len); + + // hash + + const u8 *hash_pos = token.buf[2]; + const int hash_len = token.len[2]; + + const int decoded_hash_len = base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf); + + if (decoded_hash_len != HASH_SIZE) return (PARSER_SALT_LENGTH); + + memcpy (digest, tmp_buf, decoded_hash_len); + + digest[0] = byte_swap_64 (digest[0]); + digest[1] = byte_swap_64 (digest[1]); + digest[2] = byte_swap_64 (digest[2]); + digest[3] = byte_swap_64 (digest[3]); + digest[4] = byte_swap_64 (digest[4]); + digest[5] = byte_swap_64 (digest[5]); + digest[6] = byte_swap_64 (digest[6]); + digest[7] = byte_swap_64 (digest[7]); + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u64 *digest = (const u64 *) digest_buf; + + const pbkdf2_sha512_t *pbkdf2_sha512 = (const pbkdf2_sha512_t *) esalt_buf; + + // need missing example for custom iterator count + + // salt + + u8 salt_buf[512] = { 0 }; + + base64_encode (int_to_base64, (const u8 *) pbkdf2_sha512->salt_buf, (const int) salt->salt_len, salt_buf); + + // hash + + u64 hash_tmp[8]; + + hash_tmp[0] = byte_swap_64 (digest[0]); + hash_tmp[1] = byte_swap_64 (digest[1]); + hash_tmp[2] = byte_swap_64 (digest[2]); + hash_tmp[3] = byte_swap_64 (digest[3]); + hash_tmp[4] = byte_swap_64 (digest[4]); + hash_tmp[5] = byte_swap_64 (digest[5]); + hash_tmp[6] = byte_swap_64 (digest[6]); + hash_tmp[7] = byte_swap_64 (digest[7]); + + u8 hash_buf[512] = { 0 }; + + base64_encode (int_to_base64, (const u8 *) hash_tmp, (const int) 64, hash_buf); + + // out + + u8 *out_buf = (u8 *) line_buf; + + const int out_len = snprintf ((char *) out_buf, line_size, "@S@%s@%s", + hash_buf, + salt_buf); + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = module_esalt_size; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_19300.c b/src/modules/module_19300.c index 2e9bb17d9..ad1d7cefc 100644 --- a/src/modules/module_19300.c +++ b/src/modules/module_19300.c @@ -140,11 +140,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE digest[3] = byte_swap_32 (digest[3]); digest[4] = byte_swap_32 (digest[4]); - const bool parse_rc1 = generic_salt_decode (hashconfig, token.buf[1], token.len[1], (u8 *) sha1_double_salt->salt1_buf, (int *) &sha1_double_salt->salt1_len); + const bool parse_rc1 = generic_salt_decode (hashconfig, token.buf[1], token.len[1], (u8 *) sha1_double_salt->salt1_buf, &sha1_double_salt->salt1_len); if (parse_rc1 == false) return (PARSER_SALT_LENGTH); - const bool parse_rc2 = generic_salt_decode (hashconfig, token.buf[2], token.len[2], (u8 *) sha1_double_salt->salt2_buf, (int *) &sha1_double_salt->salt2_len); + const bool parse_rc2 = generic_salt_decode (hashconfig, token.buf[2], token.len[2], (u8 *) sha1_double_salt->salt2_buf, &sha1_double_salt->salt2_len); if (parse_rc2 == false) return (PARSER_SALT_LENGTH); @@ -204,13 +204,13 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE out_len += 1; - out_len += generic_salt_encode (hashconfig, (const u8 *) sha1_double_salt->salt1_buf, (const int) sha1_double_salt->salt1_len, out_buf + out_len); + out_len += generic_salt_encode (hashconfig, (const u8 *) sha1_double_salt->salt1_buf, sha1_double_salt->salt1_len, out_buf + out_len); out_buf[out_len] = hashconfig->separator; out_len += 1; - out_len += generic_salt_encode (hashconfig, (const u8 *) sha1_double_salt->salt2_buf, (const int) sha1_double_salt->salt2_len, out_buf + out_len); + out_len += generic_salt_encode (hashconfig, (const u8 *) sha1_double_salt->salt2_buf, sha1_double_salt->salt2_len, out_buf + out_len); return out_len; } diff --git a/src/modules/module_19500.c b/src/modules/module_19500.c index 3e6748efa..afaa3c7cd 100644 --- a/src/modules/module_19500.c +++ b/src/modules/module_19500.c @@ -132,11 +132,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE digest[3] = byte_swap_32 (digest[3]); digest[4] = byte_swap_32 (digest[4]); - const bool parse_rc1 = generic_salt_decode (hashconfig, token.buf[1], token.len[1], (u8 *) devise_double_salt->salt_buf, (int *) &devise_double_salt->salt_len); + const bool parse_rc1 = generic_salt_decode (hashconfig, token.buf[1], token.len[1], (u8 *) devise_double_salt->salt_buf, &devise_double_salt->salt_len); if (parse_rc1 == false) return (PARSER_SALT_LENGTH); - const bool parse_rc2 = generic_salt_decode (hashconfig, token.buf[2], token.len[2], (u8 *) devise_double_salt->site_key_buf, (int *) &devise_double_salt->site_key_len); + const bool parse_rc2 = generic_salt_decode (hashconfig, token.buf[2], token.len[2], (u8 *) devise_double_salt->site_key_buf, &devise_double_salt->site_key_len); if (parse_rc2 == false) return (PARSER_SALT_LENGTH); @@ -196,13 +196,13 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE out_len += 1; - out_len += generic_salt_encode (hashconfig, (const u8 *) devise_double_salt->salt_buf, (const int) devise_double_salt->salt_len, out_buf + out_len); + out_len += generic_salt_encode (hashconfig, (const u8 *) devise_double_salt->salt_buf, devise_double_salt->salt_len, out_buf + out_len); out_buf[out_len] = hashconfig->separator; out_len += 1; - out_len += generic_salt_encode (hashconfig, (const u8 *) devise_double_salt->site_key_buf, (const int) devise_double_salt->site_key_len, out_buf + out_len); + out_len += generic_salt_encode (hashconfig, (const u8 *) devise_double_salt->site_key_buf, devise_double_salt->site_key_len, out_buf + out_len); return out_len; } diff --git a/src/modules/module_19600.c b/src/modules/module_19600.c index cbe9a58d3..296a1dca1 100644 --- a/src/modules/module_19600.c +++ b/src/modules/module_19600.c @@ -106,7 +106,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // assume no signature found if (line_len < 12) return (PARSER_SALT_LENGTH); - char *spn_info_start = strchr ((const char *) line_buf + 12 + 1, '*'); + char *spn_info_start = strchr (line_buf + 12 + 1, '*'); int is_spn_provided = 0; @@ -265,15 +265,15 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (u32 i = 0, j = 0; i < krb5tgs->edata2_len; i += 1, j += 2) { - u8 *ptr_edata2 = (u8 *) krb5tgs->edata2; + const u8 *ptr_edata2 = (const u8 *) krb5tgs->edata2; - sprintf (data + j, "%02x", ptr_edata2[i]); + snprintf (data + j, 3, "%02x", ptr_edata2[i]); } const int line_len = snprintf (line_buf, line_size, "%s%s$%s$%08x%08x%08x$%s", SIGNATURE_KRB5TGS, - (char *) krb5tgs->user, - (char *) krb5tgs->domain, + (const char *) krb5tgs->user, + (const char *) krb5tgs->domain, krb5tgs->checksum[0], krb5tgs->checksum[1], krb5tgs->checksum[2], diff --git a/src/modules/module_19700.c b/src/modules/module_19700.c index e2f296076..8a09915b0 100644 --- a/src/modules/module_19700.c +++ b/src/modules/module_19700.c @@ -106,7 +106,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // assume no signature found if (line_len < 12) return (PARSER_SALT_LENGTH); - char *spn_info_start = strchr ((const char *) line_buf + 12 + 1, '*'); + char *spn_info_start = strchr (line_buf + 12 + 1, '*'); int is_spn_provided = 0; @@ -265,15 +265,15 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (u32 i = 0, j = 0; i < krb5tgs->edata2_len; i += 1, j += 2) { - u8 *ptr_edata2 = (u8 *) krb5tgs->edata2; + const u8 *ptr_edata2 = (const u8 *) krb5tgs->edata2; - sprintf (data + j, "%02x", ptr_edata2[i]); + snprintf (data + j, 3, "%02x", ptr_edata2[i]); } const int line_len = snprintf (line_buf, line_size, "%s%s$%s$%08x%08x%08x$%s", SIGNATURE_KRB5TGS, - (char *) krb5tgs->user, - (char *) krb5tgs->domain, + (const char *) krb5tgs->user, + (const char *) krb5tgs->domain, krb5tgs->checksum[0], krb5tgs->checksum[1], krb5tgs->checksum[2], diff --git a/src/modules/module_19800.c b/src/modules/module_19800.c index 4f28ab31a..93d746dd2 100644 --- a/src/modules/module_19800.c +++ b/src/modules/module_19800.c @@ -213,15 +213,15 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (u32 i = 0, j = 0; i < krb5pa->enc_timestamp_len; i += 1, j += 2) { - u8 *ptr_enc_timestamp = (u8 *) krb5pa->enc_timestamp; + const u8 *ptr_enc_timestamp = (const u8 *) krb5pa->enc_timestamp; - sprintf (data + j, "%02x", ptr_enc_timestamp[i]); + snprintf (data + j, 3, "%02x", ptr_enc_timestamp[i]); } const int line_len = snprintf (line_buf, line_size, "%s%s$%s$%s%08x%08x%08x", SIGNATURE_KRB5PA, - (char *) krb5pa->user, - (char *) krb5pa->domain, + (const char *) krb5pa->user, + (const char *) krb5pa->domain, data, krb5pa->checksum[0], krb5pa->checksum[1], diff --git a/src/modules/module_19900.c b/src/modules/module_19900.c index af380c9c6..facce5cca 100644 --- a/src/modules/module_19900.c +++ b/src/modules/module_19900.c @@ -213,15 +213,15 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (u32 i = 0, j = 0; i < krb5pa->enc_timestamp_len; i += 1, j += 2) { - u8 *ptr_enc_timestamp = (u8 *) krb5pa->enc_timestamp; + const u8 *ptr_enc_timestamp = (const u8 *) krb5pa->enc_timestamp; - sprintf (data + j, "%02x", ptr_enc_timestamp[i]); + snprintf (data + j, 3, "%02x", ptr_enc_timestamp[i]); } const int line_len = snprintf (line_buf, line_size, "%s%s$%s$%s%08x%08x%08x", SIGNATURE_KRB5PA, - (char *) krb5pa->user, - (char *) krb5pa->domain, + (const char *) krb5pa->user, + (const char *) krb5pa->domain, data, krb5pa->checksum[0], krb5pa->checksum[1], diff --git a/src/modules/module_20200.c b/src/modules/module_20200.c index 5be8bdc89..ff63ea7c6 100644 --- a/src/modules/module_20200.c +++ b/src/modules/module_20200.c @@ -117,14 +117,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE token.attr[2] = TOKEN_ATTR_VERIFY_LENGTH | TOKEN_ATTR_VERIFY_DIGIT; - // salt in alternate base64 repretentation + // salt in alternate base64 representation token.sep[3] = '$'; token.len_min[3] = SALT_MIN; token.len_max[3] = SALT_MAX; token.attr[3] = TOKEN_ATTR_VERIFY_LENGTH | TOKEN_ATTR_VERIFY_BASE64B; - // payload in alternate base64 representanion + // payload in alternate base64 representation token.sep[4] = '$'; token.len[4] = HASH_LEN_B64; token.attr[4] = TOKEN_ATTR_FIXED_LENGTH @@ -145,7 +145,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 tmp_buf[256] = { 0 }; - const size_t salt_len_decoded = base64_decode (ab64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf); + const size_t salt_len_decoded = base64_decode (ab64_to_int, salt_pos, salt_len, tmp_buf); u8 *salt_buf_ptr = (u8 *) pbkdf2_sha512->salt_buf; memcpy (salt_buf_ptr, tmp_buf, salt_len_decoded); @@ -158,7 +158,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *hash_pos = token.buf[4]; const int hash_len = token.len[4]; - base64_decode (ab64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf); + base64_decode (ab64_to_int, hash_pos, hash_len, tmp_buf); memcpy (digest, tmp_buf, HASH_LEN_RAW); digest[0] = byte_swap_64 (digest[0]); diff --git a/src/modules/module_20300.c b/src/modules/module_20300.c index 2ccbb5c08..2d6ac1fd6 100644 --- a/src/modules/module_20300.c +++ b/src/modules/module_20300.c @@ -116,14 +116,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE token.attr[2] = TOKEN_ATTR_VERIFY_LENGTH | TOKEN_ATTR_VERIFY_DIGIT; - // salt in alternate base64 repretentation + // salt in alternate base64 representation token.sep[3] = '$'; token.len_min[3] = SALT_MIN; token.len_max[3] = SALT_MAX; token.attr[3] = TOKEN_ATTR_VERIFY_LENGTH | TOKEN_ATTR_VERIFY_BASE64B; - // payload in alternate base64 representanion + // payload in alternate base64 representation token.sep[4] = '$'; token.len[4] = HASH_LEN_B64; token.attr[4] = TOKEN_ATTR_FIXED_LENGTH @@ -144,7 +144,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 tmp_buf[256] = { 0 }; - const size_t salt_len_decoded = base64_decode (ab64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf); + const size_t salt_len_decoded = base64_decode (ab64_to_int, salt_pos, salt_len, tmp_buf); u8 *salt_buf_ptr = (u8 *) pbkdf2_sha256->salt_buf; memcpy (salt_buf_ptr, tmp_buf, salt_len_decoded); @@ -157,7 +157,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *hash_pos = token.buf[4]; const int hash_len = token.len[4]; - base64_decode (ab64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf); + base64_decode (ab64_to_int, hash_pos, hash_len, tmp_buf); memcpy (digest, tmp_buf, HASH_LEN_RAW); digest[0] = byte_swap_32 (digest[0]); diff --git a/src/modules/module_20400.c b/src/modules/module_20400.c index 80c4f56f4..2fd8a7dcd 100644 --- a/src/modules/module_20400.c +++ b/src/modules/module_20400.c @@ -116,14 +116,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE token.attr[2] = TOKEN_ATTR_VERIFY_LENGTH | TOKEN_ATTR_VERIFY_DIGIT; - // salt in alternate base64 repretentation + // salt in alternate base64 representation token.sep[3] = '$'; token.len_min[3] = SALT_MIN; token.len_max[3] = SALT_MAX; token.attr[3] = TOKEN_ATTR_VERIFY_LENGTH | TOKEN_ATTR_VERIFY_BASE64B; - // payload in alternate base64 representanion + // payload in alternate base64 representation token.sep[4] = '$'; token.len[4] = HASH_LEN_B64; token.attr[4] = TOKEN_ATTR_FIXED_LENGTH @@ -144,7 +144,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 tmp_buf[256] = { 0 }; - const size_t salt_len_decoded = base64_decode (ab64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf); + const size_t salt_len_decoded = base64_decode (ab64_to_int, salt_pos, salt_len, tmp_buf); u8 *salt_buf_ptr = (u8 *) pbkdf2_sha1->salt_buf; memcpy (salt_buf_ptr, tmp_buf, salt_len_decoded); @@ -156,7 +156,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *hash_pos = token.buf[4]; const int hash_len = token.len[4]; - base64_decode (ab64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf); + base64_decode (ab64_to_int, hash_pos, hash_len, tmp_buf); memcpy (digest, tmp_buf, HASH_LEN_RAW); digest[0] = byte_swap_32 (digest[0]); diff --git a/src/modules/module_20510.c b/src/modules/module_20510.c index e89e8dfc2..d96f57b6e 100644 --- a/src/modules/module_20510.c +++ b/src/modules/module_20510.c @@ -128,7 +128,7 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (pkzip_extra->len == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { @@ -136,7 +136,7 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, memcpy (dst_ptr, pkzip_extra->buf, pkzip_extra->len); - return pkzip_extra->len + snprintf (dst_ptr + pkzip_extra->len, dst_sz - pkzip_extra->len, "%s", (char *) src_buf); + return pkzip_extra->len + snprintf (dst_ptr + pkzip_extra->len, dst_sz - pkzip_extra->len, "%s", (const char *) src_buf); } } diff --git a/src/modules/module_20600.c b/src/modules/module_20600.c index dc35c6081..e6a17c5af 100644 --- a/src/modules/module_20600.c +++ b/src/modules/module_20600.c @@ -177,7 +177,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE base64_encode (int_to_base64, (const u8 *) digest_buf, 32, (u8 *) ptr_plain); - const int out_len = snprintf (line_buf, line_size, "otm_sha256:%d:%s:%s", salt->salt_iter + 1, (char *) salt->salt_buf, (char *) ptr_plain); + const int out_len = snprintf (line_buf, line_size, "otm_sha256:%d:%s:%s", salt->salt_iter + 1, (const char *) salt->salt_buf, (const char *) ptr_plain); return out_len; } diff --git a/src/modules/module_20712.c b/src/modules/module_20712.c new file mode 100644 index 000000000..e2b5a492d --- /dev/null +++ b/src/modules/module_20712.c @@ -0,0 +1,266 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" +#include "memory.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_INSIDE_KERNEL; +static const u32 DGST_POS0 = 3; +static const u32 DGST_POS1 = 7; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 6; +static const u32 DGST_SIZE = DGST_SIZE_4_8; +static const u32 HASH_CATEGORY = HASH_CATEGORY_EAS; +static const char *HASH_NAME = "RSA Security Analytics / NetWitness (sha256)"; +static const u64 KERN_TYPE = 20712; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_RAW_HASH; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15 + | OPTS_TYPE_ST_BASE64; +static const u32 SALT_TYPE = SALT_TYPE_GENERIC; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "6F48F44C46F5ADC534597687B086278F0AAF7D262ADDB3978562A7D55BBDF467:MDAwMzY1NzYwODI4MQ=="; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 2; + + token.sep[0] = hashconfig->separator; + token.len[0] = 64; + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + token.len_min[1] = SALT_MIN; + token.len_max[1] = SALT_MAX; + token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_BASE64A; + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + const u8 *hash_pos = token.buf[0]; + + digest[0] = hex_to_u32 (hash_pos + 0); + digest[1] = hex_to_u32 (hash_pos + 8); + digest[2] = hex_to_u32 (hash_pos + 16); + digest[3] = hex_to_u32 (hash_pos + 24); + digest[4] = hex_to_u32 (hash_pos + 32); + digest[5] = hex_to_u32 (hash_pos + 40); + digest[6] = hex_to_u32 (hash_pos + 48); + digest[7] = hex_to_u32 (hash_pos + 56); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + digest[5] = byte_swap_32 (digest[5]); + digest[6] = byte_swap_32 (digest[6]); + digest[7] = byte_swap_32 (digest[7]); + + if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) + { + digest[0] -= SHA256M_A; + digest[1] -= SHA256M_B; + digest[2] -= SHA256M_C; + digest[3] -= SHA256M_D; + digest[4] -= SHA256M_E; + digest[5] -= SHA256M_F; + digest[6] -= SHA256M_G; + digest[7] -= SHA256M_H; + } + + const u8 *salt_pos = token.buf[1]; + const int salt_len = token.len[1]; + + const bool parse_rc = generic_salt_decode (hashconfig, salt_pos, salt_len, (u8 *) salt->salt_buf, (int *) &salt->salt_len); + + if (parse_rc == false) return (PARSER_SALT_LENGTH); + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u32 *digest = (const u32 *) digest_buf; + + u32 tmp[8]; + + tmp[0] = digest[0]; + tmp[1] = digest[1]; + tmp[2] = digest[2]; + tmp[3] = digest[3]; + tmp[4] = digest[4]; + tmp[5] = digest[5]; + tmp[6] = digest[6]; + tmp[7] = digest[7]; + + if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) + { + tmp[0] += SHA256M_A; + tmp[1] += SHA256M_B; + tmp[2] += SHA256M_C; + tmp[3] += SHA256M_D; + tmp[4] += SHA256M_E; + tmp[5] += SHA256M_F; + tmp[6] += SHA256M_G; + tmp[7] += SHA256M_H; + } + + tmp[0] = byte_swap_32 (tmp[0]); + tmp[1] = byte_swap_32 (tmp[1]); + tmp[2] = byte_swap_32 (tmp[2]); + tmp[3] = byte_swap_32 (tmp[3]); + tmp[4] = byte_swap_32 (tmp[4]); + tmp[5] = byte_swap_32 (tmp[5]); + tmp[6] = byte_swap_32 (tmp[6]); + tmp[7] = byte_swap_32 (tmp[7]); + + u8 tmp_uc[64]; + + memset (tmp_uc, 0, sizeof (tmp_uc)); + + int tmp_off = 0; + + u32_to_hex (tmp[0], tmp_uc + tmp_off); tmp_off += 8; + u32_to_hex (tmp[1], tmp_uc + tmp_off); tmp_off += 8; + u32_to_hex (tmp[2], tmp_uc + tmp_off); tmp_off += 8; + u32_to_hex (tmp[3], tmp_uc + tmp_off); tmp_off += 8; + u32_to_hex (tmp[4], tmp_uc + tmp_off); tmp_off += 8; + u32_to_hex (tmp[5], tmp_uc + tmp_off); tmp_off += 8; + u32_to_hex (tmp[6], tmp_uc + tmp_off); tmp_off += 8; + u32_to_hex (tmp[7], tmp_uc + tmp_off); tmp_off += 8; + + uppercase (tmp_uc, 64); + + u8 *out_buf = (u8 *) line_buf; + + int out_len = 0; + + memcpy (out_buf, tmp_uc, 64); + + out_len += 64; + + out_buf[out_len] = hashconfig->separator; + + out_len += 1; + + out_len += generic_salt_encode (hashconfig, (const u8 *) salt->salt_buf, (const int) salt->salt_len, out_buf + out_len); + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = MODULE_DEFAULT; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_21310.c b/src/modules/module_21310.c new file mode 100644 index 000000000..9bd5e991c --- /dev/null +++ b/src/modules/module_21310.c @@ -0,0 +1,296 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" +#include "emu_inc_hash_md5.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_INSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 3; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 1; +static const u32 DGST_SIZE = DGST_SIZE_4_4; +static const u32 HASH_CATEGORY = HASH_CATEGORY_RAW_HASH_SALTED; +static const char *HASH_NAME = "md5($salt1.sha1($salt2.$pass))"; +static const u64 KERN_TYPE = 21310; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_RAW_HASH; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14; +static const u32 SALT_TYPE = SALT_TYPE_GENERIC; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "dc91b5a658ef4b7d859e90742f340e24:708237:d270e9eea5802e346bcaa9b229f37766"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +typedef struct md5_double_salt +{ + u32 salt1_buf[64]; + int salt1_len; + + u32 salt2_buf[64]; + int salt2_len; + +} md5_double_salt_t; + +u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 esalt_size = (const u64) sizeof (md5_double_salt_t); + + return esalt_size; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + md5_double_salt_t *md5_double_salt = (md5_double_salt_t *) esalt_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 3; + + token.sep[0] = hashconfig->separator; + token.len[0] = 32; + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + token.sep[1] = hashconfig->separator; + token.len_min[1] = SALT_MIN; + token.len_max[1] = SALT_MAX; + token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH; + + token.sep[2] = hashconfig->separator; + token.len_min[2] = SALT_MIN; + token.len_max[2] = SALT_MAX; + token.attr[2] = TOKEN_ATTR_VERIFY_LENGTH; + + if (hashconfig->opts_type & OPTS_TYPE_ST_HEX) + { + token.len_min[1] *= 2; + token.len_max[1] *= 2; + + token.attr[1] |= TOKEN_ATTR_VERIFY_HEX; + + token.len_min[2] *= 2; + token.len_max[2] *= 2; + + token.attr[2] |= TOKEN_ATTR_VERIFY_HEX; + } + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + const u8 *hash_pos = token.buf[0]; + + digest[0] = hex_to_u32 (hash_pos + 0); + digest[1] = hex_to_u32 (hash_pos + 8); + digest[2] = hex_to_u32 (hash_pos + 16); + digest[3] = hex_to_u32 (hash_pos + 24); + + if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) + { + digest[0] -= MD5M_A; + digest[1] -= MD5M_B; + digest[2] -= MD5M_C; + digest[3] -= MD5M_D; + } + + memset (md5_double_salt->salt1_buf, 0, sizeof (md5_double_salt->salt1_buf)); + + const bool parse_rc1 = generic_salt_decode (hashconfig, token.buf[1], token.len[1], (u8 *) md5_double_salt->salt1_buf, &md5_double_salt->salt1_len); + + if (parse_rc1 == false) return (PARSER_SALT_LENGTH); + + memset (md5_double_salt->salt2_buf, 0, sizeof (md5_double_salt->salt2_buf)); + + const bool parse_rc2 = generic_salt_decode (hashconfig, token.buf[2], token.len[2], (u8 *) md5_double_salt->salt2_buf, &md5_double_salt->salt2_len); + + if (parse_rc2 == false) return (PARSER_SALT_LENGTH); + + for (int i = 0; i < 64; i++) + { + md5_double_salt->salt2_buf[i] = byte_swap_32 (md5_double_salt->salt2_buf[i]); + } + + // make salt sorter happy + + md5_ctx_t md5_ctx; + + md5_init (&md5_ctx); + md5_update (&md5_ctx, md5_double_salt->salt1_buf, md5_double_salt->salt1_len); + md5_update (&md5_ctx, md5_double_salt->salt2_buf, md5_double_salt->salt2_len); + md5_final (&md5_ctx); + + salt->salt_buf[0] = md5_ctx.h[0]; + salt->salt_buf[1] = md5_ctx.h[1]; + salt->salt_buf[2] = md5_ctx.h[2]; + salt->salt_buf[3] = md5_ctx.h[3]; + + salt->salt_len = 16; + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u32 *digest = (const u32 *) digest_buf; + + const md5_double_salt_t *md5_double_salt = (const md5_double_salt_t *) esalt_buf; + + // we can not change anything in the original buffer, otherwise destroying sorting + // therefore create some local buffer + + u32 tmp[4]; + + tmp[0] = digest[0]; + tmp[1] = digest[1]; + tmp[2] = digest[2]; + tmp[3] = digest[3]; + + if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) + { + tmp[0] += MD5M_A; + tmp[1] += MD5M_B; + tmp[2] += MD5M_C; + tmp[3] += MD5M_D; + } + + u8 *out_buf = (u8 *) line_buf; + + int out_len = 0; + + u32_to_hex (tmp[0], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[1], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[2], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[3], out_buf + out_len); out_len += 8; + + out_buf[out_len] = hashconfig->separator; + + out_len += 1; + + out_len += generic_salt_encode (hashconfig, (const u8 *) md5_double_salt->salt1_buf, md5_double_salt->salt1_len, out_buf + out_len); + + out_buf[out_len] = hashconfig->separator; + + out_len += 1; + + u32 salt2_buf[64]; + + for (int i = 0; i < 64; i++) + { + salt2_buf[i] = byte_swap_32 (md5_double_salt->salt2_buf[i]); + } + + out_len += generic_salt_encode (hashconfig, (const u8 *) salt2_buf, md5_double_salt->salt2_len, out_buf + out_len); + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = module_esalt_size; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = MODULE_DEFAULT; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_21500.c b/src/modules/module_21500.c index 837c942bb..ba52c09f0 100644 --- a/src/modules/module_21500.c +++ b/src/modules/module_21500.c @@ -127,7 +127,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // save original salt for encode function // this is the only reason why we have an esalt in this hash-mode - const char *salt_pos = (char *) token.buf[1]; + const char *salt_pos = (const char *) token.buf[1]; const int salt_len = token.len[1]; memcpy (solarwinds->salt_buf, salt_pos, salt_len); @@ -182,7 +182,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - const u64 *digest = (u64 *) digest_buf; + const u64 *digest = (const u64 *) digest_buf; const solarwinds_t *solarwinds = (const solarwinds_t *) esalt_buf; diff --git a/src/modules/module_21501.c b/src/modules/module_21501.c index a36517053..0c7d25abf 100644 --- a/src/modules/module_21501.c +++ b/src/modules/module_21501.c @@ -141,7 +141,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // save original salt for encode function // this is the only reason why we have an esalt in this hash-mode - const char *salt_pos = (char *) token.buf[1]; + const char *salt_pos = (const char *) token.buf[1]; const int salt_len = token.len[1]; memcpy (solarwinds->salt_buf, salt_pos, salt_len); @@ -154,7 +154,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memset (tmp_buf, 0, sizeof (tmp_buf)); - int tmp_len = base64_decode (base64_to_int, (u8 *)salt_pos, salt_len, tmp_buf); + int tmp_len = base64_decode (base64_to_int, (const u8 *)salt_pos, salt_len, tmp_buf); if (tmp_len != 16) return (PARSER_SALT_LENGTH); @@ -189,7 +189,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - const u64 *digest = (u64 *) digest_buf; + const u64 *digest = (const u64 *) digest_buf; const solarwinds_t *solarwinds = (const solarwinds_t *) esalt_buf; diff --git a/src/modules/module_21600.c b/src/modules/module_21600.c index 1342e697c..47cf4ce40 100644 --- a/src/modules/module_21600.c +++ b/src/modules/module_21600.c @@ -140,7 +140,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // hash - hex_decode ((const u8 *) token.buf[4], 40, (u8 *) digest); + hex_decode (token.buf[4], 40, (u8 *) digest); return (PARSER_OK); } @@ -159,7 +159,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE out_len += 1; - out_len += hex_encode ((const u8 *) digest, 20, (u8 *) out_buf + out_len); + out_len += hex_encode ((const u8 *) digest, 20, out_buf + out_len); return out_len; } diff --git a/src/modules/module_21700.c b/src/modules/module_21700.c index 8ca3f4ca6..ffd6178d9 100644 --- a/src/modules/module_21700.c +++ b/src/modules/module_21700.c @@ -25,6 +25,7 @@ static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_USES_BITS_64 | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_DEEP_COMP_KERNEL | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; @@ -66,8 +67,18 @@ typedef struct electrum_tmp static const char *SIGNATURE_ELECTRUM = "$electrum$4*"; +u32 module_deep_comp_kernel (MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const u32 salt_pos, MAYBE_UNUSED const u32 digest_pos) +{ + return KERN_RUN_3; +} + bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) { + if (device_param->opencl_device_vendor_id == VENDOR_ID_INTEL_SDK) + { + return true; + } + // AMD Radeon Pro W5700X, Metal.Version.: 261.13, compiler hangs if (device_param->is_metal == true) { @@ -209,13 +220,8 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // fake salt - salt->salt_buf[0] = esalt->data_buf[0]; - salt->salt_buf[1] = esalt->data_buf[1]; - salt->salt_buf[2] = esalt->data_buf[2]; - salt->salt_buf[3] = esalt->data_buf[3]; - - salt->salt_len = 16; - + salt->salt_buf[0] = 0; + salt->salt_len = 0; salt->salt_iter = 1024 - 1; return (PARSER_OK); @@ -223,9 +229,9 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - u32 *digest = (u32 *) digest_buf; + const u32 *digest = (const u32 *) digest_buf; - electrum_t *esalt = (electrum_t *) esalt_buf; + const electrum_t *esalt = (const electrum_t *) esalt_buf; // ephemeral pubkey: @@ -289,7 +295,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; - module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = MODULE_DEFAULT; module_ctx->module_dgst_pos0 = module_dgst_pos0; module_ctx->module_dgst_pos1 = module_dgst_pos1; diff --git a/src/modules/module_21800.c b/src/modules/module_21800.c index 752f3451c..486eba089 100644 --- a/src/modules/module_21800.c +++ b/src/modules/module_21800.c @@ -26,6 +26,7 @@ static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_DEEP_COMP_KERNEL | OPTS_TYPE_NATIVE_THREADS; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; @@ -66,6 +67,11 @@ typedef struct electrum_tmp static const char *SIGNATURE_ELECTRUM = "$electrum$5*"; +u32 module_deep_comp_kernel (MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const u32 salt_pos, MAYBE_UNUSED const u32 digest_pos) +{ + return KERN_RUN_3; +} + bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) { // problem with this kernel is the huge amount of register pressure on u8 tmp[TMPSIZ]; @@ -191,13 +197,8 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // fake salt - salt->salt_buf[0] = esalt->data_buf[0]; - salt->salt_buf[1] = esalt->data_buf[1]; - salt->salt_buf[2] = esalt->data_buf[2]; - salt->salt_buf[3] = esalt->data_buf[3]; - - salt->salt_len = 16; - + salt->salt_buf[0] = 0; + salt->salt_len = 0; salt->salt_iter = 1024 - 1; return (PARSER_OK); @@ -205,9 +206,9 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - u32 *digest = (u32 *) digest_buf; + const u32 *digest = (const u32 *) digest_buf; - electrum_t *esalt = (electrum_t *) esalt_buf; + const electrum_t *esalt = (const electrum_t *) esalt_buf; // ephemeral pubkey: @@ -271,7 +272,7 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_benchmark_charset = MODULE_DEFAULT; module_ctx->module_benchmark_salt = MODULE_DEFAULT; module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; - module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = module_deep_comp_kernel; module_ctx->module_deprecated_notice = MODULE_DEFAULT; module_ctx->module_dgst_pos0 = module_dgst_pos0; module_ctx->module_dgst_pos1 = module_dgst_pos1; diff --git a/src/modules/module_22000.c b/src/modules/module_22000.c index 5c20d6c7d..ebacaab95 100644 --- a/src/modules/module_22000.c +++ b/src/modules/module_22000.c @@ -582,8 +582,6 @@ bool module_potfile_custom_check (MAYBE_UNUSED const hashconfig_t *hashconfig, M kernel_param.digests_offset_host = 0; kernel_param.combs_mode = 0; kernel_param.salt_repeat = 0; - kernel_param.combs_mode = 0; - kernel_param.salt_repeat = 0; kernel_param.pws_pos = 0; kernel_param.gid_max = 1; @@ -627,7 +625,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE wpa_t *wpa = (wpa_t *) esalt_buf; - char *input_buf = (char *) line_buf; + const char *input_buf = line_buf; int input_len = line_len; // start old pmkid/hccapx compatibility parsing @@ -641,7 +639,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE if (line_len == sizeof (hccapx_t)) { - hccapx_t *hccapx = (hccapx_t *) line_buf; + const hccapx_t *hccapx = (const hccapx_t *) line_buf; if ((hccapx->signature == HCCAPX_SIGNATURE) && (hccapx->version == HCCAPX_VERSION)) { @@ -685,7 +683,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE tmp_len++; - tmp_len += hex_encode ((const u8 *) &hccapx->message_pair, 1, (u8 *) tmp_buf + tmp_len); + tmp_len += hex_encode (&hccapx->message_pair, 1, (u8 *) tmp_buf + tmp_len); tmp_buf[tmp_len] = 0; @@ -944,7 +942,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 *eapol_ptr = (u8 *) wpa->eapol; - wpa->eapol_len = hex_decode ((const u8 *) eapol_pos, token.len[7], eapol_ptr); + wpa->eapol_len = hex_decode (eapol_pos, token.len[7], eapol_ptr); memset (eapol_ptr + wpa->eapol_len, 0, (256 + 64) - wpa->eapol_len); diff --git a/src/modules/module_22001.c b/src/modules/module_22001.c index 8bd35cd2b..b0fb51dd9 100644 --- a/src/modules/module_22001.c +++ b/src/modules/module_22001.c @@ -584,8 +584,6 @@ bool module_potfile_custom_check (MAYBE_UNUSED const hashconfig_t *hashconfig, M kernel_param.digests_offset_host = 0; kernel_param.combs_mode = 0; kernel_param.salt_repeat = 0; - kernel_param.combs_mode = 0; - kernel_param.salt_repeat = 0; kernel_param.pws_pos = 0; kernel_param.gid_max = 1; @@ -629,7 +627,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE wpa_t *wpa = (wpa_t *) esalt_buf; - char *input_buf = (char *) line_buf; + const char *input_buf = line_buf; int input_len = line_len; // start old pmkid/hccapx compatibility parsing @@ -643,7 +641,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE if (line_len == sizeof (hccapx_t)) { - hccapx_t *hccapx = (hccapx_t *) line_buf; + const hccapx_t *hccapx = (const hccapx_t *) line_buf; if ((hccapx->signature == HCCAPX_SIGNATURE) && (hccapx->version == HCCAPX_VERSION)) { @@ -687,7 +685,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE tmp_len++; - tmp_len += hex_encode ((const u8 *) &hccapx->message_pair, 1, (u8 *) tmp_buf + tmp_len); + tmp_len += hex_encode (&hccapx->message_pair, 1, (u8 *) tmp_buf + tmp_len); tmp_buf[tmp_len] = 0; @@ -945,7 +943,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 *eapol_ptr = (u8 *) wpa->eapol; - wpa->eapol_len = hex_decode ((const u8 *) eapol_pos, token.len[7], eapol_ptr); + wpa->eapol_len = hex_decode (eapol_pos, token.len[7], eapol_ptr); memset (eapol_ptr + wpa->eapol_len, 0, (256 + 64) - wpa->eapol_len); diff --git a/src/modules/module_22100.c b/src/modules/module_22100.c index 833eb4a63..f5b21082a 100644 --- a/src/modules/module_22100.c +++ b/src/modules/module_22100.c @@ -350,7 +350,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - bitlocker_t *bitlocker = (bitlocker_t *) esalt_buf; + const bitlocker_t *bitlocker = (const bitlocker_t *) esalt_buf; // type diff --git a/src/modules/module_22400.c b/src/modules/module_22400.c index cd373a75d..476911d5d 100644 --- a/src/modules/module_22400.c +++ b/src/modules/module_22400.c @@ -243,7 +243,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { const u32 *digest = (const u32 *) digest_buf; - aescrypt_t *aescrypt = (aescrypt_t *) esalt_buf; + const aescrypt_t *aescrypt = (const aescrypt_t *) esalt_buf; // salt diff --git a/src/modules/module_22911.c b/src/modules/module_22911.c index 8beeca76b..25b90e94a 100644 --- a/src/modules/module_22911.c +++ b/src/modules/module_22911.c @@ -171,7 +171,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - pem_t *pem = (pem_t *) esalt_buf; + const pem_t *pem = (const pem_t *) esalt_buf; u8 *out_buf = (u8 *) line_buf; @@ -184,7 +184,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE byte_swap_32 (salt->salt_buf[1]), pem->data_len); - out_len += hex_encode ((const u8 *) pem->data_buf, pem->data_len, (u8 *) out_buf + out_len); + out_len += hex_encode ((const u8 *) pem->data_buf, pem->data_len, out_buf + out_len); return out_len; } diff --git a/src/modules/module_22921.c b/src/modules/module_22921.c index 182c1c6f3..c71aad254 100644 --- a/src/modules/module_22921.c +++ b/src/modules/module_22921.c @@ -172,7 +172,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - pem_t *pem = (pem_t *) esalt_buf; + const pem_t *pem = (const pem_t *) esalt_buf; u8 *out_buf = (u8 *) line_buf; @@ -185,7 +185,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE byte_swap_32 (salt->salt_buf[1]), pem->data_len); - out_len += hex_encode ((const u8 *) pem->data_buf, pem->data_len, (u8 *) out_buf + out_len); + out_len += hex_encode ((const u8 *) pem->data_buf, pem->data_len, out_buf + out_len); return out_len; } diff --git a/src/modules/module_22931.c b/src/modules/module_22931.c index 5296c58fc..ea673b633 100644 --- a/src/modules/module_22931.c +++ b/src/modules/module_22931.c @@ -173,7 +173,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - pem_t *pem = (pem_t *) esalt_buf; + const pem_t *pem = (const pem_t *) esalt_buf; u8 *out_buf = (u8 *) line_buf; @@ -188,7 +188,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE byte_swap_32 (salt->salt_buf[3]), pem->data_len); - out_len += hex_encode ((const u8 *) pem->data_buf, pem->data_len, (u8 *) out_buf + out_len); + out_len += hex_encode ((const u8 *) pem->data_buf, pem->data_len, out_buf + out_len); return out_len; } diff --git a/src/modules/module_22941.c b/src/modules/module_22941.c index e2b2e8116..05f0d57e5 100644 --- a/src/modules/module_22941.c +++ b/src/modules/module_22941.c @@ -173,7 +173,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - pem_t *pem = (pem_t *) esalt_buf; + const pem_t *pem = (const pem_t *) esalt_buf; u8 *out_buf = (u8 *) line_buf; @@ -188,7 +188,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE byte_swap_32 (salt->salt_buf[3]), pem->data_len); - out_len += hex_encode ((const u8 *) pem->data_buf, pem->data_len, (u8 *) out_buf + out_len); + out_len += hex_encode ((const u8 *) pem->data_buf, pem->data_len, out_buf + out_len); return out_len; } diff --git a/src/modules/module_22951.c b/src/modules/module_22951.c index ad0d95659..abf2fb6dd 100644 --- a/src/modules/module_22951.c +++ b/src/modules/module_22951.c @@ -173,7 +173,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - pem_t *pem = (pem_t *) esalt_buf; + const pem_t *pem = (const pem_t *) esalt_buf; u8 *out_buf = (u8 *) line_buf; @@ -188,7 +188,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE byte_swap_32 (salt->salt_buf[3]), pem->data_len); - out_len += hex_encode ((const u8 *) pem->data_buf, pem->data_len, (u8 *) out_buf + out_len); + out_len += hex_encode ((const u8 *) pem->data_buf, pem->data_len, out_buf + out_len); return out_len; } diff --git a/src/modules/module_23001.c b/src/modules/module_23001.c index 02e4bd62b..db6fb556a 100644 --- a/src/modules/module_23001.c +++ b/src/modules/module_23001.c @@ -209,13 +209,13 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 iv[33] = { 0 }; - hex_encode ((u8 *) securezip->iv, securezip->iv_len, iv); + hex_encode ((const u8 *) securezip->iv, securezip->iv_len, iv); // data: u8 data[289] = { 0 }; - hex_encode ((u8 *) securezip->data, 144, data); + hex_encode ((const u8 *) securezip->data, 144, data); // file: diff --git a/src/modules/module_23002.c b/src/modules/module_23002.c index 223096535..189a78a54 100644 --- a/src/modules/module_23002.c +++ b/src/modules/module_23002.c @@ -209,13 +209,13 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 iv[33] = { 0 }; - hex_encode ((u8 *) securezip->iv, securezip->iv_len, iv); + hex_encode ((const u8 *) securezip->iv, securezip->iv_len, iv); // data: u8 data[289] = { 0 }; - hex_encode ((u8 *) securezip->data, 144, data); + hex_encode ((const u8 *) securezip->data, 144, data); // file: diff --git a/src/modules/module_23003.c b/src/modules/module_23003.c index 3e1dd0428..c3a44d944 100644 --- a/src/modules/module_23003.c +++ b/src/modules/module_23003.c @@ -210,13 +210,13 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 iv[33] = { 0 }; - hex_encode ((u8 *) securezip->iv, securezip->iv_len, iv); + hex_encode ((const u8 *) securezip->iv, securezip->iv_len, iv); // data: u8 data[289] = { 0 }; - hex_encode ((u8 *) securezip->data, 144, data); + hex_encode ((const u8 *) securezip->data, 144, data); // file: diff --git a/src/modules/module_23100.c b/src/modules/module_23100.c index f3057c803..22b524e9f 100644 --- a/src/modules/module_23100.c +++ b/src/modules/module_23100.c @@ -163,19 +163,19 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - keychain_t *keychain = (keychain_t *) esalt_buf; + const keychain_t *keychain = (const keychain_t *) esalt_buf; // iv u8 iv[17] = { 0 }; - hex_encode ((u8 *) keychain->iv, 8, iv); + hex_encode ((const u8 *) keychain->iv, 8, iv); // data u8 data[97] = { 0 }; - hex_encode ((u8 *) keychain->data, 48, data); + hex_encode ((const u8 *) keychain->data, 48, data); return snprintf (line_buf, line_size, "%s*%08x%08x%08x%08x%08x*%s*%s", SIGNATURE_KEYCHAIN, diff --git a/src/modules/module_23200.c b/src/modules/module_23200.c index bcea54bce..5ec94c72d 100644 --- a/src/modules/module_23200.c +++ b/src/modules/module_23200.c @@ -142,7 +142,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *salt_pos = token.buf[5]; const int salt_len = token.len[5]; - salt->salt_len = hex_decode ((const u8 *) salt_pos, salt_len, (u8 *) salt->salt_buf); + salt->salt_len = hex_decode (salt_pos, salt_len, (u8 *) salt->salt_buf); // salt length @@ -179,7 +179,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE out_len += 1; - out_len += hex_encode ((const u8 *) digest, 20, (u8 *) out_buf + out_len); + out_len += hex_encode ((const u8 *) digest, 20, out_buf + out_len); return out_len; } diff --git a/src/modules/module_23300.c b/src/modules/module_23300.c index 21d03e82c..decc32913 100644 --- a/src/modules/module_23300.c +++ b/src/modules/module_23300.c @@ -230,13 +230,13 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 iv_hex[33] = { 0 }; - hex_encode ((u8 *) iwork->iv, 16, iv_hex); + hex_encode ((const u8 *) iwork->iv, 16, iv_hex); // data u8 data_hex[129] = { 0 }; - hex_encode ((u8 *) iwork->data, 64, data_hex); + hex_encode ((const u8 *) iwork->data, 64, data_hex); int out_len = snprintf (line_buf, line_size, "%s%u$%u$%u$%u$%s$%s$%s", SIGNATURE_IWORK, diff --git a/src/modules/module_23500.c b/src/modules/module_23500.c index 4e4220296..5c8bd4367 100644 --- a/src/modules/module_23500.c +++ b/src/modules/module_23500.c @@ -236,7 +236,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - axcrypt2_t *axcrypt2 = (axcrypt2_t *) esalt_buf; + const axcrypt2_t *axcrypt2 = (const axcrypt2_t *) esalt_buf; // salt wrap buffer diff --git a/src/modules/module_23600.c b/src/modules/module_23600.c index b94c2530a..2df2d3479 100644 --- a/src/modules/module_23600.c +++ b/src/modules/module_23600.c @@ -236,7 +236,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - axcrypt2_t *axcrypt2 = (axcrypt2_t *) esalt_buf; + const axcrypt2_t *axcrypt2 = (const axcrypt2_t *) esalt_buf; // salt wrap buffer diff --git a/src/modules/module_23700.c b/src/modules/module_23700.c index e8296c575..884aceefc 100644 --- a/src/modules/module_23700.c +++ b/src/modules/module_23700.c @@ -73,7 +73,7 @@ static const char *SIGNATURE_RAR3 = "$RAR3$"; u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { - const bool optimized_kernel = user_options->optimized_kernel_enable; + const bool optimized_kernel = user_options->optimized_kernel; u64 tmp_size = (u64) sizeof (rar3_tmp_t); diff --git a/src/modules/module_23800.c b/src/modules/module_23800.c index 5f164b084..214ea0f50 100644 --- a/src/modules/module_23800.c +++ b/src/modules/module_23800.c @@ -293,10 +293,10 @@ void module_hook23 (hc_device_param_t *device_param, const void *hook_extra_para rar3_hook_t *hook_items = (rar3_hook_t *) device_param->hooks_buf; rar3_hook_t *hook_item = &hook_items[pw_pos]; - rar3_hook_salt_t *rar3s = (rar3_hook_salt_t *) hook_salts_buf; - rar3_hook_salt_t *rar3 = &rar3s[salt_pos]; + const rar3_hook_salt_t *rar3s = (const rar3_hook_salt_t *) hook_salts_buf; + const rar3_hook_salt_t *rar3 = &rar3s[salt_pos]; - rar3_hook_extra_t *rar3_hook_extra = (rar3_hook_extra_t *) hook_extra_param; + const rar3_hook_extra_t *rar3_hook_extra = (const rar3_hook_extra_t *) hook_extra_param; const unsigned int pack_size = (const unsigned int) rar3->pack_size; const unsigned int unpack_size = (const unsigned int) rar3->unpack_size; @@ -323,7 +323,7 @@ void module_hook23 (hc_device_param_t *device_param, const void *hook_extra_para } } - const u8 *data = (u8 *) rar3->data; + const u8 *data = (const u8 *) rar3->data; const u8 *key = (u8 *) hook_item->key; const u8 *iv = (u8 *) hook_item->iv; @@ -356,7 +356,7 @@ u64 module_hook_extra_param_size (MAYBE_UNUSED const hashconfig_t *hashconfig, M u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { - const bool optimized_kernel = user_options->optimized_kernel_enable; + const bool optimized_kernel = user_options->optimized_kernel; u64 tmp_size = (u64) sizeof (rar3_tmp_t); @@ -567,7 +567,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { const u32 *digest = (const u32 *) digest_buf; - rar3_hook_salt_t *rar3_hook_salt = (rar3_hook_salt_t *) hook_salt_buf; + const rar3_hook_salt_t *rar3_hook_salt = (const rar3_hook_salt_t *) hook_salt_buf; const u32 data_len = rar3_hook_salt->pack_size; diff --git a/src/modules/module_23900.c b/src/modules/module_23900.c index ffc1f2b39..7fe378938 100644 --- a/src/modules/module_23900.c +++ b/src/modules/module_23900.c @@ -143,9 +143,6 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE if (parse_rc == false) return (PARSER_SALT_LENGTH); - salt->salt_buf[0] = salt->salt_buf[0]; - salt->salt_buf[1] = salt->salt_buf[1]; - salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]); salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]); @@ -185,7 +182,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 data_hex[193] = { 0 }; - hex_encode ((u8 *) bestcrypt->data, 96, data_hex); + hex_encode ((const u8 *) bestcrypt->data, 96, data_hex); int out_len = snprintf (line_buf, line_size, "%s3$08$%s$%s", SIGNATURE_BESTCRYPT, diff --git a/src/modules/module_24100.c b/src/modules/module_24100.c index 699fbf7b5..a871090f0 100644 --- a/src/modules/module_24100.c +++ b/src/modules/module_24100.c @@ -220,9 +220,9 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - u32 *digest = (u32 *) digest_buf; + const u32 *digest = (const u32 *) digest_buf; - mongodb_sha1_t *mongodb_sha1 = (mongodb_sha1_t *) esalt_buf; + const mongodb_sha1_t *mongodb_sha1 = (const mongodb_sha1_t *) esalt_buf; // salt @@ -257,7 +257,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 user[100] = { 0 }; // actually: 64 - 7 (:mongo:) - memcpy (user, (char *) mongodb_sha1->user, user_len); + memcpy (user, (const char *) mongodb_sha1->user, user_len); u8 user_base64[100] = { 0 }; diff --git a/src/modules/module_24200.c b/src/modules/module_24200.c index 9457eb4a7..4ab9c2a09 100644 --- a/src/modules/module_24200.c +++ b/src/modules/module_24200.c @@ -256,9 +256,9 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - u32 *digest = (u32 *) digest_buf; + const u32 *digest = (const u32 *) digest_buf; - mongodb_sha256_t *mongodb_sha256 = (mongodb_sha256_t *) esalt_buf; + const mongodb_sha256_t *mongodb_sha256 = (const mongodb_sha256_t *) esalt_buf; // salt @@ -297,7 +297,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 user[100] = { 0 }; - memcpy (user, (char *) mongodb_sha256->user, 64); + memcpy (user, (const char *) mongodb_sha256->user, 64); u8 user_base64[100] = { 0 }; diff --git a/src/modules/module_24410.c b/src/modules/module_24410.c index 6e59fd160..44e3202f9 100644 --- a/src/modules/module_24410.c +++ b/src/modules/module_24410.c @@ -258,7 +258,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - pkcs_t *pkcs = (pkcs_t *) esalt_buf; + const pkcs_t *pkcs = (const pkcs_t *) esalt_buf; // salt @@ -295,7 +295,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE iv, pkcs->data_len); - out_len += hex_encode ((const u8 *) pkcs->data_buf, pkcs->data_len, (u8 *) out_buf + out_len); + out_len += hex_encode ((const u8 *) pkcs->data_buf, pkcs->data_len, out_buf + out_len); return out_len; } diff --git a/src/modules/module_24420.c b/src/modules/module_24420.c index 90f00ffa0..7bd0e1e05 100644 --- a/src/modules/module_24420.c +++ b/src/modules/module_24420.c @@ -258,7 +258,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - pkcs_t *pkcs = (pkcs_t *) esalt_buf; + const pkcs_t *pkcs = (const pkcs_t *) esalt_buf; // salt @@ -295,7 +295,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE iv, pkcs->data_len); - out_len += hex_encode ((const u8 *) pkcs->data_buf, pkcs->data_len, (u8 *) out_buf + out_len); + out_len += hex_encode ((const u8 *) pkcs->data_buf, pkcs->data_len, out_buf + out_len); return out_len; } diff --git a/src/modules/module_24600.c b/src/modules/module_24600.c index 0194cb05e..838d61245 100644 --- a/src/modules/module_24600.c +++ b/src/modules/module_24600.c @@ -252,7 +252,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - sqlcipher_t *sqlcipher = (sqlcipher_t *) esalt_buf; + const sqlcipher_t *sqlcipher = (const sqlcipher_t *) esalt_buf; u8 *out_buf = (u8 *) line_buf; diff --git a/src/modules/module_25000.c b/src/modules/module_25000.c index 69857dac7..c3249420d 100644 --- a/src/modules/module_25000.c +++ b/src/modules/module_25000.c @@ -81,6 +81,16 @@ typedef struct snmpv3 } snmpv3_t; +bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) +{ + if (device_param->opencl_device_vendor_id == VENDOR_ID_INTEL_SDK) + { + return true; + } + + return false; +} + u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u64 esalt_size = (const u64) sizeof (snmpv3_t); @@ -167,7 +177,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memset (snmpv3->packet_number, 0, sizeof (snmpv3->packet_number)); - strncpy ((char *) snmpv3->packet_number, (char *) packet_number_pos, packet_number_len); + strncpy ((char *) snmpv3->packet_number, (const char *) packet_number_pos, packet_number_len); // salt @@ -226,19 +236,19 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { const u32 *digest = (const u32 *) digest_buf; - snmpv3_t *snmpv3 = (snmpv3_t *) esalt_buf; + const snmpv3_t *snmpv3 = (const snmpv3_t *) esalt_buf; u8 *out_buf = (u8 *) line_buf; - int out_len = snprintf (line_buf, line_size, "%s%s$", SIGNATURE_SNMPV3, (char *) snmpv3->packet_number); + int out_len = snprintf (line_buf, line_size, "%s%s$", SIGNATURE_SNMPV3, (const char *) snmpv3->packet_number); - out_len += hex_encode ((u8 *) snmpv3->salt_buf, snmpv3->salt_len, out_buf + out_len); + out_len += hex_encode ((const u8 *) snmpv3->salt_buf, snmpv3->salt_len, out_buf + out_len); out_buf[out_len] = '$'; out_len++; - out_len += hex_encode ((u8 *) snmpv3->engineID_buf, snmpv3->engineID_len, out_buf + out_len); + out_len += hex_encode ((const u8 *) snmpv3->engineID_buf, snmpv3->engineID_len, out_buf + out_len); out_buf[out_len] = '$'; @@ -337,6 +347,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_unstable_warning = module_unstable_warning; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_25100.c b/src/modules/module_25100.c index 20a97afdc..eaa7ba048 100644 --- a/src/modules/module_25100.c +++ b/src/modules/module_25100.c @@ -77,6 +77,16 @@ typedef struct snmpv3 } snmpv3_t; +bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) +{ + if (device_param->opencl_device_vendor_id == VENDOR_ID_INTEL_SDK) + { + return true; + } + + return false; +} + u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u64 esalt_size = (const u64) sizeof (snmpv3_t); @@ -163,7 +173,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memset (snmpv3->packet_number, 0, sizeof (snmpv3->packet_number)); - strncpy ((char *) snmpv3->packet_number, (char *) packet_number_pos, packet_number_len); + strncpy ((char *) snmpv3->packet_number, (const char *) packet_number_pos, packet_number_len); // salt @@ -215,19 +225,19 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { const u32 *digest = (const u32 *) digest_buf; - snmpv3_t *snmpv3 = (snmpv3_t *) esalt_buf; + const snmpv3_t *snmpv3 = (const snmpv3_t *) esalt_buf; u8 *out_buf = (u8 *) line_buf; - int out_len = snprintf (line_buf, line_size, "%s%s$", SIGNATURE_SNMPV3, (char *) snmpv3->packet_number); + int out_len = snprintf (line_buf, line_size, "%s%s$", SIGNATURE_SNMPV3, (const char *) snmpv3->packet_number); - out_len += hex_encode ((u8 *) snmpv3->salt_buf, snmpv3->salt_len, out_buf + out_len); + out_len += hex_encode ((const u8 *) snmpv3->salt_buf, snmpv3->salt_len, out_buf + out_len); out_buf[out_len] = '$'; out_len++; - out_len += hex_encode ((u8 *) snmpv3->engineID_buf, snmpv3->engineID_len, out_buf + out_len); + out_len += hex_encode ((const u8 *) snmpv3->engineID_buf, snmpv3->engineID_len, out_buf + out_len); out_buf[out_len] = '$'; @@ -318,6 +328,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_unstable_warning = module_unstable_warning; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_25200.c b/src/modules/module_25200.c index 5f790669d..41131767d 100644 --- a/src/modules/module_25200.c +++ b/src/modules/module_25200.c @@ -77,6 +77,16 @@ typedef struct snmpv3 } snmpv3_t; +bool module_unstable_warning (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hc_device_param_t *device_param) +{ + if (device_param->opencl_device_vendor_id == VENDOR_ID_INTEL_SDK) + { + return true; + } + + return false; +} + u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { const u64 esalt_size = (const u64) sizeof (snmpv3_t); @@ -163,7 +173,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memset (snmpv3->packet_number, 0, sizeof (snmpv3->packet_number)); - strncpy ((char *) snmpv3->packet_number, (char *) packet_number_pos, packet_number_len); + strncpy ((char *) snmpv3->packet_number, (const char *) packet_number_pos, packet_number_len); // salt @@ -220,19 +230,19 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { const u32 *digest = (const u32 *) digest_buf; - snmpv3_t *snmpv3 = (snmpv3_t *) esalt_buf; + const snmpv3_t *snmpv3 = (const snmpv3_t *) esalt_buf; u8 *out_buf = (u8 *) line_buf; - int out_len = snprintf (line_buf, line_size, "%s%s$", SIGNATURE_SNMPV3, (char *) snmpv3->packet_number); + int out_len = snprintf (line_buf, line_size, "%s%s$", SIGNATURE_SNMPV3, (const char *) snmpv3->packet_number); - out_len += hex_encode ((u8 *) snmpv3->salt_buf, snmpv3->salt_len, out_buf + out_len); + out_len += hex_encode ((const u8 *) snmpv3->salt_buf, snmpv3->salt_len, out_buf + out_len); out_buf[out_len] = '$'; out_len++; - out_len += hex_encode ((u8 *) snmpv3->engineID_buf, snmpv3->engineID_len, out_buf + out_len); + out_len += hex_encode ((const u8 *) snmpv3->engineID_buf, snmpv3->engineID_len, out_buf + out_len); out_buf[out_len] = '$'; @@ -329,6 +339,6 @@ void module_init (module_ctx_t *module_ctx) module_ctx->module_st_hash = module_st_hash; module_ctx->module_st_pass = module_st_pass; module_ctx->module_tmp_size = module_tmp_size; - module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_unstable_warning = module_unstable_warning; module_ctx->module_warmup_disable = MODULE_DEFAULT; } diff --git a/src/modules/module_25400.c b/src/modules/module_25400.c index 7b2402267..8dc70b479 100644 --- a/src/modules/module_25400.c +++ b/src/modules/module_25400.c @@ -155,7 +155,7 @@ u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED con int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) { - char *input_buf = (char *) line_buf; + const char *input_buf = line_buf; int input_len = line_len; // based on m22000 module_hash_decode() we detect both the hashformat with and without user-password @@ -483,7 +483,7 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, 0x7a695364 }; - pdf14_tmp_t *pdf_tmp = (pdf14_tmp_t *) tmps; + const pdf14_tmp_t *pdf_tmp = (const pdf14_tmp_t *) tmps; pdf_t *pdf = (pdf_t *) hashes->esalts_buf; // if the password in tmp->out is equal to the padding, then we recovered just the owner-password @@ -497,11 +497,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, pdf_tmp->out[6] == padding[6] && pdf_tmp->out[7] == padding[7]) { - return snprintf ((char *) dst_buf, dst_sz, "%s (user password not set)", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s (user password not set)", (const char *) src_buf); } // cast out buffer to byte such that we can do a byte per byte comparison - u32 *u32OutBufPtr = pdf_tmp->out; + const u32 *u32OutBufPtr = pdf_tmp->out; u8 *u8OutBufPtr; u8OutBufPtr = (u8*) u32OutBufPtr; @@ -540,11 +540,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (pdf->u_pass_len == 0) { // we seem to only have recovered the user-password as we don't have one yet - return snprintf ((char *) dst_buf, dst_sz, "(user password=%s)", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "(user password=%s)", (const char *) src_buf); } } // we recovered both the user-password and the owner-password - return snprintf ((char *) dst_buf, dst_sz, "%s (user password=%s)", (char *) src_buf, (char *) pdf_tmp->out); + return snprintf ((char *) dst_buf, dst_sz, "%s (user password=%s)", (const char *) src_buf, (const char *) pdf_tmp->out); } @@ -557,11 +557,11 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { int line_len = 0; - pdf_t *pdf = (pdf_t *) esalt_buf; + const pdf_t *pdf = (const pdf_t *) esalt_buf; if (pdf->id_len == 32) { - char *line_format = "$pdf$%d*%d*%d*%u*%d*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x%s"; + const char *line_format = "$pdf$%d*%d*%d*%u*%d*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x%s"; if (pdf->P_minus == 1) line_format = "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x%s"; @@ -598,12 +598,12 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE byte_swap_32 (pdf->o_buf[5]), byte_swap_32 (pdf->o_buf[6]), byte_swap_32 (pdf->o_buf[7]), - (char *) pdf->u_pass_buf // TODO just prints the old hash now, we don't edit the hash to add a recovered user-password to it (yet) + (const char *) pdf->u_pass_buf // TODO just prints the old hash now, we don't edit the hash to add a recovered user-password to it (yet) ); } else { - char *line_format = "$pdf$%d*%d*%d*%u*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x%s"; + const char *line_format = "$pdf$%d*%d*%d*%u*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x%s"; if (pdf->P_minus == 1) line_format = "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x%s"; @@ -636,7 +636,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE byte_swap_32 (pdf->o_buf[5]), byte_swap_32 (pdf->o_buf[6]), byte_swap_32 (pdf->o_buf[7]), - (char *) pdf->u_pass_buf // TODO just prints the old hash now, we don't edit the hash to add a recovered user-password to it (yet) + (const char *) pdf->u_pass_buf // TODO just prints the old hash now, we don't edit the hash to add a recovered user-password to it (yet) ); } diff --git a/src/modules/module_25500.c b/src/modules/module_25500.c index 7d68a8648..9e2305f84 100644 --- a/src/modules/module_25500.c +++ b/src/modules/module_25500.c @@ -243,7 +243,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { const u32 *digest = (const u32 *) digest_buf; - pbkdf2_sha256_aes_gcm_t *stellar = (pbkdf2_sha256_aes_gcm_t *) esalt_buf; + const pbkdf2_sha256_aes_gcm_t *stellar = (const pbkdf2_sha256_aes_gcm_t *) esalt_buf; // salt diff --git a/src/modules/module_25600.c b/src/modules/module_25600.c index e39224b54..dc6ec869c 100644 --- a/src/modules/module_25600.c +++ b/src/modules/module_25600.c @@ -220,7 +220,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memset (tmp_buf, 0, sizeof (tmp_buf)); - base64_decode (bf64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf); + base64_decode (bf64_to_int, salt_pos, salt_len, tmp_buf); memcpy (salt_buf_ptr, tmp_buf, 16); @@ -231,7 +231,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memset (tmp_buf, 0, sizeof (tmp_buf)); - base64_decode (bf64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf); + base64_decode (bf64_to_int, hash_pos, hash_len, tmp_buf); memcpy (digest, tmp_buf, 24); @@ -274,7 +274,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE tmp_buf[22 + 31] = 0; // base64_encode wants to pad - return snprintf (line_buf, line_size, "%s$%s", (char *) salt->salt_sign, tmp_buf); + return snprintf (line_buf, line_size, "%s$%s", (const char *) salt->salt_sign, tmp_buf); } void module_init (module_ctx_t *module_ctx) diff --git a/src/modules/module_25700.c b/src/modules/module_25700.c index c6a805dcc..30b0df8d5 100644 --- a/src/modules/module_25700.c +++ b/src/modules/module_25700.c @@ -84,7 +84,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *hash_pos = token.buf[0]; - digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]); + digest[0] = hex_to_u32 (&hash_pos[0]); digest[1] = 0; digest[2] = 0; digest[3] = 0; @@ -96,7 +96,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *salt_pos = token.buf[1]; const int salt_len = token.len[1]; - salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]); + salt->salt_buf[0] = hex_to_u32 (&salt_pos[0]); salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]); diff --git a/src/modules/module_25800.c b/src/modules/module_25800.c index 9c3189f21..89c4251b6 100644 --- a/src/modules/module_25800.c +++ b/src/modules/module_25800.c @@ -220,7 +220,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memset (tmp_buf, 0, sizeof (tmp_buf)); - base64_decode (bf64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf); + base64_decode (bf64_to_int, salt_pos, salt_len, tmp_buf); memcpy (salt_buf_ptr, tmp_buf, 16); @@ -231,7 +231,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memset (tmp_buf, 0, sizeof (tmp_buf)); - base64_decode (bf64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf); + base64_decode (bf64_to_int, hash_pos, hash_len, tmp_buf); memcpy (digest, tmp_buf, 24); @@ -274,7 +274,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE tmp_buf[22 + 31] = 0; // base64_encode wants to pad - return snprintf (line_buf, line_size, "%s$%s", (char *) salt->salt_sign, tmp_buf); + return snprintf (line_buf, line_size, "%s$%s", (const char *) salt->salt_sign, tmp_buf); } void module_init (module_ctx_t *module_ctx) diff --git a/src/modules/module_25900.c b/src/modules/module_25900.c index b8ce7a24a..898fc5b52 100644 --- a/src/modules/module_25900.c +++ b/src/modules/module_25900.c @@ -179,13 +179,13 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 secure_session_identifier[2]; u8 public_value_xor[32]; - hex_decode (secure_session_identifier_pos, secure_session_identifier_len, (u8 *) &secure_session_identifier); - hex_decode (public_value_xor_pos, public_value_xor_len, (u8 *) &public_value_xor); + hex_decode (secure_session_identifier_pos, secure_session_identifier_len, secure_session_identifier); + hex_decode (public_value_xor_pos, public_value_xor_len, public_value_xor); - digest[0] = hex_to_u32 ((const u8 *) &mac_pos[0]); - digest[1] = hex_to_u32 ((const u8 *) &mac_pos[8]); - digest[2] = hex_to_u32 ((const u8 *) &mac_pos[16]); - digest[3] = hex_to_u32 ((const u8 *) &mac_pos[24]); + digest[0] = hex_to_u32 (&mac_pos[0]); + digest[1] = hex_to_u32 (&mac_pos[8]); + digest[2] = hex_to_u32 (&mac_pos[16]); + digest[3] = hex_to_u32 (&mac_pos[24]); u8 b1[16] = { 0x00, //-x Length of the associated data 0x28, //_| @@ -224,7 +224,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { const u32 *digest = (const u32 *) digest_buf; - blocks_t *blocks = (blocks_t *) esalt_buf; + const blocks_t *blocks = (const blocks_t *) esalt_buf; u8 secure_session_identifier[2]; u8 secure_session_identifier_hex[5] = { 0 }; @@ -233,7 +233,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memcpy (secure_session_identifier, &(blocks->b1[2]), 2); - memcpy (&public_value_xor[ 0], ((u8 *) &blocks->b1[2]) + 2, 6); + memcpy (&public_value_xor[ 0], ((const u8 *) &blocks->b1[2]) + 2, 6); memcpy (&public_value_xor[ 6], &(blocks->b2[0]), 16); memcpy (&public_value_xor[22], &(blocks->b3[0]), 10); diff --git a/src/modules/module_26200.c b/src/modules/module_26200.c index c3696d5fc..bed7b39c5 100644 --- a/src/modules/module_26200.c +++ b/src/modules/module_26200.c @@ -92,7 +92,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); - const u8 *hash_pos = (u8 *) token.buf[0]; + const u8 *hash_pos = token.buf[0]; const u32 hash_len = token.len[0]; /* @@ -122,7 +122,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - char *digest = (char *) digest_buf; + const char *digest = (const char *) digest_buf; char buf[16 + 1] = { 0 }; diff --git a/src/modules/module_26600.c b/src/modules/module_26600.c index a60917cc9..4f6d0de3b 100644 --- a/src/modules/module_26600.c +++ b/src/modules/module_26600.c @@ -258,7 +258,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { const u32 *digest = (const u32 *) digest_buf; - pbkdf2_sha256_aes_gcm_t *metamask = (pbkdf2_sha256_aes_gcm_t *) esalt_buf; + const pbkdf2_sha256_aes_gcm_t *metamask = (const pbkdf2_sha256_aes_gcm_t *) esalt_buf; // salt diff --git a/src/modules/module_26700.c b/src/modules/module_26700.c index 050eb196a..a568da5f4 100644 --- a/src/modules/module_26700.c +++ b/src/modules/module_26700.c @@ -170,7 +170,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memset (snmpv3->packet_number, 0, sizeof (snmpv3->packet_number)); - strncpy ((char *) snmpv3->packet_number, (char *) packet_number_pos, packet_number_len); + strncpy ((char *) snmpv3->packet_number, (const char *) packet_number_pos, packet_number_len); // salt @@ -227,19 +227,19 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { const u32 *digest = (const u32 *) digest_buf; - snmpv3_t *snmpv3 = (snmpv3_t *) esalt_buf; + const snmpv3_t *snmpv3 = (const snmpv3_t *) esalt_buf; u8 *out_buf = (u8 *) line_buf; - int out_len = snprintf (line_buf, line_size, "%s%s$", SIGNATURE_SNMPV3, (char *) snmpv3->packet_number); + int out_len = snprintf (line_buf, line_size, "%s%s$", SIGNATURE_SNMPV3, (const char *) snmpv3->packet_number); - out_len += hex_encode ((u8 *) snmpv3->salt_buf, snmpv3->salt_len, out_buf + out_len); + out_len += hex_encode ((const u8 *) snmpv3->salt_buf, snmpv3->salt_len, out_buf + out_len); out_buf[out_len] = '$'; out_len++; - out_len += hex_encode ((u8 *) snmpv3->engineID_buf, snmpv3->engineID_len, out_buf + out_len); + out_len += hex_encode ((const u8 *) snmpv3->engineID_buf, snmpv3->engineID_len, out_buf + out_len); out_buf[out_len] = '$'; diff --git a/src/modules/module_26800.c b/src/modules/module_26800.c index fc43bf17a..152cfc723 100644 --- a/src/modules/module_26800.c +++ b/src/modules/module_26800.c @@ -170,7 +170,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memset (snmpv3->packet_number, 0, sizeof (snmpv3->packet_number)); - strncpy ((char *) snmpv3->packet_number, (char *) packet_number_pos, packet_number_len); + strncpy ((char *) snmpv3->packet_number, (const char *) packet_number_pos, packet_number_len); // salt @@ -231,19 +231,19 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { const u32 *digest = (const u32 *) digest_buf; - snmpv3_t *snmpv3 = (snmpv3_t *) esalt_buf; + const snmpv3_t *snmpv3 = (const snmpv3_t *) esalt_buf; u8 *out_buf = (u8 *) line_buf; - int out_len = snprintf (line_buf, line_size, "%s%s$", SIGNATURE_SNMPV3, (char *) snmpv3->packet_number); + int out_len = snprintf (line_buf, line_size, "%s%s$", SIGNATURE_SNMPV3, (const char *) snmpv3->packet_number); - out_len += hex_encode ((u8 *) snmpv3->salt_buf, snmpv3->salt_len, out_buf + out_len); + out_len += hex_encode ((const u8 *) snmpv3->salt_buf, snmpv3->salt_len, out_buf + out_len); out_buf[out_len] = '$'; out_len++; - out_len += hex_encode ((u8 *) snmpv3->engineID_buf, snmpv3->engineID_len, out_buf + out_len); + out_len += hex_encode ((const u8 *) snmpv3->engineID_buf, snmpv3->engineID_len, out_buf + out_len); out_buf[out_len] = '$'; diff --git a/src/modules/module_26900.c b/src/modules/module_26900.c index 633e9e512..321bcca47 100644 --- a/src/modules/module_26900.c +++ b/src/modules/module_26900.c @@ -210,7 +210,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memset (snmpv3->packet_number, 0, sizeof (snmpv3->packet_number)); - strncpy ((char *) snmpv3->packet_number, (char *) packet_number_pos, packet_number_len); + strncpy ((char *) snmpv3->packet_number, (const char *) packet_number_pos, packet_number_len); // salt @@ -272,13 +272,13 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { const u64 *digest = (const u64 *) digest_buf; - snmpv3_t *snmpv3 = (snmpv3_t *) esalt_buf; + const snmpv3_t *snmpv3 = (const snmpv3_t *) esalt_buf; u8 *out_buf = (u8 *) line_buf; - int out_len = snprintf (line_buf, line_size, "%s%s$", SIGNATURE_SNMPV3, (char *) snmpv3->packet_number); + int out_len = snprintf (line_buf, line_size, "%s%s$", SIGNATURE_SNMPV3, (const char *) snmpv3->packet_number); - out_len += hex_encode ((u8 *) snmpv3->salt_buf, snmpv3->salt_len, out_buf + out_len); + out_len += hex_encode ((const u8 *) snmpv3->salt_buf, snmpv3->salt_len, out_buf + out_len); out_buf[out_len] = '$'; @@ -286,7 +286,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // remove zero padding from snmpv3->engineID_buf - u8 *engineID_buf_tmp = (u8 *) snmpv3->engineID_buf; + const u8 *engineID_buf_tmp = (const u8 *) snmpv3->engineID_buf; u32 engineID_len = snmpv3->engineID_len; @@ -296,7 +296,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // append to output - out_len += hex_encode ((u8 *) snmpv3->engineID_buf, engineID_len, out_buf + out_len); + out_len += hex_encode ((const u8 *) snmpv3->engineID_buf, engineID_len, out_buf + out_len); out_buf[out_len] = '$'; diff --git a/src/modules/module_27000.c b/src/modules/module_27000.c index c9cca63b4..bf5a190bb 100644 --- a/src/modules/module_27000.c +++ b/src/modules/module_27000.c @@ -366,9 +366,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int out_len = 0; - u8 *ptr; - - ptr = (u8 *) netntlm->userdomain_buf; + const u8 *ptr = (const u8 *) netntlm->userdomain_buf; for (int i = 0; i < netntlm->user_len; i += 2) { @@ -387,7 +385,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE out_buf[out_len++] = ':'; - ptr = (u8 *) netntlm->chall_buf; + ptr = (const u8 *) netntlm->chall_buf; for (int i = 0; i < netntlm->srvchall_len; i++) { diff --git a/src/modules/module_27100.c b/src/modules/module_27100.c index 84aaa66d8..b11a961d1 100644 --- a/src/modules/module_27100.c +++ b/src/modules/module_27100.c @@ -212,7 +212,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE digest[3] = hex_to_u32 (hash_pos + 24); /** - * reuse challange data as salt_buf, its the buffer that is most likely unique + * reuse challenge data as salt_buf, its the buffer that is most likely unique */ salt->salt_buf[0] = 0; @@ -265,9 +265,9 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int out_len = 0; - u8 *ptr; + const u8 *ptr; - ptr = (u8 *) netntlm->userdomain_buf; + ptr = (const u8 *) netntlm->userdomain_buf; for (int i = 0; i < netntlm->user_len; i += 2) { @@ -286,7 +286,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE out_buf[out_len++] = ':'; - ptr = (u8 *) netntlm->chall_buf; + ptr = (const u8 *) netntlm->chall_buf; for (int i = 0; i < netntlm->srvchall_len; i++) { diff --git a/src/modules/module_27300.c b/src/modules/module_27300.c index 1512bbbb4..277be0c1a 100644 --- a/src/modules/module_27300.c +++ b/src/modules/module_27300.c @@ -210,7 +210,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memset (snmpv3->packet_number, 0, sizeof (snmpv3->packet_number)); - strncpy ((char *) snmpv3->packet_number, (char *) packet_number_pos, packet_number_len); + strncpy ((char *) snmpv3->packet_number, (const char *) packet_number_pos, packet_number_len); // salt @@ -276,19 +276,19 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { const u64 *digest = (const u64 *) digest_buf; - snmpv3_t *snmpv3 = (snmpv3_t *) esalt_buf; + const snmpv3_t *snmpv3 = (const snmpv3_t *) esalt_buf; u8 *out_buf = (u8 *) line_buf; - int out_len = snprintf (line_buf, line_size, "%s%s$", SIGNATURE_SNMPV3, (char *) snmpv3->packet_number); + int out_len = snprintf (line_buf, line_size, "%s%s$", SIGNATURE_SNMPV3, (const char *) snmpv3->packet_number); - out_len += hex_encode ((u8 *) snmpv3->salt_buf, snmpv3->salt_len, out_buf + out_len); + out_len += hex_encode ((const u8 *) snmpv3->salt_buf, snmpv3->salt_len, out_buf + out_len); out_buf[out_len] = '$'; out_len++; - out_len += hex_encode ((u8 *) snmpv3->engineID_buf, snmpv3->engineID_len, out_buf + out_len); + out_len += hex_encode ((const u8 *) snmpv3->engineID_buf, snmpv3->engineID_len, out_buf + out_len); out_buf[out_len] = '$'; diff --git a/src/modules/module_27400.c b/src/modules/module_27400.c index 3bd35cff5..f0368c6b5 100644 --- a/src/modules/module_27400.c +++ b/src/modules/module_27400.c @@ -136,7 +136,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // salt - u8 *salt_pos = (u8 *) token.buf[2]; + const u8 *salt_pos = token.buf[2]; int salt_len = token.len[2]; salt->salt_buf[0] = hex_to_u32 (salt_pos + 0); @@ -189,7 +189,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vmware_vmx_t *vmware_vmx = (vmware_vmx_t *) esalt_buf; + const vmware_vmx_t *vmware_vmx = (const vmware_vmx_t *) esalt_buf; // salt diff --git a/src/modules/module_27500.c b/src/modules/module_27500.c index 12d576bff..24ea388fd 100644 --- a/src/modules/module_27500.c +++ b/src/modules/module_27500.c @@ -184,14 +184,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 *salt1_buf_ptr = (u32 *) vbox->salt1_buf; - salt1_buf_ptr[0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]); - salt1_buf_ptr[1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]); - salt1_buf_ptr[2] = hex_to_u32 ((const u8 *) &salt1_pos[16]); - salt1_buf_ptr[3] = hex_to_u32 ((const u8 *) &salt1_pos[24]); - salt1_buf_ptr[4] = hex_to_u32 ((const u8 *) &salt1_pos[32]); - salt1_buf_ptr[5] = hex_to_u32 ((const u8 *) &salt1_pos[40]); - salt1_buf_ptr[6] = hex_to_u32 ((const u8 *) &salt1_pos[48]); - salt1_buf_ptr[7] = hex_to_u32 ((const u8 *) &salt1_pos[56]); + salt1_buf_ptr[0] = hex_to_u32 (&salt1_pos[ 0]); + salt1_buf_ptr[1] = hex_to_u32 (&salt1_pos[ 8]); + salt1_buf_ptr[2] = hex_to_u32 (&salt1_pos[16]); + salt1_buf_ptr[3] = hex_to_u32 (&salt1_pos[24]); + salt1_buf_ptr[4] = hex_to_u32 (&salt1_pos[32]); + salt1_buf_ptr[5] = hex_to_u32 (&salt1_pos[40]); + salt1_buf_ptr[6] = hex_to_u32 (&salt1_pos[48]); + salt1_buf_ptr[7] = hex_to_u32 (&salt1_pos[56]); vbox->salt1_len = salt1_len / 2; @@ -228,14 +228,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 *enc_pass_buf_ptr = (u32 *) vbox->enc_pass_buf; - enc_pass_buf_ptr[ 0] = hex_to_u32 ((const u8 *) &enc_pass_pos[ 0]); - enc_pass_buf_ptr[ 1] = hex_to_u32 ((const u8 *) &enc_pass_pos[ 8]); - enc_pass_buf_ptr[ 2] = hex_to_u32 ((const u8 *) &enc_pass_pos[16]); - enc_pass_buf_ptr[ 3] = hex_to_u32 ((const u8 *) &enc_pass_pos[24]); - enc_pass_buf_ptr[ 4] = hex_to_u32 ((const u8 *) &enc_pass_pos[32]); - enc_pass_buf_ptr[ 5] = hex_to_u32 ((const u8 *) &enc_pass_pos[40]); - enc_pass_buf_ptr[ 6] = hex_to_u32 ((const u8 *) &enc_pass_pos[48]); - enc_pass_buf_ptr[ 7] = hex_to_u32 ((const u8 *) &enc_pass_pos[56]); + enc_pass_buf_ptr[ 0] = hex_to_u32 (&enc_pass_pos[ 0]); + enc_pass_buf_ptr[ 1] = hex_to_u32 (&enc_pass_pos[ 8]); + enc_pass_buf_ptr[ 2] = hex_to_u32 (&enc_pass_pos[16]); + enc_pass_buf_ptr[ 3] = hex_to_u32 (&enc_pass_pos[24]); + enc_pass_buf_ptr[ 4] = hex_to_u32 (&enc_pass_pos[32]); + enc_pass_buf_ptr[ 5] = hex_to_u32 (&enc_pass_pos[40]); + enc_pass_buf_ptr[ 6] = hex_to_u32 (&enc_pass_pos[48]); + enc_pass_buf_ptr[ 7] = hex_to_u32 (&enc_pass_pos[56]); // iter 2 @@ -254,14 +254,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 *salt2_buf_ptr = (u32 *) vbox->salt2_buf; - salt2_buf_ptr[0] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]); - salt2_buf_ptr[1] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]); - salt2_buf_ptr[2] = hex_to_u32 ((const u8 *) &salt2_pos[16]); - salt2_buf_ptr[3] = hex_to_u32 ((const u8 *) &salt2_pos[24]); - salt2_buf_ptr[4] = hex_to_u32 ((const u8 *) &salt2_pos[32]); - salt2_buf_ptr[5] = hex_to_u32 ((const u8 *) &salt2_pos[40]); - salt2_buf_ptr[6] = hex_to_u32 ((const u8 *) &salt2_pos[48]); - salt2_buf_ptr[7] = hex_to_u32 ((const u8 *) &salt2_pos[56]); + salt2_buf_ptr[0] = hex_to_u32 (&salt2_pos[ 0]); + salt2_buf_ptr[1] = hex_to_u32 (&salt2_pos[ 8]); + salt2_buf_ptr[2] = hex_to_u32 (&salt2_pos[16]); + salt2_buf_ptr[3] = hex_to_u32 (&salt2_pos[24]); + salt2_buf_ptr[4] = hex_to_u32 (&salt2_pos[32]); + salt2_buf_ptr[5] = hex_to_u32 (&salt2_pos[40]); + salt2_buf_ptr[6] = hex_to_u32 (&salt2_pos[48]); + salt2_buf_ptr[7] = hex_to_u32 (&salt2_pos[56]); vbox->salt2_len = salt2_len / 2; @@ -269,14 +269,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *hash_pos = token.buf[7]; - digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); - digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); - digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); - digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); - digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]); - digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]); - digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]); - digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]); + digest[0] = hex_to_u32 (&hash_pos[ 0]); + digest[1] = hex_to_u32 (&hash_pos[ 8]); + digest[2] = hex_to_u32 (&hash_pos[16]); + digest[3] = hex_to_u32 (&hash_pos[24]); + digest[4] = hex_to_u32 (&hash_pos[32]); + digest[5] = hex_to_u32 (&hash_pos[40]); + digest[6] = hex_to_u32 (&hash_pos[48]); + digest[7] = hex_to_u32 (&hash_pos[56]); digest[0] = byte_swap_32 (digest[0]); digest[1] = byte_swap_32 (digest[1]); diff --git a/src/modules/module_27600.c b/src/modules/module_27600.c index d458cbd8a..4f2feccd7 100644 --- a/src/modules/module_27600.c +++ b/src/modules/module_27600.c @@ -184,14 +184,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 *salt1_buf_ptr = (u32 *) vbox->salt1_buf; - salt1_buf_ptr[0] = hex_to_u32 ((const u8 *) &salt1_pos[ 0]); - salt1_buf_ptr[1] = hex_to_u32 ((const u8 *) &salt1_pos[ 8]); - salt1_buf_ptr[2] = hex_to_u32 ((const u8 *) &salt1_pos[16]); - salt1_buf_ptr[3] = hex_to_u32 ((const u8 *) &salt1_pos[24]); - salt1_buf_ptr[4] = hex_to_u32 ((const u8 *) &salt1_pos[32]); - salt1_buf_ptr[5] = hex_to_u32 ((const u8 *) &salt1_pos[40]); - salt1_buf_ptr[6] = hex_to_u32 ((const u8 *) &salt1_pos[48]); - salt1_buf_ptr[7] = hex_to_u32 ((const u8 *) &salt1_pos[56]); + salt1_buf_ptr[0] = hex_to_u32 (&salt1_pos[ 0]); + salt1_buf_ptr[1] = hex_to_u32 (&salt1_pos[ 8]); + salt1_buf_ptr[2] = hex_to_u32 (&salt1_pos[16]); + salt1_buf_ptr[3] = hex_to_u32 (&salt1_pos[24]); + salt1_buf_ptr[4] = hex_to_u32 (&salt1_pos[32]); + salt1_buf_ptr[5] = hex_to_u32 (&salt1_pos[40]); + salt1_buf_ptr[6] = hex_to_u32 (&salt1_pos[48]); + salt1_buf_ptr[7] = hex_to_u32 (&salt1_pos[56]); vbox->salt1_len = salt1_len / 2; @@ -228,22 +228,22 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 *enc_pass_buf_ptr = (u32 *) vbox->enc_pass_buf; - enc_pass_buf_ptr[ 0] = hex_to_u32 ((const u8 *) &enc_pass_pos[ 0]); - enc_pass_buf_ptr[ 1] = hex_to_u32 ((const u8 *) &enc_pass_pos[ 8]); - enc_pass_buf_ptr[ 2] = hex_to_u32 ((const u8 *) &enc_pass_pos[16]); - enc_pass_buf_ptr[ 3] = hex_to_u32 ((const u8 *) &enc_pass_pos[24]); - enc_pass_buf_ptr[ 4] = hex_to_u32 ((const u8 *) &enc_pass_pos[32]); - enc_pass_buf_ptr[ 5] = hex_to_u32 ((const u8 *) &enc_pass_pos[40]); - enc_pass_buf_ptr[ 6] = hex_to_u32 ((const u8 *) &enc_pass_pos[48]); - enc_pass_buf_ptr[ 7] = hex_to_u32 ((const u8 *) &enc_pass_pos[56]); - enc_pass_buf_ptr[ 8] = hex_to_u32 ((const u8 *) &enc_pass_pos[64]); - enc_pass_buf_ptr[ 9] = hex_to_u32 ((const u8 *) &enc_pass_pos[72]); - enc_pass_buf_ptr[10] = hex_to_u32 ((const u8 *) &enc_pass_pos[80]); - enc_pass_buf_ptr[11] = hex_to_u32 ((const u8 *) &enc_pass_pos[88]); - enc_pass_buf_ptr[12] = hex_to_u32 ((const u8 *) &enc_pass_pos[96]); - enc_pass_buf_ptr[13] = hex_to_u32 ((const u8 *) &enc_pass_pos[104]); - enc_pass_buf_ptr[14] = hex_to_u32 ((const u8 *) &enc_pass_pos[112]); - enc_pass_buf_ptr[15] = hex_to_u32 ((const u8 *) &enc_pass_pos[120]); + enc_pass_buf_ptr[ 0] = hex_to_u32 (&enc_pass_pos[ 0]); + enc_pass_buf_ptr[ 1] = hex_to_u32 (&enc_pass_pos[ 8]); + enc_pass_buf_ptr[ 2] = hex_to_u32 (&enc_pass_pos[16]); + enc_pass_buf_ptr[ 3] = hex_to_u32 (&enc_pass_pos[24]); + enc_pass_buf_ptr[ 4] = hex_to_u32 (&enc_pass_pos[32]); + enc_pass_buf_ptr[ 5] = hex_to_u32 (&enc_pass_pos[40]); + enc_pass_buf_ptr[ 6] = hex_to_u32 (&enc_pass_pos[48]); + enc_pass_buf_ptr[ 7] = hex_to_u32 (&enc_pass_pos[56]); + enc_pass_buf_ptr[ 8] = hex_to_u32 (&enc_pass_pos[64]); + enc_pass_buf_ptr[ 9] = hex_to_u32 (&enc_pass_pos[72]); + enc_pass_buf_ptr[10] = hex_to_u32 (&enc_pass_pos[80]); + enc_pass_buf_ptr[11] = hex_to_u32 (&enc_pass_pos[88]); + enc_pass_buf_ptr[12] = hex_to_u32 (&enc_pass_pos[96]); + enc_pass_buf_ptr[13] = hex_to_u32 (&enc_pass_pos[104]); + enc_pass_buf_ptr[14] = hex_to_u32 (&enc_pass_pos[112]); + enc_pass_buf_ptr[15] = hex_to_u32 (&enc_pass_pos[120]); // iter 2 @@ -262,14 +262,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 *salt2_buf_ptr = (u32 *) vbox->salt2_buf; - salt2_buf_ptr[0] = hex_to_u32 ((const u8 *) &salt2_pos[ 0]); - salt2_buf_ptr[1] = hex_to_u32 ((const u8 *) &salt2_pos[ 8]); - salt2_buf_ptr[2] = hex_to_u32 ((const u8 *) &salt2_pos[16]); - salt2_buf_ptr[3] = hex_to_u32 ((const u8 *) &salt2_pos[24]); - salt2_buf_ptr[4] = hex_to_u32 ((const u8 *) &salt2_pos[32]); - salt2_buf_ptr[5] = hex_to_u32 ((const u8 *) &salt2_pos[40]); - salt2_buf_ptr[6] = hex_to_u32 ((const u8 *) &salt2_pos[48]); - salt2_buf_ptr[7] = hex_to_u32 ((const u8 *) &salt2_pos[56]); + salt2_buf_ptr[0] = hex_to_u32 (&salt2_pos[ 0]); + salt2_buf_ptr[1] = hex_to_u32 (&salt2_pos[ 8]); + salt2_buf_ptr[2] = hex_to_u32 (&salt2_pos[16]); + salt2_buf_ptr[3] = hex_to_u32 (&salt2_pos[24]); + salt2_buf_ptr[4] = hex_to_u32 (&salt2_pos[32]); + salt2_buf_ptr[5] = hex_to_u32 (&salt2_pos[40]); + salt2_buf_ptr[6] = hex_to_u32 (&salt2_pos[48]); + salt2_buf_ptr[7] = hex_to_u32 (&salt2_pos[56]); vbox->salt2_len = salt2_len / 2; @@ -277,14 +277,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *hash_pos = token.buf[7]; - digest[0] = hex_to_u32 ((const u8 *) &hash_pos[ 0]); - digest[1] = hex_to_u32 ((const u8 *) &hash_pos[ 8]); - digest[2] = hex_to_u32 ((const u8 *) &hash_pos[16]); - digest[3] = hex_to_u32 ((const u8 *) &hash_pos[24]); - digest[4] = hex_to_u32 ((const u8 *) &hash_pos[32]); - digest[5] = hex_to_u32 ((const u8 *) &hash_pos[40]); - digest[6] = hex_to_u32 ((const u8 *) &hash_pos[48]); - digest[7] = hex_to_u32 ((const u8 *) &hash_pos[56]); + digest[0] = hex_to_u32 (&hash_pos[ 0]); + digest[1] = hex_to_u32 (&hash_pos[ 8]); + digest[2] = hex_to_u32 (&hash_pos[16]); + digest[3] = hex_to_u32 (&hash_pos[24]); + digest[4] = hex_to_u32 (&hash_pos[32]); + digest[5] = hex_to_u32 (&hash_pos[40]); + digest[6] = hex_to_u32 (&hash_pos[48]); + digest[7] = hex_to_u32 (&hash_pos[56]); digest[0] = byte_swap_32 (digest[0]); digest[1] = byte_swap_32 (digest[1]); diff --git a/src/modules/module_27800.c b/src/modules/module_27800.c index 4aefff85a..f5bf82a46 100644 --- a/src/modules/module_27800.c +++ b/src/modules/module_27800.c @@ -84,7 +84,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *hash_pos = token.buf[0]; - digest[0] = hex_to_u32 ((const u8 *) &hash_pos[0]); + digest[0] = hex_to_u32 (&hash_pos[0]); digest[1] = 0; digest[2] = 0; digest[3] = 0; @@ -96,7 +96,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *salt_pos = token.buf[1]; const int salt_len = token.len[1]; - salt->salt_buf[0] = hex_to_u32 ((const u8 *) &salt_pos[0]); + salt->salt_buf[0] = hex_to_u32 (&salt_pos[0]); salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]); diff --git a/src/modules/module_28000.c b/src/modules/module_28000.c index 653e6dddf..90cf643ce 100644 --- a/src/modules/module_28000.c +++ b/src/modules/module_28000.c @@ -108,7 +108,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { const u64 *digest = (const u64 *) digest_buf; - crc64_t *crc64 = (crc64_t *) esalt_buf; + const crc64_t *crc64 = (const crc64_t *) esalt_buf; u8 *out_buf = (u8 *) line_buf; diff --git a/src/modules/module_28100.c b/src/modules/module_28100.c index c315a2c97..88e8b7e74 100644 --- a/src/modules/module_28100.c +++ b/src/modules/module_28100.c @@ -277,7 +277,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE winhello->mk_buf_pc[6] = 0; winhello->mk_buf_pc[7] = 0; - // yes we can precompute the first block of both sha512 here, because length is 128 + hmac lenght + magic length, but + // yes we can precompute the first block of both sha512 here, because length is 128 + hmac length + magic length, but // speed improvement is negligible, but readability would drop a lot return (PARSER_OK); diff --git a/src/modules/module_28200.c b/src/modules/module_28200.c index 4eaf61bc6..dd3ce7998 100644 --- a/src/modules/module_28200.c +++ b/src/modules/module_28200.c @@ -362,7 +362,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memset (tmp_buf, 0, sizeof (tmp_buf)); - tmp_len = base64_decode (base64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf); + tmp_len = base64_decode (base64_to_int, salt_pos, salt_len, tmp_buf); memcpy (salt->salt_buf, tmp_buf, tmp_len); @@ -377,7 +377,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memset (tmp_buf, 0, sizeof (tmp_buf)); - tmp_len = base64_decode (base64_to_int, (const u8 *) iv_pos, iv_len, tmp_buf); + tmp_len = base64_decode (base64_to_int, iv_pos, iv_len, tmp_buf); memcpy (exodus->iv, tmp_buf, tmp_len); @@ -390,7 +390,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memset (tmp_buf, 0, sizeof (tmp_buf)); - tmp_len = base64_decode (base64_to_int, (const u8 *) data_pos, data_len, tmp_buf); + tmp_len = base64_decode (base64_to_int, data_pos, data_len, tmp_buf); memcpy (exodus->data, tmp_buf, tmp_len); @@ -403,7 +403,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memset (tmp_buf, 0, sizeof (tmp_buf)); - tmp_len = base64_decode (base64_to_int, (const u8 *) tag_pos, tag_len, tmp_buf); + tmp_len = base64_decode (base64_to_int, tag_pos, tag_len, tmp_buf); memcpy (exodus->tag, tmp_buf, tmp_len); diff --git a/src/modules/module_28400.c b/src/modules/module_28400.c index dbeba6126..fdb164cee 100644 --- a/src/modules/module_28400.c +++ b/src/modules/module_28400.c @@ -220,7 +220,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memset (tmp_buf, 0, sizeof (tmp_buf)); - base64_decode (bf64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf); + base64_decode (bf64_to_int, salt_pos, salt_len, tmp_buf); memcpy (salt_buf_ptr, tmp_buf, 16); @@ -231,7 +231,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memset (tmp_buf, 0, sizeof (tmp_buf)); - base64_decode (bf64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf); + base64_decode (bf64_to_int, hash_pos, hash_len, tmp_buf); memcpy (digest, tmp_buf, 24); @@ -274,7 +274,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE tmp_buf[22 + 31] = 0; // base64_encode wants to pad - return snprintf (line_buf, line_size, "%s$%s", (char *) salt->salt_sign, tmp_buf); + return snprintf (line_buf, line_size, "%s$%s", (const char *) salt->salt_sign, tmp_buf); } void module_init (module_ctx_t *module_ctx) diff --git a/src/modules/module_28501.c b/src/modules/module_28501.c index 8692e05e6..954590b15 100644 --- a/src/modules/module_28501.c +++ b/src/modules/module_28501.c @@ -84,7 +84,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 pubkey_len = PUBKEY_MAXLEN; - bool res = b58dec (pubkey, &pubkey_len, (u8 *) line_buf, line_len); + bool res = b58dec (pubkey, &pubkey_len, (const u8 *) line_buf, line_len); if (res == false) return (PARSER_HASH_LENGTH); @@ -123,7 +123,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - u8 *digest = (u8 *) digest_buf; + const u8 *digest = (const u8 *) digest_buf; u8 buf[64] = { 0 }; diff --git a/src/modules/module_28502.c b/src/modules/module_28502.c index daafa9be3..3b910d9bf 100644 --- a/src/modules/module_28502.c +++ b/src/modules/module_28502.c @@ -84,7 +84,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 pubkey_len = PUBKEY_MAXLEN; - bool res = b58dec (pubkey, &pubkey_len, (u8 *) line_buf, line_len); + bool res = b58dec (pubkey, &pubkey_len, (const u8 *) line_buf, line_len); if (res == false) return (PARSER_HASH_LENGTH); @@ -123,7 +123,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - u8 *digest = (u8 *) digest_buf; + const u8 *digest = (const u8 *) digest_buf; u8 buf[64] = { 0 }; diff --git a/src/modules/module_28503.c b/src/modules/module_28503.c index 696bbf2d8..53838e7e5 100644 --- a/src/modules/module_28503.c +++ b/src/modules/module_28503.c @@ -212,7 +212,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // note: here we work mostly with char/u8 type because it's easier to base32 encode // (at least conceptually), but this could be easily extended to u32 variable types: - u8 *digest = (u8 *) digest_buf; + const u8 *digest = (const u8 *) digest_buf; u8 b[20] = { 0 }; diff --git a/src/modules/module_28504.c b/src/modules/module_28504.c index 93e35784c..35539c49f 100644 --- a/src/modules/module_28504.c +++ b/src/modules/module_28504.c @@ -212,7 +212,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // note: here we work mostly with char/u8 type because it's easier to base32 encode // (at least conceptually), but this could be easily extended to u32 variable types: - u8 *digest = (u8 *) digest_buf; + const u8 *digest = (const u8 *) digest_buf; u8 b[20] = { 0 }; diff --git a/src/modules/module_28505.c b/src/modules/module_28505.c index 133bf1e43..7c9ae9090 100644 --- a/src/modules/module_28505.c +++ b/src/modules/module_28505.c @@ -83,7 +83,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 pubkey_len = PUBKEY_MAXLEN; - bool res = b58dec (pubkey, &pubkey_len, (u8 *) line_buf, line_len); + bool res = b58dec (pubkey, &pubkey_len, (const u8 *) line_buf, line_len); if (res == false) return (PARSER_HASH_LENGTH); @@ -122,7 +122,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - u8 *digest = (u8 *) digest_buf; + const u8 *digest = (const u8 *) digest_buf; u8 buf[64] = { 0 }; diff --git a/src/modules/module_28506.c b/src/modules/module_28506.c index 296122758..7aac998d4 100644 --- a/src/modules/module_28506.c +++ b/src/modules/module_28506.c @@ -83,7 +83,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 pubkey_len = PUBKEY_MAXLEN; - bool res = b58dec (pubkey, &pubkey_len, (u8 *) line_buf, line_len); + bool res = b58dec (pubkey, &pubkey_len, (const u8 *) line_buf, line_len); if (res == false) return (PARSER_HASH_LENGTH); @@ -122,7 +122,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - u8 *digest = (u8 *) digest_buf; + const u8 *digest = (const u8 *) digest_buf; u8 buf[64] = { 0 }; diff --git a/src/modules/module_28600.c b/src/modules/module_28600.c index e152e8dc8..b77869507 100644 --- a/src/modules/module_28600.c +++ b/src/modules/module_28600.c @@ -268,9 +268,9 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - u32 *digest = (u32 *) digest_buf; + const u32 *digest = (const u32 *) digest_buf; - postgres_sha256_t *postgres_sha256 = (postgres_sha256_t *) esalt_buf; + const postgres_sha256_t *postgres_sha256 = (const postgres_sha256_t *) esalt_buf; // salt @@ -310,7 +310,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u8 stored_key_bin[100] = { 0 }; - memcpy (stored_key_bin, (char *) postgres_sha256->storedKey, postgres_sha256->storedKey_len); + memcpy (stored_key_bin, (const char *) postgres_sha256->storedKey, postgres_sha256->storedKey_len); u8 stored_key_base64[64] = { 0 }; diff --git a/src/modules/module_28700.c b/src/modules/module_28700.c index e86ccb448..4bf938a0f 100644 --- a/src/modules/module_28700.c +++ b/src/modules/module_28700.c @@ -81,7 +81,7 @@ u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED con u32 pw_max = PW_MAX - 4; - if (user_options->optimized_kernel_enable == true && hashconfig->has_optimized_kernel == true) + if (user_options->optimized_kernel == true && hashconfig->has_optimized_kernel == true) { pw_max = PW_MAX_OLD - 4; } @@ -155,7 +155,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // date - parse_rc = generic_salt_decode (hashconfig, (u8 *) longdate_pos, 8, (u8 *) esalt->date, (int *) &esalt->date_len); + parse_rc = generic_salt_decode (hashconfig, longdate_pos, 8, (u8 *) esalt->date, (int *) &esalt->date_len); if (parse_rc == false) return (PARSER_SALT_LENGTH); @@ -242,7 +242,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE stringtosign_ptr[off] = 0x0a; off += 1; - memcpy (stringtosign_ptr + off, (char *) canonical_pos, canonical_len); + memcpy (stringtosign_ptr + off, (const char *) canonical_pos, canonical_len); off += canonical_len; esalt->stringtosign_len = off; @@ -276,7 +276,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { const u32 *digest = (const u32 *) digest_buf; - aws4_sig_v4_t *esalt = (aws4_sig_v4_t *) esalt_buf; + const aws4_sig_v4_t *esalt = (const aws4_sig_v4_t *) esalt_buf; u8 *out_buf = (u8 *) line_buf; @@ -310,7 +310,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // canonical - out_len += hex_encode ((u8 *) esalt->canonical, esalt->canonical_len, out_buf + out_len); + out_len += hex_encode ((const u8 *) esalt->canonical, esalt->canonical_len, out_buf + out_len); out_buf[out_len] = '$'; diff --git a/src/modules/module_28800.c b/src/modules/module_28800.c index d34c860e5..a1fe7825d 100644 --- a/src/modules/module_28800.c +++ b/src/modules/module_28800.c @@ -116,7 +116,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // assume no signature found if (line_len < 11) return (PARSER_SALT_LENGTH); - char *spn_info_start = strchr ((const char *) line_buf + 11 + 1, '*'); + char *spn_info_start = strchr (line_buf + 11 + 1, '*'); int is_spn_provided = 0; @@ -244,8 +244,8 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const int line_len = snprintf (line_buf, line_size, "%s%s$%s$%08x%08x%08x%08x", SIGNATURE_KRB5DB, - (char *) krb5db->user, - (char *) krb5db->domain, + (const char *) krb5db->user, + (const char *) krb5db->domain, digest[0], digest[1], digest[2], diff --git a/src/modules/module_28900.c b/src/modules/module_28900.c index 929e09a04..d0805d085 100644 --- a/src/modules/module_28900.c +++ b/src/modules/module_28900.c @@ -116,7 +116,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // assume no signature found if (line_len < 11) return (PARSER_SALT_LENGTH); - char *spn_info_start = strchr ((const char *) line_buf + 11 + 1, '*'); + char *spn_info_start = strchr (line_buf + 11 + 1, '*'); int is_spn_provided = 0; @@ -249,8 +249,8 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const int line_len = snprintf (line_buf, line_size, "%s%s$%s$%08x%08x%08x%08x%08x%08x%08x%08x", SIGNATURE_KRB5DB, - (char *) krb5db->user, - (char *) krb5db->domain, + (const char *) krb5db->user, + (const char *) krb5db->domain, digest[0], digest[1], digest[2], diff --git a/src/modules/module_29000.c b/src/modules/module_29000.c index 175d2c0a5..7e9682cf4 100644 --- a/src/modules/module_29000.c +++ b/src/modules/module_29000.c @@ -17,7 +17,7 @@ static const u32 DGST_POS1 = 4; static const u32 DGST_POS2 = 2; static const u32 DGST_POS3 = 1; static const u32 DGST_SIZE = DGST_SIZE_4_5; -static const u32 HASH_CATEGORY = HASH_CATEGORY_OS; +static const u32 HASH_CATEGORY = HASH_CATEGORY_RAW_HASH_SALTED; static const char *HASH_NAME = "sha1($salt.sha1(utf16le($username).':'.utf16le($pass)))"; static const u64 KERN_TYPE = 29000; static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE @@ -122,11 +122,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE digest[4] -= SHA1M_E; } - const bool parse_rc1 = generic_salt_decode (hashconfig, token.buf[1], token.len[1], (u8 *) sha1_double_salt->salt1_buf, (int *) &sha1_double_salt->salt1_len); + const bool parse_rc1 = generic_salt_decode (hashconfig, token.buf[1], token.len[1], (u8 *) sha1_double_salt->salt1_buf, &sha1_double_salt->salt1_len); if (parse_rc1 == false) return (PARSER_SALT_LENGTH); - const bool parse_rc2 = generic_salt_decode (hashconfig, token.buf[2], token.len[2], (u8 *) sha1_double_salt->salt2_buf, (int *) &sha1_double_salt->salt2_len); + const bool parse_rc2 = generic_salt_decode (hashconfig, token.buf[2], token.len[2], (u8 *) sha1_double_salt->salt2_buf, &sha1_double_salt->salt2_len); if (parse_rc2 == false) return (PARSER_SALT_LENGTH); @@ -195,13 +195,13 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE out_len += 1; - out_len += generic_salt_encode (hashconfig, (const u8 *) sha1_double_salt->salt1_buf, (const int) sha1_double_salt->salt1_len, out_buf + out_len); + out_len += generic_salt_encode (hashconfig, (const u8 *) sha1_double_salt->salt1_buf, sha1_double_salt->salt1_len, out_buf + out_len); out_buf[out_len] = hashconfig->separator; out_len += 1; - out_len += generic_salt_encode (hashconfig, (const u8 *) sha1_double_salt->salt2_buf, (const int) sha1_double_salt->salt2_len, out_buf + out_len); + out_len += generic_salt_encode (hashconfig, (const u8 *) sha1_double_salt->salt2_buf, sha1_double_salt->salt2_len, out_buf + out_len); return out_len; } diff --git a/src/modules/module_29100.c b/src/modules/module_29100.c index b0db0f42f..437cfcb89 100644 --- a/src/modules/module_29100.c +++ b/src/modules/module_29100.c @@ -64,7 +64,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE token.sep[0] = '.'; token.len_min[0] = 0; - token.len_max[0] = 56; + token.len_max[0] = 120; token.attr[0] = TOKEN_ATTR_VERIFY_LENGTH | TOKEN_ATTR_VERIFY_BASE64C; @@ -96,6 +96,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE if (parse_rc == false) return (PARSER_SALT_LENGTH); memcpy (salt->salt_buf, line_buf, salt_len); + salt->salt_buf[salt_len] = '\0'; u8 tmp_buf[100] = { 0 }; @@ -120,8 +121,6 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { const u32 *digest32 = (const u32 *) digest_buf; - char tmp_buf[128] = { 0 }; - char ptr_plain[128]; u32 tmp[5]; @@ -132,13 +131,11 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE tmp[3] = byte_swap_32 (digest32[3]); tmp[4] = byte_swap_32 (digest32[4]); - memcpy (tmp_buf, tmp, 20); - - base64_encode (int_to_base64url, (const u8 *) tmp_buf, 48, (u8 *) ptr_plain); + base64_encode (int_to_base64url, (const u8 *) tmp, 20, (u8 *) ptr_plain); ptr_plain[27] = 0; - const int line_len = snprintf (line_buf, line_size, "%s.%s", (char *) salt->salt_buf, (char *) ptr_plain); + const int line_len = snprintf (line_buf, line_size, "%s.%s", (const char *) salt->salt_buf, (const char *) ptr_plain); return line_len; } diff --git a/src/modules/module_29200.c b/src/modules/module_29200.c index 9a9d95c03..5c57ca970 100644 --- a/src/modules/module_29200.c +++ b/src/modules/module_29200.c @@ -192,7 +192,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - radmin3_t *esalt = (radmin3_t *) esalt_buf; + const radmin3_t *esalt = (const radmin3_t *) esalt_buf; u8 *out_buf = (u8 *) line_buf; diff --git a/src/modules/module_29311.c b/src/modules/module_29311.c index b6603ad73..0f976ee8d 100644 --- a/src/modules/module_29311.c +++ b/src/modules/module_29311.c @@ -228,7 +228,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - tc_t *tc = (tc_t *) esalt_buf; + const tc_t *tc = (const tc_t *) esalt_buf; // salt diff --git a/src/modules/module_29312.c b/src/modules/module_29312.c index 6d8bfe643..31e5dba33 100644 --- a/src/modules/module_29312.c +++ b/src/modules/module_29312.c @@ -228,7 +228,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - tc_t *tc = (tc_t *) esalt_buf; + const tc_t *tc = (const tc_t *) esalt_buf; // salt diff --git a/src/modules/module_29313.c b/src/modules/module_29313.c index 064ef2c46..eadca3d08 100644 --- a/src/modules/module_29313.c +++ b/src/modules/module_29313.c @@ -228,7 +228,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - tc_t *tc = (tc_t *) esalt_buf; + const tc_t *tc = (const tc_t *) esalt_buf; // salt diff --git a/src/modules/module_29321.c b/src/modules/module_29321.c index c443ce2a3..ac5e1bf4f 100644 --- a/src/modules/module_29321.c +++ b/src/modules/module_29321.c @@ -229,7 +229,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - tc_t *tc = (tc_t *) esalt_buf; + const tc_t *tc = (const tc_t *) esalt_buf; // salt diff --git a/src/modules/module_29322.c b/src/modules/module_29322.c index 0dad95126..4322666c9 100644 --- a/src/modules/module_29322.c +++ b/src/modules/module_29322.c @@ -229,7 +229,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - tc_t *tc = (tc_t *) esalt_buf; + const tc_t *tc = (const tc_t *) esalt_buf; // salt diff --git a/src/modules/module_29323.c b/src/modules/module_29323.c index 1186809af..63c016358 100644 --- a/src/modules/module_29323.c +++ b/src/modules/module_29323.c @@ -229,7 +229,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - tc_t *tc = (tc_t *) esalt_buf; + const tc_t *tc = (const tc_t *) esalt_buf; // salt diff --git a/src/modules/module_29331.c b/src/modules/module_29331.c index 00f89b10c..52eefad8f 100644 --- a/src/modules/module_29331.c +++ b/src/modules/module_29331.c @@ -214,7 +214,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - tc_t *tc = (tc_t *) esalt_buf; + const tc_t *tc = (const tc_t *) esalt_buf; // salt diff --git a/src/modules/module_29332.c b/src/modules/module_29332.c index aea7fb0a5..2bb2c57ae 100644 --- a/src/modules/module_29332.c +++ b/src/modules/module_29332.c @@ -214,7 +214,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - tc_t *tc = (tc_t *) esalt_buf; + const tc_t *tc = (const tc_t *) esalt_buf; // salt diff --git a/src/modules/module_29333.c b/src/modules/module_29333.c index cd3c4ac05..427dda7c4 100644 --- a/src/modules/module_29333.c +++ b/src/modules/module_29333.c @@ -214,7 +214,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - tc_t *tc = (tc_t *) esalt_buf; + const tc_t *tc = (const tc_t *) esalt_buf; // salt diff --git a/src/modules/module_29341.c b/src/modules/module_29341.c index 01e0947aa..9b2a472ef 100644 --- a/src/modules/module_29341.c +++ b/src/modules/module_29341.c @@ -241,7 +241,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - tc_t *tc = (tc_t *) esalt_buf; + const tc_t *tc = (const tc_t *) esalt_buf; // salt diff --git a/src/modules/module_29342.c b/src/modules/module_29342.c index cf6f6abf2..56ec1bc84 100644 --- a/src/modules/module_29342.c +++ b/src/modules/module_29342.c @@ -241,7 +241,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - tc_t *tc = (tc_t *) esalt_buf; + const tc_t *tc = (const tc_t *) esalt_buf; // salt diff --git a/src/modules/module_29343.c b/src/modules/module_29343.c index 6ed61b839..5bd5f6823 100644 --- a/src/modules/module_29343.c +++ b/src/modules/module_29343.c @@ -241,7 +241,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - tc_t *tc = (tc_t *) esalt_buf; + const tc_t *tc = (const tc_t *) esalt_buf; // salt diff --git a/src/modules/module_29411.c b/src/modules/module_29411.c index e0695a5a0..434ebd06d 100644 --- a/src/modules/module_29411.c +++ b/src/modules/module_29411.c @@ -106,11 +106,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc_tmp->pim - 15); } } @@ -280,7 +280,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29412.c b/src/modules/module_29412.c index cf5e403b8..ecb9e4706 100644 --- a/src/modules/module_29412.c +++ b/src/modules/module_29412.c @@ -106,11 +106,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc_tmp->pim - 15); } } @@ -280,7 +280,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29413.c b/src/modules/module_29413.c index f8ea19758..295807e18 100644 --- a/src/modules/module_29413.c +++ b/src/modules/module_29413.c @@ -106,11 +106,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc_tmp->pim - 15); } } @@ -280,7 +280,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29421.c b/src/modules/module_29421.c index 69d86b307..c75184e77 100644 --- a/src/modules/module_29421.c +++ b/src/modules/module_29421.c @@ -29,6 +29,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_LOOP_EXTENDED | OPTS_TYPE_MP_MULTI_DISABLE + | OPTS_TYPE_KEYBOARD_MAPPING | OPTS_TYPE_COPY_TMPS; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; @@ -116,11 +117,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc64_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc64_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc64_tmp->pim - 15); } } @@ -290,7 +291,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29422.c b/src/modules/module_29422.c index 8099b8998..1e307a2fd 100644 --- a/src/modules/module_29422.c +++ b/src/modules/module_29422.c @@ -29,6 +29,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_LOOP_EXTENDED | OPTS_TYPE_MP_MULTI_DISABLE + | OPTS_TYPE_KEYBOARD_MAPPING | OPTS_TYPE_COPY_TMPS; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; @@ -116,11 +117,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc64_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc64_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc64_tmp->pim - 15); } } @@ -290,7 +291,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29423.c b/src/modules/module_29423.c index afaa1b147..fce68cc36 100644 --- a/src/modules/module_29423.c +++ b/src/modules/module_29423.c @@ -29,6 +29,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE | OPTS_TYPE_LOOP_EXTENDED | OPTS_TYPE_MP_MULTI_DISABLE + | OPTS_TYPE_KEYBOARD_MAPPING | OPTS_TYPE_COPY_TMPS; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat"; @@ -116,11 +117,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc64_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc64_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc64_tmp->pim - 15); } } @@ -290,7 +291,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29431.c b/src/modules/module_29431.c index a48035fc5..d98fce4dd 100644 --- a/src/modules/module_29431.c +++ b/src/modules/module_29431.c @@ -93,11 +93,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc_tmp->pim - 15); } } @@ -267,7 +267,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29432.c b/src/modules/module_29432.c index a3ace917a..8bdb26a99 100644 --- a/src/modules/module_29432.c +++ b/src/modules/module_29432.c @@ -93,11 +93,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc_tmp->pim - 15); } } @@ -267,7 +267,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29433.c b/src/modules/module_29433.c index 9ea966525..16d39fa1c 100644 --- a/src/modules/module_29433.c +++ b/src/modules/module_29433.c @@ -107,11 +107,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc_tmp->pim - 15); } } @@ -281,7 +281,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29441.c b/src/modules/module_29441.c index 65a34b8c3..44db4ff81 100644 --- a/src/modules/module_29441.c +++ b/src/modules/module_29441.c @@ -282,7 +282,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29442.c b/src/modules/module_29442.c index 2e688d499..d47c16b3f 100644 --- a/src/modules/module_29442.c +++ b/src/modules/module_29442.c @@ -282,7 +282,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29443.c b/src/modules/module_29443.c index 124bac2e6..bc09e12f0 100644 --- a/src/modules/module_29443.c +++ b/src/modules/module_29443.c @@ -282,7 +282,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29451.c b/src/modules/module_29451.c index e2cfc368c..01a955fa4 100644 --- a/src/modules/module_29451.c +++ b/src/modules/module_29451.c @@ -125,11 +125,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc_tmp->pim - 15); } } @@ -299,7 +299,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29452.c b/src/modules/module_29452.c index 39c826da1..b77ff6145 100644 --- a/src/modules/module_29452.c +++ b/src/modules/module_29452.c @@ -125,11 +125,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc_tmp->pim - 15); } } @@ -299,7 +299,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29453.c b/src/modules/module_29453.c index e5bbe5d9e..171c61373 100644 --- a/src/modules/module_29453.c +++ b/src/modules/module_29453.c @@ -125,11 +125,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc_tmp->pim - 15); } } @@ -299,7 +299,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29461.c b/src/modules/module_29461.c index 0489a8e6b..301d2dada 100644 --- a/src/modules/module_29461.c +++ b/src/modules/module_29461.c @@ -301,7 +301,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29462.c b/src/modules/module_29462.c index 329eee24b..409384d8e 100644 --- a/src/modules/module_29462.c +++ b/src/modules/module_29462.c @@ -301,7 +301,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29463.c b/src/modules/module_29463.c index 2b61a3e43..d1dcd3d80 100644 --- a/src/modules/module_29463.c +++ b/src/modules/module_29463.c @@ -301,7 +301,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29471.c b/src/modules/module_29471.c index 2fa8e247d..4b1852559 100644 --- a/src/modules/module_29471.c +++ b/src/modules/module_29471.c @@ -116,11 +116,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc64_sbog_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc64_sbog_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc64_sbog_tmp->pim - 15); } } @@ -290,7 +290,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29472.c b/src/modules/module_29472.c index 7fc95a2d9..8a7a20d15 100644 --- a/src/modules/module_29472.c +++ b/src/modules/module_29472.c @@ -116,11 +116,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc64_sbog_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc64_sbog_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc64_sbog_tmp->pim - 15); } } @@ -290,7 +290,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29473.c b/src/modules/module_29473.c index 1b8a7d6e4..4e2345011 100644 --- a/src/modules/module_29473.c +++ b/src/modules/module_29473.c @@ -122,11 +122,11 @@ int module_build_plain_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, if (vc64_sbog_tmp->pim == 0) { - return snprintf ((char *) dst_buf, dst_sz, "%s", (char *) src_buf); + return snprintf ((char *) dst_buf, dst_sz, "%s", (const char *) src_buf); } else { - return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (char *) src_buf, vc64_sbog_tmp->pim - 15); + return snprintf ((char *) dst_buf, dst_sz, "%s (PIM=%d)", (const char *) src_buf, vc64_sbog_tmp->pim - 15); } } @@ -296,7 +296,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29481.c b/src/modules/module_29481.c index 3cf55a275..55d0b84c6 100644 --- a/src/modules/module_29481.c +++ b/src/modules/module_29481.c @@ -292,7 +292,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29482.c b/src/modules/module_29482.c index aece087db..6e784d9a6 100644 --- a/src/modules/module_29482.c +++ b/src/modules/module_29482.c @@ -292,7 +292,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29483.c b/src/modules/module_29483.c index d958e5424..c6162d306 100644 --- a/src/modules/module_29483.c +++ b/src/modules/module_29483.c @@ -292,7 +292,7 @@ int module_hash_decode_postprocess (MAYBE_UNUSED const hashconfig_t *hashconfig, int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - vc_t *vc = (vc_t *) esalt_buf; + const vc_t *vc = (const vc_t *) esalt_buf; // salt diff --git a/src/modules/module_29511.c b/src/modules/module_29511.c index 673f1833c..0f1d38566 100644 --- a/src/modules/module_29511.c +++ b/src/modules/module_29511.c @@ -305,11 +305,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - luks_t *luks = (luks_t *) esalt_buf; + const luks_t *luks = (const luks_t *) esalt_buf; // cipher mode - char *cipher_mode = ""; + const char *cipher_mode = ""; switch (luks->cipher_mode) { diff --git a/src/modules/module_29512.c b/src/modules/module_29512.c index 0079abd74..09f04ccca 100644 --- a/src/modules/module_29512.c +++ b/src/modules/module_29512.c @@ -305,11 +305,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - luks_t *luks = (luks_t *) esalt_buf; + const luks_t *luks = (const luks_t *) esalt_buf; // cipher mode - char *cipher_mode = ""; + const char *cipher_mode = ""; switch (luks->cipher_mode) { diff --git a/src/modules/module_29513.c b/src/modules/module_29513.c index 20fb7620b..8680d3665 100644 --- a/src/modules/module_29513.c +++ b/src/modules/module_29513.c @@ -305,11 +305,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - luks_t *luks = (luks_t *) esalt_buf; + const luks_t *luks = (const luks_t *) esalt_buf; // cipher mode - char *cipher_mode = ""; + const char *cipher_mode = ""; switch (luks->cipher_mode) { diff --git a/src/modules/module_29521.c b/src/modules/module_29521.c index 43ba8a537..ce1978bfd 100644 --- a/src/modules/module_29521.c +++ b/src/modules/module_29521.c @@ -305,11 +305,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - luks_t *luks = (luks_t *) esalt_buf; + const luks_t *luks = (const luks_t *) esalt_buf; // cipher mode - char *cipher_mode = ""; + const char *cipher_mode = ""; switch (luks->cipher_mode) { diff --git a/src/modules/module_29522.c b/src/modules/module_29522.c index cc940ef1b..0466cfca4 100644 --- a/src/modules/module_29522.c +++ b/src/modules/module_29522.c @@ -305,11 +305,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - luks_t *luks = (luks_t *) esalt_buf; + const luks_t *luks = (const luks_t *) esalt_buf; // cipher mode - char *cipher_mode = ""; + const char *cipher_mode = ""; switch (luks->cipher_mode) { diff --git a/src/modules/module_29523.c b/src/modules/module_29523.c index 7d7c17ae9..a88e54de4 100644 --- a/src/modules/module_29523.c +++ b/src/modules/module_29523.c @@ -305,11 +305,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - luks_t *luks = (luks_t *) esalt_buf; + const luks_t *luks = (const luks_t *) esalt_buf; // cipher mode - char *cipher_mode = ""; + const char *cipher_mode = ""; switch (luks->cipher_mode) { diff --git a/src/modules/module_29531.c b/src/modules/module_29531.c index bc175f9b0..1a604a96e 100644 --- a/src/modules/module_29531.c +++ b/src/modules/module_29531.c @@ -305,11 +305,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - luks_t *luks = (luks_t *) esalt_buf; + const luks_t *luks = (const luks_t *) esalt_buf; // cipher mode - char *cipher_mode = ""; + const char *cipher_mode = ""; switch (luks->cipher_mode) { diff --git a/src/modules/module_29532.c b/src/modules/module_29532.c index fc864498b..7650b9457 100644 --- a/src/modules/module_29532.c +++ b/src/modules/module_29532.c @@ -305,11 +305,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - luks_t *luks = (luks_t *) esalt_buf; + const luks_t *luks = (const luks_t *) esalt_buf; // cipher mode - char *cipher_mode = ""; + const char *cipher_mode = ""; switch (luks->cipher_mode) { diff --git a/src/modules/module_29533.c b/src/modules/module_29533.c index a21a581ea..0c76f085f 100644 --- a/src/modules/module_29533.c +++ b/src/modules/module_29533.c @@ -305,11 +305,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - luks_t *luks = (luks_t *) esalt_buf; + const luks_t *luks = (const luks_t *) esalt_buf; // cipher mode - char *cipher_mode = ""; + const char *cipher_mode = ""; switch (luks->cipher_mode) { diff --git a/src/modules/module_29541.c b/src/modules/module_29541.c index 4f9d02309..1006486b4 100644 --- a/src/modules/module_29541.c +++ b/src/modules/module_29541.c @@ -305,11 +305,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - luks_t *luks = (luks_t *) esalt_buf; + const luks_t *luks = (const luks_t *) esalt_buf; // cipher mode - char *cipher_mode = ""; + const char *cipher_mode = ""; switch (luks->cipher_mode) { diff --git a/src/modules/module_29542.c b/src/modules/module_29542.c index 397e70c92..69d561d4f 100644 --- a/src/modules/module_29542.c +++ b/src/modules/module_29542.c @@ -305,11 +305,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - luks_t *luks = (luks_t *) esalt_buf; + const luks_t *luks = (const luks_t *) esalt_buf; // cipher mode - char *cipher_mode = ""; + const char *cipher_mode = ""; switch (luks->cipher_mode) { diff --git a/src/modules/module_29543.c b/src/modules/module_29543.c index 4dd2e82f8..8cca348ff 100644 --- a/src/modules/module_29543.c +++ b/src/modules/module_29543.c @@ -305,11 +305,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - luks_t *luks = (luks_t *) esalt_buf; + const luks_t *luks = (const luks_t *) esalt_buf; // cipher mode - char *cipher_mode = ""; + const char *cipher_mode = ""; switch (luks->cipher_mode) { diff --git a/src/modules/module_29600.c b/src/modules/module_29600.c index e05e75eab..29c026a29 100644 --- a/src/modules/module_29600.c +++ b/src/modules/module_29600.c @@ -197,7 +197,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - u32 *digest = (u32 *) digest_buf; + const u32 *digest = (const u32 *) digest_buf; const terra_t *terra = (const terra_t *) esalt_buf; @@ -205,7 +205,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE char salt_hex[32 + 1] = { 0 }; - hex_encode ((u8 *) terra->salt_buf, 16, (u8 *) salt_hex); // or use: generic_salt_encode () + hex_encode ((const u8 *) terra->salt_buf, 16, (u8 *) salt_hex); // or use: generic_salt_encode () salt_hex[32] = 0; @@ -213,7 +213,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE char iv_hex[32 + 1] = { 0 }; - hex_encode ((u8 *) terra->iv, 16, (u8 *) iv_hex); + hex_encode ((const u8 *) terra->iv, 16, (u8 *) iv_hex); iv_hex[32] = 0; diff --git a/src/modules/module_29700.c b/src/modules/module_29700.c index 857076ab4..4a2ca92ac 100644 --- a/src/modules/module_29700.c +++ b/src/modules/module_29700.c @@ -149,8 +149,6 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE token.attr[3] = TOKEN_ATTR_VERIFY_LENGTH | TOKEN_ATTR_VERIFY_DIGIT; - if (line_len < 16) return (PARSER_SALT_LENGTH); - const u8 version = line_buf[10]; if (version == '1') @@ -294,10 +292,10 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *final_random_seed_pos = token.buf[4]; - keepass->final_random_seed[0] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 0]); - keepass->final_random_seed[1] = hex_to_u32 ((const u8 *) &final_random_seed_pos[ 8]); - keepass->final_random_seed[2] = hex_to_u32 ((const u8 *) &final_random_seed_pos[16]); - keepass->final_random_seed[3] = hex_to_u32 ((const u8 *) &final_random_seed_pos[24]); + keepass->final_random_seed[0] = hex_to_u32 (&final_random_seed_pos[ 0]); + keepass->final_random_seed[1] = hex_to_u32 (&final_random_seed_pos[ 8]); + keepass->final_random_seed[2] = hex_to_u32 (&final_random_seed_pos[16]); + keepass->final_random_seed[3] = hex_to_u32 (&final_random_seed_pos[24]); keepass->final_random_seed[0] = byte_swap_32 (keepass->final_random_seed[0]); keepass->final_random_seed[1] = byte_swap_32 (keepass->final_random_seed[1]); @@ -306,10 +304,10 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE if (keepass->version == 2) { - keepass->final_random_seed[4] = hex_to_u32 ((const u8 *) &final_random_seed_pos[32]); - keepass->final_random_seed[5] = hex_to_u32 ((const u8 *) &final_random_seed_pos[40]); - keepass->final_random_seed[6] = hex_to_u32 ((const u8 *) &final_random_seed_pos[48]); - keepass->final_random_seed[7] = hex_to_u32 ((const u8 *) &final_random_seed_pos[56]); + keepass->final_random_seed[4] = hex_to_u32 (&final_random_seed_pos[32]); + keepass->final_random_seed[5] = hex_to_u32 (&final_random_seed_pos[40]); + keepass->final_random_seed[6] = hex_to_u32 (&final_random_seed_pos[48]); + keepass->final_random_seed[7] = hex_to_u32 (&final_random_seed_pos[56]); keepass->final_random_seed[4] = byte_swap_32 (keepass->final_random_seed[4]); keepass->final_random_seed[5] = byte_swap_32 (keepass->final_random_seed[5]); @@ -321,14 +319,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *transf_random_seed_pos = token.buf[5]; - keepass->transf_random_seed[0] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 0]); - keepass->transf_random_seed[1] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[ 8]); - keepass->transf_random_seed[2] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[16]); - keepass->transf_random_seed[3] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[24]); - keepass->transf_random_seed[4] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[32]); - keepass->transf_random_seed[5] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[40]); - keepass->transf_random_seed[6] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[48]); - keepass->transf_random_seed[7] = hex_to_u32 ((const u8 *) &transf_random_seed_pos[56]); + keepass->transf_random_seed[0] = hex_to_u32 (&transf_random_seed_pos[ 0]); + keepass->transf_random_seed[1] = hex_to_u32 (&transf_random_seed_pos[ 8]); + keepass->transf_random_seed[2] = hex_to_u32 (&transf_random_seed_pos[16]); + keepass->transf_random_seed[3] = hex_to_u32 (&transf_random_seed_pos[24]); + keepass->transf_random_seed[4] = hex_to_u32 (&transf_random_seed_pos[32]); + keepass->transf_random_seed[5] = hex_to_u32 (&transf_random_seed_pos[40]); + keepass->transf_random_seed[6] = hex_to_u32 (&transf_random_seed_pos[48]); + keepass->transf_random_seed[7] = hex_to_u32 (&transf_random_seed_pos[56]); keepass->transf_random_seed[0] = byte_swap_32 (keepass->transf_random_seed[0]); keepass->transf_random_seed[1] = byte_swap_32 (keepass->transf_random_seed[1]); @@ -343,10 +341,10 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *enc_iv_pos = token.buf[6]; - keepass->enc_iv[0] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 0]); - keepass->enc_iv[1] = hex_to_u32 ((const u8 *) &enc_iv_pos[ 8]); - keepass->enc_iv[2] = hex_to_u32 ((const u8 *) &enc_iv_pos[16]); - keepass->enc_iv[3] = hex_to_u32 ((const u8 *) &enc_iv_pos[24]); + keepass->enc_iv[0] = hex_to_u32 (&enc_iv_pos[ 0]); + keepass->enc_iv[1] = hex_to_u32 (&enc_iv_pos[ 8]); + keepass->enc_iv[2] = hex_to_u32 (&enc_iv_pos[16]); + keepass->enc_iv[3] = hex_to_u32 (&enc_iv_pos[24]); keepass->enc_iv[0] = byte_swap_32 (keepass->enc_iv[0]); keepass->enc_iv[1] = byte_swap_32 (keepass->enc_iv[1]); @@ -361,14 +359,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *contents_hash_pos = token.buf[7]; - keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]); - keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]); - keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]); - keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]); - keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]); - keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]); - keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]); - keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]); + keepass->contents_hash[0] = hex_to_u32 (&contents_hash_pos[ 0]); + keepass->contents_hash[1] = hex_to_u32 (&contents_hash_pos[ 8]); + keepass->contents_hash[2] = hex_to_u32 (&contents_hash_pos[16]); + keepass->contents_hash[3] = hex_to_u32 (&contents_hash_pos[24]); + keepass->contents_hash[4] = hex_to_u32 (&contents_hash_pos[32]); + keepass->contents_hash[5] = hex_to_u32 (&contents_hash_pos[40]); + keepass->contents_hash[6] = hex_to_u32 (&contents_hash_pos[48]); + keepass->contents_hash[7] = hex_to_u32 (&contents_hash_pos[56]); keepass->contents_hash[0] = byte_swap_32 (keepass->contents_hash[0]); keepass->contents_hash[1] = byte_swap_32 (keepass->contents_hash[1]); @@ -388,7 +386,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (int i = 0, j = 0; j < contents_len; i += 1, j += 8) { - keepass->contents[i] = hex_to_u32 ((const u8 *) &contents_pos[j]); + keepass->contents[i] = hex_to_u32 (&contents_pos[j]); keepass->contents[i] = byte_swap_32 (keepass->contents[i]); } @@ -404,14 +402,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *expected_bytes_pos = token.buf[7]; - keepass->expected_bytes[0] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 0]); - keepass->expected_bytes[1] = hex_to_u32 ((const u8 *) &expected_bytes_pos[ 8]); - keepass->expected_bytes[2] = hex_to_u32 ((const u8 *) &expected_bytes_pos[16]); - keepass->expected_bytes[3] = hex_to_u32 ((const u8 *) &expected_bytes_pos[24]); - keepass->expected_bytes[4] = hex_to_u32 ((const u8 *) &expected_bytes_pos[32]); - keepass->expected_bytes[5] = hex_to_u32 ((const u8 *) &expected_bytes_pos[40]); - keepass->expected_bytes[6] = hex_to_u32 ((const u8 *) &expected_bytes_pos[48]); - keepass->expected_bytes[7] = hex_to_u32 ((const u8 *) &expected_bytes_pos[56]); + keepass->expected_bytes[0] = hex_to_u32 (&expected_bytes_pos[ 0]); + keepass->expected_bytes[1] = hex_to_u32 (&expected_bytes_pos[ 8]); + keepass->expected_bytes[2] = hex_to_u32 (&expected_bytes_pos[16]); + keepass->expected_bytes[3] = hex_to_u32 (&expected_bytes_pos[24]); + keepass->expected_bytes[4] = hex_to_u32 (&expected_bytes_pos[32]); + keepass->expected_bytes[5] = hex_to_u32 (&expected_bytes_pos[40]); + keepass->expected_bytes[6] = hex_to_u32 (&expected_bytes_pos[48]); + keepass->expected_bytes[7] = hex_to_u32 (&expected_bytes_pos[56]); keepass->expected_bytes[0] = byte_swap_32 (keepass->expected_bytes[0]); keepass->expected_bytes[1] = byte_swap_32 (keepass->expected_bytes[1]); @@ -426,14 +424,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *contents_hash_pos = token.buf[8]; - keepass->contents_hash[0] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 0]); - keepass->contents_hash[1] = hex_to_u32 ((const u8 *) &contents_hash_pos[ 8]); - keepass->contents_hash[2] = hex_to_u32 ((const u8 *) &contents_hash_pos[16]); - keepass->contents_hash[3] = hex_to_u32 ((const u8 *) &contents_hash_pos[24]); - keepass->contents_hash[4] = hex_to_u32 ((const u8 *) &contents_hash_pos[32]); - keepass->contents_hash[5] = hex_to_u32 ((const u8 *) &contents_hash_pos[40]); - keepass->contents_hash[6] = hex_to_u32 ((const u8 *) &contents_hash_pos[48]); - keepass->contents_hash[7] = hex_to_u32 ((const u8 *) &contents_hash_pos[56]); + keepass->contents_hash[0] = hex_to_u32 (&contents_hash_pos[ 0]); + keepass->contents_hash[1] = hex_to_u32 (&contents_hash_pos[ 8]); + keepass->contents_hash[2] = hex_to_u32 (&contents_hash_pos[16]); + keepass->contents_hash[3] = hex_to_u32 (&contents_hash_pos[24]); + keepass->contents_hash[4] = hex_to_u32 (&contents_hash_pos[32]); + keepass->contents_hash[5] = hex_to_u32 (&contents_hash_pos[40]); + keepass->contents_hash[6] = hex_to_u32 (&contents_hash_pos[48]); + keepass->contents_hash[7] = hex_to_u32 (&contents_hash_pos[56]); keepass->contents_hash[0] = byte_swap_32 (keepass->contents_hash[0]); keepass->contents_hash[1] = byte_swap_32 (keepass->contents_hash[1]); @@ -454,14 +452,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { keepass->keyfile_len = 32; - keepass->keyfile[0] = hex_to_u32 ((const u8 *) &keyfile_pos[ 0]); - keepass->keyfile[1] = hex_to_u32 ((const u8 *) &keyfile_pos[ 8]); - keepass->keyfile[2] = hex_to_u32 ((const u8 *) &keyfile_pos[16]); - keepass->keyfile[3] = hex_to_u32 ((const u8 *) &keyfile_pos[24]); - keepass->keyfile[4] = hex_to_u32 ((const u8 *) &keyfile_pos[32]); - keepass->keyfile[5] = hex_to_u32 ((const u8 *) &keyfile_pos[40]); - keepass->keyfile[6] = hex_to_u32 ((const u8 *) &keyfile_pos[48]); - keepass->keyfile[7] = hex_to_u32 ((const u8 *) &keyfile_pos[56]); + keepass->keyfile[0] = hex_to_u32 (&keyfile_pos[ 0]); + keepass->keyfile[1] = hex_to_u32 (&keyfile_pos[ 8]); + keepass->keyfile[2] = hex_to_u32 (&keyfile_pos[16]); + keepass->keyfile[3] = hex_to_u32 (&keyfile_pos[24]); + keepass->keyfile[4] = hex_to_u32 (&keyfile_pos[32]); + keepass->keyfile[5] = hex_to_u32 (&keyfile_pos[40]); + keepass->keyfile[6] = hex_to_u32 (&keyfile_pos[48]); + keepass->keyfile[7] = hex_to_u32 (&keyfile_pos[56]); keepass->keyfile[0] = byte_swap_32 (keepass->keyfile[0]); keepass->keyfile[1] = byte_swap_32 (keepass->keyfile[1]); @@ -519,15 +517,15 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 algorithm = keepass->algorithm; u32 keyfile_len = keepass->keyfile_len; - u32 *ptr_final_random_seed = (u32 *) keepass->final_random_seed; - u32 *ptr_transf_random_seed = (u32 *) keepass->transf_random_seed; - u32 *ptr_enc_iv = (u32 *) keepass->enc_iv; - u32 *ptr_contents_hash = (u32 *) keepass->contents_hash; - u32 *ptr_keyfile = (u32 *) keepass->keyfile; + const u32 *ptr_final_random_seed = (const u32 *) keepass->final_random_seed; + const u32 *ptr_transf_random_seed = (const u32 *) keepass->transf_random_seed; + const u32 *ptr_enc_iv = (const u32 *) keepass->enc_iv; + const u32 *ptr_contents_hash = (const u32 *) keepass->contents_hash; + const u32 *ptr_keyfile = (const u32 *) keepass->keyfile; // specific to version 2 u32 expected_bytes_len; - u32 *ptr_expected_bytes; + const u32 *ptr_expected_bytes; u32 final_random_seed_len; u32 transf_random_seed_len; @@ -555,20 +553,17 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE *ptr_data = '*'; ptr_data++; - for (u32 i = 0; i < final_random_seed_len; i++, ptr_data += 8) - sprintf (ptr_data, "%08x", ptr_final_random_seed[i]); + for (u32 i = 0; i < final_random_seed_len; i++, ptr_data += 8) snprintf (ptr_data, 9, "%08x", ptr_final_random_seed[i]); *ptr_data = '*'; ptr_data++; - for (u32 i = 0; i < transf_random_seed_len; i++, ptr_data += 8) - sprintf (ptr_data, "%08x", ptr_transf_random_seed[i]); + for (u32 i = 0; i < transf_random_seed_len; i++, ptr_data += 8) snprintf (ptr_data, 9, "%08x", ptr_transf_random_seed[i]); *ptr_data = '*'; ptr_data++; - for (u32 i = 0; i < enc_iv_len; i++, ptr_data += 8) - sprintf (ptr_data, "%08x", ptr_enc_iv[i]); + for (u32 i = 0; i < enc_iv_len; i++, ptr_data += 8) snprintf (ptr_data, 9, "%08x", ptr_enc_iv[i]); *ptr_data = '*'; ptr_data++; @@ -576,10 +571,9 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE if (version == 1) { u32 contents_len = keepass->contents_len; - u32 *ptr_contents = (u32 *) keepass->contents; + const u32 *ptr_contents = (const u32 *) keepass->contents; - for (u32 i = 0; i < contents_hash_len; i++, ptr_data += 8) - sprintf (ptr_data, "%08x", ptr_contents_hash[i]); + for (u32 i = 0; i < contents_hash_len; i++, ptr_data += 8) snprintf (ptr_data, 9, "%08x", ptr_contents_hash[i]); *ptr_data = '*'; ptr_data++; @@ -593,31 +587,28 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE char ptr_contents_len[10] = { 0 }; - sprintf ((char*) ptr_contents_len, "%u", contents_len); + snprintf ((char*) ptr_contents_len, sizeof (ptr_contents_len), "%u", contents_len); - sprintf (ptr_data, "%u", contents_len); + snprintf (ptr_data, sizeof (ptr_contents_len), "%u", contents_len); ptr_data += strlen (ptr_contents_len); *ptr_data = '*'; ptr_data++; - for (u32 i = 0; i < contents_len / 4; i++, ptr_data += 8) - sprintf (ptr_data, "%08x", ptr_contents[i]); + for (u32 i = 0; i < contents_len / 4; i++, ptr_data += 8) snprintf (ptr_data, 9, "%08x", ptr_contents[i]); } else if (version == 2) { expected_bytes_len = 8; - ptr_expected_bytes = (u32 *) keepass->expected_bytes; + ptr_expected_bytes = (const u32 *) keepass->expected_bytes; - for (u32 i = 0; i < expected_bytes_len; i++, ptr_data += 8) - sprintf (ptr_data, "%08x", ptr_expected_bytes[i]); + for (u32 i = 0; i < expected_bytes_len; i++, ptr_data += 8) snprintf (ptr_data, 9, "%08x", ptr_expected_bytes[i]); *ptr_data = '*'; ptr_data++; - for (u32 i = 0; i < contents_hash_len; i++, ptr_data += 8) - sprintf (ptr_data, "%08x", ptr_contents_hash[i]); + for (u32 i = 0; i < contents_hash_len; i++, ptr_data += 8) snprintf (ptr_data, 9, "%08x", ptr_contents_hash[i]); } if (keyfile_len) @@ -632,15 +623,14 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE *ptr_data = '*'; ptr_data++; - sprintf (ptr_data, "%u", keyfile_len * 2); + snprintf (ptr_data, 3, "%u", keyfile_len * 2); ptr_data += 2; *ptr_data = '*'; ptr_data++; - for (u32 i = 0; i < 8; i++, ptr_data += 8) - sprintf (ptr_data, "%08x", ptr_keyfile[i]); + for (u32 i = 0; i < 8; i++, ptr_data += 8) snprintf (ptr_data, 9, "%08x", ptr_keyfile[i]); } return strlen (line_buf); diff --git a/src/modules/module_29910.c b/src/modules/module_29910.c index 23ed260c7..bb76e8da4 100644 --- a/src/modules/module_29910.c +++ b/src/modules/module_29910.c @@ -170,15 +170,15 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *iv_pos = token.buf[3]; - encdatavault->iv[0] = byte_swap_32 (hex_to_u32 ((const u8 *) &iv_pos[0])); - encdatavault->iv[1] = byte_swap_32 (hex_to_u32 ((const u8 *) &iv_pos[8])); + encdatavault->iv[0] = byte_swap_32 (hex_to_u32 (&iv_pos[0])); + encdatavault->iv[1] = byte_swap_32 (hex_to_u32 (&iv_pos[8])); // ct const u8 *ct_pos = token.buf[4]; - encdatavault->ct[0] = byte_swap_32 (hex_to_u32 ((const u8 *) &ct_pos[0])); - encdatavault->ct[1] = byte_swap_32 (hex_to_u32 ((const u8 *) &ct_pos[8])); + encdatavault->ct[0] = byte_swap_32 (hex_to_u32 (&ct_pos[0])); + encdatavault->ct[1] = byte_swap_32 (hex_to_u32 (&ct_pos[8])); // salt length @@ -192,14 +192,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *salt_pos = token.buf[6]; - salt->salt_buf[0] = byte_swap_32 (hex_to_u32 ((const u8 *) &salt_pos[ 0])); - salt->salt_buf[1] = byte_swap_32 (hex_to_u32 ((const u8 *) &salt_pos[ 8])); - salt->salt_buf[2] = byte_swap_32 (hex_to_u32 ((const u8 *) &salt_pos[16])); - salt->salt_buf[3] = byte_swap_32 (hex_to_u32 ((const u8 *) &salt_pos[24])); - salt->salt_buf[4] = byte_swap_32 (hex_to_u32 ((const u8 *) &salt_pos[32])); - salt->salt_buf[5] = byte_swap_32 (hex_to_u32 ((const u8 *) &salt_pos[40])); - salt->salt_buf[6] = byte_swap_32 (hex_to_u32 ((const u8 *) &salt_pos[48])); - salt->salt_buf[7] = byte_swap_32 (hex_to_u32 ((const u8 *) &salt_pos[56])); + salt->salt_buf[0] = byte_swap_32 (hex_to_u32 (&salt_pos[ 0])); + salt->salt_buf[1] = byte_swap_32 (hex_to_u32 (&salt_pos[ 8])); + salt->salt_buf[2] = byte_swap_32 (hex_to_u32 (&salt_pos[16])); + salt->salt_buf[3] = byte_swap_32 (hex_to_u32 (&salt_pos[24])); + salt->salt_buf[4] = byte_swap_32 (hex_to_u32 (&salt_pos[32])); + salt->salt_buf[5] = byte_swap_32 (hex_to_u32 (&salt_pos[40])); + salt->salt_buf[6] = byte_swap_32 (hex_to_u32 (&salt_pos[48])); + salt->salt_buf[7] = byte_swap_32 (hex_to_u32 (&salt_pos[56])); salt->salt_len = 32; diff --git a/src/modules/module_29920.c b/src/modules/module_29920.c index bb433b090..259e0f620 100644 --- a/src/modules/module_29920.c +++ b/src/modules/module_29920.c @@ -176,15 +176,15 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *iv_pos = token.buf[3]; - encdatavault->iv[0] = byte_swap_32 (hex_to_u32 ((const u8 *) &iv_pos[0])); - encdatavault->iv[1] = byte_swap_32 (hex_to_u32 ((const u8 *) &iv_pos[8])); + encdatavault->iv[0] = byte_swap_32 (hex_to_u32 (&iv_pos[0])); + encdatavault->iv[1] = byte_swap_32 (hex_to_u32 (&iv_pos[8])); // ct const u8 *ct_pos = token.buf[4]; - encdatavault->ct[0] = byte_swap_32 (hex_to_u32 ((const u8 *) &ct_pos[0])); - encdatavault->ct[1] = byte_swap_32 (hex_to_u32 ((const u8 *) &ct_pos[8])); + encdatavault->ct[0] = byte_swap_32 (hex_to_u32 (&ct_pos[0])); + encdatavault->ct[1] = byte_swap_32 (hex_to_u32 (&ct_pos[8])); // salt length @@ -198,14 +198,14 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *salt_pos = token.buf[6]; - salt->salt_buf[0] = byte_swap_32 (hex_to_u32 ((const u8 *) &salt_pos[ 0])); - salt->salt_buf[1] = byte_swap_32 (hex_to_u32 ((const u8 *) &salt_pos[ 8])); - salt->salt_buf[2] = byte_swap_32 (hex_to_u32 ((const u8 *) &salt_pos[16])); - salt->salt_buf[3] = byte_swap_32 (hex_to_u32 ((const u8 *) &salt_pos[24])); - salt->salt_buf[4] = byte_swap_32 (hex_to_u32 ((const u8 *) &salt_pos[32])); - salt->salt_buf[5] = byte_swap_32 (hex_to_u32 ((const u8 *) &salt_pos[40])); - salt->salt_buf[6] = byte_swap_32 (hex_to_u32 ((const u8 *) &salt_pos[48])); - salt->salt_buf[7] = byte_swap_32 (hex_to_u32 ((const u8 *) &salt_pos[56])); + salt->salt_buf[0] = byte_swap_32 (hex_to_u32 (&salt_pos[ 0])); + salt->salt_buf[1] = byte_swap_32 (hex_to_u32 (&salt_pos[ 8])); + salt->salt_buf[2] = byte_swap_32 (hex_to_u32 (&salt_pos[16])); + salt->salt_buf[3] = byte_swap_32 (hex_to_u32 (&salt_pos[24])); + salt->salt_buf[4] = byte_swap_32 (hex_to_u32 (&salt_pos[32])); + salt->salt_buf[5] = byte_swap_32 (hex_to_u32 (&salt_pos[40])); + salt->salt_buf[6] = byte_swap_32 (hex_to_u32 (&salt_pos[48])); + salt->salt_buf[7] = byte_swap_32 (hex_to_u32 (&salt_pos[56])); salt->salt_len = 32; @@ -221,7 +221,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (int i = 0, j = 0; i < 32; i += 1, j+= 8) { - encdatavault->keychain[i] = byte_swap_32 (hex_to_u32 ((const u8 *) &keychain_pos[j])); + encdatavault->keychain[i] = byte_swap_32 (hex_to_u32 (&keychain_pos[j])); } // hash diff --git a/src/modules/module_29930.c b/src/modules/module_29930.c index bf467b029..d29e9bcfe 100644 --- a/src/modules/module_29930.c +++ b/src/modules/module_29930.c @@ -149,15 +149,15 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *iv_pos = token.buf[3]; - encdatavault->iv[0] = byte_swap_32 (hex_to_u32 ((const u8 *) &iv_pos[0])); - encdatavault->iv[1] = byte_swap_32 (hex_to_u32 ((const u8 *) &iv_pos[8])); + encdatavault->iv[0] = byte_swap_32 (hex_to_u32 (&iv_pos[0])); + encdatavault->iv[1] = byte_swap_32 (hex_to_u32 (&iv_pos[8])); // ct const u8 *ct_pos = token.buf[4]; - encdatavault->ct[0] = byte_swap_32 (hex_to_u32 ((const u8 *) &ct_pos[0])); - encdatavault->ct[1] = byte_swap_32 (hex_to_u32 ((const u8 *) &ct_pos[8])); + encdatavault->ct[0] = byte_swap_32 (hex_to_u32 (&ct_pos[0])); + encdatavault->ct[1] = byte_swap_32 (hex_to_u32 (&ct_pos[8])); // salt fixed diff --git a/src/modules/module_29940.c b/src/modules/module_29940.c index 5cdca974e..be5522352 100644 --- a/src/modules/module_29940.c +++ b/src/modules/module_29940.c @@ -154,15 +154,15 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *iv_pos = token.buf[3]; - encdatavault->iv[0] = byte_swap_32 (hex_to_u32 ((const u8 *) &iv_pos[0])); - encdatavault->iv[1] = byte_swap_32 (hex_to_u32 ((const u8 *) &iv_pos[8])); + encdatavault->iv[0] = byte_swap_32 (hex_to_u32 (&iv_pos[0])); + encdatavault->iv[1] = byte_swap_32 (hex_to_u32 (&iv_pos[8])); // ct const u8 *ct_pos = token.buf[4]; - encdatavault->ct[0] = byte_swap_32 (hex_to_u32 ((const u8 *) &ct_pos[0])); - encdatavault->ct[1] = byte_swap_32 (hex_to_u32 ((const u8 *) &ct_pos[8])); + encdatavault->ct[0] = byte_swap_32 (hex_to_u32 (&ct_pos[0])); + encdatavault->ct[1] = byte_swap_32 (hex_to_u32 (&ct_pos[8])); // keychain @@ -170,7 +170,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE for (int i = 0, j = 0; i < 32; i += 1, j+= 8) { - encdatavault->keychain[i] = byte_swap_32 (hex_to_u32 ((const u8 *) &keychain_pos[j])); + encdatavault->keychain[i] = byte_swap_32 (hex_to_u32 (&keychain_pos[j])); } // salt fixed diff --git a/src/modules/module_30600.c b/src/modules/module_30600.c index 713fa6f64..2af2eecd4 100644 --- a/src/modules/module_30600.c +++ b/src/modules/module_30600.c @@ -220,7 +220,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memset (tmp_buf, 0, sizeof (tmp_buf)); - base64_decode (bf64_to_int, (const u8 *) salt_pos, salt_len, tmp_buf); + base64_decode (bf64_to_int, salt_pos, salt_len, tmp_buf); memcpy (salt_buf_ptr, tmp_buf, 16); @@ -231,7 +231,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE memset (tmp_buf, 0, sizeof (tmp_buf)); - base64_decode (bf64_to_int, (const u8 *) hash_pos, hash_len, tmp_buf); + base64_decode (bf64_to_int, hash_pos, hash_len, tmp_buf); memcpy (digest, tmp_buf, 24); @@ -274,7 +274,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE tmp_buf[22 + 31] = 0; // base64_encode wants to pad - return snprintf (line_buf, line_size, "%s$%s", (char *) salt->salt_sign, tmp_buf); + return snprintf (line_buf, line_size, "%s$%s", (const char *) salt->salt_sign, tmp_buf); } void module_init (module_ctx_t *module_ctx) diff --git a/src/modules/module_30901.c b/src/modules/module_30901.c index 3d60c3d90..e3af30325 100644 --- a/src/modules/module_30901.c +++ b/src/modules/module_30901.c @@ -89,7 +89,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 pubkey_len = PUBKEY_MAXLEN; - bool res = b58dec (pubkey, &pubkey_len, (u8 *) line_buf, line_len); + bool res = b58dec (pubkey, &pubkey_len, (const u8 *) line_buf, line_len); if (res == false) return (PARSER_HASH_LENGTH); @@ -128,7 +128,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - u8 *digest = (u8 *) digest_buf; + const u8 *digest = (const u8 *) digest_buf; u8 buf[64] = { 0 }; diff --git a/src/modules/module_30902.c b/src/modules/module_30902.c index 984496707..ae7f1b030 100644 --- a/src/modules/module_30902.c +++ b/src/modules/module_30902.c @@ -90,7 +90,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 pubkey_len = PUBKEY_MAXLEN; - bool res = b58dec (pubkey, &pubkey_len, (u8 *) line_buf, line_len); + bool res = b58dec (pubkey, &pubkey_len, (const u8 *) line_buf, line_len); if (res == false) return (PARSER_HASH_LENGTH); @@ -129,7 +129,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - u8 *digest = (u8 *) digest_buf; + const u8 *digest = (const u8 *) digest_buf; u8 buf[64] = { 0 }; diff --git a/src/modules/module_30903.c b/src/modules/module_30903.c index 3bcdad5af..0b4eaba73 100644 --- a/src/modules/module_30903.c +++ b/src/modules/module_30903.c @@ -218,7 +218,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // note: here we work mostly with char/u8 type because it's easier to base32 encode // (at least conceptually), but this could be easily extended to u32 variable types: - u8 *digest = (u8 *) digest_buf; + const u8 *digest = (const u8 *) digest_buf; u8 b[20] = { 0 }; diff --git a/src/modules/module_30904.c b/src/modules/module_30904.c index a3c9f2abe..58f0b2696 100644 --- a/src/modules/module_30904.c +++ b/src/modules/module_30904.c @@ -218,7 +218,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // note: here we work mostly with char/u8 type because it's easier to base32 encode // (at least conceptually), but this could be easily extended to u32 variable types: - u8 *digest = (u8 *) digest_buf; + const u8 *digest = (const u8 *) digest_buf; u8 b[20] = { 0 }; diff --git a/src/modules/module_30905.c b/src/modules/module_30905.c index e3e9b7d55..763fd550d 100644 --- a/src/modules/module_30905.c +++ b/src/modules/module_30905.c @@ -89,7 +89,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 pubkey_len = PUBKEY_MAXLEN; - bool res = b58dec (pubkey, &pubkey_len, (u8 *) line_buf, line_len); + bool res = b58dec (pubkey, &pubkey_len, (const u8 *) line_buf, line_len); if (res == false) return (PARSER_HASH_LENGTH); @@ -128,7 +128,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - u8 *digest = (u8 *) digest_buf; + const u8 *digest = (const u8 *) digest_buf; u8 buf[64] = { 0 }; diff --git a/src/modules/module_30906.c b/src/modules/module_30906.c index 1be061fad..22553013b 100644 --- a/src/modules/module_30906.c +++ b/src/modules/module_30906.c @@ -89,7 +89,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE u32 pubkey_len = PUBKEY_MAXLEN; - bool res = b58dec (pubkey, &pubkey_len, (u8 *) line_buf, line_len); + bool res = b58dec (pubkey, &pubkey_len, (const u8 *) line_buf, line_len); if (res == false) return (PARSER_HASH_LENGTH); @@ -128,7 +128,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - u8 *digest = (u8 *) digest_buf; + const u8 *digest = (const u8 *) digest_buf; u8 buf[64] = { 0 }; diff --git a/src/modules/module_31400.c b/src/modules/module_31400.c index 0f988b124..46bcef397 100644 --- a/src/modules/module_31400.c +++ b/src/modules/module_31400.c @@ -55,7 +55,7 @@ typedef struct scrtv2 } scrtv2_t; -static const char *CONFIGPASSPHRASEV2_SIGNATURE = "S:\"Config Passphrase\"=02:"; //The whole line is part of the format to prevent confusion with other similiar tokens also prefixed with 02: in the config files +static const char *CONFIGPASSPHRASEV2_SIGNATURE = "S:\"Config Passphrase\"=02:"; //The whole line is part of the format to prevent confusion with other similar tokens also prefixed with 02: in the config files u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { @@ -126,7 +126,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int out_len = snprintf (line_buf, line_size, "%s", CONFIGPASSPHRASEV2_SIGNATURE); - out_len += hex_encode ((u8 *) scrtv2->ct_buf, scrtv2->ct_len, out_buf + out_len); + out_len += hex_encode ((const u8 *) scrtv2->ct_buf, scrtv2->ct_len, out_buf + out_len); return out_len; } diff --git a/src/modules/module_31500.c b/src/modules/module_31500.c new file mode 100644 index 000000000..26ec4d0f3 --- /dev/null +++ b/src/modules/module_31500.c @@ -0,0 +1,244 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 3; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 1; +static const u32 DGST_SIZE = DGST_SIZE_4_4; +static const u32 HASH_CATEGORY = HASH_CATEGORY_OS; +static const char *HASH_NAME = "Domain Cached Credentials (DCC), MS Cache (NT)"; +static const u64 KERN_TYPE = 31500; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_NOT_ITERATED; +static const u64 OPTS_TYPE = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14 + | OPTS_TYPE_PT_UTF16LE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_UTF16LE + | OPTS_TYPE_ST_LOWER + | OPTS_TYPE_AUTODETECT_DISABLE; +static const u32 SALT_TYPE = SALT_TYPE_GENERIC; +static const char *ST_PASS = "b4b9b02e6f09a9bd760f388b67351e2b"; +static const char *ST_HASH = "c896b3c6963e03c86ade3a38370bbb09:54161084332"; + +typedef struct dcc_tmp +{ + u32 digest_buf[4]; + +} dcc_tmp_t; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = (const u64) sizeof (dcc_tmp_t); + + return tmp_size; +} + + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 2; + + token.sep[0] = hashconfig->separator; + token.len_min[0] = 32; + token.len_max[0] = 32; + token.attr[0] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + token.len_min[1] = SALT_MIN; + token.len_max[1] = SALT_MAX; + token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH; + + if (hashconfig->opts_type & OPTS_TYPE_ST_HEX) + { + token.len_min[1] *= 2; + token.len_max[1] *= 2; + + token.attr[1] |= TOKEN_ATTR_VERIFY_HEX; + } + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + const u8 *hash_pos = token.buf[0]; + + digest[0] = hex_to_u32 (hash_pos + 0); + digest[1] = hex_to_u32 (hash_pos + 8); + digest[2] = hex_to_u32 (hash_pos + 16); + digest[3] = hex_to_u32 (hash_pos + 24); + + const u8 *salt_pos = token.buf[1]; + const int salt_len = token.len[1]; + + const bool parse_rc = generic_salt_decode (hashconfig, salt_pos, salt_len, (u8 *) salt->salt_buf, (int *) &salt->salt_len); + + if (parse_rc == false) return (PARSER_SALT_LENGTH); + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u32 *digest = (const u32 *) digest_buf; + + // we can not change anything in the original buffer, otherwise destroying sorting + // therefore create some local buffer + + u32 tmp[4]; + + tmp[0] = digest[0]; + tmp[1] = digest[1]; + tmp[2] = digest[2]; + tmp[3] = digest[3]; + + u8 *out_buf = (u8 *) line_buf; + + int out_len = 0; + + u32_to_hex (tmp[0], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[1], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[2], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[3], out_buf + out_len); out_len += 8; + + out_buf[out_len] = hashconfig->separator; + + out_len += 1; + + out_len += generic_salt_encode (hashconfig, (const u8 *) salt->salt_buf, (const int) salt->salt_len, out_buf + out_len); + + return out_len; +} + +u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 pw_max = 32; // Length of a NT hash + + return pw_max; +} + +u32 module_pw_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 pw_min = 32; // Length of a NT hash + + return pw_min; +} + +const char *module_benchmark_mask (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const char *mask = "?a?a?a?a?a?a?a?axxxxxxxxxxxxxxxx"; + return mask; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = module_benchmark_mask; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = module_pw_max; + module_ctx->module_pw_min = module_pw_min; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_31600.c b/src/modules/module_31600.c new file mode 100644 index 000000000..dbc87e485 --- /dev/null +++ b/src/modules/module_31600.c @@ -0,0 +1,249 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 1; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 3; +static const u32 DGST_SIZE = DGST_SIZE_4_4; +static const u32 HASH_CATEGORY = HASH_CATEGORY_OS; +static const char *HASH_NAME = "Domain Cached Credentials 2 (DCC2), MS Cache 2, (NT)"; +static const u64 KERN_TYPE = 31600; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_ST_LOWER + | OPTS_TYPE_AUTODETECT_DISABLE; +static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const char *ST_PASS = "b4b9b02e6f09a9bd760f388b67351e2b"; +static const char *ST_HASH = "$DCC2$10240#6848#e2829c8af2232fa53797e2f0e35e4626"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +typedef struct dcc2_tmp +{ + u32 ipad[5]; + u32 opad[5]; + + u32 dgst[5]; + u32 out[4]; + +} dcc2_tmp_t; + +static const char *SIGNATURE_DCC2 = "$DCC2$"; + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = (const u64) sizeof (dcc2_tmp_t); + + return tmp_size; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 4; + + token.signatures_cnt = 1; + token.signatures_buf[0] = SIGNATURE_DCC2; + + token.len[0] = 6; + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_SIGNATURE; + + token.len_min[1] = 1; + token.len_max[1] = 6; + token.sep[1] = '#'; + token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_DIGIT; + + token.len_min[2] = SALT_MIN; + token.len_max[2] = SALT_MAX; + token.sep[2] = '#'; + token.attr[2] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_SEPARATOR_FARTHEST; + + token.len_min[3] = 32; + token.len_max[3] = 32; + token.attr[3] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + const u8 *hash_pos = token.buf[3]; + + digest[0] = hex_to_u32 (hash_pos + 0); + digest[1] = hex_to_u32 (hash_pos + 8); + digest[2] = hex_to_u32 (hash_pos + 16); + digest[3] = hex_to_u32 (hash_pos + 24); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + const u8 *salt_pos = token.buf[2]; + const int salt_len = token.len[2]; + + const bool parse_rc = generic_salt_decode (hashconfig, salt_pos, salt_len, (u8 *) salt->salt_buf, (int *) &salt->salt_len); + + if (parse_rc == false) return (PARSER_SALT_LENGTH); + + const u8 *iter_pos = token.buf[1]; + + u32 iter = hc_strtoul ((const char *) iter_pos, NULL, 10); + + salt->salt_iter = iter - 1; + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u32 *digest = (const u32 *) digest_buf; + + int line_len = 0; + + line_len += snprintf (line_buf + line_len, line_size - line_len, "%s%u#", SIGNATURE_DCC2, salt->salt_iter + 1); + + line_len += generic_salt_encode (hashconfig, (const u8 *) salt->salt_buf, (const int) salt->salt_len, (u8 *) line_buf + line_len); + + line_len += snprintf (line_buf + line_len, line_size - line_len, "#%08x%08x%08x%08x", + digest[0], + digest[1], + digest[2], + digest[3]); + + return line_len; +} + +u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 pw_max = 32; // Length of a NT hash + + return pw_max; +} + +u32 module_pw_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 pw_min = 32; // Length of a NT hash + + return pw_min; +} + +const char *module_benchmark_mask (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const char *mask = "?a?a?a?a?a?a?a?axxxxxxxxxxxxxxxx"; + return mask; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = module_benchmark_mask; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = module_pw_max; + module_ctx->module_pw_min = module_pw_min; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_31700.c b/src/modules/module_31700.c index a99bdc663..1bdb6161a 100644 --- a/src/modules/module_31700.c +++ b/src/modules/module_31700.c @@ -120,11 +120,11 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE digest[3] -= MD5M_D; } - const bool parse_rc1 = generic_salt_decode (hashconfig, token.buf[1], token.len[1], (u8 *) md5_double_salt->salt1_buf, (int *) &md5_double_salt->salt1_len); + const bool parse_rc1 = generic_salt_decode (hashconfig, token.buf[1], token.len[1], (u8 *) md5_double_salt->salt1_buf, &md5_double_salt->salt1_len); if (parse_rc1 == false) return (PARSER_SALT_LENGTH); - const bool parse_rc2 = generic_salt_decode (hashconfig, token.buf[2], token.len[2], (u8 *) md5_double_salt->salt2_buf, (int *) &md5_double_salt->salt2_len); + const bool parse_rc2 = generic_salt_decode (hashconfig, token.buf[2], token.len[2], (u8 *) md5_double_salt->salt2_buf, &md5_double_salt->salt2_len); if (parse_rc2 == false) return (PARSER_SALT_LENGTH); @@ -184,13 +184,13 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE out_len += 1; - out_len += generic_salt_encode (hashconfig, (const u8 *) md5_double_salt->salt1_buf, (const int) md5_double_salt->salt1_len, out_buf + out_len); + out_len += generic_salt_encode (hashconfig, (const u8 *) md5_double_salt->salt1_buf, md5_double_salt->salt1_len, out_buf + out_len); out_buf[out_len] = hashconfig->separator; out_len += 1; - out_len += generic_salt_encode (hashconfig, (const u8 *) md5_double_salt->salt2_buf, (const int) md5_double_salt->salt2_len, out_buf + out_len); + out_len += generic_salt_encode (hashconfig, (const u8 *) md5_double_salt->salt2_buf, md5_double_salt->salt2_len, out_buf + out_len); return out_len; } diff --git a/src/modules/module_31800.c b/src/modules/module_31800.c index e1dfa3b04..8a91a90e7 100644 --- a/src/modules/module_31800.c +++ b/src/modules/module_31800.c @@ -313,7 +313,7 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE { // const u32 *digest = (const u32 *) digest_buf; - onepassword8_t *onepassword8 = (onepassword8_t *) esalt_buf; + const onepassword8_t *onepassword8 = (const onepassword8_t *) esalt_buf; // iv @@ -341,9 +341,9 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // final - int out_len = snprintf ((char *) line_buf, line_size, "%s%s$%08x%08x%08x%08x%08x%08x%08x%08x$%08x%08x%08x%08x%08x%08x%08x%08x$%u$%s$%s$%08x%08x%08x%08x", + int out_len = snprintf (line_buf, line_size, "%s%s$%08x%08x%08x%08x%08x%08x%08x%08x$%08x%08x%08x%08x%08x%08x%08x%08x$%u$%s$%s$%08x%08x%08x%08x", SIGNATURE_1PASSWORD8, - (char *) onepassword8->email_buf, + (const char *) onepassword8->email_buf, onepassword8->hkdf_salt_buf[0], onepassword8->hkdf_salt_buf[1], onepassword8->hkdf_salt_buf[2], @@ -361,8 +361,8 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE onepassword8->hkdf_key_buf[6], onepassword8->hkdf_key_buf[7], salt->salt_iter + 1, - (char *) iv_buf8, - (char *) ct_buf8, + (const char *) iv_buf8, + (const char *) ct_buf8, onepassword8->tag_buf[0], onepassword8->tag_buf[1], onepassword8->tag_buf[2], diff --git a/src/modules/module_31900.c b/src/modules/module_31900.c index 291c3d213..7ef9a8f07 100644 --- a/src/modules/module_31900.c +++ b/src/modules/module_31900.c @@ -26,7 +26,7 @@ static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE | OPTS_TYPE_PT_GENERATE_LE; static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; static const char *ST_PASS = "hashcat1"; -static const char *ST_HASH = "$metamaskMobile$MjU1NTA5MTU2ODY5MjY4OQ==$3cccb51c401e54abc82987fd9310a8d3$WQhIECN0blOaV31RC3lKfQ=="; +static const char *ST_HASH = "$metamaskMobile$JV4j2dUDl7n+sujyqW3Wvg==$398f9b04c822d36bfcbdd1e68c82d1e8$auj3J2TwOZ4ev3UIGmNa7VXLh0Nmzr3rDbpXRRrONr4="; u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } @@ -58,7 +58,7 @@ typedef struct pbkdf2_sha512_aes_cbc u32 salt_buf[64]; u32 iv_buf[4]; u32 iv_len; - u32 ct_buf[4]; + u32 ct_buf[8]; u32 ct_len; } pbkdf2_sha512_aes_cbc_t; @@ -153,7 +153,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE | TOKEN_ATTR_VERIFY_HEX; token.sep[3] = '$'; - token.len[3] = 24; + token.len[3] = 44; token.attr[3] = TOKEN_ATTR_FIXED_LENGTH | TOKEN_ATTR_VERIFY_BASE64A; @@ -200,13 +200,13 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE const u8 *ct_pos = token.buf[3]; const int ct_len = token.len[3]; - u8 tmp_buf[24+1]; + u8 tmp_buf[44+1]; memset (tmp_buf, 0, sizeof (tmp_buf)); tmp_len = base64_decode (base64_to_int, ct_pos, ct_len, tmp_buf); - if (tmp_len != 16) return (PARSER_CT_LENGTH); + if (tmp_len != 32) return (PARSER_CT_LENGTH); memcpy ((u8 *) metamask->ct_buf, tmp_buf, tmp_len); @@ -214,6 +214,10 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE metamask->ct_buf[1] = byte_swap_32 (metamask->ct_buf[1]); metamask->ct_buf[2] = byte_swap_32 (metamask->ct_buf[2]); metamask->ct_buf[3] = byte_swap_32 (metamask->ct_buf[3]); + metamask->ct_buf[4] = byte_swap_32 (metamask->ct_buf[4]); + metamask->ct_buf[5] = byte_swap_32 (metamask->ct_buf[5]); + metamask->ct_buf[6] = byte_swap_32 (metamask->ct_buf[6]); + metamask->ct_buf[7] = byte_swap_32 (metamask->ct_buf[7]); metamask->ct_len = tmp_len / 4; @@ -229,8 +233,6 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - const u32 *digest = (const u32 *) digest_buf; - pbkdf2_sha512_aes_cbc_t *metamask = (pbkdf2_sha512_aes_cbc_t *) esalt_buf; // salt @@ -250,14 +252,18 @@ int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE // ct - u32 tmp_buf[4]; + u32 tmp_buf[8]; - tmp_buf[0] = byte_swap_32 (digest[0]); - tmp_buf[1] = byte_swap_32 (digest[1]); - tmp_buf[2] = byte_swap_32 (digest[2]); - tmp_buf[3] = byte_swap_32 (digest[3]); + tmp_buf[0] = byte_swap_32 (metamask->ct_buf[0]); + tmp_buf[1] = byte_swap_32 (metamask->ct_buf[1]); + tmp_buf[2] = byte_swap_32 (metamask->ct_buf[2]); + tmp_buf[3] = byte_swap_32 (metamask->ct_buf[3]); + tmp_buf[4] = byte_swap_32 (metamask->ct_buf[4]); + tmp_buf[5] = byte_swap_32 (metamask->ct_buf[5]); + tmp_buf[6] = byte_swap_32 (metamask->ct_buf[6]); + tmp_buf[7] = byte_swap_32 (metamask->ct_buf[7]); - u8 ct_buf[24+1]; + u8 ct_buf[44+1]; memset (ct_buf, 0, sizeof (ct_buf)); diff --git a/src/modules/module_32000.c b/src/modules/module_32000.c new file mode 100644 index 000000000..f1e17711a --- /dev/null +++ b/src/modules/module_32000.c @@ -0,0 +1,211 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 1; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 3; +static const u32 DGST_SIZE = DGST_SIZE_4_5; +static const u32 HASH_CATEGORY = HASH_CATEGORY_EAS; +static const char *HASH_NAME = "NetIQ SSPR (MD5)"; +static const u64 KERN_TYPE = 32000; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14; +static const u32 SALT_TYPE = SALT_TYPE_VIRTUAL; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "$sspr$0$100000$NONE$2c8586ef492e3c3dd3795395507dc14f"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +typedef struct netiq_sspr_md5_tmp +{ + u32 dgst[4]; + +} netiq_sspr_md5_tmp_t; + +static const char *SIGNATURE_NETIQ_SSPR_MD5 = "$sspr$0$100000$NONE$"; + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = (const u64) sizeof (netiq_sspr_md5_tmp_t); + + return tmp_size; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 2; + + token.signatures_cnt = 1; + token.signatures_buf[0] = SIGNATURE_NETIQ_SSPR_MD5; + + token.len[0] = strlen (SIGNATURE_NETIQ_SSPR_MD5); + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_SIGNATURE; + + token.sep[1] = '$'; + token.len[1] = 32; + token.attr[1] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + // iter + + salt->salt_iter = 100000 - 1; + + // digest + + const u8 *hash_pos = token.buf[1]; + + digest[0] = hex_to_u32 (hash_pos + 0); + digest[1] = hex_to_u32 (hash_pos + 8); + digest[2] = hex_to_u32 (hash_pos + 16); + digest[3] = hex_to_u32 (hash_pos + 24); + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u32 *digest = (const u32 *) digest_buf; + + // digest + + u32 tmp[4]; + + tmp[0] = digest[0]; + tmp[1] = digest[1]; + tmp[2] = digest[2]; + tmp[3] = digest[3]; + + u8 *out_buf = (u8 *) line_buf; + + int out_len = snprintf ((char *) out_buf, line_size, "%s", SIGNATURE_NETIQ_SSPR_MD5); + + out_buf += out_len; + + u32_to_hex (tmp[0], out_buf + 0); + u32_to_hex (tmp[1], out_buf + 8); + u32_to_hex (tmp[2], out_buf + 16); + u32_to_hex (tmp[3], out_buf + 24); + + out_len += 32; + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_32010.c b/src/modules/module_32010.c new file mode 100644 index 000000000..d82e5ca6a --- /dev/null +++ b/src/modules/module_32010.c @@ -0,0 +1,220 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 3; +static const u32 DGST_POS1 = 4; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 1; +static const u32 DGST_SIZE = DGST_SIZE_4_5; +static const u32 HASH_CATEGORY = HASH_CATEGORY_EAS; +static const char *HASH_NAME = "NetIQ SSPR (SHA1)"; +static const u64 KERN_TYPE = 32010; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; +static const u32 SALT_TYPE = SALT_TYPE_VIRTUAL; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "$sspr$1$100000$NONE$b3485214dfa55b038a606a183a560dab7db4ecf1"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +typedef struct netiq_sspr_sha1_tmp +{ + u32 dgst[5]; + +} netiq_sspr_sha1_tmp_t; + +static const char *SIGNATURE_NETIQ_SSPR_SHA1 = "$sspr$1$100000$NONE$"; + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = (const u64) sizeof (netiq_sspr_sha1_tmp_t); + + return tmp_size; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 2; + + token.signatures_cnt = 1; + token.signatures_buf[0] = SIGNATURE_NETIQ_SSPR_SHA1; + + token.len[0] = strlen (SIGNATURE_NETIQ_SSPR_SHA1); + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_SIGNATURE; + + token.sep[1] = '$'; + token.len[1] = 40; + token.attr[1] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + // iter + + salt->salt_iter = 100000 - 1; + + // digest + + const u8 *hash_pos = token.buf[1]; + + digest[0] = hex_to_u32 (hash_pos + 0); + digest[1] = hex_to_u32 (hash_pos + 8); + digest[2] = hex_to_u32 (hash_pos + 16); + digest[3] = hex_to_u32 (hash_pos + 24); + digest[4] = hex_to_u32 (hash_pos + 32); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u32 *digest = (const u32 *) digest_buf; + + // digest + + u32 tmp[5]; + + tmp[0] = byte_swap_32 (digest[0]); + tmp[1] = byte_swap_32 (digest[1]); + tmp[2] = byte_swap_32 (digest[2]); + tmp[3] = byte_swap_32 (digest[3]); + tmp[4] = byte_swap_32 (digest[4]); + + u8 *out_buf = (u8 *) line_buf; + + int out_len = snprintf ((char *) out_buf, line_size, "%s", SIGNATURE_NETIQ_SSPR_SHA1); + + out_buf += out_len; + + u32_to_hex (tmp[0], out_buf + 0); + u32_to_hex (tmp[1], out_buf + 8); + u32_to_hex (tmp[2], out_buf + 16); + u32_to_hex (tmp[3], out_buf + 24); + u32_to_hex (tmp[4], out_buf + 32); + + out_len += 40; + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_32020.c b/src/modules/module_32020.c new file mode 100644 index 000000000..98c525586 --- /dev/null +++ b/src/modules/module_32020.c @@ -0,0 +1,255 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 3; +static const u32 DGST_POS1 = 4; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 1; +static const u32 DGST_SIZE = DGST_SIZE_4_5; +static const u32 HASH_CATEGORY = HASH_CATEGORY_EAS; +static const char *HASH_NAME = "NetIQ SSPR (SHA-1 with Salt)"; +static const u64 KERN_TYPE = 32020; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_ST_BASE64 + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; +static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "$sspr$2$100000$CxCpGqosk9PkCBcoRFp6DLjjRhVEJKK8$a33283d71c2ecaf4f3017b0a89feca2fc879221c"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +typedef struct netiq_sspr_sha1_tmp +{ + u32 dgst[5]; + +} netiq_sspr_sha1_tmp_t; + +static const char *SIGNATURE_NETIQ_SSPR_SHA1_SALTED = "$sspr$2$100000$"; + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = (const u64) sizeof (netiq_sspr_sha1_tmp_t); + + return tmp_size; +} + +u32 module_salt_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 salt_min = 32; + + return salt_min; +} + +u32 module_salt_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 salt_max = 32; + + return salt_max; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 3; + + token.signatures_cnt = 1; + token.signatures_buf[0] = SIGNATURE_NETIQ_SSPR_SHA1_SALTED; + + token.len[0] = strlen (SIGNATURE_NETIQ_SSPR_SHA1_SALTED); + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_SIGNATURE; + + token.sep[1] = '$'; + token.len[1] = 32; + token.attr[1] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_BASE64A; + + token.sep[2] = '$'; + token.len[2] = 40; + token.attr[2] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + // iter + + salt->salt_iter = 100000 - 1; + + // salt + + const u8 *salt_pos = token.buf[1]; + const int salt_len = token.len[1]; + + salt->salt_len = salt_len; + + memcpy ((u8 *) salt->salt_buf, salt_pos, salt->salt_len); + + // digest + + const u8 *hash_pos = token.buf[2]; + + digest[0] = hex_to_u32 (hash_pos + 0); + digest[1] = hex_to_u32 (hash_pos + 8); + digest[2] = hex_to_u32 (hash_pos + 16); + digest[3] = hex_to_u32 (hash_pos + 24); + digest[4] = hex_to_u32 (hash_pos + 32); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u32 *digest = (const u32 *) digest_buf; + + // salt + + const u8 *salt_buf = (const u8 *) salt->salt_buf; + + // digest + + u32 tmp[5]; + + tmp[0] = byte_swap_32 (digest[0]); + tmp[1] = byte_swap_32 (digest[1]); + tmp[2] = byte_swap_32 (digest[2]); + tmp[3] = byte_swap_32 (digest[3]); + tmp[4] = byte_swap_32 (digest[4]); + + u8 *out_buf = (u8 *) line_buf; + + int out_len = snprintf ((char *) out_buf, line_size, "%s%s$", + SIGNATURE_NETIQ_SSPR_SHA1_SALTED, + salt_buf); + + out_buf += out_len; + + u32_to_hex (tmp[0], out_buf + 0); + u32_to_hex (tmp[1], out_buf + 8); + u32_to_hex (tmp[2], out_buf + 16); + u32_to_hex (tmp[3], out_buf + 24); + u32_to_hex (tmp[4], out_buf + 32); + + out_len += 40; + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = module_salt_max; + module_ctx->module_salt_min = module_salt_min; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_32030.c b/src/modules/module_32030.c new file mode 100644 index 000000000..11ac43ead --- /dev/null +++ b/src/modules/module_32030.c @@ -0,0 +1,267 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 3; +static const u32 DGST_POS1 = 7; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 6; +static const u32 DGST_SIZE = DGST_SIZE_4_8; +static const u32 HASH_CATEGORY = HASH_CATEGORY_EAS; +static const char *HASH_NAME = "NetIQ SSPR (SHA-256 with Salt)"; +static const u64 KERN_TYPE = 32030; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_ST_BASE64 + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; +static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "$sspr$3$100000$ODk2NDA5Mjc2NDIwMjMwMjQyMTQ1NzMz$7195873d47c7e3627510862e37fe7cab9bc83b91feecb9864841bf80cff92419"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +typedef struct netiq_sspr_sha256_tmp +{ + u32 dgst[8]; + +} netiq_sspr_sha256_tmp_t; + +static const char *SIGNATURE_NETIQ_SSPR_SHA256_SALTED = "$sspr$3$100000$"; + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = (const u64) sizeof (netiq_sspr_sha256_tmp_t); + + return tmp_size; +} + +u32 module_salt_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 salt_min = 32; + + return salt_min; +} + +u32 module_salt_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 salt_max = 32; + + return salt_max; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 3; + + token.signatures_cnt = 1; + token.signatures_buf[0] = SIGNATURE_NETIQ_SSPR_SHA256_SALTED; + + token.len[0] = strlen (SIGNATURE_NETIQ_SSPR_SHA256_SALTED); + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_SIGNATURE; + + token.sep[1] = '$'; + token.len[1] = 32; + token.attr[1] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_BASE64A; + + token.sep[2] = '$'; + token.len[2] = 64; + token.attr[2] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + // iter + + salt->salt_iter = 100000 - 1; + + // salt + + const u8 *salt_pos = token.buf[1]; + const int salt_len = token.len[1]; + + salt->salt_len = salt_len; + + memcpy ((u8 *) salt->salt_buf, salt_pos, salt->salt_len); + + // digest + + const u8 *hash_pos = token.buf[2]; + + digest[0] = hex_to_u32 (hash_pos + 0); + digest[1] = hex_to_u32 (hash_pos + 8); + digest[2] = hex_to_u32 (hash_pos + 16); + digest[3] = hex_to_u32 (hash_pos + 24); + digest[4] = hex_to_u32 (hash_pos + 32); + digest[5] = hex_to_u32 (hash_pos + 40); + digest[6] = hex_to_u32 (hash_pos + 48); + digest[7] = hex_to_u32 (hash_pos + 56); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + digest[5] = byte_swap_32 (digest[5]); + digest[6] = byte_swap_32 (digest[6]); + digest[7] = byte_swap_32 (digest[7]); + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u32 *digest = (const u32 *) digest_buf; + + // salt + + const u8 *salt_buf = (const u8 *) salt->salt_buf; + + // digest + + u32 tmp[8]; + + tmp[0] = byte_swap_32 (digest[0]); + tmp[1] = byte_swap_32 (digest[1]); + tmp[2] = byte_swap_32 (digest[2]); + tmp[3] = byte_swap_32 (digest[3]); + tmp[4] = byte_swap_32 (digest[4]); + tmp[5] = byte_swap_32 (digest[5]); + tmp[6] = byte_swap_32 (digest[6]); + tmp[7] = byte_swap_32 (digest[7]); + + u8 *out_buf = (u8 *) line_buf; + + int out_len = snprintf ((char *) out_buf, line_size, "%s%s$", + SIGNATURE_NETIQ_SSPR_SHA256_SALTED, + salt_buf); + + out_buf += out_len; + + u32_to_hex (tmp[0], out_buf + 0); + u32_to_hex (tmp[1], out_buf + 8); + u32_to_hex (tmp[2], out_buf + 16); + u32_to_hex (tmp[3], out_buf + 24); + u32_to_hex (tmp[4], out_buf + 32); + u32_to_hex (tmp[5], out_buf + 40); + u32_to_hex (tmp[6], out_buf + 48); + u32_to_hex (tmp[7], out_buf + 56); + + out_len += 64; + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = module_salt_max; + module_ctx->module_salt_min = module_salt_min; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_32031.c b/src/modules/module_32031.c new file mode 100644 index 000000000..2ce2cf719 --- /dev/null +++ b/src/modules/module_32031.c @@ -0,0 +1,272 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 3; +static const u32 DGST_POS1 = 7; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 6; +static const u32 DGST_SIZE = DGST_SIZE_4_8; +static const u32 HASH_CATEGORY = HASH_CATEGORY_EAS; +static const char *HASH_NAME = "Adobe AEM (SSPR, SHA-256 with Salt)"; +static const u64 KERN_TYPE = 32030; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; +static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "$sspr$3$1000$f9bbf1381f481427$a1b45fd7eb190cc7f0bf831698cb777207eebbb4b7ea2abd6fff84be539aae62"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +typedef struct netiq_sspr_sha256_tmp +{ + u32 dgst[8]; + +} netiq_sspr_sha256_tmp_t; + +static const char *SIGNATURE_ADOBE_AES_SHA256_SALTED = "$sspr$3$1000$"; + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = (const u64) sizeof (netiq_sspr_sha256_tmp_t); + + return tmp_size; +} + +u32 module_salt_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 salt_min = 16; + + return salt_min; +} + +u32 module_salt_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 salt_max = 16; + + return salt_max; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 3; + + token.signatures_cnt = 1; + token.signatures_buf[0] = SIGNATURE_ADOBE_AES_SHA256_SALTED; + + token.len[0] = strlen (SIGNATURE_ADOBE_AES_SHA256_SALTED); + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_SIGNATURE; + + token.sep[1] = '$'; + token.len[1] = 16; + token.attr[1] = TOKEN_ATTR_FIXED_LENGTH; + + if (hashconfig->opts_type & OPTS_TYPE_ST_HEX) + { + token.attr[1] |= TOKEN_ATTR_VERIFY_HEX; + } + + token.sep[2] = '$'; + token.len[2] = 64; + token.attr[2] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + // iter + + salt->salt_iter = 1000 - 1; + + // salt + + const u8 *salt_pos = token.buf[1]; + const int salt_len = token.len[1]; + + const bool parse_rc = generic_salt_decode (hashconfig, salt_pos, salt_len, (u8 *) salt->salt_buf, (int *) &salt->salt_len); + + if (parse_rc == false) return (PARSER_SALT_LENGTH); + + // digest + + const u8 *hash_pos = token.buf[2]; + + digest[0] = hex_to_u32 (hash_pos + 0); + digest[1] = hex_to_u32 (hash_pos + 8); + digest[2] = hex_to_u32 (hash_pos + 16); + digest[3] = hex_to_u32 (hash_pos + 24); + digest[4] = hex_to_u32 (hash_pos + 32); + digest[5] = hex_to_u32 (hash_pos + 40); + digest[6] = hex_to_u32 (hash_pos + 48); + digest[7] = hex_to_u32 (hash_pos + 56); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + digest[5] = byte_swap_32 (digest[5]); + digest[6] = byte_swap_32 (digest[6]); + digest[7] = byte_swap_32 (digest[7]); + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u32 *digest = (const u32 *) digest_buf; + + // salt + + u8 salt_buf[16 + 1]; + + memset (salt_buf, 0, sizeof (salt_buf)); + + generic_salt_encode (hashconfig, (const u8 *) salt->salt_buf, (const int) salt->salt_len, salt_buf); + + // digest + + u32 tmp[8]; + + tmp[0] = byte_swap_32 (digest[0]); + tmp[1] = byte_swap_32 (digest[1]); + tmp[2] = byte_swap_32 (digest[2]); + tmp[3] = byte_swap_32 (digest[3]); + tmp[4] = byte_swap_32 (digest[4]); + tmp[5] = byte_swap_32 (digest[5]); + tmp[6] = byte_swap_32 (digest[6]); + tmp[7] = byte_swap_32 (digest[7]); + + u8 *out_buf = (u8 *) line_buf; + + int out_len = snprintf ((char *) out_buf, line_size, "%s%s$", SIGNATURE_ADOBE_AES_SHA256_SALTED, salt_buf); + + out_buf += out_len; + + u32_to_hex (tmp[0], out_buf + 0); + u32_to_hex (tmp[1], out_buf + 8); + u32_to_hex (tmp[2], out_buf + 16); + u32_to_hex (tmp[3], out_buf + 24); + u32_to_hex (tmp[4], out_buf + 32); + u32_to_hex (tmp[5], out_buf + 40); + u32_to_hex (tmp[6], out_buf + 48); + u32_to_hex (tmp[7], out_buf + 56); + + out_len += 64; + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = module_salt_max; + module_ctx->module_salt_min = module_salt_min; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_32040.c b/src/modules/module_32040.c new file mode 100644 index 000000000..a9afe56f7 --- /dev/null +++ b/src/modules/module_32040.c @@ -0,0 +1,268 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 14; +static const u32 DGST_POS1 = 15; +static const u32 DGST_POS2 = 6; +static const u32 DGST_POS3 = 7; +static const u32 DGST_SIZE = DGST_SIZE_8_8; +static const u32 HASH_CATEGORY = HASH_CATEGORY_EAS; +static const char *HASH_NAME = "NetIQ SSPR (SHA-512 with Salt)"; +static const u64 KERN_TYPE = 32040; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_USES_BITS_64 + | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_ST_BASE64 + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; +static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "$sspr$4$100000$NzYwNjMyNDc2MTQ2OTE4NTUzODAyODE3$0ce2e8b8efa4280e6e003d77cb45d45300dff3960c5c073f68303565fe62fe4ff3ada8cee7d3b87d0457335ab0df73c5c64ee1f71ccf6b8bd43a316ecb42ecd4"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +typedef struct netiq_sspr_sha512_tmp +{ + u64 dgst[8]; + +} netiq_sspr_sha512_tmp_t; + +static const char *SIGNATURE_NETIQ_SSPR_SHA512_SALTED = "$sspr$4$100000$"; + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = (const u64) sizeof (netiq_sspr_sha512_tmp_t); + + return tmp_size; +} + +u32 module_salt_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 salt_min = 32; + + return salt_min; +} + +u32 module_salt_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 salt_max = 32; + + return salt_max; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u64 *digest = (u64 *) digest_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 3; + + token.signatures_cnt = 1; + token.signatures_buf[0] = SIGNATURE_NETIQ_SSPR_SHA512_SALTED; + + token.len[0] = strlen (SIGNATURE_NETIQ_SSPR_SHA512_SALTED); + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_SIGNATURE; + + token.sep[1] = '$'; + token.len[1] = 32; + token.attr[1] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_BASE64A; + + token.sep[2] = '$'; + token.len[2] = 128; + token.attr[2] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + // iter + + salt->salt_iter = 100000 - 1; + + // salt + + const u8 *salt_pos = token.buf[1]; + const int salt_len = token.len[1]; + + salt->salt_len = salt_len; + + memcpy ((u8 *) salt->salt_buf, salt_pos, salt->salt_len); + + // digest + + const u8 *hash_pos = token.buf[2]; + + digest[0] = hex_to_u64 (hash_pos + 0); + digest[1] = hex_to_u64 (hash_pos + 16); + digest[2] = hex_to_u64 (hash_pos + 32); + digest[3] = hex_to_u64 (hash_pos + 48); + digest[4] = hex_to_u64 (hash_pos + 64); + digest[5] = hex_to_u64 (hash_pos + 80); + digest[6] = hex_to_u64 (hash_pos + 96); + digest[7] = hex_to_u64 (hash_pos + 112); + + digest[0] = byte_swap_64 (digest[0]); + digest[1] = byte_swap_64 (digest[1]); + digest[2] = byte_swap_64 (digest[2]); + digest[3] = byte_swap_64 (digest[3]); + digest[4] = byte_swap_64 (digest[4]); + digest[5] = byte_swap_64 (digest[5]); + digest[6] = byte_swap_64 (digest[6]); + digest[7] = byte_swap_64 (digest[7]); + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u64 *digest = (const u64 *) digest_buf; + + // salt + + const u8 *salt_buf = (const u8 *) salt->salt_buf; + + // digest + + u64 tmp[8]; + + tmp[0] = byte_swap_64 (digest[0]); + tmp[1] = byte_swap_64 (digest[1]); + tmp[2] = byte_swap_64 (digest[2]); + tmp[3] = byte_swap_64 (digest[3]); + tmp[4] = byte_swap_64 (digest[4]); + tmp[5] = byte_swap_64 (digest[5]); + tmp[6] = byte_swap_64 (digest[6]); + tmp[7] = byte_swap_64 (digest[7]); + + u8 *out_buf = (u8 *) line_buf; + + int out_len = snprintf ((char *) out_buf, line_size, "%s%s$", + SIGNATURE_NETIQ_SSPR_SHA512_SALTED, + salt_buf); + + out_buf += out_len; + + u64_to_hex (tmp[0], out_buf + 0); + u64_to_hex (tmp[1], out_buf + 16); + u64_to_hex (tmp[2], out_buf + 32); + u64_to_hex (tmp[3], out_buf + 48); + u64_to_hex (tmp[4], out_buf + 64); + u64_to_hex (tmp[5], out_buf + 80); + u64_to_hex (tmp[6], out_buf + 96); + u64_to_hex (tmp[7], out_buf + 112); + + out_len += 128; + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = module_salt_max; + module_ctx->module_salt_min = module_salt_min; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_32041.c b/src/modules/module_32041.c new file mode 100644 index 000000000..445562e30 --- /dev/null +++ b/src/modules/module_32041.c @@ -0,0 +1,275 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 14; +static const u32 DGST_POS1 = 15; +static const u32 DGST_POS2 = 6; +static const u32 DGST_POS3 = 7; +static const u32 DGST_SIZE = DGST_SIZE_8_8; +static const u32 HASH_CATEGORY = HASH_CATEGORY_EAS; +static const char *HASH_NAME = "Adobe AEM (SSPR, SHA-512 with Salt)"; +static const u64 KERN_TYPE = 32040; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_USES_BITS_64 + | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; +static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "$sspr$4$1000$9ad596c50a5c9acd$d4cdc3c7d227e3cc57a9c9014b1eff1684808ef40191482cd8ae6e9d7b66211a5f04e4b34f494b0513a5f67b9614c5ff16e95e624a60f41b16b90533f305146e"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +typedef struct netiq_sspr_sha512_tmp +{ + u64 dgst[8]; + +} netiq_sspr_sha512_tmp_t; + +static const char *SIGNATURE_ADOBE_AEM_SHA512_SALTED = "$sspr$4$1000$"; + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = (const u64) sizeof (netiq_sspr_sha512_tmp_t); + + return tmp_size; +} + +u32 module_salt_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 salt_min = 16; + + return salt_min; +} + +u32 module_salt_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 salt_max = 16; + + return salt_max; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u64 *digest = (u64 *) digest_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 3; + + token.signatures_cnt = 1; + token.signatures_buf[0] = SIGNATURE_ADOBE_AEM_SHA512_SALTED; + + token.len[0] = strlen (SIGNATURE_ADOBE_AEM_SHA512_SALTED); + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_SIGNATURE; + + token.sep[1] = '$'; + token.len[1] = 16; + token.attr[1] = TOKEN_ATTR_FIXED_LENGTH; + + if (hashconfig->opts_type & OPTS_TYPE_ST_HEX) + { + token.attr[1] |= TOKEN_ATTR_VERIFY_HEX; + } + + token.sep[2] = '$'; + token.len[2] = 128; + token.attr[2] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + // iter + + salt->salt_iter = 1000 - 1; + + // salt + + const u8 *salt_pos = token.buf[1]; + const int salt_len = token.len[1]; + + const bool parse_rc = generic_salt_decode (hashconfig, salt_pos, salt_len, (u8 *) salt->salt_buf, (int *) &salt->salt_len); + + if (parse_rc == false) return (PARSER_SALT_LENGTH); + + // digest + + const u8 *hash_pos = token.buf[2]; + + digest[0] = hex_to_u64 (hash_pos + 0); + digest[1] = hex_to_u64 (hash_pos + 16); + digest[2] = hex_to_u64 (hash_pos + 32); + digest[3] = hex_to_u64 (hash_pos + 48); + digest[4] = hex_to_u64 (hash_pos + 64); + digest[5] = hex_to_u64 (hash_pos + 80); + digest[6] = hex_to_u64 (hash_pos + 96); + digest[7] = hex_to_u64 (hash_pos + 112); + + digest[0] = byte_swap_64 (digest[0]); + digest[1] = byte_swap_64 (digest[1]); + digest[2] = byte_swap_64 (digest[2]); + digest[3] = byte_swap_64 (digest[3]); + digest[4] = byte_swap_64 (digest[4]); + digest[5] = byte_swap_64 (digest[5]); + digest[6] = byte_swap_64 (digest[6]); + digest[7] = byte_swap_64 (digest[7]); + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u64 *digest = (const u64 *) digest_buf; + + // salt + + u8 salt_buf[16 + 1]; + + memset (salt_buf, 0, sizeof (salt_buf)); + + generic_salt_encode (hashconfig, (const u8 *) salt->salt_buf, (const int) salt->salt_len, salt_buf); + + // digest + + u64 tmp[8]; + + tmp[0] = byte_swap_64 (digest[0]); + tmp[1] = byte_swap_64 (digest[1]); + tmp[2] = byte_swap_64 (digest[2]); + tmp[3] = byte_swap_64 (digest[3]); + tmp[4] = byte_swap_64 (digest[4]); + tmp[5] = byte_swap_64 (digest[5]); + tmp[6] = byte_swap_64 (digest[6]); + tmp[7] = byte_swap_64 (digest[7]); + + u8 *out_buf = (u8 *) line_buf; + + int out_len = snprintf ((char *) out_buf, line_size, "%s%s$", + SIGNATURE_ADOBE_AEM_SHA512_SALTED, + salt_buf); + + out_buf += out_len; + + u64_to_hex (tmp[0], out_buf + 0); + u64_to_hex (tmp[1], out_buf + 16); + u64_to_hex (tmp[2], out_buf + 32); + u64_to_hex (tmp[3], out_buf + 48); + u64_to_hex (tmp[4], out_buf + 64); + u64_to_hex (tmp[5], out_buf + 80); + u64_to_hex (tmp[6], out_buf + 96); + u64_to_hex (tmp[7], out_buf + 112); + + out_len += 128; + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = module_salt_max; + module_ctx->module_salt_min = module_salt_min; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_32050.c b/src/modules/module_32050.c new file mode 100644 index 000000000..131651dce --- /dev/null +++ b/src/modules/module_32050.c @@ -0,0 +1,297 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 1; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 3; +static const u32 DGST_SIZE = DGST_SIZE_4_5; +static const u32 HASH_CATEGORY = HASH_CATEGORY_EAS; +static const char *HASH_NAME = "NetIQ SSPR (PBKDF2WithHmacSHA1)"; +static const u64 KERN_TYPE = 12000; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE; +static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "$pbkdf2-hmac-sha1$100000$7134180503252384106490944216249411431665011151428170747164626720$990e0c5f62b1384d48cbe3660329b9741c4a8473"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +typedef struct pbkdf2_sha1_tmp +{ + u32 ipad[5]; + u32 opad[5]; + + u32 dgst[32]; + u32 out[32]; + +} pbkdf2_sha1_tmp_t; + +typedef struct pbkdf2_sha1 +{ + u32 salt_buf[64]; + +} pbkdf2_sha1_t; + +static const char *SIGNATURE_NETIQ_PBKDF2_HMAC_SHA1 = "$pbkdf2-hmac-sha1$100000$"; + +u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 esalt_size = (const u64) sizeof (pbkdf2_sha1_t); + + return esalt_size; +} + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = (const u64) sizeof (pbkdf2_sha1_tmp_t); + + return tmp_size; +} + +u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + // this overrides the reductions of PW_MAX in case optimized kernel is selected + // IOW, even in optimized kernel mode it support length 256 + + const u32 pw_max = PW_MAX; + + return pw_max; +} + +u32 module_salt_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 salt_min = 64; + + return salt_min; +} + +u32 module_salt_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 salt_max = 64; + + return salt_max; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) esalt_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 3; + + token.signatures_cnt = 1; + token.signatures_buf[0] = SIGNATURE_NETIQ_PBKDF2_HMAC_SHA1; + + token.len[0] = strlen (SIGNATURE_NETIQ_PBKDF2_HMAC_SHA1); + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_SIGNATURE; + + token.sep[1] = '$'; + token.len[1] = 64; + token.attr[1] = TOKEN_ATTR_FIXED_LENGTH; + + if (hashconfig->opts_type & OPTS_TYPE_ST_HEX) + { + token.attr[1] |= TOKEN_ATTR_VERIFY_HEX; + } + + token.sep[2] = '$'; + token.len[2] = 40; + token.attr[2] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + // iter + + salt->salt_iter = 100000 - 1; + + // salt + + const u8 *salt_pos = token.buf[1]; + const int salt_len = token.len[1]; + + u8 *salt_ptr = (u8 *) pbkdf2_sha1->salt_buf; + + salt->salt_len = hex_decode (salt_pos, salt_len, salt_ptr); + + salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0]; + salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1]; + salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2]; + salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3]; + salt->salt_buf[4] = salt->salt_iter; + + // hash + + const u8 *hash_pos = token.buf[2]; + + digest[0] = hex_to_u32 (hash_pos + 0); + digest[1] = hex_to_u32 (hash_pos + 8); + digest[2] = hex_to_u32 (hash_pos + 16); + digest[3] = hex_to_u32 (hash_pos + 24); + digest[4] = hex_to_u32 (hash_pos + 32); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u32 *digest = (const u32 *) digest_buf; + + const pbkdf2_sha1_t *pbkdf2_sha1 = (const pbkdf2_sha1_t *) esalt_buf; + + // salt + + u8 salt_buf[64 + 1]; + + memset (salt_buf, 0, sizeof (salt_buf)); + + hex_encode ((const u8 *) pbkdf2_sha1->salt_buf, salt->salt_len, salt_buf); + + // digest + + u32 tmp[5]; + + tmp[0] = byte_swap_32 (digest[0]); + tmp[1] = byte_swap_32 (digest[1]); + tmp[2] = byte_swap_32 (digest[2]); + tmp[3] = byte_swap_32 (digest[3]); + tmp[4] = byte_swap_32 (digest[4]); + + u8 *out_buf = (u8 *) line_buf; + + int out_len = snprintf ((char *) out_buf, line_size, "%s%s$", + SIGNATURE_NETIQ_PBKDF2_HMAC_SHA1, + salt_buf); + + out_buf += out_len; + + u32_to_hex (tmp[0], out_buf + 0); + u32_to_hex (tmp[1], out_buf + 8); + u32_to_hex (tmp[2], out_buf + 16); + u32_to_hex (tmp[3], out_buf + 24); + u32_to_hex (tmp[4], out_buf + 32); + + out_len += 40; + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = module_esalt_size; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = module_pw_max; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = module_salt_max; + module_ctx->module_salt_min = module_salt_min; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_32060.c b/src/modules/module_32060.c new file mode 100644 index 000000000..eade07596 --- /dev/null +++ b/src/modules/module_32060.c @@ -0,0 +1,361 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 1; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 3; +static const u32 DGST_SIZE = DGST_SIZE_4_64; +static const u32 HASH_CATEGORY = HASH_CATEGORY_EAS; +static const char *HASH_NAME = "NetIQ SSPR (PBKDF2WithHmacSHA256)"; +static const u64 KERN_TYPE = 10900; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_ST_BASE64; +static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "$pbkdf2-sha256$100000$MDUzMTE4NjQyNDc5NTQxMjAwMjg1OTYxNjAxNDgzNzc$bwYpAyQ2g5PqdnMj8mJ46mkwQbyztw8gEQqnhDHj48c"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +typedef struct pbkdf2_sha256_tmp +{ + u32 ipad[8]; + u32 opad[8]; + + u32 dgst[32]; + u32 out[32]; + +} pbkdf2_sha256_tmp_t; + +typedef struct pbkdf2_sha256 +{ + u32 salt_buf[64]; + +} pbkdf2_sha256_t; + +static const char *SIGNATURE_NETIQ_PBKDF2_HMAC_SHA256 = "$pbkdf2-sha256$100000$"; + +char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) +{ + char *jit_build_options = NULL; + + // Extra treatment for Apple systems + if (device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) + { + return jit_build_options; + } + + // NVIDIA GPU + if (device_param->opencl_device_vendor_id == VENDOR_ID_NV) + { + hc_asprintf (&jit_build_options, "-D _unroll"); + } + + // HIP + if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD_USE_HIP) + { + hc_asprintf (&jit_build_options, "-D _unroll"); + } + + // ROCM + if ((device_param->opencl_device_vendor_id == VENDOR_ID_AMD) && (device_param->has_vperm == true)) + { + hc_asprintf (&jit_build_options, "-D _unroll"); + } + + return jit_build_options; +} + +u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 esalt_size = (const u64) sizeof (pbkdf2_sha256_t); + + return esalt_size; +} + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = (const u64) sizeof (pbkdf2_sha256_tmp_t); + + return tmp_size; +} + +u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + // this overrides the reductions of PW_MAX in case optimized kernel is selected + // IOW, even in optimized kernel mode it support length 256 + + const u32 pw_max = PW_MAX; + + return pw_max; +} + +u32 module_salt_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 salt_min = 43; + + return salt_min; +} + +u32 module_salt_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 salt_max = 43; + + return salt_max; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) esalt_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 3; + + token.signatures_cnt = 1; + token.signatures_buf[0] = SIGNATURE_NETIQ_PBKDF2_HMAC_SHA256; + + token.len[0] = strlen (SIGNATURE_NETIQ_PBKDF2_HMAC_SHA256); + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_SIGNATURE; + + token.sep[1] = '$'; + token.len[1] = 43; + token.attr[1] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_BASE64B; + + token.sep[2] = '$'; + token.len[2] = 43; + token.attr[2] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_BASE64B; + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + u8 tmp_buf[32 + 1]; + int tmp_len; + + // iter + + salt->salt_iter = 100000 - 1; + + // salt + + const u8 *salt_pos = token.buf[1]; + const int salt_len = token.len[1]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + tmp_len = base64_decode (ab64_to_int, salt_pos, salt_len, tmp_buf); + + if (tmp_len != 32) return (PARSER_SALT_LENGTH); + + memcpy (pbkdf2_sha256->salt_buf, tmp_buf, tmp_len); + + salt->salt_len = tmp_len; + + salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0]; + salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1]; + salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2]; + salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3]; + salt->salt_buf[4] = salt->salt_iter; + + // hash + + const u8 *hash_pos = token.buf[2]; + const int hash_len = token.len[2]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + tmp_len = base64_decode (ab64_to_int, hash_pos, hash_len, tmp_buf); + + if (tmp_len != 32) return (PARSER_HASH_LENGTH); + + memcpy (digest, tmp_buf, tmp_len); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + digest[5] = byte_swap_32 (digest[5]); + digest[6] = byte_swap_32 (digest[6]); + digest[7] = byte_swap_32 (digest[7]); + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u32 *digest = (const u32 *) digest_buf; + + const pbkdf2_sha256_t *pbkdf2_sha256 = (const pbkdf2_sha256_t *) esalt_buf; + + // salt + + u8 salt_buf[44 + 1]; + + memset (salt_buf, 0, sizeof (salt_buf)); + + const size_t salt_len_enc = base64_encode (int_to_ab64, (const u8 *) pbkdf2_sha256->salt_buf, salt->salt_len, salt_buf); + + // remove padding + + for (size_t i = 0; i < salt_len_enc; i++) + { + if (salt_buf[i] == '=') + { + salt_buf[i] = '\0'; + } + } + + // digest + + u32 tmp[9]; + + tmp[0] = byte_swap_32 (digest[0]); + tmp[1] = byte_swap_32 (digest[1]); + tmp[2] = byte_swap_32 (digest[2]); + tmp[3] = byte_swap_32 (digest[3]); + tmp[4] = byte_swap_32 (digest[4]); + tmp[5] = byte_swap_32 (digest[5]); + tmp[6] = byte_swap_32 (digest[6]); + tmp[7] = byte_swap_32 (digest[7]); + tmp[8] = 0; + + u8 hash_buf[44 + 1]; + + memset (hash_buf, 0, sizeof (hash_buf)); + + const size_t hash_len_enc = base64_encode (int_to_ab64, (const u8 *) tmp, 32, hash_buf); + + // remove padding + + for (size_t i = 0; i < hash_len_enc; i++) + { + if (hash_buf[i] == '=') + { + hash_buf[i] = '\0'; + } + } + + u8 *out_buf = (u8 *) line_buf; + + int out_len = snprintf ((char *) out_buf, line_size, "%s%s$%s", + SIGNATURE_NETIQ_PBKDF2_HMAC_SHA256, + salt_buf, + hash_buf); + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = module_esalt_size; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = module_jit_build_options; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = module_pw_max; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = module_salt_max; + module_ctx->module_salt_min = module_salt_min; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_32070.c b/src/modules/module_32070.c new file mode 100644 index 000000000..a2a785628 --- /dev/null +++ b/src/modules/module_32070.c @@ -0,0 +1,310 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 1; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 3; +static const u32 DGST_SIZE = DGST_SIZE_8_16; +static const u32 HASH_CATEGORY = HASH_CATEGORY_EAS; +static const char *HASH_NAME = "NetIQ SSPR (PBKDF2WithHmacSHA512)"; +static const u64 KERN_TYPE = 7100; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_USES_BITS_64 + | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE; +static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "$pbkdf2-hmac-sha512$100000.0211258841559010919749469547425215185689838310218571790549787198.1659e40e64daf84d635a5f1ed2f5708f6735233bed471994bdc0307b3c5f77597f79bdcdd088d1e79357b383809ddfd84379006b49e14f4ff45c449071478777"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +typedef struct pbkdf2_sha512_tmp +{ + u64 ipad[8]; + u64 opad[8]; + + u64 dgst[16]; + u64 out[16]; + +} pbkdf2_sha512_tmp_t; + +typedef struct pbkdf2_sha512 +{ + u32 salt_buf[64]; + +} pbkdf2_sha512_t; + +static const char *SIGNATURE_NETIQ_PBKDF2_HMAC_SHA512 = "$pbkdf2-hmac-sha512$100000."; + +u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 esalt_size = (const u64) sizeof (pbkdf2_sha512_t); + + return esalt_size; +} + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = (const u64) sizeof (pbkdf2_sha512_tmp_t); + + return tmp_size; +} + +u32 module_pw_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + // this overrides the reductions of PW_MAX in case optimized kernel is selected + // IOW, even in optimized kernel mode it support length 256 + + const u32 pw_max = PW_MAX; + + return pw_max; +} + +u32 module_salt_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 salt_min = 64; + + return salt_min; +} + +u32 module_salt_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 salt_max = 64; + + return salt_max; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u64 *digest = (u64 *) digest_buf; + + pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) esalt_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 3; + + token.signatures_cnt = 1; + token.signatures_buf[0] = SIGNATURE_NETIQ_PBKDF2_HMAC_SHA512; + + token.len[0] = strlen (SIGNATURE_NETIQ_PBKDF2_HMAC_SHA512); + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_SIGNATURE; + + token.sep[1] = '.'; + token.len[1] = 64; + token.attr[1] = TOKEN_ATTR_FIXED_LENGTH; + + if (hashconfig->opts_type & OPTS_TYPE_ST_HEX) + { + token.attr[1] |= TOKEN_ATTR_VERIFY_HEX; + } + + token.sep[2] = '.'; + token.len[2] = 128; + token.attr[2] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + // iter + + salt->salt_iter = 100000 - 1; + + // salt + + const u8 *salt_pos = token.buf[1]; + const int salt_len = token.len[1]; + + u8 *salt_ptr = (u8 *) pbkdf2_sha512->salt_buf; + + salt->salt_len = hex_decode (salt_pos, salt_len, salt_ptr); + + salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0]; + salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1]; + salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2]; + salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3]; + salt->salt_buf[4] = salt->salt_iter; + + // hash + + const u8 *hash_pos = token.buf[2]; + + digest[0] = hex_to_u64 (hash_pos + 0); + digest[1] = hex_to_u64 (hash_pos + 16); + digest[2] = hex_to_u64 (hash_pos + 32); + digest[3] = hex_to_u64 (hash_pos + 48); + digest[4] = hex_to_u64 (hash_pos + 64); + digest[5] = hex_to_u64 (hash_pos + 80); + digest[6] = hex_to_u64 (hash_pos + 96); + digest[7] = hex_to_u64 (hash_pos + 112); + + digest[0] = byte_swap_64 (digest[0]); + digest[1] = byte_swap_64 (digest[1]); + digest[2] = byte_swap_64 (digest[2]); + digest[3] = byte_swap_64 (digest[3]); + digest[4] = byte_swap_64 (digest[4]); + digest[5] = byte_swap_64 (digest[5]); + digest[6] = byte_swap_64 (digest[6]); + digest[7] = byte_swap_64 (digest[7]); + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u64 *digest = (const u64 *) digest_buf; + + const pbkdf2_sha512_t *pbkdf2_sha512 = (const pbkdf2_sha512_t *) esalt_buf; + + // salt + + u8 salt_buf[64 + 1]; + + memset (salt_buf, 0, sizeof (salt_buf)); + + hex_encode ((const u8 *) pbkdf2_sha512->salt_buf, salt->salt_len, salt_buf); + + // digest + + u64 tmp[8]; + + tmp[0] = byte_swap_64 (digest[0]); + tmp[1] = byte_swap_64 (digest[1]); + tmp[2] = byte_swap_64 (digest[2]); + tmp[3] = byte_swap_64 (digest[3]); + tmp[4] = byte_swap_64 (digest[4]); + tmp[5] = byte_swap_64 (digest[5]); + tmp[6] = byte_swap_64 (digest[6]); + tmp[7] = byte_swap_64 (digest[7]); + + u8 *out_buf = (u8 *) line_buf; + + int out_len = snprintf ((char *) out_buf, line_size, "%s%s.", + SIGNATURE_NETIQ_PBKDF2_HMAC_SHA512, + salt_buf); + + out_buf += out_len; + + u64_to_hex (tmp[0], out_buf + 0); + u64_to_hex (tmp[1], out_buf + 16); + u64_to_hex (tmp[2], out_buf + 32); + u64_to_hex (tmp[3], out_buf + 48); + u64_to_hex (tmp[4], out_buf + 64); + u64_to_hex (tmp[5], out_buf + 80); + u64_to_hex (tmp[6], out_buf + 96); + u64_to_hex (tmp[7], out_buf + 112); + + out_len += 128; + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = module_esalt_size; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = module_pw_max; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = module_salt_max; + module_ctx->module_salt_min = module_salt_min; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_32100.c b/src/modules/module_32100.c new file mode 100644 index 000000000..cbcee0c86 --- /dev/null +++ b/src/modules/module_32100.c @@ -0,0 +1,420 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 1; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 3; +static const u32 DGST_SIZE = DGST_SIZE_4_4; +static const u32 HASH_CATEGORY = HASH_CATEGORY_NETWORK_PROTOCOL; +static const char *HASH_NAME = "Kerberos 5, etype 17, AS-REP"; +static const u64 KERN_TYPE = 32100; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE; +static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "$krb5asrep$17$user$EXAMPLE.COM$a419c4030e555734b06c2629$c09a1421f96eb126c757a4b87830381f142477d9a85b2beb3093dbfd44f38ddb6016a479537fb7b36e046315869fe79187217971ff6a12c1e0a2df3f68045e03814b21f756d8981f781803d65e8572823c88979581d93cf7d768f2efced16f3719b8d1004d9e73d798de255383476bced47d1982f16be77d0feb55a1f44f58bd013fa4caee58ac614caf0f1cf9101ec9623c5b8c2a1491b73f134f074790088fdb360b5ebce0d32a8145ed00a81ddf77188e150b92d8e8ddd0285d27f1514253e5546e6bba864b362bb1e6483b26d08fa4cc268bfbefe0f690039bcc524b774599df3680c1c3431d891bfa99514a877f964e"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +// Struct to store the hash structure - same fields as TGS-REP type 17 +typedef struct krb5asrep_17 +{ + u32 user[128]; + u32 domain[128]; + u32 account_info[512]; + u32 account_info_len; + + u32 checksum[3]; + u32 edata2[5120]; + u32 edata2_len; + u32 format; + +} krb5asrep_17_t; + +typedef struct krb5asrep_17_tmp +{ + u32 ipad[5]; + u32 opad[5]; + u32 dgst[16]; + u32 out[16]; + +} krb5asrep_17_tmp_t; + +static const char *SIGNATURE_KRB5ASREP = "$krb5asrep$17$"; + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = (const u64) sizeof (krb5asrep_17_tmp_t); + + return tmp_size; +} + +u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 esalt_size = (const u64) sizeof (krb5asrep_17_t); + + return esalt_size; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + krb5asrep_17_t *krb5asrep = (krb5asrep_17_t *) esalt_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.signatures_cnt = 1; + token.signatures_buf[0] = SIGNATURE_KRB5ASREP; + + token.len[0] = strlen (SIGNATURE_KRB5ASREP); + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_SIGNATURE; + + /** + * Hashcat + * format 1: $krb5asrep$18$user$realm$checksum$edata2 + * + * JtR + * format 2: $krb5asrep$18$salt$edata2$checksum + */ + + if (line_len < (int) strlen (SIGNATURE_KRB5ASREP)) return (PARSER_SALT_LENGTH); + + memset (krb5asrep, 0, sizeof (krb5asrep_17_t)); + + /** + * JtR format has the checksum at the end, so can identify it based on the + * separator ('$') being at a fixed length from the end of the line. Checksum + * is 24 characters in length, so then there should be a '$' at line_len - 25 + */ + + if (line_buf[line_len - 25] == '$') + { + // JtR format + krb5asrep->format = 2; + } + else + { + // Hashcat format + krb5asrep->format = 1; + } + + token.token_cnt = 4; + + if (krb5asrep->format == 1) + { + token.token_cnt++; + + // user + token.sep[1] = '$'; + token.len_min[1] = 1; + token.len_max[1] = 512; + token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH; + + // realm + token.sep[2] = '$'; + token.len_min[2] = 1; + token.len_max[2] = 512; + token.attr[2] = TOKEN_ATTR_VERIFY_LENGTH; + + // checksum + token.sep[3] = '$'; + // hmac-sha1 stripped to 12bytes + token.len[3] = 24; + token.attr[3] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + // edata2 + token.sep[4] = '$'; + token.len_min[4] = 64; + token.len_max[4] = 40960; + token.attr[4] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + } + else + { + // salt + token.sep[1] = '$'; + token.len_min[1] = 1; + token.len_max[1] = 512; + token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH; + + // edata2 + token.sep[2] = '$'; + token.len_min[2] = 64; + token.len_max[2] = 40960; + token.attr[2] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + // checksum + token.sep[3] = '$'; + // hmac-sha1 stripped to 12bytes + token.len[3] = 24; + token.attr[3] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + } + + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + const u8 *user_pos; + const u8 *domain_pos; + const u8 *salt_pos; + const u8 *checksum_pos; + const u8 *data_pos; + + int user_len; + int domain_len; + int data_len; + int account_info_len; + + if (krb5asrep->format == 1) + { + user_pos = token.buf[1]; + user_len = token.len[1]; + + memcpy (krb5asrep->user, user_pos, user_len); + + domain_pos = token.buf[2]; + domain_len = token.len[2]; + + memcpy (krb5asrep->domain, domain_pos, domain_len); + + checksum_pos = token.buf[3]; + + data_pos = token.buf[4]; + data_len = token.len[4]; + + account_info_len = token.len[2] + token.len[1]; + } + else + { + salt_pos = token.buf[1]; + account_info_len = token.len[1]; + + memcpy (krb5asrep->account_info, salt_pos, account_info_len); + + /** + * JtR format only has the final salt/account_info value (combination of + * user and domain), rather than separate "user" and "domain" values. Since + * user and domain won't be used for the JtR format, their values won't + * matter, so set them both to the same value as account_info. + */ + + user_pos = token.buf[1]; + user_len = token.len[1]; + + memcpy (krb5asrep->user, user_pos, user_len); + + domain_pos = token.buf[1]; + domain_len = token.len[1]; + + memcpy (krb5asrep->domain, domain_pos, domain_len); + + data_pos = token.buf[2]; + data_len = token.len[2]; + + checksum_pos = token.buf[3]; + } + + u8 *account_info_ptr = (u8 *) krb5asrep->account_info; + + // Domain must be uppercase + u8 domain[128]; + + if (krb5asrep->format == 1) + { + memcpy (domain, domain_pos, domain_len); + uppercase (domain, domain_len); + + memcpy (account_info_ptr, domain, domain_len); + memcpy (account_info_ptr + domain_len, user_pos, user_len); + } + + krb5asrep->account_info_len = account_info_len; + + // hmac-sha1 is reduced to 12 bytes + krb5asrep->checksum[0] = byte_swap_32 (hex_to_u32 (checksum_pos + 0)); + krb5asrep->checksum[1] = byte_swap_32 (hex_to_u32 (checksum_pos + 8)); + krb5asrep->checksum[2] = byte_swap_32 (hex_to_u32 (checksum_pos + 16)); + + u8 *edata_ptr = (u8 *) krb5asrep->edata2; + + for (int i = 0; i < data_len; i += 2) + { + const u8 p0 = data_pos[i + 0]; + const u8 p1 = data_pos[i + 1]; + + *edata_ptr++ = hex_convert (p1) << 0 + | hex_convert (p0) << 4; + } + + krb5asrep->edata2_len = data_len / 2; + + salt->salt_buf[0] = krb5asrep->checksum[0]; + salt->salt_buf[1] = krb5asrep->checksum[1]; + salt->salt_buf[2] = krb5asrep->checksum[2]; + + salt->salt_len = 12; + + salt->salt_iter = 4096 - 1; + + digest[0] = krb5asrep->checksum[0]; + digest[1] = krb5asrep->checksum[1]; + digest[2] = krb5asrep->checksum[2]; + digest[3] = 0; + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const krb5asrep_17_t *krb5asrep = (const krb5asrep_17_t *) esalt_buf; + + char data[5120 * 4 * 2] = { 0 }; + + for (u32 i = 0, j = 0; i < krb5asrep->edata2_len; i += 1, j += 2) + { + const u8 *ptr_edata2 = (const u8 *) krb5asrep->edata2; + + snprintf (data + j, 3, "%02x", ptr_edata2[i]); + } + + int line_len = 0; + + if (krb5asrep->format == 1) + { + line_len = snprintf (line_buf, line_size, "%s%s$%s$%08x%08x%08x$%s", + SIGNATURE_KRB5ASREP, + (const char *) krb5asrep->user, + (const char *) krb5asrep->domain, + krb5asrep->checksum[0], + krb5asrep->checksum[1], + krb5asrep->checksum[2], + data); + } + else + { + line_len = snprintf (line_buf, line_size, "%s%s$%s$%08x%08x%08x", + SIGNATURE_KRB5ASREP, + (const char *) krb5asrep->account_info, + data, + krb5asrep->checksum[0], + krb5asrep->checksum[1], + krb5asrep->checksum[2]); + } + + return line_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = module_esalt_size; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_32200.c b/src/modules/module_32200.c new file mode 100644 index 000000000..57f43019b --- /dev/null +++ b/src/modules/module_32200.c @@ -0,0 +1,419 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 1; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 3; +static const u32 DGST_SIZE = DGST_SIZE_4_4; +static const u32 HASH_CATEGORY = HASH_CATEGORY_NETWORK_PROTOCOL; +static const char *HASH_NAME = "Kerberos 5, etype 18, AS-REP"; +static const u64 KERN_TYPE = 32200; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE; +static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "$krb5asrep$18$user$EXAMPLE.COM$aa4c494f520b27873a4de8f7$ebc9976a77f62e8ccca02d43d68bafcc66a81fcbb44a336b00ce401982f32975a5f9bcdc752643252185866685b0a30aaf50e449e392a5994e6979f23aba25f7704c90b2efa03b703c3c2f9e3617cc588ed226d0417e7742d45407878fd946d046b4a9732b9a203cb857811714b009c195b7c96b9bccb7e48832b11a4e92ecf24c49e54de8d0d5d5351445b5126db90bb7eebc7861db1e61de1175824b0a45023a6fa06c2a9d3035fdcf863bea922648e3dc28b48e39b1dec0869e7fe4de399cb52dfcf2596599da54a4bb0169c72d9496de2e137a4594e0e8a69082fc558ac9ace65d32eae5e260a65ca3f2f5871aaeee7a3b090b50f39321d120c144421e0abe7d"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +// Struct to store the hash structure - same fields as TGS-REP type 18 +typedef struct krb5asrep_18 +{ + u32 user[128]; + u32 domain[128]; + u32 account_info[512]; + u32 account_info_len; + + u32 checksum[3]; + u32 edata2[5120]; + u32 edata2_len; + u32 format; + +} krb5asrep_18_t; + +typedef struct krb5asrep_18_tmp +{ + u32 ipad[5]; + u32 opad[5]; + u32 dgst[16]; + u32 out[16]; + +} krb5asrep_18_tmp_t; + +static const char *SIGNATURE_KRB5ASREP = "$krb5asrep$18$"; + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = (const u64) sizeof (krb5asrep_18_tmp_t); + + return tmp_size; +} + +u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 esalt_size = (const u64) sizeof (krb5asrep_18_t); + + return esalt_size; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + krb5asrep_18_t *krb5asrep = (krb5asrep_18_t *) esalt_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.signatures_cnt = 1; + token.signatures_buf[0] = SIGNATURE_KRB5ASREP; + + token.len[0] = strlen (SIGNATURE_KRB5ASREP); + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_SIGNATURE; + + /** + * Hashcat + * format 1: $krb5asrep$18$user$realm$checksum$edata2 + * + * JtR + * format 2: $krb5asrep$18$salt$edata2$checksum + */ + + if (line_len < (int) strlen (SIGNATURE_KRB5ASREP)) return (PARSER_SALT_LENGTH); + + memset (krb5asrep, 0, sizeof (krb5asrep_18_t)); + + /** + * JtR format has the checksum at the end, so can identify it based on the + * separator ('$') being at a fixed length from the end of the line. Checksum + * is 24 characters in length, so then there should be a '$' at line_len - 25 + */ + + if (line_buf[line_len - 25] == '$') + { + // JtR format + krb5asrep->format = 2; + } + else + { + // Hashcat format + krb5asrep->format = 1; + } + + token.token_cnt = 4; + + if (krb5asrep->format == 1) + { + token.token_cnt++; + + // user + token.sep[1] = '$'; + token.len_min[1] = 1; + token.len_max[1] = 512; + token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH; + + // realm + token.sep[2] = '$'; + token.len_min[2] = 1; + token.len_max[2] = 512; + token.attr[2] = TOKEN_ATTR_VERIFY_LENGTH; + + // checksum + token.sep[3] = '$'; + // hmac-sha1 stripped to 12bytes + token.len[3] = 24; + token.attr[3] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + // edata2 + token.sep[4] = '$'; + token.len_min[4] = 64; + token.len_max[4] = 40960; + token.attr[4] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + } + else + { + // salt + token.sep[1] = '$'; + token.len_min[1] = 1; + token.len_max[1] = 512; + token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH; + + // edata2 + token.sep[2] = '$'; + token.len_min[2] = 64; + token.len_max[2] = 40960; + token.attr[2] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + // checksum + token.sep[3] = '$'; + // hmac-sha1 stripped to 12bytes + token.len[3] = 24; + token.attr[3] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + } + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + const u8 *user_pos; + const u8 *domain_pos; + const u8 *salt_pos; + const u8 *checksum_pos; + const u8 *data_pos; + + int user_len; + int domain_len; + int data_len; + int account_info_len; + + if (krb5asrep->format == 1) + { + user_pos = token.buf[1]; + user_len = token.len[1]; + + memcpy (krb5asrep->user, user_pos, user_len); + + domain_pos = token.buf[2]; + domain_len = token.len[2]; + + memcpy (krb5asrep->domain, domain_pos, domain_len); + + checksum_pos = token.buf[3]; + + data_pos = token.buf[4]; + data_len = token.len[4]; + + account_info_len = token.len[2] + token.len[1]; + } + else + { + salt_pos = token.buf[1]; + account_info_len = token.len[1]; + + memcpy (krb5asrep->account_info, salt_pos, account_info_len); + + /** + * JtR format only has the final salt/account_info value (combination of + * user and domain), rather than separate "user" and "domain" values. Since + * user and domain won't be used for the JtR format, their values won't + * matter, so set them both to the same value as account_info. + */ + + user_pos = token.buf[1]; + user_len = token.len[1]; + + memcpy (krb5asrep->user, user_pos, user_len); + + domain_pos = token.buf[1]; + domain_len = token.len[1]; + + memcpy (krb5asrep->domain, domain_pos, domain_len); + + data_pos = token.buf[2]; + data_len = token.len[2]; + + checksum_pos = token.buf[3]; + } + + u8 *account_info_ptr = (u8 *) krb5asrep->account_info; + + // Domain must be uppercase + u8 domain[128]; + + if (krb5asrep->format == 1) + { + memcpy (domain, domain_pos, domain_len); + uppercase (domain, domain_len); + + memcpy (account_info_ptr, domain, domain_len); + memcpy (account_info_ptr + domain_len, user_pos, user_len); + } + + krb5asrep->account_info_len = account_info_len; + + // hmac-sha1 is reduced to 12 bytes + krb5asrep->checksum[0] = byte_swap_32 (hex_to_u32 (checksum_pos + 0)); + krb5asrep->checksum[1] = byte_swap_32 (hex_to_u32 (checksum_pos + 8)); + krb5asrep->checksum[2] = byte_swap_32 (hex_to_u32 (checksum_pos + 16)); + + u8 *edata_ptr = (u8 *) krb5asrep->edata2; + + for (int i = 0; i < data_len; i += 2) + { + const u8 p0 = data_pos[i + 0]; + const u8 p1 = data_pos[i + 1]; + + *edata_ptr++ = hex_convert (p1) << 0 + | hex_convert (p0) << 4; + } + + krb5asrep->edata2_len = data_len / 2; + + salt->salt_buf[0] = krb5asrep->checksum[0]; + salt->salt_buf[1] = krb5asrep->checksum[1]; + salt->salt_buf[2] = krb5asrep->checksum[2]; + + salt->salt_len = 12; + + salt->salt_iter = 4096 - 1; + + digest[0] = krb5asrep->checksum[0]; + digest[1] = krb5asrep->checksum[1]; + digest[2] = krb5asrep->checksum[2]; + digest[3] = 0; + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const krb5asrep_18_t *krb5asrep = (const krb5asrep_18_t *) esalt_buf; + + char data[5120 * 4 * 2] = { 0 }; + + for (u32 i = 0, j = 0; i < krb5asrep->edata2_len; i += 1, j += 2) + { + const u8 *ptr_edata2 = (const u8 *) krb5asrep->edata2; + + snprintf (data + j, 3, "%02x", ptr_edata2[i]); + } + + int line_len = 0; + + if (krb5asrep->format == 1) + { + line_len = snprintf (line_buf, line_size, "%s%s$%s$%08x%08x%08x$%s", + SIGNATURE_KRB5ASREP, + (const char *) krb5asrep->user, + (const char *) krb5asrep->domain, + krb5asrep->checksum[0], + krb5asrep->checksum[1], + krb5asrep->checksum[2], + data); + } + else + { + line_len = snprintf (line_buf, line_size, "%s%s$%s$%08x%08x%08x", + SIGNATURE_KRB5ASREP, + (const char *) krb5asrep->account_info, + data, + krb5asrep->checksum[0], + krb5asrep->checksum[1], + krb5asrep->checksum[2]); + } + + return line_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = module_esalt_size; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_32300.c b/src/modules/module_32300.c new file mode 100644 index 000000000..3c0462e72 --- /dev/null +++ b/src/modules/module_32300.c @@ -0,0 +1,301 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" +#include "emu_inc_hash_md5.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_INSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 3; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 1; +static const u32 DGST_SIZE = DGST_SIZE_4_4; +static const u32 HASH_CATEGORY = HASH_CATEGORY_FORUM_SOFTWARE; +static const char *HASH_NAME = "Empire CMS (Admin password)"; +static const u64 KERN_TYPE = 32300; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_RAW_HASH; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14; +static const u32 SALT_TYPE = SALT_TYPE_GENERIC; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "5962d4ada95d6493379cd9c05ce7a376:726620866134417802643053384570:6056291339665060317728572165496183"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +typedef struct md5_triple_salt +{ + u32 salt1_buf[64]; + int salt1_len; + + u32 salt2_buf[64]; + int salt2_len; + + u32 salt3_buf[64]; + int salt3_len; + +} md5_triple_salt_t; + +u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 esalt_size = (const u64) sizeof (md5_triple_salt_t); + + return esalt_size; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + md5_triple_salt_t *md5_triple_salt = (md5_triple_salt_t *) esalt_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 3; + + token.sep[0] = hashconfig->separator; + token.len[0] = 32; + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + token.sep[1] = hashconfig->separator; + token.len_min[1] = SALT_MIN; + token.len_max[1] = SALT_MAX; + token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH; + + token.sep[2] = hashconfig->separator; + token.len_min[2] = SALT_MIN; + token.len_max[2] = SALT_MAX; + token.attr[2] = TOKEN_ATTR_VERIFY_LENGTH; + + if (hashconfig->opts_type & OPTS_TYPE_ST_HEX) + { + token.len_min[1] *= 2; + token.len_max[1] *= 2; + + token.attr[1] |= TOKEN_ATTR_VERIFY_HEX; + + token.len_min[2] *= 2; + token.len_max[2] *= 2; + + token.attr[2] |= TOKEN_ATTR_VERIFY_HEX; + } + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + const u8 *hash_pos = token.buf[0]; + + digest[0] = hex_to_u32 (hash_pos + 0); + digest[1] = hex_to_u32 (hash_pos + 8); + digest[2] = hex_to_u32 (hash_pos + 16); + digest[3] = hex_to_u32 (hash_pos + 24); + + if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) + { + digest[0] -= MD5M_A; + digest[1] -= MD5M_B; + digest[2] -= MD5M_C; + digest[3] -= MD5M_D; + } + + memset (md5_triple_salt, 0, sizeof (md5_triple_salt_t)); + + const bool parse_rc1 = generic_salt_decode (hashconfig, token.buf[1], token.len[1], (u8 *) md5_triple_salt->salt1_buf, &md5_triple_salt->salt1_len); + + if (parse_rc1 == false) return (PARSER_SALT_LENGTH); + + const bool parse_rc2 = generic_salt_decode (hashconfig, token.buf[2], token.len[2], (u8 *) md5_triple_salt->salt2_buf, &md5_triple_salt->salt2_len); + + if (parse_rc2 == false) return (PARSER_SALT_LENGTH); + + const u8 *empire_salt1 = (const u8 *) "E!m^p-i(r#e.C:M?S"; + const u32 empire_salt1_len = strlen ((const char *) empire_salt1); + + const u8 *empire_salt2 = (const u8 *) "d)i.g^o-d"; + const u32 empire_salt2_len = strlen ((const char *) empire_salt2); + + memcpy ((u8 *) md5_triple_salt->salt2_buf + md5_triple_salt->salt2_len, empire_salt1, empire_salt1_len); + + md5_triple_salt->salt2_len += empire_salt1_len; + + memcpy ((u8 *) md5_triple_salt->salt3_buf, empire_salt2, empire_salt2_len); + memcpy ((u8 *) md5_triple_salt->salt3_buf + empire_salt2_len, (u8 *) md5_triple_salt->salt1_buf, md5_triple_salt->salt1_len); + + md5_triple_salt->salt3_len = empire_salt2_len + md5_triple_salt->salt1_len; + + // make salt sorter happy + + md5_ctx_t md5_ctx; + + md5_init (&md5_ctx); + md5_update (&md5_ctx, md5_triple_salt->salt1_buf, md5_triple_salt->salt1_len); + md5_update (&md5_ctx, md5_triple_salt->salt2_buf, md5_triple_salt->salt2_len); + md5_update (&md5_ctx, md5_triple_salt->salt3_buf, md5_triple_salt->salt3_len); + md5_final (&md5_ctx); + + salt->salt_buf[0] = md5_ctx.h[0]; + salt->salt_buf[1] = md5_ctx.h[1]; + salt->salt_buf[2] = md5_ctx.h[2]; + salt->salt_buf[3] = md5_ctx.h[3]; + + salt->salt_len = 16; + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u32 *digest = (const u32 *) digest_buf; + + const md5_triple_salt_t *md5_triple_salt = (const md5_triple_salt_t *) esalt_buf; + + u32 tmp[4]; + + tmp[0] = digest[0]; + tmp[1] = digest[1]; + tmp[2] = digest[2]; + tmp[3] = digest[3]; + + if (hashconfig->opti_type & OPTI_TYPE_OPTIMIZED_KERNEL) + { + tmp[0] += MD5M_A; + tmp[1] += MD5M_B; + tmp[2] += MD5M_C; + tmp[3] += MD5M_D; + } + + u8 *out_buf = (u8 *) line_buf; + + int out_len = 0; + + u32_to_hex (tmp[0], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[1], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[2], out_buf + out_len); out_len += 8; + u32_to_hex (tmp[3], out_buf + out_len); out_len += 8; + + out_buf[out_len] = hashconfig->separator; + + out_len += 1; + + out_len += generic_salt_encode (hashconfig, (const u8 *) md5_triple_salt->salt1_buf, md5_triple_salt->salt1_len, out_buf + out_len); + + out_buf[out_len] = hashconfig->separator; + + out_len += 1; + + out_len += generic_salt_encode (hashconfig, (const u8 *) md5_triple_salt->salt2_buf, md5_triple_salt->salt2_len, out_buf + out_len); + + out_len -= 17; // remove empire_salt1 + + out_buf[out_len] = '\0'; + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = module_esalt_size; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = MODULE_DEFAULT; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_32410.c b/src/modules/module_32410.c new file mode 100644 index 000000000..9554e980b --- /dev/null +++ b/src/modules/module_32410.c @@ -0,0 +1,271 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_INSIDE_KERNEL; +static const u32 DGST_POS0 = 14; +static const u32 DGST_POS1 = 15; +static const u32 DGST_POS2 = 6; +static const u32 DGST_POS3 = 7; +static const u32 DGST_SIZE = DGST_SIZE_8_8; +static const u32 HASH_CATEGORY = HASH_CATEGORY_RAW_HASH_SALTED; +static const char *HASH_NAME = "sha512(sha512($pass).$salt)"; +static const u64 KERN_TYPE = 32410; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_APPENDED_SALT + | OPTI_TYPE_USES_BITS_64 + | OPTI_TYPE_RAW_HASH; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS15; +static const u32 SALT_TYPE = SALT_TYPE_GENERIC; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "25d509824028a999f4ee851b5de404bb316b78ae8e974874376484018f58520e082747a7ce9f769bcaccb5f63878356c780f602e23393f12b650a6931e4b9338:21881837027919828109608"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) +{ + char *jit_build_options = NULL; + + // Extra treatment for Apple systems + if (device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) + { + // Metal + if (device_param->is_metal == true) + { + hc_asprintf (&jit_build_options, "-D _unroll"); + } + + return jit_build_options; + } + + // HIP + if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD_USE_HIP) + { + hc_asprintf (&jit_build_options, "-D _unroll"); + } + + // ROCM + if ((device_param->opencl_device_vendor_id == VENDOR_ID_AMD) && (device_param->has_vperm == true)) + { + hc_asprintf (&jit_build_options, "-D _unroll"); + } + + return jit_build_options; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u64 *digest = (u64 *) digest_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 2; + + token.sep[0] = hashconfig->separator; + token.len[0] = 128; + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + token.len_min[1] = SALT_MIN; + token.len_max[1] = SALT_MAX; + token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH; + + if (hashconfig->opts_type & OPTS_TYPE_ST_HEX) + { + token.len_min[1] *= 2; + token.len_max[1] *= 2; + + token.attr[1] |= TOKEN_ATTR_VERIFY_HEX; + } + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + const u8 *hash_pos = token.buf[0]; + + digest[0] = hex_to_u64 (hash_pos + 0); + digest[1] = hex_to_u64 (hash_pos + 16); + digest[2] = hex_to_u64 (hash_pos + 32); + digest[3] = hex_to_u64 (hash_pos + 48); + digest[4] = hex_to_u64 (hash_pos + 64); + digest[5] = hex_to_u64 (hash_pos + 80); + digest[6] = hex_to_u64 (hash_pos + 96); + digest[7] = hex_to_u64 (hash_pos + 112); + + digest[0] = byte_swap_64 (digest[0]); + digest[1] = byte_swap_64 (digest[1]); + digest[2] = byte_swap_64 (digest[2]); + digest[3] = byte_swap_64 (digest[3]); + digest[4] = byte_swap_64 (digest[4]); + digest[5] = byte_swap_64 (digest[5]); + digest[6] = byte_swap_64 (digest[6]); + digest[7] = byte_swap_64 (digest[7]); + + const u8 *salt_pos = token.buf[1]; + const int salt_len = token.len[1]; + + const bool parse_rc = generic_salt_decode (hashconfig, salt_pos, salt_len, (u8 *) salt->salt_buf, (int *) &salt->salt_len); + + if (parse_rc == false) return (PARSER_SALT_LENGTH); + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u64 *digest = (const u64 *) digest_buf; + + // we can not change anything in the original buffer, otherwise destroying sorting + // therefore create some local buffer + + u64 tmp[8]; + + tmp[0] = digest[0]; + tmp[1] = digest[1]; + tmp[2] = digest[2]; + tmp[3] = digest[3]; + tmp[4] = digest[4]; + tmp[5] = digest[5]; + tmp[6] = digest[6]; + tmp[7] = digest[7]; + + tmp[0] = byte_swap_64 (tmp[0]); + tmp[1] = byte_swap_64 (tmp[1]); + tmp[2] = byte_swap_64 (tmp[2]); + tmp[3] = byte_swap_64 (tmp[3]); + tmp[4] = byte_swap_64 (tmp[4]); + tmp[5] = byte_swap_64 (tmp[5]); + tmp[6] = byte_swap_64 (tmp[6]); + tmp[7] = byte_swap_64 (tmp[7]); + + u8 *out_buf = (u8 *) line_buf; + + int out_len = 0; + + u64_to_hex (tmp[0], out_buf + out_len); out_len += 16; + u64_to_hex (tmp[1], out_buf + out_len); out_len += 16; + u64_to_hex (tmp[2], out_buf + out_len); out_len += 16; + u64_to_hex (tmp[3], out_buf + out_len); out_len += 16; + u64_to_hex (tmp[4], out_buf + out_len); out_len += 16; + u64_to_hex (tmp[5], out_buf + out_len); out_len += 16; + u64_to_hex (tmp[6], out_buf + out_len); out_len += 16; + u64_to_hex (tmp[7], out_buf + out_len); out_len += 16; + + out_buf[out_len] = hashconfig->separator; + + out_len += 1; + + out_len += generic_salt_encode (hashconfig, (const u8 *) salt->salt_buf, (const int) salt->salt_len, out_buf + out_len); + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = module_jit_build_options; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = MODULE_DEFAULT; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_32420.c b/src/modules/module_32420.c new file mode 100644 index 000000000..d4187ff55 --- /dev/null +++ b/src/modules/module_32420.c @@ -0,0 +1,271 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_INSIDE_KERNEL; +static const u32 DGST_POS0 = 14; +static const u32 DGST_POS1 = 15; +static const u32 DGST_POS2 = 6; +static const u32 DGST_POS3 = 7; +static const u32 DGST_SIZE = DGST_SIZE_8_8; +static const u32 HASH_CATEGORY = HASH_CATEGORY_RAW_HASH_SALTED; +static const char *HASH_NAME = "sha512(sha512_bin($pass).$salt)"; +static const u64 KERN_TYPE = 32420; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_APPENDED_SALT + | OPTI_TYPE_USES_BITS_64 + | OPTI_TYPE_RAW_HASH; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS15; +static const u32 SALT_TYPE = SALT_TYPE_GENERIC; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "c1bade2bd4ebc8db841ac6ab3e0a5035a29619e5b1a6135782b77da5d7cfaccee096f3ddb9ee23b9866378cfc2fb19f2c013fed1b7e1fffd18340a4f39238412:789"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +char *module_jit_build_options (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra, MAYBE_UNUSED const hashes_t *hashes, MAYBE_UNUSED const hc_device_param_t *device_param) +{ + char *jit_build_options = NULL; + + // Extra treatment for Apple systems + if (device_param->opencl_platform_vendor_id == VENDOR_ID_APPLE) + { + // Metal + if (device_param->is_metal == true) + { + hc_asprintf (&jit_build_options, "-D _unroll"); + } + + return jit_build_options; + } + + // HIP + if (device_param->opencl_device_vendor_id == VENDOR_ID_AMD_USE_HIP) + { + hc_asprintf (&jit_build_options, "-D _unroll"); + } + + // ROCM + if ((device_param->opencl_device_vendor_id == VENDOR_ID_AMD) && (device_param->has_vperm == true)) + { + hc_asprintf (&jit_build_options, "-D _unroll"); + } + + return jit_build_options; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u64 *digest = (u64 *) digest_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 2; + + token.sep[0] = hashconfig->separator; + token.len[0] = 128; + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + token.len_min[1] = SALT_MIN; + token.len_max[1] = SALT_MAX; + token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH; + + if (hashconfig->opts_type & OPTS_TYPE_ST_HEX) + { + token.len_min[1] *= 2; + token.len_max[1] *= 2; + + token.attr[1] |= TOKEN_ATTR_VERIFY_HEX; + } + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + const u8 *hash_pos = token.buf[0]; + + digest[0] = hex_to_u64 (hash_pos + 0); + digest[1] = hex_to_u64 (hash_pos + 16); + digest[2] = hex_to_u64 (hash_pos + 32); + digest[3] = hex_to_u64 (hash_pos + 48); + digest[4] = hex_to_u64 (hash_pos + 64); + digest[5] = hex_to_u64 (hash_pos + 80); + digest[6] = hex_to_u64 (hash_pos + 96); + digest[7] = hex_to_u64 (hash_pos + 112); + + digest[0] = byte_swap_64 (digest[0]); + digest[1] = byte_swap_64 (digest[1]); + digest[2] = byte_swap_64 (digest[2]); + digest[3] = byte_swap_64 (digest[3]); + digest[4] = byte_swap_64 (digest[4]); + digest[5] = byte_swap_64 (digest[5]); + digest[6] = byte_swap_64 (digest[6]); + digest[7] = byte_swap_64 (digest[7]); + + const u8 *salt_pos = token.buf[1]; + const int salt_len = token.len[1]; + + const bool parse_rc = generic_salt_decode (hashconfig, salt_pos, salt_len, (u8 *) salt->salt_buf, (int *) &salt->salt_len); + + if (parse_rc == false) return (PARSER_SALT_LENGTH); + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u64 *digest = (const u64 *) digest_buf; + + // we can not change anything in the original buffer, otherwise destroying sorting + // therefore create some local buffer + + u64 tmp[8]; + + tmp[0] = digest[0]; + tmp[1] = digest[1]; + tmp[2] = digest[2]; + tmp[3] = digest[3]; + tmp[4] = digest[4]; + tmp[5] = digest[5]; + tmp[6] = digest[6]; + tmp[7] = digest[7]; + + tmp[0] = byte_swap_64 (tmp[0]); + tmp[1] = byte_swap_64 (tmp[1]); + tmp[2] = byte_swap_64 (tmp[2]); + tmp[3] = byte_swap_64 (tmp[3]); + tmp[4] = byte_swap_64 (tmp[4]); + tmp[5] = byte_swap_64 (tmp[5]); + tmp[6] = byte_swap_64 (tmp[6]); + tmp[7] = byte_swap_64 (tmp[7]); + + u8 *out_buf = (u8 *) line_buf; + + int out_len = 0; + + u64_to_hex (tmp[0], out_buf + out_len); out_len += 16; + u64_to_hex (tmp[1], out_buf + out_len); out_len += 16; + u64_to_hex (tmp[2], out_buf + out_len); out_len += 16; + u64_to_hex (tmp[3], out_buf + out_len); out_len += 16; + u64_to_hex (tmp[4], out_buf + out_len); out_len += 16; + u64_to_hex (tmp[5], out_buf + out_len); out_len += 16; + u64_to_hex (tmp[6], out_buf + out_len); out_len += 16; + u64_to_hex (tmp[7], out_buf + out_len); out_len += 16; + + out_buf[out_len] = hashconfig->separator; + + out_len += 1; + + out_len += generic_salt_encode (hashconfig, (const u8 *) salt->salt_buf, (const int) salt->salt_len, out_buf + out_len); + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = module_jit_build_options; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = MODULE_DEFAULT; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_32500.c b/src/modules/module_32500.c new file mode 100644 index 000000000..74ae3b144 --- /dev/null +++ b/src/modules/module_32500.c @@ -0,0 +1,277 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 1; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 3; +static const u32 DGST_SIZE = DGST_SIZE_4_4; +static const u32 HASH_CATEGORY = HASH_CATEGORY_CRYPTOCURRENCY_WALLET; +static const char *HASH_NAME = "Dogechain.info Wallet"; +static const u64 KERN_TYPE = 32500; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_SLOW_HASH_SIMD_LOOP; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE; +static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "$dogechain$0*5000*EEmAkgiMlVrToRhu2suq91R5Frf+VQCvNzv9lj6OwRWIf/3IM31wqhJM7gGQpinXH9kqHkuQ2DMZxspgA7QFAddsUWvZxGdNAkaeKy90EAsTLIuDQnH3plfBQfmL6j5NPaH7Nr7kF1PdvM0pbUw6XHySBYkD/rPHNM6n58NRK4xfO4VVMykeX3+m2LaVyv5s269r/op38svRPT0YFGpRcanY6/U1BeSrvG2IXii1BKXXAcVEN4GFmyEQRWKI0uZE+3M0atf7UEPD4K9tmEKosqdsF4MFLiBtfI4eq0+926ijoezDmUPvHIiyQZ9CH2jZ*6jOgqW/GxL9He1afQiINIg=="; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +static const char *SIGNATURE_DOGECHAIN = "$dogechain$0"; + +typedef struct payload +{ + u32 pl_buf[64]; + u32 pl_len; + +} payload_t; + +typedef struct doge_tmp +{ + u32 ipad[8]; + u32 opad[8]; + + u32 dgst[32]; + u32 out[32]; + +} doge_tmp_t; + +u64 module_esalt_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 esalt_size = (const u64) sizeof (payload_t); + + return esalt_size; +} + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = (const u64) sizeof (doge_tmp_t); + + return tmp_size; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + payload_t *payload = (payload_t *) esalt_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 4; + + token.signatures_cnt = 1; + token.signatures_buf[0] = SIGNATURE_DOGECHAIN; + + // sig + token.sep[0] = '*'; + token.len_min[0] = 12; + token.len_max[0] = 12; + token.attr[0] = TOKEN_ATTR_VERIFY_LENGTH //VERIFY NOT FIXED + | TOKEN_ATTR_VERIFY_SIGNATURE; + + // iter + token.sep[1] = '*'; + token.len_min[1] = 1; + token.len_max[1] = 10; + token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_DIGIT; + + // payload + token.sep[2] = '*'; + token.len_min[2] = 320; + token.len_max[2] = 320; + token.attr[2] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_BASE64A; //verify is b64 + + // salt + token.sep[3] = '*'; + token.len_min[3] = 24; + token.len_max[3] = 24; + token.attr[3] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_BASE64A; //verify is b64 + + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + // Our parsing + + // esalt for payload + + const u8 *data_pos = token.buf[2]; + const int data_len = token.len[2]; + + u8 tmp_buf[256] = { 0 }; + + int tmp_len = base64_decode (base64_to_int, data_pos, data_len, tmp_buf); + + memcpy (payload->pl_buf, tmp_buf, tmp_len); + + payload->pl_len = tmp_len; + + // salt + + const u8 *salt_pos = token.buf[3]; + const int salt_len = token.len[3]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + tmp_len = base64_decode (base64_to_int, salt_pos, salt_len, tmp_buf); + + memcpy (salt->salt_buf, tmp_buf, tmp_len); + + salt->salt_len = tmp_len; + + // iter + + const u8 *iter_pos = token.buf[1]; + + salt->salt_iter = hc_strtoul ((const char *) iter_pos, NULL, 10) - 1; + + // digest + + digest[0] = 0; + digest[1] = 0; + digest[2] = 0; + digest[3] = 0; + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + //const u32 *digest = (const u32 *) digest_buf; + + const payload_t *payload = (const payload_t *) esalt_buf; + + // payload + + u8 payload_base64[512]; + + base64_encode (int_to_base64, (const u8 *) payload->pl_buf, payload->pl_len, payload_base64); + + // salt + + u8 salt_base64[32]; + + base64_encode (int_to_base64, (const u8 *) salt->salt_buf, salt->salt_len, salt_base64); + + u8 *out_buf = (u8 *) line_buf; + + int out_len = snprintf ((char *) out_buf, line_size, "%s*%u*%s*%s", + SIGNATURE_DOGECHAIN, + salt->salt_iter + 1, + payload_base64, + salt_base64); + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = module_esalt_size; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; + +} diff --git a/src/modules/module_32600.c b/src/modules/module_32600.c new file mode 100644 index 000000000..c8be26f3a --- /dev/null +++ b/src/modules/module_32600.c @@ -0,0 +1,274 @@ +/** + * Author......: See docs/credits.txt + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_INSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 1; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 3; +static const u32 DGST_SIZE = DGST_SIZE_4_16; +static const u32 HASH_CATEGORY = HASH_CATEGORY_RAW_HASH_SALTED; +static const char *HASH_NAME = "CubeCart (whirlpool($salt.$pass.$salt))"; +static const u64 KERN_TYPE = 32600; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_RAW_HASH; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80; +static const u32 SALT_TYPE = SALT_TYPE_GENERIC; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "a2c0342a2617026fbaeed01130c826cc3f58242799894b3ecc1abfa811ede03fd712efd14a886af6fa74045502f22c9feb1c45a291cf2d7bbe9bb94c388b6403:deadbeef"; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 2; + + token.sep[0] = hashconfig->separator; + token.len[0] = 128; + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + token.len_min[1] = SALT_MIN; + token.len_max[1] = SALT_MAX; + token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH; + + if (hashconfig->opts_type & OPTS_TYPE_ST_HEX) + { + token.len_min[1] *= 2; + token.len_max[1] *= 2; + + token.attr[1] |= TOKEN_ATTR_VERIFY_HEX; + } + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + const u8 *hash_pos = token.buf[0]; + + digest[ 0] = hex_to_u32 (hash_pos + 0); + digest[ 1] = hex_to_u32 (hash_pos + 8); + digest[ 2] = hex_to_u32 (hash_pos + 16); + digest[ 3] = hex_to_u32 (hash_pos + 24); + digest[ 4] = hex_to_u32 (hash_pos + 32); + digest[ 5] = hex_to_u32 (hash_pos + 40); + digest[ 6] = hex_to_u32 (hash_pos + 48); + digest[ 7] = hex_to_u32 (hash_pos + 56); + digest[ 8] = hex_to_u32 (hash_pos + 64); + digest[ 9] = hex_to_u32 (hash_pos + 72); + digest[10] = hex_to_u32 (hash_pos + 80); + digest[11] = hex_to_u32 (hash_pos + 88); + digest[12] = hex_to_u32 (hash_pos + 96); + digest[13] = hex_to_u32 (hash_pos + 104); + digest[14] = hex_to_u32 (hash_pos + 112); + digest[15] = hex_to_u32 (hash_pos + 120); + + digest[ 0] = byte_swap_32 (digest[ 0]); + digest[ 1] = byte_swap_32 (digest[ 1]); + digest[ 2] = byte_swap_32 (digest[ 2]); + digest[ 3] = byte_swap_32 (digest[ 3]); + digest[ 4] = byte_swap_32 (digest[ 4]); + digest[ 5] = byte_swap_32 (digest[ 5]); + digest[ 6] = byte_swap_32 (digest[ 6]); + digest[ 7] = byte_swap_32 (digest[ 7]); + digest[ 8] = byte_swap_32 (digest[ 8]); + digest[ 9] = byte_swap_32 (digest[ 9]); + digest[10] = byte_swap_32 (digest[10]); + digest[11] = byte_swap_32 (digest[11]); + digest[12] = byte_swap_32 (digest[12]); + digest[13] = byte_swap_32 (digest[13]); + digest[14] = byte_swap_32 (digest[14]); + digest[15] = byte_swap_32 (digest[15]); + + const u8 *salt_pos = token.buf[1]; + const int salt_len = token.len[1]; + + const bool parse_rc = generic_salt_decode (hashconfig, salt_pos, salt_len, (u8 *) salt->salt_buf, (int *) &salt->salt_len); + + if (parse_rc == false) return (PARSER_SALT_LENGTH); + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u32 *digest = (const u32 *) digest_buf; + + // we can not change anything in the original buffer, otherwise destroying sorting + // therefore create some local buffer + + u32 tmp[16]; + + tmp[ 0] = digest[ 0]; + tmp[ 1] = digest[ 1]; + tmp[ 2] = digest[ 2]; + tmp[ 3] = digest[ 3]; + tmp[ 4] = digest[ 4]; + tmp[ 5] = digest[ 5]; + tmp[ 6] = digest[ 6]; + tmp[ 7] = digest[ 7]; + tmp[ 8] = digest[ 8]; + tmp[ 9] = digest[ 9]; + tmp[10] = digest[10]; + tmp[11] = digest[11]; + tmp[12] = digest[12]; + tmp[13] = digest[13]; + tmp[14] = digest[14]; + tmp[15] = digest[15]; + + tmp[ 0] = byte_swap_32 (tmp[ 0]); + tmp[ 1] = byte_swap_32 (tmp[ 1]); + tmp[ 2] = byte_swap_32 (tmp[ 2]); + tmp[ 3] = byte_swap_32 (tmp[ 3]); + tmp[ 4] = byte_swap_32 (tmp[ 4]); + tmp[ 5] = byte_swap_32 (tmp[ 5]); + tmp[ 6] = byte_swap_32 (tmp[ 6]); + tmp[ 7] = byte_swap_32 (tmp[ 7]); + tmp[ 8] = byte_swap_32 (tmp[ 8]); + tmp[ 9] = byte_swap_32 (tmp[ 9]); + tmp[10] = byte_swap_32 (tmp[10]); + tmp[11] = byte_swap_32 (tmp[11]); + tmp[12] = byte_swap_32 (tmp[12]); + tmp[13] = byte_swap_32 (tmp[13]); + tmp[14] = byte_swap_32 (tmp[14]); + tmp[15] = byte_swap_32 (tmp[15]); + + u8 *out_buf = (u8 *) line_buf; + + u32_to_hex (tmp[ 0], out_buf + 0); + u32_to_hex (tmp[ 1], out_buf + 8); + u32_to_hex (tmp[ 2], out_buf + 16); + u32_to_hex (tmp[ 3], out_buf + 24); + u32_to_hex (tmp[ 4], out_buf + 32); + u32_to_hex (tmp[ 5], out_buf + 40); + u32_to_hex (tmp[ 6], out_buf + 48); + u32_to_hex (tmp[ 7], out_buf + 56); + u32_to_hex (tmp[ 8], out_buf + 64); + u32_to_hex (tmp[ 9], out_buf + 72); + u32_to_hex (tmp[10], out_buf + 80); + u32_to_hex (tmp[11], out_buf + 88); + u32_to_hex (tmp[12], out_buf + 96); + u32_to_hex (tmp[13], out_buf + 104); + u32_to_hex (tmp[14], out_buf + 112); + u32_to_hex (tmp[15], out_buf + 120); + + int out_len = 128; + + out_buf[out_len] = hashconfig->separator; + + out_len += 1; + + out_len += generic_salt_encode (hashconfig, (const u8 *) salt->salt_buf, (const int) salt->salt_len, out_buf + out_len); + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = MODULE_DEFAULT; + module_ctx->module_kernel_loops_min = MODULE_DEFAULT; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = MODULE_DEFAULT; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_32700.c b/src/modules/module_32700.c new file mode 100644 index 000000000..a34482a42 --- /dev/null +++ b/src/modules/module_32700.c @@ -0,0 +1,228 @@ +/** + * Author......: hansvh + * License.....: MIT + */ + +#include "common.h" +#include "types.h" +#include "modules.h" +#include "bitops.h" +#include "convert.h" +#include "shared.h" + +static const u32 ATTACK_EXEC = ATTACK_EXEC_OUTSIDE_KERNEL; +static const u32 DGST_POS0 = 0; +static const u32 DGST_POS1 = 1; +static const u32 DGST_POS2 = 2; +static const u32 DGST_POS3 = 3; +static const u32 DGST_SIZE = DGST_SIZE_4_5; +static const u32 HASH_CATEGORY = HASH_CATEGORY_ARCHIVE; +static const char *HASH_NAME = "Kremlin Encrypt 3.0 w/NewDES"; +static const u64 KERN_TYPE = 32700; +static const u32 OPTI_TYPE = OPTI_TYPE_ZERO_BYTE; +static const u64 OPTS_TYPE = OPTS_TYPE_STOCK_MODULE + | OPTS_TYPE_PT_GENERATE_LE; +static const u32 SALT_TYPE = SALT_TYPE_EMBEDDED; +static const char *ST_PASS = "hashcat"; +static const char *ST_HASH = "$kgb$0ab30cf7a52dad93$82a7c454246fc7570224e9f24279791aa2a63bf4"; + +typedef struct sha1_tmp +{ + u32 salt32[8]; + u32 newdes_key32[60]; + +} sha1_tmp_t; + +u32 module_attack_exec (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ATTACK_EXEC; } +u32 module_dgst_pos0 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS0; } +u32 module_dgst_pos1 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS1; } +u32 module_dgst_pos2 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS2; } +u32 module_dgst_pos3 (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_POS3; } +u32 module_dgst_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return DGST_SIZE; } +u32 module_hash_category (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_CATEGORY; } +const char *module_hash_name (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return HASH_NAME; } +u64 module_kern_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return KERN_TYPE; } +u32 module_opti_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTI_TYPE; } +u64 module_opts_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return OPTS_TYPE; } +u32 module_salt_type (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return SALT_TYPE; } +const char *module_st_hash (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_HASH; } +const char *module_st_pass (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) { return ST_PASS; } + +static const char *SIGNATURE_KGB = "$kgb$"; + +u64 module_tmp_size (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u64 tmp_size = (const u64) sizeof (sha1_tmp_t); + + return tmp_size; +} + +u32 module_kernel_loops_min (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 kernel_loops_min = 1000; + + return kernel_loops_min; +} + +u32 module_kernel_loops_max (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const user_options_t *user_options, MAYBE_UNUSED const user_options_extra_t *user_options_extra) +{ + const u32 kernel_loops_max = 1000; + + return kernel_loops_max; +} + +int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED void *digest_buf, MAYBE_UNUSED salt_t *salt, MAYBE_UNUSED void *esalt_buf, MAYBE_UNUSED void *hook_salt_buf, MAYBE_UNUSED hashinfo_t *hash_info, const char *line_buf, MAYBE_UNUSED const int line_len) +{ + u32 *digest = (u32 *) digest_buf; + + hc_token_t token; + + memset (&token, 0, sizeof (hc_token_t)); + + token.token_cnt = 3; + + token.signatures_cnt = 1; + token.signatures_buf[0] = SIGNATURE_KGB; + + token.len[0] = 5; + token.attr[0] = TOKEN_ATTR_FIXED_LENGTH + | TOKEN_ATTR_VERIFY_SIGNATURE; + + token.sep[1] = '$'; + token.len_min[1] = 16; + token.len_max[1] = 16; + token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + token.sep[2] = '$'; + token.len_min[2] = 40; + token.len_max[2] = 40; + token.attr[2] = TOKEN_ATTR_VERIFY_LENGTH + | TOKEN_ATTR_VERIFY_HEX; + + const int rc_tokenizer = input_tokenizer ((const u8 *) line_buf, line_len, &token); + + if (rc_tokenizer != PARSER_OK) return (rc_tokenizer); + + // 8 bytes salt + const u8 *salt_pos = token.buf[1]; + + salt->salt_buf[0] = hex_to_u32 (salt_pos + 0); + salt->salt_buf[1] = hex_to_u32 (salt_pos + 8); + + salt->salt_len = 8; + salt->salt_iter = 1000; + + // final "sha-1"-ish hash + const u8 *hash_pos = token.buf[2]; + + digest[0] = hex_to_u32 (hash_pos + 0); + digest[1] = hex_to_u32 (hash_pos + 8); + digest[2] = hex_to_u32 (hash_pos + 16); + digest[3] = hex_to_u32 (hash_pos + 24); + digest[4] = hex_to_u32 (hash_pos + 32); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + + return (PARSER_OK); +} + +int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) +{ + const u32 *digest = (const u32 *) digest_buf; + + const int out_len = snprintf (line_buf, line_size, "$kgb$%08x%08x$%08x%08x%08x%08x%08x", + byte_swap_32 (salt->salt_buf[0]), + byte_swap_32 (salt->salt_buf[1]), + digest[0], + digest[1], + digest[2], + digest[3], + digest[4]); + + return out_len; +} + +void module_init (module_ctx_t *module_ctx) +{ + module_ctx->module_context_size = MODULE_CONTEXT_SIZE_CURRENT; + module_ctx->module_interface_version = MODULE_INTERFACE_VERSION_CURRENT; + + module_ctx->module_attack_exec = module_attack_exec; + module_ctx->module_benchmark_esalt = MODULE_DEFAULT; + module_ctx->module_benchmark_hook_salt = MODULE_DEFAULT; + module_ctx->module_benchmark_mask = MODULE_DEFAULT; + module_ctx->module_benchmark_charset = MODULE_DEFAULT; + module_ctx->module_benchmark_salt = MODULE_DEFAULT; + module_ctx->module_build_plain_postprocess = MODULE_DEFAULT; + module_ctx->module_deep_comp_kernel = MODULE_DEFAULT; + module_ctx->module_deprecated_notice = MODULE_DEFAULT; + module_ctx->module_dgst_pos0 = module_dgst_pos0; + module_ctx->module_dgst_pos1 = module_dgst_pos1; + module_ctx->module_dgst_pos2 = module_dgst_pos2; + module_ctx->module_dgst_pos3 = module_dgst_pos3; + module_ctx->module_dgst_size = module_dgst_size; + module_ctx->module_dictstat_disable = MODULE_DEFAULT; + module_ctx->module_esalt_size = MODULE_DEFAULT; + module_ctx->module_extra_buffer_size = MODULE_DEFAULT; + module_ctx->module_extra_tmp_size = MODULE_DEFAULT; + module_ctx->module_extra_tuningdb_block = MODULE_DEFAULT; + module_ctx->module_forced_outfile_format = MODULE_DEFAULT; + module_ctx->module_hash_binary_count = MODULE_DEFAULT; + module_ctx->module_hash_binary_parse = MODULE_DEFAULT; + module_ctx->module_hash_binary_save = MODULE_DEFAULT; + module_ctx->module_hash_decode_postprocess = MODULE_DEFAULT; + module_ctx->module_hash_decode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_decode_zero_hash = MODULE_DEFAULT; + module_ctx->module_hash_decode = module_hash_decode; + module_ctx->module_hash_encode_status = MODULE_DEFAULT; + module_ctx->module_hash_encode_potfile = MODULE_DEFAULT; + module_ctx->module_hash_encode = module_hash_encode; + module_ctx->module_hash_init_selftest = MODULE_DEFAULT; + module_ctx->module_hash_mode = MODULE_DEFAULT; + module_ctx->module_hash_category = module_hash_category; + module_ctx->module_hash_name = module_hash_name; + module_ctx->module_hashes_count_min = MODULE_DEFAULT; + module_ctx->module_hashes_count_max = MODULE_DEFAULT; + module_ctx->module_hlfmt_disable = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_size = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_init = MODULE_DEFAULT; + module_ctx->module_hook_extra_param_term = MODULE_DEFAULT; + module_ctx->module_hook12 = MODULE_DEFAULT; + module_ctx->module_hook23 = MODULE_DEFAULT; + module_ctx->module_hook_salt_size = MODULE_DEFAULT; + module_ctx->module_hook_size = MODULE_DEFAULT; + module_ctx->module_jit_build_options = MODULE_DEFAULT; + module_ctx->module_jit_cache_disable = MODULE_DEFAULT; + module_ctx->module_kernel_accel_max = MODULE_DEFAULT; + module_ctx->module_kernel_accel_min = MODULE_DEFAULT; + module_ctx->module_kernel_loops_max = module_kernel_loops_max; + module_ctx->module_kernel_loops_min = module_kernel_loops_min; + module_ctx->module_kernel_threads_max = MODULE_DEFAULT; + module_ctx->module_kernel_threads_min = MODULE_DEFAULT; + module_ctx->module_kern_type = module_kern_type; + module_ctx->module_kern_type_dynamic = MODULE_DEFAULT; + module_ctx->module_opti_type = module_opti_type; + module_ctx->module_opts_type = module_opts_type; + module_ctx->module_outfile_check_disable = MODULE_DEFAULT; + module_ctx->module_outfile_check_nocomp = MODULE_DEFAULT; + module_ctx->module_potfile_custom_check = MODULE_DEFAULT; + module_ctx->module_potfile_disable = MODULE_DEFAULT; + module_ctx->module_potfile_keep_all_hashes = MODULE_DEFAULT; + module_ctx->module_pwdump_column = MODULE_DEFAULT; + module_ctx->module_pw_max = MODULE_DEFAULT; + module_ctx->module_pw_min = MODULE_DEFAULT; + module_ctx->module_salt_max = MODULE_DEFAULT; + module_ctx->module_salt_min = MODULE_DEFAULT; + module_ctx->module_salt_type = module_salt_type; + module_ctx->module_separator = MODULE_DEFAULT; + module_ctx->module_st_hash = module_st_hash; + module_ctx->module_st_pass = module_st_pass; + module_ctx->module_tmp_size = module_tmp_size; + module_ctx->module_unstable_warning = MODULE_DEFAULT; + module_ctx->module_warmup_disable = MODULE_DEFAULT; +} diff --git a/src/modules/module_99999.c b/src/modules/module_99999.c index 6189d4aea..b1dd810bd 100644 --- a/src/modules/module_99999.c +++ b/src/modules/module_99999.c @@ -128,7 +128,7 @@ int module_hash_decode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSE int module_hash_encode (MAYBE_UNUSED const hashconfig_t *hashconfig, MAYBE_UNUSED const void *digest_buf, MAYBE_UNUSED const salt_t *salt, MAYBE_UNUSED const void *esalt_buf, MAYBE_UNUSED const void *hook_salt_buf, MAYBE_UNUSED const hashinfo_t *hash_info, char *line_buf, MAYBE_UNUSED const int line_size) { - char *ptr = (char *) digest_buf; + const char *ptr = (const char *) digest_buf; const char *line_ptr = ptr + 64; size_t line_len = strnlen (line_ptr, 55); diff --git a/src/mpsp.c b/src/mpsp.c index 8e84cdba0..d694dc242 100644 --- a/src/mpsp.c +++ b/src/mpsp.c @@ -687,7 +687,7 @@ static int sp_setup_tbl (hashcat_ctx_t *hashcat_ctx) char *shared_dir = folder_config->shared_dir; char *hcstat = user_options->markov_hcstat2; - u32 disable = user_options->markov_disable; + u32 markov = user_options->markov; u32 classic = user_options->markov_classic; bool inverse = user_options->markov_inverse; @@ -856,7 +856,7 @@ static int sp_setup_tbl (hashcat_ctx_t *hashcat_ctx) * Markov modifier of hcstat_table on user request */ - if (disable) + if (markov == false) { memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (u64)); memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (u64)); diff --git a/src/outfile.c b/src/outfile.c index 483dd1ee2..b14b56a7a 100644 --- a/src/outfile.c +++ b/src/outfile.c @@ -503,6 +503,7 @@ int outfile_init (hashcat_ctx_t *hashcat_ctx) outfile_ctx->filename = user_options->outfile; outfile_ctx->outfile_format = user_options->outfile_format; outfile_ctx->outfile_autohex = user_options->outfile_autohex; + outfile_ctx->outfile_json = user_options->outfile_json; outfile_ctx->is_fifo = hc_path_is_fifo (outfile_ctx->filename); return 0; @@ -570,146 +571,213 @@ void outfile_write_close (hashcat_ctx_t *hashcat_ctx) int outfile_write (hashcat_ctx_t *hashcat_ctx, const char *out_buf, const int out_len, const unsigned char *plain_ptr, const u32 plain_len, const u64 crackpos, const unsigned char *username, const u32 user_len, const bool print_eol, char *tmp_buf) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; + const hashes_t *hashes = hashcat_ctx->hashes; const user_options_t *user_options = hashcat_ctx->user_options; outfile_ctx_t *outfile_ctx = hashcat_ctx->outfile_ctx; status_ctx_t *status_ctx = hashcat_ctx->status_ctx; - const u32 outfile_format = (hashconfig->opts_type & OPTS_TYPE_PT_ALWAYS_HEXIFY) ? 5 : outfile_ctx->outfile_format; - int tmp_len = 0; - if (user_len > 0) + if (outfile_ctx->outfile_json == true) { - if (username != NULL) + tmp_buf[0] = '{'; tmp_len += 1; + + if (user_len > 0) { - memcpy (tmp_buf + tmp_len, username, user_len); + if (username != NULL) + { + tmp_len += snprintf (tmp_buf + tmp_len, HCBUFSIZ_LARGE - tmp_len, "\"username_hex\": "); - tmp_len += user_len; + tmp_buf[tmp_len] = '"'; tmp_len += 1; - if (outfile_format & (OUTFILE_FMT_TIME_ABS | OUTFILE_FMT_TIME_REL | OUTFILE_FMT_HASH | OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS)) + tmp_len += hex_encode ((const u8 *) username, user_len, (u8 *) tmp_buf + tmp_len); + + tmp_buf[tmp_len] = '"'; tmp_len += 1; + + tmp_buf[tmp_len] = ','; tmp_len += 1; + tmp_buf[tmp_len] = ' '; tmp_len += 1; + } + } + + if (hashes->hashlist_mode == HL_MODE_FILE_BINARY) + { + tmp_len += snprintf (tmp_buf + tmp_len, HCBUFSIZ_LARGE - tmp_len, "\"filename_hex\": "); + + tmp_buf[tmp_len] = '"'; tmp_len += 1; + + tmp_len += hex_encode ((const u8 *) hashes->hashfile, strlen (hashes->hashfile), (u8 *) tmp_buf + tmp_len); + + tmp_buf[tmp_len] = '"'; tmp_len += 1; + + tmp_buf[tmp_len] = ','; tmp_len += 1; + tmp_buf[tmp_len] = ' '; tmp_len += 1; + } + else + { + tmp_len += snprintf (tmp_buf + tmp_len, HCBUFSIZ_LARGE - tmp_len, "\"hash_hex\": "); + + tmp_buf[tmp_len] = '"'; tmp_len += 1; + + tmp_len += hex_encode ((const u8 *) out_buf, out_len, (u8 *) tmp_buf + tmp_len); + + tmp_buf[tmp_len] = '"'; tmp_len += 1; + + tmp_buf[tmp_len] = ','; tmp_len += 1; + tmp_buf[tmp_len] = ' '; tmp_len += 1; + } + + if (1) // plain + { + tmp_len += snprintf (tmp_buf + tmp_len, HCBUFSIZ_LARGE - tmp_len, "\"password_hex\": "); + + tmp_buf[tmp_len] = '"'; tmp_len += 1; + + tmp_len += hex_encode ((const u8 *) plain_ptr, plain_len, (u8 *) tmp_buf + tmp_len); + + tmp_buf[tmp_len] = '"'; tmp_len += 1; + } + + tmp_buf[tmp_len] = '}'; + + tmp_len += 1; + } + else + { + const u32 outfile_format = (hashconfig->opts_type & OPTS_TYPE_PT_ALWAYS_HEXIFY) ? 5 : outfile_ctx->outfile_format; + + if (user_len > 0) + { + if (username != NULL) + { + memcpy (tmp_buf + tmp_len, username, user_len); + + tmp_len += user_len; + + if (outfile_format & (OUTFILE_FMT_TIME_ABS | OUTFILE_FMT_TIME_REL | OUTFILE_FMT_HASH | OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS)) + { + tmp_buf[tmp_len] = hashconfig->separator; + + tmp_len += 1; + } + } + } + + if (outfile_format & OUTFILE_FMT_TIME_ABS) + { + time_t now; + + time (&now); + + tmp_len += snprintf (tmp_buf + tmp_len, HCBUFSIZ_LARGE - tmp_len, "%" PRIu64, (u64) now); + + if (outfile_format & (OUTFILE_FMT_TIME_REL | OUTFILE_FMT_HASH | OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS)) { tmp_buf[tmp_len] = hashconfig->separator; tmp_len += 1; } } - } - if (outfile_format & OUTFILE_FMT_TIME_ABS) - { - time_t now; - - time (&now); - - tmp_len += snprintf (tmp_buf + tmp_len, HCBUFSIZ_LARGE - tmp_len, "%" PRIu64, (u64) now); - - if (outfile_format & (OUTFILE_FMT_TIME_REL | OUTFILE_FMT_HASH | OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS)) + if (outfile_format & OUTFILE_FMT_TIME_REL) { - tmp_buf[tmp_len] = hashconfig->separator; + time_t time_now; - tmp_len += 1; - } - } + time (&time_now); - if (outfile_format & OUTFILE_FMT_TIME_REL) - { - time_t time_now; + time_t time_started = status_ctx->runtime_start; - time (&time_now); + u64 diff = 0; - time_t time_started = status_ctx->runtime_start; - - u64 diff = 0; - - if (time_now > time_started) // should always be true, but you never know - { - diff = (u64) time_now - (u64) time_started; - } - - tmp_len += snprintf (tmp_buf + tmp_len, HCBUFSIZ_LARGE - tmp_len, "%" PRIu64, diff); - - if (outfile_format & (OUTFILE_FMT_HASH | OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS)) - { - tmp_buf[tmp_len] = hashconfig->separator; - - tmp_len += 1; - } - } - - if (outfile_format & OUTFILE_FMT_HASH) - { - memcpy (tmp_buf + tmp_len, out_buf, out_len); - - tmp_len += out_len; - - if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS)) - { - tmp_buf[tmp_len] = hashconfig->separator; - - tmp_len += 1; - } - } - - if (outfile_format & OUTFILE_FMT_PLAIN) - { - bool convert_to_hex = false; - - if (user_options->show == false) - { - if (user_options->outfile_autohex == true) + if (time_now > time_started) // should always be true, but you never know { - const bool always_ascii = (hashconfig->opts_type & OPTS_TYPE_PT_ALWAYS_ASCII) ? true : false; + diff = (u64) time_now - (u64) time_started; + } - convert_to_hex = need_hexify (plain_ptr, plain_len, hashconfig->separator, always_ascii); + tmp_len += snprintf (tmp_buf + tmp_len, HCBUFSIZ_LARGE - tmp_len, "%" PRIu64, diff); + + if (outfile_format & (OUTFILE_FMT_HASH | OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS)) + { + tmp_buf[tmp_len] = hashconfig->separator; + + tmp_len += 1; } } - if (convert_to_hex) + if (outfile_format & OUTFILE_FMT_HASH) { - tmp_buf[tmp_len++] = '$'; - tmp_buf[tmp_len++] = 'H'; - tmp_buf[tmp_len++] = 'E'; - tmp_buf[tmp_len++] = 'X'; - tmp_buf[tmp_len++] = '['; + memcpy (tmp_buf + tmp_len, out_buf, out_len); + tmp_len += out_len; + + if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS)) + { + tmp_buf[tmp_len] = hashconfig->separator; + + tmp_len += 1; + } + } + + if (outfile_format & OUTFILE_FMT_PLAIN) + { + bool convert_to_hex = false; + + if (user_options->show == false) + { + if (user_options->outfile_autohex == true) + { + const bool always_ascii = (hashconfig->opts_type & OPTS_TYPE_PT_ALWAYS_ASCII) ? true : false; + + convert_to_hex = need_hexify (plain_ptr, plain_len, hashconfig->separator, always_ascii); + } + } + + if (convert_to_hex) + { + tmp_buf[tmp_len++] = '$'; + tmp_buf[tmp_len++] = 'H'; + tmp_buf[tmp_len++] = 'E'; + tmp_buf[tmp_len++] = 'X'; + tmp_buf[tmp_len++] = '['; + + exec_hexify (plain_ptr, plain_len, (u8 *) tmp_buf + tmp_len); + + tmp_len += plain_len * 2; + + tmp_buf[tmp_len++] = ']'; + } + else + { + memcpy (tmp_buf + tmp_len, plain_ptr, plain_len); + + tmp_len += plain_len; + } + + if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS)) + { + tmp_buf[tmp_len] = hashconfig->separator; + + tmp_len += 1; + } + } + + if (outfile_format & OUTFILE_FMT_HEXPLAIN) + { exec_hexify (plain_ptr, plain_len, (u8 *) tmp_buf + tmp_len); tmp_len += plain_len * 2; - tmp_buf[tmp_len++] = ']'; + if (outfile_format & (OUTFILE_FMT_CRACKPOS)) + { + tmp_buf[tmp_len] = hashconfig->separator; + + tmp_len += 1; + } } - else + + if (outfile_format & OUTFILE_FMT_CRACKPOS) { - memcpy (tmp_buf + tmp_len, plain_ptr, plain_len); - - tmp_len += plain_len; + tmp_len += snprintf (tmp_buf + tmp_len, HCBUFSIZ_LARGE - tmp_len, "%" PRIu64, crackpos); } - - if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS)) - { - tmp_buf[tmp_len] = hashconfig->separator; - - tmp_len += 1; - } - } - - if (outfile_format & OUTFILE_FMT_HEXPLAIN) - { - exec_hexify (plain_ptr, plain_len, (u8 *) tmp_buf + tmp_len); - - tmp_len += plain_len * 2; - - if (outfile_format & (OUTFILE_FMT_CRACKPOS)) - { - tmp_buf[tmp_len] = hashconfig->separator; - - tmp_len += 1; - } - } - - if (outfile_format & OUTFILE_FMT_CRACKPOS) - { - tmp_len += snprintf (tmp_buf + tmp_len, HCBUFSIZ_LARGE - tmp_len, "%" PRIu64, crackpos); } tmp_buf[tmp_len] = 0; diff --git a/src/potfile.c b/src/potfile.c index 78d4468bc..a912e1f50 100644 --- a/src/potfile.c +++ b/src/potfile.c @@ -58,7 +58,7 @@ static int sort_by_hash_t_salt (const void *v1, const void *v2) } */ -// this function is special and only used whenever --username and --show are used together: +// this function is special and only used whenever --username or --dynamic-x and --show are used together: // it will sort all tree entries according to the settings stored in hashconfig int sort_pot_tree_by_hash (const void *v1, const void *v2) @@ -110,20 +110,20 @@ int potfile_init (hashcat_ctx_t *hashcat_ctx) potfile_ctx->enabled = false; - if (user_options->usage > 0) return 0; - if (user_options->backend_info > 0) return 0; + if (user_options->usage > 0) return 0; + if (user_options->backend_info > 0) return 0; - if (user_options->benchmark == true) return 0; - if (user_options->hash_info == true) return 0; - if (user_options->keyspace == true) return 0; - if (user_options->stdout_flag == true) return 0; - if (user_options->speed_only == true) return 0; - if (user_options->progress_only == true) return 0; - if (user_options->version == true) return 0; - if (user_options->identify == true) return 0; - if (user_options->potfile_disable == true) return 0; + if (user_options->benchmark == true) return 0; + if (user_options->hash_info == true) return 0; + if (user_options->keyspace == true) return 0; + if (user_options->stdout_flag == true) return 0; + if (user_options->speed_only == true) return 0; + if (user_options->progress_only == true) return 0; + if (user_options->version == true) return 0; + if (user_options->identify == true) return 0; + if (user_options->potfile == false) return 0; - if (hashconfig->potfile_disable == true) return 0; + if (hashconfig->potfile_disable == true) return 0; potfile_ctx->enabled = true; @@ -249,7 +249,6 @@ void potfile_write_close (hashcat_ctx_t *hashcat_ctx) void potfile_write_append (hashcat_ctx_t *hashcat_ctx, const char *out_buf, const int out_len, u8 *plain_ptr, unsigned int plain_len) { const hashconfig_t *hashconfig = hashcat_ctx->hashconfig; - const user_options_t *user_options = hashcat_ctx->user_options; potfile_ctx_t *potfile_ctx = hashcat_ctx->potfile_ctx; if (potfile_ctx->enabled == false) return; @@ -275,7 +274,7 @@ void potfile_write_append (hashcat_ctx_t *hashcat_ctx, const char *out_buf, cons { const bool always_ascii = (hashconfig->opts_type & OPTS_TYPE_PT_ALWAYS_ASCII) ? true : false; - if ((user_options->outfile_autohex == true) && (need_hexify (plain_ptr, plain_len, hashconfig->separator, always_ascii) == true)) + if (need_hexify (plain_ptr, plain_len, hashconfig->separator, always_ascii) == true) { tmp_buf[tmp_len++] = '$'; tmp_buf[tmp_len++] = 'H'; @@ -397,7 +396,7 @@ int potfile_remove_parse (hashcat_ctx_t *hashcat_ctx) hash_t *hashes_buf = hashes->hashes_buf; u32 hashes_cnt = hashes->hashes_cnt; - // no solution for these special hash types (for instane because they use hashfile in output etc) + // no solution for these special hash types (for instance because they use hashfile in output etc) hash_t hash_buf; @@ -426,7 +425,7 @@ int potfile_remove_parse (hashcat_ctx_t *hashcat_ctx) } // we only need this variable in a very specific situation: - // whenever we use --username and --show together we want to keep all hashes sorted within a nice structure + // whenever we use --username or --dynamic-x and --show together we want to keep all hashes sorted within a nice structure pot_tree_entry_t *all_hashes_tree = NULL; pot_tree_entry_t *tree_entry_cache = NULL; @@ -716,6 +715,22 @@ int potfile_handle_show (hashcat_ctx_t *hashcat_ctx) username[user_len] = 0; } + // dynamic-x + unsigned char *dynamicx_buf = NULL; + + u32 dynamicx_len = 0; + + dynamicx_t *dynamicx = hash1->hash_info->dynamicx; + + if (dynamicx) + { + dynamicx_buf = (unsigned char *) (dynamicx->dynamicx_buf); + + dynamicx_len = dynamicx->dynamicx_len; + + dynamicx_buf[dynamicx_len] = 0; + } + u8 *tmp_buf = potfile_ctx->tmp_buf; tmp_buf[0] = 0; @@ -812,6 +827,25 @@ int potfile_handle_show (hashcat_ctx_t *hashcat_ctx) } } + // dynamicx + unsigned char *dynamicx_buf = NULL; + + u32 dynamicx_len = 0; + + if (hash->hash_info != NULL) + { + dynamicx_t *dynamicx = hash->hash_info->dynamicx; + + if (dynamicx) + { + dynamicx_buf = (unsigned char *) (dynamicx->dynamicx_buf); + + dynamicx_len = dynamicx->dynamicx_len; + + dynamicx_buf[dynamicx_len] = 0; + } + } + u8 *tmp_buf = potfile_ctx->tmp_buf; tmp_buf[0] = 0; @@ -958,6 +992,22 @@ int potfile_handle_left (hashcat_ctx_t *hashcat_ctx) username[user_len] = 0; } + // dynamic-x + unsigned char *dynamicx_buf = NULL; + + u32 dynamicx_len = 0; + + dynamicx_t *dynamicx = hash1->hash_info->dynamicx; + + if (dynamicx) + { + dynamicx_buf = (unsigned char *) (dynamicx->dynamicx_buf); + + dynamicx_len = dynamicx->dynamicx_len; + + dynamicx_buf[dynamicx_len] = 0; + } + u8 *tmp_buf = potfile_ctx->tmp_buf; tmp_buf[0] = 0; @@ -1043,6 +1093,25 @@ int potfile_handle_left (hashcat_ctx_t *hashcat_ctx) } } + // dynamicx + unsigned char *dynamicx_buf = NULL; + + u32 dynamicx_len = 0; + + if (hash->hash_info != NULL) + { + dynamicx_t *dynamicx = hash->hash_info->dynamicx; + + if (dynamicx) + { + dynamicx_buf = (unsigned char *) (dynamicx->dynamicx_buf); + + dynamicx_len = dynamicx->dynamicx_len; + + dynamicx_buf[dynamicx_len] = 0; + } + } + const bool print_eol = (hashconfig->opts_type & OPTS_TYPE_BINARY_HASHFILE) == 0; u8 *tmp_buf = potfile_ctx->tmp_buf; diff --git a/src/restore.c b/src/restore.c index 0b6906fff..f2a59f7c1 100644 --- a/src/restore.c +++ b/src/restore.c @@ -302,20 +302,20 @@ int restore_ctx_init (hashcat_ctx_t *hashcat_ctx, int argc, char **argv) restore_ctx->enabled = false; - if (user_options->usage > 0) return 0; - if (user_options->backend_info > 0) return 0; + if (user_options->usage > 0) return 0; + if (user_options->backend_info > 0) return 0; - if (user_options->benchmark == true) return 0; - if (user_options->hash_info == true) return 0; - if (user_options->keyspace == true) return 0; - if (user_options->left == true) return 0; - if (user_options->show == true) return 0; - if (user_options->stdout_flag == true) return 0; - if (user_options->speed_only == true) return 0; - if (user_options->progress_only == true) return 0; - if (user_options->version == true) return 0; - if (user_options->identify == true) return 0; - if (user_options->restore_disable == true) return 0; + if (user_options->benchmark == true) return 0; + if (user_options->hash_info == true) return 0; + if (user_options->keyspace == true) return 0; + if (user_options->left == true) return 0; + if (user_options->show == true) return 0; + if (user_options->stdout_flag == true) return 0; + if (user_options->speed_only == true) return 0; + if (user_options->progress_only == true) return 0; + if (user_options->version == true) return 0; + if (user_options->identify == true) return 0; + if (user_options->restore_enable == false) return 0; if (argc == 0) return 0; if (argv == NULL) return 0; diff --git a/src/selftest.c b/src/selftest.c index 9c80374af..313725e55 100644 --- a/src/selftest.c +++ b/src/selftest.c @@ -1048,7 +1048,7 @@ HC_API_CALL void *thread_selftest (void *p) user_options_t *user_options = hashcat_ctx->user_options; - if (user_options->self_test_disable == true) return NULL; + if (user_options->self_test == false) return NULL; hc_device_param_t *device_param = backend_ctx->devices_param + thread_param->tid; diff --git a/src/shared.c b/src/shared.c index ddfc35848..5b2375009 100644 --- a/src/shared.c +++ b/src/shared.c @@ -19,6 +19,10 @@ #include #endif +#if defined (_WIN) +#include +#endif + static const char *const PA_000 = "OK"; static const char *const PA_001 = "Ignored due to comment"; static const char *const PA_002 = "Ignored due to zero length"; @@ -593,7 +597,7 @@ void setup_environment_variables (const folder_config_t *folder_config) #endif } -void setup_umask () +void setup_umask (void) { umask (077); } @@ -622,11 +626,11 @@ u32 get_random_num (const u32 min, const u32 max) #if defined (_WIN) - return (((u32) rand () % (max - min)) + min); + return (((u32) rand () % (max - min + 1)) + min); #else - return (((u32) random () % (max - min)) + min); + return (((u32) random () % (max - min + 1)) + min); #endif } @@ -677,7 +681,7 @@ void hc_string_trim_trailing (char *s) s[new_len] = 0; } -int hc_get_processor_count () +int hc_get_processor_count (void) { int cnt = 0; @@ -908,7 +912,11 @@ int select_read_timeout (int sockfd, const int sec) fd_set fds; FD_ZERO (&fds); +#if defined(_WIN) + FD_SET ((SOCKET)sockfd, &fds); +#else FD_SET (sockfd, &fds); +#endif return select (sockfd + 1, &fds, NULL, NULL, &tv); } @@ -923,7 +931,11 @@ int select_write_timeout (int sockfd, const int sec) fd_set fds; FD_ZERO (&fds); +#if defined(_WIN) + FD_SET ((SOCKET)sockfd, &fds); +#else FD_SET (sockfd, &fds); +#endif return select (sockfd + 1, NULL, &fds, NULL, &tv); } @@ -1471,3 +1483,20 @@ char *file_to_buffer (const char *filename) return NULL; } + +int extract_dynamicx_hash (const u8 *input_buf, const int input_len, u8 **output_buf, int *output_len) +{ + int hash_mode = -1; + + if (sscanf ((char *) input_buf, "$dynamic_%d$", &hash_mode) != 1) return -1; + + *output_buf = (u8 *) strchr ((char *) input_buf + 10, '$'); + + if (*output_buf == NULL) return -1; + + *output_buf += 1; // the $ itself + + *output_len = input_len - (*output_buf - input_buf); + + return hash_mode; +} diff --git a/src/terminal.c b/src/terminal.c index 5519eb060..211a8b24f 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -125,7 +125,7 @@ void goodbye_screen (hashcat_ctx_t *hashcat_ctx, const time_t proc_start, const event_log_info_nn (hashcat_ctx, "Stopped: %s", ctime_r (&proc_stop, stop_buf)); } -int setup_console () +int setup_console (void) { #if defined (_WIN) SetConsoleWindowSize (132); @@ -445,7 +445,7 @@ void SetConsoleWindowSize (const int x) static struct termios savemodes; static int havemodes = 0; -int tty_break () +int tty_break (void) { struct termios modmodes; @@ -461,7 +461,7 @@ int tty_break () return tcsetattr (fileno (stdin), TCSANOW, &modmodes); } -int tty_getchar () +int tty_getchar (void) { fd_set rfds; @@ -482,7 +482,7 @@ int tty_getchar () return getchar (); } -int tty_fix () +int tty_fix (void) { if (!havemodes) return 0; @@ -490,11 +490,11 @@ int tty_fix () } #endif -#if defined (__APPLE__) || defined (__FreeBSD__) +#if defined (__APPLE__) static struct termios savemodes; static int havemodes = 0; -int tty_break () +int tty_break (void) { struct termios modmodes; @@ -510,7 +510,7 @@ int tty_break () return ioctl (fileno (stdin), TIOCSETAW, &modmodes); } -int tty_getchar () +int tty_getchar (void) { fd_set rfds; @@ -542,7 +542,7 @@ int tty_fix () #if defined (_WIN) static DWORD saveMode = 0; -int tty_break () +int tty_break (void) { HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE); @@ -552,7 +552,7 @@ int tty_break () return 0; } -int tty_getchar () +int tty_getchar (void) { HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE); @@ -592,7 +592,7 @@ int tty_getchar () return 0; } -int tty_fix () +int tty_fix (void) { HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE); @@ -1899,14 +1899,18 @@ void status_display_status_json (hashcat_ctx_t *hashcat_ctx) printf (" \"rejected\": %" PRIu64 ",", hashcat_status->progress_rejected); printf (" \"devices\": ["); - for (int device_id = 0; device_id < hashcat_status->device_info_cnt; device_id++) + for (int device_id = 0, first_dev = 1; device_id < hashcat_status->device_info_cnt; device_id++) { const device_info_t *device_info = hashcat_status->device_info_buf + device_id; if (device_info->skipped_dev == true) continue; if (device_info->skipped_warning_dev == true) continue; - if (device_id != 0) + if (first_dev) + { + first_dev = 0; + } + else { printf (","); } diff --git a/src/usage.c b/src/usage.c index 6de2fab85..0b735fe0d 100644 --- a/src/usage.c +++ b/src/usage.c @@ -57,6 +57,7 @@ static const char *const USAGE_BIG_PRE_HASHMODES[] = " --restore-file-path | File | Specific path to restore file | --restore-file-path=x.restore", " -o, --outfile | File | Define outfile for recovered hash | -o outfile.txt", " --outfile-format | Str | Outfile format to use, separated with commas | --outfile-format=1,3", + " --outfile-json | | Force JSON format in outfile format |", " --outfile-autohex-disable | | Disable the use of $HEX[] in output plains |", " --outfile-check-timer | Num | Sets seconds between outfile checks to X | --outfile-check-timer=30", " --wordlist-autohex-disable | | Disable the conversion of $HEX[] from the wordlist |", @@ -65,6 +66,7 @@ static const char *const USAGE_BIG_PRE_HASHMODES[] = " --show | | Compare hashlist with potfile; show cracked hashes |", " --left | | Compare hashlist with potfile; show uncracked hashes |", " --username | | Enable ignoring of usernames in hashfile |", + " --dynamic-x | | Ignore $dynamic_X$ prefix in hashes |", " --remove | | Enable removal of hashes once they are cracked |", " --remove-timer | Num | Update input hash file each X seconds | --remove-timer=30", " --potfile-disable | | Do not write potfile |", @@ -98,7 +100,7 @@ static const char *const USAGE_BIG_PRE_HASHMODES[] = " --backend-ignore-hip | | Do not try to open HIP interface on startup |", " --backend-ignore-metal | | Do not try to open Metal interface on startup |", " --backend-ignore-opencl | | Do not try to open OpenCL interface on startup |", - " -I, --backend-info | | Show system/evironment/backend API info | -I or -II", + " -I, --backend-info | | Show system/environment/backend API info | -I or -II", " -d, --backend-devices | Str | Backend devices to use, separated with commas | -d 1", " -Y, --backend-devices-virtual | Num | Spawn X virtual instances for each real device | -Y 8", " -D, --opencl-device-types | Str | OpenCL device-types to use, separated with commas | -D 1", @@ -108,7 +110,7 @@ static const char *const USAGE_BIG_PRE_HASHMODES[] = " -n, --kernel-accel | Num | Manual workload tuning, set outerloop step size to X | -n 64", " -u, --kernel-loops | Num | Manual workload tuning, set innerloop step size to X | -u 256", " -T, --kernel-threads | Num | Manual workload tuning, set thread count to X | -T 64", - " --backend-vector-width | Num | Manually override backend vector-width to X | --backend-vector=4", + " --backend-vector-width | Num | Manually override backend vector-width to X | --backend-vector-width=4", " --spin-damp | Num | Use CPU for device synchronization, in percent | --spin-damp=10", " --hwmon-disable | | Disable temperature and fanspeed reads and triggers |", " --hwmon-temp-abort | Num | Abort if temperature reaches X degrees Celsius | --hwmon-temp-abort=100", diff --git a/src/user_options.c b/src/user_options.c index de84bd017..5093301e9 100644 --- a/src/user_options.c +++ b/src/user_options.c @@ -59,6 +59,7 @@ static const struct option long_options[] = {"debug-file", required_argument, NULL, IDX_DEBUG_FILE}, {"debug-mode", required_argument, NULL, IDX_DEBUG_MODE}, {"deprecated-check-disable", no_argument, NULL, IDX_DEPRECATED_CHECK_DISABLE}, + {"dynamic-x", no_argument, NULL, IDX_DYNAMIC_X}, {"encoding-from", required_argument, NULL, IDX_ENCODING_FROM}, {"encoding-to", required_argument, NULL, IDX_ENCODING_TO}, {"example-hashes", no_argument, NULL, IDX_HASH_INFO}, // alias of hash-info @@ -108,6 +109,7 @@ static const struct option long_options[] = {"outfile-check-dir", required_argument, NULL, IDX_OUTFILE_CHECK_DIR}, {"outfile-check-timer", required_argument, NULL, IDX_OUTFILE_CHECK_TIMER}, {"outfile-format", required_argument, NULL, IDX_OUTFILE_FORMAT}, + {"outfile-json", no_argument, NULL, IDX_OUTFILE_JSON}, {"outfile", required_argument, NULL, IDX_OUTFILE}, {"potfile-disable", no_argument, NULL, IDX_POTFILE_DISABLE}, {"potfile-path", required_argument, NULL, IDX_POTFILE_PATH}, @@ -179,7 +181,7 @@ int user_options_init (hashcat_ctx_t *hashcat_ctx) { user_options_t *user_options = hashcat_ctx->user_options; - user_options->advice_disable = ADVICE_DISABLE; + user_options->advice = ADVICE; user_options->attack_mode = ATTACK_MODE; user_options->autodetect = AUTODETECT; user_options->backend_devices = NULL; @@ -218,11 +220,12 @@ int user_options_init (hashcat_ctx_t *hashcat_ctx) user_options->custom_charset_9 = NULL; user_options->debug_file = NULL; user_options->debug_mode = DEBUG_MODE; - user_options->deprecated_check_disable = DEPRECATED_CHECK_DISABLE; + user_options->deprecated_check = DEPRECATED_CHECK; + user_options->dynamic_x = DYNAMIC_X; user_options->encoding_from = ENCODING_FROM; user_options->encoding_to = ENCODING_TO; user_options->force = FORCE; - user_options->hwmon_disable = HWMON_DISABLE; + user_options->hwmon = HWMON; user_options->hwmon_temp_abort = HWMON_TEMP_ABORT; user_options->hash_info = HASH_INFO; user_options->hash_mode = HASH_MODE; @@ -244,31 +247,32 @@ int user_options_init (hashcat_ctx_t *hashcat_ctx) user_options->keyspace = KEYSPACE; user_options->left = LEFT; user_options->limit = LIMIT; - user_options->logfile_disable = LOGFILE_DISABLE; + user_options->logfile = LOGFILE; user_options->loopback = LOOPBACK; user_options->machine_readable = MACHINE_READABLE; user_options->markov_classic = MARKOV_CLASSIC; - user_options->markov_disable = MARKOV_DISABLE; + user_options->markov = MARKOV; user_options->markov_hcstat2 = NULL; user_options->markov_inverse = MARKOV_INVERSE; user_options->markov_threshold = MARKOV_THRESHOLD; user_options->metal_compiler_runtime = METAL_COMPILER_RUNTIME; user_options->nonce_error_corrections = NONCE_ERROR_CORRECTIONS; user_options->opencl_device_types = NULL; - user_options->optimized_kernel_enable = OPTIMIZED_KERNEL_ENABLE; - user_options->multiply_accel_disable = MULTIPLY_ACCEL_DISABLE; + user_options->optimized_kernel = OPTIMIZED_KERNEL; + user_options->multiply_accel = MULTIPLY_ACCEL; user_options->outfile_autohex = OUTFILE_AUTOHEX; user_options->outfile_check_dir = NULL; user_options->outfile_check_timer = OUTFILE_CHECK_TIMER; user_options->outfile_format = OUTFILE_FORMAT; + user_options->outfile_json = OUTFILE_JSON; user_options->outfile = NULL; - user_options->potfile_disable = POTFILE_DISABLE; + user_options->potfile = POTFILE; user_options->potfile_path = NULL; user_options->progress_only = PROGRESS_ONLY; user_options->quiet = QUIET; user_options->remove = REMOVE; user_options->remove_timer = REMOVE_TIMER; - user_options->restore_disable = RESTORE_DISABLE; + user_options->restore_enable = RESTORE_ENABLE; user_options->restore_file_path = NULL; user_options->restore = RESTORE; user_options->restore_timer = RESTORE_TIMER; @@ -282,7 +286,7 @@ int user_options_init (hashcat_ctx_t *hashcat_ctx) user_options->runtime = RUNTIME; user_options->scrypt_tmto = SCRYPT_TMTO; user_options->segment_size = SEGMENT_SIZE; - user_options->self_test_disable = SELF_TEST_DISABLE; + user_options->self_test = SELF_TEST; user_options->separator = SEPARATOR; user_options->session = PROGNAME; user_options->show = SHOW; @@ -302,7 +306,7 @@ int user_options_init (hashcat_ctx_t *hashcat_ctx) user_options->veracrypt_pim_start = VERACRYPT_PIM_START; user_options->veracrypt_pim_stop = VERACRYPT_PIM_STOP; user_options->version = VERSION; - user_options->wordlist_autohex_disable = WORDLIST_AUTOHEX_DISABLE; + user_options->wordlist_autohex = WORDLIST_AUTOHEX; user_options->workload_profile = WORKLOAD_PROFILE; user_options->rp_files_cnt = 0; user_options->rp_files = (char **) hccalloc (256, sizeof (char *)); @@ -410,14 +414,15 @@ int user_options_getopt (hashcat_ctx_t *hashcat_ctx, int argc, char **argv) case IDX_RESTORE: user_options->restore = true; break; case IDX_QUIET: user_options->quiet = true; break; case IDX_SHOW: user_options->show = true; break; - case IDX_DEPRECATED_CHECK_DISABLE: user_options->deprecated_check_disable = true; break; + case IDX_DEPRECATED_CHECK_DISABLE: user_options->deprecated_check = false; break; case IDX_LEFT: user_options->left = true; break; - case IDX_ADVICE_DISABLE: user_options->advice_disable = true; break; + case IDX_ADVICE_DISABLE: user_options->advice = false; break; case IDX_USERNAME: user_options->username = true; break; + case IDX_DYNAMIC_X: user_options->dynamic_x = true; break; case IDX_REMOVE: user_options->remove = true; break; case IDX_REMOVE_TIMER: user_options->remove_timer = hc_strtoul (optarg, NULL, 10); user_options->remove_timer_chgd = true; break; - case IDX_POTFILE_DISABLE: user_options->potfile_disable = true; break; + case IDX_POTFILE_DISABLE: user_options->potfile = false; break; case IDX_POTFILE_PATH: user_options->potfile_path = optarg; break; case IDX_DEBUG_MODE: user_options->debug_mode = hc_strtoul (optarg, NULL, 10); break; case IDX_DEBUG_FILE: user_options->debug_file = optarg; break; @@ -427,7 +432,7 @@ int user_options_getopt (hashcat_ctx_t *hashcat_ctx, int argc, char **argv) case IDX_OUTFILE_CHECK_DIR: user_options->outfile_check_dir = optarg; break; case IDX_HASH_INFO: user_options->hash_info = true; break; case IDX_FORCE: user_options->force = true; break; - case IDX_SELF_TEST_DISABLE: user_options->self_test_disable = true; break; + case IDX_SELF_TEST_DISABLE: user_options->self_test = false; break; case IDX_SKIP: user_options->skip = hc_strtoull (optarg, NULL, 10); user_options->skip_chgd = true; break; case IDX_LIMIT: user_options->limit = hc_strtoull (optarg, NULL, 10); @@ -442,7 +447,7 @@ int user_options_getopt (hashcat_ctx_t *hashcat_ctx, int argc, char **argv) case IDX_IDENTIFY: user_options->identify = true; break; case IDX_SPEED_ONLY: user_options->speed_only = true; break; case IDX_PROGRESS_ONLY: user_options->progress_only = true; break; - case IDX_RESTORE_DISABLE: user_options->restore_disable = true; break; + case IDX_RESTORE_DISABLE: user_options->restore_enable = false; break; case IDX_RESTORE_FILE_PATH: user_options->restore_file_path = optarg; break; case IDX_STATUS: user_options->status = true; break; case IDX_STATUS_JSON: user_options->status_json = true; break; @@ -465,19 +470,23 @@ int user_options_getopt (hashcat_ctx_t *hashcat_ctx, int argc, char **argv) case IDX_RP_GEN_FUNC_SEL: user_options->rp_gen_func_sel = optarg; break; case IDX_RP_GEN_SEED: user_options->rp_gen_seed = hc_strtoul (optarg, NULL, 10); user_options->rp_gen_seed_chgd = true; break; - case IDX_RULE_BUF_L: user_options->rule_buf_l = optarg; break; - case IDX_RULE_BUF_R: user_options->rule_buf_r = optarg; break; - case IDX_MARKOV_DISABLE: user_options->markov_disable = true; break; + case IDX_RULE_BUF_L: user_options->rule_buf_l = optarg; + user_options->rule_buf_l_chgd = true; break; + case IDX_RULE_BUF_R: user_options->rule_buf_r = optarg; + user_options->rule_buf_r_chgd = true; break; + case IDX_MARKOV_DISABLE: user_options->markov = false; break; case IDX_MARKOV_CLASSIC: user_options->markov_classic = true; break; case IDX_MARKOV_INVERSE: user_options->markov_inverse = true; break; case IDX_MARKOV_THRESHOLD: user_options->markov_threshold = hc_strtoul (optarg, NULL, 10); break; case IDX_MARKOV_HCSTAT2: user_options->markov_hcstat2 = optarg; break; - case IDX_OUTFILE: user_options->outfile = optarg; break; + case IDX_OUTFILE: user_options->outfile = optarg; + user_options->outfile_chgd = true; break; case IDX_OUTFILE_FORMAT: user_options->outfile_format = outfile_format_parse (optarg); user_options->outfile_format_chgd = true; break; + case IDX_OUTFILE_JSON: user_options->outfile_json = true; break; case IDX_OUTFILE_AUTOHEX_DISABLE: user_options->outfile_autohex = false; break; case IDX_OUTFILE_CHECK_TIMER: user_options->outfile_check_timer = hc_strtoul (optarg, NULL, 10); break; - case IDX_WORDLIST_AUTOHEX_DISABLE: user_options->wordlist_autohex_disable = true; break; + case IDX_WORDLIST_AUTOHEX_DISABLE: user_options->wordlist_autohex = false; break; case IDX_HEX_CHARSET: user_options->hex_charset = true; break; case IDX_HEX_SALT: user_options->hex_salt = true; break; case IDX_HEX_WORDLIST: user_options->hex_wordlist = true; break; @@ -494,8 +503,8 @@ int user_options_getopt (hashcat_ctx_t *hashcat_ctx, int argc, char **argv) case IDX_BACKEND_VECTOR_WIDTH: user_options->backend_vector_width = hc_strtoul (optarg, NULL, 10); user_options->backend_vector_width_chgd = true; break; case IDX_OPENCL_DEVICE_TYPES: user_options->opencl_device_types = optarg; break; - case IDX_OPTIMIZED_KERNEL_ENABLE: user_options->optimized_kernel_enable = true; break; - case IDX_MULTIPLY_ACCEL_DISABLE: user_options->multiply_accel_disable = true; break; + case IDX_OPTIMIZED_KERNEL_ENABLE: user_options->optimized_kernel = true; break; + case IDX_MULTIPLY_ACCEL_DISABLE: user_options->multiply_accel = false; break; case IDX_WORKLOAD_PROFILE: user_options->workload_profile = hc_strtoul (optarg, NULL, 10); user_options->workload_profile_chgd = true; break; case IDX_KERNEL_ACCEL: user_options->kernel_accel = hc_strtoul (optarg, NULL, 10); @@ -506,9 +515,9 @@ int user_options_getopt (hashcat_ctx_t *hashcat_ctx, int argc, char **argv) user_options->kernel_threads_chgd = true; break; case IDX_SPIN_DAMP: user_options->spin_damp = hc_strtoul (optarg, NULL, 10); user_options->spin_damp_chgd = true; break; - case IDX_HWMON_DISABLE: user_options->hwmon_disable = true; break; + case IDX_HWMON_DISABLE: user_options->hwmon = false; break; case IDX_HWMON_TEMP_ABORT: user_options->hwmon_temp_abort = hc_strtoul (optarg, NULL, 10); break; - case IDX_LOGFILE_DISABLE: user_options->logfile_disable = true; break; + case IDX_LOGFILE_DISABLE: user_options->logfile = false; break; case IDX_HCCAPX_MESSAGE_PAIR: user_options->hccapx_message_pair = hc_strtoul (optarg, NULL, 10); user_options->hccapx_message_pair_chgd = true; break; case IDX_NONCE_ERROR_CORRECTIONS: user_options->nonce_error_corrections = hc_strtoul (optarg, NULL, 10); @@ -1063,9 +1072,9 @@ int user_options_sanity (hashcat_ctx_t *hashcat_ctx) } } - if ((user_options->show == true) && (user_options->username == true)) + if ((user_options->show == true) && ((user_options->username == true) || (user_options->dynamic_x == true))) { - event_log_error (hashcat_ctx, "Mixing --show with --username can cause exponential delay in output."); + event_log_error (hashcat_ctx, "Mixing --show with --username or --dynamic-x can cause exponential delay in output."); return 0; } @@ -1079,7 +1088,7 @@ int user_options_sanity (hashcat_ctx_t *hashcat_ctx) return -1; } - if (user_options->potfile_disable == true) + if (user_options->potfile == false) { event_log_error (hashcat_ctx, "Mixing --potfile-disable is not allowed with --show or --left."); @@ -1095,6 +1104,13 @@ int user_options_sanity (hashcat_ctx_t *hashcat_ctx) return -1; } + + if (user_options->outfile_json == true) + { + event_log_error (hashcat_ctx, "Mixing --outfile-json is not allowed with --show."); + + return -1; + } } if (user_options->keyspace == true) @@ -1409,6 +1425,22 @@ int user_options_sanity (hashcat_ctx_t *hashcat_ctx) } } + #if defined (_WIN) + char invalid_characters[] = "/<>:\"\\|?*"; + #else + char invalid_characters[] = "/"; + #endif + + for (size_t i = 0; strlen (user_options->session) > i; i++) + { + if (strchr (invalid_characters, user_options->session[i]) != NULL) + { + event_log_error (hashcat_ctx, "Invalid --session value - must not contain invalid characters."); + + return -1; + } + } + if (user_options->cpu_affinity != NULL) { if (strlen (user_options->cpu_affinity) == 0) @@ -1477,7 +1509,7 @@ int user_options_sanity (hashcat_ctx_t *hashcat_ctx) return -1; } - if ((user_options->brain_client == true) && (user_options->potfile_disable == true)) + if ((user_options->brain_client == true) && (user_options->potfile == false)) { event_log_error (hashcat_ctx, "Using --potfile-disable is not allowed if --brain-client is used."); @@ -1833,13 +1865,13 @@ void user_options_preprocess (hashcat_ctx_t *hashcat_ctx) if (user_options->stdout_flag) { - user_options->hwmon_disable = true; + user_options->hwmon = false; user_options->left = false; - user_options->logfile_disable = true; + user_options->logfile = false; user_options->spin_damp = 0; user_options->outfile_check_timer = 0; - user_options->potfile_disable = true; - user_options->restore_disable = true; + user_options->potfile = false; + user_options->restore_enable = false; user_options->restore = false; user_options->restore_timer = 0; user_options->show = false; @@ -1857,13 +1889,13 @@ void user_options_preprocess (hashcat_ctx_t *hashcat_ctx) || user_options->usage > 0 || user_options->backend_info > 0) { - user_options->hwmon_disable = true; + user_options->hwmon = false; user_options->left = false; - user_options->logfile_disable = true; + user_options->logfile = false; user_options->spin_damp = 0; user_options->outfile_check_timer = 0; - user_options->potfile_disable = true; - user_options->restore_disable = true; + user_options->potfile = false; + user_options->restore_enable = false; user_options->restore = false; user_options->restore_timer = 0; user_options->show = false; @@ -1882,11 +1914,11 @@ void user_options_preprocess (hashcat_ctx_t *hashcat_ctx) user_options->hwmon_temp_abort = 0; user_options->increment = false; user_options->left = false; - user_options->logfile_disable = true; + user_options->logfile = false; user_options->spin_damp = 0; - user_options->potfile_disable = true; + user_options->potfile = false; user_options->progress_only = false; - user_options->restore_disable = true; + user_options->restore_enable = false; user_options->restore = false; user_options->restore_timer = 0; user_options->show = false; @@ -1901,8 +1933,8 @@ void user_options_preprocess (hashcat_ctx_t *hashcat_ctx) if (user_options->workload_profile_chgd == false) { - user_options->optimized_kernel_enable = true; - user_options->workload_profile = 3; + user_options->optimized_kernel = true; + user_options->workload_profile = 3; } } @@ -1987,7 +2019,7 @@ void user_options_preprocess (hashcat_ctx_t *hashcat_ctx) // this allows the user to use --show and --left while cracking (i.e. while another instance of hashcat is running) if (user_options->show == true || user_options->left == true) { - user_options->restore_disable = true; + user_options->restore_enable = false; user_options->restore = false; } @@ -2008,10 +2040,10 @@ void user_options_preprocess (hashcat_ctx_t *hashcat_ctx) } #if !defined (WITH_HWMON) - user_options->hwmon_disable = true; + user_options->hwmon = false; #endif // WITH_HWMON - if (user_options->hwmon_disable == true) + if (user_options->hwmon == false) { user_options->hwmon_temp_abort = 0; } @@ -2086,7 +2118,7 @@ void user_options_preprocess (hashcat_ctx_t *hashcat_ctx) if (user_options->attack_mode == ATTACK_MODE_ASSOCIATION) { - user_options->potfile_disable = true; + user_options->potfile = false; } if (user_options->stdout_flag == false && user_options->benchmark == false && user_options->keyspace == false) @@ -2149,12 +2181,12 @@ void user_options_info (hashcat_ctx_t *hashcat_ctx) event_log_info (hashcat_ctx, "* --opencl-device-types=%s", user_options->opencl_device_types); } - if (user_options->optimized_kernel_enable == true) + if (user_options->optimized_kernel == true) { event_log_info (hashcat_ctx, "* --optimized-kernel-enable"); } - if (user_options->multiply_accel_disable == true) + if (user_options->multiply_accel == false) { event_log_info (hashcat_ctx, "* --multiply-accel-disable"); } @@ -2213,12 +2245,12 @@ void user_options_info (hashcat_ctx_t *hashcat_ctx) event_log_info (hashcat_ctx, "# option: --opencl-device-types=%s", user_options->opencl_device_types); } - if (user_options->optimized_kernel_enable == true) + if (user_options->optimized_kernel == true) { event_log_info (hashcat_ctx, "# option: --optimized-kernel-enable"); } - if (user_options->multiply_accel_disable == true) + if (user_options->multiply_accel == false) { event_log_info (hashcat_ctx, "# option: --multiply-accel-disable"); } @@ -3249,9 +3281,10 @@ void user_options_logger (hashcat_ctx_t *hashcat_ctx) logfile_top_uint (user_options->bitmap_max); logfile_top_uint (user_options->bitmap_min); logfile_top_uint (user_options->debug_mode); + logfile_top_uint (user_options->dynamic_x); logfile_top_uint (user_options->hash_info); logfile_top_uint (user_options->force); - logfile_top_uint (user_options->hwmon_disable); + logfile_top_uint (user_options->hwmon); logfile_top_uint (user_options->hwmon_temp_abort); logfile_top_uint (user_options->hash_mode); logfile_top_uint (user_options->hex_charset); @@ -3268,29 +3301,30 @@ void user_options_logger (hashcat_ctx_t *hashcat_ctx) logfile_top_uint (user_options->kernel_threads); logfile_top_uint (user_options->keyspace); logfile_top_uint (user_options->left); - logfile_top_uint (user_options->logfile_disable); + logfile_top_uint (user_options->logfile); logfile_top_uint (user_options->loopback); logfile_top_uint (user_options->machine_readable); logfile_top_uint (user_options->markov_classic); - logfile_top_uint (user_options->markov_disable); + logfile_top_uint (user_options->markov); logfile_top_uint (user_options->markov_inverse); logfile_top_uint (user_options->markov_threshold); logfile_top_uint (user_options->metal_compiler_runtime); - logfile_top_uint (user_options->multiply_accel_disable); + logfile_top_uint (user_options->multiply_accel); logfile_top_uint (user_options->backend_info); logfile_top_uint (user_options->backend_vector_width); - logfile_top_uint (user_options->optimized_kernel_enable); + logfile_top_uint (user_options->optimized_kernel); logfile_top_uint (user_options->outfile_autohex); logfile_top_uint (user_options->outfile_check_timer); logfile_top_uint (user_options->outfile_format); - logfile_top_uint (user_options->wordlist_autohex_disable); - logfile_top_uint (user_options->potfile_disable); + logfile_top_uint (user_options->outfile_json); + logfile_top_uint (user_options->wordlist_autohex); + logfile_top_uint (user_options->potfile); logfile_top_uint (user_options->progress_only); logfile_top_uint (user_options->quiet); logfile_top_uint (user_options->remove); logfile_top_uint (user_options->remove_timer); logfile_top_uint (user_options->restore); - logfile_top_uint (user_options->restore_disable); + logfile_top_uint (user_options->restore_enable); logfile_top_uint (user_options->restore_timer); logfile_top_uint (user_options->rp_files_cnt); logfile_top_uint (user_options->rp_gen); @@ -3300,7 +3334,7 @@ void user_options_logger (hashcat_ctx_t *hashcat_ctx) logfile_top_uint (user_options->runtime); logfile_top_uint (user_options->scrypt_tmto); logfile_top_uint (user_options->segment_size); - logfile_top_uint (user_options->self_test_disable); + logfile_top_uint (user_options->self_test); logfile_top_uint (user_options->slow_candidates); logfile_top_uint (user_options->show); logfile_top_uint (user_options->speed_only); diff --git a/src/wordlist.c b/src/wordlist.c index 62941295f..1776b4885 100644 --- a/src/wordlist.c +++ b/src/wordlist.c @@ -37,7 +37,7 @@ size_t convert_from_hex (hashcat_ctx_t *hashcat_ctx, char *line_buf, const size_ return (i); } - if (user_options->wordlist_autohex_disable == false) + if (user_options->wordlist_autohex == true) { if (is_hexify ((const u8 *) line_buf, line_len) == true) { @@ -730,7 +730,7 @@ int wl_data_init (hashcat_ctx_t *hashcat_ctx) } else { - if (user_options->wordlist_autohex_disable == false) + if (user_options->wordlist_autohex == true) { wl_data->func = get_next_word_lm_hex_or_text; // might be $HEX[] notation } diff --git a/tools/2hashcat_tests/metamask2hashcat-test.py b/tools/2hashcat_tests/metamask2hashcat-test.py old mode 100644 new mode 100755 diff --git a/tools/aescrypt2hashcat.pl b/tools/aescrypt2hashcat.pl index 8cb2c6efa..b20cf9fb6 100755 --- a/tools/aescrypt2hashcat.pl +++ b/tools/aescrypt2hashcat.pl @@ -72,7 +72,7 @@ if ($version ne "\x02") } -read_bytes ($file_handle, 1); # reservered/skip (normally should be just \x00) +read_bytes ($file_handle, 1); # reserved/skip (normally should be just \x00) # Loop over the extensions until we got extension size 0 diff --git a/tools/benchmark_deep.pl b/tools/benchmark_deep.pl index af0ca873e..79bb19580 100755 --- a/tools/benchmark_deep.pl +++ b/tools/benchmark_deep.pl @@ -379,7 +379,7 @@ chdir ($hashcat_path); for my $hash_type (@hash_types) { - # banchmark always in optimized mode with single hash and mask! + # benchmark always in optimized mode with single hash and mask! my $mask = $default_mask; @@ -521,7 +521,7 @@ sub get_module { if (($hash_type == 22000) || ($hash_type == 22001)) { - ## problem while in -m 2500 backward compatiblity mode + ## problem while in -m 2500 backward compatibility mode } else { diff --git a/tools/bisq2hashcat.py b/tools/bisq2hashcat.py old mode 100644 new mode 100755 diff --git a/tools/gpg_tests/example17040.sh b/tools/gpg_tests/example17040.sh new file mode 100755 index 000000000..b72153daf --- /dev/null +++ b/tools/gpg_tests/example17040.sh @@ -0,0 +1,16 @@ +#!/bin/bash +FILE="./hashcat.exe" +if [[ -f "$FILE" ]]; then + echo "we found hashcat.exe binary so use that" #wsl +else + FILE="./hashcat" + if [[ -f "$FILE" ]]; then + echo "we found ./hashcat binary so use that" #linux + else + echo "could not find hashcat binary, compile it first using make" + exit + fi +fi + +$FILE -a0 -m17040 tools/gpg_tests/refdata/m17040/ref1-cast5.hash tools/gpg_tests/refdata/m17040/ref1-cast5.txt --potfile-disable +$FILE -a0 -m17040 tools/gpg_tests/refdata/m17040/ref2-cast5.hash tools/gpg_tests/refdata/m17040/ref2-cast5.txt --potfile-disable diff --git a/tools/gpg_tests/refdata/m17040/ref1-cast5.hash b/tools/gpg_tests/refdata/m17040/ref1-cast5.hash new file mode 100644 index 000000000..bf1ba0dde --- /dev/null +++ b/tools/gpg_tests/refdata/m17040/ref1-cast5.hash @@ -0,0 +1 @@ +$gpg$*1*1308*4096*ddf02802e2d06319bcf5962745b73677ecfa229649fed991e3360bdf2fffe71f521b8f877bccfcdce9a4fb4aeb63bd21fed6e37f96f193a6f7d3c476f4a7e01e7421d0eba5bfcd59544e37887572cd40e8d03e901574ec0f3afdff35ad3f25cb818ddadee84ddfef636207febd8d12d8a98983c86afa46608d178dba5ec51e98a182bd9687b6431fba87b5a16b5e0cf872db7dc12c55bfe7faaa443044d5a84ddf034198e5bc6b4b707b5f4a4c5999ff3885975113fca02693620f36f8f20570bdaf581726053b6c982cb988a3091dc206624f9d36372b151b22c7dc2cb71b9aaed95dc5630c4c4b045f80c403836cc9c84951fc04b8d6e413e1d4f6b3815508f43cf80c25c7db3882b5b6572f1395a00dcda7fe65ce2155f9ea2cfe13588e0fb10316e7dd978e1d89cffc06a5e722ec765315926d2ee9060d8f449ead31cbacea88a5251be3b518d23984530da9f930114e614b7ed30f748c7512bddca8604bb5310ed76b9982eb88acaf49a29325e9db6987c6dea3878e2cb7daf3800177579ddcaafeacdba8edd147fae61bae36ab83a98db69a6c92017b3db8cff68985db989a03ee1bd045e6a577151486cdaeaf26517027b2f140b8493e2f401ea222511c2ce61c7057d64e8c3568e3f547f4b2875db59bc8c4f3346e0faf54e30745f583494b59e570bacb2b9eb71eb834e57f68aadda9af4bdb03276f71770c611aad0278033bb8c108471c4f4a2aa9070774367b9334661daf8a5e3eaf3d8dcca723d64ae7264c8709987a6cee9f42287b6e20d1d753262ff74886f3995412e59d09c61e4c637b6e97e6a3b08f9fa6adf9a1ec44a0372e893febd6712decc00bbd9cdacaf6bb9302fe8bd2ca27fdf5156c33582d56781ab0e5bd14da4b1edd73edd8f2a034a56d1a6f836724b605657f4714d59d522805e0ab02c6c5daed0973f93120ae01623ce0a96fbdf4402ce20ebb4f97fabbc90da5bb12aac3cd5f15c1add2d3863be59e843dca564ce9aa25b43ca1044b1e7e65d03d1f55f77d2a39cd85536ff38058837a23743c4e252f7de5654a562506b55d2b8fa29c7f4ecd307a8ae686cbb73fea6a8f72775d9e417ec346415024263a9f339dda286b682ccc8f93f7d4f59921620dd276188441fd44fc63925d18caa30a75c79c37a2ea45d14f6e423d2146281f9c6699a0658e50d69cfbc174090a0420bbb6f4e6b5b1f2b81b26f035aaf5c2e558c812496cb494587c78bf75350fb1a36e8c88076b4684094e0cba5dcdc4f672dbd2b432306b75077ae07b8fd88ba5b829eaed3fd2959a09b162329b75ac8fc20d4eea6e5971f54b31a23952dd4c111765822182cd60ee0de3cce3752c648918e3ec4c52643223132dcc885140faf8108230ebf4ef4149cbfa3070c91ec013404c15c1cecaa1efd544ab8313d378ef0e77c615b76b8ec07769960873ce9c7bdb1d75e7faef4c8a0b015c95a4e2bcd9ff7f5dfddd9a243fc0688db09e534ef1f3ebebd0c73b75bd57b8e02667da5744b1400dc695d4ae1e255d3487d1dead115de7d48962a15c7aecb97444173c40c028a46a7cfdd8cc7421f71d757cb809341c5148aedeab16f9289bc55b7475d646ae4993ab36fe5609a05121d140d4390289c94e4d87fd902fe03c8bfa13e7cfc9c21355ab6461d214137e4d90dff4a8f599020f12d7560fa4b5aaee1727f21c873fde76415b65357ecb923a547ddcdb20dde0880a287ed26d5ea4ce45514b907e368527c62e39ffdf2efeb817cd59694d23bafd48862e723f45e3c258cff3c804c5d2f17e24be8fe81a00f11f519beb9cde7be95226ac2a7f11e0f4f09dc040c11e1bf63172aa0f8a*1*254*2*3*8*0000000000000000*0*a11df265e4e54bee diff --git a/tools/gpg_tests/refdata/m17040/ref1-cast5.txt b/tools/gpg_tests/refdata/m17040/ref1-cast5.txt new file mode 100644 index 000000000..f30ae1eed --- /dev/null +++ b/tools/gpg_tests/refdata/m17040/ref1-cast5.txt @@ -0,0 +1 @@ +Hashcat1! diff --git a/tools/gpg_tests/refdata/m17040/ref2-cast5.hash b/tools/gpg_tests/refdata/m17040/ref2-cast5.hash new file mode 100644 index 000000000..c84a3f2f7 --- /dev/null +++ b/tools/gpg_tests/refdata/m17040/ref2-cast5.hash @@ -0,0 +1 @@ +$gpg$*1*1308*4096*b9bb392ab1b52997984826fd57c60ff16469f7e3a2bedf44e735e1426d5ad3aa43ce6adcd1f6d28e4357f31660fdd232c884653183cbe824bfe7364b2931f9b2028f93d00867c92dd77108dd4e65085944d08f2111f51308e26926d7d555580db59dc1874dc0611db82216e5788e0cb7cbd07f59fba91d36b3f1123d7be110301a59865bb318df5f8028858ca81e70bb85dd580130665f17a53cab073ffced08677f0dc7f6f8c49eb0ff2e828e0da97219fc09d1db45734834a57c6e19fac198938447153911df1dde314681c0caf368b91f2f9442eeda043765a70967e9da618d2cca7fd5d53a0d24a27652702a7924f4773a84d1d04bbc4d5d839235efa15933ac8c7652b28b9c84ac5f096a7ff32d7ccf791b514f1066daab43736807295f6814fde8f4956b3eeb302b6831bce1864af67a90a319bf2693de58e4834e11179246192750a09909ab9254314324069a498154245d72a9d0ca9c48f84b2ff4ac8ed7b4abb6ce5c4277722faaf7c74e9f00a5e7b518c637624df7c2261629850b0a7a673f325d9c3dd0243c1d966ab69ef1780c620f0d0da3315111b4ef07efa68b63779d4f4dbf625508ff176a4d7ce1e65384b6b781808dae43e9ae2b7a2bbcb80b854e0f154503f3600b7a1c4114bb0fcbc78c9f85d44e766cf729debebf6e8e221b1ba16f96a2f3540ec2723c522080599202160c14b17d587cdfffa29b691966a48cce551de7a97830c79de76fa46515159a8b78436b85b22985066827cc4b04e867e9a33c50cd8adafe8706b7cd06670ff8fc4e2bf853cd4cd78f050a722e45958eec6885fb0b9dc900357bfa47519f9bf28828c0899166656722e63eb877b00de244aea1badfcd92584153a6b6acb4d5a45a8c745718b4d439bf51792f7e3945042d8e199fcff6cdb4a8247565013e2b544611cf897cb14517eda73459f2879e2727cbedb7c3853e2c0f8fe5864fe19069019666bb9292689bd90edcb2839b8fe7e923036049657175f3ec37466024cd5c084c2454da962a908ae48ca2fcd0b2a03b246f53e1f1acf1229cd4ee62e4bcb64f9f545b4feb21c28f4f3244b974975ee61e2bb5216c1cb9bf9416cf19cc28ef61d32908c178e19927d8edefdf241b0773085eab933d2f57644426f7e1b46b6beafab98fe9099fb5e7fbe7aac3a521e7491cc0321ee9bc2b5b4a6aa1fd6ede05a6a35b33c9fff2668ce90a1b4d66d82f6da127be1097f9f686670d143cbd71766550d7fff099f39ced941237d8f71bb9289e96bf9b100b8ee361db30956550da1834e3cf1f1c70dc0c79bc35758596664448c43a8993beab7b08f69c9350601aa2d6b9ae576b4882af869135e49cc97cdc0cbb82ec62e77a3297e61efb661813d258d8e723a97058d41715187aa6c97bbe6046230a5414a3923f2380c6d10ccaab328ef93309c951b4c7e474b9662ae766b491c2705c5fa115e651e307a0b7d2b0411b949e1153b1d8e32580594a78e746cb00011677736d4a6830f450ebaec16653ea0cc20dcb29fdcd6b79f5b9cf50794dd40908dc2a509a64f6f32779d9b52fca2693d9d2bb787217df0135429fad20f102d4f44271f4c4e9a786a7304c894498fcac18afe3ef299de712263167427353fcb70a1c6fd9a649b71fb67a90b9395cba095d2bdad7f0b59710fd580dcfc3256ce98da04145bd4e887c3a859f48b7eda9954c445844bf26017b919c0423ed2f2cecbbe7e7eba02cc0ef51a5e74e846d6fe5e23ac42ef58b77354cc0ae8f101262fe9b97d17b17a1cca4e766ebce7c0e15f89f2dd3eca4a87951df9bd24db7807706e141a72c4a447fa81b9a18987b29b7856352aedc*1*254*2*3*8*0000000000000000*0*562609e55571bac3 diff --git a/tools/gpg_tests/refdata/m17040/ref2-cast5.txt b/tools/gpg_tests/refdata/m17040/ref2-cast5.txt new file mode 100644 index 000000000..98f9b1685 --- /dev/null +++ b/tools/gpg_tests/refdata/m17040/ref2-cast5.txt @@ -0,0 +1 @@ +Test123! diff --git a/tools/install_modules.sh b/tools/install_modules.sh index 943a22081..5167a9f31 100755 --- a/tools/install_modules.sh +++ b/tools/install_modules.sh @@ -22,6 +22,7 @@ cpan install Authen::Passphrase::LANManager \ Crypt::CBC \ Crypt::DES \ Crypt::DES_EDE3 \ + Crypt::Digest::BLAKE2s_256 \ Crypt::Digest::RIPEMD160 \ Crypt::Digest::Whirlpool \ Crypt::ECB \ diff --git a/tools/kremlin2hashcat.py b/tools/kremlin2hashcat.py new file mode 100755 index 000000000..55b4651e5 --- /dev/null +++ b/tools/kremlin2hashcat.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 + +""" +kremlin2hashcat.py for Kremlin Encrypt 3.0 (using NewDES) +Author......: hansvh +License.....: MIT + +Note: +Kremlin stores non-ascii characters as one byte hex (e.g. iso-8859-15), not variable length. + +Crack the password blåbærsyltetøy as follows: +1. hashcat '$kgb$2ed936a4394bbc30$11c44ae3d4d39114cc47a6efb5d6bb89cf2be943' -a3 bl?bb?brsyltet?by # ?b includes non printable characters +2. hashcat '$kgb$2ed936a4394bbc30$11c44ae3d4d39114cc47a6efb5d6bb89cf2be943' -a0 utf-8-wordlist.txt --encoding-to=iso-8859-15 + +The result in both cases is +$kgb$2ed936a4394bbc30$11c44ae3d4d39114cc47a6efb5d6bb89cf2be943:$HEX[626ce562e67273796c746574f879] +""" + +from sys import argv, stderr +from os import path + + +def read_file_contents(filename): + """Return salt and expected/correct SHA1 hash from file""" + + with open(filename, "rb") as file_handle: + magic = file_handle.read(128) + if magic != bytes.fromhex("0e0401010101011027010157494e2000000001004b524d" + 210 * "0"): + stderr.write(f"Unexpected magic bytes in {filename}. Skipping!\n") + return None, None + salt = file_handle.read(8) + correct_sha1 = file_handle.read(20) + + return (salt.hex(), correct_sha1.hex()) + + +def usage(): + """Print correct program usage and exit""" + exit(f'Usage: {argv[0]} ... ') + + +def main(): + """Entry point""" + if len(argv) < 2: + usage() + + for filename in argv[1:]: + if path.isfile(filename): + salt, correct_hash = read_file_contents(filename) + if salt and correct_hash: + print(f"$kgb${salt}${correct_hash}") + + +if __name__ == "__main__": + main() diff --git a/tools/metamask2hashcat.py b/tools/metamask2hashcat.py index fe2f0e006..a2aa99774 100755 --- a/tools/metamask2hashcat.py +++ b/tools/metamask2hashcat.py @@ -2,8 +2,8 @@ # -*- coding: utf-8 -*- # Author: Gabriele 'matrix' Gristina -# Version: 2.0 -# Date: Thu 12 Aug 2021 06:44:14 PM CEST +# Version: 2.1 +# Date: Thu 28 Aug 2023 05:12:40 PM CEST # License: MIT # Extract metamask vault from browser and save to file, then you can use this tool @@ -66,10 +66,10 @@ def metamask_parser(file, shortdata): else: - # extract only first 16 bytes of ciphertext + # extract first 32 bytes of ciphertext for enhanced resistance to false-positives cipher_bin = base64.b64decode(j['cipher']) - j['cipher'] = base64.b64encode(cipher_bin[:16]).decode("ascii") + j['cipher'] = base64.b64encode(cipher_bin[:32]).decode("ascii") print('$metamaskMobile$' + j['salt'] + '$' + j['iv'] + '$' + j['cipher']) diff --git a/tools/test.sh b/tools/test.sh index d8b78efac..c1cdf382d 100755 --- a/tools/test.sh +++ b/tools/test.sh @@ -218,7 +218,7 @@ function init() echo "They will be fetched from ${luks_tests_url}" echo "Note: this needs to be done only once and could take a little bit to download/extract." echo "These luks test files are not shipped directly with hashcat because the file sizes are" - echo "particularily large and therefore a bandwidth burner for users who do not run these tests." + echo "particularly large and therefore a bandwidth burner for users who do not run these tests." echo "" # download: diff --git a/tools/test_modules/README.md b/tools/test_modules/README.md index 2593e8ccf..c743bec32 100644 --- a/tools/test_modules/README.md +++ b/tools/test_modules/README.md @@ -13,12 +13,12 @@ During `verify` tests the `module_verify_hash` function must parse the hash:pass **Important**: You have to call `pack_if_HEX_notation` as soon as you have parsed the password, or your tests will fail on passwords in the `$HEX[...]` format. -If the algorithm has ambiguous hashes (e.g. partial case-insensetivity), the test module can provide an optional function `module_preprocess_hashlist`. It recieves a reference to the hashlist array and can unify the hashes in a way that guarantees the match with the output of `module_verify_hash`. +If the algorithm has ambiguous hashes (e.g. partial case-insensitivity), the test module can provide an optional function `module_preprocess_hashlist`. It receives a reference to the hashlist array and can unify the hashes in a way that guarantees the match with the output of `module_verify_hash`. #### Examples #### * For the most basic test modules, see [m00000.pm](m00000.pm) and [m00100.pm](m00100.pm) * For the basic salted hash tests, see [m00110.pm](m00110.pm) and [m00120.pm](m00120.pm) -* For some sligthly more complex modules with PBKDF2 and encryption, see [m18400.pm](m18400.pm) and [m18600.pm](m18600.pm) +* For some slightly more complex modules with PBKDF2 and encryption, see [m18400.pm](m18400.pm) and [m18600.pm](m18600.pm) * For a test module with hashlist preprocessing and a custom salt generation algorithm, see [m05600.pm](m05600.pm) diff --git a/tools/test_modules/m00070.pm b/tools/test_modules/m00070.pm index 9cb545327..7edcbe1ee 100644 --- a/tools/test_modules/m00070.pm +++ b/tools/test_modules/m00070.pm @@ -11,7 +11,7 @@ use warnings; use Digest::MD5 qw (md5_hex); use Encode; -sub module_constraints { [[0, 256], [0, 256], [0, 27], [0, 27], [0, 27]] } +sub module_constraints { [[0, 256], [-1, -1], [0, 27], [-1, -1], [-1, -1]] } sub module_generate_hash { diff --git a/tools/test_modules/m00170.pm b/tools/test_modules/m00170.pm index da8fb866f..45b6eaa10 100644 --- a/tools/test_modules/m00170.pm +++ b/tools/test_modules/m00170.pm @@ -11,7 +11,7 @@ use warnings; use Digest::SHA1 qw (sha1_hex); use Encode; -sub module_constraints { [[0, 256], [0, 256], [0, 27], [0, 27], [0, 27]] } +sub module_constraints { [[0, 256], [-1, -1], [0, 27], [-1, -1], [-1, -1]] } sub module_generate_hash { diff --git a/tools/test_modules/m01470.pm b/tools/test_modules/m01470.pm index 4d7c6182c..1e1469309 100644 --- a/tools/test_modules/m01470.pm +++ b/tools/test_modules/m01470.pm @@ -11,7 +11,7 @@ use warnings; use Digest::SHA qw (sha256_hex); use Encode; -sub module_constraints { [[0, 256], [0, 256], [0, 27], [0, 27], [0, 27]] } +sub module_constraints { [[0, 256], [-1, -1], [0, 27], [-1, -1], [-1, -1]] } sub module_generate_hash { diff --git a/tools/test_modules/m01770.pm b/tools/test_modules/m01770.pm index b50644b97..6b9c63de7 100644 --- a/tools/test_modules/m01770.pm +++ b/tools/test_modules/m01770.pm @@ -11,7 +11,7 @@ use warnings; use Digest::SHA qw (sha512_hex); use Encode; -sub module_constraints { [[0, 256], [0, 256], [0, 27], [0, 27], [0, 27]] } +sub module_constraints { [[0, 256], [-1, -1], [0, 27], [-1, -1], [-1, -1]] } sub module_generate_hash { diff --git a/tools/test_modules/m02400.pm b/tools/test_modules/m02400.pm index 46cba1aee..c1d2c0e2c 100644 --- a/tools/test_modules/m02400.pm +++ b/tools/test_modules/m02400.pm @@ -11,7 +11,7 @@ use warnings; use Digest::MD5 qw (md5); use POSIX qw (ceil); -sub module_constraints { [[-1, -1], [-1, -1], [1, 55], [-1, -1], [-1, -1]] } +sub module_constraints { [[-1, -1], [-1, -1], [1, 31], [-1, -1], [-1, -1]] } sub pseudo_base64 { diff --git a/tools/test_modules/m02410.pm b/tools/test_modules/m02410.pm index a8808013c..4bc57c821 100644 --- a/tools/test_modules/m02410.pm +++ b/tools/test_modules/m02410.pm @@ -11,7 +11,7 @@ use warnings; use Digest::MD5 qw (md5); use POSIX qw (ceil); -sub module_constraints { [[-1, -1], [-1, -1], [0, 55], [1, 4], [-1, -1]] } +sub module_constraints { [[-1, -1], [-1, -1], [0, 47], [1, 4], [0, 48]] } sub pseudo_base64 { diff --git a/tools/test_modules/m02630.pm b/tools/test_modules/m02630.pm new file mode 100644 index 000000000..d54c5598f --- /dev/null +++ b/tools/test_modules/m02630.pm @@ -0,0 +1,44 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Digest::MD5 qw (md5_hex); + +sub module_constraints { [[0, 256], [0, 256], [0, 55], [0, 55], [0, 55]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + + my $digest = md5_hex (md5_hex ($word . $salt)); + + my $hash = sprintf ("%s:%s", $digest, $salt); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my ($hash, $salt, $word) = split (':', $line); + + return unless defined $hash; + return unless defined $salt; + return unless defined $word; + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $salt); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m03730.pm b/tools/test_modules/m03730.pm index e50da02c8..9163abe55 100644 --- a/tools/test_modules/m03730.pm +++ b/tools/test_modules/m03730.pm @@ -29,17 +29,18 @@ sub module_verify_hash { my $line = shift; - my ($hash, $salt, $word) = split (':', $line); + my ($hash, $salt1, $salt2, $word) = split (':', $line); return unless defined $hash; - return unless defined $salt; + return unless defined $salt1; + return unless defined $salt2; return unless defined $word; my $word_packed = pack_if_HEX_notation ($word); - my $new_hash = module_generate_hash ($word_packed, $salt); + my $new_hash = module_generate_hash ($word_packed, $salt1, $salt2); return ($new_hash, $word); } -1; \ No newline at end of file +1; diff --git a/tools/test_modules/m04420.pm b/tools/test_modules/m04420.pm new file mode 100644 index 000000000..97e509c09 --- /dev/null +++ b/tools/test_modules/m04420.pm @@ -0,0 +1,45 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Digest::MD5 qw (md5_hex); +use Digest::SHA qw (sha1_hex); + +sub module_constraints { [[0, 256], [0, 256], [0, 55], [0, 55], [0, 55]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + + my $digest = md5_hex (sha1_hex ($word . $salt)); + + my $hash = sprintf ("%s:%s", $digest, $salt); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my ($hash, $salt, $word) = split (':', $line); + + return unless defined $hash; + return unless defined $salt; + return unless defined $word; + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $salt); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m04430.pm b/tools/test_modules/m04430.pm new file mode 100644 index 000000000..e41afa0ae --- /dev/null +++ b/tools/test_modules/m04430.pm @@ -0,0 +1,45 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Digest::MD5 qw (md5_hex); +use Digest::SHA qw (sha1_hex); + +sub module_constraints { [[0, 256], [0, 256], [0, 55], [0, 55], [0, 55]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + + my $digest = md5_hex (sha1_hex ($salt . $word)); + + my $hash = sprintf ("%s:%s", $digest, $salt); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my ($hash, $salt, $word) = split (':', $line); + + return unless defined $hash; + return unless defined $salt; + return unless defined $word; + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $salt); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m06800.pm b/tools/test_modules/m06800.pm index 51d9d0430..2a37d119f 100644 --- a/tools/test_modules/m06800.pm +++ b/tools/test_modules/m06800.pm @@ -19,8 +19,7 @@ sub module_generate_hash my $word = shift; my $salt = shift; my $iter = shift // 100100; - - my $iv = random_bytes(16); + my $iv = shift // random_bytes (16); my $hasher = Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 256); @@ -56,16 +55,21 @@ sub module_verify_hash { my $line = shift; - my ($hash, $iter, $salt, $word) = split ":", $line; + my ($hash, $iter, $salt, $iv, $word) = split ":", $line; return unless defined $hash; return unless defined $iter; return unless defined $salt; return unless defined $word; + return unless defined $iv; + + return unless ($iv =~ m/^[0-9a-fA-F]{32}$/); + + $iv = pack ("H*", $iv); $word = pack_if_HEX_notation ($word); - my $new_hash = module_generate_hash ($word, $salt, $iter); + my $new_hash = module_generate_hash ($word, $salt, $iter, $iv); return ($new_hash, $word); } diff --git a/tools/test_modules/m08300.pm b/tools/test_modules/m08300.pm index 35caab10d..879949fde 100644 --- a/tools/test_modules/m08300.pm +++ b/tools/test_modules/m08300.pm @@ -11,7 +11,7 @@ use warnings; use Net::DNS::RR::NSEC3; use Net::DNS::SEC; -# we need to restict the pure password length for the test module to 63 bytes, +# we need to restrict the pure password length for the test module to 63 bytes, # because we can't have any string (including the pass) of over 63 bytes without "." # sub module_constraints { [[1, 256], [-1, -1], [1, 55], [-1, -1], [-1, -1]] } diff --git a/tools/test_modules/m10870.pm b/tools/test_modules/m10870.pm index 9aaf01efe..53c074c5b 100644 --- a/tools/test_modules/m10870.pm +++ b/tools/test_modules/m10870.pm @@ -11,7 +11,7 @@ use warnings; use Digest::SHA qw (sha384_hex); use Encode; -sub module_constraints { [[0, 256], [0, 256], [0, 27], [0, 27], [0, 27]] } +sub module_constraints { [[0, 256], [-1, -1], [0, 27], [-1, -1], [-1, -1]] } sub module_generate_hash { diff --git a/tools/test_modules/m11700.pm b/tools/test_modules/m11700.pm index 8a0c250f6..0b3b19e3e 100644 --- a/tools/test_modules/m11700.pm +++ b/tools/test_modules/m11700.pm @@ -8,7 +8,7 @@ use strict; use warnings; -sub module_constraints { [[0, 256], [0, 256], [0, 55], [0, 55], [-1, -1]] } +sub module_constraints { [[0, 256], [-1, -1], [0, 55], [-1, -1], [-1, -1]] } sub module_generate_hash { diff --git a/tools/test_modules/m11900.pm b/tools/test_modules/m11900.pm index f75c70486..4464c434e 100644 --- a/tools/test_modules/m11900.pm +++ b/tools/test_modules/m11900.pm @@ -29,7 +29,7 @@ sub module_generate_hash my $word_buf_base64 = encode_base64 ($word, ""); my $salt_buf_base64 = encode_base64 ($salt, ""); - # sanitize lenghs + # sanitize lengths $out_len = int ($out_len); diff --git a/tools/test_modules/m13400.pm b/tools/test_modules/m13400.pm index f4a641df5..a960eeb2e 100644 --- a/tools/test_modules/m13400.pm +++ b/tools/test_modules/m13400.pm @@ -239,14 +239,32 @@ sub module_generate_hash $final_algorithm = "Crypt::Rijndael"; } - my $cipher = Crypt::CBC->new ({ + my $cipher; + + if ($version == 1) + { + $cipher = Crypt::CBC->new ({ key => $final_key, cipher => $final_algorithm, iv => $enc_iv, literal_key => 1, header => "none", + padding => "standard", keysize => 32 }); + } + else + { + $cipher = Crypt::CBC->new ({ + key => $final_key, + cipher => $final_algorithm, + iv => $enc_iv, + literal_key => 1, + header => "none", + padding => "none", + keysize => 32 + }); + } my $hash; diff --git a/tools/test_modules/m20712.pm b/tools/test_modules/m20712.pm new file mode 100644 index 000000000..7cea4821f --- /dev/null +++ b/tools/test_modules/m20712.pm @@ -0,0 +1,52 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Digest::SHA qw (sha256_hex); +use MIME::Base64 qw (decode_base64 encode_base64); + +sub module_constraints { [[0, 256], [0, 256], [0, 55], [0, 51], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + + #$word = "hashcat"; + #$salt = decode_base64 ("c2FsdHNhbHQ="); + + my $salt_b64 = encode_base64 ($salt, ""); + + my $digest = uc (sha256_hex ( uc (sha256_hex ($word)) . $salt)); + + my $hash = sprintf ("%s:%s", $digest, $salt_b64); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my ($digest, $salt, $word) = split (':', $line); + + return unless defined $digest; + return unless defined $salt; + return unless defined $word; + + my $salt_b64 = decode_base64 ($salt); + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $salt_b64); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m21310.pm b/tools/test_modules/m21310.pm new file mode 100644 index 000000000..9a20f8ae3 --- /dev/null +++ b/tools/test_modules/m21310.pm @@ -0,0 +1,47 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Digest::MD5 qw (md5_hex); +use Digest::SHA qw (sha1_hex); + +sub module_constraints { [[0, 256], [0, 256], [0, 55], [0, 55], [0, 55]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt1 = shift; + my $salt2 = shift // random_hex_string(32); + + my $digest = md5_hex ($salt1 . sha1_hex ($salt2 . $word)); + + my $hash = sprintf ("%s:%s:%s", $digest, $salt1, $salt2); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my ($hash, $salt1, $salt2, $word) = split (':', $line); + + return unless defined $hash; + return unless defined $salt1; + return unless defined $salt2; + return unless defined $word; + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $salt1, $salt2); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m21400.pm b/tools/test_modules/m21400.pm index 7446133b3..daaa02108 100644 --- a/tools/test_modules/m21400.pm +++ b/tools/test_modules/m21400.pm @@ -1,3 +1,5 @@ +#!/usr/bin/env perl + ## ## Author......: See docs/credits.txt ## License.....: MIT diff --git a/tools/test_modules/m22911.pm b/tools/test_modules/m22911.pm index fd4b0b18c..d8c53693f 100644 --- a/tools/test_modules/m22911.pm +++ b/tools/test_modules/m22911.pm @@ -59,7 +59,7 @@ sub module_generate_hash my $dec_bin = $aes->decrypt ($data_bin); - ## This is a ridiculous check of successfull decryption + ## This is a ridiculous check of successful decryption ## There are no useable asn1 parsers for perl available ## We have to rely on a combination of padding check and pattern matching ## The (minimum) 16 bit should be good enough for a unit test diff --git a/tools/test_modules/m22921.pm b/tools/test_modules/m22921.pm index 63e9d4aad..4839da1f6 100644 --- a/tools/test_modules/m22921.pm +++ b/tools/test_modules/m22921.pm @@ -56,7 +56,7 @@ sub module_generate_hash my $dec_bin = $aes->decrypt ($data_bin); - ## This is a ridiculous check of successfull decryption + ## This is a ridiculous check of successful decryption ## There are no useable asn1 parsers for perl available ## We have to rely on a combination of padding check and pattern matching ## The (minimum) 16 bit should be good enough for a unit test diff --git a/tools/test_modules/m22931.pm b/tools/test_modules/m22931.pm index 9e508b29e..138f56e66 100644 --- a/tools/test_modules/m22931.pm +++ b/tools/test_modules/m22931.pm @@ -56,7 +56,7 @@ sub module_generate_hash my $dec_bin = $aes->decrypt ($data_bin); - ## This is a ridiculous check of successfull decryption + ## This is a ridiculous check of successful decryption ## There are no useable asn1 parsers for perl available ## We have to rely on a combination of padding check and pattern matching ## The (minimum) 16 bit should be good enough for a unit test diff --git a/tools/test_modules/m22941.pm b/tools/test_modules/m22941.pm index f4f6e0f91..d4fb2b554 100644 --- a/tools/test_modules/m22941.pm +++ b/tools/test_modules/m22941.pm @@ -58,7 +58,7 @@ sub module_generate_hash my $dec_bin = $aes->decrypt ($data_bin); - ## This is a ridiculous check of successfull decryption + ## This is a ridiculous check of successful decryption ## There are no useable asn1 parsers for perl available ## We have to rely on a combination of padding check and pattern matching ## The (minimum) 16 bit should be good enough for a unit test diff --git a/tools/test_modules/m22951.pm b/tools/test_modules/m22951.pm index ad90582b0..c9c794be8 100644 --- a/tools/test_modules/m22951.pm +++ b/tools/test_modules/m22951.pm @@ -58,7 +58,7 @@ sub module_generate_hash my $dec_bin = $aes->decrypt ($data_bin); - ## This is a ridiculous check of successfull decryption + ## This is a ridiculous check of successful decryption ## There are no useable asn1 parsers for perl available ## We have to rely on a combination of padding check and pattern matching ## The (minimum) 16 bit should be good enough for a unit test diff --git a/tools/test_modules/m24410.pm b/tools/test_modules/m24410.pm index 313810a28..f5beb8c59 100644 --- a/tools/test_modules/m24410.pm +++ b/tools/test_modules/m24410.pm @@ -80,7 +80,7 @@ sub module_generate_hash $dec_bin = $aes->decrypt ($data_bin); } - ## This is a ridiculous check of successfull decryption + ## This is a ridiculous check of successful decryption ## There are no useable asn1 parsers for perl available ## We have to rely on a combination of padding check and pattern matching ## The (minimum) 16 bit should be good enough for a unit test diff --git a/tools/test_modules/m24420.pm b/tools/test_modules/m24420.pm index adf084642..6467421f3 100644 --- a/tools/test_modules/m24420.pm +++ b/tools/test_modules/m24420.pm @@ -80,7 +80,7 @@ sub module_generate_hash $dec_bin = $aes->decrypt ($data_bin); } - ## This is a ridiculous check of successfull decryption + ## This is a ridiculous check of successful decryption ## There are no useable asn1 parsers for perl available ## We have to rely on a combination of padding check and pattern matching ## The (minimum) 16 bit should be good enough for a unit test diff --git a/tools/test_modules/m24800.pm b/tools/test_modules/m24800.pm index 00de6fced..e00bf9b83 100644 --- a/tools/test_modules/m24800.pm +++ b/tools/test_modules/m24800.pm @@ -13,7 +13,7 @@ use Digest::HMAC qw (hmac); use Encode qw (encode); use MIME::Base64 qw (encode_base64); -sub module_constraints { [[0, 256], [0, 256], [0, 27], [0, 27], [0, 27]] } +sub module_constraints { [[0, 256], [-1, -1], [0, 27], [-1, -1], [-1, -1]] } sub module_generate_hash { diff --git a/tools/test_modules/m25400.pm b/tools/test_modules/m25400.pm index 7dce337bb..d6f0bb4bf 100644 --- a/tools/test_modules/m25400.pm +++ b/tools/test_modules/m25400.pm @@ -99,7 +99,7 @@ sub pdf_compute_encryption_key_owner my $o_key; if ($R == 2) { - $o_key = substr ($o_digest, 0, 8); # rc4 key is always 5 for revision 2, but for 3 or greather is dependent on the value of the encryption dictionaries length entry + $o_key = substr ($o_digest, 0, 8); # rc4 key is always 5 for revision 2, but for 3 or greater is dependent on the value of the encryption dictionaries length entry } else { diff --git a/tools/test_modules/m25700.pm b/tools/test_modules/m25700.pm index aaea6c1c8..3197a722b 100644 --- a/tools/test_modules/m25700.pm +++ b/tools/test_modules/m25700.pm @@ -115,7 +115,7 @@ sub module_generate_hash my $salt_bin = pack ("H*", $salt); - my $seed = unpack ("N", $salt_bin); # or maybe "L" ? not enought example data to clarify + my $seed = unpack ("N", $salt_bin); # or maybe "L" ? not enough example data to clarify my $digest = MurmurHash ($word, $seed); diff --git a/tools/test_modules/m26610.pm b/tools/test_modules/m26610.pm index 71f2d05b0..f49e75ffa 100644 --- a/tools/test_modules/m26610.pm +++ b/tools/test_modules/m26610.pm @@ -36,8 +36,29 @@ sub module_generate_hash my $iv_bin = pack ("H*", $iv); + my $pt = ""; - my $pt = "[{\"type\":\"HD Key Tree\",\"data\":{\"mnemonic\":[112,97,121,109,101,110,116,32,117,112,115,101,116,32,109,101,116,97,108,32,99,104,97,112,116,101,114,32,114,117,110,32,97,100,109,105,116,32,109,101,97,115,117,114,101,32,114,101,109,105,110,100,32,115,117,112,112,108,121,32,104,111,112,101,32,101,110,101,109,121,32,104,101,100,103,101,104,111,103],\"numberOfAccounts\":1,\"hdPath\":\"m/44'/60'/0'/0\"}}]"; + if (! defined ($ct)) + { + $pt = "[{\"type\":\"HD Key Tree\",\"data\":{\"mnemonic\":[112,97,121,109,101,110,116,32,117,112,115,101,116,32,109,101,116,97,108,32,99,104,97,112,116,101,114,32,114,117,110,32,97,100,109,105,116,32,109,101,97,115,117,114,101,32,114,101,109,105,110,100,32,115,117,112,112,108,121,32,104,111,112,101,32,101,110,101,109,121,32,104,101,100,103,101,104,111,103],\"numberOfAccounts\":1,\"hdPath\":\"m/44'/60'/0'/0\"}}]"; + } + else # verify / decrypt + { + my $ct_bin = pack ("H*", $ct); + + my $aes = Crypt::AuthEnc::GCM->new ("AES", $key, $iv_bin); + + $pt = $aes->decrypt_add ($ct_bin); + + if ($pt =~ m/^[ -~]*$/) # is_valid_printable_32 () + { + # ok + } + else + { + $pt = ""; # fake + } + } $pt = substr ($pt, 0, $ct_len); diff --git a/tools/test_modules/m28100.pm b/tools/test_modules/m28100.pm index 2f5398535..2df4aa5e1 100644 --- a/tools/test_modules/m28100.pm +++ b/tools/test_modules/m28100.pm @@ -58,7 +58,7 @@ sub module_generate_hash ## convert_userpin_to_secretpin() ## this looks strange. what if the user password is outside 0x20 - 0x7f? - ## from some testing, it seems MS prevents the user to use any non-ascii charcters + ## from some testing, it seems MS prevents the user to use any non-ascii characters my $stage1_hexpin = uc (encode ("UTF-16LE", unpack ("H*", $word))); diff --git a/tools/test_modules/m28501.pm b/tools/test_modules/m28501.pm index 1892346a2..afd386fc9 100644 --- a/tools/test_modules/m28501.pm +++ b/tools/test_modules/m28501.pm @@ -26,7 +26,7 @@ sub module_constraints { [[52, 52], [-1, -1], [-1, -1], [-1, -1], [-1, -1]] } sub module_generate_hash { - my $word = shift; # expecting valid WIF formated private key + my $word = shift; # expecting valid WIF formatted private key my @is_valid_base58 = eval { diff --git a/tools/test_modules/m28502.pm b/tools/test_modules/m28502.pm index 430b968f7..fa0605023 100644 --- a/tools/test_modules/m28502.pm +++ b/tools/test_modules/m28502.pm @@ -26,7 +26,7 @@ sub module_constraints { [[51, 51], [-1, -1], [-1, -1], [-1, -1], [-1, -1]] } sub module_generate_hash { - my $word = shift; # expecting valid WIF formated private key + my $word = shift; # expecting valid WIF formatted private key my @is_valid_base58 = eval { diff --git a/tools/test_modules/m28503.pm b/tools/test_modules/m28503.pm index aa87d4255..b5438a5ac 100644 --- a/tools/test_modules/m28503.pm +++ b/tools/test_modules/m28503.pm @@ -26,7 +26,7 @@ sub module_constraints { [[52, 52], [-1, -1], [-1, -1], [-1, -1], [-1, -1]] } sub module_generate_hash { - my $word = shift; # expecting valid WIF formated private key + my $word = shift; # expecting valid WIF formatted private key my @is_valid_base58 = eval { diff --git a/tools/test_modules/m28504.pm b/tools/test_modules/m28504.pm index 05ebe9795..e48ccccdf 100644 --- a/tools/test_modules/m28504.pm +++ b/tools/test_modules/m28504.pm @@ -26,7 +26,7 @@ sub module_constraints { [[51, 51], [-1, -1], [-1, -1], [-1, -1], [-1, -1]] } sub module_generate_hash { - my $word = shift; # expecting valid WIF formated private key + my $word = shift; # expecting valid WIF formatted private key my @is_valid_base58 = eval { diff --git a/tools/test_modules/m28505.pm b/tools/test_modules/m28505.pm index 945dc0468..99600ef66 100644 --- a/tools/test_modules/m28505.pm +++ b/tools/test_modules/m28505.pm @@ -26,7 +26,7 @@ sub module_constraints { [[52, 52], [-1, -1], [-1, -1], [-1, -1], [-1, -1]] } sub module_generate_hash { - my $word = shift; # expecting valid WIF formated private key + my $word = shift; # expecting valid WIF formatted private key my @is_valid_base58 = eval { diff --git a/tools/test_modules/m28506.pm b/tools/test_modules/m28506.pm index a1e15e44d..962c3d219 100644 --- a/tools/test_modules/m28506.pm +++ b/tools/test_modules/m28506.pm @@ -26,7 +26,7 @@ sub module_constraints { [[51, 51], [-1, -1], [-1, -1], [-1, -1], [-1, -1]] } sub module_generate_hash { - my $word = shift; # expecting valid WIF formated private key + my $word = shift; # expecting valid WIF formatted private key my @is_valid_base58 = eval { diff --git a/tools/test_modules/m29700.pm b/tools/test_modules/m29700.pm index 8b9c2a47a..a582c4948 100644 --- a/tools/test_modules/m29700.pm +++ b/tools/test_modules/m29700.pm @@ -243,14 +243,32 @@ sub module_generate_hash $final_algorithm = "Crypt::Rijndael"; } - my $cipher = Crypt::CBC->new ({ + my $cipher; + + if ($version == 1) + { + $cipher = Crypt::CBC->new ({ key => $final_key, cipher => $final_algorithm, iv => $enc_iv, literal_key => 1, header => "none", + padding => "standard", keysize => 32 }); + } + else + { + $cipher = Crypt::CBC->new ({ + key => $final_key, + cipher => $final_algorithm, + iv => $enc_iv, + literal_key => 1, + header => "none", + padding => "none", + keysize => 32 + }); + } my $hash; diff --git a/tools/test_modules/m30700.pm b/tools/test_modules/m30700.pm index 3a0e33b66..cc4e0fb8e 100644 --- a/tools/test_modules/m30700.pm +++ b/tools/test_modules/m30700.pm @@ -52,12 +52,15 @@ sub module_verify_hash { my $line = shift; - my ($hash, $salt, $word) = split (':', $line); + my ($signature, $digest, $salt, $word) = split (':', $line); - return unless defined $hash; + return unless defined $signature; + return unless defined $digest; return unless defined $salt; return unless defined $word; + return unless ($signature eq "sha256"); + my $word_packed = pack_if_HEX_notation ($word); my $new_hash = module_generate_hash ($word_packed, $salt); diff --git a/tools/test_modules/m31900.pm b/tools/test_modules/m31900.pm index c3dbf5c91..6c09ab67b 100644 --- a/tools/test_modules/m31900.pm +++ b/tools/test_modules/m31900.pm @@ -44,9 +44,27 @@ sub module_generate_hash padding => "none" }); - my $pt = "[{\"type\":\"HD Key Tree\",\"data\":{\"mnemonic\":\"ocean hidden kidney famous rich season gloom husband spring convince attitude boy\",\"numberOfAccounts\":1,\"hdPath\":\"m/44'/60'/0'/0\"}}]"; + my $pt = ""; - my $ct1 = substr ($cipher->encrypt ($pt), 0, 16); + if (! defined ($ct)) + { + $pt = "[{\"type\":\"HD Key Tree\",\"data\":{\"mnemonic\":\"ocean hidden kidney famous rich season gloom husband spring convince attitude boy\",\"numberOfAccounts\":1,\"hdPath\":\"m/44'/60'/0'/0\"}}]"; + } + else + { + $pt = $cipher->decrypt (pack ("H*", $ct)); + + if ($pt =~ m/^[ -~]*$/) # is_valid_printable_32 () + { + # ok + } + else + { + $pt = ""; # fake + } + } + + my $ct1 = substr ($cipher->encrypt ($pt), 0, 32); my $hash = sprintf ('$metamaskMobile$%s$%s$%s', $salt_b64, $iv, encode_base64 ($ct1, "")); @@ -79,7 +97,7 @@ sub module_verify_hash return unless length $salt_b64 == 16; return unless length $iv_bin == 16; - return unless length $ct_bin == 16; + return unless length $ct_bin == 32; my $word_packed = pack_if_HEX_notation ($word); diff --git a/tools/test_modules/m32000.pm b/tools/test_modules/m32000.pm new file mode 100644 index 000000000..44f016466 --- /dev/null +++ b/tools/test_modules/m32000.pm @@ -0,0 +1,71 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Digest::MD5; + +sub module_constraints { [[0, 256], [-1, -1], [-1, -1], [-1, -1], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + + my $md5 = Digest::MD5->new; + + $md5->add ($word); + + for (my $i = 1; $i < 100000; $i++) + { + my $tmp = $md5->digest; + + $md5->reset; + + $md5->add ($tmp); + } + + my $digest = $md5->digest; + + my $hash = sprintf ('$sspr$0$100000$NONE$%s', unpack ("H*", $digest)); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my $idx = index ($line, ':'); + + return unless $idx >= 0; + + my $hash = substr ($line, 0, $idx); + my $word = substr ($line, $idx + 1); + + return unless substr ($hash, 0, 20) eq '$sspr$0$100000$NONE$'; + + my (undef, $signature, $version, $iter, $salt) = split '\$', $hash; + + return unless defined $signature; + return unless defined $version; + return unless defined $iter; + return unless defined $salt; + + return unless $version == 0; + return unless $iter == 100000; + return unless $salt eq "NONE"; + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $salt); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m32010.pm b/tools/test_modules/m32010.pm new file mode 100644 index 000000000..5c472658c --- /dev/null +++ b/tools/test_modules/m32010.pm @@ -0,0 +1,71 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Digest::SHA1; + +sub module_constraints { [[0, 256], [-1, -1], [-1, -1], [-1, -1], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + + my $sha1 = Digest::SHA1->new; + + $sha1->add ($word); + + for (my $i = 1; $i < 100000; $i++) + { + my $tmp = $sha1->digest; + + $sha1->reset; + + $sha1->add ($tmp); + } + + my $digest = $sha1->digest; + + my $hash = sprintf ('$sspr$1$100000$NONE$%s', unpack ("H*", $digest)); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my $idx = index ($line, ':'); + + return unless $idx >= 0; + + my $hash = substr ($line, 0, $idx); + my $word = substr ($line, $idx + 1); + + return unless substr ($hash, 0, 20) eq '$sspr$1$100000$NONE$'; + + my (undef, $signature, $version, $iter, $salt) = split '\$', $hash; + + return unless defined $signature; + return unless defined $version; + return unless defined $iter; + return unless defined $salt; + + return unless $version == 1; + return unless $iter == 100000; + return unless $salt eq "NONE"; + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $salt); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m32020.pm b/tools/test_modules/m32020.pm new file mode 100644 index 000000000..eac5a5ec1 --- /dev/null +++ b/tools/test_modules/m32020.pm @@ -0,0 +1,78 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Digest::SHA1; +use MIME::Base64 qw (decode_base64 encode_base64); + +sub module_constraints { [[0, 256], [24, 24], [-1, -1], [-1, -1], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + + my $salt_b64 = encode_base64 ($salt, ""); + + my $sha1 = Digest::SHA1->new; + + $sha1->add ($salt_b64 . $word); + + for (my $i = 1; $i < 100000; $i++) + { + my $tmp = $sha1->digest; + + $sha1->reset; + + $sha1->add ($tmp); + } + + my $digest = $sha1->digest; + + my $hash = sprintf ('$sspr$2$100000$%s$%s', $salt_b64, unpack ("H*", $digest)); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my $idx = index ($line, ':'); + + return unless $idx >= 0; + + my $hash = substr ($line, 0, $idx); + my $word = substr ($line, $idx + 1); + + return unless substr ($hash, 0, 15) eq '$sspr$2$100000$'; + + my (undef, $signature, $version, $iter, $salt) = split '\$', $hash; + + return unless defined $signature; + return unless defined $version; + return unless defined $iter; + return unless defined $salt; + + return unless $version == 2; + return unless $iter == 100000; + return unless length $salt == 32; + + my $salt_b64 = decode_base64 ($salt); + + return unless length $salt_b64 == 24; + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $salt_b64); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m32030.pm b/tools/test_modules/m32030.pm new file mode 100644 index 000000000..e077f4eca --- /dev/null +++ b/tools/test_modules/m32030.pm @@ -0,0 +1,78 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Digest::SHA; +use MIME::Base64 qw (decode_base64 encode_base64); + +sub module_constraints { [[0, 256], [24, 24], [-1, -1], [-1, -1], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + + my $salt_b64 = encode_base64 ($salt, ""); + + my $sha256 = Digest::SHA->new(256); + + $sha256->add ($salt_b64 . $word); + + for (my $i = 1; $i < 100000; $i++) + { + my $tmp = $sha256->digest; + + $sha256->reset; + + $sha256->add ($tmp); + } + + my $digest = $sha256->digest; + + my $hash = sprintf ('$sspr$3$100000$%s$%s', $salt_b64, unpack ("H*", $digest)); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my $idx = index ($line, ':'); + + return unless $idx >= 0; + + my $hash = substr ($line, 0, $idx); + my $word = substr ($line, $idx + 1); + + return unless substr ($hash, 0, 15) eq '$sspr$3$100000$'; + + my (undef, $signature, $version, $iter, $salt) = split '\$', $hash; + + return unless defined $signature; + return unless defined $version; + return unless defined $iter; + return unless defined $salt; + + return unless $version == 3; + return unless $iter == 100000; + return unless length $salt == 32; + + my $salt_b64 = decode_base64 ($salt); + + return unless length $salt_b64 == 24; + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $salt_b64); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m32031.pm b/tools/test_modules/m32031.pm new file mode 100644 index 000000000..e7f39fc8e --- /dev/null +++ b/tools/test_modules/m32031.pm @@ -0,0 +1,71 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Digest::SHA; + +sub module_constraints { [[0, 256], [16, 16], [-1, -1], [-1, -1], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + + my $sha256 = Digest::SHA->new(256); + + $sha256->add ($salt . $word); + + for (my $i = 1; $i < 1000; $i++) + { + my $tmp = $sha256->digest; + + $sha256->reset; + + $sha256->add ($tmp); + } + + my $digest = $sha256->digest; + + my $hash = sprintf ('$sspr$3$1000$%s$%s', $salt, unpack ("H*", $digest)); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my $idx = index ($line, ':'); + + return unless $idx >= 0; + + my $hash = substr ($line, 0, $idx); + my $word = substr ($line, $idx + 1); + + return unless substr ($hash, 0, 13) eq '$sspr$3$1000$'; + + my (undef, $signature, $version, $iter, $salt) = split '\$', $hash; + + return unless defined $signature; + return unless defined $version; + return unless defined $iter; + return unless defined $salt; + + return unless $version == 3; + return unless $iter == 1000; + return unless length $salt == 16; + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $salt); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m32040.pm b/tools/test_modules/m32040.pm new file mode 100644 index 000000000..5446fa01d --- /dev/null +++ b/tools/test_modules/m32040.pm @@ -0,0 +1,78 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Digest::SHA; +use MIME::Base64 qw (decode_base64 encode_base64); + +sub module_constraints { [[0, 256], [24, 24], [-1, -1], [-1, -1], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + + my $salt_b64 = encode_base64 ($salt, ""); + + my $sha512 = Digest::SHA->new(512); + + $sha512->add ($salt_b64 . $word); + + for (my $i = 1; $i < 100000; $i++) + { + my $tmp = $sha512->digest; + + $sha512->reset; + + $sha512->add ($tmp); + } + + my $digest = $sha512->digest; + + my $hash = sprintf ('$sspr$4$100000$%s$%s', $salt_b64, unpack ("H*", $digest)); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my $idx = index ($line, ':'); + + return unless $idx >= 0; + + my $hash = substr ($line, 0, $idx); + my $word = substr ($line, $idx + 1); + + return unless substr ($hash, 0, 15) eq '$sspr$4$100000$'; + + my (undef, $signature, $version, $iter, $salt) = split '\$', $hash; + + return unless defined $signature; + return unless defined $version; + return unless defined $iter; + return unless defined $salt; + + return unless $version == 4; + return unless $iter == 100000; + return unless length $salt == 32; + + my $salt_b64 = decode_base64 ($salt); + + return unless length $salt_b64 == 24; + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $salt_b64); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m32041.pm b/tools/test_modules/m32041.pm new file mode 100644 index 000000000..380ccabf2 --- /dev/null +++ b/tools/test_modules/m32041.pm @@ -0,0 +1,71 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Digest::SHA; + +sub module_constraints { [[0, 256], [16, 16], [-1, -1], [-1, -1], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + + my $sha512 = Digest::SHA->new(512); + + $sha512->add ($salt . $word); + + for (my $i = 1; $i < 1000; $i++) + { + my $tmp = $sha512->digest; + + $sha512->reset; + + $sha512->add ($tmp); + } + + my $digest = $sha512->digest; + + my $hash = sprintf ('$sspr$4$1000$%s$%s', $salt, unpack ("H*", $digest)); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my $idx = index ($line, ':'); + + return unless $idx >= 0; + + my $hash = substr ($line, 0, $idx); + my $word = substr ($line, $idx + 1); + + return unless substr ($hash, 0, 13) eq '$sspr$4$1000$'; + + my (undef, $signature, $version, $iter, $salt) = split '\$', $hash; + + return unless defined $signature; + return unless defined $version; + return unless defined $iter; + return unless defined $salt; + + return unless $version == 4; + return unless $iter == 1000; + return unless length $salt == 16; + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $salt); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m32050.pm b/tools/test_modules/m32050.pm new file mode 100644 index 000000000..e24e5298b --- /dev/null +++ b/tools/test_modules/m32050.pm @@ -0,0 +1,65 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Crypt::PBKDF2; + +sub module_constraints { [[0, 256], [64, 64], [-1, -1], [-1, -1], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + + $salt = pack ("H*", $salt); + + my $kdf = Crypt::PBKDF2->new + ( + hash_class => 'HMACSHA1', + iterations => 100000, + output_len => 20 + ); + + my $key = $kdf->PBKDF2_hex ($salt, $word); + + my $hash = sprintf ('$pbkdf2-hmac-sha1$100000$%s$%s', unpack ("H*", $salt), $key); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my $idx = index ($line, ':'); + + return unless $idx >= 0; + + my $hash = substr ($line, 0, $idx); + my $word = substr ($line, $idx + 1); + + return unless substr ($hash, 0, 25) eq '$pbkdf2-hmac-sha1$100000$'; + + my (undef, $signature, $iter, $salt) = split '\$', $hash; + + return unless defined $signature; + return unless defined $iter; + return unless defined $salt; + + return unless $iter == 100000; + return unless length $salt == 64; + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $salt); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m32060.pm b/tools/test_modules/m32060.pm new file mode 100644 index 000000000..09f55a781 --- /dev/null +++ b/tools/test_modules/m32060.pm @@ -0,0 +1,80 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Crypt::PBKDF2; +use MIME::Base64 qw (encode_base64 decode_base64); + +sub module_constraints { [[0, 256], [32, 32], [-1, -1], [-1, -1], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + + my $pbkdf2 = Crypt::PBKDF2->new + ( + hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 256), + iterations => 100000, + ); + + my $hash_buf = encode_base64 ($pbkdf2->PBKDF2 ($salt, $word), ""); + + my $salt_buf = encode_base64 ($salt, ""); + + # replace + with . + $hash_buf =~ s/\+/\./g; + $salt_buf =~ s/\+/\./g; + + # remove padding = + $hash_buf =~ s/\=+$//; + $salt_buf =~ s/\=+$//; + + my $hash = sprintf ('$pbkdf2-sha256$100000$%s$%s', $salt_buf, $hash_buf); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my $idx = index ($line, ':'); + + return unless $idx >= 0; + + my $hash = substr ($line, 0, $idx); + my $word = substr ($line, $idx + 1); + + return unless substr ($hash, 0, 22) eq '$pbkdf2-sha256$100000$'; + + my (undef, $signature, $iter, $salt) = split '\$', $hash; + + return unless defined $signature; + return unless defined $iter; + return unless defined $salt; + + return unless $iter == 100000; + return unless length $salt == 43; + + $salt =~ s/\./\+/g; + $salt .= '=='; + + my $salt_b64 = decode_base64 ($salt); + + return unless length $salt_b64 == 32; + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $salt_b64); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m32070.pm b/tools/test_modules/m32070.pm new file mode 100644 index 000000000..83083f295 --- /dev/null +++ b/tools/test_modules/m32070.pm @@ -0,0 +1,68 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Crypt::PBKDF2; + +sub module_constraints { [[0, 256], [64, 64], [-1, -1], [-1, -1], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + + $salt = pack ("H*", $salt); + + my $kdf = Crypt::PBKDF2->new + ( + hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 512), + iterations => 100000, + ); + + my $key = $kdf->PBKDF2_hex ($salt, $word); + + my $hash = sprintf ('$pbkdf2-hmac-sha512$100000.%s.%s', unpack ("H*", $salt), $key); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my $idx = index ($line, ':'); + + return unless $idx >= 0; + + my $hash = substr ($line, 0, $idx); + my $word = substr ($line, $idx + 1); + + return unless substr ($hash, 0, 27) eq '$pbkdf2-hmac-sha512$100000.'; + + my (undef, $signature, $tmp) = split '\$', $hash; + + return unless defined $signature; + return unless defined $tmp; + + my ($iter, $salt) = split '\.', $tmp; + + return unless defined $iter; + return unless defined $salt; + + return unless $iter == 100000; + return unless length $salt == 64; + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $salt); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m32100.pm b/tools/test_modules/m32100.pm new file mode 100644 index 000000000..d647e3349 --- /dev/null +++ b/tools/test_modules/m32100.pm @@ -0,0 +1,217 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Digest::SHA qw (hmac_sha1); +use Crypt::Mode::CBC; +use Crypt::PBKDF2; + +sub byte2hex +{ + my $input = shift; + return unpack ("H*", $input); +} + +sub hex2byte +{ + my $input = shift; + return pack ("H*", $input); +} + +sub pad +{ + my $n = shift; + my $size = shift; + + return (~$n + 1) & ($size - 1); +} + +sub module_constraints { [[0, 256], [16, 16], [-1, -1], [-1, -1], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + my $user = shift // "user"; + my $realm = shift // "example.com"; + my $checksum = shift; + my $edata2 = shift; + + my $mysalt = uc $realm; + $mysalt = $mysalt . $user; + + # first we generate the 'seed' + my $iter = 4096; + my $pbkdf2 = Crypt::PBKDF2->new + ( + hash_class => 'HMACSHA1', + iterations => $iter, + output_len => 16 + ); + + my $b_seed = $pbkdf2->PBKDF2 ($mysalt, $word); + + # we can precompute this + my $b_kerberos_nfolded = hex2byte ('6b65726265726f737b9b5b2b93132b93'); + + my $b_iv = hex2byte ('0' x 32); + + # 'key_bytes' will be the AES key used to generate 'ki' (for final hmac-sha1) + # and 'ke' (AES key to decrypt/encrypt the ticket) + my $cbc = Crypt::Mode::CBC->new ('AES', 0); + my $b_key_bytes = $cbc->encrypt ($b_kerberos_nfolded, $b_seed, $b_iv); + + # precomputed stuff + my $b_nfolded1 = hex2byte ('6b60b0582a6ba80d5aad56ab55406ad5'); + my $b_nfolded2 = hex2byte ('be349a4d24be500eaf57abd5ea80757a'); + + my $b_ki = $cbc->encrypt ($b_nfolded1, $b_key_bytes, $b_iv); + my $b_ke = $cbc->encrypt ($b_nfolded2, $b_key_bytes, $b_iv); + + my $cleartext_ticket = '7981df3081dca01b3019a003020111a1120410e2aa1c894df7'. + '23b7277eef29700bf760a11c301a3018a003020100a111180f32303233303333313132303'. + '434355aa20602041d9d970ba311180f32303337303931343032343830355aa40703050040'. + 'c10000a511180f32303233303333313132303434355aa611180f323032333033333131323'. + '03434355aa711180f32303233303333313232303434355aa811180f323032333034303731'. + '32303434355aa90d1b0b4558414d504c452e434f4daa20301ea003020102a11730151b066'. + 'b72627467741b0b6578616d706c652e636f6d'; + + if (defined $edata2) + { + my $len_last_block = length ($edata2) % 32; + + my $tmp = $len_last_block + 32; + + my $b_truncated_enc_ticket = hex2byte (substr $edata2, 0, -$tmp); + + my $b_last_block = hex2byte (substr $edata2, -$len_last_block); + + my $b_n_1_block = hex2byte (substr (substr ($edata2, -$tmp), 0, 32)); + + my $b_truncated_ticket_decrypted = $cbc->decrypt ($b_truncated_enc_ticket, $b_ke, $b_iv); + + my $truncated_ticket_decrypted = byte2hex ($b_truncated_ticket_decrypted); + + my $check_correct = ((substr ($truncated_ticket_decrypted, 32, 4) eq "7981" || substr ($truncated_ticket_decrypted, 32, 4) eq "7a81") && (substr ($truncated_ticket_decrypted, 38, 2) eq "30")) || + - ((substr ($truncated_ticket_decrypted, 32, 2) eq "79" || substr ($truncated_ticket_decrypted, 32, 2) eq "7a") && (substr ($truncated_ticket_decrypted, 36, 2) eq "30")) || + - ((substr ($truncated_ticket_decrypted, 32, 4) eq "7982" || substr ($truncated_ticket_decrypted, 32, 4) eq "7a82") && (substr ($truncated_ticket_decrypted, 40, 2) eq "30")); + + if ($check_correct == 1) + { + my $b_n_2 = substr $b_truncated_enc_ticket, -16; + + my $b_n_1_decrypted = $cbc->decrypt ($b_n_1_block, $b_ke, $b_iv); + + my $b_last_plain = substr $b_n_1_decrypted, 0, $len_last_block / 2; + + $b_last_plain = $b_last_plain ^ $b_last_block; + + my $omitted = substr $b_n_1_decrypted, -(16 - $len_last_block / 2); + + my $b_n_1 = $b_last_block . $omitted; + + $b_n_1 = $cbc->decrypt ($b_n_1, $b_ke, $b_iv); + + $b_n_1 = $b_n_1 ^ $b_n_2; + + my $b_cleartext_ticket = $b_truncated_ticket_decrypted . $b_n_1 . $b_last_plain; + + $cleartext_ticket = byte2hex ($b_cleartext_ticket); + } + else # validation failed + { + # fake/wrong ticket (otherwise if we just decrypt/encrypt we end + #up with false positives all the time) + $cleartext_ticket = "0" x (length ($cleartext_ticket) + 32); + } + } + + if (defined $checksum) + { + $checksum = pack ("H*", $checksum); + } + else + { + if (! defined $edata2) + { + my $nonce = unpack ("H*", random_bytes (16)); + + $cleartext_ticket = $nonce . $cleartext_ticket; + } + # we have what is required to compute checksum + $checksum = hmac_sha1 (hex2byte ($cleartext_ticket), $b_ki); + + $checksum = substr $checksum, 0, 12; + } + + my $len_cleartext_last_block = length ($cleartext_ticket) % 32; + my $cleartext_last_block = substr $cleartext_ticket, -$len_cleartext_last_block; + + my $padding = pad (length ($cleartext_ticket), 32); + + my $b_cleartext_last_block_padded = hex2byte ($cleartext_last_block . '0' x $padding); + + # we will encrypt until n-1 block (included) + my $truncated_cleartext_ticket = substr $cleartext_ticket, 0, -$len_cleartext_last_block; + + my $b_truncated_enc_ticket = $cbc->encrypt (hex2byte ($truncated_cleartext_ticket), $b_ke, $b_iv); + + my $b_enc_ticket_n_1_block= substr $b_truncated_enc_ticket, -16; + + my $b_enc_last_block = substr $b_enc_ticket_n_1_block, 0, $len_cleartext_last_block / 2; + + # we now craft the new n-1 block + my $tmp = $b_enc_ticket_n_1_block ^ $b_cleartext_last_block_padded; + + $b_enc_ticket_n_1_block = $cbc->encrypt ($tmp, $b_ke, $b_iv); + + $tmp = substr $b_truncated_enc_ticket, 0, -16; + + $edata2 = $tmp . $b_enc_ticket_n_1_block . $b_enc_last_block; + + my $tmp_hash = sprintf ('$krb5asrep$17$%s$%s$%s$%s', $user, $realm, unpack ("H*", $checksum), unpack ("H*", $edata2)); + + return $tmp_hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my ($hash, $word) = split (':', $line); + + return unless defined $hash; + return unless defined $word; + + my @data = split ('\$', $hash); + + return unless scalar @data == 7; + + shift @data; + + my $signature = shift @data; + my $algorithm = shift @data; + my $user = shift @data; + my $realm = shift @data; + my $checksum = shift @data; + my $edata2 = shift @data; + + return unless ($signature eq "krb5asrep"); + return unless ($algorithm eq "17"); + return unless (length ($checksum) == 24); + return unless (length ($edata2) >= 64); + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, undef, $user, $realm, $checksum, $edata2); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m32200.pm b/tools/test_modules/m32200.pm new file mode 100644 index 000000000..5f2d1fd9a --- /dev/null +++ b/tools/test_modules/m32200.pm @@ -0,0 +1,224 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Digest::SHA qw (hmac_sha1); +use Crypt::Mode::CBC; +use Crypt::PBKDF2; + +sub byte2hex +{ + my $input = shift; + return unpack ("H*", $input); +} + +sub hex2byte +{ + my $input = shift; + return pack ("H*", $input); +} + +sub pad +{ + my $n = shift; + my $size = shift; + + return (~$n + 1) & ($size - 1); +} + +sub module_constraints { [[0, 256], [16, 16], [-1, -1], [-1, -1], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + my $user = shift // "user"; + my $realm = shift // "example.com"; + my $checksum = shift; + my $edata2 = shift; + + my $mysalt = uc $realm; + $mysalt = $mysalt . $user; + + # first we generate the 'seed' + my $iter = 4096; + my $pbkdf2 = Crypt::PBKDF2->new + ( + hash_class => 'HMACSHA1', + iterations => $iter, + output_len => 32 + ); + + my $b_seed = $pbkdf2->PBKDF2 ($mysalt, $word); + + # we can precompute this + my $b_kerberos_nfolded = hex2byte ('6b65726265726f737b9b5b2b93132b93'); + + my $b_iv = hex2byte ('0' x 32); + + # 'key_bytes' will be the AES key used to generate 'ki' (for final hmac-sha1) + # and 'ke' (AES key to decrypt/encrypt the ticket) + my $cbc = Crypt::Mode::CBC->new ('AES', 0); + my $b_key_bytes = $cbc->encrypt ($b_kerberos_nfolded, $b_seed, $b_iv); + + $b_key_bytes = $b_key_bytes . $cbc->encrypt ($b_key_bytes, $b_seed, $b_iv); + + # precomputed stuff + my $b_nfolded1 = hex2byte ('6b60b0582a6ba80d5aad56ab55406ad5'); + my $b_nfolded2 = hex2byte ('be349a4d24be500eaf57abd5ea80757a'); + + my $b_ki = $cbc->encrypt ($b_nfolded1, $b_key_bytes, $b_iv); + + $b_ki = $b_ki . $cbc->encrypt ($b_ki, $b_key_bytes, $b_iv); + + my $b_ke = $cbc->encrypt ($b_nfolded2, $b_key_bytes, $b_iv); + + $b_ke = $b_ke . $cbc->encrypt ($b_ke, $b_key_bytes, $b_iv); + + my $cleartext_ticket = '7981ef3081eca02b3029a003020112a12204200e97d1626616'. + '6e06252cbec52003e0f6b4f0280deec6dc58cdbf39845d6f0e77a11c301a3018a00302010'. + '0a111180f32303233303331363135353732315aa20602045b66ac3ea311180f3230333730'. + '3931343032343830355aa40703050050c10000a511180f323032333033313631353537323'. + '15aa611180f32303233303331363135353732315aa711180f323032333033313730313537'. + '32315aa811180f32303233303331373135353732315aa90d1b0b4558414d504c452e434f4'. + 'daa20301ea003020101a11730151b066b72627467741b0b4558414d504c452e434f4d'; + + if (defined $edata2) + { + my $len_last_block = length ($edata2) % 32; + + my $tmp = $len_last_block + 32; + + my $b_truncated_enc_ticket = hex2byte (substr $edata2, 0, -$tmp); + + my $b_last_block = hex2byte (substr $edata2, -$len_last_block); + + my $b_n_1_block = hex2byte (substr (substr ($edata2, -$tmp), 0, 32)); + + my $b_truncated_ticket_decrypted = $cbc->decrypt ($b_truncated_enc_ticket, $b_ke, $b_iv); + + my $truncated_ticket_decrypted = byte2hex ($b_truncated_ticket_decrypted); + + my $check_correct = ((substr ($truncated_ticket_decrypted, 32, 4) eq "7981" || substr ($truncated_ticket_decrypted, 32, 4) eq "7a81") && (substr ($truncated_ticket_decrypted, 38, 2) eq "30")) || + ((substr ($truncated_ticket_decrypted, 32, 2) eq "79" || substr ($truncated_ticket_decrypted, 32, 2) eq "7a") && (substr ($truncated_ticket_decrypted, 36, 2) eq "30")) || + ((substr ($truncated_ticket_decrypted, 32, 4) eq "7982" || substr ($truncated_ticket_decrypted, 32, 4) eq "7a82") && (substr ($truncated_ticket_decrypted, 40, 2) eq "30")); + + if ($check_correct == 1) + { + my $b_n_2 = substr $b_truncated_enc_ticket, -16; + + my $b_n_1_decrypted = $cbc->decrypt ($b_n_1_block, $b_ke, $b_iv); + + my $b_last_plain = substr $b_n_1_decrypted, 0, $len_last_block / 2; + + $b_last_plain = $b_last_plain ^ $b_last_block; + + my $omitted = substr $b_n_1_decrypted, -(16 - $len_last_block / 2); + + my $b_n_1 = $b_last_block . $omitted; + + $b_n_1 = $cbc->decrypt ($b_n_1, $b_ke, $b_iv); + + $b_n_1 = $b_n_1 ^ $b_n_2; + + my $b_cleartext_ticket = $b_truncated_ticket_decrypted . $b_n_1 . $b_last_plain; + + $cleartext_ticket = byte2hex ($b_cleartext_ticket); + } + else # validation failed + { + # fake/wrong ticket (otherwise if we just decrypt/encrypt we end + #up with false positives all the time) + $cleartext_ticket = "0" x (length ($cleartext_ticket) + 32); + } + } + + if (defined $checksum) + { + $checksum = pack ("H*", $checksum); + } + else + { + if (! defined $edata2) + { + my $nonce = unpack ("H*", random_bytes (16)); + + $cleartext_ticket = $nonce . $cleartext_ticket; + } + # we have what is required to compute checksum + $checksum = hmac_sha1 (hex2byte ($cleartext_ticket), $b_ki); + + $checksum = substr $checksum, 0, 12; + } + + my $len_cleartext_last_block = length ($cleartext_ticket) % 32; + my $cleartext_last_block = substr $cleartext_ticket, -$len_cleartext_last_block; + + my $padding = pad (length ($cleartext_ticket), 32); + + my $b_cleartext_last_block_padded = hex2byte ($cleartext_last_block . '0' x $padding); + + # we will encrypt until n-1 block (included) + my $truncated_cleartext_ticket = substr $cleartext_ticket, 0, -$len_cleartext_last_block; + + my $b_truncated_enc_ticket = $cbc->encrypt (hex2byte ($truncated_cleartext_ticket), $b_ke, $b_iv); + + my $b_enc_ticket_n_1_block= substr $b_truncated_enc_ticket, -16; + + my $b_enc_last_block = substr $b_enc_ticket_n_1_block, 0, $len_cleartext_last_block / 2; + + # we now craft the new n-1 block + my $tmp = $b_enc_ticket_n_1_block ^ $b_cleartext_last_block_padded; + + $b_enc_ticket_n_1_block = $cbc->encrypt ($tmp, $b_ke, $b_iv); + + $tmp = substr $b_truncated_enc_ticket, 0, -16; + + $edata2 = $tmp . $b_enc_ticket_n_1_block . $b_enc_last_block; + + my $tmp_hash = sprintf ('$krb5asrep$18$%s$%s$%s$%s', $user, $realm, unpack ("H*", $checksum), unpack ("H*", $edata2)); + + return $tmp_hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my ($hash, $word) = split (':', $line); + + return unless defined $hash; + return unless defined $word; + + my @data = split ('\$', $hash); + + return unless scalar @data == 7; + + shift @data; + + my $signature = shift @data; + my $algorithm = shift @data; + my $user = shift @data; + my $realm = shift @data; + my $checksum = shift @data; + my $edata2 = shift @data; + + return unless ($signature eq "krb5asrep"); + return unless ($algorithm eq "18"); + return unless (length ($checksum) == 24); + return unless (length ($edata2) >= 64); + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, undef, $user, $realm, $checksum, $edata2); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m32300.pm b/tools/test_modules/m32300.pm new file mode 100644 index 000000000..d9bf0bb8d --- /dev/null +++ b/tools/test_modules/m32300.pm @@ -0,0 +1,59 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Digest::MD5 qw (md5_hex); + +sub module_constraints { [[0, 256], [0, 246], [0, 31], [0, 41], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt1 = shift; + + my $IS_OPTIMIZED = 1; + + if (exists $ENV{"IS_OPTIMIZED"} && defined $ENV{"IS_OPTIMIZED"}) + { + $IS_OPTIMIZED = $ENV{"IS_OPTIMIZED"}; + } + + my $salt2_max_len = $IS_OPTIMIZED == 1 ? 33 : 238; + + my $salt2 = shift || random_numeric_string (random_number (0, $salt2_max_len)); + + my $empireCMS_salt1 = 'E!m^p-i(r#e.C:M?S'; + my $empireCMS_salt2 = 'd)i.g^o-d'; + + my $digest = md5_hex ($salt2 . $empireCMS_salt1 . md5_hex (md5_hex ($word) . $salt1) . $empireCMS_salt2 . $salt1); + + my $hash = sprintf ("%s:%s:%s", $digest, $salt1, $salt2); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my ($hash, $salt1, $salt2, $word) = split (':', $line); + + return unless defined $hash; + return unless defined $salt1; + return unless defined $salt2; + return unless defined $word; + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $salt1, $salt2); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m32410.pm b/tools/test_modules/m32410.pm new file mode 100644 index 000000000..658251704 --- /dev/null +++ b/tools/test_modules/m32410.pm @@ -0,0 +1,44 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Digest::SHA qw (sha512_hex); + +sub module_constraints { [[0, 256], [0, 256], [0, 55], [0, 55], [0, 55]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + + my $digest = sha512_hex (sha512_hex ($word) . $salt); + + my $hash = sprintf ("%s:%s", $digest, $salt); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my ($hash, $salt, $word) = split (':', $line); + + return unless defined $hash; + return unless defined $salt; + return unless defined $word; + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $salt); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m32420.pm b/tools/test_modules/m32420.pm new file mode 100644 index 000000000..61211f04e --- /dev/null +++ b/tools/test_modules/m32420.pm @@ -0,0 +1,44 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Digest::SHA qw (sha512_hex sha512); + +sub module_constraints { [[0, 256], [0, 256], [0, 55], [0, 55], [0, 55]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + + my $digest = sha512_hex (sha512 ($word) . $salt); + + my $hash = sprintf ("%s:%s", $digest, $salt); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my ($hash, $salt, $word) = split (':', $line); + + return unless defined $hash; + return unless defined $salt; + return unless defined $word; + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $salt); + + return ($new_hash, $word); +} + +1; diff --git a/tools/test_modules/m32600.pm b/tools/test_modules/m32600.pm new file mode 100644 index 000000000..b1a13d59f --- /dev/null +++ b/tools/test_modules/m32600.pm @@ -0,0 +1,44 @@ +#!/usr/bin/env perl + +## +## Author......: See docs/credits.txt +## License.....: MIT +## + +use strict; +use warnings; + +use Crypt::Digest::Whirlpool qw (whirlpool_hex); + +sub module_constraints { [[0, 256], [0, 256], [-1, -1], [-1, -1], [-1, -1]] } + +sub module_generate_hash +{ + my $word = shift; + my $salt = shift; + + my $digest = whirlpool_hex ($salt, $word, $salt); + + my $hash = sprintf ("%s:%s", $digest, $salt); + + return $hash; +} + +sub module_verify_hash +{ + my $line = shift; + + my ($hash, $salt, $word) = split (':', $line); + + return unless defined $hash; + return unless defined $salt; + return unless defined $word; + + my $word_packed = pack_if_HEX_notation ($word); + + my $new_hash = module_generate_hash ($word_packed, $salt); + + return ($new_hash, $word); +} + +1; diff --git a/tunings/Alias.hctune b/tunings/Alias.hctune index d46e20d6e..9e2e8e4e1 100644 --- a/tunings/Alias.hctune +++ b/tunings/Alias.hctune @@ -250,6 +250,8 @@ GeForce_RTX_3080_Ti ALIAS_nv_sm50_or_higher GeForce_RTX_3090 ALIAS_nv_sm50_or_higher GeForce_RTX_3090_Ti ALIAS_nv_sm50_or_higher +GeForce_RTX_4060 ALIAS_nv_sm50_or_higher +GeForce_RTX_4060_Ti ALIAS_nv_sm50_or_higher GeForce_RTX_4070 ALIAS_nv_sm50_or_higher GeForce_RTX_4070_Ti ALIAS_nv_sm50_or_higher GeForce_RTX_4080 ALIAS_nv_sm50_or_higher @@ -261,6 +263,43 @@ GeForce_RTX_4090 ALIAS_nv_sm50_or_higher ## Unmapped GPU ## +Radeon_RX_460 ALIAS_AMD_GCN4 +Radeon_RX_470 ALIAS_AMD_GCN4 +Radeon_RX_480 ALIAS_AMD_GCN4 +Radeon_RX_550 ALIAS_AMD_GCN4 +Radeon_RX_560 ALIAS_AMD_GCN4 +Radeon_RX_570 ALIAS_AMD_GCN4 +Radeon_RX_580 ALIAS_AMD_GCN4 +Radeon_RX_590 ALIAS_AMD_GCN4 +Radeon_RX_590_GME ALIAS_AMD_GCN4 + +Radeon_RX_5500 ALIAS_AMD_RDNA +Radeon_RX_5500_XT ALIAS_AMD_RDNA +Radeon_RX_5600 ALIAS_AMD_RDNA +Radeon_RX_5600_XT ALIAS_AMD_RDNA +Radeon_RX_5700 ALIAS_AMD_RDNA +Radeon_RX_5700_XT ALIAS_AMD_RDNA + +Radeon_RX_6500_XT ALIAS_AMD_RDNA2 +Radeon_RX_6600 ALIAS_AMD_RDNA2 +Radeon_RX_6600_XT ALIAS_AMD_RDNA2 +Radeon_RX_6650_XT ALIAS_AMD_RDNA2 +Radeon_RX_6700 ALIAS_AMD_RDNA2 +Radeon_RX_6700_XT ALIAS_AMD_RDNA2 +Radeon_RX_6750_GRE ALIAS_AMD_RDNA2 +Radeon_RX_6750_XT ALIAS_AMD_RDNA2 +Radeon_RX_6800 ALIAS_AMD_RDNA2 +Radeon_RX_6800_XT ALIAS_AMD_RDNA2 +Radeon_RX_6900_XT ALIAS_AMD_RDNA2 +Radeon_RX_6950_XT ALIAS_AMD_RDNA2 + +Radeon_RX_7600 ALIAS_AMD_RDNA3 +Radeon_RX_7700_XT ALIAS_AMD_RDNA3 +Radeon_RX_7800_XT ALIAS_AMD_RDNA3 +Radeon_RX_7900_XT ALIAS_AMD_RDNA3 +Radeon_RX_7900_XTX ALIAS_AMD_RDNA3 +Radeon_RX_7900_GRE ALIAS_AMD_RDNA3 + Radeon_(TM)_RX_480_Graphics ALIAS_AMD_RX480 gfx900 ALIAS_AMD_Vega64 diff --git a/tunings/Module_15700.hctune b/tunings/Module_15700.hctune index 2e99098ee..dd67e5f42 100644 --- a/tunings/Module_15700.hctune +++ b/tunings/Module_15700.hctune @@ -4,7 +4,7 @@ # # 1. For example, to find the value for 15700, first create a valid hash for 15700 as follows: # -# $ ./hashcat --example-hashes -m 15700 | grep Example.Hash | grep -v Format | cut -b 25- > tmp.hash.15700 +# $ ./hashcat --example-hashes --mach -m 15700 | grep -Eo '\$ethereum\$s[*a-f0-9]{1,}' > tmp.hash.15700 # # 2. Now let it iterate through all -n values to a certain point. In this case, I'm using 200, but in general it's a value that is at least twice that of the multiprocessor. If you don't mind you can just leave it as it is, it just runs a little longer. # diff --git a/tunings/Modules_default.hctune b/tunings/Modules_default.hctune index 635801fee..8acb1bbb6 100644 --- a/tunings/Modules_default.hctune +++ b/tunings/Modules_default.hctune @@ -45,6 +45,7 @@ ALIAS_nv_real_simd 3 11100 2 A ALIAS_nv_real_simd 3 11900 2 A A ALIAS_nv_real_simd 3 13300 4 A A ALIAS_nv_real_simd 3 18700 8 A A +ALIAS_nv_real_simd 3 99999 4 A A ALIAS_nv_sm50_or_higher 3 0 8 A A ALIAS_nv_sm50_or_higher 3 10 8 A A @@ -68,6 +69,7 @@ ALIAS_nv_sm50_or_higher 3 5500 2 A ALIAS_nv_sm50_or_higher 3 9900 4 A A ALIAS_nv_sm50_or_higher 3 16400 8 A A ALIAS_nv_sm50_or_higher 3 18700 8 A A +ALIAS_nv_sm50_or_higher 3 99999 8 A A ## ## CryptoAPI